aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author(no author) <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-23 10:44:52 +0000
committer(no author) <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-23 10:44:52 +0000
commit6abd87d44aa5fcaa3434ea73bea7d7d2c9fdec62 (patch)
treed99101b214fc164ef054c44145ad1418bdb937ca
parentb2c70b118eacbf74cad603bd6ee927320f0f737b (diff)
This commit was manufactured by cvs2svn to create tagrtlopt-merge-20021023
'rtlopt-merge-20021023'. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/tags/rtlopt-merge-20021023@58448 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog130
-rw-r--r--MAINTAINERS27
-rw-r--r--Makefile.def79
-rw-r--r--Makefile.in471
-rw-r--r--Makefile.tpl1512
-rw-r--r--boehm-gc/ChangeLog66
-rw-r--r--boehm-gc/Makefile.am2
-rw-r--r--boehm-gc/Makefile.in2
-rw-r--r--boehm-gc/include/private/gc_locks.h34
-rw-r--r--boehm-gc/include/private/gcconfig.h52
-rw-r--r--boehm-gc/win32_threads.c3
-rwxr-xr-xconfigure55
-rw-r--r--configure.in193
-rw-r--r--contrib/ChangeLog18
-rw-r--r--contrib/enquire.c2887
-rwxr-xr-xcontrib/gcc_update2
-rw-r--r--contrib/paranoia.cc2699
-rw-r--r--contrib/regression/ChangeLog13
-rwxr-xr-xcontrib/regression/btest-gcc.sh9
-rwxr-xr-xcontrib/regression/objs-gcc.sh24
-rw-r--r--fastjar/.cvsignore3
-rw-r--r--fastjar/ChangeLog63
-rw-r--r--fastjar/Makefile.am39
-rw-r--r--fastjar/Makefile.in250
-rw-r--r--fastjar/acinclude.m4133
-rw-r--r--fastjar/aclocal.m4245
-rw-r--r--fastjar/config.h.in42
-rwxr-xr-xfastjar/configure255
-rw-r--r--fastjar/configure.in15
-rw-r--r--fastjar/fastjar.texi262
-rw-r--r--fastjar/jargrep.c9
-rw-r--r--fastjar/jartool.c24
-rw-r--r--gcc/ABOUT-GCC-NLS13
-rw-r--r--gcc/ABOUT-NLS2
-rw-r--r--gcc/ChangeLog26803
-rw-r--r--gcc/ChangeLog.012
-rw-r--r--gcc/ChangeLog.128
-rw-r--r--gcc/ChangeLog.234
-rw-r--r--gcc/ChangeLog.350
-rw-r--r--gcc/ChangeLog.454
-rw-r--r--gcc/ChangeLog.542
-rw-r--r--gcc/ChangeLog.640
-rw-r--r--gcc/FSFChangeLog.1010
-rw-r--r--gcc/FSFChangeLog.1142
-rw-r--r--gcc/LANGUAGES2
-rw-r--r--gcc/Makefile.in205
-rw-r--r--gcc/ada/ChangeLog73
-rw-r--r--gcc/ada/Make-lang.in2
-rw-r--r--gcc/ada/Makefile.in4
-rw-r--r--gcc/ada/gnat1drv.adb3
-rw-r--r--gcc/ada/gnatcmd.adb1
-rw-r--r--gcc/ada/gnatkr.adb2
-rw-r--r--gcc/ada/gnatlbr.adb2
-rw-r--r--gcc/ada/gnatlink.adb2
-rw-r--r--gcc/ada/gnatls.adb1
-rw-r--r--gcc/ada/gnatmake.adb3
-rw-r--r--gcc/ada/gnatprep.adb1
-rw-r--r--gcc/ada/gnatpsta.adb2
-rw-r--r--gcc/ada/gnatvsn.adb82
-rw-r--r--gcc/ada/gnatvsn.ads12
-rw-r--r--gcc/ada/lang-specs.h13
-rw-r--r--gcc/ada/misc.c30
-rw-r--r--gcc/ada/sysdep.c5
-rw-r--r--gcc/ada/trans.c12
-rw-r--r--gcc/alias.c16
-rw-r--r--gcc/basic-block.h19
-rw-r--r--gcc/bitmap.c2
-rw-r--r--gcc/builtin-types.def7
-rw-r--r--gcc/builtins.c188
-rw-r--r--gcc/builtins.def55
-rw-r--r--gcc/c-aux-info.c4
-rw-r--r--gcc/c-common.c377
-rw-r--r--gcc/c-common.def30
-rw-r--r--gcc/c-common.h56
-rw-r--r--gcc/c-decl.c33
-rw-r--r--gcc/c-dump.c2
-rw-r--r--gcc/c-format.c8
-rw-r--r--gcc/c-lang.c13
-rw-r--r--gcc/c-lex.c15
-rw-r--r--gcc/c-objc-common.c32
-rw-r--r--gcc/c-opts.c77
-rw-r--r--gcc/c-pretty-print.c10
-rw-r--r--gcc/c-semantics.c31
-rw-r--r--gcc/c-tree.h6
-rw-r--r--gcc/c-typeck.c102
-rw-r--r--gcc/calls.c161
-rw-r--r--gcc/cfganal.c40
-rw-r--r--gcc/cfgbuild.c2
-rw-r--r--gcc/cfgcleanup.c42
-rw-r--r--gcc/cfglayout.c5
-rw-r--r--gcc/cfgloop.c10
-rw-r--r--gcc/cfgrtl.c9
-rw-r--r--gcc/collect2.c77
-rw-r--r--gcc/combine.c189
-rw-r--r--gcc/config.gcc176
-rw-r--r--gcc/config/alpha/alpha-protos.h2
-rw-r--r--gcc/config/alpha/alpha.c159
-rw-r--r--gcc/config/alpha/alpha.h97
-rw-r--r--gcc/config/alpha/alpha.md30
-rw-r--r--gcc/config/alpha/elf.h6
-rw-r--r--gcc/config/alpha/ev4.md5
-rw-r--r--gcc/config/alpha/ev5.md5
-rw-r--r--gcc/config/alpha/ev6.md2
-rw-r--r--gcc/config/alpha/netbsd.h11
-rw-r--r--gcc/config/alpha/osf5.h6
-rw-r--r--gcc/config/alpha/unicosmk.h4
-rw-r--r--gcc/config/alpha/vms.h13
-rw-r--r--gcc/config/arc/arc.c25
-rw-r--r--gcc/config/arc/arc.h34
-rw-r--r--gcc/config/arm/README-interworking2
-rw-r--r--gcc/config/arm/aof.h6
-rw-r--r--gcc/config/arm/aout.h11
-rw-r--r--gcc/config/arm/arm-protos.h7
-rw-r--r--gcc/config/arm/arm.c191
-rw-r--r--gcc/config/arm/arm.h128
-rw-r--r--gcc/config/arm/arm.md57
-rw-r--r--gcc/config/arm/coff.h2
-rw-r--r--gcc/config/arm/crti.asm2
-rw-r--r--gcc/config/arm/crtn.asm2
-rw-r--r--gcc/config/arm/elf.h20
-rw-r--r--gcc/config/arm/linux-gas.h2
-rw-r--r--gcc/config/arm/netbsd.h35
-rw-r--r--gcc/config/arm/pe.c8
-rw-r--r--gcc/config/arm/unknown-elf.h4
-rw-r--r--gcc/config/avr/avr.c77
-rw-r--r--gcc/config/avr/avr.h94
-rw-r--r--gcc/config/avr/avr.md37
-rw-r--r--gcc/config/c4x/c4x-c.c2
-rw-r--r--gcc/config/c4x/c4x.c22
-rw-r--r--gcc/config/c4x/c4x.h18
-rw-r--r--gcc/config/c4x/c4x.md14
-rw-r--r--gcc/config/c4x/libgcc.S2
-rw-r--r--gcc/config/c4x/t-c4x4
-rw-r--r--gcc/config/chorus.h3
-rw-r--r--gcc/config/cris/cris-protos.h6
-rw-r--r--gcc/config/cris/cris.c35
-rw-r--r--gcc/config/cris/cris.h27
-rw-r--r--gcc/config/cris/cris.md2
-rw-r--r--gcc/config/d30v/d30v.c4
-rw-r--r--gcc/config/d30v/d30v.h134
-rw-r--r--gcc/config/darwin-protos.h2
-rw-r--r--gcc/config/darwin.c60
-rw-r--r--gcc/config/darwin.h61
-rw-r--r--gcc/config/dbx.h4
-rw-r--r--gcc/config/dbxcoff.h7
-rw-r--r--gcc/config/dbxelf.h5
-rw-r--r--gcc/config/dsp16xx/dsp16xx-protos.h2
-rw-r--r--gcc/config/dsp16xx/dsp16xx.c2
-rw-r--r--gcc/config/dsp16xx/dsp16xx.h27
-rw-r--r--gcc/config/dsp16xx/dsp16xx.md132
-rw-r--r--gcc/config/elfos.h26
-rw-r--r--gcc/config/float-c4x.h96
-rw-r--r--gcc/config/float-i128.h123
-rw-r--r--gcc/config/float-i32.h123
-rw-r--r--gcc/config/float-i386.h124
-rw-r--r--gcc/config/float-i64.h123
-rw-r--r--gcc/config/float-m68k.h127
-rw-r--r--gcc/config/float-sh.h160
-rw-r--r--gcc/config/float-sparc.h153
-rw-r--r--gcc/config/float-vax.h159
-rw-r--r--gcc/config/fp-bit.c96
-rw-r--r--gcc/config/fr30/fr30.c42
-rw-r--r--gcc/config/fr30/fr30.h35
-rw-r--r--gcc/config/fr30/fr30.md4
-rw-r--r--gcc/config/freebsd-spec.h2
-rw-r--r--gcc/config/frv/frv-protos.h19
-rw-r--r--gcc/config/frv/frv.c206
-rw-r--r--gcc/config/frv/frv.h216
-rw-r--r--gcc/config/frv/frv.md6
-rw-r--r--gcc/config/h8300/fixunssfsi.c2
-rw-r--r--gcc/config/h8300/h8300.c448
-rw-r--r--gcc/config/h8300/h8300.h81
-rw-r--r--gcc/config/h8300/h8300.md20
-rw-r--r--gcc/config/h8300/lib1funcs.asm2
-rw-r--r--gcc/config/i370/i370-c.c2
-rw-r--r--gcc/config/i370/i370-protos.h2
-rw-r--r--gcc/config/i370/i370.c28
-rw-r--r--gcc/config/i370/i370.h73
-rw-r--r--gcc/config/i370/t-i3704
-rw-r--r--gcc/config/i386/athlon.md573
-rw-r--r--gcc/config/i386/att.h7
-rw-r--r--gcc/config/i386/bsd.h6
-rw-r--r--gcc/config/i386/cygwin.h6
-rw-r--r--gcc/config/i386/darwin.h5
-rw-r--r--gcc/config/i386/djgpp.h2
-rw-r--r--gcc/config/i386/freebsd-aout.h3
-rw-r--r--gcc/config/i386/gas.h2
-rw-r--r--gcc/config/i386/gstabs.h2
-rw-r--r--gcc/config/i386/i386-coff.h10
-rw-r--r--gcc/config/i386/i386-interix.h4
-rw-r--r--gcc/config/i386/i386-protos.h16
-rw-r--r--gcc/config/i386/i386.c809
-rw-r--r--gcc/config/i386/i386.h233
-rw-r--r--gcc/config/i386/i386.md1477
-rw-r--r--gcc/config/i386/linux64.h4
-rw-r--r--gcc/config/i386/lynx-ng.h7
-rw-r--r--gcc/config/i386/lynx.h7
-rw-r--r--gcc/config/i386/mmintrin.h50
-rw-r--r--gcc/config/i386/netbsd-elf.h3
-rw-r--r--gcc/config/i386/netbsd.h8
-rw-r--r--gcc/config/i386/netbsd64.h2
-rw-r--r--gcc/config/i386/openbsd.h3
-rw-r--r--gcc/config/i386/pentium.md4
-rw-r--r--gcc/config/i386/rtemself.h2
-rw-r--r--gcc/config/i386/sco5.h18
-rw-r--r--gcc/config/i386/scodbx.h84
-rw-r--r--gcc/config/i386/svr3dbx.h2
-rw-r--r--gcc/config/i386/sysv3.h5
-rw-r--r--gcc/config/i386/t-cygwin2
-rw-r--r--gcc/config/i386/t-interix2
-rw-r--r--gcc/config/i386/t-linux643
-rw-r--r--gcc/config/i386/unix.h7
-rw-r--r--gcc/config/i386/win32.h4
-rw-r--r--gcc/config/i386/winnt.c29
-rw-r--r--gcc/config/i386/x86-64.h3
-rw-r--r--gcc/config/i386/xm-dgux.h4
-rw-r--r--gcc/config/i386/xm-sun.h21
-rw-r--r--gcc/config/i386/xm-sysv3.h3
-rw-r--r--gcc/config/i386/xmmintrin.h247
-rw-r--r--gcc/config/i960/i960.c121
-rw-r--r--gcc/config/i960/i960.h120
-rw-r--r--gcc/config/i960/i960.md113
-rw-r--r--gcc/config/ia64/aix.h44
-rw-r--r--gcc/config/ia64/elf.h6
-rw-r--r--gcc/config/ia64/hpux.h137
-rw-r--r--gcc/config/ia64/hpux_longdouble.h3
-rw-r--r--gcc/config/ia64/ia64-c.c190
-rw-r--r--gcc/config/ia64/ia64-protos.h8
-rw-r--r--gcc/config/ia64/ia64.c148
-rw-r--r--gcc/config/ia64/ia64.h98
-rw-r--r--gcc/config/ia64/ia64.md24
-rw-r--r--gcc/config/ia64/linux.h13
-rw-r--r--gcc/config/ia64/quadlib.c19
-rw-r--r--gcc/config/ia64/t-aix6
-rw-r--r--gcc/config/ia64/t-hpux33
-rw-r--r--gcc/config/ia64/t-ia649
-rw-r--r--gcc/config/ia64/unwind-ia64.c2
-rw-r--r--gcc/config/interix.h19
-rw-r--r--gcc/config/ip2k/ip2k-protos.h6
-rw-r--r--gcc/config/ip2k/ip2k.c309
-rw-r--r--gcc/config/ip2k/ip2k.h107
-rw-r--r--gcc/config/ip2k/ip2k.md44
-rw-r--r--gcc/config/ip2k/libgcc.S44
-rw-r--r--gcc/config/ip2k/t-ip2k3
-rw-r--r--gcc/config/libgloss.h2
-rw-r--r--gcc/config/linux-aout.h6
-rw-r--r--gcc/config/linux.h10
-rw-r--r--gcc/config/lynx-ng.h8
-rw-r--r--gcc/config/lynx.h26
-rw-r--r--gcc/config/m32r/m32r.c17
-rw-r--r--gcc/config/m32r/m32r.h29
-rw-r--r--gcc/config/m32r/m32r.md2
-rw-r--r--gcc/config/m68hc11/m68hc11.c8
-rw-r--r--gcc/config/m68hc11/m68hc11.h15
-rw-r--r--gcc/config/m68hc11/m68hc11.md50
-rw-r--r--gcc/config/m68k/3b1.h15
-rw-r--r--gcc/config/m68k/3b1g.h2
-rw-r--r--gcc/config/m68k/amix.h7
-rw-r--r--gcc/config/m68k/atari.h7
-rw-r--r--gcc/config/m68k/ccur-GAS.h2
-rw-r--r--gcc/config/m68k/coff.h2
-rw-r--r--gcc/config/m68k/hp2bsd.h2
-rw-r--r--gcc/config/m68k/hp310g.h2
-rw-r--r--gcc/config/m68k/hp320.h37
-rw-r--r--gcc/config/m68k/hp320g.h2
-rw-r--r--gcc/config/m68k/hp3bsd.h2
-rw-r--r--gcc/config/m68k/hp3bsd44.h2
-rw-r--r--gcc/config/m68k/linux-aout.h2
-rw-r--r--gcc/config/m68k/linux.h34
-rw-r--r--gcc/config/m68k/m68k-aout.h2
-rw-r--r--gcc/config/m68k/m68k-protos.h2
-rw-r--r--gcc/config/m68k/m68k.c166
-rw-r--r--gcc/config/m68k/m68k.h39
-rw-r--r--gcc/config/m68k/m68k.md6
-rw-r--r--gcc/config/m68k/m68kelf.h14
-rw-r--r--gcc/config/m68k/m68kv4.h13
-rw-r--r--gcc/config/m68k/mot3300.h20
-rw-r--r--gcc/config/m68k/netbsd-elf.h45
-rw-r--r--gcc/config/m68k/netbsd.h6
-rw-r--r--gcc/config/m68k/openbsd.h43
-rw-r--r--gcc/config/m68k/pbb.h2
-rw-r--r--gcc/config/m68k/plexus.h2
-rw-r--r--gcc/config/m68k/sgs.h14
-rw-r--r--gcc/config/m68k/sun2.h2
-rw-r--r--gcc/config/m68k/sun2o4.h4
-rw-r--r--gcc/config/m68k/sun3.h6
-rw-r--r--gcc/config/m68k/tower-as.h17
-rw-r--r--gcc/config/m68k/vxm68k.h2
-rw-r--r--gcc/config/m88k/aout-dbx.h2
-rw-r--r--gcc/config/m88k/m88k-aout.h2
-rwxr-xr-xgcc/config/m88k/m88k-move.sh2
-rw-r--r--gcc/config/m88k/m88k.c31
-rw-r--r--gcc/config/m88k/m88k.h47
-rw-r--r--gcc/config/m88k/m88k.md12
-rw-r--r--gcc/config/mcore/mcore-elf.h4
-rw-r--r--gcc/config/mcore/mcore-pe.h3
-rw-r--r--gcc/config/mcore/mcore.c16
-rw-r--r--gcc/config/mcore/mcore.h12
-rw-r--r--gcc/config/mcore/mcore.md4
-rw-r--r--gcc/config/mips/elf.h8
-rw-r--r--gcc/config/mips/elf64.h8
-rw-r--r--gcc/config/mips/iris5gas.h8
-rw-r--r--gcc/config/mips/iris6.h4
-rw-r--r--gcc/config/mips/linux.h6
-rw-r--r--gcc/config/mips/mips-protos.h3
-rw-r--r--gcc/config/mips/mips.c242
-rw-r--r--gcc/config/mips/mips.h65
-rw-r--r--gcc/config/mips/mips.md300
-rw-r--r--gcc/config/mips/netbsd.h95
-rw-r--r--gcc/config/mips/openbsd.h4
-rw-r--r--gcc/config/mips/sni-gas.h8
-rw-r--r--gcc/config/mips/sr71k.md2
-rw-r--r--gcc/config/mips/t-iris63
-rw-r--r--gcc/config/mips/t-vr35
-rw-r--r--gcc/config/mips/vr.h7
-rw-r--r--gcc/config/mmix/mmix-protos.h3
-rw-r--r--gcc/config/mmix/mmix.c30
-rw-r--r--gcc/config/mmix/mmix.h15
-rw-r--r--gcc/config/mmix/mmix.md19
-rw-r--r--gcc/config/mn10200/mn10200.c2
-rw-r--r--gcc/config/mn10200/mn10200.h8
-rw-r--r--gcc/config/mn10300/mn10300.c4
-rw-r--r--gcc/config/mn10300/mn10300.h8
-rw-r--r--gcc/config/netbsd-aout.h13
-rw-r--r--gcc/config/netbsd.h69
-rw-r--r--gcc/config/netware.h4
-rw-r--r--gcc/config/ns32k/netbsd.h4
-rw-r--r--gcc/config/ns32k/ns32k.c21
-rw-r--r--gcc/config/ns32k/ns32k.h37
-rw-r--r--gcc/config/ns32k/ns32k.md6
-rw-r--r--gcc/config/openbsd.h12
-rw-r--r--gcc/config/pa/pa-64.h17
-rw-r--r--gcc/config/pa/pa-hiux.h58
-rw-r--r--gcc/config/pa/pa-hpux.h57
-rw-r--r--gcc/config/pa/pa-hpux10.h51
-rw-r--r--gcc/config/pa/pa-hpux11.h53
-rw-r--r--gcc/config/pa/pa-hpux7.h57
-rw-r--r--gcc/config/pa/pa-linux.h29
-rw-r--r--gcc/config/pa/pa-osf.h36
-rw-r--r--gcc/config/pa/pa-pro-end.h20
-rw-r--r--gcc/config/pa/pa-protos.h5
-rw-r--r--gcc/config/pa/pa.c375
-rw-r--r--gcc/config/pa/pa.h386
-rw-r--r--gcc/config/pa/pa.md56
-rw-r--r--gcc/config/pa/pa32-linux.h9
-rw-r--r--gcc/config/pa/pa32-regs.h11
-rw-r--r--gcc/config/pa/pa64-hpux.h25
-rw-r--r--gcc/config/pa/pa64-linux.h7
-rw-r--r--gcc/config/pa/pa64-regs.h19
-rw-r--r--gcc/config/pa/rtems.h17
-rw-r--r--gcc/config/pa/som.h6
-rw-r--r--gcc/config/pdp11/pdp11.c45
-rw-r--r--gcc/config/pdp11/pdp11.h58
-rw-r--r--gcc/config/pdp11/pdp11.md165
-rw-r--r--gcc/config/pdp11/t-pdp1114
-rw-r--r--gcc/config/psos.h6
-rw-r--r--gcc/config/ptx4.h15
-rw-r--r--gcc/config/romp/romp.c12
-rw-r--r--gcc/config/romp/romp.h30
-rw-r--r--gcc/config/rs6000/aix52.h191
-rw-r--r--gcc/config/rs6000/darwin.h2
-rw-r--r--gcc/config/rs6000/eabi.asm4
-rw-r--r--gcc/config/rs6000/gnu.h2
-rw-r--r--gcc/config/rs6000/linux.h2
-rw-r--r--gcc/config/rs6000/linux64.h26
-rw-r--r--gcc/config/rs6000/lynx.h1
-rw-r--r--gcc/config/rs6000/rs6000-protos.h4
-rw-r--r--gcc/config/rs6000/rs6000.c945
-rw-r--r--gcc/config/rs6000/rs6000.h62
-rw-r--r--gcc/config/rs6000/rs6000.md379
-rw-r--r--gcc/config/rs6000/spe.h12
-rw-r--r--gcc/config/rs6000/spe.md18
-rw-r--r--gcc/config/rs6000/sysv4.h202
-rw-r--r--gcc/config/rs6000/t-aix5252
-rw-r--r--gcc/config/rs6000/xcoff.h38
-rw-r--r--gcc/config/s390/linux.h156
-rw-r--r--gcc/config/s390/s390-modes.def2
-rw-r--r--gcc/config/s390/s390-protos.h12
-rw-r--r--gcc/config/s390/s390.c1978
-rw-r--r--gcc/config/s390/s390.h128
-rw-r--r--gcc/config/s390/s390.md1473
-rw-r--r--gcc/config/sh/coff.h6
-rw-r--r--gcc/config/sh/elf.h5
-rw-r--r--gcc/config/sh/lib1funcs.asm8
-rw-r--r--gcc/config/sh/linux.h1
-rw-r--r--gcc/config/sh/sh.c209
-rw-r--r--gcc/config/sh/sh.h48
-rw-r--r--gcc/config/sh/sh.md785
-rw-r--r--gcc/config/sparc/cypress.md2
-rw-r--r--gcc/config/sparc/freebsd.h12
-rw-r--r--gcc/config/sparc/gmon-sol2.c4
-rw-r--r--gcc/config/sparc/hypersparc.md4
-rw-r--r--gcc/config/sparc/lb1spc.asm8
-rw-r--r--gcc/config/sparc/lb1spl.asm2
-rw-r--r--gcc/config/sparc/linux.h9
-rw-r--r--gcc/config/sparc/linux64.h87
-rw-r--r--gcc/config/sparc/liteelf.h6
-rw-r--r--gcc/config/sparc/lynx.h2
-rw-r--r--gcc/config/sparc/netbsd-elf.h10
-rw-r--r--gcc/config/sparc/netbsd.h5
-rw-r--r--gcc/config/sparc/openbsd.h6
-rw-r--r--gcc/config/sparc/pbd.h11
-rw-r--r--gcc/config/sparc/sol2-bi.h18
-rw-r--r--gcc/config/sparc/sol2.h9
-rw-r--r--gcc/config/sparc/sp64-elf.h2
-rw-r--r--gcc/config/sparc/sp86x-elf.h6
-rw-r--r--gcc/config/sparc/sparc-modes.def2
-rw-r--r--gcc/config/sparc/sparc-protos.h2
-rw-r--r--gcc/config/sparc/sparc.c70
-rw-r--r--gcc/config/sparc/sparc.h101
-rw-r--r--gcc/config/sparc/sparc.md39
-rw-r--r--gcc/config/sparc/sparclet.md4
-rw-r--r--gcc/config/sparc/supersparc.md4
-rw-r--r--gcc/config/sparc/sysv4.h20
-rw-r--r--gcc/config/sparc/t-linux6414
-rw-r--r--gcc/config/sparc/t-netbsd6412
-rw-r--r--gcc/config/sparc/t-sol2-643
-rw-r--r--gcc/config/sparc/ultra1_2.md2
-rw-r--r--gcc/config/sparc/vxsim.h9
-rw-r--r--gcc/config/sparc/vxsparc64.h2
-rw-r--r--gcc/config/stormy16/stormy-abi6
-rw-r--r--gcc/config/stormy16/stormy16-protos.h1
-rw-r--r--gcc/config/stormy16/stormy16.c21
-rw-r--r--gcc/config/stormy16/stormy16.h134
-rw-r--r--gcc/config/svr3.h12
-rw-r--r--gcc/config/svr4.h14
-rw-r--r--gcc/config/t-libunwind1
-rw-r--r--gcc/config/v850/lib1funcs.asm734
-rw-r--r--gcc/config/v850/t-v85042
-rw-r--r--gcc/config/v850/v850-protos.h35
-rw-r--r--gcc/config/v850/v850.c595
-rw-r--r--gcc/config/v850/v850.h196
-rw-r--r--gcc/config/v850/v850.md667
-rw-r--r--gcc/config/vax/elf.h95
-rw-r--r--gcc/config/vax/netbsd-elf.h61
-rw-r--r--gcc/config/vax/vax-protos.h7
-rw-r--r--gcc/config/vax/vax.c427
-rw-r--r--gcc/config/vax/vax.h158
-rw-r--r--gcc/config/vax/vax.md94
-rw-r--r--gcc/config/vax/vaxv.h2
-rw-r--r--gcc/config/vax/vms.h274
-rw-r--r--gcc/config/vax/xm-vms.h174
-rw-r--r--gcc/config/xtensa/elf.h2
-rw-r--r--gcc/config/xtensa/xtensa-protos.h4
-rw-r--r--gcc/config/xtensa/xtensa.c66
-rw-r--r--gcc/config/xtensa/xtensa.h26
-rwxr-xr-xgcc/configure824
-rw-r--r--gcc/configure.in117
-rw-r--r--gcc/conflict.c8
-rw-r--r--gcc/cp/ChangeLog654
-rw-r--r--gcc/cp/ChangeLog.14
-rw-r--r--gcc/cp/ChangeLog.24
-rw-r--r--gcc/cp/Make-lang.in40
-rw-r--r--gcc/cp/NEWS4
-rw-r--r--gcc/cp/call.c95
-rw-r--r--gcc/cp/class.c998
-rw-r--r--gcc/cp/cp-lang.c6
-rw-r--r--gcc/cp/cp-tree.def2
-rw-r--r--gcc/cp/cp-tree.h180
-rw-r--r--gcc/cp/cvt.c22
-rw-r--r--gcc/cp/cxxfilt.c302
-rw-r--r--gcc/cp/decl.c971
-rw-r--r--gcc/cp/decl2.c259
-rw-r--r--gcc/cp/error.c25
-rw-r--r--gcc/cp/except.c4
-rw-r--r--gcc/cp/expr.c10
-rw-r--r--gcc/cp/friend.c10
-rw-r--r--gcc/cp/g++spec.c14
-rw-r--r--gcc/cp/init.c881
-rw-r--r--gcc/cp/lex.c11
-rw-r--r--gcc/cp/mangle.c293
-rw-r--r--gcc/cp/method.c64
-rw-r--r--gcc/cp/operators.def2
-rw-r--r--gcc/cp/optimize.c24
-rw-r--r--gcc/cp/parse.y45
-rw-r--r--gcc/cp/pt.c186
-rw-r--r--gcc/cp/rtti.c97
-rw-r--r--gcc/cp/search.c52
-rw-r--r--gcc/cp/semantics.c102
-rw-r--r--gcc/cp/spew.c16
-rw-r--r--gcc/cp/tree.c189
-rw-r--r--gcc/cp/typeck.c88
-rw-r--r--gcc/cp/typeck2.c157
-rw-r--r--gcc/cppexp.c6
-rw-r--r--gcc/cppfiles.c4
-rw-r--r--gcc/cpphash.h14
-rw-r--r--gcc/cppinit.c20
-rw-r--r--gcc/cpplex.c12
-rw-r--r--gcc/cpplib.c69
-rw-r--r--gcc/cpplib.h6
-rw-r--r--gcc/cppmacro.c24
-rw-r--r--gcc/crtstuff.c100
-rw-r--r--gcc/cse.c261
-rw-r--r--gcc/cselib.c9
-rw-r--r--gcc/dbxout.c19
-rw-r--r--gcc/debug.h2
-rw-r--r--gcc/defaults.h68
-rw-r--r--gcc/dependence.c1463
-rw-r--r--gcc/df.c20
-rw-r--r--gcc/diagnostic.c17
-rw-r--r--gcc/diagnostic.h3
-rw-r--r--gcc/doc/c-tree.texi40
-rw-r--r--gcc/doc/compat.texi156
-rw-r--r--gcc/doc/cpp.texi33
-rw-r--r--gcc/doc/cppopts.texi4
-rw-r--r--gcc/doc/extend.texi211
-rw-r--r--gcc/doc/gcc.texi2
-rw-r--r--gcc/doc/gcov.texi121
-rw-r--r--gcc/doc/gty.texi71
-rw-r--r--gcc/doc/install-old.texi14
-rw-r--r--gcc/doc/install.texi421
-rw-r--r--gcc/doc/interface.texi2
-rw-r--r--gcc/doc/invoke.texi566
-rw-r--r--gcc/doc/makefile.texi4
-rw-r--r--gcc/doc/md.texi229
-rw-r--r--gcc/doc/objc.texi39
-rw-r--r--gcc/doc/rtl.texi13
-rw-r--r--gcc/doc/sourcebuild.texi13
-rw-r--r--gcc/doc/standards.texi18
-rw-r--r--gcc/doc/tm.texi285
-rw-r--r--gcc/doc/trouble.texi16
-rw-r--r--gcc/doc/vms.texi106
-rw-r--r--gcc/doloop.c19
-rw-r--r--gcc/dominance.c2
-rw-r--r--gcc/dwarf2.h6
-rw-r--r--gcc/dwarf2asm.c8
-rw-r--r--gcc/dwarf2out.c216
-rw-r--r--gcc/dwarfout.c18
-rw-r--r--gcc/emit-rtl.c100
-rw-r--r--gcc/et-forest.c2
-rw-r--r--gcc/except.c61
-rw-r--r--gcc/except.h4
-rw-r--r--gcc/explow.c6
-rw-r--r--gcc/expmed.c49
-rw-r--r--gcc/expr.c321
-rw-r--r--gcc/expr.h17
-rw-r--r--gcc/f/ChangeLog95
-rw-r--r--gcc/f/ChangeLog.04
-rw-r--r--gcc/f/Make-lang.in19
-rw-r--r--gcc/f/bugs.texi2
-rw-r--r--gcc/f/com.c19
-rw-r--r--gcc/f/ffe.texi4
-rw-r--r--gcc/f/g77.texi8
-rw-r--r--gcc/f/g77spec.c5
-rw-r--r--gcc/f/intdoc.in50
-rw-r--r--gcc/f/intdoc.texi50
-rw-r--r--gcc/f/invoke.texi27
-rw-r--r--gcc/f/lang-specs.h6
-rw-r--r--gcc/f/news.texi4
-rw-r--r--gcc/f/parse.c2
-rw-r--r--gcc/f/target.c38
-rw-r--r--gcc/f/target.h66
-rw-r--r--gcc/f/version.c4
-rw-r--r--gcc/f/version.h6
-rw-r--r--gcc/final.c316
-rw-r--r--gcc/fixinc/fixincl.x126
-rw-r--r--gcc/fixinc/inclhack.def50
-rw-r--r--gcc/fixinc/tests/base/stdlib.h5
-rw-r--r--gcc/fixinc/tests/base/testing.h2
-rw-r--r--gcc/flags.h37
-rw-r--r--gcc/flow.c14
-rw-r--r--gcc/fold-const.c114
-rw-r--r--gcc/function.c125
-rw-r--r--gcc/function.h17
-rw-r--r--gcc/gcc.c1369
-rw-r--r--gcc/gcov-dump.c460
-rw-r--r--gcc/gcov-io.h621
-rw-r--r--gcc/gcov-iov.c68
-rw-r--r--gcc/gcov.c2041
-rw-r--r--gcc/gcse.c86
-rw-r--r--gcc/genattrtab.c23
-rw-r--r--gcc/genautomata.c29
-rw-r--r--gcc/genconfig.c4
-rw-r--r--gcc/gengtype-lex.l5
-rw-r--r--gcc/gengtype-yacc.y10
-rw-r--r--gcc/gengtype.c1088
-rw-r--r--gcc/gengtype.h6
-rw-r--r--gcc/genmultilib70
-rw-r--r--gcc/genoutput.c1
-rw-r--r--gcc/genrecog.c4
-rw-r--r--gcc/ggc-common.c138
-rw-r--r--gcc/ggc-page.c16
-rw-r--r--gcc/ggc.h16
-rw-r--r--gcc/ginclude/float.h162
-rw-r--r--gcc/ginclude/stddef.h33
-rw-r--r--gcc/global.c12
-rw-r--r--gcc/gthr-dce.h2
-rw-r--r--gcc/gthr-posix.h2
-rw-r--r--gcc/gthr-win32.h2
-rw-r--r--gcc/haifa-sched.c4
-rw-r--r--gcc/hashtable.c2
-rw-r--r--gcc/hashtable.h2
-rw-r--r--gcc/hooks.c9
-rw-r--r--gcc/hooks.h2
-rw-r--r--gcc/ifcvt.c32
-rw-r--r--gcc/integrate.c4
-rw-r--r--gcc/java/ChangeLog195
-rw-r--r--gcc/java/class.c8
-rw-r--r--gcc/java/decl.c2
-rw-r--r--gcc/java/except.c7
-rw-r--r--gcc/java/expr.c34
-rw-r--r--gcc/java/gcj.texi313
-rw-r--r--gcc/java/gjavah.c4
-rw-r--r--gcc/java/java-tree.h31
-rw-r--r--gcc/java/jcf-dump.c18
-rw-r--r--gcc/java/jcf-parse.c47
-rw-r--r--gcc/java/jcf-write.c23
-rw-r--r--gcc/java/jv-scan.c6
-rw-r--r--gcc/java/jvspec.c47
-rw-r--r--gcc/java/lang.c168
-rw-r--r--gcc/java/lex.c14
-rw-r--r--gcc/java/mangle.c4
-rw-r--r--gcc/java/parse-scan.y2
-rw-r--r--gcc/java/parse.y96
-rw-r--r--gcc/java/verify.c9
-rw-r--r--gcc/jump.c61
-rw-r--r--gcc/langhooks.c6
-rw-r--r--gcc/langhooks.h10
-rw-r--r--gcc/libgcc2.c603
-rw-r--r--gcc/libgcc2.h13
-rw-r--r--gcc/line-map.h2
-rw-r--r--gcc/local-alloc.c14
-rw-r--r--gcc/longlong.h225
-rw-r--r--gcc/loop.c660
-rw-r--r--gcc/loop.h4
-rw-r--r--gcc/machmode.def8
-rw-r--r--gcc/mklibgcc.in72
-rw-r--r--gcc/objc/objc-act.c427
-rw-r--r--gcc/optabs.c118
-rw-r--r--gcc/output.h38
-rw-r--r--gcc/params.def2
-rw-r--r--gcc/predict.c33
-rw-r--r--gcc/predict.def2
-rw-r--r--gcc/print-rtl.c21
-rw-r--r--gcc/print-tree.c28
-rw-r--r--gcc/profile.c1003
-rw-r--r--gcc/profile.h2
-rw-r--r--gcc/protoize.c10
-rw-r--r--gcc/ra-build.c10
-rw-r--r--gcc/ra-colorize.c4
-rw-r--r--gcc/ra-rewrite.c2
-rw-r--r--gcc/read-rtl.c4
-rw-r--r--gcc/real.c9152
-rw-r--r--gcc/real.h439
-rw-r--r--gcc/recog.c6
-rw-r--r--gcc/reg-stack.c6
-rw-r--r--gcc/regclass.c10
-rw-r--r--gcc/regmove.c2
-rw-r--r--gcc/regrename.c4
-rw-r--r--gcc/reload.c68
-rw-r--r--gcc/reload.h4
-rw-r--r--gcc/reload1.c75
-rw-r--r--gcc/reorg.c24
-rw-r--r--gcc/resource.c4
-rw-r--r--gcc/rtl.c18
-rw-r--r--gcc/rtl.def14
-rw-r--r--gcc/rtl.h84
-rw-r--r--gcc/rtlanal.c116
-rw-r--r--gcc/sbitmap.c12
-rw-r--r--gcc/sched-deps.c13
-rw-r--r--gcc/sched-int.h2
-rw-r--r--gcc/sched-rgn.c4
-rw-r--r--gcc/sched-vis.c7
-rw-r--r--gcc/sdbout.c18
-rw-r--r--gcc/sibcall.c15
-rw-r--r--gcc/simplify-rtx.c104
-rw-r--r--gcc/ssa.c33
-rw-r--r--gcc/stab.def10
-rw-r--r--gcc/stmt.c195
-rw-r--r--gcc/stor-layout.c515
-rw-r--r--gcc/system.h7
-rw-r--r--gcc/target-def.h47
-rw-r--r--gcc/target.h28
-rw-r--r--gcc/testsuite/ChangeLog702
-rw-r--r--gcc/testsuite/README.QMTEST2
-rw-r--r--gcc/testsuite/README.compat72
-rw-r--r--gcc/testsuite/g++.dg/README2
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield5.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield6.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield7.C7
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield8.C20
-rw-r--r--gcc/testsuite/g++.dg/abi/empty5.C17
-rw-r--r--gcc/testsuite/g++.dg/abi/empty6.C8
-rw-r--r--gcc/testsuite/g++.dg/abi/empty7.C18
-rw-r--r--gcc/testsuite/g++.dg/abi/empty8.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle10.C13
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle11.C10
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle12.C11
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle13.C28
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle14.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle15.C14
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle16.C18
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle17.C11
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle9.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase10.C7
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase11.C12
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase12.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1.h10
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2.h10
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10.h54
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21.h54
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22.h59
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4.h57
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C49
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C63
-rw-r--r--gcc/testsuite/g++.dg/compat/break/README11
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5.h11
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5_x.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield5_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7.h3
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7_main.C16
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7_x.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/bitfield7_y.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6.h7
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6_x.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/break/empty6_y.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10.h12
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10_x.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase10_y.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11.h12
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/break/vbase11_y.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/compat.exp137
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1.h10
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1_x.C22
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor1_y.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2.h22
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2_x.C19
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/ctor2_y.C20
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1.h7
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1_x.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/dtor1_y.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1.h5
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1_main.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1_x.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter1_y.C17
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter2_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter2_x.C20
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/filter2_y.C39
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/new1_main.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/new1_x.C28
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/new1_y.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1.h5
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1_x.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/nrv1_y.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3.h8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3_x.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/spec3_y.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1.h15
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1_x.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/template1_y.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C26
-rw-r--r--gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C21
-rw-r--r--gcc/testsuite/g++.dg/compat/init/array5_main.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/init/array5_x.C33
-rw-r--r--gcc/testsuite/g++.dg/compat/init/array5_y.C20
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1.h6
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1_main.C12
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1_x.C15
-rw-r--r--gcc/testsuite/g++.dg/compat/init/byval1_y.C14
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1.h30
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1_main.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1_x.C7
-rw-r--r--gcc/testsuite/g++.dg/compat/init/dtor1_y.C18
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1.h5
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1_main.C25
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1_x.C15
-rw-r--r--gcc/testsuite/g++.dg/compat/init/elide1_y.C9
-rw-r--r--gcc/testsuite/g++.dg/compat/init/init-ref2_main.C11
-rw-r--r--gcc/testsuite/g++.dg/compat/init/init-ref2_x.C22
-rw-r--r--gcc/testsuite/g++.dg/compat/init/init-ref2_y.C24
-rw-r--r--gcc/testsuite/g++.dg/cpp/c++98-pedantic.C (renamed from gcc/testsuite/gcc.dg/cpp/c++98-pedantic.C)0
-rw-r--r--gcc/testsuite/g++.dg/cpp/c++98.C (renamed from gcc/testsuite/gcc.dg/cpp/c++98.C)0
-rw-r--r--gcc/testsuite/g++.dg/dg.exp1
-rw-r--r--gcc/testsuite/g++.dg/eh/spec5.C22
-rw-r--r--gcc/testsuite/g++.dg/eh/spec6.C19
-rw-r--r--gcc/testsuite/g++.dg/ext/asm3.C13
-rw-r--r--gcc/testsuite/g++.dg/ext/lvaddr.C10
-rw-r--r--gcc/testsuite/g++.dg/ext/lvcast.C11
-rw-r--r--gcc/testsuite/g++.dg/ext/typedef-init.C14
-rw-r--r--gcc/testsuite/g++.dg/ext/vlm1.C13
-rw-r--r--gcc/testsuite/g++.dg/ext/vlm2.C13
-rw-r--r--gcc/testsuite/g++.dg/inherit/cond1.C10
-rw-r--r--gcc/testsuite/g++.dg/inherit/override1.C18
-rw-r--r--gcc/testsuite/g++.dg/inherit/thunk1.C41
-rw-r--r--gcc/testsuite/g++.dg/inherit/using2.C25
-rw-r--r--gcc/testsuite/g++.dg/inherit/using3.C19
-rw-r--r--gcc/testsuite/g++.dg/init/aggr1.C19
-rw-r--r--gcc/testsuite/g++.dg/init/array1.C6
-rw-r--r--gcc/testsuite/g++.dg/init/array6.C3
-rw-r--r--gcc/testsuite/g++.dg/init/array7.C15
-rw-r--r--gcc/testsuite/g++.dg/init/array8.C12
-rw-r--r--gcc/testsuite/g++.dg/init/brace1.C4
-rw-r--r--gcc/testsuite/g++.dg/init/copy2.C5
-rw-r--r--gcc/testsuite/g++.dg/init/copy3.C16
-rw-r--r--gcc/testsuite/g++.dg/init/ctor1.C57
-rw-r--r--gcc/testsuite/g++.dg/init/pm2.C7
-rw-r--r--gcc/testsuite/g++.dg/lookup/scoped2.C19
-rw-r--r--gcc/testsuite/g++.dg/opt/const2.C40
-rw-r--r--gcc/testsuite/g++.dg/other/constref1.C16
-rw-r--r--gcc/testsuite/g++.dg/other/constref2.C16
-rw-r--r--gcc/testsuite/g++.dg/other/cxa-atexit1.C26
-rw-r--r--gcc/testsuite/g++.dg/other/do1.C13
-rw-r--r--gcc/testsuite/g++.dg/other/offsetof1.C2
-rw-r--r--gcc/testsuite/g++.dg/other/warning1.C18
-rw-r--r--gcc/testsuite/g++.dg/overload/member1.C22
-rw-r--r--gcc/testsuite/g++.dg/overload/member2.C41
-rw-r--r--gcc/testsuite/g++.dg/parse/decl-specifier-1.C16
-rw-r--r--gcc/testsuite/g++.dg/parse/friend1.C9
-rw-r--r--gcc/testsuite/g++.dg/rtti/crash1.C10
-rw-r--r--gcc/testsuite/g++.dg/template/cond.C23
-rw-r--r--gcc/testsuite/g++.dg/template/deduce1.C25
-rw-r--r--gcc/testsuite/g++.dg/template/friend4.C2
-rw-r--r--gcc/testsuite/g++.dg/template/meminit1.C7
-rw-r--r--gcc/testsuite/g++.dg/template/pretty1.C43
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem3.C22
-rw-r--r--gcc/testsuite/g++.dg/template/qualttp20.C20
-rw-r--r--gcc/testsuite/g++.dg/template/ref1.C3
-rw-r--r--gcc/testsuite/g++.dg/template/subst1.C27
-rw-r--r--gcc/testsuite/g++.dg/template/union1.C29
-rw-r--r--gcc/testsuite/g++.dg/tls/init-2.C6
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreorder-1.C14
-rw-r--r--gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900210_05.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900211_04.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900321_02.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900404_02.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900520_06.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ext/arrnew.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/report.C5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.law/global-init1.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/p9129.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/warn3.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/asm3.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/crash32.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/delete4.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/inline21.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/qual1.C5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/singleton.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/asm1.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash67.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/memtemp64.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/eb42.C19
-rw-r--r--gcc/testsuite/g77.dg/7388.f12
-rw-r--r--gcc/testsuite/g77.dg/strlen0.f2
-rw-r--r--gcc/testsuite/g77.f-torture/compile/20010519-1.f2
-rw-r--r--gcc/testsuite/g77.f-torture/compile/980310-4.f4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20000605-1.c2
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020910-1.c14
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020926-1.c21
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020927-1.c26
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020930-1.c10
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20021001-1.c4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20021007-1.c11
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/simd-5.c12
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/trunctfdf.c14
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20000801-4.c4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20010915-1.c2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020225-1.c2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020720-1.x28
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020904-1.c19
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020911-1.c8
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020916-1.c19
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20021010-1.c21
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20021010-2.c37
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20021011-1.c24
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20021015-1.c30
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/990208-1.x2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/extzvsi.c31
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ffs-1.c12
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ffs-2.c44
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ieee/20010226-1.c15
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ieee/inf-1.c35
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ieee/mzero3.c51
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/loop-14.c20
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/loop-15.c40
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/shiftdi.c20
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/shiftopt-1.c73
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/simd-1.c7
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/strct-stdarg-1.x7
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/struct-cpy-1.c43
-rw-r--r--gcc/testsuite/gcc.dg/20000614-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/20020103-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/20020219-1.c16
-rw-r--r--gcc/testsuite/gcc.dg/20020312-2.c13
-rw-r--r--gcc/testsuite/gcc.dg/20020411-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020523-2.c65
-rw-r--r--gcc/testsuite/gcc.dg/20020919-1.c248
-rw-r--r--gcc/testsuite/gcc.dg/20020926-1.c14
-rw-r--r--gcc/testsuite/gcc.dg/20021006-1.c27
-rw-r--r--gcc/testsuite/gcc.dg/20021014-1.c21
-rw-r--r--gcc/testsuite/gcc.dg/980211-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/alias-1.c28
-rw-r--r--gcc/testsuite/gcc.dg/builtin-inf-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/builtins-2.c146
-rw-r--r--gcc/testsuite/gcc.dg/builtins-3.c55
-rw-r--r--gcc/testsuite/gcc.dg/c90-digraph-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/c90-hexfloat-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/c94-digraph-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/c99-bool-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/c99-digraph-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/c99-hexfloat-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/compare2.c4
-rw-r--r--gcc/testsuite/gcc.dg/cpp/20020927-1.c91
-rw-r--r--gcc/testsuite/gcc.dg/cpp/_Pragma4.c12
-rw-r--r--gcc/testsuite/gcc.dg/cpp/assembler.S1
-rw-r--r--gcc/testsuite/gcc.dg/cpp/avoidpaste1.c2
-rw-r--r--gcc/testsuite/gcc.dg/cpp/defined.c6
-rw-r--r--gcc/testsuite/gcc.dg/cpp/line5.c2
-rw-r--r--gcc/testsuite/gcc.dg/cpp/macsyntx.c2
-rw-r--r--gcc/testsuite/gcc.dg/cpp/multiline.c2
-rw-r--r--gcc/testsuite/gcc.dg/cpp/paste13.c9
-rw-r--r--gcc/testsuite/gcc.dg/cpp/paste2.c2
-rw-r--r--gcc/testsuite/gcc.dg/cpp/tr-warn2.c24
-rw-r--r--gcc/testsuite/gcc.dg/cpp/trad/defined.c4
-rw-r--r--gcc/testsuite/gcc.dg/cpp/trad/literals-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/dll-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/doloop-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/empty1.c11
-rw-r--r--gcc/testsuite/gcc.dg/format/attr-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/format/c90-printf-1.c8
-rw-r--r--gcc/testsuite/gcc.dg/format/c90-scanf-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/format/c90-scanf-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/format/c99-printf-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/format/c99-scanf-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/format/ext-4.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-sse-3.c14
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssetype-1.c32
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssetype-2.c40
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssetype-3.c32
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssetype-4.c38
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssetype-5.c33
-rw-r--r--gcc/testsuite/gcc.dg/inline-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/noncompile/920923-1.c78
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-1.c46
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-2.c47
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-3.c65
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-4.c66
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-5.c41
-rw-r--r--gcc/testsuite/gcc.dg/special/mips-abi.exp125
-rw-r--r--gcc/testsuite/gcc.dg/special/mips-abi.s0
-rw-r--r--gcc/testsuite/gcc.dg/struct-ret-1.c3
-rw-r--r--gcc/testsuite/gcc.dg/tls/opt-3.c10
-rw-r--r--gcc/testsuite/gcc.dg/tls/struct-1.c32
-rw-r--r--gcc/testsuite/gcc.dg/typedef-init.c9
-rw-r--r--gcc/testsuite/gcc.dg/weak-8.c10
-rw-r--r--gcc/testsuite/gcc.dg/weak/typeof-2.c36
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-1.c (renamed from gcc/testsuite/gcc.dg/weak-1.c)7
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-2.c (renamed from gcc/testsuite/gcc.dg/weak-2.c)9
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-3.c (renamed from gcc/testsuite/gcc.dg/weak-3.c)8
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-4.c (renamed from gcc/testsuite/gcc.dg/weak-4.c)11
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-5.c (renamed from gcc/testsuite/gcc.dg/weak-5.c)8
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-6.c (renamed from gcc/testsuite/gcc.dg/weak-6.c)2
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-7.c (renamed from gcc/testsuite/gcc.dg/weak-7.c)1
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-8.c7
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak-9.c (renamed from gcc/testsuite/gcc.dg/weak-9.c)8
-rw-r--r--gcc/testsuite/gcc.dg/weak/weak.exp41
-rw-r--r--gcc/testsuite/gcc.dg/wtr-union-init-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/wtr-union-init-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/wtr-union-init-3.c2
-rw-r--r--gcc/testsuite/gcc.misc-tests/gcov-8.c2
-rw-r--r--gcc/testsuite/lib/compat.exp235
-rw-r--r--gcc/testsuite/lib/g++.exp2
-rw-r--r--gcc/testsuite/lib/g77.exp2
-rw-r--r--gcc/testsuite/lib/gcc.exp2
-rw-r--r--gcc/testsuite/lib/objc.exp2
-rw-r--r--gcc/testsuite/lib/old-dejagnu.exp2
-rw-r--r--gcc/testsuite/lib/profopt.exp2
-rw-r--r--gcc/testsuite/lib/prune.exp4
-rw-r--r--gcc/testsuite/lib/scanasm.exp24
-rw-r--r--gcc/testsuite/lib/target-supports.exp6
-rw-r--r--gcc/testsuite/objc.dg/bitfield-2.m2
-rw-r--r--gcc/testsuite/objc.dg/comp-types-1.m86
-rw-r--r--gcc/testsuite/objc.dg/comp-types-2.m37
-rw-r--r--gcc/testsuite/objc.dg/comp-types-3.m63
-rw-r--r--gcc/testsuite/objc.dg/comp-types-4.m68
-rw-r--r--gcc/testsuite/objc.dg/comp-types-5.m32
-rw-r--r--gcc/testsuite/objc.dg/comp-types-6.m37
-rw-r--r--gcc/testsuite/objc.dg/proto-lossage-1.m43
-rw-r--r--gcc/testsuite/objc.dg/super-class-2.m45
-rw-r--r--gcc/testsuite/objc.dg/undeclared-selector.m48
-rw-r--r--gcc/testsuite/objc/execute/class-tests-1.h2
-rw-r--r--gcc/testsuite/objc/execute/formal_protocol-6.x2
-rw-r--r--gcc/testsuite/objc/execute/nil_method-1.m61
-rw-r--r--gcc/timevar.c4
-rw-r--r--gcc/tlink.c13
-rw-r--r--gcc/toplev.c80
-rw-r--r--gcc/tracer.c2
-rw-r--r--gcc/tree-dump.c6
-rw-r--r--gcc/tree-inline.c45
-rw-r--r--gcc/tree.c196
-rw-r--r--gcc/tree.def16
-rw-r--r--gcc/tree.h107
-rw-r--r--gcc/treelang/ChangeLog4
-rw-r--r--gcc/treelang/treelang.texi4
-rw-r--r--gcc/treelang/treetree.c8
-rw-r--r--gcc/unroll.c148
-rw-r--r--gcc/unwind-libunwind.c157
-rw-r--r--gcc/unwind-sjlj.c2
-rw-r--r--gcc/unwind.h2
-rw-r--r--gcc/varasm.c383
-rw-r--r--gcc/version.c16
-rw-r--r--gcc/version.h3
-rw-r--r--gcc/vmsdbgout.c39
-rw-r--r--gcc/xcoffout.h20
-rw-r--r--include/ChangeLog9
-rw-r--r--include/getopt.h2
-rw-r--r--include/libiberty.h4
-rw-r--r--libf2c/ChangeLog36
-rw-r--r--libf2c/Makefile.in2
-rw-r--r--libf2c/libF77/Version.c18
-rw-r--r--libf2c/libI77/Version.c18
-rw-r--r--libf2c/libI77/rsne.c10
-rw-r--r--libf2c/libU77/Version.c13
-rw-r--r--libf2c/libU77/datetime_.c15
-rw-r--r--libffi/ChangeLog56
-rw-r--r--libffi/Makefile.am2
-rw-r--r--libffi/Makefile.in2
-rwxr-xr-xlibffi/configure133
-rw-r--r--libffi/configure.in1
-rw-r--r--libffi/include/ffi.h.in40
-rw-r--r--libffi/src/arm/sysv.S17
-rw-r--r--libffi/src/ffitest.c2
-rw-r--r--libffi/src/java_raw_api.c91
-rw-r--r--libffi/src/prep_cif.c8
-rw-r--r--libffi/src/s390/ffi.c1042
-rw-r--r--libffi/src/s390/sysv.S446
-rw-r--r--libffi/src/types.c2
-rw-r--r--libffi/src/x86/ffi64.c2
-rw-r--r--libiberty/ChangeLog67
-rw-r--r--libiberty/Makefile.in2
-rw-r--r--libiberty/README3
-rw-r--r--libiberty/config.table1
-rw-r--r--libiberty/cp-demangle.c10
-rw-r--r--libiberty/cplus-dem.c356
-rw-r--r--libiberty/fibheap.c2
-rw-r--r--libiberty/md5.c6
-rw-r--r--libiberty/regex.c4
-rw-r--r--libiberty/safe-ctype.c28
-rw-r--r--libiberty/splay-tree.c6
-rw-r--r--libiberty/testsuite/Makefile.in20
-rw-r--r--libiberty/testsuite/demangle-expected34
-rwxr-xr-xlibiberty/testsuite/regress-demangle30
-rw-r--r--libiberty/testsuite/test-demangle.c175
-rw-r--r--libiberty/vasprintf.c2
-rw-r--r--libjava/ChangeLog1120
-rw-r--r--libjava/Makefile.am86
-rw-r--r--libjava/Makefile.in228
-rw-r--r--libjava/acconfig.h1
-rw-r--r--libjava/aclocal.m423
-rw-r--r--libjava/boehm.cc8
-rwxr-xr-xlibjava/configure677
-rw-r--r--libjava/configure.host25
-rw-r--r--libjava/configure.in7
-rw-r--r--libjava/defineclass.cc1
-rw-r--r--libjava/gcj/.cvsignore1
-rw-r--r--libjava/gcj/javaprims.h6
-rw-r--r--libjava/gij.cc12
-rw-r--r--libjava/gnu/classpath/Configuration.java.in5
-rw-r--r--libjava/gnu/gcj/protocol/core/Connection.java15
-rw-r--r--libjava/gnu/gcj/protocol/file/Connection.java15
-rw-r--r--libjava/gnu/gcj/protocol/http/Connection.java17
-rw-r--r--libjava/gnu/gcj/runtime/NameFinder.java548
-rw-r--r--libjava/gnu/gcj/runtime/natNameFinder.cc113
-rw-r--r--libjava/gnu/java/lang/reflect/TypeSignature.java384
-rw-r--r--libjava/gnu/java/rmi/RMIMarshalledObjectInputStream.java70
-rw-r--r--libjava/gnu/java/rmi/RMIMarshalledObjectOutputStream.java103
-rw-r--r--libjava/gnu/java/rmi/dgc/DGCImpl.java6
-rw-r--r--libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java38
-rw-r--r--libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java38
-rw-r--r--libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java38
-rw-r--r--libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java38
-rw-r--r--libjava/gnu/java/rmi/server/ConnectionRunnerPool.java154
-rw-r--r--libjava/gnu/java/rmi/server/RMIHashes.java48
-rw-r--r--libjava/gnu/java/rmi/server/RMIObjectInputStream.java84
-rw-r--r--libjava/gnu/java/rmi/server/RMIObjectOutputStream.java61
-rw-r--r--libjava/gnu/java/rmi/server/UnicastConnection.java30
-rw-r--r--libjava/gnu/java/rmi/server/UnicastConnectionManager.java40
-rw-r--r--libjava/gnu/java/rmi/server/UnicastRef.java28
-rw-r--r--libjava/gnu/java/rmi/server/UnicastServer.java16
-rw-r--r--libjava/gnu/java/rmi/server/UnicastServerRef.java53
-rw-r--r--libjava/include/.cvsignore1
-rw-r--r--libjava/include/config.h.in12
-rw-r--r--libjava/include/java-interp.h24
-rw-r--r--libjava/include/jvm.h14
-rw-r--r--libjava/include/name-finder.h103
-rw-r--r--libjava/include/win32-threads.h8
-rw-r--r--libjava/include/win32.h3
-rw-r--r--libjava/interpret.cc28
-rw-r--r--libjava/java/awt/Toolkit.java4
-rw-r--r--libjava/java/awt/dnd/Autoscroll.java67
-rw-r--r--libjava/java/awt/dnd/DragSourceAdapter.java4
-rw-r--r--libjava/java/awt/dnd/DragSourceDropEvent.java84
-rw-r--r--libjava/java/awt/dnd/DropTarget.java182
-rw-r--r--libjava/java/awt/dnd/DropTargetAdapter.java100
-rw-r--r--libjava/java/awt/dnd/DropTargetContext.java174
-rw-r--r--libjava/java/awt/dnd/DropTargetDragEvent.java107
-rw-r--r--libjava/java/awt/dnd/DropTargetDropEvent.java132
-rw-r--r--libjava/java/awt/dnd/DropTargetEvent.java56
-rw-r--r--libjava/java/awt/dnd/DropTargetListener.java89
-rw-r--r--libjava/java/awt/dnd/MouseDragGestureRecognizer.java118
-rw-r--r--libjava/java/awt/dnd/peer/DropTargetContextPeer.java45
-rw-r--r--libjava/java/beans/beancontext/BeanContextChildSupport.java6
-rw-r--r--libjava/java/io/ObjectInputStream.java29
-rw-r--r--libjava/java/io/natFileDescriptorPosix.cc4
-rw-r--r--libjava/java/lang/AssertionError.java2
-rw-r--r--libjava/java/lang/Class.h7
-rw-r--r--libjava/java/lang/Class.java28
-rw-r--r--libjava/java/lang/ClassLoader.java29
-rw-r--r--libjava/java/lang/Thread.java7
-rw-r--r--libjava/java/lang/Throwable.java176
-rw-r--r--libjava/java/lang/VMClassLoader.java8
-rw-r--r--libjava/java/lang/VMThrowable.java97
-rw-r--r--libjava/java/lang/natClass.cc7
-rw-r--r--libjava/java/lang/natClassLoader.cc22
-rw-r--r--libjava/java/lang/natObject.cc36
-rw-r--r--libjava/java/lang/natRuntime.cc3
-rw-r--r--libjava/java/lang/natThrowable.cc99
-rw-r--r--libjava/java/lang/natVMThrowable.cc97
-rw-r--r--libjava/java/lang/reflect/InvocationHandler.java136
-rw-r--r--libjava/java/lang/reflect/Proxy.java1586
-rw-r--r--libjava/java/lang/reflect/UndeclaredThrowableException.java128
-rw-r--r--libjava/java/lang/reflect/natConstructor.cc4
-rw-r--r--libjava/java/lang/reflect/natMethod.cc9
-rw-r--r--libjava/java/lang/reflect/natProxy.cc38
-rw-r--r--libjava/java/net/Authenticator.java34
-rw-r--r--libjava/java/net/BindException.java1
-rw-r--r--libjava/java/net/DatagramPacket.java372
-rw-r--r--libjava/java/net/DatagramSocket.java558
-rw-r--r--libjava/java/net/DatagramSocketImpl.java89
-rw-r--r--libjava/java/net/DatagramSocketImplFactory.java59
-rw-r--r--libjava/java/net/FileNameMap.java1
-rw-r--r--libjava/java/net/HttpURLConnection.java83
-rw-r--r--libjava/java/net/Inet4Address.java275
-rw-r--r--libjava/java/net/Inet6Address.java272
-rw-r--r--libjava/java/net/InetAddress.java192
-rw-r--r--libjava/java/net/InetSocketAddress.java219
-rw-r--r--libjava/java/net/JarURLConnection.java102
-rw-r--r--libjava/java/net/MulticastSocket.java409
-rw-r--r--libjava/java/net/NetPermission.java2
-rw-r--r--libjava/java/net/NetworkInterface.java237
-rw-r--r--libjava/java/net/PasswordAuthentication.java1
-rw-r--r--libjava/java/net/PlainDatagramSocketImpl.java36
-rw-r--r--libjava/java/net/PlainSocketImpl.java25
-rw-r--r--libjava/java/net/ServerSocket.java280
-rw-r--r--libjava/java/net/Socket.java394
-rw-r--r--libjava/java/net/SocketAddress.java8
-rw-r--r--libjava/java/net/SocketImpl.java58
-rw-r--r--libjava/java/net/SocketOptions.java215
-rw-r--r--libjava/java/net/SocketPermission.java12
-rw-r--r--libjava/java/net/URI.java433
-rw-r--r--libjava/java/net/URL.java248
-rw-r--r--libjava/java/net/URLClassLoader.java226
-rw-r--r--libjava/java/net/URLConnection.java377
-rw-r--r--libjava/java/net/URLDecoder.java108
-rw-r--r--libjava/java/net/URLEncoder.java3
-rw-r--r--libjava/java/net/URLStreamHandler.java176
-rw-r--r--libjava/java/net/natNetworkInterface.cc145
-rw-r--r--libjava/java/net/natPlainDatagramSocketImpl.cc185
-rw-r--r--libjava/java/net/natPlainSocketImpl.cc187
-rw-r--r--libjava/java/nio/Buffer.java42
-rw-r--r--libjava/java/nio/ByteBuffer.java42
-rw-r--r--libjava/java/nio/MappedByteBuffer.java42
-rw-r--r--libjava/java/nio/channels/AlreadyConnectedException.java50
-rw-r--r--libjava/java/nio/channels/ByteChannel.java43
-rw-r--r--libjava/java/nio/channels/Channel.java55
-rw-r--r--libjava/java/nio/channels/ClosedChannelException.java50
-rw-r--r--libjava/java/nio/channels/DatagramChannel.java47
-rw-r--r--libjava/java/nio/channels/GatheringByteChannel.java79
-rw-r--r--libjava/java/nio/channels/IllegalBlockingModeException.java56
-rw-r--r--libjava/java/nio/channels/InterruptibleChannel.java50
-rw-r--r--libjava/java/nio/channels/ReadableByteChannel.java59
-rw-r--r--libjava/java/nio/channels/ScatteringByteChannel.java79
-rw-r--r--libjava/java/nio/channels/ServerSocketChannel.java45
-rw-r--r--libjava/java/nio/channels/SocketChannel.java45
-rw-r--r--libjava/java/nio/channels/WritableByteChannel.java60
-rw-r--r--libjava/java/nio/channels/spi/AbstractSelectableChannel.java10
-rw-r--r--libjava/java/nio/charset/CharacterCodingException.java50
-rw-r--r--libjava/java/nio/charset/IllegalCharsetNameException.java60
-rw-r--r--libjava/java/nio/charset/MalformedInputException.java69
-rw-r--r--libjava/java/nio/charset/UnmappableCharacterException.java69
-rw-r--r--libjava/java/nio/charset/UnsupportedCharsetException.java60
-rw-r--r--libjava/java/nio/charset/spi/CharsetProvider.java88
-rw-r--r--libjava/java/rmi/MarshalledObject.java83
-rw-r--r--libjava/java/rmi/activation/ActivationDesc.java5
-rw-r--r--libjava/java/rmi/activation/ActivationGroupDesc.java5
-rw-r--r--libjava/java/rmi/activation/ActivationGroupID.java5
-rw-r--r--libjava/java/rmi/activation/ActivationID.java5
-rw-r--r--libjava/java/rmi/server/LogStream.java4
-rw-r--r--libjava/java/rmi/server/RMIClassLoader.java149
-rw-r--r--libjava/java/rmi/server/RemoteObject.java84
-rw-r--r--libjava/java/rmi/server/RemoteServer.java2
-rw-r--r--libjava/java/rmi/server/UnicastRemoteObject.java71
-rw-r--r--libjava/java/security/Identity.java2
-rw-r--r--libjava/java/security/KeyPair.java2
-rw-r--r--libjava/java/security/ProtectionDomain.java3
-rw-r--r--libjava/java/security/Provider.java2
-rw-r--r--libjava/java/security/SecureClassLoader.java16
-rw-r--r--libjava/java/security/SecureRandom.java2
-rw-r--r--libjava/java/security/SecureRandomSpi.java2
-rw-r--r--libjava/java/security/Security.java17
-rw-r--r--libjava/java/security/SignedObject.java2
-rw-r--r--libjava/java/security/cert/Certificate.java3
-rw-r--r--libjava/java/text/Collator.java8
-rw-r--r--libjava/java/util/Calendar.java8
-rw-r--r--libjava/java/util/ResourceBundle.java208
-rw-r--r--libjava/java/util/TimeZone.java16
-rw-r--r--libjava/java/util/regex/Matcher.java51
-rw-r--r--libjava/java/util/regex/Pattern.java59
-rw-r--r--libjava/java/util/regex/PatternSyntaxException.java131
-rw-r--r--libjava/java/util/zip/ZipInputStream.java10
-rw-r--r--libjava/java/util/zip/natDeflater.cc1
-rw-r--r--libjava/java/util/zip/natInflater.cc1
-rw-r--r--libjava/javax/naming/BinaryRefAddr.java13
-rw-r--r--libjava/javax/naming/Name.java2
-rw-r--r--libjava/javax/naming/NamingException.java2
-rw-r--r--libjava/javax/naming/RefAddr.java26
-rw-r--r--libjava/javax/swing/AbstractListModel.java9
-rw-r--r--libjava/javax/swing/DefaultBoundedRangeModel.java9
-rw-r--r--libjava/javax/swing/DefaultSingleSelectionModel.java9
-rw-r--r--libjava/mauve-libgcj21
-rw-r--r--libjava/name-finder.cc356
-rw-r--r--libjava/prims.cc7
-rw-r--r--libjava/resolve.cc44
-rw-r--r--libjava/sysdep/s390/locks.h77
-rw-r--r--libjava/sysdep/x86-64/locks.h7
-rw-r--r--libjava/testsuite/ChangeLog37
-rw-r--r--libjava/testsuite/lib/libjava.exp2
-rw-r--r--libjava/testsuite/libjava.compile/narrow_case.java11
-rw-r--r--libjava/testsuite/libjava.lang/Array_3.java19
-rw-r--r--libjava/testsuite/libjava.lang/EvaluationOrder.java22
-rw-r--r--libjava/testsuite/libjava.lang/EvaluationOrder.out3
-rw-r--r--libjava/testsuite/libjava.lang/StaticConstructor.java29
-rw-r--r--libjava/testsuite/libjava.lang/StaticConstructor.out1
-rw-r--r--libjava/testsuite/libjava.lang/TestProxy.java34
-rw-r--r--libjava/testsuite/libjava.lang/TestProxy.out1
-rw-r--r--libjava/testsuite/libjava.lang/utf8concat.java11
-rw-r--r--libjava/testsuite/libjava.lang/utf8concat.out0
-rw-r--r--libjava/testsuite/libjava.mauve/xfails3
-rw-r--r--libobjc/ChangeLog16
-rw-r--r--libobjc/Makefile.in2
-rw-r--r--libobjc/nil_method.c21
-rw-r--r--libobjc/objc/objc.h9
-rw-r--r--libobjc/sendmsg.c6
-rw-r--r--libstdc++-v3/ChangeLog984
-rw-r--r--libstdc++-v3/Makefile.am21
-rw-r--r--libstdc++-v3/Makefile.in22
-rw-r--r--libstdc++-v3/acconfig.h14
-rw-r--r--libstdc++-v3/acinclude.m454
-rw-r--r--libstdc++-v3/aclocal.m454
-rw-r--r--libstdc++-v3/config.h.in14
-rw-r--r--libstdc++-v3/config/abi/alphaev67-unknown-linux-gnu/baseline_symbols.txt3031
-rwxr-xr-xlibstdc++-v3/config/abi/extract_symvers64
-rw-r--r--libstdc++-v3/config/abi/i386-unknown-freebsd4/baseline_symbols.txt2008
-rw-r--r--libstdc++-v3/config/abi/ia64-unknown-linux-gnu/baseline_symbols.txt3031
-rw-r--r--libstdc++-v3/config/abi/x86_64-unknown-linux-gnu/baseline_symbols.txt3034
-rw-r--r--libstdc++-v3/config/cpu/arm/atomicity.h187
-rw-r--r--libstdc++-v3/config/cpu/cris/cpu_limits.h33
-rw-r--r--libstdc++-v3/config/cpu/generic/cpu_limits.h41
-rw-r--r--libstdc++-v3/config/cpu/generic/limits.h40
-rw-r--r--libstdc++-v3/config/cpu/i386/cpu_limits.h33
-rw-r--r--libstdc++-v3/config/cpu/ia64/cpu_limits.h36
-rw-r--r--libstdc++-v3/config/cpu/m68k/cpu_limits.h35
-rw-r--r--libstdc++-v3/config/cpu/powerpc/cpu_limits.h42
-rw-r--r--libstdc++-v3/config/cpu/s390/cpu_limits.h33
-rw-r--r--libstdc++-v3/config/cpu/sparc/atomicity.h (renamed from libstdc++-v3/config/cpu/sparc/sparc32/atomicity.h)47
-rw-r--r--libstdc++-v3/config/cpu/sparc/sparc64/atomicity.h70
-rw-r--r--libstdc++-v3/config/cpu/x86-64/cpu_limits.h35
-rw-r--r--libstdc++-v3/config/linker-map.gnu70
-rw-r--r--libstdc++-v3/config/locale/generic/c++locale_internal.h (renamed from libstdc++-v3/config/cpu/mmix/cpu_limits.h)10
-rw-r--r--libstdc++-v3/config/locale/generic/c_locale.cc11
-rw-r--r--libstdc++-v3/config/locale/generic/c_locale.h32
-rw-r--r--libstdc++-v3/config/locale/generic/codecvt_members.cc101
-rw-r--r--libstdc++-v3/config/locale/generic/messages_members.cc7
-rw-r--r--libstdc++-v3/config/locale/generic/time_members.cc14
-rw-r--r--libstdc++-v3/config/locale/gnu/c++locale_internal.h (renamed from libstdc++-v3/config/cpu/alpha/cpu_limits.h)45
-rw-r--r--libstdc++-v3/config/locale/gnu/c_locale.cc23
-rw-r--r--libstdc++-v3/config/locale/gnu/c_locale.h50
-rw-r--r--libstdc++-v3/config/locale/gnu/codecvt_members.cc113
-rw-r--r--libstdc++-v3/config/locale/gnu/collate_members.cc3
-rw-r--r--libstdc++-v3/config/locale/gnu/ctype_members.cc35
-rw-r--r--libstdc++-v3/config/locale/gnu/messages_members.cc22
-rw-r--r--libstdc++-v3/config/locale/gnu/messages_members.h20
-rw-r--r--libstdc++-v3/config/locale/gnu/monetary_members.cc42
-rw-r--r--libstdc++-v3/config/locale/gnu/numeric_members.cc5
-rw-r--r--libstdc++-v3/config/locale/gnu/time_members.cc27
-rw-r--r--libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc12
-rw-r--r--libstdc++-v3/config/os/aix/os_defines.h11
-rw-r--r--libstdc++-v3/config/os/bsd/freebsd/os_defines.h4
-rw-r--r--libstdc++-v3/config/os/gnu-linux/ctype_base.h16
-rw-r--r--libstdc++-v3/config/os/gnu-linux/ctype_noninline.h84
-rw-r--r--libstdc++-v3/config/os/gnu-linux/os_defines.h10
-rw-r--r--libstdc++-v3/config/os/hpux/cpu_limits.h35
-rw-r--r--libstdc++-v3/config/os/hpux/os_defines.h2
-rw-r--r--libstdc++-v3/config/os/irix/irix5.2/os_defines.h6
-rw-r--r--libstdc++-v3/config/os/irix/irix6.5/os_defines.h9
-rw-r--r--libstdc++-v3/config/os/osf/osf5.0/cpu_limits.h35
-rw-r--r--libstdc++-v3/config/os/solaris/solaris2.7/os_defines.h4
-rwxr-xr-xlibstdc++-v3/configure3536
-rw-r--r--libstdc++-v3/configure.in73
-rw-r--r--libstdc++-v3/configure.target44
-rw-r--r--libstdc++-v3/docs/doxygen/run_doxygen3
-rw-r--r--libstdc++-v3/docs/html/17_intro/C++STYLE14
-rw-r--r--libstdc++-v3/docs/html/17_intro/contribute.html48
-rw-r--r--libstdc++-v3/docs/html/17_intro/howto.html81
-rw-r--r--libstdc++-v3/docs/html/17_intro/license.html38
-rw-r--r--libstdc++-v3/docs/html/17_intro/porting.html13
-rw-r--r--libstdc++-v3/docs/html/17_intro/porting.texi13
-rw-r--r--libstdc++-v3/docs/html/18_support/howto.html106
-rw-r--r--libstdc++-v3/docs/html/19_diagnostics/howto.html55
-rw-r--r--libstdc++-v3/docs/html/20_util/howto.html103
-rw-r--r--libstdc++-v3/docs/html/21_strings/howto.html179
-rw-r--r--libstdc++-v3/docs/html/22_locale/codecvt.html246
-rw-r--r--libstdc++-v3/docs/html/22_locale/ctype.html79
-rw-r--r--libstdc++-v3/docs/html/22_locale/howto.html54
-rw-r--r--libstdc++-v3/docs/html/22_locale/locale.html528
-rw-r--r--libstdc++-v3/docs/html/22_locale/messages.html371
-rw-r--r--libstdc++-v3/docs/html/23_containers/howto.html143
-rw-r--r--libstdc++-v3/docs/html/24_iterators/howto.html76
-rw-r--r--libstdc++-v3/docs/html/25_algorithms/howto.html51
-rw-r--r--libstdc++-v3/docs/html/26_numerics/howto.html77
-rw-r--r--libstdc++-v3/docs/html/27_io/howto.html154
-rw-r--r--libstdc++-v3/docs/html/Makefile23
-rw-r--r--libstdc++-v3/docs/html/abi.txt110
-rw-r--r--libstdc++-v3/docs/html/configopts.html202
-rw-r--r--libstdc++-v3/docs/html/documentation.html329
-rw-r--r--libstdc++-v3/docs/html/explanations.html29
-rw-r--r--libstdc++-v3/docs/html/ext/howto.html236
-rw-r--r--libstdc++-v3/docs/html/ext/sgiexts.html112
-rw-r--r--libstdc++-v3/docs/html/faq/index.html387
-rw-r--r--libstdc++-v3/docs/html/faq/index.txt4
-rw-r--r--libstdc++-v3/docs/html/install.html128
-rw-r--r--libstdc++-v3/docs/html/makedoc.awk69
-rw-r--r--libstdc++-v3/include/Makefile.am4
-rw-r--r--libstdc++-v3/include/Makefile.in5
-rw-r--r--libstdc++-v3/include/backward/alloc.h4
-rw-r--r--libstdc++-v3/include/bits/basic_string.h482
-rw-r--r--libstdc++-v3/include/bits/c++config12
-rw-r--r--libstdc++-v3/include/bits/char_traits.h13
-rw-r--r--libstdc++-v3/include/bits/codecvt.h70
-rw-r--r--libstdc++-v3/include/bits/generic_shadow.h59
-rw-r--r--libstdc++-v3/include/bits/locale_facets.h77
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc37
-rw-r--r--libstdc++-v3/include/bits/localefwd.h49
-rw-r--r--libstdc++-v3/include/bits/stl_alloc.h200
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h4
-rw-r--r--libstdc++-v3/include/bits/stl_deque.h10
-rw-r--r--libstdc++-v3/include/bits/stl_list.h28
-rw-r--r--libstdc++-v3/include/bits/stl_map.h16
-rw-r--r--libstdc++-v3/include/bits/stl_multimap.h6
-rw-r--r--libstdc++-v3/include/bits/stl_threads.h20
-rw-r--r--libstdc++-v3/include/bits/stl_tree.h4
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h12
-rw-r--r--libstdc++-v3/include/bits/streambuf.tcc29
-rw-r--r--libstdc++-v3/include/bits/stringfwd.h2
-rw-r--r--libstdc++-v3/include/c_shadow/assert.h55
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cassert.h61
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cctype.h145
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cerrno.h48
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cfloat.h54
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_climits.h57
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_clocale.h70
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cmath.h749
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_csetjmp.h63
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_csignal.h67
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cstdarg.h54
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cstddef.h59
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cstdio.h283
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cstdlib.h197
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cstring.h279
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_ctime.h107
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cwchar.h275
-rw-r--r--libstdc++-v3/include/c_shadow/bits/std_cwctype.h129
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_fcntl.h92
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_features.h51
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_iconv.h51
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_iolibio.h50
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_langinfo.h49
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_libio.h50
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_libioP.h50
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_pthread.h81
-rw-r--r--libstdc++-v3/include/c_shadow/bits/wrap_unistd.h47
-rw-r--r--libstdc++-v3/include/c_shadow/ctype.h67
-rw-r--r--libstdc++-v3/include/c_shadow/errno.h56
-rw-r--r--libstdc++-v3/include/c_shadow/fcntl.h63
-rw-r--r--libstdc++-v3/include/c_shadow/features.h58
-rw-r--r--libstdc++-v3/include/c_shadow/float.h54
-rw-r--r--libstdc++-v3/include/c_shadow/iconv.h66
-rw-r--r--libstdc++-v3/include/c_shadow/iolibio.h58
-rw-r--r--libstdc++-v3/include/c_shadow/langinfo.h55
-rw-r--r--libstdc++-v3/include/c_shadow/libio.h81
-rw-r--r--libstdc++-v3/include/c_shadow/libioP.h64
-rw-r--r--libstdc++-v3/include/c_shadow/limits.h54
-rw-r--r--libstdc++-v3/include/c_shadow/locale.h57
-rw-r--r--libstdc++-v3/include/c_shadow/math.h131
-rw-r--r--libstdc++-v3/include/c_shadow/pthread.h86
-rw-r--r--libstdc++-v3/include/c_shadow/setjmp.h56
-rw-r--r--libstdc++-v3/include/c_shadow/signal.h58
-rw-r--r--libstdc++-v3/include/c_shadow/stdarg.h55
-rw-r--r--libstdc++-v3/include/c_shadow/stddef.h60
-rw-r--r--libstdc++-v3/include/c_shadow/stdio.h97
-rw-r--r--libstdc++-v3/include/c_shadow/stdlib.h101
-rw-r--r--libstdc++-v3/include/c_shadow/string.h76
-rw-r--r--libstdc++-v3/include/c_shadow/sys/cdefs.h49
-rw-r--r--libstdc++-v3/include/c_shadow/time.h67
-rw-r--r--libstdc++-v3/include/c_shadow/unistd.h101
-rw-r--r--libstdc++-v3/include/c_shadow/wchar.h131
-rw-r--r--libstdc++-v3/include/c_shadow/wctype.h74
-rw-r--r--libstdc++-v3/include/ext/stl_rope.h8
-rw-r--r--libstdc++-v3/include/std/std_limits.h1295
-rw-r--r--libstdc++-v3/libio/Makefile.in1
-rw-r--r--libstdc++-v3/libmath/Makefile.am7
-rw-r--r--libstdc++-v3/libmath/Makefile.in11
-rw-r--r--libstdc++-v3/libsupc++/Makefile.in1
-rwxr-xr-xlibstdc++-v3/mkcshadow98
-rwxr-xr-xlibstdc++-v3/mkinclosure102
-rw-r--r--libstdc++-v3/po/Makefile.in1
-rw-r--r--libstdc++-v3/src/Makefile.am33
-rw-r--r--libstdc++-v3/src/Makefile.in50
-rw-r--r--libstdc++-v3/src/bitset.cc23
-rw-r--r--libstdc++-v3/src/codecvt.cc84
-rw-r--r--libstdc++-v3/src/concept-inst.cc23
-rw-r--r--libstdc++-v3/src/ctype.cc148
-rw-r--r--libstdc++-v3/src/globals.cc129
-rw-r--r--libstdc++-v3/src/ios.cc26
-rw-r--r--libstdc++-v3/src/locale-inst.cc4
-rw-r--r--libstdc++-v3/src/locale.cc325
-rw-r--r--libstdc++-v3/src/localename.cc161
-rw-r--r--libstdc++-v3/src/misc-inst.cc15
-rw-r--r--libstdc++-v3/src/stl-inst.cc4
-rw-r--r--libstdc++-v3/src/strstream.cc23
-rw-r--r--libstdc++-v3/src/vterminate.cc23
-rw-r--r--libstdc++-v3/testsuite/18_support/numeric_limits.cc148
-rw-r--r--libstdc++-v3/testsuite/21_strings/capacity.cc2
-rw-r--r--libstdc++-v3/testsuite/22_locale/ctor_copy_dtor.cc186
-rw-r--r--libstdc++-v3/testsuite/22_locale/facet.cc63
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_put_members_char.cc38
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_put_members_wchar_t.cc38
-rw-r--r--libstdc++-v3/testsuite/22_locale/static_members.cc144
-rw-r--r--libstdc++-v3/testsuite/27_io/ostream_inserter_other.cc96
-rw-r--r--libstdc++-v3/testsuite/Makefile.am8
-rw-r--r--libstdc++-v3/testsuite/Makefile.in8
-rw-r--r--libstdc++-v3/testsuite/abi_check.cc262
-rw-r--r--libstdc++-v3/testsuite/ext/allocators.cc1
-rw-r--r--libstdc++-v3/testsuite/thread/pthread1.cc2
-rw-r--r--maintainer-scripts/ChangeLog21
-rwxr-xr-xmaintainer-scripts/gcc_release16
-rw-r--r--maintainer-scripts/snapshot-README2
-rwxr-xr-xmaintainer-scripts/update_version32
-rwxr-xr-xmaintainer-scripts/update_web_docs14
-rwxr-xr-xmaintainer-scripts/update_web_docs_old24
-rw-r--r--zlib/ChangeLog.gcj4
-rw-r--r--zlib/Makefile.am2
-rw-r--r--zlib/Makefile.in2
1481 files changed, 89309 insertions, 68743 deletions
diff --git a/ChangeLog b/ChangeLog
index b039267acce..5f613d37dbc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,135 @@
+2002-10-07 Svein E. Seldal <Svein.Seldal@solidas.com>
+
+ * configure.in: Add tic4x target.
+
+2002-10-03 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * Makefile.tpl: Make SET_LIB_PATH substitution more autoconfy.
+ * configure.in: Make SET_LIB_PATH substitution more autoconfy.
+ * Makefile.in: Regenerate.
+
+ * Makefile.tpl: Make RPATH_ENVVAR substitution more autoconfy.
+ * configure.in: Make RPATH_ENVVAR substitution more autoconfy.
+ * Makefile.in: Regenerate.
+
+2002-10-02 Janis Johnson <janis187@us.ibm.com>
+
+ * MAINTAINERS: Add myself as web pages co-maintainer.
+
+2002-10-02 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * Makefile.tpl: Eliminate reference to all-gui, all-libproc.
+ * Makefile.in: Regenerate.
+
+2002-10-02 Zack Weinberg <zack@codesourcery.com>
+
+ * MAINTAINERS: Add myself and Nathan Sidwell
+ <nathan@codesourcery.com> as VxWorks maintainers.
+
+2002-10-02 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * Makefile.def: Remove order dependency comments.
+ * Makefile.tpl: Add explicit install-install dependencies.
+ * Makefile.in: Regenerate.
+
+ * Makefile.tpl: Remove material now in src-release. (Finally!)
+ * Makefile.in: Regenerate.
+
+ * Makefile.tpl: Add configure-target (for src-release in src)
+ * Makefile.in: Regenerate.
+
+2002-09-30 Nick Clifton <nickc@redhat.com>
+
+ * Makefile.in (BINUTILS_SUPPORT_DIRS): Add cpu directory.
+
+2002-09-30 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * configure.in (s390*-*-linux*): Enable libgcj.
+
+2002-09-29 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * configure: Revert accidentally applied changes.
+
+ * Makefile.tpl: Make more autoconf-friendly.
+ * Makefile.in: Regenerate.
+ * configure: Make substitution more autoconf-like.
+
+2002-09-28 Richard Earnshaw <rearnsha@arm.com>
+
+ * configure.in (arm-*-coff, strongarm-*-coff, xscale-*-coff): Use a
+ single entry to handle all these.
+ (arm-*-elf, strongarm-*-elf, xscale-*-elf): Likewise. Also enable
+ libjava on arm-*-elf.
+
+2002-09-27 Geoffrey Keating <geoffk@apple.com>
+
+ * configure.in (powerpc-*-darwin*): Don't configure BFD, TK, or the
+ things that depend on them.
+
+2002-09-25 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * Makefile.tpl: Make subsituted variables more autoconfy.
+ * Makefile.in: Regenerate.
+ * configure: Make seds more autoconfy.
+
+2002-09-25 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * Makefile.tpl: Rewrite substituted lines to look autoconfy.
+ * Makefile.in: Regenerate.
+ * configure.in: Rewrite sed statements to look autoconfy.
+
+ * Makefile.tpl: Autogenerate *-target-* lists, dependencies of
+ all-target-foo on configure-target-foo.
+ * Makefile.def: Ditto.
+ * Makefile.in: Rebuild.
+
+2002-09-25 Andrew Haley <aph@redhat.com>
+
+ * MAINTAINERS: Add aph@redhat.com as Java maintainer.
+
+2002-09-22 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * Makefile.def: New file.
+ * Makefile.tpl: New file.
+ * Makefile.in: Generate from Makefile.tpl with 'autogen Makefile.def'.
+ * contrib/gcc_update: Note that Makefile.in is a generated file.
+
+ * configure.in: Minor rearrangement. Simplify tests.
+
+2002-09-22 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * configure.in (with_headers): Skip copy if value is "yes".
+ (with_libs): Likewise.
+
+2002-09-20 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * configure.in (*-*-netbsd*): Use noconfigdirs, not skipdirs.
+ * configure.in (sh*-*-pe*): Ditto.
+ * configure.in (mips*-*-pe*): Ditto.
+ * configure.in (*arm-wince-pe): Ditto.
+
+ * configure.in: Rearrange.
+
+2002-09-14 Kazu Hirata <kazu@cs.umass.edu>
+
+ * MAINTAINERS: Update my email address.
+
+2002-08-30 Paul Koning <pkoning@equallogic.com>
+
+ * MAINTAINERS: (Write After Approval): Add myself.
+
+2002-08-29 Geoffrey Keating <geoffk@redhat.com>
+
+ * MAINTAINERS: Update Jason Eckhardt's address, remove i860.
+
+2002-08-24 Geoffrey Keating <geoffk@redhat.com>
+
+ * MAINTAINERS: Change my mailing address.
+
2002-08-21 Paolo Carlini <pcarlini@unitus.it>
* MAINTAINERS (Write After Approval): Remove myself.
- (Various Maintainers: c++ runtime libs): Add myself.
+ (Various Maintainers: c++ runtime libs): Add myself.
2002-08-20 Loren J. Rittle <ljrittle@acm.org>
diff --git a/MAINTAINERS b/MAINTAINERS
index 2a343482396..664f18b2215 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -23,7 +23,7 @@ Maintainers
John Carr jfc@mit.edu
Richard Earnshaw rearnsha@arm.com
Richard Henderson rth@redhat.com
-Geoffrey Keating geoffk@redhat.com
+Geoffrey Keating geoffk@geoffk.org
Richard Kenner kenner@nyu.edu
Jeff Law law@redhat.com
Jason Merrill jason@redhat.com
@@ -46,11 +46,10 @@ c4x port Michael Hayes m.hayes@elec.canterbury.ac.nz
cris port Hans-Peter Nilsson hp@axis.com
fr30 port Nick Clifton nickc@redhat.com
h8 port Jeff Law law@redhat.com
-h8 port Kazu Hirata kazu@hxi.com
+h8 port Kazu Hirata kazu@cs.umass.edu
hppa port Jeff Law law@redhat.com
hppa port Dave Anglin dave.anglin@nrc.ca
i386 port Richard Henderson rth@redhat.com
-i860 port Jason Eckhardt jle@redhat.com
i960 port Jim Wilson wilson@redhat.com
ia64 port Jim Wilson wilson@redhat.com
m32r port Nick Clifton nickc@redhat.com
@@ -64,7 +63,7 @@ mmix port Hans-Peter Nilsson hp@bitrange.com
mn10200 port Jeff Law law@redhat.com
mn10300 port Jeff Law law@redhat.com
mn10300 port Alexandre Oliva aoliva@redhat.com
-rs6000 port Geoff Keating geoffk@redhat.com
+rs6000 port Geoff Keating geoffk@geoffk.org
rs6000 port David Edelsohn dje@watson.ibm.com
rs6000 vector extns Aldy Hernandez aldyh@redhat.com
s390 port Hartmut Penner hpenner@de.ibm.com
@@ -78,7 +77,7 @@ v850 port Nick Clifton nickc@redhat.com
v850 port Michael Meissner meissner@redhat.com
vax port Dave Anglin dave.anglin@nrc.ca
x86-64 port Jan Hubicka jh@suse.cz
-xstormy16 port Geoffrey Keating geoffk@redhat.com
+xstormy16 port Geoffrey Keating geoffk@geoffk.org
xtensa port Bob Wilson bob.wilson@acm.org
OS Port Maintainers (OS alphabetical order)
@@ -103,6 +102,7 @@ cpplib Zack Weinberg zack@codesourcery.com
cpplib Neil Booth neil@daikokuya.co.uk
java Per Bothner per@bothner.com
java Alexandre Petit-Bianco apbianco@redhat.com
+java Andrew Haley aph@redhat.com
libgcj Tom Tromey tromey@redhat.com
libgcj Bryce McKinlay bryce@gcc.gnu.org
mercury Fergus Henderson fjh@cs.mu.oz.au
@@ -119,7 +119,7 @@ caller-save.c Jeff Law law@redhat.com
debugging code Jim Wilson wilson@redhat.com
dwarf debugging code Jason Merrill jason@redhat.com
c++ runtime libs Paolo Carlini pcarlini@unitus.it
-c++ runtime libs Gabriel Dos Reis dosreis@cmla.ens-cachan.fr
+c++ runtime libs Gabriel Dos Reis gdr@integrable-solutions.net
c++ runtime libs Ulrich Drepper drepper@redhat.com
c++ runtime libs Phil Edwards pme@gcc.gnu.org
c++ runtime libs Benjamin Kosnik bkoz@redhat.com
@@ -130,9 +130,10 @@ fixincludes Bruce Korb bkorb@gnu.org
gcse.c Jeff Law law@redhat.com
global opt framework Jeff Law law@redhat.com
jump.c David S. Miller davem@redhat.com
-web pages Gerald Pfeifer pfeifer@dbai.tuwien.ac.at
+web pages co-maintainer Gerald Pfeifer pfeifer@dbai.tuwien.ac.at
+web pages co-maintainer Janis Johnson janis187@us.ibm.com
config.sub/config.guess Ben Elliston config-patches@gnu.org
-basic block reordering Jason Eckhardt jle@redhat.com
+basic block reordering Jason Eckhardt jle@rice.edu
i18n Philipp Thomas pthomas@suse.de
diagnostic messages Gabriel Dos Reis gdr@codesourcery.com
windows, cygwin, mingw Christopher Faylor cgf@redhat.com
@@ -145,8 +146,10 @@ docs co-maintainer Gerald Pfeifer pfeifer@dbai.tuwien.ac.at
docs co-maintainer Joseph Myers jsm28@cam.ac.uk
Pico-Java port Steve Chamberlain sac@transmeta.com
RTEMS Ports Joel Sherrill
+VxWorks ports Zack Weinberg zack@codesourcery.com
+VxWorks ports Nathan Sidwell nathan@codesourcery.com
predict.def Jan Hubicka jh@suse.cz
-contrib/regression Geoff Keating geoffk@redhat.com
+contrib/regression Geoff Keating geoffk@geoffk.org
treelang Tim Josling tej@melbpc.org.au
new regalloc (ra*) Michael Matz matz@suse.de
@@ -155,6 +158,7 @@ in changes outside of the parts of the compiler they maintain.
Write After Approval (last name alphabetical order)
+Matt Austern austern@apple.com
Scott Bambrough scottb@netwinder.org
Daniel Berlin dan@dberlin.org
David Billinghurst David.Billinghurst@riotinto.com
@@ -167,6 +171,7 @@ Andrew Cagney cagney@redhat.com
Chandra Chavva cchavva@redhat.com
William Cohen wcohen@redhat.com
Chris Demetriou cgd@broadcom.com
+Gabriel Dos Reis gdr@integrable-solutions.net
*Paul Eggert eggert@twinsun.com
Steve Ellcey sje@cup.hp.com
Ben Elliston bje@redhat.com
@@ -184,13 +189,13 @@ Manfred Hollstein mhollstein@redhat.com
Andreas Jaeger aj@suse.de
Jakub Jelinek jakub@redhat.com
Dale Johannesen dalej@apple.com
-Janis Johnson janis187@us.ibm.com
Klaus Kaempf kkaempf@progis.de
Brendan Kehoe brendan@zen.org
Mumit Khan khan@xraylith.wisc.edu
Matthias Klose doko@debian.org
Jeff Knaggs jknaggs@redhat.com
Kaz Kojima kkojima@gcc.gnu.org
+Paul Koning ni1d@arrl.net
Matt Kraai kraai@alumni.cmu.edu
Ziemowit Laski zlaski@apple.com
Marc Lehmann pcg@goof.com
@@ -218,10 +223,10 @@ Rainer Orth ro@TechFak.Uni-Bielefeld.DE
Devang Patel dpatel@apple.com
Nicola Pero n.pero@mi.flashnet.it
Alexandre Petit-Bianco apbianco@redhat.com
+Sebastian Pop s.pop@laposte.net
Clinton Popetz cpopetz@cpopetz.com
Ken Raeburn raeburn@redhat.com
Rolf Rasmussen rolfwr@gcc.gnu.org
-Gabriel Dos Reis dosreis@cmla.ens-cachan.fr
Tom Rix trix@redhat.com
Craig Rodrigues rodrigc@gcc.gnu.org
Gavin Romig-Koch gavin@redhat.com
diff --git a/Makefile.def b/Makefile.def
new file mode 100644
index 00000000000..754b79ee08a
--- /dev/null
+++ b/Makefile.def
@@ -0,0 +1,79 @@
+#! /usr/bin/autogen
+AutoGen definitions Makefile.tpl;
+
+host_modules= { module= ash; };
+host_modules= { module= autoconf; };
+host_modules= { module= automake; };
+host_modules= { module= bash; };
+host_modules= { module= bfd; };
+host_modules= { module= opcodes; };
+host_modules= { module= binutils; };
+host_modules= { module= bison; no_check_cross= true; };
+host_modules= { module= byacc; no_check_cross= true; };
+host_modules= { module= bzip2; };
+host_modules= { module= db; };
+host_modules= { module= dejagnu; };
+host_modules= { module= diff; };
+host_modules= { module= dosutils; no_check= true; };
+host_modules= { module= etc; };
+host_modules= { module= fastjar; no_check_cross= true; };
+host_modules= { module= fileutils; };
+host_modules= { module= findutils; };
+host_modules= { module= find; };
+host_modules= { module= flex; no_check_cross= true; };
+host_modules= { module= gas; };
+host_modules= { module= gawk; };
+host_modules= { module= gettext; };
+host_modules= { module= gnuserv; };
+host_modules= { module= gprof; };
+host_modules= { module= grep; };
+host_modules= { module= gzip; };
+host_modules= { module= hello; };
+host_modules= { module= indent; };
+host_modules= { module= intl; };
+host_modules= { module= tcl; };
+host_modules= { module= itcl; };
+host_modules= { module= ld; };
+host_modules= { module= libgui; };
+host_modules= { module= libiberty; };
+host_modules= { module= libtool; };
+host_modules= { module= m4; };
+host_modules= { module= make; };
+host_modules= { module= mmalloc; no_check=true; };
+host_modules= { module= patch; };
+host_modules= { module= perl; };
+host_modules= { module= prms; };
+host_modules= { module= rcs; };
+host_modules= { module= readline; };
+host_modules= { module= release; no_install= true; no_check= true; };
+host_modules= { module= recode; };
+host_modules= { module= sed; };
+host_modules= { module= send-pr; };
+host_modules= { module= shellutils; };
+host_modules= { module= sid; };
+host_modules= { module= sim; };
+host_modules= { module= snavigator; };
+host_modules= { module= tar; };
+host_modules= { module= texinfo; no_install= true; };
+host_modules= { module= textutils; };
+host_modules= { module= time; };
+host_modules= { module= uudecode; };
+host_modules= { module= wdiff; };
+host_modules= { module= zip; no_check_cross=true; };
+host_modules= { module= zlib; no_install=true; no_check=true; };
+
+target_modules = { module= libstdc++-v3; };
+target_modules = { module= newlib; };
+target_modules = { module= libf2c; };
+target_modules = { module= libobjc; };
+target_modules = { module= libtermcap; no_check=true; no_clean=true; };
+target_modules = { module= winsup; };
+target_modules = { module= libgloss; no_check=true; };
+target_modules = { module= libiberty; };
+target_modules = { module= gperf; };
+target_modules = { module= examples; no_check=true; no_install=true; };
+target_modules = { module= libffi; no_install=true; };
+target_modules = { module= libjava; };
+target_modules = { module= zlib; };
+target_modules = { module= boehm-gc; };
+target_modules = { module= qthreads; };
diff --git a/Makefile.in b/Makefile.in
index c37a5052d5a..ce4bffa88a4 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,3 +1,5 @@
+
+# Makefile.in is generated from Makefile.tpl by 'autogen Makefile.def'.
#
# Makefile for directory with subdirs to build.
# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
@@ -24,29 +26,29 @@
NOTPARALLEL = .NOTPARALLEL
$(NOTPARALLEL):
-srcdir = .
+srcdir = @srcdir@
-prefix = /usr/local
-exec_prefix = $(prefix)
+prefix = @prefix@
+exec_prefix = @exec_prefix@
-bindir=${exec_prefix}/bin
-sbindir=${exec_prefix}/sbin
-libexecdir=${exec_prefix}/libexec
-datadir=${prefix}/share
-sysconfdir=${prefix}/etc
-sharedstatedir=${prefix}/com
-localstatedir=${prefix}/var
-libdir=${exec_prefix}/lib
-includedir=${prefix}/include
-oldincludedir=/usr/include
-infodir=${prefix}/info
-mandir=${prefix}/man
-gxx_include_dir=${includedir}/g++
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+includedir = @includedir@
+oldincludedir = @oldincludedir@
+infodir = @infodir@
+mandir = @mandir@
+gxx_include_dir=@gxx_include_dir@
-tooldir = $(exec_prefix)/$(target_alias)
-build_tooldir = $(exec_prefix)/$(target_alias)
+tooldir = @tooldir@
+build_tooldir = @build_tooldir@
-program_transform_name =
+program_transform_name = @program_transform_name@
man1dir = $(mandir)/man1
man2dir = $(mandir)/man2
@@ -57,13 +59,11 @@ man6dir = $(mandir)/man6
man7dir = $(mandir)/man7
man8dir = $(mandir)/man8
man9dir = $(mandir)/man9
-infodir = $(prefix)/info
-includedir = $(prefix)/include
# Directory in which the compiler finds executables, libraries, etc.
libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)
GDB_NLM_DEPS =
-SHELL = /bin/sh
+SHELL = @config_shell@
# pwd command to use. Allow user to override default by setting PWDCMD in
# the environment to account for automounters. The make variable must not
@@ -124,13 +124,10 @@ NM = nm
LD = ld
-BZIPPROG = bzip2
-MD5PROG = md5sum
-
# These values are substituted by configure.
-DEFAULT_YACC = yacc
-DEFAULT_LEX = lex
-DEFAULT_M4 = m4
+DEFAULT_YACC = @DEFAULT_YACC@
+DEFAULT_LEX = @DEFAULT_LEX@
+DEFAULT_M4 = @DEFAULT_M4@
BISON = `if [ -f $$r/bison/bison ] ; then \
echo $$r/bison/bison -L $$s/bison/ ; \
@@ -181,35 +178,34 @@ RUNTEST = `if [ -f $$s/dejagnu/runtest ] ; \
CC_FOR_BUILD = $(CC)
CXX_FOR_BUILD = $(CXX)
-SUBDIRS = "this is set via configure, don't edit this"
-OTHERS =
+SUBDIRS = @configdirs@
# This is set by the configure script to the list of directories which
# should be built using the target tools.
-TARGET_CONFIGDIRS = libiberty libgloss $(SPECIAL_LIBS) newlib winsup opcodes libf2c libobjc
+TARGET_CONFIGDIRS = @target_configdirs@
# Target libraries are put under this directory:
# Changed by configure to $(target_alias) if cross.
-TARGET_SUBDIR = .
+TARGET_SUBDIR = @target_subdir@
BUILD_CONFIGDIRS = libiberty
-BUILD_SUBDIR = .
+BUILD_SUBDIR = @build_subdir@
# This is set by the configure script to the arguments to use when configuring
# directories built for the target.
-TARGET_CONFIGARGS =
+TARGET_CONFIGARGS = @target_configargs@
# This is set by the configure script to the arguments to use when configuring
# directories built for the build system.
-BUILD_CONFIGARGS =
+BUILD_CONFIGARGS = @build_configargs@
# This is set by configure to REALLY_SET_LIB_PATH if --enable-shared
# was used.
-SET_LIB_PATH =
+SET_LIB_PATH = @SET_LIB_PATH@
# This is the name of the environment variable used for the path to
# the libraries. This may be changed by configure.in.
-RPATH_ENVVAR = LD_LIBRARY_PATH
+RPATH_ENVVAR = @RPATH_ENVVAR@
# This is the list of directories that may be needed in RPATH_ENVVAR
# so that programs built for the host machine work.
@@ -241,11 +237,11 @@ INSTALL_TARGET_CROSS = installdirs \
$(INSTALL_DOSREL)
# Should be substed by configure.in
-FLAGS_FOR_TARGET =
-CC_FOR_TARGET =
-CXX_FOR_TARGET =
-CXX_FOR_TARGET_FOR_RECURSIVE_MAKE =
-GCJ_FOR_TARGET =
+FLAGS_FOR_TARGET = @FLAGS_FOR_TARGET@
+CC_FOR_TARGET = @CC_FOR_TARGET@
+CXX_FOR_TARGET = @CXX_FOR_TARGET@
+CXX_FOR_TARGET_FOR_RECURSIVE_MAKE = @CXX_FOR_TARGET_FOR_RECURSIVE_MAKE@
+GCJ_FOR_TARGET = @GCJ_FOR_TARGET@
# If GCC_FOR_TARGET is not overriden on the command line, then this
# variable is passed down to the gcc Makefile, where it is used to
@@ -514,7 +510,7 @@ GCC_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_GCC_FLAGS)
# macro for build!=host builds.
ALL_BUILD_MODULES_LIST = \
all-build-libiberty
-ALL_BUILD_MODULES =
+ALL_BUILD_MODULES = @all_build_modules@
# This is a list of the configure targets for all of the modules which
# are compiled using the native tools.
@@ -529,6 +525,7 @@ ALL_MODULES = \
all-automake \
all-bash \
all-bfd \
+ all-opcodes \
all-binutils \
all-bison \
all-byacc \
@@ -553,6 +550,7 @@ ALL_MODULES = \
all-hello \
all-indent \
all-intl \
+ all-tcl \
all-itcl \
all-ld \
all-libgui \
@@ -561,7 +559,6 @@ ALL_MODULES = \
all-m4 \
all-make \
all-mmalloc \
- all-opcodes \
all-patch \
all-perl \
all-prms \
@@ -576,7 +573,6 @@ ALL_MODULES = \
all-sim \
all-snavigator \
all-tar \
- all-tcl \
all-texinfo \
all-textutils \
all-time \
@@ -605,6 +601,7 @@ CROSS_CHECK_MODULES = \
check-automake \
check-bash \
check-bfd \
+ check-opcodes \
check-binutils \
check-bzip2 \
check-db \
@@ -624,6 +621,7 @@ CROSS_CHECK_MODULES = \
check-hello \
check-indent \
check-intl \
+ check-tcl \
check-itcl \
check-ld \
check-libgui \
@@ -631,8 +629,6 @@ CROSS_CHECK_MODULES = \
check-libtool \
check-m4 \
check-make \
- check-mmcheckoc \
- check-opcodes \
check-patch \
check-perl \
check-prms \
@@ -642,11 +638,10 @@ CROSS_CHECK_MODULES = \
check-sed \
check-send-pr \
check-shellutils \
- check-snavigator \
check-sid \
check-sim \
+ check-snavigator \
check-tar \
- check-tcl \
check-texinfo \
check-textutils \
check-time \
@@ -658,22 +653,17 @@ CHECK_MODULES=$(NATIVE_CHECK_MODULES) $(CROSS_CHECK_MODULES)
# This is a list of the install targets for all of the modules which are
# compiled using $(FLAGS_TO_PASS).
-# We put install-opcodes before install-binutils because the installed
-# binutils might be on PATH, and they might need the shared opcodes
-# library.
-# We put install-tcl before install-itcl because itcl wants to run a
-# program on installation which uses the Tcl libraries.
INSTALL_MODULES = \
install-ash \
install-autoconf \
install-automake \
install-bash \
install-bfd \
- install-bzip2 \
install-opcodes \
install-binutils \
install-bison \
install-byacc \
+ install-bzip2 \
install-db \
install-dejagnu \
install-diff \
@@ -770,7 +760,7 @@ ALL_TARGET_MODULES = \
all-target-libjava \
all-target-zlib \
all-target-boehm-gc \
- all-target-qthreads
+ all-target-qthreads
# This is a list of the configure targets for all of the modules which
# are compiled using the target tools.
@@ -789,7 +779,7 @@ CONFIGURE_TARGET_MODULES = \
configure-target-libjava \
configure-target-zlib \
configure-target-boehm-gc \
- configure-target-qthreads
+ configure-target-qthreads
# This is a list of the check targets for all of the modules which are
# compiled using $(TARGET_FLAGS_TO_PASS).
@@ -800,12 +790,12 @@ CHECK_TARGET_MODULES = \
check-target-libobjc \
check-target-winsup \
check-target-libiberty \
+ check-target-gperf \
check-target-libffi \
check-target-libjava \
check-target-zlib \
check-target-boehm-gc \
- check-target-qthreads \
- check-target-gperf
+ check-target-qthreads
# This is a list of the install targets for all of the modules which are
# compiled using $(TARGET_FLAGS_TO_PASS).
@@ -818,11 +808,11 @@ INSTALL_TARGET_MODULES = \
install-target-winsup \
install-target-libgloss \
install-target-libiberty \
+ install-target-gperf \
install-target-libjava \
install-target-zlib \
install-target-boehm-gc \
- install-target-qthreads \
- install-target-gperf
+ install-target-qthreads
# This is a list of the targets for which we can do a clean-{target}.
CLEAN_MODULES = \
@@ -831,6 +821,7 @@ CLEAN_MODULES = \
clean-automake \
clean-bash \
clean-bfd \
+ clean-opcodes \
clean-binutils \
clean-bison \
clean-byacc \
@@ -855,6 +846,7 @@ CLEAN_MODULES = \
clean-hello \
clean-indent \
clean-intl \
+ clean-tcl \
clean-itcl \
clean-ld \
clean-libgui \
@@ -863,7 +855,6 @@ CLEAN_MODULES = \
clean-m4 \
clean-make \
clean-mmalloc \
- clean-opcodes \
clean-patch \
clean-perl \
clean-prms \
@@ -878,14 +869,13 @@ CLEAN_MODULES = \
clean-sim \
clean-snavigator \
clean-tar \
- clean-tcl \
clean-texinfo \
clean-textutils \
clean-time \
clean-uudecode \
clean-wdiff \
clean-zip \
- clean-zlib
+ clean-zlib
# All of the target modules that can be cleaned
CLEAN_TARGET_MODULES = \
@@ -902,7 +892,7 @@ CLEAN_TARGET_MODULES = \
clean-target-libjava \
clean-target-zlib \
clean-target-boehm-gc \
- clean-target-qthreads
+ clean-target-qthreads
# All of the x11 modules that can be cleaned
CLEAN_X11_MODULES = \
@@ -1263,12 +1253,8 @@ $(CONFIGURE_BUILD_MODULES):
# This rule is used to build the modules which use FLAGS_TO_PASS. To
# build a target all-X means to cd to X and make all.
-#
-# all-gui, and all-libproc are handled specially because
-# they are still experimental, and if they fail to build, that
-# shouldn't stop "make all".
-.PHONY: $(ALL_MODULES) all-gui all-libproc
-$(ALL_MODULES) all-gui all-libproc:
+.PHONY: $(ALL_MODULES)
+$(ALL_MODULES):
@dir=`echo $@ | sed -e 's/all-//'`; \
if [ -f ./$${dir}/Makefile ] ; then \
r=`${PWD}`; export r; \
@@ -1658,7 +1644,6 @@ all-bfd: all-libiberty all-intl
all-binutils: all-libiberty all-opcodes all-bfd all-flex all-bison all-byacc all-intl
all-bison: all-texinfo
configure-target-boehm-gc: $(ALL_GCC_C) configure-target-qthreads
-all-target-boehm-gc: configure-target-boehm-gc
all-byacc:
all-bzip2:
all-db:
@@ -1666,7 +1651,6 @@ all-dejagnu: all-tcl all-expect all-tk
all-diff: all-libiberty
all-etc:
configure-target-examples: $(ALL_GCC_C)
-all-target-examples: configure-target-examples
all-expect: all-tcl all-tk
all-fileutils: all-libiberty
all-findutils:
@@ -1676,15 +1660,14 @@ all-gas: all-libiberty all-opcodes all-bfd all-intl
all-gawk:
all-gcc: all-bison all-byacc all-binutils all-gas all-ld all-zlib
all-bootstrap: all-libiberty all-texinfo all-bison all-byacc all-binutils all-gas all-ld all-zlib
-GDB_TK = all-tk all-tcl all-itcl all-tix all-libgui
+GDB_TK = @GDB_TK@
all-gdb: all-libiberty all-opcodes all-bfd all-mmalloc all-readline all-bison all-byacc all-sim $(gdbnlmrequirements) $(GDB_TK)
all-gettext:
all-gnuserv:
configure-target-gperf: $(ALL_GCC_CXX)
-all-target-gperf: configure-target-gperf all-target-libiberty all-target-libstdc++-v3
+all-target-gperf: all-target-libiberty all-target-libstdc++-v3
all-gprof: all-libiberty all-bfd all-opcodes all-intl
all-grep: all-libiberty
-all-gui: all-gdb all-libproc
all-guile:
all-gzip: all-libiberty
all-hello: all-libiberty
@@ -1693,36 +1676,32 @@ all-intl:
all-itcl: all-tcl all-tk
all-ld: all-libiberty all-bfd all-opcodes all-bison all-byacc all-flex all-intl
configure-target-libgloss: $(ALL_GCC)
-all-target-libgloss: configure-target-libgloss configure-target-newlib
+all-target-libgloss: configure-target-newlib
all-libgui: all-tcl all-tk all-itcl
all-libiberty:
all-build-libiberty: configure-build-libiberty
configure-target-libffi: $(ALL_GCC_C)
-all-target-libffi: configure-target-libffi
configure-target-libjava: $(ALL_GCC_C) configure-target-zlib configure-target-boehm-gc configure-target-qthreads configure-target-libffi
-all-target-libjava: configure-target-libjava all-fastjar all-target-zlib all-target-boehm-gc all-target-qthreads all-target-libffi
+all-target-libjava: all-fastjar all-target-zlib all-target-boehm-gc all-target-qthreads all-target-libffi
configure-target-libstdc++-v3: $(ALL_GCC_C)
-all-target-libstdc++-v3: configure-target-libstdc++-v3 all-target-libiberty
+all-target-libstdc++-v3: all-target-libiberty
all-libtool:
configure-target-libf2c: $(ALL_GCC_C)
-all-target-libf2c: configure-target-libf2c all-target-libiberty
+all-target-libf2c: all-target-libiberty
configure-target-libobjc: $(ALL_GCC_C)
-all-target-libobjc: configure-target-libobjc all-target-libiberty
+all-target-libobjc: all-target-libiberty
all-m4: all-libiberty all-texinfo
all-make: all-libiberty
all-mmalloc:
configure-target-newlib: $(ALL_GCC)
-all-target-newlib: configure-target-newlib
configure-target-libtermcap: $(ALL_GCC_C)
-all-target-libtermcap: configure-target-libtermcap
all-opcodes: all-bfd all-libiberty
all-patch: all-libiberty
all-perl:
all-prms: all-libiberty
configure-target-qthreads: $(ALL_GCC_C)
-all-target-qthreads: configure-target-qthreads
all-rcs:
all-readline:
all-recode: all-libiberty
@@ -1742,21 +1721,49 @@ all-time:
all-tix: all-tcl all-tk
all-wdiff:
configure-target-winsup: $(ALL_GCC_C)
-all-target-winsup: all-target-libiberty all-target-libtermcap configure-target-winsup
+all-target-winsup: all-target-libiberty all-target-libtermcap
all-uudecode: all-libiberty
all-zip:
all-zlib:
configure-target-zlib: $(ALL_GCC_C)
-all-target-zlib: configure-target-zlib
all-fastjar: all-zlib all-libiberty
configure-target-fastjar: configure-target-zlib
all-target-fastjar: configure-target-fastjar all-target-zlib all-target-libiberty
configure-target-libiberty: $(ALL_GCC_C)
-all-target-libiberty: configure-target-libiberty
+configure-target: $(CONFIGURE_TARGET_MODULES)
all-target: $(ALL_TARGET_MODULES)
install-target: $(INSTALL_TARGET_MODULES)
install-gdb: install-tcl install-tk install-itcl install-tix install-libgui
install-sid: install-tcl install-tk
+
+# We put install-opcodes before install-binutils because the installed
+# binutils might be on PATH, and they might need the shared opcodes
+# library.
+install-binutils: install-opcodes
+
+# We put install-tcl before install-itcl because itcl wants to run a
+# program on installation which uses the Tcl libraries.
+install-itcl: install-tcl
+
+
+# Dependencies of all-target-foo on configure-target-foo.
+all-target-libstdc++-v3: configure-target-libstdc++-v3
+all-target-newlib: configure-target-newlib
+all-target-libf2c: configure-target-libf2c
+all-target-libobjc: configure-target-libobjc
+all-target-libtermcap: configure-target-libtermcap
+all-target-winsup: configure-target-winsup
+all-target-libgloss: configure-target-libgloss
+all-target-libiberty: configure-target-libiberty
+all-target-gperf: configure-target-gperf
+all-target-examples: configure-target-examples
+all-target-libffi: configure-target-libffi
+all-target-libjava: configure-target-libjava
+all-target-zlib: configure-target-zlib
+all-target-boehm-gc: configure-target-boehm-gc
+all-target-qthreads: configure-target-qthreads
+
+
### other supporting targets
MAKEDIRS= \
@@ -1787,296 +1794,16 @@ etags tags: TAGS
# built are.
TAGS: do-TAGS
+# Rebuilding Makefile.in, using autogen.
+$(srcdir)/Makefile.in: # $(srcdir)/Makefile.tpl $(srcdir)/Makefile.def
+ cd $(srcdir) && autogen Makefile.def
+
# with the gnu make, this is done automatically.
Makefile: Makefile.in configure.in $(host_makefile_frag) $(target_makefile_frag) $(gcc_version_trigger)
$(SHELL) ./config.status
#
-# Support for building net releases
-
-# Files in devo used in any net release.
-# ChangeLog omitted because it may refer to files which are not in this
-# distribution (perhaps it would be better to include it anyway).
-DEVO_SUPPORT= README Makefile.in configure configure.in \
- config.guess config.if config.sub config move-if-change \
- mpw-README mpw-build.in mpw-config.in mpw-configure mpw-install \
- COPYING COPYING.LIB install-sh config-ml.in symlink-tree \
- mkinstalldirs ltconfig ltmain.sh missing ylwrap \
- libtool.m4 gettext.m4 ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh
-
-# Files in devo/etc used in any net release.
-# ChangeLog omitted because it may refer to files which are not in this
-# distribution (perhaps it would be better to include it anyway).
-ETC_SUPPORT= Makefile.in configure configure.in standards.texi \
- make-stds.texi standards.info* configure.texi configure.info* \
- configbuild.* configdev.*
-
-
-# When you use `make setup-dirs' or `make taz' you should always redefine
-# this macro.
-SUPPORT_FILES = list-of-support-files-for-tool-in-question
-
-# NOTE: No double quotes in the below. It is used within shell script
-# as VER="$(VER)"
-VER = ` if grep 'AM_INIT_AUTOMAKE.*BFD_VERSION' $(TOOL)/configure.in >/dev/null 2>&1; then \
- sed < bfd/configure.in -n 's/AM_INIT_AUTOMAKE[^,]*, *\([^)]*\))/\1/p'; \
- elif grep AM_INIT_AUTOMAKE $(TOOL)/configure.in >/dev/null 2>&1; then \
- sed < $(TOOL)/configure.in -n 's/AM_INIT_AUTOMAKE[^,]*, *\([^)]*\))/\1/p'; \
- elif test -f $(TOOL)/version.in; then \
- head -1 $(TOOL)/version.in; \
- elif grep VERSION $(TOOL)/Makefile.in > /dev/null 2>&1; then \
- sed < $(TOOL)/Makefile.in -n 's/^VERSION *= *//p'; \
- else \
- echo VERSION; \
- fi`
-PACKAGE = $(TOOL)
-
-.PHONY: taz
-taz: $(DEVO_SUPPORT) $(SUPPORT_FILES) texinfo/texinfo.tex
- $(MAKE) -f Makefile.in do-proto-toplev \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-md5sum \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-tar \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-bz2 \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
-
-.PHONY: gdb-tar
-gdb-tar: $(DEVO_SUPPORT) $(SUPPORT_FILES) texinfo/texinfo.tex
- $(MAKE) -f Makefile.in do-proto-toplev \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-md5sum \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-djunpack \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-tar \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
-
-.PHONY: gdb-taz
-gdb-taz: gdb-tar $(DEVO_SUPPORT) $(SUPPORT_FILES) texinfo/texinfo.tex
- $(MAKE) -f Makefile.in gdb-tar \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
- $(MAKE) -f Makefile.in do-bz2 \
- TOOL=$(TOOL) PACKAGE="$(PACKAGE)" VER="$(VER)" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(SUPPORT_FILES)"
-
-.PHONY: do-proto-toplev
-do-proto-toplev: $(DEVO_SUPPORT) $(SUPPORT_FILES) texinfo/texinfo.tex
- echo "==> Making $(PACKAGE)-$(VER)/"
- # Take out texinfo from a few places.
- sed -e '/^all\.normal: /s/\all-texinfo //' \
- -e '/^ install-texinfo /d' \
- <Makefile.in >tmp
- mv -f tmp Makefile.in
- #
- ./configure sun4
- [ -z "$(CONFIGURE_TARGET_MODULES)" ] \
- || $(MAKE) $(CONFIGURE_TARGET_MODULES) \
- ALL_GCC="" ALL_GCC_C="" ALL_GCC_CXX="" \
- CC_FOR_TARGET="$(CC)" CXX_FOR_TARGET="$(CXX)"
- # Make links, and run "make diststuff" or "make info" when needed.
- rm -rf proto-toplev ; mkdir proto-toplev
- set -e ; dirs="$(TOOL) $(DEVO_SUPPORT) $(SUPPORT_FILES)" ; \
- for d in $$dirs ; do \
- if [ -d $$d ]; then \
- if [ ! -f $$d/Makefile ] ; then true ; \
- elif grep '^diststuff:' $$d/Makefile >/dev/null ; then \
- (cd $$d ; $(MAKE) diststuff ) || exit 1 ; \
- elif grep '^info:' $$d/Makefile >/dev/null ; then \
- (cd $$d ; $(MAKE) info ) || exit 1 ; \
- fi ; \
- if [ -d $$d/proto-$$d.dir ]; then \
- ln -s ../$$d/proto-$$d.dir proto-toplev/$$d ; \
- else \
- ln -s ../$$d proto-toplev/$$d ; \
- fi ; \
- else ln -s ../$$d proto-toplev/$$d ; fi ; \
- done
- cd etc && $(MAKE) info
- $(MAKE) distclean
- #
- mkdir proto-toplev/etc
- (cd proto-toplev/etc; \
- for i in $(ETC_SUPPORT); do \
- ln -s ../../etc/$$i . ; \
- done)
- #
- # Take out texinfo from configurable dirs
- rm proto-toplev/configure.in
- sed -e '/^host_tools=/s/texinfo //' \
- <configure.in >proto-toplev/configure.in
- #
- mkdir proto-toplev/texinfo
- ln -s ../../texinfo/texinfo.tex proto-toplev/texinfo/
- if test -r texinfo/util/tex3patch ; then \
- mkdir proto-toplev/texinfo/util && \
- ln -s ../../../texinfo/util/tex3patch proto-toplev/texinfo/util ; \
- else true; fi
- chmod -R og=u . || chmod og=u `find . -print`
- #
- # Create .gmo files from .po files.
- for f in `find . -name '*.po' -type f -print`; do \
- msgfmt -o `echo $$f | sed -e 's/\.po$$/.gmo/'` $$f ; \
- done
- #
- -rm -f $(PACKAGE)-$(VER)
- ln -s proto-toplev $(PACKAGE)-$(VER)
-
-.PHONY: do-tar
-do-tar:
- echo "==> Making $(PACKAGE)-$(VER).tar"
- -rm -f $(PACKAGE)-$(VER).tar
- find $(PACKAGE)-$(VER) -follow -name CVS -prune -o -type f -print \
- | tar cTfh - $(PACKAGE)-$(VER).tar
-
-.PHONY: do-bz2
-do-bz2:
- echo "==> Bzipping $(PACKAGE)-$(VER).tar.bz2"
- -rm -f $(PACKAGE)-$(VER).tar.bz2
- $(BZIPPROG) -v -9 $(PACKAGE)-$(VER).tar
-
-.PHONY: do-md5sum
-do-md5sum:
- echo "==> Adding md5 checksum to top-level directory"
- cd proto-toplev && find * -follow -name CVS -prune -o -type f -print \
- | xargs $(MD5PROG) > ../md5.sum
- mv md5.sum proto-toplev
-
-.PHONY: do-djunpack
-do-djunpack:
- echo "==> Adding updated djunpack.bat to top-level directory"
- echo - 's /gdb-[0-9\.]*/gdb-'"$(VER)"'/'
- sed < djunpack.bat > djunpack.new \
- -e 's/gdb-[0-9][0-9\.]*/gdb-'"$(VER)"'/'
- mv djunpack.new djunpack.bat
- -rm -f proto-toplev/djunpack.bat
- ln -s ../djunpack.bat proto-toplev/djunpack.bat
-
-TEXINFO_SUPPORT= texinfo/texinfo.tex
-DIST_SUPPORT= $(DEVO_SUPPORT) $(TEXINFO_SUPPORT)
-
-.PHONY: gas.tar.bz2
-GAS_SUPPORT_DIRS= bfd include libiberty opcodes intl setup.com makefile.vms mkdep
-gas.tar.bz2: $(DIST_SUPPORT) $(GAS_SUPPORT_DIRS) gas
- $(MAKE) -f Makefile.in taz TOOL=gas \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GAS_SUPPORT_DIRS)"
-
-# The FSF "binutils" release includes gprof and ld.
-.PHONY: binutils.tar.bz2
-BINUTILS_SUPPORT_DIRS= bfd gas include libiberty opcodes ld gprof intl setup.com makefile.vms mkdep
-binutils.tar.bz2: $(DIST_SUPPORT) $(BINUTILS_SUPPORT_DIRS) binutils
- $(MAKE) -f Makefile.in taz TOOL=binutils \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(BINUTILS_SUPPORT_DIRS)"
-
-.PHONY: gas+binutils.tar.bz2
-GASB_SUPPORT_DIRS= $(GAS_SUPPORT_DIRS) binutils ld gprof
-gas+binutils.tar.bz2: $(DIST_SUPPORT) $(GASB_SUPPORT_DIRS) gas
- $(MAKE) -f Makefile.in taz TOOL=gas \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GASB_SUPPORT_DIRS)"
-
-GNATS_SUPPORT_DIRS=include libiberty send-pr
-gnats.tar.bz2: $(DIST_SUPPORT) $(GNATS_SUPPORT_DIRS) gnats
- $(MAKE) -f Makefile.in taz TOOL=gnats \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GNATS_SUPPORT_DIRS)"
-
-.PHONY: gdb.tar.bz2
-GDB_SUPPORT_DIRS= bfd include libiberty mmalloc opcodes readline sim utils intl
-gdb.tar.bz2: $(DIST_SUPPORT) $(GDB_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-taz TOOL=gdb \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GDB_SUPPORT_DIRS)"
-.PHONY: gdb.tar
-gdb.tar: $(DIST_SUPPORT) $(GDB_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-tar TOOL=gdb \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GDB_SUPPORT_DIRS)"
-
-DEJAGNU_SUPPORT_DIRS= tcl expect libiberty
-.PHONY: dejagnu.tar.bz2
-dejagnu.tar.bz2: $(DIST_SUPPORT) $(DEJAGNU_SUPPORT_DIRS) dejagnu
- $(MAKE) -f Makefile.in taz TOOL=dejagnu \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(DEJAGNU_SUPPORT_DIRS)"
-
-.PHONY: gdb+dejagnu.tar.bz2
-GDBD_SUPPORT_DIRS= $(GDB_SUPPORT_DIRS) tcl expect dejagnu
-gdb+dejagnu.tar.bz2: $(DIST_SUPPORT) $(GDBD_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-taz TOOL=gdb PACKAGE=gdb+dejagnu \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GDBD_SUPPORT_DIRS)"
-.PHONY: gdb+dejagnu.tar
-gdb+dejagnu.tar: $(DIST_SUPPORT) $(GDBD_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-tar TOOL=gdb PACKAGE=gdb+dejagnu \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(GDBD_SUPPORT_DIRS)"
-
-.PHONY: insight.tar.bz2
-INSIGHT_SUPPORT_DIRS= $(GDB_SUPPORT_DIRS) tcl tk itcl tix libgui
-insight.tar.bz2: $(DIST_SUPPORT) $(GDB_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-taz TOOL=gdb PACKAGE=insight \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(INSIGHT_SUPPORT_DIRS)"
-.PHONY: insight.tar
-insight.tar: $(DIST_SUPPORT) $(GDB_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-tar TOOL=gdb PACKAGE=insight \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(INSIGHT_SUPPORT_DIRS)"
-
-.PHONY: insight+dejagnu.tar.bz2
-INSIGHTD_SUPPORT_DIRS= $(INSIGHT_SUPPORT_DIRS) expect dejagnu
-insight+dejagnu.tar.bz2: $(DIST_SUPPORT) $(INSIGHTD_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-taz TOOL=gdb PACKAGE="insight+dejagnu" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(INSIGHTD_SUPPORT_DIRS)"
-.PHONY: insight+dejagnu.tar
-insight+dejagnu.tar: $(DIST_SUPPORT) $(INSIGHTD_SUPPORT_DIRS) gdb
- $(MAKE) -f Makefile.in gdb-tar TOOL=gdb PACKAGE="insight+dejagnu" \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(INSIGHTD_SUPPORT_DIRS)"
-
-.PHONY: newlib.tar.bz2
-NEWLIB_SUPPORT_DIRS=libgloss
-# taz configures for the sun4 target which won't configure newlib.
-# We need newlib configured so that the .info files are made.
-# Unfortunately, it is not enough to just configure newlib separately:
-# taz will build the .info files but since SUBDIRS won't contain newlib,
-# distclean won't be run (leaving Makefile, config.status, and the tmp files
-# used in building the .info files, eg: *.def, *.ref).
-# The problem isn't solvable however without a lot of extra work because
-# target libraries are built in subdir $(target_alias) which gets nuked during
-# the make distclean. For now punt on the issue of shipping newlib info files
-# with newlib net releases and wait for a day when some native target (sun4?)
-# supports newlib (if only minimally).
-newlib.tar.bz2: $(DIST_SUPPORT) $(NEWLIB_SUPPORT_DIRS) newlib
- $(MAKE) -f Makefile.in taz TOOL=newlib \
- MD5PROG="$(MD5PROG)" \
- SUPPORT_FILES="$(NEWLIB_SUPPORT_DIRS)" \
- DEVO_SUPPORT="$(DEVO_SUPPORT) COPYING.NEWLIB" newlib
.NOEXPORT:
MAKEOVERRIDES=
diff --git a/Makefile.tpl b/Makefile.tpl
new file mode 100644
index 00000000000..5ef7d55fa3f
--- /dev/null
+++ b/Makefile.tpl
@@ -0,0 +1,1512 @@
+[+ AutoGen5 template
+in
++]
+
+# Makefile.in is generated from Makefile.tpl by 'autogen Makefile.def'.
+#
+# Makefile for directory with subdirs to build.
+# Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+# 1999, 2000, 2001, 2002 Free Software Foundation
+#
+# 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 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.
+#
+
+# Tell GNU make 3.79 not to run the top level in parallel. This
+# prevents contention for $builddir/$target/config.cache, as well
+# as minimizing scatter in file system caches.
+NOTPARALLEL = .NOTPARALLEL
+$(NOTPARALLEL):
+
+srcdir = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+includedir = @includedir@
+oldincludedir = @oldincludedir@
+infodir = @infodir@
+mandir = @mandir@
+gxx_include_dir=@gxx_include_dir@
+
+tooldir = @tooldir@
+build_tooldir = @build_tooldir@
+
+program_transform_name = @program_transform_name@
+
+man1dir = $(mandir)/man1
+man2dir = $(mandir)/man2
+man3dir = $(mandir)/man3
+man4dir = $(mandir)/man4
+man5dir = $(mandir)/man5
+man6dir = $(mandir)/man6
+man7dir = $(mandir)/man7
+man8dir = $(mandir)/man8
+man9dir = $(mandir)/man9
+# Directory in which the compiler finds executables, libraries, etc.
+libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)
+GDB_NLM_DEPS =
+
+SHELL = @config_shell@
+
+# pwd command to use. Allow user to override default by setting PWDCMD in
+# the environment to account for automounters. The make variable must not
+# be called PWDCMD, otherwise the value set here is passed to make
+# subprocesses and overrides the setting from the user's environment.
+PWD = $${PWDCMD-pwd}
+
+# INSTALL_PROGRAM_ARGS is changed by configure.in to use -x for a
+# cygwin host.
+INSTALL_PROGRAM_ARGS =
+
+INSTALL = $(SHELL) $$s/install-sh -c
+INSTALL_PROGRAM = $(INSTALL) $(INSTALL_PROGRAM_ARGS)
+INSTALL_SCRIPT = $(INSTALL)
+INSTALL_DATA = $(INSTALL) -m 644
+
+INSTALL_DOSREL = install-dosrel-fake
+
+AS = as
+AR = ar
+AR_FLAGS = rc
+CC = cc
+
+# Special variables passed down in EXTRA_GCC_FLAGS. They are defined
+# here so that they can be overridden by Makefile fragments.
+HOST_CC = $(CC_FOR_BUILD)
+BUILD_PREFIX =
+BUILD_PREFIX_1 = loser-
+
+# These flag values are normally overridden by the configure script.
+CFLAGS = -g
+CXXFLAGS = -g -O2
+
+LDFLAGS =
+LIBCFLAGS = $(CFLAGS)
+CFLAGS_FOR_BUILD = $(CFLAGS)
+# During gcc bootstrap, if we use some random cc for stage1 then
+# CFLAGS will be just -g. We want to ensure that TARGET libraries
+# (which we know are built with gcc) are built with optimizations so
+# prepend -O2 when setting CFLAGS_FOR_TARGET.
+CFLAGS_FOR_TARGET = -O2 $(CFLAGS)
+LDFLAGS_FOR_TARGET =
+LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET)
+PICFLAG =
+PICFLAG_FOR_TARGET =
+
+CXX = c++
+
+# Use -O2 to stress test the compiler.
+LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
+CXXFLAGS_FOR_TARGET = $(CXXFLAGS)
+LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates
+
+DLLTOOL = dlltool
+WINDRES = windres
+
+NM = nm
+
+LD = ld
+
+# These values are substituted by configure.
+DEFAULT_YACC = @DEFAULT_YACC@
+DEFAULT_LEX = @DEFAULT_LEX@
+DEFAULT_M4 = @DEFAULT_M4@
+
+BISON = `if [ -f $$r/bison/bison ] ; then \
+ echo $$r/bison/bison -L $$s/bison/ ; \
+ else \
+ echo bison ; \
+ fi`
+
+YACC = `if [ -f $$r/bison/bison ] ; then \
+ echo $$r/bison/bison -y -L $$s/bison/ ; \
+ elif [ -f $$r/byacc/byacc ] ; then \
+ echo $$r/byacc/byacc ; \
+ else \
+ echo ${DEFAULT_YACC} ; \
+ fi`
+
+LEX = `if [ -f $$r/flex/flex ] ; \
+ then echo $$r/flex/flex ; \
+ else echo ${DEFAULT_LEX} ; fi`
+
+M4 = `if [ -f $$r/m4/m4 ] ; \
+ then echo $$r/m4/m4 ; \
+ else echo ${DEFAULT_M4} ; fi`
+
+# For an installed makeinfo, we require it to be from texinfo 4 or
+# higher, else we use the "missing" dummy.
+MAKEINFO = `if [ -f $$r/texinfo/makeinfo/makeinfo ] ; \
+ then echo $$r/texinfo/makeinfo/makeinfo ; \
+ else if (makeinfo --version \
+ | egrep 'texinfo[^0-9]*([1-3][0-9]|[4-9])') >/dev/null 2>&1; \
+ then echo makeinfo; else echo $$s/missing makeinfo; fi; fi`
+
+# This just becomes part of the MAKEINFO definition passed down to
+# sub-makes. It lets flags be given on the command line while still
+# using the makeinfo from the object tree.
+MAKEINFOFLAGS =
+
+EXPECT = `if [ -f $$r/expect/expect ] ; \
+ then echo $$r/expect/expect ; \
+ else echo expect ; fi`
+
+RUNTEST = `if [ -f $$s/dejagnu/runtest ] ; \
+ then echo $$s/dejagnu/runtest ; \
+ else echo runtest ; fi`
+
+
+# compilers to use to create programs which must be run in the build
+# environment.
+CC_FOR_BUILD = $(CC)
+CXX_FOR_BUILD = $(CXX)
+
+SUBDIRS = @configdirs@
+
+# This is set by the configure script to the list of directories which
+# should be built using the target tools.
+TARGET_CONFIGDIRS = @target_configdirs@
+
+# Target libraries are put under this directory:
+# Changed by configure to $(target_alias) if cross.
+TARGET_SUBDIR = @target_subdir@
+
+BUILD_CONFIGDIRS = libiberty
+BUILD_SUBDIR = @build_subdir@
+
+# This is set by the configure script to the arguments to use when configuring
+# directories built for the target.
+TARGET_CONFIGARGS = @target_configargs@
+
+# This is set by the configure script to the arguments to use when configuring
+# directories built for the build system.
+BUILD_CONFIGARGS = @build_configargs@
+
+# This is set by configure to REALLY_SET_LIB_PATH if --enable-shared
+# was used.
+SET_LIB_PATH = @SET_LIB_PATH@
+
+# This is the name of the environment variable used for the path to
+# the libraries. This may be changed by configure.in.
+RPATH_ENVVAR = @RPATH_ENVVAR@
+
+# This is the list of directories that may be needed in RPATH_ENVVAR
+# so that programs built for the host machine work.
+HOST_LIB_PATH = $$r/bfd:$$r/opcodes
+
+# This is the list of directories that may be needed in RPATH_ENVVAR
+# so that prorgams built for the target machine work.
+TARGET_LIB_PATH = $$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:
+
+# configure.in sets SET_LIB_PATH to this if --enable-shared was used.
+# Some platforms don't like blank entries, so we remove duplicate,
+# leading and trailing colons.
+REALLY_SET_LIB_PATH = \
+ $(RPATH_ENVVAR)=`echo "$(HOST_LIB_PATH):$(TARGET_LIB_PATH):$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR);
+
+ALL = all.normal
+INSTALL_TARGET = installdirs \
+ install-gcc \
+ $(INSTALL_MODULES) \
+ $(INSTALL_TARGET_MODULES) \
+ $(INSTALL_X11_MODULES) \
+ $(INSTALL_DOSREL)
+
+INSTALL_TARGET_CROSS = installdirs \
+ install-gcc-cross \
+ $(INSTALL_MODULES) \
+ $(INSTALL_TARGET_MODULES) \
+ $(INSTALL_X11_MODULES) \
+ $(INSTALL_DOSREL)
+
+# Should be substed by configure.in
+FLAGS_FOR_TARGET = @FLAGS_FOR_TARGET@
+CC_FOR_TARGET = @CC_FOR_TARGET@
+CXX_FOR_TARGET = @CXX_FOR_TARGET@
+CXX_FOR_TARGET_FOR_RECURSIVE_MAKE = @CXX_FOR_TARGET_FOR_RECURSIVE_MAKE@
+GCJ_FOR_TARGET = @GCJ_FOR_TARGET@
+
+# If GCC_FOR_TARGET is not overriden on the command line, then this
+# variable is passed down to the gcc Makefile, where it is used to
+# build libgcc2.a. We define it here so that it can itself be
+# overridden on the command line.
+GCC_FOR_TARGET = $(STAGE_CC_WRAPPER) $$r/gcc/xgcc -B$$r/gcc/ $(FLAGS_FOR_TARGET)
+
+AS_FOR_TARGET = ` \
+ if [ -f $$r/gas/as-new ] ; then \
+ echo $$r/gas/as-new ; \
+ elif [ -f $$r/gcc/xgcc ]; then \
+ $(CC_FOR_TARGET) -print-prog-name=as ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ echo $(AS); \
+ else \
+ t='$(program_transform_name)'; echo as | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+LD_FOR_TARGET = ` \
+ if [ -f $$r/ld/ld-new ] ; then \
+ echo $$r/ld/ld-new ; \
+ elif [ -f $$r/gcc/xgcc ]; then \
+ $(CC_FOR_TARGET) -print-prog-name=ld ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ echo $(LD); \
+ else \
+ t='$(program_transform_name)'; echo ld | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+DLLTOOL_FOR_TARGET = ` \
+ if [ -f $$r/binutils/dlltool ] ; then \
+ echo $$r/binutils/dlltool ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ echo $(DLLTOOL); \
+ else \
+ t='$(program_transform_name)'; echo dlltool | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+WINDRES_FOR_TARGET = ` \
+ if [ -f $$r/binutils/windres ] ; then \
+ echo $$r/binutils/windres ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ echo $(WINDRES); \
+ else \
+ t='$(program_transform_name)'; echo windres | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+AR_FOR_TARGET = ` \
+ if [ -f $$r/binutils/ar ] ; then \
+ echo $$r/binutils/ar ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ echo $(AR); \
+ else \
+ t='$(program_transform_name)'; echo ar | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+RANLIB_FOR_TARGET = ` \
+ if [ -f $$r/binutils/ranlib ] ; then \
+ echo $$r/binutils/ranlib ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ if [ x'$(RANLIB)' != x ]; then \
+ echo $(RANLIB); \
+ else \
+ echo ranlib; \
+ fi; \
+ else \
+ t='$(program_transform_name)'; echo ranlib | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+NM_FOR_TARGET = ` \
+ if [ -f $$r/binutils/nm-new ] ; then \
+ echo $$r/binutils/nm-new ; \
+ elif [ -f $$r/gcc/xgcc ]; then \
+ $(CC_FOR_TARGET) -print-prog-name=nm ; \
+ else \
+ if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ echo $(NM); \
+ else \
+ t='$(program_transform_name)'; echo nm | sed -e 's/x/x/' $$t ; \
+ fi; \
+ fi`
+
+# The first rule in the file had better be this one. Don't put any above it.
+# This lives here to allow makefile fragments to contain dependencies.
+all: all.normal
+.PHONY: all
+
+# These can be overridden by config/mt-*.
+# The _TARGET_ is because they're specified in mt-foo.
+# The _HOST_ is because they're programs that run on the host.
+EXTRA_TARGET_HOST_ALL_MODULES =
+EXTRA_TARGET_HOST_INSTALL_MODULES =
+EXTRA_TARGET_HOST_CHECK_MODULES =
+
+#### host and target specific makefile fragments come in here.
+###
+
+# Flags to pass down to all sub-makes.
+# Please keep these in alphabetical order.
+BASE_FLAGS_TO_PASS = \
+ "AR_FLAGS=$(AR_FLAGS)" \
+ "AR_FOR_TARGET=$(AR_FOR_TARGET)" \
+ "AS_FOR_TARGET=$(AS_FOR_TARGET)" \
+ "BISON=$(BISON)" \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
+ "CFLAGS=$(CFLAGS)" \
+ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+ "GCJ_FOR_TARGET=$(GCJ_FOR_TARGET)" \
+ "CXX_FOR_BUILD=$(CXX_FOR_BUILD)" \
+ "CXXFLAGS=$(CXXFLAGS)" \
+ "CXXFLAGS_FOR_TARGET=$(CXXFLAGS_FOR_TARGET)" \
+ "CXX_FOR_TARGET=$(CXX_FOR_TARGET)" \
+ "DLLTOOL_FOR_TARGET=$(DLLTOOL_FOR_TARGET)" \
+ "INSTALL=$(INSTALL)" \
+ "INSTALL_DATA=$(INSTALL_DATA)" \
+ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "LDFLAGS=$(LDFLAGS)" \
+ "LEX=$(LEX)" \
+ "LD_FOR_TARGET=$(LD_FOR_TARGET)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+ "LIBCXXFLAGS=$(LIBCXXFLAGS)" \
+ "LIBCXXFLAGS_FOR_TARGET=$(LIBCXXFLAGS_FOR_TARGET)" \
+ "M4=$(M4)" \
+ "MAKE=$(MAKE)" \
+ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
+ "RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET)" \
+ "RPATH_ENVVAR=$(RPATH_ENVVAR)" \
+ "SHELL=$(SHELL)" \
+ "EXPECT=$(EXPECT)" \
+ "RUNTEST=$(RUNTEST)" \
+ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+ "TARGET_SUBDIR=$(TARGET_SUBDIR)" \
+ "WINDRES_FOR_TARGET=$(WINDRES_FOR_TARGET)" \
+ "YACC=$(YACC)" \
+ "bindir=$(bindir)" \
+ "datadir=$(datadir)" \
+ "exec_prefix=$(exec_prefix)" \
+ "includedir=$(includedir)" \
+ "infodir=$(infodir)" \
+ "libdir=$(libdir)" \
+ "libexecdir=$(libexecdir)" \
+ "lispdir=$(lispdir)" \
+ "libstdcxx_incdir=$(libstdcxx_incdir)" \
+ "libsubdir=$(libsubdir)" \
+ "localstatedir=$(localstatedir)" \
+ "mandir=$(mandir)" \
+ "oldincludedir=$(oldincludedir)" \
+ "prefix=$(prefix)" \
+ "sbindir=$(sbindir)" \
+ "sharedstatedir=$(sharedstatedir)" \
+ "sysconfdir=$(sysconfdir)" \
+ "tooldir=$(tooldir)" \
+ "build_tooldir=$(build_tooldir)" \
+ "gxx_include_dir=$(gxx_include_dir)" \
+ "gcc_version=$(gcc_version)" \
+ "gcc_version_trigger=$(gcc_version_trigger)" \
+ "target_alias=$(target_alias)"
+
+# For any flags above that may contain shell code that varies from one
+# target library to another. When doing recursive invocations of the
+# top-level Makefile, we don't want the outer make to evaluate them,
+# so we pass these variables down unchanged. They must not contain
+# single nor double quotes.
+RECURSE_FLAGS = \
+ CXX_FOR_TARGET='$(CXX_FOR_TARGET_FOR_RECURSIVE_MAKE)'
+
+# Flags to pass down to most sub-makes, in which we're building with
+# the host environment.
+# If any variables are added here, they must be added to do-*, below.
+EXTRA_HOST_FLAGS = \
+ 'AR=$(AR)' \
+ 'AS=$(AS)' \
+ 'CC=$(CC)' \
+ 'CXX=$(CXX)' \
+ 'DLLTOOL=$(DLLTOOL)' \
+ 'LD=$(LD)' \
+ 'NM=$(NM)' \
+ "`echo 'RANLIB=$(RANLIB)' | sed -e s/.*=$$/XFOO=/`" \
+ 'WINDRES=$(WINDRES)'
+
+FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_HOST_FLAGS)
+
+# Flags that are concerned with the location of the X11 include files
+# and library files
+#
+# NOTE: until the top-level is getting the values via autoconf, it only
+# causes problems to have this top-level Makefile overriding the autoconf-set
+# values in child directories. Only variables that don't conflict with
+# autoconf'ed ones should be passed by X11_FLAGS_TO_PASS for now.
+#
+X11_FLAGS_TO_PASS = \
+ 'X11_EXTRA_CFLAGS=$(X11_EXTRA_CFLAGS)' \
+ 'X11_EXTRA_LIBS=$(X11_EXTRA_LIBS)'
+
+# Flags to pass down to makes which are built with the target environment.
+# The double $ decreases the length of the command line; the variables
+# are set in BASE_FLAGS_TO_PASS, and the sub-make will expand them.
+# If any variables are added here, they must be added to do-*, below.
+EXTRA_TARGET_FLAGS = \
+ 'AR=$$(AR_FOR_TARGET)' \
+ 'AS=$$(AS_FOR_TARGET)' \
+ 'CC=$$(CC_FOR_TARGET)' \
+ 'CFLAGS=$$(CFLAGS_FOR_TARGET)' \
+ 'CXX=$$(CXX_FOR_TARGET)' \
+ 'CXXFLAGS=$$(CXXFLAGS_FOR_TARGET)' \
+ 'DLLTOOL=$$(DLLTOOL_FOR_TARGET)' \
+ 'LD=$$(LD_FOR_TARGET)' \
+ 'LIBCFLAGS=$$(LIBCFLAGS_FOR_TARGET)' \
+ 'LIBCXXFLAGS=$$(LIBCXXFLAGS_FOR_TARGET)' \
+ 'NM=$$(NM_FOR_TARGET)' \
+ 'RANLIB=$$(RANLIB_FOR_TARGET)' \
+ 'WINDRES=$$(WINDRES_FOR_TARGET)'
+
+TARGET_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS)
+
+# Flags to pass down to gcc. gcc builds a library, libgcc.a, so it
+# unfortunately needs the native compiler and the target ar and
+# ranlib.
+# If any variables are added here, they must be added to do-*, below.
+# The HOST_* variables are a special case, which are used for the gcc
+# cross-building scheme.
+EXTRA_GCC_FLAGS = \
+ 'AR=$(AR)' \
+ 'AS=$(AS)' \
+ 'CC=$(CC)' \
+ 'CXX=$(CXX)' \
+ 'DLLTOOL=$$(DLLTOOL_FOR_TARGET)' \
+ 'HOST_CC=$(CC_FOR_BUILD)' \
+ 'BUILD_PREFIX=$(BUILD_PREFIX)' \
+ 'BUILD_PREFIX_1=$(BUILD_PREFIX_1)' \
+ 'NM=$(NM)' \
+ "`echo 'RANLIB=$(RANLIB)' | sed -e s/.*=$$/XFOO=/`" \
+ 'WINDRES=$$(WINDRES_FOR_TARGET)' \
+ "GCC_FOR_TARGET=$(GCC_FOR_TARGET)" \
+ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+ "`echo 'LANGUAGES=$(LANGUAGES)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'STMP_FIXPROTO=$(STMP_FIXPROTO)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'LIMITS_H_TEST=$(LIMITS_H_TEST)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'LIBGCC2_CFLAGS=$(LIBGCC2_CFLAGS)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'LIBGCC2_DEBUG_CFLAGS=$(LIBGCC2_DEBUG_CFLAGS)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'LIBGCC2_INCLUDES=$(LIBGCC2_INCLUDES)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'ENQUIRE=$(ENQUIRE)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'STAGE1_CFLAGS=$(STAGE1_CFLAGS)' | sed -e s/.*=$$/XFOO=/`" \
+ "`echo 'BOOT_CFLAGS=$(BOOT_CFLAGS)' | sed -e s/.*=$$/XFOO=/`"
+
+GCC_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_GCC_FLAGS)
+
+# This is a list of the targets for all of the modules which are compiled
+# using the build machine's native compiler. Configure edits the second
+# macro for build!=host builds.
+ALL_BUILD_MODULES_LIST = \
+ all-build-libiberty
+ALL_BUILD_MODULES = @all_build_modules@
+
+# This is a list of the configure targets for all of the modules which
+# are compiled using the native tools.
+CONFIGURE_BUILD_MODULES = \
+ configure-build-libiberty
+
+# This is a list of the targets for all of the modules which are compiled
+# using $(FLAGS_TO_PASS).
+ALL_MODULES = [+ FOR host_modules +]\
+ all-[+module+] [+ ENDFOR host_modules +]\
+ $(EXTRA_TARGET_HOST_ALL_MODULES)
+
+# This is a list of the check targets for all of the modules which are
+# compiled using $(FLAGS_TO_PASS).
+#
+# The list is in two parts. The first lists those tools which
+# are tested as part of the host's native tool-chain, and not
+# tested in a cross configuration.
+NATIVE_CHECK_MODULES = \
+ check-bison \
+ check-byacc \
+ check-fastjar \
+ check-flex \
+ check-zip
+
+CROSS_CHECK_MODULES = [+ FOR host_modules +][+ IF no_check +][+ ELIF no_check_cross +][+ ELSE x +]\
+ check-[+module+] [+ ENDIF no_check +][+ ENDFOR host_modules +]\
+ $(EXTRA_TARGET_HOST_CHECK_MODULES)
+
+CHECK_MODULES=$(NATIVE_CHECK_MODULES) $(CROSS_CHECK_MODULES)
+
+# This is a list of the install targets for all of the modules which are
+# compiled using $(FLAGS_TO_PASS).
+INSTALL_MODULES = [+ FOR host_modules+][+ IF no_install +][+ ELSE no_install +]\
+ install-[+module+] [+ ENDIF no_install +][+ ENDFOR host_modules +]\
+ $(EXTRA_TARGET_HOST_INSTALL_MODULES)
+
+# This is a list of the targets for all of the modules which are compiled
+# using $(X11_FLAGS_TO_PASS).
+ALL_X11_MODULES = \
+ all-gdb \
+ all-expect \
+ all-guile \
+ all-tclX \
+ all-tk \
+ all-tix
+
+# This is a list of the check targets for all of the modules which are
+# compiled using $(X11_FLAGS_TO_PASS).
+CHECK_X11_MODULES = \
+ check-gdb \
+ check-guile \
+ check-expect \
+ check-tclX \
+ check-tk \
+ check-tix
+
+# This is a list of the install targets for all the modules which are
+# compiled using $(X11_FLAGS_TO_PASS).
+INSTALL_X11_MODULES = \
+ install-gdb \
+ install-guile \
+ install-expect \
+ install-tclX \
+ install-tk \
+ install-tix
+
+# This is a list of the targets for all of the modules which are compiled
+# using $(TARGET_FLAGS_TO_PASS).
+ALL_TARGET_MODULES = [+ FOR target_modules +]\
+ all-target-[+module+] [+ ENDFOR target_modules +]
+
+# This is a list of the configure targets for all of the modules which
+# are compiled using the target tools.
+CONFIGURE_TARGET_MODULES = [+ FOR target_modules +]\
+ configure-target-[+module+] [+ ENDFOR target_modules +]
+
+# This is a list of the check targets for all of the modules which are
+# compiled using $(TARGET_FLAGS_TO_PASS).
+CHECK_TARGET_MODULES = [+ FOR target_modules +][+ IF no_check +][+ ELSE check +]\
+ check-target-[+module+] [+ ENDIF no_check +][+ ENDFOR target_modules +]
+
+# This is a list of the install targets for all of the modules which are
+# compiled using $(TARGET_FLAGS_TO_PASS).
+INSTALL_TARGET_MODULES = [+ FOR target_modules +][+ IF no_install +][+ ELSE install +]\
+ install-target-[+module+] [+ ENDIF no_install +][+ ENDFOR target_modules +]
+
+# This is a list of the targets for which we can do a clean-{target}.
+CLEAN_MODULES = [+ FOR host_modules +][+ IF no_clean +][+ ELSE no_clean +]\
+ clean-[+module+] [+ ENDIF no_clean +][+ ENDFOR host_modules +]
+
+# All of the target modules that can be cleaned
+CLEAN_TARGET_MODULES = [+ FOR target_modules +][+ IF no_clean +][+ ELSE clean +]\
+ clean-target-[+module+] [+ ENDIF no_clean +][+ ENDFOR target_modules +]
+
+# All of the x11 modules that can be cleaned
+CLEAN_X11_MODULES = \
+ clean-gdb \
+ clean-expect \
+ clean-guile \
+ clean-tclX \
+ clean-tk \
+ clean-tix
+
+# The target built for a native build.
+.PHONY: all.normal
+all.normal: \
+ $(ALL_BUILD_MODULES) \
+ $(ALL_MODULES) \
+ $(ALL_X11_MODULES) \
+ $(ALL_TARGET_MODULES) \
+ all-gcc
+
+# Do a target for all the subdirectories. A ``make do-X'' will do a
+# ``make X'' in all subdirectories (because, in general, there is a
+# dependency (below) of X upon do-X, a ``make X'' will also do this,
+# but it may do additional work as well).
+# This target ensures that $(BASE_FLAGS_TO_PASS) appears only once,
+# because it is so large that it can easily overflow the command line
+# length limit on some systems.
+DO_X = \
+ do-clean \
+ do-distclean \
+ do-dvi \
+ do-info \
+ do-install-info \
+ do-installcheck \
+ do-mostlyclean \
+ do-maintainer-clean \
+ do-TAGS
+.PHONY: $(DO_X)
+$(DO_X):
+ @target=`echo $@ | sed -e 's/^do-//'`; \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ for i in $(SUBDIRS) -dummy-; do \
+ if [ -f ./$$i/Makefile ]; then \
+ case $$i in \
+ gcc) \
+ for flag in $(EXTRA_GCC_FLAGS); do \
+ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+ done; \
+ ;; \
+ *) \
+ for flag in $(EXTRA_HOST_FLAGS); do \
+ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+ done; \
+ ;; \
+ esac ; \
+ if (cd ./$$i; \
+ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+ "`echo \"RANLIB=$${RANLIB}\" | sed -e 's/.*=$$/XFOO=/'`" \
+ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \
+ $${target}); \
+ then true; else exit 1; fi; \
+ else true; fi; \
+ done
+ @target=`echo $@ | sed -e 's/^do-//'`; \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ for i in $(TARGET_CONFIGDIRS) -dummy-; do \
+ if [ -f $(TARGET_SUBDIR)/$$i/Makefile ]; then \
+ for flag in $(EXTRA_TARGET_FLAGS); do \
+ eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+ done; \
+ if (cd $(TARGET_SUBDIR)/$$i; \
+ $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+ "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+ "`echo \"RANLIB=$${RANLIB}\" | sed -e 's/.*=$$/XFOO=/'`" \
+ "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" \
+ $${target}); \
+ then true; else exit 1; fi; \
+ else true; fi; \
+ done
+
+# Here are the targets which correspond to the do-X targets.
+
+.PHONY: info installcheck dvi install-info
+.PHONY: clean distclean mostlyclean maintainer-clean realclean
+.PHONY: local-clean local-distclean local-maintainer-clean
+info: do-info
+installcheck: do-installcheck
+dvi: do-dvi
+
+# Make sure makeinfo is built before we do a `make info'.
+do-info: all-texinfo
+
+install-info: do-install-info dir.info
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ if [ -f dir.info ] ; then \
+ $(INSTALL_DATA) dir.info $(infodir)/dir.info ; \
+ else true ; fi
+
+local-clean:
+ -rm -f *.a TEMP errs core *.o *~ \#* TAGS *.E *.log
+
+local-distclean:
+ -rm -f Makefile config.status config.cache mh-frag mt-frag
+ -if [ "$(TARGET_SUBDIR)" != "." ]; then \
+ rm -rf $(TARGET_SUBDIR); \
+ else true; fi
+ -rm -f texinfo/po/Makefile texinfo/po/Makefile.in texinfo/info/Makefile
+ -rm -f texinfo/doc/Makefile texinfo/po/POTFILES
+ -rmdir texinfo/doc texinfo/info texinfo/intl texinfo/lib 2>/dev/null
+ -rmdir texinfo/makeinfo texinfo/po texinfo/util 2>/dev/null
+ -rmdir fastjar gcc libiberty texinfo zlib 2>/dev/null
+
+local-maintainer-clean:
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+clean: do-clean local-clean
+mostlyclean: do-mostlyclean local-clean
+distclean: do-distclean local-clean local-distclean
+maintainer-clean: local-maintainer-clean do-maintainer-clean local-clean
+maintainer-clean: local-distclean
+realclean: maintainer-clean
+
+# This rule is used to clean specific modules.
+.PHONY: $(CLEAN_MODULES) $(CLEAN_X11_MODULES) clean-gcc
+$(CLEAN_MODULES) $(CLEAN_X11_MODULES) clean-gcc:
+ @dir=`echo $@ | sed -e 's/clean-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; $(MAKE) $(FLAGS_TO_PASS) clean); \
+ else \
+ true; \
+ fi
+
+.PHONY: $(CLEAN_TARGET_MODULES)
+$(CLEAN_TARGET_MODULES):
+ @dir=`echo $@ | sed -e 's/clean-target-//'`; \
+ rm -f $(TARGET_SUBDIR)/$${dir}/multilib.out $(TARGET_SUBDIR)/$${dir}/tmpmulti.out; \
+ if [ -f $(TARGET_SUBDIR)/$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $(TARGET_SUBDIR)/$${dir}; $(MAKE) $(TARGET_FLAGS_TO_PASS) clean); \
+ else \
+ true; \
+ fi
+
+clean-target: $(CLEAN_TARGET_MODULES) clean-target-libgcc
+clean-target-libgcc:
+ test ! -d gcc/libgcc || \
+ (cd gcc/libgcc && find . -type d -print) | \
+ while read d; do rm -f gcc/$$d/libgcc.a || : ; done
+ -rm -rf gcc/libgcc
+
+# Check target.
+
+.PHONY: check do-check
+check:
+ $(MAKE) do-check NOTPARALLEL=parallel-ok
+
+do-check: $(CHECK_MODULES) \
+ $(CHECK_TARGET_MODULES) \
+ $(CHECK_X11_MODULES) \
+ check-gcc
+
+# Automated reporting of test results.
+
+warning.log: build.log
+ $(srcdir)/contrib/warn_summary build.log > $@
+
+mail-report.log:
+ if test x'$(BOOT_CFLAGS)' != x''; then \
+ BOOT_CFLAGS='$(BOOT_CFLAGS)'; export BOOT_CFLAGS; \
+ fi; \
+ $(srcdir)/contrib/test_summary -t >$@
+ chmod +x $@
+ echo If you really want to send e-mail, run ./$@ now
+
+mail-report-with-warnings.log: warning.log
+ if test x'$(BOOT_CFLAGS)' != x''; then \
+ BOOT_CFLAGS='$(BOOT_CFLAGS)'; export BOOT_CFLAGS; \
+ fi; \
+ $(srcdir)/contrib/test_summary -t -i warning.log >$@
+ chmod +x $@
+ echo If you really want to send e-mail, run ./$@ now
+
+# Installation targets.
+
+.PHONY: install install-cross uninstall source-vault binary-vault vault-install
+install: $(INSTALL_TARGET)
+install-cross: $(INSTALL_TARGET_CROSS)
+
+uninstall:
+ @echo "the uninstall target is not supported in this tree"
+
+source-vault:
+ $(MAKE) -f ./release/Build-A-Release \
+ host=$(host_alias) source-vault
+
+binary-vault:
+ $(MAKE) -f ./release/Build-A-Release \
+ host=$(host_alias) target=$(target_alias)
+
+vault-install:
+ @if [ -f ./release/vault-install ] ; then \
+ ./release/vault-install $(host_alias) $(target_alias) ; \
+ else \
+ true ; \
+ fi
+
+.PHONY: install.all
+install.all: install-no-fixedincludes
+ @if [ -f ./gcc/Makefile ] ; then \
+ r=`${PWD}` ; export r ; \
+ $(SET_LIB_PATH) \
+ (cd ./gcc; \
+ $(MAKE) $(FLAGS_TO_PASS) install-headers) ; \
+ else \
+ true ; \
+ fi
+
+# install-no-fixedincludes is used because Cygnus can not distribute
+# the fixed header files.
+.PHONY: install-no-fixedincludes
+install-no-fixedincludes: \
+ installdirs \
+ $(INSTALL_MODULES) \
+ $(INSTALL_TARGET_MODULES) \
+ $(INSTALL_X11_MODULES) \
+ gcc-no-fixedincludes
+
+# Install the gcc headers files, but not the fixed include files,
+# which Cygnus is not allowed to distribute. This rule is very
+# dependent on the workings of the gcc Makefile.in.
+.PHONY: gcc-no-fixedincludes
+gcc-no-fixedincludes:
+ @if [ -f ./gcc/Makefile ]; then \
+ rm -rf gcc/tmp-include; \
+ mv gcc/include gcc/tmp-include 2>/dev/null; \
+ mkdir gcc/include; \
+ cp $(srcdir)/gcc/gsyslimits.h gcc/include/syslimits.h; \
+ touch gcc/stmp-fixinc gcc/include/fixed; \
+ rm -f gcc/stmp-headers gcc/stmp-int-hdrs; \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}` ; export s; \
+ $(SET_LIB_PATH) \
+ (cd ./gcc; \
+ $(MAKE) $(GCC_FLAGS_TO_PASS) install); \
+ rm -rf gcc/include; \
+ mv gcc/tmp-include gcc/include 2>/dev/null; \
+ else true; fi
+
+# This rule is used to build the modules which are built with the
+# build machine's native compiler.
+.PHONY: $(ALL_BUILD_MODULES)
+$(ALL_BUILD_MODULES):
+ dir=`echo $@ | sed -e 's/all-build-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ (cd $(BUILD_SUBDIR)/$${dir} && $(MAKE) all); \
+ else \
+ true; \
+ fi
+
+# This rule is used to configure the modules which are built with the
+# native tools.
+.PHONY: $(CONFIGURE_BUILD_MODULES)
+$(CONFIGURE_BUILD_MODULES):
+ @dir=`echo $@ | sed -e 's/configure-build-//'`; \
+ if [ ! -d $(BUILD_SUBDIR) ]; then \
+ true; \
+ elif [ -f $(BUILD_SUBDIR)/$${dir}/Makefile ] ; then \
+ true; \
+ elif echo " $(BUILD_CONFIGDIRS) " | grep " $${dir} " >/dev/null 2>&1; then \
+ if [ -d $(srcdir)/$${dir} ]; then \
+ [ -d $(BUILD_SUBDIR)/$${dir} ] || mkdir $(BUILD_SUBDIR)/$${dir};\
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ AR="$(AR_FOR_BUILD)"; export AR; \
+ AS="$(AS_FOR_BUILD)"; export AS; \
+ CC="$(CC_FOR_BUILD)"; export CC; \
+ CFLAGS="$(CFLAGS_FOR_BUILD)"; export CFLAGS; \
+ CXX="$(CXX_FOR_BUILD)"; export CXX; \
+ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)"; export CXXFLAGS; \
+ GCJ="$(GCJ_FOR_BUILD)"; export GCJ; \
+ DLLTOOL="$(DLLTOOL_FOR_BUILD)"; export DLLTOOL; \
+ LD="$(LD_FOR_BUILD)"; export LD; \
+ LDFLAGS="$(LDFLAGS_FOR_BUILD)"; export LDFLAGS; \
+ NM="$(NM_FOR_BUILD)"; export NM; \
+ RANLIB="$(RANLIB_FOR_BUILD)"; export RANLIB; \
+ WINDRES="$(WINDRES_FOR_BUILD)"; export WINDRES; \
+ echo Configuring in $(BUILD_SUBDIR)/$${dir}; \
+ cd "$(BUILD_SUBDIR)/$${dir}" || exit 1; \
+ case $(srcdir) in \
+ /* | [A-Za-z]:[\\/]*) \
+ topdir=$(srcdir) ;; \
+ *) \
+ case "$(BUILD_SUBDIR)" in \
+ .) topdir="../$(srcdir)" ;; \
+ *) topdir="../../$(srcdir)" ;; \
+ esac ;; \
+ esac; \
+ if [ "$(srcdir)" = "." ] ; then \
+ if [ "$(BUILD_SUBDIR)" != "." ] ; then \
+ if $(SHELL) $$s/symlink-tree $${topdir}/$${dir} "no-such-file" ; then \
+ if [ -f Makefile ]; then \
+ if $(MAKE) distclean; then \
+ true; \
+ else \
+ exit 1; \
+ fi; \
+ else \
+ true; \
+ fi; \
+ else \
+ exit 1; \
+ fi; \
+ else \
+ true; \
+ fi; \
+ srcdiroption="--srcdir=."; \
+ libsrcdir="."; \
+ else \
+ srcdiroption="--srcdir=$${topdir}/$${dir}"; \
+ libsrcdir="$$s/$${dir}"; \
+ fi; \
+ if [ -f $${libsrcdir}/configure ] ; then \
+ rm -f no-such-file skip-this-dir; \
+ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \
+ $(BUILD_CONFIGARGS) $${srcdiroption} \
+ --with-build-subdir="$(BUILD_SUBDIR)"; \
+ else \
+ rm -f no-such-file skip-this-dir; \
+ CONFIG_SITE=no-such-file $(SHELL) $$s/configure \
+ $(BUILD_CONFIGARGS) $${srcdiroption} \
+ --with-build-subdir="$(BUILD_SUBDIR)"; \
+ fi || exit 1; \
+ if [ -f skip-this-dir ] ; then \
+ sh skip-this-dir; \
+ rm -f skip-this-dir; \
+ cd ..; rmdir $${dir} || true; \
+ else \
+ true; \
+ fi; \
+ else \
+ true; \
+ fi; \
+ else \
+ true; \
+ fi
+
+# This rule is used to build the modules which use FLAGS_TO_PASS. To
+# build a target all-X means to cd to X and make all.
+.PHONY: $(ALL_MODULES)
+$(ALL_MODULES):
+ @dir=`echo $@ | sed -e 's/all-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; $(MAKE) $(FLAGS_TO_PASS) all); \
+ else \
+ true; \
+ fi
+
+# These rules are used to check the modules which use FLAGS_TO_PASS.
+# To build a target check-X means to cd to X and make check. Some
+# modules are only tested in a native toolchain.
+
+.PHONY: $(CHECK_MODULES) $(NATIVE_CHECK_MODULES) $(CROSS_CHECK_MODULES)
+$(NATIVE_CHECK_MODULES):
+ @if [ '$(host_canonical)' = '$(target_canonical)' ] ; then \
+ dir=`echo $@ | sed -e 's/check-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; $(MAKE) $(FLAGS_TO_PASS) check); \
+ else \
+ true; \
+ fi; \
+ fi
+
+$(CROSS_CHECK_MODULES):
+ @dir=`echo $@ | sed -e 's/check-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; $(MAKE) $(FLAGS_TO_PASS) check); \
+ else \
+ true; \
+ fi
+
+# This rule is used to install the modules which use FLAGS_TO_PASS.
+# To build a target install-X means to cd to X and make install.
+.PHONY: $(INSTALL_MODULES)
+$(INSTALL_MODULES): installdirs
+ @dir=`echo $@ | sed -e 's/install-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; $(MAKE) $(FLAGS_TO_PASS) install); \
+ else \
+ true; \
+ fi
+
+# This rule is used to configure the modules which are built with the
+# target tools.
+.PHONY: $(CONFIGURE_TARGET_MODULES)
+$(CONFIGURE_TARGET_MODULES):
+ @dir=`echo $@ | sed -e 's/configure-target-//'`; \
+ if [ -d $(TARGET_SUBDIR)/$${dir} ]; then \
+ r=`${PWD}`; export r; \
+ $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/$${dir}/tmpmulti.out 2> /dev/null; \
+ if [ -s $(TARGET_SUBDIR)/$${dir}/tmpmulti.out ]; then \
+ if [ -f $(TARGET_SUBDIR)/$${dir}/multilib.out ]; then \
+ if cmp $(TARGET_SUBDIR)/$${dir}/multilib.out $(TARGET_SUBDIR)/$${dir}/tmpmulti.out > /dev/null; then \
+ rm -f $(TARGET_SUBDIR)/$${dir}/tmpmulti.out; \
+ else \
+ echo "Multilibs changed for $${dir}, reconfiguring"; \
+ rm -f $(TARGET_SUBDIR)/$${dir}/multilib.out $(TARGET_SUBDIR)/$${dir}/Makefile; \
+ mv $(TARGET_SUBDIR)/$${dir}/tmpmulti.out $(TARGET_SUBDIR)/$${dir}/multilib.out; \
+ fi; \
+ else \
+ mv $(TARGET_SUBDIR)/$${dir}/tmpmulti.out $(TARGET_SUBDIR)/$${dir}/multilib.out; \
+ fi; \
+ fi; \
+ fi; exit 0 # break command into two pieces
+ @dir=`echo $@ | sed -e 's/configure-target-//'`; \
+ if [ ! -d $(TARGET_SUBDIR) ]; then \
+ true; \
+ elif [ -f $(TARGET_SUBDIR)/$${dir}/Makefile ] ; then \
+ true; \
+ elif echo " $(TARGET_CONFIGDIRS) " | grep " $${dir} " >/dev/null 2>&1; then \
+ if [ -d $(srcdir)/$${dir} ]; then \
+ [ -d $(TARGET_SUBDIR)/$${dir} ] || mkdir $(TARGET_SUBDIR)/$${dir};\
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ AR="$(AR_FOR_TARGET)"; export AR; \
+ AS="$(AS_FOR_TARGET)"; export AS; \
+ CC="$(CC_FOR_TARGET)"; export CC; \
+ CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \
+ CXX="$(CXX_FOR_TARGET)"; export CXX; \
+ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)"; export CXXFLAGS; \
+ GCJ="$(GCJ_FOR_TARGET)"; export GCJ; \
+ DLLTOOL="$(DLLTOOL_FOR_TARGET)"; export DLLTOOL; \
+ LD="$(LD_FOR_TARGET)"; export LD; \
+ LDFLAGS="$(LDFLAGS_FOR_TARGET)"; export LDFLAGS; \
+ NM="$(NM_FOR_TARGET)"; export NM; \
+ RANLIB="$(RANLIB_FOR_TARGET)"; export RANLIB; \
+ WINDRES="$(WINDRES_FOR_TARGET)"; export WINDRES; \
+ echo Configuring in $(TARGET_SUBDIR)/$${dir}; \
+ cd "$(TARGET_SUBDIR)/$${dir}" || exit 1; \
+ case $(srcdir) in \
+ /* | [A-Za-z]:[\\/]*) \
+ topdir=$(srcdir) ;; \
+ *) \
+ case "$(TARGET_SUBDIR)" in \
+ .) topdir="../$(srcdir)" ;; \
+ *) topdir="../../$(srcdir)" ;; \
+ esac ;; \
+ esac; \
+ if [ "$(srcdir)" = "." ] ; then \
+ if [ "$(TARGET_SUBDIR)" != "." ] ; then \
+ if $(SHELL) $$s/symlink-tree $${topdir}/$${dir} "no-such-file" ; then \
+ if [ -f Makefile ]; then \
+ if $(MAKE) distclean; then \
+ true; \
+ else \
+ exit 1; \
+ fi; \
+ else \
+ true; \
+ fi; \
+ else \
+ exit 1; \
+ fi; \
+ else \
+ true; \
+ fi; \
+ srcdiroption="--srcdir=."; \
+ libsrcdir="."; \
+ else \
+ srcdiroption="--srcdir=$${topdir}/$${dir}"; \
+ libsrcdir="$$s/$${dir}"; \
+ fi; \
+ if [ -f $${libsrcdir}/configure ] ; then \
+ rm -f no-such-file skip-this-dir; \
+ CONFIG_SITE=no-such-file $(SHELL) $${libsrcdir}/configure \
+ $(TARGET_CONFIGARGS) $${srcdiroption} \
+ --with-target-subdir="$(TARGET_SUBDIR)"; \
+ else \
+ rm -f no-such-file skip-this-dir; \
+ CONFIG_SITE=no-such-file $(SHELL) $$s/configure \
+ $(TARGET_CONFIGARGS) $${srcdiroption} \
+ --with-target-subdir="$(TARGET_SUBDIR)"; \
+ fi || exit 1; \
+ if [ -f skip-this-dir ] ; then \
+ sh skip-this-dir; \
+ rm -f skip-this-dir; \
+ cd ..; rmdir $${dir} || true; \
+ else \
+ true; \
+ fi; \
+ else \
+ true; \
+ fi; \
+ else \
+ true; \
+ fi
+
+# This rule is used to build the modules which use TARGET_FLAGS_TO_PASS.
+# To build a target all-X means to cd to X and make all.
+.PHONY: $(ALL_TARGET_MODULES)
+$(ALL_TARGET_MODULES):
+ @dir=`echo $@ | sed -e 's/all-target-//'`; \
+ if [ -f $(TARGET_SUBDIR)/$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $(TARGET_SUBDIR)/$${dir}; \
+ $(MAKE) $(TARGET_FLAGS_TO_PASS) all); \
+ else \
+ true; \
+ fi
+
+# This rule is used to check the modules which use TARGET_FLAGS_TO_PASS.
+# To build a target install-X means to cd to X and make install.
+.PHONY: $(CHECK_TARGET_MODULES)
+$(CHECK_TARGET_MODULES):
+ @dir=`echo $@ | sed -e 's/check-target-//'`; \
+ if [ -f $(TARGET_SUBDIR)/$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $(TARGET_SUBDIR)/$${dir}; \
+ $(MAKE) $(TARGET_FLAGS_TO_PASS) check);\
+ else \
+ true; \
+ fi
+
+# This rule is used to install the modules which use
+# TARGET_FLAGS_TO_PASS. To build a target install-X means to cd to X
+# and make install.
+.PHONY: $(INSTALL_TARGET_MODULES)
+$(INSTALL_TARGET_MODULES): installdirs
+ @dir=`echo $@ | sed -e 's/install-target-//'`; \
+ if [ -f $(TARGET_SUBDIR)/$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $(TARGET_SUBDIR)/$${dir}; \
+ $(MAKE) $(TARGET_FLAGS_TO_PASS) install); \
+ else \
+ true; \
+ fi
+
+# This rule is used to build the modules which use X11_FLAGS_TO_PASS.
+# To build a target all-X means to cd to X and make all.
+.PHONY: $(ALL_X11_MODULES)
+$(ALL_X11_MODULES):
+ @dir=`echo $@ | sed -e 's/all-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; \
+ $(MAKE) $(FLAGS_TO_PASS) $(X11_FLAGS_TO_PASS) all); \
+ else \
+ true; \
+ fi
+
+# This rule is used to check the modules which use X11_FLAGS_TO_PASS.
+# To build a target check-X means to cd to X and make all.
+.PHONY: $(CHECK_X11_MODULES)
+$(CHECK_X11_MODULES):
+ @dir=`echo $@ | sed -e 's/check-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; \
+ $(MAKE) $(FLAGS_TO_PASS) $(X11_FLAGS_TO_PASS) check); \
+ else \
+ true; \
+ fi
+
+# This rule is used to install the modules which use X11_FLAGS_TO_PASS.
+# To build a target install-X means to cd to X and make install.
+.PHONY: $(INSTALL_X11_MODULES)
+$(INSTALL_X11_MODULES): installdirs
+ @dir=`echo $@ | sed -e 's/install-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; \
+ $(MAKE) $(FLAGS_TO_PASS) $(X11_FLAGS_TO_PASS) install); \
+ else \
+ true; \
+ fi
+
+# gcc is the only module which uses GCC_FLAGS_TO_PASS.
+.PHONY: all-gcc
+all-gcc:
+ @if [ -f ./gcc/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd gcc; $(MAKE) $(GCC_FLAGS_TO_PASS) all); \
+ else \
+ true; \
+ fi
+
+# Building GCC uses some tools for rebuilding "source" files
+# like texinfo, bison/byacc, etc. So we must depend on those.
+#
+# While building GCC, it may be necessary to run various target
+# programs like the assembler, linker, etc. So we depend on
+# those too.
+#
+# In theory, on an SMP all those dependencies can be resolved
+# in parallel.
+#
+.PHONY: bootstrap bootstrap-lean bootstrap2 bootstrap2-lean bootstrap3 bootstrap3-lean bootstrap4 bootstrap4-lean
+bootstrap bootstrap-lean bootstrap2 bootstrap2-lean bootstrap3 bootstrap3-lean bootstrap4 bootstrap4-lean: all-bootstrap
+ @r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ echo "Bootstrapping the compiler"; \
+ cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) $@
+ @r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ case "$@" in \
+ *bootstrap4-lean ) \
+ msg="Comparing stage3 and stage4 of the compiler"; \
+ compare=compare3-lean ;; \
+ *bootstrap4 ) msg="Comparing stage3 and stage4 of the compiler"; \
+ compare=compare3 ;; \
+ *-lean ) msg="Comparing stage2 and stage3 of the compiler"; \
+ compare=compare-lean ;; \
+ * ) msg="Comparing stage2 and stage3 of the compiler"; \
+ compare=compare ;; \
+ esac; \
+ $(SET_LIB_PATH) \
+ echo "$$msg"; \
+ cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) $$compare
+ @r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}` ; export s; \
+ $(SET_LIB_PATH) \
+ echo "Building runtime libraries"; \
+ $(MAKE) $(BASE_FLAGS_TO_PASS) $(RECURSE_FLAGS) all
+
+.PHONY: cross
+cross: all-texinfo all-bison all-byacc all-binutils all-gas all-ld
+ @r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ echo "Building the C and C++ compiler"; \
+ cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) LANGUAGES="c c++"
+ @r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}` ; export s; \
+ $(SET_LIB_PATH) \
+ echo "Building runtime libraries"; \
+ $(MAKE) $(BASE_FLAGS_TO_PASS) $(RECURSE_FLAGS) \
+ LANGUAGES="c c++" all
+
+.PHONY: check-gcc
+check-gcc:
+ @if [ -f ./gcc/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd gcc; $(MAKE) $(GCC_FLAGS_TO_PASS) check); \
+ else \
+ true; \
+ fi
+
+.PHONY: check-c++
+check-c++:
+ @if [ -f ./gcc/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd gcc; $(MAKE) $(GCC_FLAGS_TO_PASS) check-c++); \
+ $(MAKE) check-target-libstdc++-v3; \
+ else \
+ true; \
+ fi
+
+.PHONY: install-gcc
+install-gcc:
+ @if [ -f ./gcc/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd gcc; $(MAKE) $(GCC_FLAGS_TO_PASS) install); \
+ else \
+ true; \
+ fi
+
+.PHONY: install-gcc-cross
+install-gcc-cross:
+ @if [ -f ./gcc/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd gcc; $(MAKE) $(GCC_FLAGS_TO_PASS) LANGUAGES="c c++" install); \
+ else \
+ true; \
+ fi
+# EXPERIMENTAL STUFF
+# This rule is used to install the modules which use FLAGS_TO_PASS.
+# To build a target install-X means to cd to X and make install.
+.PHONY: install-dosrel
+install-dosrel: installdirs info
+ @dir=`echo $@ | sed -e 's/install-//'`; \
+ if [ -f ./$${dir}/Makefile ] ; then \
+ r=`${PWD}`; export r; \
+ s=`cd $(srcdir); ${PWD}`; export s; \
+ $(SET_LIB_PATH) \
+ (cd $${dir}; $(MAKE) $(FLAGS_TO_PASS) install); \
+ else \
+ true; \
+ fi
+
+install-dosrel-fake:
+
+ALL_GCC = all-gcc
+ALL_GCC_C = $(ALL_GCC) all-target-newlib all-target-libgloss
+ALL_GCC_CXX = $(ALL_GCC_C) all-target-libstdc++-v3
+
+# This is a list of inter-dependencies among modules.
+all-ash:
+all-autoconf: all-m4 all-texinfo
+all-automake: all-m4 all-texinfo
+all-bash:
+all-bfd: all-libiberty all-intl
+all-binutils: all-libiberty all-opcodes all-bfd all-flex all-bison all-byacc all-intl
+all-bison: all-texinfo
+configure-target-boehm-gc: $(ALL_GCC_C) configure-target-qthreads
+all-byacc:
+all-bzip2:
+all-db:
+all-dejagnu: all-tcl all-expect all-tk
+all-diff: all-libiberty
+all-etc:
+configure-target-examples: $(ALL_GCC_C)
+all-expect: all-tcl all-tk
+all-fileutils: all-libiberty
+all-findutils:
+all-find:
+all-flex: all-libiberty all-bison all-byacc
+all-gas: all-libiberty all-opcodes all-bfd all-intl
+all-gawk:
+all-gcc: all-bison all-byacc all-binutils all-gas all-ld all-zlib
+all-bootstrap: all-libiberty all-texinfo all-bison all-byacc all-binutils all-gas all-ld all-zlib
+GDB_TK = @GDB_TK@
+all-gdb: all-libiberty all-opcodes all-bfd all-mmalloc all-readline all-bison all-byacc all-sim $(gdbnlmrequirements) $(GDB_TK)
+all-gettext:
+all-gnuserv:
+configure-target-gperf: $(ALL_GCC_CXX)
+all-target-gperf: all-target-libiberty all-target-libstdc++-v3
+all-gprof: all-libiberty all-bfd all-opcodes all-intl
+all-grep: all-libiberty
+all-guile:
+all-gzip: all-libiberty
+all-hello: all-libiberty
+all-indent:
+all-intl:
+all-itcl: all-tcl all-tk
+all-ld: all-libiberty all-bfd all-opcodes all-bison all-byacc all-flex all-intl
+configure-target-libgloss: $(ALL_GCC)
+all-target-libgloss: configure-target-newlib
+all-libgui: all-tcl all-tk all-itcl
+all-libiberty:
+
+all-build-libiberty: configure-build-libiberty
+
+configure-target-libffi: $(ALL_GCC_C)
+configure-target-libjava: $(ALL_GCC_C) configure-target-zlib configure-target-boehm-gc configure-target-qthreads configure-target-libffi
+all-target-libjava: all-fastjar all-target-zlib all-target-boehm-gc all-target-qthreads all-target-libffi
+configure-target-libstdc++-v3: $(ALL_GCC_C)
+all-target-libstdc++-v3: all-target-libiberty
+all-libtool:
+configure-target-libf2c: $(ALL_GCC_C)
+all-target-libf2c: all-target-libiberty
+configure-target-libobjc: $(ALL_GCC_C)
+all-target-libobjc: all-target-libiberty
+all-m4: all-libiberty all-texinfo
+all-make: all-libiberty
+all-mmalloc:
+configure-target-newlib: $(ALL_GCC)
+configure-target-libtermcap: $(ALL_GCC_C)
+all-opcodes: all-bfd all-libiberty
+all-patch: all-libiberty
+all-perl:
+all-prms: all-libiberty
+configure-target-qthreads: $(ALL_GCC_C)
+all-rcs:
+all-readline:
+all-recode: all-libiberty
+all-sed: all-libiberty
+all-send-pr: all-prms
+all-shellutils:
+all-sid: all-tcl all-tk
+all-sim: all-libiberty all-bfd all-opcodes all-readline
+all-snavigator: all-tcl all-tk all-itcl all-tix all-db all-grep all-libgui
+all-tar: all-libiberty
+all-tcl:
+all-tclX: all-tcl all-tk
+all-tk: all-tcl
+all-texinfo: all-libiberty
+all-textutils:
+all-time:
+all-tix: all-tcl all-tk
+all-wdiff:
+configure-target-winsup: $(ALL_GCC_C)
+all-target-winsup: all-target-libiberty all-target-libtermcap
+all-uudecode: all-libiberty
+all-zip:
+all-zlib:
+configure-target-zlib: $(ALL_GCC_C)
+all-fastjar: all-zlib all-libiberty
+configure-target-fastjar: configure-target-zlib
+all-target-fastjar: configure-target-fastjar all-target-zlib all-target-libiberty
+configure-target-libiberty: $(ALL_GCC_C)
+configure-target: $(CONFIGURE_TARGET_MODULES)
+all-target: $(ALL_TARGET_MODULES)
+install-target: $(INSTALL_TARGET_MODULES)
+install-gdb: install-tcl install-tk install-itcl install-tix install-libgui
+install-sid: install-tcl install-tk
+
+# We put install-opcodes before install-binutils because the installed
+# binutils might be on PATH, and they might need the shared opcodes
+# library.
+install-binutils: install-opcodes
+
+# We put install-tcl before install-itcl because itcl wants to run a
+# program on installation which uses the Tcl libraries.
+install-itcl: install-tcl
+
+
+# Dependencies of all-target-foo on configure-target-foo.
+[+ FOR target_modules +]all-target-[+module+]: configure-target-[+module+]
+[+ ENDFOR target_modules +]
+
+### other supporting targets
+
+MAKEDIRS= \
+ $(DESTDIR)$(prefix) \
+ $(DESTDIR)$(exec_prefix)
+.PHONY: installdirs
+installdirs: mkinstalldirs
+ $(SHELL) $(srcdir)/mkinstalldirs $(MAKEDIRS)
+
+dir.info: do-install-info
+ if [ -f $(srcdir)/texinfo/gen-info-dir ] ; then \
+ $(srcdir)/texinfo/gen-info-dir $(infodir) $(srcdir)/texinfo/dir.info-template > dir.info.new ; \
+ mv -f dir.info.new dir.info ; \
+ else true ; \
+ fi
+
+dist:
+ @echo "Building a full distribution of this tree isn't done"
+ @echo "via 'make dist'. Check out the etc/ subdirectory"
+
+etags tags: TAGS
+
+# Right now this just builds TAGS in each subdirectory. emacs19 has the
+# ability to use several tags files at once, so there is probably no need
+# to combine them into one big TAGS file (like CVS 1.3 does). We could
+# (if we felt like it) have this Makefile write a piece of elisp which
+# the user could load to tell emacs19 where all the TAGS files we just
+# built are.
+TAGS: do-TAGS
+
+# Rebuilding Makefile.in, using autogen.
+$(srcdir)/Makefile.in: # $(srcdir)/Makefile.tpl $(srcdir)/Makefile.def
+ cd $(srcdir) && autogen Makefile.def
+
+# with the gnu make, this is done automatically.
+
+Makefile: Makefile.in configure.in $(host_makefile_frag) $(target_makefile_frag) $(gcc_version_trigger)
+ $(SHELL) ./config.status
+
+#
+
+.NOEXPORT:
+MAKEOVERRIDES=
+
+# end of Makefile.in
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index 099e25adc90..a0d5917e56a 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,30 @@
+2002-10-02 Andreas Jaeger <aj@suse.de>
+
+ * include/private/gcconfig.h (HBLKSIZE): Define for x86-64.
+
+2002-09-28 Richard Earnshaw <rearnsha@arm.com>
+
+ * include/private/gcconfig.h: Don't check for __XSCALE__. Instead
+ check for __arm__ or __thumb__.
+
+2002-09-27 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * include/private/gcconfig: Add machine type S390. Add s390x support.
+ * include/private/gc_locks.h (GC_test_and_set): Implement for s390.
+ (GC_compare_and_exchange): Likewise.
+
+2002-09-24 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * include/private/gcconfig.h: Fix NetBSD/mips parameters.
+
+2002-08-23 Adam Megacz <adam@xwt.org>
+
+ * win32_threads.cc: Removed extraneous ABORT()
+
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.am (all-multi): Fix multilib parallel build.
+
2002-07-18 Bo Thorsen <bo@suse.de>
* include/private/gcconfig.h: Add x86-64 definitions.
@@ -39,7 +66,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
* include/private/gc_locks.h (GC_test_and_set): Only take one
one argument.
(LOCK): Adjust appropriately.
- * include/private/gc_priv.h (SIG_SUSPEND): Use SIGRTMIN if
+ * include/private/gc_priv.h (SIG_SUSPEND): Use SIGRTMIN if
_SIGRTMIN is unavailable.
2002-05-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
@@ -86,7 +113,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
* include/private/gcconfig.h (DATAEND): Clarify comment.
2002-04-08 Hans Boehm <Hans_Boehm@hp.com>
-
+
* include/private/gc_priv.h (WARN macro): Add "GC warning:" prefix.
(GC_large_alloc_warn_interval, GC_large_alloc_warn_suppressed):
declare.
@@ -94,7 +121,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
frequency for blacklist warning message.
* misc.c (GC_large_alloc_warn_interval,
GC_large_alloc_warn_suppressed): define.
- (GC_init_inner): Check GC_NO_BLACKLIST_WARNING and
+ (GC_init_inner): Check GC_NO_BLACKLIST_WARNING and
GC_LARGE_ALLOC_WARN_INTERVAL environment variables.
* doc/README.environment (GC_NO_BLACKLIST_WARNING): Deprecate.
(GC_LARGE_ALLOC_WARN_INTERVAL): Add documentation.
@@ -168,10 +195,10 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
compiling with GCC.
* mark.c (GC_mark_some): We no longer use SEH if
compiling with GCC.
-
+
2002-03-09 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
- * include/gc_priv.h: Define ALIGN_DOUBLE on 32 bit targets if GCJ
+ * include/gc_priv.h: Define ALIGN_DOUBLE on 32 bit targets if GCJ
support is enabled, for hash synchronization.
2002-02-24 Adam Megacz <adam@xwt.org>
@@ -187,8 +214,8 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
2002-02-13 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* dbg_mlc.c (GC_debug_generic_malloc): Removed.
-
- * sparc_mach_dep.S: Rename from sparc_mach_dep.s as it is a
+
+ * sparc_mach_dep.S: Rename from sparc_mach_dep.s as it is a
preprocessor file.
* mips_sgi_mach_dep.S: Likewise.
* Makefile.am: Update for above changes.
@@ -235,7 +262,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
* boehm-gc on win32 now automatically detects if it is being built
as a DLL; see http://gcc.gnu.org/ml/java/2001-12/msg00240.html
-
+
2002-01-25 David Edelsohn <edelsohn@gnu.org>
* include/gc.h (GC_INIT): Add DATASTART and DATAEND roots on AIX.
@@ -256,7 +283,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
2001-12-16 Craig Rodrigues <rodrigc@gcc.gnu.org>
PR other/3725
- * configure.in: Add AC_SUBST(target_alias).
+ * configure.in: Add AC_SUBST(target_alias).
* configure: Regenerated.
2001-11-26 Loren J. Rittle <ljrittle@acm.org>
@@ -304,7 +331,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
* solaris_threads.c (MAX_ORIG_STACK_SIZE) [I386]: Provide special
Solaris 2/Intel definition.
-
+
* configure.in (i?86-*-solaris2.[89]*): Define
SOLARIS25_PROC_VDB_BUG_FIXED.
* include/private/gcconfig.h [I386 && SUNOS5]: Use it.
@@ -489,8 +516,8 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
functions.
* Makefile.in: Rebuilt.
* configure: Rebuilt.
-
- * linux_thread.c (GC_thr_init, GC_suspend_handler): Add SIGABRT to the
+
+ * linux_thread.c (GC_thr_init, GC_suspend_handler): Add SIGABRT to the
list of signals which are not blocked during suspend in the NO_SIGNALS
case.
@@ -517,7 +544,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
2000-09-30 Bryce McKinlay <bryce@albatross.co.nz>
- * configure.in: Define GC_GCJ_SUPPORT. Define NO_DEBUGGING in
+ * configure.in: Define GC_GCJ_SUPPORT. Define NO_DEBUGGING in
cross-compile configuration only.
* Makefile.am: Build gcj_mlc.c.
* configure, Makefile.in: Rebuilt.
@@ -600,7 +627,7 @@ Sun May 19 11:32:03 2002 Mark P Mitchell <mark@codesourcery.com>
Imported version version 5.0alpha6.
* acinclude.m4: Bump version to 5.0a6.
* configure.in: Don't use alpha_mach_dep.s.
- * include/private/config.h, irix_threads.c gc_watcom.asm: Delete
+ * include/private/config.h, irix_threads.c gc_watcom.asm: Delete
obsolete files.
* Makefile.am, Makefile.in: irix_threads.c is now
hpux_irix_threads.c.
@@ -632,7 +659,7 @@ Fri Jan 28 17:13:20 2000 Anthony Green <green@cygnus.com>
1999-12-19 Anthony Green <green@cygnus.com>
- * gcconfig.h: Use libgcj hack for Alpha Linux.
+ * gcconfig.h: Use libgcj hack for Alpha Linux.
Undefine MPROTEXT_VDB (from Jeff Sturm).
* os_dep.c: Remove Alpha Linux hacks.
* misc.c: Ditto.
@@ -829,7 +856,7 @@ Mon Aug 2 23:09:41 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
(LTCOMPILE): Renamed; added libtool invocation.
(LINK): Added libtool invocation.
(.s.o): use LTCOMPILE.
- * configure.in: Call AM_PROG_LIBTOOL.
+ * configure.in: Call AM_PROG_LIBTOOL.
(target_all): Set to libgcjgc.la.
Mention `.lo' forms of object files.
@@ -913,7 +940,7 @@ Mon Aug 2 23:09:41 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* configure.in: likewise
* misc.c (GC_write): add eCos support.
* os_dep.c (tiny_sbrk): add eCos support.
-
+
Thu Dec 10 18:24:34 1998 Warren Levy <warrenl@cygnus.com>
* misc.c (GC_init_inner): Moved STACKBASE code to os_dep.c.
@@ -925,9 +952,9 @@ Thu Dec 10 18:24:34 1998 Warren Levy <warrenl@cygnus.com>
1998-11-20 Andrew Haley <aph@viagra.cygnus.co.uk>
- * Makefile.am, Makefile.in, configure.host: tx39 build option
+ * Makefile.am, Makefile.in, configure.host: tx39 build option
"-G 0" added.
-
+
1998-11-17 Tom Tromey <tromey@cygnus.com>
* configure: Rebuilt.
@@ -1114,4 +1141,3 @@ Wed Apr 15 11:40:56 1998 Tom Tromey <tromey@sanguine.cygnus.com>
* Makefile.am, Makefile.in, configure.in, configure, aclocal.m4:
New files.
* Makefile.orig: Renamed from Makefile.
-
diff --git a/boehm-gc/Makefile.am b/boehm-gc/Makefile.am
index e9e1c6107c6..960cc606fbb 100644
--- a/boehm-gc/Makefile.am
+++ b/boehm-gc/Makefile.am
@@ -144,7 +144,7 @@ distclean-am: distclean-multi
maintainer-clean-am: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/boehm-gc/Makefile.in b/boehm-gc/Makefile.in
index 72eaa74fb89..ab8a7d1c915 100644
--- a/boehm-gc/Makefile.in
+++ b/boehm-gc/Makefile.in
@@ -571,7 +571,7 @@ distclean-am: distclean-multi
maintainer-clean-am: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/boehm-gc/include/private/gc_locks.h b/boehm-gc/include/private/gc_locks.h
index 04d3af986c0..33101f8c2d0 100644
--- a/boehm-gc/include/private/gc_locks.h
+++ b/boehm-gc/include/private/gc_locks.h
@@ -209,6 +209,19 @@
}
# define GC_TEST_AND_SET_DEFINED
# endif /* ARM32 */
+# ifdef S390
+ inline static int GC_test_and_set(volatile unsigned int *addr) {
+ int ret;
+ __asm__ __volatile__ (
+ " l %0,0(%2)\n"
+ "0: cs %0,%1,0(%2)\n"
+ " jl 0b"
+ : "=&d" (ret)
+ : "d" (1), "a" (addr)
+ : "cc", "memory");
+ return ret;
+ }
+# endif
# endif /* __GNUC__ */
# if (defined(ALPHA) && !defined(__GNUC__))
# define GC_test_and_set(addr) __cxx_test_and_set_atomic(addr, 1)
@@ -330,6 +343,27 @@
}
# endif /* 0 */
# endif /* IA64 */
+# if defined(S390)
+# if !defined(GENERIC_COMPARE_AND_SWAP)
+ inline static GC_bool GC_compare_and_exchange(volatile C_word *addr,
+ GC_word old, GC_word new_val)
+ {
+ int retval;
+ __asm__ __volatile__ (
+# ifndef __s390x__
+ " cs %1,%2,0(%3)\n"
+# else
+ " csg %1,%2,0(%3)\n"
+# endif
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=&d" (retval), "+d" (old)
+ : "d" (new_val), "a" (addr)
+ : "cc", "memory");
+ return retval == 0;
+ }
+# endif
+# endif
# if !defined(GENERIC_COMPARE_AND_SWAP)
/* Returns the original value of *addr. */
inline static GC_word GC_atomic_add(volatile GC_word *addr,
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
index 8fd20411f66..33d80d2c8ba 100644
--- a/boehm-gc/include/private/gcconfig.h
+++ b/boehm-gc/include/private/gcconfig.h
@@ -44,7 +44,7 @@
# endif
/* Determine the machine type: */
-# if defined(__XSCALE__)
+# if defined(__arm__) || defined(__thumb__)
# define ARM32
# if !defined(LINUX)
# define NOSYS
@@ -95,8 +95,8 @@
# if defined(nec_ews) || defined(_nec_ews)
# define EWS4800
# endif
-# if !defined(LINUX) && !defined(EWS4800)
-# if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
+# if !defined(LINUX) && !defined(EWS4800) && !defined(NETBSD)
+# if defined(ultrix) || defined(__ultrix)
# define ULTRIX
# else
# if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) \
@@ -107,9 +107,6 @@
# endif
# endif
# endif /* !LINUX */
-# if defined(__NetBSD__) && defined(__MIPSEL__)
-# undef ULTRIX
-# endif
# define mach_type_known
# endif
# if defined(sequent) && (defined(i386) || defined(__i386__))
@@ -373,7 +370,7 @@
# define mach_type_known
# endif
# if defined(__s390__) && defined(LINUX)
-# define S370
+# define S390
# define mach_type_known
# endif
# if defined(__GNU__)
@@ -422,7 +419,8 @@
/* (CX_UX and DGUX) */
/* S370 ==> 370-like machine */
/* running Amdahl UTS4 */
- /* or a 390 running LINUX */
+ /* S390 ==> 390-like machine */
+ /* running LINUX */
/* ARM32 ==> Intel StrongARM */
/* IA64 ==> Intel IPF */
/* (e.g. Itanium) */
@@ -1226,21 +1224,15 @@
# define DATAEND /* not needed */
# endif
# if defined(NETBSD)
- /* This also checked for __MIPSEL__ . Why? NETBSD recognition */
- /* should be handled at the top of the file. */
-# define ALIGNMENT 4
# define OS_TYPE "NETBSD"
+# define ALIGNMENT 4
# define HEURISTIC2
# define USE_GENERIC_PUSH_REGS
-# ifdef __ELF__
- extern int etext[];
-# define DATASTART GC_data_start
-# define NEED_FIND_LIMIT
-# define DYNAMIC_LOADING
-# else
-# define DATASTART ((ptr_t) 0x10000000)
-# define STACKBOTTOM ((ptr_t) 0x7ffff000)
-# endif /* _ELF_ */
+ extern int _fdata[];
+# define DATASTART ((ptr_t)(_fdata))
+ extern int _end[];
+# define DATAEND ((ptr_t)(_end))
+# define DYNAMIC_LOADING
# endif
# endif
@@ -1532,12 +1524,29 @@
# define DATAEND (_end)
# define HEURISTIC2
# endif
+# endif
+
+# ifdef S390
+# define MACH_TYPE "S390"
+# define USE_GENERIC_PUSH_REGS
+# ifndef __s390x__
+# define ALIGNMENT 4
+# define CPP_WORDSZ 32
+# else
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define HBLKSIZE 4096
+# endif
# ifdef LINUX
# define OS_TYPE "LINUX"
-# define HEURISTIC1
+# define LINUX_STACKBOTTOM
# define DYNAMIC_LOADING
extern int __data_start[];
# define DATASTART ((ptr_t)(__data_start))
+ extern int _end[];
+# define DATAEND (_end)
+# define CACHE_LINE_SIZE 256
+# define GETPAGESIZE() 4096
# endif
# endif
@@ -1633,6 +1642,7 @@
# define MACH_TYPE "X86_64"
# define ALIGNMENT 8
# define CPP_WORDSZ 64
+# define HBLKSIZE 4096
# define CACHE_LINE_SIZE 64
# define USE_GENERIC_PUSH_REGS
# ifdef LINUX
diff --git a/boehm-gc/win32_threads.c b/boehm-gc/win32_threads.c
index d5e3920cbe4..9987fc6426f 100644
--- a/boehm-gc/win32_threads.c
+++ b/boehm-gc/win32_threads.c
@@ -134,9 +134,6 @@ void GC_push_all_stacks()
(LPCONTEXT)&thread_table[i].context))
ABORT("GetThreadContext failed");
# ifdef I386
- if (thread_table[i].context.Esp >= (DWORD)thread_table[i].stack
- || thread_table[i].context.Esp < (DWORD)bottom)
- ABORT("Thread stack pointer out of range");
GC_push_one ((word) thread_table[i].context.Edi);
GC_push_one ((word) thread_table[i].context.Esi);
GC_push_one ((word) thread_table[i].context.Ebp);
diff --git a/configure b/configure
index bb45d199751..ae92c322a06 100755
--- a/configure
+++ b/configure
@@ -89,7 +89,7 @@ subdirs=
target_alias=NOTARGET
target_makefile_frag=
undefs=NOUNDEFS
-version="$Revision: 1.45 $"
+version="$Revision: 1.49 $"
x11=default
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
@@ -1356,8 +1356,7 @@ EOF
rm -f ${subdir}/Makefile.tm2
sedtemp=sed.$$
cat >$sedtemp <<EOF
-s:^SUBDIRS[ ]*=.*$:SUBDIRS = ${configdirs}:
-s:^NONSUBDIRS[ ]*=.*$:NONSUBDIRS = ${noconfigdirs}:
+s:@configdirs@:${configdirs}:
EOF
sed -f $sedtemp \
${subdir}/Makefile.tem > ${subdir}/Makefile.tm2
@@ -1365,21 +1364,21 @@ EOF
rm -f ${subdir}/Makefile.tem
mv ${subdir}/Makefile.tm2 ${subdir}/Makefile.tem
fi
- sed -e "s|^prefix[ ]*=.*$|prefix = ${prefix}|" \
- -e "s|^exec_prefix[ ]*=.*$|exec_prefix = ${exec_prefix}|" \
- -e "s|^bindir[ ]*=.*$|bindir = ${bindir}|" \
- -e "s|^sbindir[ ]*=.*$|sbindir = ${sbindir}|" \
- -e "s|^libexecdir[ ]*=.*$|libexecdir = ${libexecdir}|" \
- -e "s|^datadir[ ]*=.*$|datadir = ${datadir}|" \
- -e "s|^sysconfdir[ ]*=.*$|sysconfdir = ${sysconfdir}|" \
- -e "s|^sharedstatedir[ ]*=.*$|sharedstatedir = ${sharedstatedir}|" \
- -e "s|^localstatedir[ ]*=.*$|localstatedir = ${localstatedir}|" \
- -e "s|^libdir[ ]*=.*$|libdir = ${libdir}|" \
- -e "s|^includedir[ ]*=.*$|includedir = ${includedir}|" \
- -e "s|^oldincludedir[ ]*=.*$|oldincludedir = ${oldincludedir}|" \
- -e "s|^infodir[ ]*=.*$|infodir = ${infodir}|" \
- -e "s|^mandir[ ]*=.*$|mandir = ${mandir}|" \
- -e "s|^ALL_BUILD_MODULES =.*|ALL_BUILD_MODULES =${all_build_modules}|" \
+ sed -e "s|@prefix@|${prefix}|" \
+ -e "s|@exec_prefix@|${exec_prefix}|" \
+ -e "s|@bindir@|${bindir}|" \
+ -e "s|@sbindir@|${sbindir}|" \
+ -e "s|@libexecdir@|${libexecdir}|" \
+ -e "s|@datadir@|${datadir}|" \
+ -e "s|@sysconfdir@|${sysconfdir}|" \
+ -e "s|@sharedstatedir@|${sharedstatedir}|" \
+ -e "s|@localstatedir@|${localstatedir}|" \
+ -e "s|@libdir@|${libdir}|" \
+ -e "s|@includedir@|${includedir}|" \
+ -e "s|@oldincludedir@|${oldincludedir}|" \
+ -e "s|@infodir@|${infodir}|" \
+ -e "s|@mandir@|${mandir}|" \
+ -e "s|@all_build_modules@|${all_build_modules}|" \
-e "/^CC[ ]*=/{
:loop1
/\\\\$/ N
@@ -1408,20 +1407,18 @@ EOF
t loop4
s%^CXXFLAGS[ ]*=.*$%CXXFLAGS = ${CXXFLAGS}%
}" \
- -e "s|^SHELL[ ]*=.*$|SHELL = ${config_shell}|" \
- -e "s|^srcdir[ ]*=.*$|srcdir = ${makesrcdir}|" \
+ -e "s|@config_shell@|${config_shell}|" \
+ -e "s|@srcdir@|${makesrcdir}|" \
-e "s/ //" \
- -e "s:^program_prefix[ ]*=.*$:program_prefix = ${program_prefix}:" \
- -e "s:^program_suffix[ ]*=.*$:program_suffix = ${program_suffix}:" \
- -e "s:^program_transform_name[ ]*=.*$:program_transform_name = ${program_transform_name}:" \
- -e "s|^tooldir[ ]*=.*$|tooldir = ${tooldir}|" \
- -e "s|^build_tooldir[ ]*=.*$|build_tooldir = ${tooldir}|" \
- -e "s:^DEFAULT_YACC[ ]*=.*$:DEFAULT_YACC = ${DEFAULT_YACC}:" \
- -e "s:^DEFAULT_LEX[ ]*=.*$:DEFAULT_LEX = ${DEFAULT_LEX}:" \
- -e "s:^DEFAULT_M4[ ]*=.*$:DEFAULT_M4 = ${DEFAULT_M4}:" \
+ -e "s:@program_transform_name@:${program_transform_name}:" \
+ -e "s|@tooldir@|${tooldir}|" \
+ -e "s|@build_tooldir@|${tooldir}|" \
+ -e "s:@DEFAULT_YACC@:${DEFAULT_YACC}:" \
+ -e "s:@DEFAULT_LEX@:${DEFAULT_LEX}:" \
+ -e "s:@DEFAULT_M4@:${DEFAULT_M4}:" \
${subdir}/Makefile.tem >> ${Makefile}
- sed -e "s:^GDB_TK[ ]*=.*$:GDB_TK = ${GDB_TK}:" ${Makefile} >${Makefile}.tem
+ sed -e "s:@GDB_TK@:${GDB_TK}:" ${Makefile} >${Makefile}.tem
mv -f ${Makefile}.tem ${Makefile}
# If this is a Canadian Cross, preset the values of many more
diff --git a/configure.in b/configure.in
index a945dcb2432..87dd2c6dc41 100644
--- a/configure.in
+++ b/configure.in
@@ -80,22 +80,6 @@ target_tools="target-examples target-groff target-gperf"
################################################################################
-## These two lists are of directories that are to be removed from the
-## ${configdirs} list for either cross-compilations or for native-
-## compilations. For example, it doesn't make that much sense to
-## cross-compile Emacs, nor is it terribly useful to compile target-libiberty in
-## a native environment.
-
-# directories to be built in the native environment only
-#
-# This must be a single line because of the way it is searched by grep in
-# the code below.
-native_only="autoconf automake libtool fileutils find gawk gettext grep gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms snavigator gnuserv target-gperf"
-
-# directories to be built in a cross environment only
-#
-cross_only="target-libgloss target-newlib target-opcodes"
-
## All tools belong in one of the four categories, and are assigned above
## We assign ${configdirs} this way to remove all embedded newlines. This
## is important because configure will choke if they ever get through.
@@ -184,8 +168,12 @@ case ${with_x} in
esac
# Some tools are only suitable for building in a "native" situation.
-# Remove these if host!=target. Similarly, some are only suitable
-# for cross toolchains; remove if host=target.
+# Remove these if host!=target.
+native_only="autoconf automake libtool fileutils find gawk gettext grep gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms snavigator gnuserv target-gperf"
+
+# Similarly, some are only suitable for cross toolchains.
+# Remove these if host=target.
+cross_only="target-libgloss target-newlib target-opcodes"
case $is_cross_compiler in
no) skipdirs="${skipdirs} ${cross_only}" ;;
@@ -277,7 +265,7 @@ case "${target}" in
;;
*-*-netbsd*)
# Skip some stuff on all NetBSD configurations.
- skipdirs="$skipdirs target-newlib target-libiberty target-libgloss"
+ noconfigdirs="$noconfigdirs target-newlib target-libiberty target-libgloss"
# Skip some stuff that's unsupported on some NetBSD configurations.
case "${target}" in
@@ -333,7 +321,7 @@ case "${target}" in
noconfigdirs="$noconfigdirs expect dejagnu"
# the C++ libraries don't build on top of CE's C libraries
noconfigdirs="$noconfigdirs ${libstdcxx_version}"
- skipdirs="$skipdirs target-newlib"
+ noconfigdirs="$noconfigdirs target-newlib"
case "${host}" in
*-*-cygwin*) ;; # keep gdb and readline
*) noconfigdirs="$noconfigdirs gdb readline ${libstdcxx_version}"
@@ -343,6 +331,12 @@ case "${target}" in
arc-*-*)
noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
;;
+ arm-*-coff | strongarm-*-coff | xscale-*-coff)
+ noconfigdirs="$noconfigdirs ${libgcj}"
+ ;;
+ arm-*-elf* | strongarm-*-elf* | xscale-*-elf*)
+ noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+ ;;
arm-*-pe*)
noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
;;
@@ -358,18 +352,6 @@ case "${target}" in
thumb-*-oabi)
noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
;;
- strongarm-*-elf)
- noconfigdirs="$noconfigdirs ${libgcj}"
- ;;
- strongarm-*-coff)
- noconfigdirs="$noconfigdirs ${libgcj}"
- ;;
- xscale-*-elf)
- noconfigdirs="$noconfigdirs target-libffi target-qthreads"
- ;;
- xscale-*-coff)
- noconfigdirs="$noconfigdirs ${libgcj}"
- ;;
thumb-*-pe)
noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
;;
@@ -379,7 +361,7 @@ case "${target}" in
avr-*-*)
noconfigdirs="$noconfigdirs target-libiberty ${libstdcxx_version} ${libgcj}"
;;
- c4x-*-*)
+ c4x-*-* | tic4x-*-*)
noconfigdirs="$noconfigdirs ${libstdcxx_version} target-libgloss ${libgcj}"
;;
c54x*-*-* | tic54x-*-*)
@@ -439,10 +421,6 @@ case "${target}" in
i[34567]86-*-freebsd*)
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
;;
- s390*-*-linux*)
- # The libffi port is not yet in the GCC tree
- noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
- ;;
i[3456]86-*-linux*)
# This section makes it possible to build newlib natively on linux.
# If we are using a cross compiler then don't configure newlib.
@@ -539,6 +517,9 @@ case "${target}" in
powerpc-*-beos*)
noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss ${libgcj}"
;;
+ powerpc-*-darwin*)
+ noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb tk itcl tix libgui gprof ${libgcj}"
+ ;;
powerpc-*-eabi)
noconfigdirs="$noconfigdirs ${libgcj}"
;;
@@ -755,8 +736,7 @@ for dir in . $skipdirs $noconfigdirs ; do
dirname=`echo $dir | sed -e s/target-//g`
if test $dir != . && echo " ${configdirs} " | grep " ${dir} " >/dev/null 2>&1; then
configdirs=`echo " ${configdirs} " | sed -e "s/ ${dir} / /"`
- if test -r $srcdir/$dirname/configure \
- || test -r $srcdir/$dirname/configure.in ; then
+ if test -r $srcdir/$dirname/configure ; then
if echo " ${skipdirs} " | grep " ${dir} " >/dev/null 2>&1; then
true
else
@@ -766,8 +746,7 @@ for dir in . $skipdirs $noconfigdirs ; do
fi
if test $dir != . && echo " ${target_configdirs} " | grep " ${dir} " >/dev/null 2>&1; then
target_configdirs=`echo " ${target_configdirs} " | sed -e "s/ ${dir} / /"`
- if test -r $srcdir/$dirname/configure \
- || test -r $srcdir/$dirname/configure.in ; then
+ if test -r $srcdir/$dirname/configure ; then
if echo " ${skipdirs} " | grep " ${dir} " >/dev/null 2>&1; then
true
else
@@ -783,7 +762,7 @@ if test -n "${target_configdirs}" ; then
others=
for i in `echo ${target_configdirs} | sed -e s/target-//g` ; do
if test "$i" != "libiberty" ; then
- if test -r $srcdir/$i/configure || test -r $srcdir/$i/configure.in ; then
+ if test -r $srcdir/$i/configure ; then
others=yes;
break;
fi
@@ -876,36 +855,41 @@ esac
copy_dirs=
-# Handle --with-headers=XXX. The contents of the named directory are
-# copied to $(tooldir)/sys-include.
+# Handle --with-headers=XXX. If the value is not "yes", the contents of
+# the named directory are copied to $(tooldir)/sys-include.
if test x"${with_headers}" != x ; then
if test x${is_cross_compiler} = xno ; then
echo 1>&2 '***' --with-headers is only supported when cross compiling
exit 1
fi
- case "${exec_prefixoption}" in
- "") x=${prefix} ;;
- *) x=${exec_prefix} ;;
- esac
- copy_dirs="${copy_dirs} ${with_headers} $x/${target_alias}/sys-include"
+ if test x"${with_headers}" != xyes ; then
+ case "${exec_prefixoption}" in
+ "") x=${prefix} ;;
+ *) x=${exec_prefix} ;;
+ esac
+ copy_dirs="${copy_dirs} ${with_headers} $x/${target_alias}/sys-include"
+ fi
fi
-# Handle --with-libs=XXX. Multiple directories are permitted. The
-# contents are copied to $(tooldir)/lib.
+# Handle --with-libs=XXX. If the value is not "yes", the contents of
+# the name directories are copied to $(tooldir)/lib. Multiple directories
+# are permitted.
if test x"${with_libs}" != x ; then
if test x${is_cross_compiler} = xno ; then
echo 1>&2 '***' --with-libs is only supported when cross compiling
exit 1
fi
- # Copy the libraries in reverse order, so that files in the first named
- # library override files in subsequent libraries.
- case "${exec_prefixoption}" in
- "") x=${prefix} ;;
- *) x=${exec_prefix} ;;
- esac
- for l in ${with_libs}; do
- copy_dirs="$l $x/${target_alias}/lib ${copy_dirs}"
- done
+ if test x"${with_libs}" != xyes ; then
+ # Copy the libraries in reverse order, so that files in the first named
+ # library override files in subsequent libraries.
+ case "${exec_prefixoption}" in
+ "") x=${prefix} ;;
+ *) x=${exec_prefix} ;;
+ esac
+ for l in ${with_libs}; do
+ copy_dirs="$l $x/${target_alias}/lib ${copy_dirs}"
+ done
+ fi
fi
# Handle ${copy_dirs}
@@ -1127,25 +1111,6 @@ if test -n "${host_makefile_frag}" ; then
host_makefile_frag=mh-frag
fi
-# If we aren't going to be using gcc, see if we can extract a definition
-# of CC from the fragment.
-# Actually, use the 'pre-extracted' version above.
-if test -z "${CC}" && test "${build}" = "${host}" ; then
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
- found=
- for dir in $PATH; do
- test -z "$dir" && dir=.
- if test -f $dir/gcc; then
- found=yes
- break
- fi
- done
- IFS="$save_ifs"
- if test -z "${found}" && test -n "${tentative_cc}" ; then
- CC=$tentative_cc
- fi
-fi
-
case "${target}" in
v810*)
target_makefile_frag="config/mt-v810"
@@ -1282,6 +1247,25 @@ case "${host}" in
;;
esac
+# If we aren't going to be using gcc, see if we can extract a definition
+# of CC from the fragment.
+# Actually, use the 'pre-extracted' version above.
+if test -z "${CC}" && test "${build}" = "${host}" ; then
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
+ found=
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/gcc; then
+ found=yes
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ if test -z "${found}" && test -n "${tentative_cc}" ; then
+ CC=$tentative_cc
+ fi
+fi
+
# post-target:
# Make sure that the compiler is able to generate an executable. If it
@@ -1337,20 +1321,23 @@ esac
# If --enable-shared was set, we must set LD_LIBRARY_PATH so that the
# binutils tools will find libbfd.so.
if test "${shared}" = "yes" ; then
- sed -e 's/^SET_LIB_PATH[ ]*=.*$/SET_LIB_PATH = $(REALLY_SET_LIB_PATH)/' \
- Makefile > Makefile.tem
- rm -f Makefile
- mv -f Makefile.tem Makefile
-
- case "${host}" in
- *-*-hpux*)
- sed -e 's/^RPATH_ENVVAR[ ]*=.*$/RPATH_ENVVAR = SHLIB_PATH/' \
- Makefile > Makefile.tem
- rm -f Makefile
- mv -f Makefile.tem Makefile
- ;;
- esac
+ SET_LIB_PATH="\$(REALLY_SET_LIB_PATH)"
+else
+ SET_LIB_PATH=
fi
+sed -e "s/@SET_LIB_PATH@/${SET_LIB_PATH}/" Makefile > Makefile.tem
+rm -f Makefile
+mv -f Makefile.tem Makefile
+
+
+case "${host}" in
+ *-*-hpux*) RPATH_ENVVAR=SHLIB_PATH ;;
+ *) RPATH_ENVVAR=LD_LIBRARY_PATH ;;
+esac
+sed -e "s/@RPATH_ENVVAR@/${RPATH_ENVVAR}/" Makefile > Makefile.tem
+rm -f Makefile
+mv -f Makefile.tem Makefile
+
# Base args. Strip norecursion, cache-file, srcdir, host, build, target.
# These are the ones we might not want to pass down to subconfigures.
@@ -1551,17 +1538,17 @@ qqCXX_FOR_TARGET=`echo "$qCXX_FOR_TARGET" | sed -e 's,[$][$],$$$$,g'`
sedtemp=sed.$$
cat >$sedtemp <<EOF
-s:^TARGET_CONFIGDIRS[ ]*=.*$:TARGET_CONFIGDIRS = ${target_configdirs}:
-s%^TARGET_CONFIGARGS[ ]*=.*$%TARGET_CONFIGARGS = ${targargs}%
-s%^FLAGS_FOR_TARGET[ ]*=.*$%FLAGS_FOR_TARGET = ${FLAGS_FOR_TARGET}%
-s%^CC_FOR_TARGET[ ]*=.*$%CC_FOR_TARGET = \$(STAGE_CC_WRAPPER) ${CC_FOR_TARGET}%
-s%^GCJ_FOR_TARGET[ ]*=.*$%GCJ_FOR_TARGET = \$(STAGE_CC_WRAPPER) ${GCJ_FOR_TARGET}%
-s%^CXX_FOR_TARGET[ ]*=.*$%CXX_FOR_TARGET = \$(STAGE_CC_WRAPPER) ${qCXX_FOR_TARGET}%
-s%^CXX_FOR_TARGET_FOR_RECURSIVE_MAKE[ ]*=.*$%CXX_FOR_TARGET_FOR_RECURSIVE_MAKE = \$(STAGE_CC_WRAPPER) ${qqCXX_FOR_TARGET}%
-s%^TARGET_SUBDIR[ ]*=.*$%TARGET_SUBDIR = ${target_subdir}%
-s%^BUILD_SUBDIR[ ]*=.*$%BUILD_SUBDIR = ${build_subdir}%
-s%^BUILD_CONFIGARGS[ ]*=.*$%BUILD_CONFIGARGS = ${buildargs}%
-s%^gxx_include_dir[ ]*=.*$%gxx_include_dir=${gxx_include_dir}%
+s:@target_configdirs@:${target_configdirs}:
+s%@target_configargs@%${targargs}%
+s%@FLAGS_FOR_TARGET@%${FLAGS_FOR_TARGET}%
+s%@CC_FOR_TARGET@%\$(STAGE_CC_WRAPPER) ${CC_FOR_TARGET}%
+s%@GCJ_FOR_TARGET@%\$(STAGE_CC_WRAPPER) ${GCJ_FOR_TARGET}%
+s%@CXX_FOR_TARGET@%\$(STAGE_CC_WRAPPER) ${qCXX_FOR_TARGET}%
+s%@CXX_FOR_TARGET_FOR_RECURSIVE_MAKE@%\$(STAGE_CC_WRAPPER) ${qqCXX_FOR_TARGET}%
+s%@target_subdir@%${target_subdir}%
+s%@build_subdir@%${build_subdir}%
+s%@build_configargs@%${buildargs}%
+s%@gxx_include_dir@%${gxx_include_dir}%
EOF
sed -f $sedtemp Makefile > Makefile.tem
rm -f Makefile $sedtemp
diff --git a/contrib/ChangeLog b/contrib/ChangeLog
index 2dbf3a52561..c28fd46ad55 100644
--- a/contrib/ChangeLog
+++ b/contrib/ChangeLog
@@ -1,3 +1,21 @@
+2002-10-16 Richard Henderson <rth@redhat.com>
+
+ * paranoia.cc (ENUM_BITFIELD): New.
+ (class): Define as klass around real.h.
+ (real_c_float): Not a template any longer; define MODE as a
+ class static constant; use real_format elements for SIZE.
+ Update uses of real_to_decimal and real_to_hexadecimal.
+ (main): Change -g argument to use a format name.
+ (mode_for_size): Remove.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * paranoia.cc: New file.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * enquire.c: Remove.
+
2002-08-14 Mark Mitchell <mark@codesourcery.com>
* gennews (files): Add GCC 3.2 files.
diff --git a/contrib/enquire.c b/contrib/enquire.c
deleted file mode 100644
index 8b4bdda3d52..00000000000
--- a/contrib/enquire.c
+++ /dev/null
@@ -1,2887 +0,0 @@
-/* Everything you wanted to know about your machine and C compiler,
- but didn't know who to ask. */
-
-#ifndef VERSION
-#define VERSION "4.3"
-#endif
-
-/* Author: Steven Pemberton, CWI, Amsterdam; steven@cwi.nl
- Bugfixes and upgrades gratefully received.
-
- Copyright (c) 1988, 1989, 1990 Steven Pemberton, CWI, Amsterdam.
- All rights reserved.
-
- Changes by Richard Stallman:
- Undef CHAR_BIT, etc., if defined in stdio.h, Richard Stallman, Aug 90.
- In EPROP, avoid a <= old if bad is set, Richard Stallman, May 91.
- Use gstddef.h, not stddef.h, Richard Stallman, Nov 91.
- Don't declare malloc, instead cast the value, Richard Stallman, Nov 91.
- Include sys/types.h before signal.h, Apr 92.
- Support NO_LONG_DOUBLE_IO in f_define and f_rep; new fn fake_f_rep, Apr 92.
- Enclose -f output in #ifndef _FLOAT_H___, Richard Stallman, May 92.
-
- Change by Jim Wilson:
- Add #undef before every #define, Dec 92.
- Use stddef.h not gstddef.h, Mar 94.
-
- Changes by Paul Eggert, installed Feb 93:
- (fake_f_rep): Clear all of u, initially. Make the ints in u unsigned.
- (f_define): Use ordinary constants for long double
- if it's same width as double. Make __convert_long_double_i unsigned.
- Richard Stallman, May 93:
- In F_check, check NO_LONG_DOUBLE_IO.
-
- Changes by Stephen Moshier, installed Sep 93:
- (FPROP): Recognize 80387 or 68881 XFmode format.
-
- Change by Manfred Hollstein, installed Mar 98:
- (bitpattern): Change type of variable i to unsigned int.
-
-
- COMPILING
- With luck and a following wind, just the following will work:
- cc enquire.c -o enquire
- You may get some messages about unreachable code, which you can ignore.
-
- If your compiler doesn't support: add flag:
- signed char (eg pcc) -DNO_SC
- unsigned char -DNO_UC
- unsigned short and long -DNO_UI
- void -DNO_VOID
- signal(), or setjmp/longjmp() -DNO_SIG
- %Lf in printf -DNO_LONG_DOUBLE_IO
-
- Try to compile first with no flags, and see if you get any errors -
- you might be surprised. (Most non-ANSI compilers need -DNO_SC, though.)
- Some compilers need a -f flag for floating point.
-
- Don't use any optimisation flags: the program may not work if you do.
- Though "while (a+1.0-a-1.0 == 0.0)" may look like "while(1)" to an
- optimiser, to a floating-point unit there's a world of difference.
-
- Some compilers offer various flags for different floating point
- modes; it's worth trying all possible combinations of these.
-
- Add -DID=\"name\" if you want the machine/flags identified in the output.
-
- FAULTY COMPILERS
- Because of bugs and/or inadequacies, some compilers need the following
- defines:
-
- If your C preprocessor doesn't have the predefined __FILE__ macro, and
- you don't want to call this file enquire.c but, say, tell.c, add the
- flag -DFILENAME=\"tell.c\" .
-
- Some compilers won't accept the line "#include FILENAME".
- Add flag -DNO_FILE. In that case, this file *must* be called enquire.c.
-
- Some compilers can't cope with "#ifdef __FILE__". Use -DFILENAME=
- or -DNO_FILE as above.
-
- Some naughty compilers define __STDC__, but don't really support it.
- Some define it as 0, in which case we treat it as undefined.
- But if your compiler defines it, and isn't really ANSI C,
- add flag -DNO_STDC. (To those compiler writers: for shame).
-
- Some naughty compilers define __STDC__, but don't have the stddef.h
- include file. Add flag -DNO_STDDEF.
-
- Summary of naughty-compiler flags:
- If your compiler doesn't support: add flag:
- __FILE__ (and you changed the filename) -DFILENAME=\"name.c\"
- #ifdef __FILE__ -DNO_FILE or -DFILENAME=...
- #include FILENAME -DNO_FILE
- __STDC__ (properly) -DNO_STDC
- stddef.h -DNO_STDDEF
-
- Some systems crash when you try to malloc all store. To save users of
- such defective systems too much grief, they may compile with -DNO_MEM,
- which ignores that bit of the code.
-
- While it is not our policy to support defective compilers, pity has been
- taken on people with compilers that can't produce object files bigger than
- 32k (especially since it was an easy addition). Compile the program
- into separate parts like this:
- cc -DSEP -DPASS0 -o p0.o <other flags> enquire.c
- cc -DSEP -DPASS1 -o p1.o <other flags> enquire.c
- cc -DSEP -DPASS2 -o p2.o <other flags> enquire.c
- cc -DSEP -DPASS3 -o p3.o <other flags> enquire.c
- cc -o enquire p0.o p1.o p2.o p3.o
-
- SYSTEM DEPENDENCIES
- You may possibly need to add some calls to signal() for other sorts of
- exception on your machine than SIGFPE, and SIGOVER. See lines beginning
- #ifdef SIGxxx in main() (and communicate the differences to me!).
-
- OUTPUT
- Run without argument to get the information as English text. If run
- with argument -l (e.g. enquire -l), output is a series of #define's for
- the ANSI standard limits.h include file, excluding MB_MAX_CHAR. If run
- with argument -f, output is a series of #define's for the ANSI standard
- float.h include file (according to ANSI C Draft of Dec 7, 1988).
- Flag -v gives verbose output: output includes the English text above
- as C comments. The program exit(0)'s if everything went ok, otherwise
- it exits with a positive number, telling how many problems there were.
-
- VERIFYING THE COMPILER
- If, having produced the float.h and limits.h header files, you want to
- verify that the compiler reads them back correctly (there are a lot of
- boundary cases, of course, like minimum and maximum numbers), you can
- recompile enquire.c with -DVERIFY set (plus the other flags that you used
- when compiling the version that produced the header files). This then
- recompiles the program so that it #includes "limits.h" and "float.h",
- and checks that the constants it finds there are the same as the
- constants it produces. Run the resulting program with enquire -fl.
- Very few compilers have passed without error.
- NB: You *must* recompile with the same compiler and flags, otherwise
- you may get odd results.
-
- You can also use this option if your compiler already has both files,
- and you want to confirm that this program produces the right results.
-
- TROUBLESHOOTING.
- This program is now quite trustworthy, and suspicious and wrong output
- may well be caused by bugs in the compiler, not in the program (however
- of course, this is not guaranteed, and no responsibility can be
- accepted, etc.)
-
- The program only works if overflows are ignored by the C system or
- are catchable with signal().
-
- If the program fails to run to completion (often with the error message
- "Unexpected signal at point x"), this often turns out to be a bug in the
- C compiler's run-time system. Check what was about to be printed, and
- try to narrow the problem down.
-
- Another possible problem is that you have compiled the program to produce
- loss-of-precision arithmetic traps. The program cannot cope with these,
- and you should re-compile without them. (They should never be the default).
-
- Make sure you compiled with optimisation turned off.
-
- Output preceded by *** WARNING: identifies behaviour of the C system
- deemed incorrect by the program. Likely problems are that printf or
- scanf don't cope properly with certain boundary numbers: this program
- goes to a lot of trouble to calculate its values, and these values
- are mostly boundary numbers. Experience has shown that often printf
- cannot cope with these values, and so in an attempt to increase
- confidence in the output, for each float and double that is printed,
- the printed value is checked by using sscanf to read it back.
- Care is taken that numbers are printed with enough digits to uniquely
- identify them, and therefore that they can be read back identically.
- If the number read back is different, then there is probably a bug in
- printf or sscanf, and the program prints the warning message.
- If the two numbers in the warning look identical, then printf is more
- than likely rounding the last digit(s) incorrectly. To put you at ease
- that the two really are different, the bit patterns of the two numbers
- are also printed. The difference is very likely in the last bit.
- Many scanf's read the minimum double back as 0.0, and similarly cause
- overflow when reading the maximum double. This program quite ruthlessly
- declares all these behaviours faulty. The point is that if you get
- one of these warnings, the output may be wrong, so you should check
- the result carefully if you intend to use the results. Of course, printf
- and sscanf may both be wrong, and cancel each other out, so you should
- check the output carefully anyway.
-
- The warning that "a cast didn't work" refers to cases like this:
-
- float f;
- #define C 1.234567890123456789
- f= C;
- if (f != (float) C) printf ("Wrong!");
-
- A faulty compiler will widen f to double and ignore the cast to float,
- and because there is more accuracy in a double than a float, fail to
- recognise that they are the same. In the actual case in point, f and C
- are passed as parameters to a function that discovers they are not equal,
- so it's just possible that the error was in the parameter passing,
- not in the cast (see function Validate()).
- For ANSI C, which has float constants, the error message is "constant has
- wrong precision".
-
- REPORTING PROBLEMS
- If the program doesn't work for you for any reason that can't be
- narrowed down to a problem in the C compiler, or it has to be changed in
- order to get it to compile, or it produces suspicious output (like a very
- low maximum float, for instance), please mail the problem and an example
- of the incorrect output to steven@cwi.nl or ..!hp4nl!cwi.nl!steven, so that
- improvements can be worked into future versions; cwi.nl is the European
- backbone, and is connected to uunet and other fine hosts.
-
- The program tries to catch and diagnose bugs in the compiler/run-time
- system. I would be especially pleased to have reports of failures so
- that I can improve this service.
-
- I apologise unreservedly for the contorted use of the preprocessor...
-
- THE SMALL PRINT
- You may copy and distribute verbatim copies of this source file.
-
- You may modify this source file, and copy and distribute such
- modified versions, provided that you leave the copyright notice
- at the top of the file and also cause the modified file to carry
- prominent notices stating that you changed the files and the date
- of any change; and cause the whole of any work that you distribute
- or publish, that in whole or in part contains or is a derivative of
- this program or any part thereof, to be licensed at no charge to
- all third parties on terms identical to those here.
-
- If you do have a fix to any problem, please send it to me, so that
- other people can have the benefits.
-
- While every effort has been taken to make this program as reliable as
- possible, no responsibility can be taken for the correctness of the
- output, nor suitability for any particular use.
-
- This program is an offshoot of a project funded by public funds.
- If you use this program for research or commercial use (i.e. more
- than just for the fun of knowing about your compiler) mailing a short
- note of acknowledgement may help keep enquire.c supported.
-
- ACKNOWLEDGEMENTS
- Many people have given time and ideas to making this program what it is.
- To all of them thanks, and apologies for not mentioning them by name.
-
- HISTORY
- Originally started as a program to generate configuration constants
- for a large piece of software we were writing, which later took on
- a life of its own...
- 1.0 Length 6658!; end 1984?
- Unix only. Only printed a dozen maximum int/double values.
- 2.0 Length 10535; Spring 1985
- Prints values as #defines (about 20 of them)
- More extensive floating point, using Cody and Waite
- Handles signals better
- Programs around optimisations
- Handles Cybers
- 3.0 Length 12648; Aug 1987; prints about 42 values
- Added PASS stuff, so treats float as well as double
- 4.0 Length 33891; Feb 1989; prints around 85 values
- First GNU version (for gcc, where they call it hard-params.c)
- Generates float.h and limits.h files
- Handles long double
- Generates warnings for dubious output
- 4.1 Length 47738; April 1989
- Added VERIFY and TEST
- 4.2 Length 63442; Feb 1990
- Added SEP
- Fixed eps/epsneg
- Added check for pseudo-unsigned chars
- Added description for each #define output
- Added check for absence of defines during verify
- Added prototypes
- Added NO_STDC and NO_FILE
- Fixed alignments output
- 4.3 Length 75000; Oct 1990; around 114 lines of output
- Function xmalloc defined, Richard Stallman, June 89.
- Alignments computed from member offsets rather than structure sizes,
- Richard Stallman, Oct 89.
- Print whether char* and int* pointers have the same format;
- also char * and function *.
- Update to Draft C version Dec 7, 1988
- - types of constants produced in limits.h
- (whether to put a U after unsigned shorts and chars and
- whether to output -1024 as (-1023-1))
- - values of SCHAR_MIN/MAX
- - values of *_EPSILON (not the smallest but the effective smallest)
- Added FILENAME, since standard C doesn't allow #define __FILE__
- Renamed from config.c to enquire.c
- Added size_t and ptrdiff_t enquiries
- Added promotion enquiries
- Added type checks of #defines
- Added NO_STDDEF
- Changed endian to allow for cases where not all bits are used
- Sanity check for max integrals
- Fixed definition of setjmp for -DNO_SIG
- Moved #define ... 0.0L inside #ifdef STDC, in case some cpp's tokenize
- Added NO_MEM
-*/
-
-/* Set FILENAME to the name of this file */
-#ifndef FILENAME
-#ifdef NO_FILE
-#define FILENAME "enquire.c"
-#else
-#ifdef __FILE__ /* It's a compiler bug if this fails. Compile with -DNO_FILE */
-#define FILENAME __FILE__
-#else
-#define FILENAME "enquire.c"
-#endif /* __FILE__ */
-#endif /* NO_FILE */
-#endif /* FILENAME */
-
-/* If PASS isn't defined, then this is the first pass over this file. */
-#ifndef PASS
-#ifndef SEP
-#define PASS 1
-#define PASS0 1
-#define PASS1 1
-#endif /* SEP */
-
-/* A description of the ANSI constants */
-#define D_CHAR_BIT "Number of bits in a storage unit"
-#define D_CHAR_MAX "Maximum char"
-#define D_CHAR_MIN "Minimum char"
-#define D_SCHAR_MAX "Maximum signed char"
-#define D_SCHAR_MIN "Minimum signed char"
-#define D_UCHAR_MAX "Maximum unsigned char (minimum is always 0)"
-
-#define D_INT_MAX "Maximum %s"
-#define D_INT_MIN "Minimum %s"
-#define D_UINT_MAX "Maximum unsigned %s (minimum is always 0)"
-
-#define D_FLT_ROUNDS "Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown"
-#define D_FLT_RADIX "Radix of exponent representation"
-#define D_MANT_DIG "Number of base-FLT_RADIX digits in the significand of a %s"
-#define D_DIG "Number of decimal digits of precision in a %s"
-#define D_MIN_EXP "Minimum int x such that FLT_RADIX**(x-1) is a normalised %s"
-#define D_MIN_10_EXP "Minimum int x such that 10**x is a normalised %s"
-#define D_MAX_EXP "Maximum int x such that FLT_RADIX**(x-1) is a representable %s"
-#define D_MAX_10_EXP "Maximum int x such that 10**x is a representable %s"
-#define D_MAX "Maximum %s"
-#define D_EPSILON "Difference between 1.0 and the minimum %s greater than 1.0"
-#define D_MIN "Minimum normalised %s"
-
-/* Procedure just marks the functions that don't return a result */
-#ifdef NO_VOID
-#define Procedure int
-#else
-#define Procedure void
-#endif
-
-/* Some bad compilers define __STDC__, when they don't support it.
- Compile with -DNO_STDC to get round this.
-*/
-#ifndef NO_STDC
-#ifdef __STDC__
-#if __STDC__ /* If __STDC__ is 0, assume it isn't supported */
-#define STDC
-#endif
-#endif
-#endif
-
-/* Stuff different for ANSI C, and old C:
- ARGS and NOARGS are used for function prototypes.
- Volatile is used to reduce the chance of optimisation,
- and to prevent variables being put in registers (when setjmp/longjmp
- wouldn't work as we want)
- Long_double is the longest floating point type available.
- stdc is used in tests like "if (stdc)", which is less ugly than #ifdef.
- U is output after unsigned constants.
- */
-#ifdef STDC
-
-#define ARGS(x) x
-#define NOARGS (void)
-#define Volatile volatile
-#define Long_double long double
-#define stdc 1
-#define U "U"
-
-#else /* Old style C */
-
-#define ARGS(x) ()
-#define NOARGS ()
-#define Volatile static
-#define Long_double double
-#define stdc 0
-#define U ""
-
-#endif /* STDC */
-
-/* include files */
-/* Stdio.h might include limits.h, and limits.h might include float.h, and
- float.h is probably the float.h put together by the gcc makefile to
- cause errors. We use our special define to assure float.h that we don't
- really need it. */
-#define __GCC_FLOAT_NOT_NEEDED
-#include <stdio.h>
-
-#ifdef STDC
-#ifndef NO_STDDEF
-#include <stddef.h> /* for size_t: if this fails, define NO_STDDEF */
-#endif
-#endif
-
-#ifdef NO_SIG
-#define jmp_buf int
-#else
-#include <sys/types.h>
-#include <signal.h>
-#include <setjmp.h>
-#endif
-
-/* Kludge around the possibility that <stdio.h> includes <limits.h> */
-#ifdef CHAR_BIT
-#undef CHAR_BIT
-#undef CHAR_MAX
-#undef CHAR_MIN
-#undef SCHAR_MAX
-#undef SCHAR_MIN
-#undef UCHAR_MAX
-#undef UCHAR_MIN
-#endif
-
-#ifdef VERIFY
-#include "limits.h"
-#endif
-
-#ifndef SYS_FLOAT_H_WRAP
-#define SYS_FLOAT_H_WRAP 0
-#endif
-
-#if SYS_FLOAT_H_WRAP || defined VERIFY
-#include "float.h"
-#endif
-
-#define Vprintf if (V) printf
-#define Unexpected(place) if (setjmp(lab)!=0) croak(place)
-#define fabs(x) (((x)<0.0)?(-x):(x))
-
-#endif /* PASS */
-
-#ifdef PASS0
-
-/* Prototypes for what's to come: */
-
-int false NOARGS;
-
-#ifdef NO_STDDEF
-char *malloc (); /* Old style prototype */
-#else
-char *malloc ARGS((size_t size));
-#endif
-
-Procedure exit ARGS((int status));
-
-char *f_rep ARGS((int precision, Long_double val));
-char *fake_f_rep ARGS((char *type, Long_double val));
-
-int maximum_int NOARGS;
-int cprop NOARGS;
-int basic NOARGS;
-Procedure sprop NOARGS;
-Procedure iprop NOARGS;
-Procedure lprop NOARGS;
-Procedure usprop NOARGS;
-Procedure uiprop NOARGS;
-Procedure ulprop NOARGS;
-int fprop ARGS((int bits_per_byte));
-int dprop ARGS((int bits_per_byte));
-int ldprop ARGS((int bits_per_byte));
-Procedure efprop ARGS((int fprec, int dprec, int lprec));
-Procedure edprop ARGS((int fprec, int dprec, int lprec));
-Procedure eldprop ARGS((int fprec, int dprec, int lprec));
-
-int setmode ARGS((char *s));
-Procedure farewell ARGS((int bugs));
-Procedure describe ARGS((char *description, char *extra));
-Procedure missing ARGS((char *s));
-Procedure fmissing ARGS((char *s));
-Procedure check_defines NOARGS;
-Procedure bitpattern ARGS((char *p, unsigned int size));
-int ceil_log ARGS((int base, Long_double x));
-Procedure croak ARGS((int place));
-Procedure eek_a_bug ARGS((char *problem));
-Procedure endian ARGS((int bits_per_byte));
-int exponent ARGS((Long_double x, double *fract, int *exp));
-int floor_log ARGS((int base, Long_double x));
-Procedure f_define ARGS((char *desc, char *extra, char *sort, char *name,
- int prec, Long_double val, Long_double req,
- char *mark));
-Procedure i_define ARGS((char *desc, char *extra, char *sort, char *name,
- long val, long lim, long req, char *mark));
-Procedure u_define ARGS((char *desc, char *extra, char *sort, char *name,
- unsigned long val, unsigned long req, char *mark));
-
-#ifdef NO_SIG /* There's no signal(), or setjmp/longjmp() */
-
- /* Dummy routines instead */
-
- int setjmp ARGS((int lab));
-
- int lab=1;
- int setjmp(lab) int lab; { return(0); }
- Procedure signal(i, p) int i, (*p)(); {}
-
-#else
- jmp_buf lab;
- Procedure overflow(sig) int sig; { /* what to do on over/underflow */
- signal(sig, overflow);
- longjmp(lab, 1);
- }
-
-#endif /*NO_SIG*/
-
-int V= 0, /* verbose */
- L= 0, /* produce limits.h */
- F= 0, /* produce float.h */
- bugs=0; /* The number of (possible) bugs in the output */
-
-char co[4], oc[4]; /* Comment starter and ender symbols */
-
-int bits_per_byte; /* the number of bits per unit returned by sizeof() */
-int flt_rounds; /* The calculated value of FLT_ROUNDS */
-int flt_radix; /* The calculated value of FLT_RADIX */
-
-#ifdef TEST
-/* Set the fp modes on a SUN with 68881 chip, to check that different
- rounding modes etc. get properly detected.
- Compile with -f68881 for cc, -m68881 for gcc, and with additional flag
- -DTEST. Run with additional parameter +hex-number, to set the 68881 mode
- register to hex-number
-*/
-
-/* Bits 0x30 = rounding mode */
-#define ROUND_BITS 0x30
-#define TO_NEAREST 0x00
-#define TO_ZERO 0x10
-#define TO_MINUS_INF 0x20
-#define TO_PLUS_INF 0x30 /* The SUN FP user's guide seems to be wrong here */
-
-/* Bits 0xc0 = extended rounding */
-#define EXT_BITS 0xc0
-#define ROUND_EXTENDED 0x00
-#define ROUND_SINGLE 0x40
-#define ROUND_DOUBLE 0x80
-
-/* Enabled traps */
-#define EXE_INEX1 0x100
-#define EXE_INEX2 0x200
-#define EXE_DZ 0x400
-#define EXE_UNFL 0x800
-#define EXE_OVFL 0x1000
-#define EXE_OPERR 0x2000
-#define EXE_SNAN 0x4000
-#define EXE_BSUN 0x8000
-
-/* Only used for testing, on a Sun with 68881 chip */
-/* Print the FP mode */
-printmode(new) unsigned new; {
- fpmode_(&new);
- printf("New fp mode:\n");
- printf(" Round toward ");
- switch (new & ROUND_BITS) {
- case TO_NEAREST: printf("nearest"); break;
- case TO_ZERO: printf("zero"); break;
- case TO_MINUS_INF: printf("minus infinity"); break;
- case TO_PLUS_INF: printf("plus infinity"); break;
- default: printf("???"); break;
- }
-
- printf("\n Extended rounding precision: ");
-
- switch (new & EXT_BITS) {
- case ROUND_EXTENDED: printf("extended"); break;
- case ROUND_SINGLE: printf("single"); break;
- case ROUND_DOUBLE: printf("double"); break;
- default: printf("???"); break;
- }
-
- printf("\n Enabled exceptions:");
- if (new & (unsigned) EXE_INEX1) printf(" inex1");
- if (new & (unsigned) EXE_INEX2) printf(" inex2");
- if (new & (unsigned) EXE_DZ) printf(" dz");
- if (new & (unsigned) EXE_UNFL) printf(" unfl");
- if (new & (unsigned) EXE_OVFL) printf(" ovfl");
- if (new & (unsigned) EXE_OPERR) printf(" operr");
- if (new & (unsigned) EXE_SNAN) printf(" snan");
- if (new & (unsigned) EXE_BSUN) printf(" bsun");
- printf("\n");
-}
-
-/* Only used for testing, on a Sun with 68881 chip */
-/* Set the FP mode */
-int setmode(s) char *s; {
- unsigned mode=0, dig;
- char c;
-
- while (*s) {
- c= *s++;
- if (c>='0' && c<='9') dig= c-'0';
- else if (c>='a' && c<='f') dig= c-'a'+10;
- else if (c>='A' && c<='F') dig= c-'A'+10;
- else return 1;
- mode= mode<<4 | dig;
- }
- printmode(mode);
- return 0;
-}
-#else
-/* ARGSUSED */
-int setmode(s) char *s; {
- fprintf(stderr, "Can't set mode: not compiled with TEST\n");
- return(1);
-}
-#endif
-
-Procedure farewell(bugs) int bugs; {
- if (bugs == 0) exit(0);
- printf("\n%sFor hints on dealing with the ", co);
- if (bugs == 1) printf("problem");
- else printf("%d problems", bugs);
- printf(" above\n see the section 'TROUBLESHOOTING' in the file ");
- printf("%s%s\n", FILENAME, oc);
- exit(bugs);
-}
-
-/* The program has received a signal where it wasn't expecting one */
-Procedure croak(place) int place; {
- printf("*** Unexpected signal at point %d\n", place);
- farewell(bugs+1); /* An exit isn't essential here, but avoids loops */
-}
-
-/* This is here in case alloca.c is used, which calls this. */
-char *xmalloc(size) unsigned size; {
- char *value = (char *)malloc(size);
- if (value == 0) {
- fprintf(stderr, "Virtual memory exceeded\n");
- exit(bugs+1);
- }
- return value;
-}
-
-int maxint;
-
-int maximum_int() {
- /* Find the maximum integer */
- Volatile int newi, int_max, two=2;
-
- /* Calculate maxint ***********************************/
- /* Calculate 2**n-1 until overflow - then use the previous value */
-
- newi=1; int_max=0;
-
- if (setjmp(lab)==0) { /* Yields int_max */
- while(newi>int_max) {
- int_max=newi;
- newi=newi*two+1;
- }
- }
- Unexpected(0);
- return int_max;
-}
-
-int main(argc, argv) int argc; char *argv[]; {
- int dprec, fprec, lprec;
- int i; char *s; int bad;
-
-#ifdef SIGFPE
- signal(SIGFPE, overflow);
-#endif
-#ifdef SIGOVER
- signal(SIGOVER, overflow);
-#endif
-/* Add more calls as necessary */
-
- Unexpected(1);
-
- bad=0;
- for (i=1; i < argc; i++) {
- s= argv[i];
- if (*s == '-') {
- s++;
- while (*s) {
- switch (*(s++)) {
- case 'v': V=1; break;
- case 'l': L=1; break;
- case 'f': F=1; break;
- default: bad=1; break;
- }
- }
- } else if (*s == '+') {
- s++;
- bad= setmode(s);
- } else bad= 1;
- }
- if (bad) {
- fprintf(stderr,
- "Usage: %s [-vlf]\n v=Verbose l=Limits.h f=Float.h\n",
- argv[0]);
- exit(1);
- }
- if (L || F) {
- co[0]= '/'; oc[0]= ' ';
- co[1]= '*'; oc[1]= '*';
- co[2]= ' '; oc[2]= '/';
- co[3]= '\0'; oc[3]= '\0';
- } else {
- co[0]= '\0'; oc[0]= '\0';
- V=1;
- }
-
- if (L) printf("%slimits.h%s\n", co, oc);
- if (F) printf("%sfloat.h%s\n", co, oc);
- if (F) {
- printf ("#ifndef _FLOAT_H___\n");
- printf ("#define _FLOAT_H___\n");
- if (SYS_FLOAT_H_WRAP)
- printf (" #include_next <float.h>\n");
- }
-#ifdef ID
- printf("%sProduced on %s by enquire version %s, CWI, Amsterdam%s\n",
- co, ID, VERSION, oc);
-#else
- printf("%sProduced by enquire version %s, CWI, Amsterdam%s\n",
- co, VERSION, oc);
-#endif
-
-#ifdef VERIFY
- printf("%sVerification phase%s\n", co, oc);
-#endif
-
-#ifdef NO_SIG
- Vprintf("%sCompiled without signal(): %s%s\n",
- co,
- "there's nothing that can be done if overflow occurs",
- oc);
-#endif
-#ifdef NO_SC
- Vprintf("%sCompiled without signed char%s\n", co, oc);
-#endif
-#ifdef NO_UC
- Vprintf("%Compiled without unsigned char%s\n", co, oc);
-#endif
-#ifdef NO_UI
- Vprintf("%Compiled without unsigned short or long%s\n", co, oc);
-#endif
-#ifdef __STDC__
- Vprintf("%sCompiler claims to be ANSI C level %d%s\n",
- co, __STDC__, oc);
-#else
- Vprintf("%sCompiler does not claim to be ANSI C%s\n", co, oc);
-#endif
- printf("\n");
- check_defines();
-
- maxint= maximum_int();
- bits_per_byte= basic();
- Vprintf("\n");
- if (F||V) {
- fprec= fprop(bits_per_byte);
- dprec= dprop(bits_per_byte);
- lprec= ldprop(bits_per_byte);
- efprop(fprec, dprec, lprec);
- edprop(fprec, dprec, lprec);
- eldprop(fprec, dprec, lprec);
- }
-#ifndef NO_MEM
- if (V) {
- unsigned int size;
- long total;
- /* An extra goody: the approximate amount of data-space */
- /* Allocate store until no more available */
- /* Different implementations have a different argument type
- to malloc. Here we assume that it's the same type as
- that which sizeof() returns */
- size=1<<((bits_per_byte*sizeof(int))-2);
- total=0;
- while (size!=0) {
- while ( malloc((false()?sizeof(int):size)) !=
- (char *)NULL
- ) {
- total+=(size/2);
- }
- size/=2;
- }
-
- Vprintf("%sMemory allocable ~= %ld Kbytes%s\n",
- co, (total+511)/512, oc);
- }
-#endif
- if (F) {
- printf ("#endif %s _FLOAT_H___%s\n", co, oc);
- }
- farewell(bugs);
- return bugs; /* To keep compilers and lint happy */
-}
-
-Procedure eek_a_bug(problem) char *problem; {
- /* The program has discovered a problem */
- printf("\n%s*** WARNING: %s%s\n", co, problem, oc);
- bugs++;
-}
-
-Procedure describe(description, extra) char *description, *extra; {
- /* Produce the description for a #define */
- printf(" %s", co);
- printf(description, extra);
- printf("%s\n", oc);
-}
-
-Procedure i_define(desc, extra, sort, name, val, lim, req, mark)
- char *desc, *extra, *sort, *name; long val, lim, req; char *mark; {
- if (SYS_FLOAT_H_WRAP && F && val == req)
- return;
- /* Produce a #define for a signed int type */
- describe(desc, extra);
- printf("#undef %s%s\n", sort, name);
- if (val >= 0) {
- printf("#define %s%s %ld%s\n", sort, name, val, mark);
- } else if (val + lim < 0) {
- /* We may not produce a constant like -1024 if the max
- allowable value is 1023. It has then to be output as
- -1023-1. lim is the max allowable value. */
- printf("#define %s%s (%ld%s%ld%s)\n",
- sort, name, -lim, mark, val+lim, mark);
- } else {
- printf("#define %s%s (%ld%s)\n", sort, name, val, mark);
- }
-#ifdef VERIFY
- if (val != req) {
- printf("%s*** Verify failed for above #define!\n", co);
- printf(" Compiler has %ld for value%s\n\n", req, oc);
- bugs++;
- }
-#endif
- Vprintf("\n");
-}
-
-Procedure u_define(desc, extra, sort, name, val, req, mark)
- char *desc, *extra, *sort, *name; unsigned long val, req; char *mark; {
- /* Produce a #define for an unsigned value */
- describe(desc, extra);
- printf("#undef %s%s\n", sort, name);
- printf("#define %s%s %lu%s%s\n", sort, name, val, U, mark);
-#ifdef VERIFY
- if (val != req) {
- printf("%s*** Verify failed for above #define!\n", co);
- printf(" Compiler has %lu for value%s\n\n", req, oc);
- bugs++;
- }
-#endif
- Vprintf("\n");
-}
-
-Procedure f_define(desc, extra, sort, name, precision, val, req, mark)
- char *desc, *extra, *sort, *name; int precision;
- Long_double val, req; char *mark; {
- if (SYS_FLOAT_H_WRAP && F && val == req)
- return;
- /* Produce a #define for a float/double/long double */
- describe(desc, extra);
- printf ("#undef %s%s\n", sort, name);
- if (stdc) {
-#ifdef NO_LONG_DOUBLE_IO
- static int union_defined = 0;
- if (sizeof(double) != sizeof(Long_double)
- && !strcmp(sort, "LDBL")) {
- if (!union_defined) {
- printf("#ifndef __LDBL_UNION__\n");
- printf("#define __LDBL_UNION__\n");
- printf("union __convert_long_double {\n");
- printf(" unsigned __convert_long_double_i[4];\n");
- printf(" long double __convert_long_double_d;\n");
- printf("};\n");
- printf("#endif\n");
- union_defined = 1;
- }
- printf("#define %s%s %s\n",
- sort, name, fake_f_rep("long double", val));
- } else {
- printf("#define %s%s %s%s\n",
- sort, name, f_rep(precision, val), mark);
- }
-#else
- printf("#define %s%s %s%s\n",
- sort, name, f_rep(precision, val), mark);
-#endif
- } else if (*mark == 'F') {
- /* non-ANSI C has no float constants, so cast the constant */
- printf("#define %s%s ((float)%s)\n",
- sort, name, f_rep(precision, val));
- } else {
- printf("#define %s%s %s\n", sort, name, f_rep(precision, val));
- }
- Vprintf("\n");
-}
-
-int floor_log(base, x) int base; Long_double x; {
- /* return floor(log base(x)) */
- int r=0;
- while (x>=base) { r++; x/=base; }
- return r;
-}
-
-int ceil_log(base, x) int base; Long_double x; {
- int r=0;
- while (x>1.0) { r++; x/=base; }
- return r;
-}
-
-int exponent(x, fract, exp) Long_double x; double *fract; int *exp; {
- /* Split x into a fraction and a power of ten;
- returns 0 if x is unusable, 1 otherwise.
- Only used for error messages about faulty output.
- */
- int r=0, neg=0;
- Long_double old;
- *fract=0.0; *exp=0;
- if (x<0.0) {
- x= -x;
- neg= 1;
- }
- if (x==0.0) return 1;
- if (x>=10.0) {
- while (x>=10.0) {
- old=x; r++; x/=10.0;
- if (old==x) return 0;
- }
- } else {
- while (x<1.0) {
- old=x; r--; x*=10.0;
- if (old==x) return 0;
- }
- }
- if (neg) *fract= (double) -x;
- else *fract=(double) x;
- *exp=r;
- return 1;
-}
-
-/* Print a value of type TYPE with value VAL,
- assuming that sprintf can't handle this type properly (without truncation).
- We create an expression that uses type casting to create the value from
- a bit pattern. */
-
-char *fake_f_rep(type, val) char *type; Long_double val; {
- static char buf[1024];
- union { unsigned int i[4]; Long_double ld;} u;
- u.i[0] = u.i[1] = u.i[2] = u.i[3] = 0;
- u.ld = val;
- sprintf(buf, "(__extension__ ((union __convert_long_double) {__convert_long_double_i: {0x%x, 0x%x, 0x%x, 0x%x}}).__convert_long_double_d)",
- u.i[0], u.i[1], u.i[2], u.i[3]);
- return buf;
-}
-
-char *f_rep(precision, val) int precision; Long_double val; {
- /* Return the floating representation of val */
- static char buf[1024];
-#ifdef NO_LONG_DOUBLE_IO
- if (1)
-#else
- if (sizeof(double) == sizeof(Long_double))
-#endif
- {
- double d = val;
- /* Assume they're the same, and use non-stdc format */
- /* This is for stdc compilers using non-stdc libraries */
- sprintf(buf, "%.*e", precision, d);
- } else {
- /* It had better support Le then */
- sprintf(buf, "%.*Le", precision, val);
- }
- return buf;
-}
-
-Procedure bitpattern(p, size) char *p; unsigned int size; {
- /* Printf the bit-pattern of p */
- char c;
- unsigned int i;
- int j;
-
- for (i=1; i<=size; i++) {
- c= *p;
- p++;
- for (j=bits_per_byte-1; j>=0; j--)
- printf("%c", (c>>j)&1 ? '1' : '0');
- if (i!=size) printf(" ");
- }
-}
-
-#define Order(x, px, mode)\
- printf("%s%s ", co, mode); for (i=0; i<sizeof(x); i++) px[i]= ab[i]; \
- for (i=1; i<=sizeof(x); i++) { c=((x>>(bits_per_byte*(sizeof(x)-i)))&mask);\
- putchar(c==0 ? '?' : (char)c); }\
- printf("%s\n", oc);
-
-Procedure endian(bits_per_byte) int bits_per_byte; {
- /* Printf the byte-order used on this machine */
- /*unsigned*/ short s=0;
- /*unsigned*/ int j=0;
- /*unsigned*/ long l=0;
-
- char *ps= (char *) &s,
- *pj= (char *) &j,
- *pl= (char *) &l,
- *ab= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- unsigned int mask, i, c;
-
- mask=0;
- for (i=1; i<=(unsigned)bits_per_byte; i++) mask= (mask<<1)|1;
-
- if (V) {
- printf("%sCHARACTER ORDER%s\n", co, oc);
- Order(s, ps, "short:");
- Order(j, pj, "int: ");
- Order(l, pl, "long: ");
- }
-}
-
-Procedure missing(s) char *s; {
- printf("%s*** #define %s missing from limits.h%s\n", co, s, oc);
- bugs++;
-}
-
-Procedure fmissing(s) char *s; {
- printf("%s*** #define %s missing from float.h%s\n", co, s, oc);
- bugs++;
-}
-
-/* To try and fool optimisers */
-int false() { return 0; }
-
-#define Promoted(x) (false()?(x):(-1))
-#define is_signed(x) (Promoted(x) < 0)
-#define sign_of(x) ((x)?"signed":"unsigned")
-#define Signed 1
-#define Unsigned 0
-#define sgn(x) ((is_signed(x))?Signed:Unsigned)
-
-#define showtype(t, x) Vprintf("%s%s %s %s%s\n", co, t, sign_of(is_signed(x)), type_of(sizeof(x)), oc)
-
-char *type_of(x) int x; {
- if (x == sizeof(char)) {
- if (sizeof(char) == sizeof(int)) return "char/short/int";
- if (sizeof(char) == sizeof(short)) return "char/short";
- return "char";
- }
- if (x == sizeof(short)) {
- if (sizeof(short) == sizeof(int)) return "short/int";
- return "short";
- }
- if (x == sizeof(int)) {
- if (sizeof(int) == sizeof(long)) return "int/long";
- return "int";
- }
- if (x == sizeof(long)) return "long";
- return "unknown-type";
-}
-
-char *ftype_of(x) int x; {
- if (x == sizeof(float)) {
- return "float";
- }
- if (x == sizeof(double)) {
- if (sizeof(double) == sizeof(Long_double))
- return "(long)double";
- return "double";
- }
- if (x == sizeof(Long_double)) {
- return "long double";
- }
- return "unknown-type";
-}
-
-Procedure typerr(name, esign, esize, sign, size)
- char *name; int esign, esize, sign, size;
-{
- Vprintf("*** %s has wrong type: expected %s %s, found %s %s\n",
- name, sign_of(esign), type_of(esize),
- sign_of(sign), type_of(size));
-}
-
-Procedure ftyperr(name, esize, size) char *name; int esize, size; {
- Vprintf("*** %s has wrong type: expected %s, found %s\n",
- name, ftype_of(esize), ftype_of(size));
-}
-
-int promotions() {
- int si = 0; long sl = 0;
- unsigned int ui; unsigned long ul;
- short ss; unsigned short us;
-
- Vprintf("\n%sPROMOTIONS%s\n", co, oc);
-
- if (
- /* Possible warnings here; no problem */
- (sizeof(Promoted(si)) != sizeof(int)) ||
- (sizeof(Promoted(sl)) != sizeof(long)) ||
- (sizeof(Promoted(ss)) != sizeof(int)) ||
- (sizeof(Promoted(ui)) != sizeof(int)) ||
- (sizeof(Promoted(ul)) != sizeof(long)) ||
- (sizeof(Promoted(us)) != sizeof(int)) ||
- is_signed(ui) || is_signed(ul) ||
- !is_signed(si) || !is_signed(sl)
- )
- {
- eek_a_bug("promotions don't work properly in conditional expressions\n");
- }
-
- showtype("unsigned short promotes to", Promoted((unsigned short) 0));
- showtype("long+unsigned gives", sl+ui);
- return 0;
-}
-
-#define checktype(x, n, s, t) if((sgn(x)!=s)||(sizeof(x)!=sizeof(t))) typerr(n, s, sizeof(t), sign_of(x), sizeof(x));
-
-#define fchecktype(x, n, t) if (sizeof(x) != sizeof(t)) ftyperr(n, sizeof(x), sizeof(t));
-
-Procedure check_defines() {
- /* ensure that all #defines are present and have the correct type */
-#ifdef VERIFY
- int usign;
-
-#ifdef NO_UI
- usign= Signed;
-#else
- /* Implementations promote unsigned short differently */
- usign= is_signed((unsigned short) 0);
-#endif
-
- if (L) {
-#ifdef CHAR_BIT
- checktype(CHAR_BIT, "CHAR_BIT", Signed, int);
-#else
- missing("CHAR_BIT");
-#endif
-#ifdef CHAR_MAX
- checktype(CHAR_MAX, "CHAR_MAX", Signed, int);
-#else
- missing("CHAR_MAX");
-#endif
-#ifdef CHAR_MIN
- checktype(CHAR_MIN, "CHAR_MIN", Signed, int);
-#else
- missing("CHAR_MIN");
-#endif
-#ifdef SCHAR_MAX
- checktype(SCHAR_MAX, "SCHAR_MAX", Signed, int);
-#else
- missing("SCHAR_MAX");
-#endif
-#ifdef SCHAR_MIN
- checktype(SCHAR_MIN, "SCHAR_MIN", Signed, int);
-#else
- missing("SCHAR_MIN");
-#endif
-#ifdef UCHAR_MAX
- checktype(UCHAR_MAX, "UCHAR_MAX", Signed, int);
-#else
- missing("UCHAR_MAX");
-#endif
-#ifdef SHRT_MAX
- checktype(SHRT_MAX, "SHRT_MAX", Signed, int);
-#else
- missing("SHRT_MAX");
-#endif
-#ifdef SHRT_MIN
- checktype(SHRT_MIN, "SHRT_MIN", Signed, int);
-#else
- missing("SHRT_MIN");
-#endif
-#ifdef INT_MAX
- checktype(INT_MAX, "INT_MAX", Signed, int);
-#else
- missing("INT_MAX");
-#endif
-#ifdef INT_MIN
- checktype(INT_MIN, "INT_MIN", Signed, int);
-#else
- missing("INT_MIN");
-#endif
-#ifdef LONG_MAX
- checktype(LONG_MAX, "LONG_MAX", Signed, long);
-#else
- missing("LONG_MAX");
-#endif
-#ifdef LONG_MIN
- checktype(LONG_MIN, "LONG_MIN", Signed, long);
-#else
- missing("LONG_MIN");
-#endif
-#ifdef USHRT_MAX
- checktype(USHRT_MAX, "USHRT_MAX", usign, int);
-#else
- missing("USHRT_MAX");
-#endif
-#ifdef UINT_MAX
- checktype(UINT_MAX, "UINT_MAX", Unsigned, int);
-#else
- missing("UINT_MAX");
-#endif
-#ifdef ULONG_MAX
- checktype(ULONG_MAX, "ULONG_MAX", Unsigned, long);
-#else
- missing("ULONG_MAX");
-#endif
- } /* if (L) */
-
- if (F) {
-#ifdef FLT_RADIX
- checktype(FLT_RADIX, "FLT_RADIX", Signed, int);
-#else
- fmissing("FLT_RADIX");
-#endif
-#ifdef FLT_MANT_DIG
- checktype(FLT_MANT_DIG, "FLT_MANT_DIG", Signed, int);
-#else
- fmissing("FLT_MANT_DIG");
-#endif
-#ifdef FLT_DIG
- checktype(FLT_DIG, "FLT_DIG", Signed, int);
-#else
- fmissing("FLT_DIG");
-#endif
-#ifdef FLT_ROUNDS
- checktype(FLT_ROUNDS, "FLT_ROUNDS", Signed, int);
-#else
- fmissing("FLT_ROUNDS");
-#endif
-#ifdef FLT_EPSILON
- fchecktype(FLT_EPSILON, "FLT_EPSILON", float);
-#else
- fmissing("FLT_EPSILON");
-#endif
-#ifdef FLT_MIN_EXP
- checktype(FLT_MIN_EXP, "FLT_MIN_EXP", Signed, int);
-#else
- fmissing("FLT_MIN_EXP");
-#endif
-#ifdef FLT_MIN
- fchecktype(FLT_MIN, "FLT_MIN", float);
-#else
- fmissing("FLT_MIN");
-#endif
-#ifdef FLT_MIN_10_EXP
- checktype(FLT_MIN_10_EXP, "FLT_MIN_10_EXP", Signed, int);
-#else
- fmissing("FLT_MIN_10_EXP");
-#endif
-#ifdef FLT_MAX_EXP
- checktype(FLT_MAX_EXP, "FLT_MAX_EXP", Signed, int);
-#else
- fmissing("FLT_MAX_EXP");
-#endif
-#ifdef FLT_MAX
- fchecktype(FLT_MAX, "FLT_MAX", float);
-#else
- fmissing("FLT_MAX");
-#endif
-#ifdef FLT_MAX_10_EXP
- checktype(FLT_MAX_10_EXP, "FLT_MAX_10_EXP", Signed, int);
-#else
- fmissing("FLT_MAX_10_EXP");
-#endif
-#ifdef DBL_MANT_DIG
- checktype(DBL_MANT_DIG, "DBL_MANT_DIG", Signed, int);
-#else
- fmissing("DBL_MANT_DIG");
-#endif
-#ifdef DBL_DIG
- checktype(DBL_DIG, "DBL_DIG", Signed, int);
-#else
- fmissing("DBL_DIG");
-#endif
-#ifdef DBL_EPSILON
- fchecktype(DBL_EPSILON, "DBL_EPSILON", double);
-#else
- fmissing("DBL_EPSILON");
-#endif
-#ifdef DBL_MIN_EXP
- checktype(DBL_MIN_EXP, "DBL_MIN_EXP", Signed, int);
-#else
- fmissing("DBL_MIN_EXP");
-#endif
-#ifdef DBL_MIN
- fchecktype(DBL_MIN, "DBL_MIN", double);
-#else
- fmissing("DBL_MIN");
-#endif
-#ifdef DBL_MIN_10_EXP
- checktype(DBL_MIN_10_EXP, "DBL_MIN_10_EXP", Signed, int);
-#else
- fmissing("DBL_MIN_10_EXP");
-#endif
-#ifdef DBL_MAX_EXP
- checktype(DBL_MAX_EXP, "DBL_MAX_EXP", Signed, int);
-#else
- fmissing("DBL_MAX_EXP");
-#endif
-#ifdef DBL_MAX
- fchecktype(DBL_MAX, "DBL_MAX", double);
-#else
- fmissing("DBL_MAX");
-#endif
-#ifdef DBL_MAX_10_EXP
- checktype(DBL_MAX_10_EXP, "DBL_MAX_10_EXP", Signed, int);
-#else
- fmissing("DBL_MAX_10_EXP");
-#endif
-#ifdef STDC
-#ifdef LDBL_MANT_DIG
- checktype(LDBL_MANT_DIG, "LDBL_MANT_DIG", Signed, int);
-#else
- fmissing("LDBL_MANT_DIG");
-#endif
-#ifdef LDBL_DIG
- checktype(LDBL_DIG, "LDBL_DIG", Signed, int);
-#else
- fmissing("LDBL_DIG");
-#endif
-#ifdef LDBL_EPSILON
- fchecktype(LDBL_EPSILON, "LDBL_EPSILON", long double);
-#else
- fmissing("LDBL_EPSILON");
-#endif
-#ifdef LDBL_MIN_EXP
- checktype(LDBL_MIN_EXP, "LDBL_MIN_EXP", Signed, int);
-#else
- fmissing("LDBL_MIN_EXP");
-#endif
-#ifdef LDBL_MIN
- fchecktype(LDBL_MIN, "LDBL_MIN", long double);
-#else
- fmissing("LDBL_MIN");
-#endif
-#ifdef LDBL_MIN_10_EXP
- checktype(LDBL_MIN_10_EXP, "LDBL_MIN_10_EXP", Signed, int);
-#else
- fmissing("LDBL_MIN_10_EXP");
-#endif
-#ifdef LDBL_MAX_EXP
- checktype(LDBL_MAX_EXP, "LDBL_MAX_EXP", Signed, int);
-#else
- fmissing("LDBL_MAX_EXP");
-#endif
-#ifdef LDBL_MAX
- fchecktype(LDBL_MAX, "LDBL_MAX", long double);
-#else
- fmissing("LDBL_MAX");
-#endif
-#ifdef LDBL_MAX_10_EXP
- checktype(LDBL_MAX_10_EXP, "LDBL_MAX_10_EXP", Signed, int);
-#else
- fmissing("LDBL_MAX_10_EXP");
-#endif
-#endif /* STDC */
- } /* if (F) */
-#endif /* VERIFY */
-}
-
-#ifdef VERIFY
-#ifndef SCHAR_MAX
-#define SCHAR_MAX char_max
-#endif
-#ifndef SCHAR_MIN
-#define SCHAR_MIN char_min
-#endif
-#ifndef UCHAR_MAX
-#define UCHAR_MAX char_max
-#endif
-#endif /* VERIFY */
-
-#ifndef CHAR_BIT
-#define CHAR_BIT char_bit
-#endif
-#ifndef CHAR_MAX
-#define CHAR_MAX char_max
-#endif
-#ifndef CHAR_MIN
-#define CHAR_MIN char_min
-#endif
-#ifndef SCHAR_MAX
-#define SCHAR_MAX char_max
-#endif
-#ifndef SCHAR_MIN
-#define SCHAR_MIN char_min
-#endif
-#ifndef UCHAR_MAX
-#define UCHAR_MAX char_max
-#endif
-
-int cprop() {
- /* Properties of type char */
- Volatile char c, char_max, char_min;
- Volatile int bits_per_byte, c_signed;
- long char_bit;
-
- Unexpected(2);
-
- /* Calculate number of bits per character *************************/
- c=1; bits_per_byte=0;
- do { c=c<<1; bits_per_byte++; } while(c!=0);
- c= (char)(-1);
- if (((int)c)<0) c_signed=1;
- else c_signed=0;
- Vprintf("%schar = %d bits, %ssigned%s\n",
- co, (int)sizeof(c)*bits_per_byte, (c_signed?"":"un"), oc);
- char_bit=(long)(sizeof(c)*bits_per_byte);
- if (L) i_define(D_CHAR_BIT, "", "CHAR", "_BIT",
- char_bit, 0L, (long) CHAR_BIT, "");
-
- c=0; char_max=0;
- c++;
- if (bits_per_byte <= 16) {
- if (setjmp(lab)==0) { /* Yields char_max */
- while (c>char_max) {
- char_max=c;
- c++;
- }
- } else {
- Vprintf("%sCharacter overflow generates a trap!%s\n",
- co, oc);
- }
- c=0; char_min=0;
- c--;
- if (setjmp(lab)==0) { /* Yields char_min */
- while (c<char_min) {
- char_min=c;
- c--;
- }
- }
- } else {
- /* An exhaustive search here is impracticable ;-) */
- c = (1 << (bits_per_byte - 1)) - 1;
- char_max = c;
- c++;
- if (c > char_max)
- char_max = ~0;
- c = 0;
- char_min = 0;
- c--;
- if (c < char_min) {
- c = (1 << (bits_per_byte - 1)) - 1;
- c = -c;
- char_min = c;
- c--;
- if (c < char_min)
- char_min = c;
- }
- }
- if (c_signed && char_min == 0) {
- Vprintf("%sBEWARE! Chars are pseudo-unsigned:%s\n", co, oc);
- Vprintf("%s %s%s%s\n",
- "They contain only nonnegative values, ",
- "but sign extend when used as integers.", co, oc);
- }
- Unexpected(3);
-
- if (L) {
- /* Because of the integer promotions, you must use a U after
- the MAX_CHARS in the following cases */
- if ((sizeof(char) == sizeof(int)) && !c_signed) {
- u_define(D_CHAR_MAX, "", "CHAR", "_MAX",
- (long) char_max,
- (long) CHAR_MAX, "");
- } else {
- i_define(D_CHAR_MAX, "", "CHAR", "_MAX",
- (long) char_max, 0L,
- (long) CHAR_MAX, "");
- }
- i_define(D_CHAR_MIN, "", "CHAR", "_MIN",
- (long) char_min, (long) maxint,
- (long) CHAR_MIN, "");
- if (c_signed) {
- i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX",
- (long) char_max, 0L,
- (long) SCHAR_MAX, "");
- i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN",
- (long) char_min, (long) maxint,
- (long) SCHAR_MIN, "");
- } else {
- if (sizeof(char) == sizeof(int)) {
- u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
- (long) char_max,
- (long) UCHAR_MAX, "");
- } else {
- i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
- (long) char_max, 0L,
- (long) UCHAR_MAX, "");
- }
- }
-
- if (c_signed) {
-#ifndef NO_UC
- Volatile unsigned char c, char_max;
- c=0; char_max=0;
- c++;
- if (setjmp(lab)==0) { /* Yields char_max */
- while (c>char_max) {
- char_max=c;
- c++;
- }
- }
- Unexpected(4);
- if (sizeof(char) == sizeof(int)) {
- u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
- (long) char_max,
- (long) UCHAR_MAX, "");
- } else {
- i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
- (long) char_max, 0L,
- (long) UCHAR_MAX, "");
- }
-#endif
- } else {
-#ifndef NO_SC
-/* Define NO_SC if this gives a syntax error */ Volatile signed char c, char_max, char_min;
- c=0; char_max=0;
- c++;
- if (setjmp(lab)==0) { /* Yields char_max */
- while (c>char_max) {
- char_max=c;
- c++;
- }
- }
- c=0; char_min=0;
- c--;
- if (setjmp(lab)==0) { /* Yields char_min */
- while (c<char_min) {
- char_min=c;
- c--;
- }
- }
- Unexpected(5);
- i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN",
- (long) char_min, (long) maxint,
- (long) SCHAR_MIN, "");
- i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX",
- (long) char_max, 0L,
- (long) SCHAR_MAX, "");
-#endif /* NO_SC */
- }
- }
- return bits_per_byte;
-}
-
-int basic() {
- /* The properties of the basic types.
- Returns number of bits per sizeof unit */
- Volatile int bits_per_byte;
- typedef int function ();
- int variable;
- int *p, *q;
-
- Vprintf("%sSIZES%s\n", co, oc);
- bits_per_byte= cprop();
-
- /* Shorts, ints and longs *****************************************/
- Vprintf("%sshort=%d int=%d long=%d float=%d double=%d bits %s\n",
- co,
- (int) sizeof(short)*bits_per_byte,
- (int) sizeof(int)*bits_per_byte,
- (int) sizeof(long)*bits_per_byte,
- (int) sizeof(float)*bits_per_byte,
- (int) sizeof(double)*bits_per_byte, oc);
- if (stdc) {
- Vprintf("%slong double=%d bits%s\n",
- co, (int) sizeof(Long_double)*bits_per_byte, oc);
- }
- Vprintf("%schar*=%d bits%s%s\n",
- co, (int)sizeof(char *)*bits_per_byte,
- sizeof(char *)>sizeof(int)?" BEWARE! larger than int!":"",
- oc);
- Vprintf("%sint* =%d bits%s%s\n",
- co, (int)sizeof(int *)*bits_per_byte,
- sizeof(int *)>sizeof(int)?" BEWARE! larger than int!":"",
- oc);
- Vprintf("%sfunc*=%d bits%s%s\n",
- co, (int)sizeof(function *)*bits_per_byte,
- sizeof(function *)>sizeof(int)?" BEWARE! larger than int!":"",
- oc);
-if (V) printf ("%s%s %s %s%s\n", co, "Type size_t is",
- ((((false()?( sizeof(int)):(-1)) < 0) )?
- "signed":"unsigned") ,
- type_of(sizeof(
- sizeof(int)+0
- )
- ),
- oc);
- showtype("Type size_t is", sizeof(0));
-
- /* Alignment constants ********************************************/
-
-#define alignment(TYPE) \
- ((long)((char *)&((struct{char c; TYPE d;}*)0)->d - (char *) 0))
-
- Vprintf("\n%sALIGNMENTS%s\n", co, oc);
-
- Vprintf("%schar=%ld short=%ld int=%ld long=%ld%s\n",
- co,
- alignment(char), alignment(short),
- alignment(int), alignment(long),
- oc);
-
- Vprintf("%sfloat=%ld double=%ld%s\n",
- co,
- alignment(float), alignment(double),
- oc);
-
- if (stdc) {
- Vprintf("%slong double=%ld%s\n",
- co,
- alignment(Long_double),
- oc);
- }
- Vprintf("%schar*=%ld int*=%ld func*=%ld%s\n",
- co,
- alignment(char *), alignment(int *), alignment(function *),
- oc);
-
- Vprintf("\n");
-
- /* Ten little endians *********************************************/
-
- endian(bits_per_byte);
-
- /* Pointers *******************************************************/
-
- Vprintf("\n%sPROPERTIES OF POINTERS%s\n", co, oc);
-
- if ((long) (char *) &variable == (long) (int *) &variable) {
- Vprintf("%sChar and int pointer formats seem identical%s\n",
- co, oc);
- } else {
- Vprintf("%sChar and int pointer formats are different%s\n",
- co, oc);
- }
- if ((long) (char *) &variable == (long) (function *) &variable) {
- Vprintf("%sChar and function pointer formats seem identical%s\n",
- co, oc);
- } else {
- Vprintf("%sChar and function pointer formats are different%s\n",
- co, oc);
- }
-
- if (V) {
- if ("abcd"=="abcd")
- printf("%sStrings are shared%s\n", co, oc);
- else printf("%sStrings are not shared%s\n", co, oc);
- }
-
- p=0; q=0;
- showtype("Type ptrdiff_t is", p-q);
-
- Vprintf("\n%sPROPERTIES OF INTEGRAL TYPES%s\n", co, oc);
-
- sprop();
- iprop();
- lprop();
- usprop();
- uiprop();
- ulprop();
-
- promotions();
-
- Unexpected(6);
-
- return bits_per_byte;
-}
-
-#else /* not PASS0 */
-
-#ifdef SEP
-extern jmp_buf lab;
-extern int V, L, F, bugs, bits_per_byte;
-extern char co[], oc[];
-extern char *f_rep();
-#endif /* SEP */
-#endif /* ifdef PASS0 */
-
-/* As I said, I apologise for the contortions below. The functions are
- expanded by the preprocessor twice or three times (for float and double,
- and maybe for long double, and for short, int and long). That way,
- I never make a change to one that I forget to make to the other.
- You can look on it as C's fault for not supporting multi-line macro's.
- This whole file is read 3 times by the preprocessor, with PASSn set for
- n=1, 2 or 3, to decide which parts to reprocess.
-*/
-
-/* #undef on an already undefined thing is (wrongly) flagged as an error
- by some compilers, therefore the #ifdef that follows:
-*/
-#ifdef Number
-#undef Number
-#undef THING
-#undef Thing
-#undef thing
-#undef FPROP
-#undef Fname
-#undef Store
-#undef Sum
-#undef Diff
-#undef Mul
-#undef Div
-#undef ZERO
-#undef HALF
-#undef ONE
-#undef TWO
-#undef THREE
-#undef FOUR
-#undef Self
-#undef F_check
-#undef Validate
-#undef EPROP
-#undef MARK
-
-/* These are the float.h constants */
-#undef F_RADIX
-#undef F_MANT_DIG
-#undef F_DIG
-#undef F_ROUNDS
-#undef F_EPSILON
-#undef F_MIN_EXP
-#undef F_MIN
-#undef F_MIN_10_EXP
-#undef F_MAX_EXP
-#undef F_MAX
-#undef F_MAX_10_EXP
-#endif
-
-#ifdef Integer
-#undef Integer
-#undef INT
-#undef IPROP
-#undef Iname
-#undef UPROP
-#undef Uname
-#undef OK_UI
-#undef IMARK
-
-#undef I_MAX
-#undef I_MIN
-#undef U_MAX
-#endif
-
-#ifdef PASS1
-
-/* Define the things we're going to use this pass */
-
-#define Number float
-#define THING "FLOAT"
-#define Thing "Float"
-#define thing "float"
-#define Fname "FLT"
-#define FPROP fprop
-#define Store fStore
-#define Sum fSum
-#define Diff fDiff
-#define Mul fMul
-#define Div fDiv
-#define ZERO 0.0
-#define HALF 0.5
-#define ONE 1.0
-#define TWO 2.0
-#define THREE 3.0
-#define FOUR 4.0
-#define Self fSelf
-#define F_check fCheck
-#define MARK "F"
-#ifdef VERIFY
-#define Validate(prec, val, req, same) fValidate(prec, val, req, same)
-#endif
-
-#define EPROP efprop
-
-#define Integer short
-#define INT "short"
-#define IPROP sprop
-#define Iname "SHRT"
-#ifndef NO_UI
-#define OK_UI 1
-#endif
-#define IMARK ""
-
-#define UPROP usprop
-#define Uname "USHRT"
-
-#ifdef SHRT_MAX
-#define I_MAX SHRT_MAX
-#endif
-#ifdef SHRT_MIN
-#define I_MIN SHRT_MIN
-#endif
-#ifdef USHRT_MAX
-#define U_MAX USHRT_MAX
-#endif
-
-#ifdef FLT_RADIX
-#define F_RADIX FLT_RADIX
-#endif
-#ifdef FLT_MANT_DIG
-#define F_MANT_DIG FLT_MANT_DIG
-#endif
-#ifdef FLT_DIG
-#define F_DIG FLT_DIG
-#endif
-#ifdef FLT_ROUNDS
-#define F_ROUNDS FLT_ROUNDS
-#endif
-#ifdef FLT_EPSILON
-#define F_EPSILON FLT_EPSILON
-#endif
-#ifdef FLT_MIN_EXP
-#define F_MIN_EXP FLT_MIN_EXP
-#endif
-#ifdef FLT_MIN
-#define F_MIN FLT_MIN
-#endif
-#ifdef FLT_MIN_10_EXP
-#define F_MIN_10_EXP FLT_MIN_10_EXP
-#endif
-#ifdef FLT_MAX_EXP
-#define F_MAX_EXP FLT_MAX_EXP
-#endif
-#ifdef FLT_MAX
-#define F_MAX FLT_MAX
-#endif
-#ifdef FLT_MAX_10_EXP
-#define F_MAX_10_EXP FLT_MAX_10_EXP
-#endif
-
-#endif /* PASS1 */
-
-#ifdef PASS2
-
-#define Number double
-#define THING "DOUBLE"
-#define Thing "Double"
-#define thing "double"
-#define Fname "DBL"
-#define FPROP dprop
-#define Store dStore
-#define Sum dSum
-#define Diff dDiff
-#define Mul dMul
-#define Div dDiv
-#define ZERO 0.0
-#define HALF 0.5
-#define ONE 1.0
-#define TWO 2.0
-#define THREE 3.0
-#define FOUR 4.0
-#define Self dSelf
-#define F_check dCheck
-#define MARK ""
-#ifdef VERIFY
-#define Validate(prec, val, req, same) dValidate(prec, val, req, same)
-#endif
-
-#define EPROP edprop
-
-#define Integer int
-#define INT "int"
-#define IPROP iprop
-#define Iname "INT"
-#define OK_UI 1 /* Unsigned int is always possible */
-#define IMARK ""
-
-#define UPROP uiprop
-#define Uname "UINT"
-
-#ifdef INT_MAX
-#define I_MAX INT_MAX
-#endif
-#ifdef INT_MIN
-#define I_MIN INT_MIN
-#endif
-#ifdef UINT_MAX
-#define U_MAX UINT_MAX
-#endif
-
-#ifdef DBL_MANT_DIG
-#define F_MANT_DIG DBL_MANT_DIG
-#endif
-#ifdef DBL_DIG
-#define F_DIG DBL_DIG
-#endif
-#ifdef DBL_EPSILON
-#define F_EPSILON DBL_EPSILON
-#endif
-#ifdef DBL_MIN_EXP
-#define F_MIN_EXP DBL_MIN_EXP
-#endif
-#ifdef DBL_MIN
-#define F_MIN DBL_MIN
-#endif
-#ifdef DBL_MIN_10_EXP
-#define F_MIN_10_EXP DBL_MIN_10_EXP
-#endif
-#ifdef DBL_MAX_EXP
-#define F_MAX_EXP DBL_MAX_EXP
-#endif
-#ifdef DBL_MAX
-#define F_MAX DBL_MAX
-#endif
-#ifdef DBL_MAX_10_EXP
-#define F_MAX_10_EXP DBL_MAX_10_EXP
-#endif
-
-#endif /* PASS2 */
-
-#ifdef PASS3
-
-#ifdef STDC
-#define Number long double
-
-#define ZERO 0.0L
-#define HALF 0.5L
-#define ONE 1.0L
-#define TWO 2.0L
-#define THREE 3.0L
-#define FOUR 4.0L
-#endif
-
-#define THING "LONG DOUBLE"
-#define Thing "Long double"
-#define thing "long double"
-#define Fname "LDBL"
-#define FPROP ldprop
-#define Store ldStore
-#define Sum ldSum
-#define Diff ldDiff
-#define Mul ldMul
-#define Div ldDiv
-#define Self ldSelf
-#define F_check ldCheck
-#define MARK "L"
-#ifdef VERIFY
-#define Validate(prec, val, req, same) ldValidate(prec, val, req, same)
-#endif
-
-#define EPROP eldprop
-
-#define Integer long
-#define INT "long"
-#define IPROP lprop
-#define Iname "LONG"
-#ifndef NO_UI
-#define OK_UI 1
-#endif
-#define IMARK "L"
-
-#define UPROP ulprop
-#define Uname "ULONG"
-
-#ifdef LONG_MAX
-#define I_MAX LONG_MAX
-#endif
-#ifdef LONG_MIN
-#define I_MIN LONG_MIN
-#endif
-#ifdef ULONG_MAX
-#define U_MAX ULONG_MAX
-#endif
-
-#ifdef LDBL_MANT_DIG
-#define F_MANT_DIG LDBL_MANT_DIG
-#endif
-#ifdef LDBL_DIG
-#define F_DIG LDBL_DIG
-#endif
-#ifdef LDBL_EPSILON
-#define F_EPSILON LDBL_EPSILON
-#endif
-#ifdef LDBL_MIN_EXP
-#define F_MIN_EXP LDBL_MIN_EXP
-#endif
-#ifdef LDBL_MIN
-#define F_MIN LDBL_MIN
-#endif
-#ifdef LDBL_MIN_10_EXP
-#define F_MIN_10_EXP LDBL_MIN_10_EXP
-#endif
-#ifdef LDBL_MAX_EXP
-#define F_MAX_EXP LDBL_MAX_EXP
-#endif
-#ifdef LDBL_MAX
-#define F_MAX LDBL_MAX
-#endif
-#ifdef LDBL_MAX_10_EXP
-#define F_MAX_10_EXP LDBL_MAX_10_EXP
-#endif
-
-#endif /* PASS3 */
-
-#define UNDEFINED (-2)
-
-#ifndef I_MAX
-#define I_MAX ((unsigned long) UNDEFINED)
-#endif
-#ifndef I_MIN
-#define I_MIN ((unsigned long) UNDEFINED)
-#endif
-#ifndef U_MAX
-#define U_MAX ((unsigned long) UNDEFINED)
-#endif
-
-#ifndef F_RADIX
-#define F_RADIX UNDEFINED
-#endif
-#ifndef F_MANT_DIG
-#define F_MANT_DIG UNDEFINED
-#endif
-#ifndef F_DIG
-#define F_DIG UNDEFINED
-#endif
-#ifndef F_ROUNDS
-#define F_ROUNDS UNDEFINED
-#endif
-#ifndef F_EPSILON
-#define F_EPSILON ((Number) UNDEFINED)
-#endif
-#ifndef F_MIN_EXP
-#define F_MIN_EXP UNDEFINED
-#endif
-#ifndef F_MIN
-#define F_MIN ((Number) UNDEFINED)
-#endif
-#ifndef F_MIN_10_EXP
-#define F_MIN_10_EXP UNDEFINED
-#endif
-#ifndef F_MAX_EXP
-#define F_MAX_EXP UNDEFINED
-#endif
-#ifndef F_MAX
-#define F_MAX ((Number) UNDEFINED)
-#endif
-#ifndef F_MAX_10_EXP
-#define F_MAX_10_EXP UNDEFINED
-#endif
-
-#ifndef VERIFY
-#define Validate(prec, val, req, same) {;}
-#endif
-
-#ifdef Integer
-
-Procedure IPROP() {
- /* the properties of short, int, and long */
- Volatile Integer newi, int_max, maxeri, int_min, minneri;
- Volatile int ibits, ipower, two=2;
-
- /* Calculate max short/int/long ***********************************/
- /* Calculate 2**n-1 until overflow - then use the previous value */
-
- newi=1; int_max=0;
-
- if (setjmp(lab)==0) { /* Yields int_max */
- for(ipower=0; newi>int_max; ipower++) {
- int_max=newi;
- newi=newi*two+1;
- }
- Vprintf("%sOverflow of a%s %s does not generate a trap%s\n",
- co, INT[0]=='i'?"n":"", INT, oc);
- } else {
- Vprintf("%sOverflow of a%s %s generates a trap%s\n",
- co, INT[0]=='i'?"n":"", INT, oc);
- }
- Unexpected(7);
-
- /* Minimum value: assume either two's or one's complement *********/
- int_min= -int_max;
- if (setjmp(lab)==0) { /* Yields int_min */
- if (int_min-1 < int_min) int_min--;
- }
- Unexpected(8);
-
- /* Now for those daft Cybers */
-
- maxeri=0; newi=int_max;
-
- if (setjmp(lab)==0) { /* Yields maxeri */
- for(ibits=ipower; newi>maxeri; ibits++) {
- maxeri=newi;
- newi=newi+newi+1;
- }
- }
- Unexpected(9);
-
- minneri= -maxeri;
- if (setjmp(lab)==0) { /* Yields minneri */
- if (minneri-1 < minneri) minneri--;
- }
- Unexpected(10);
-
- Vprintf("%sMaximum %s = %ld (= 2**%d-1)%s\n",
- co, INT, (long)int_max, ipower, oc);
- Vprintf("%sMinimum %s = %ld%s\n", co, INT, (long)int_min, oc);
-
- if (L) i_define(D_INT_MAX, INT, Iname, "_MAX",
- (long) int_max, 0L,
- (long) I_MAX, IMARK);
- if (L) i_define(D_INT_MIN, INT, Iname, "_MIN",
- (long) int_min, (long) (PASS==1?maxint:int_max),
- (long) I_MIN, IMARK);
-
- if(int_max < 0) { /* It has happened */
- eek_a_bug("signed integral comparison faulty?");
- }
-
- if (maxeri>int_max) {
- Vprintf("%sThere is a larger %s, %ld (= 2**%d-1), %s %s%s\n",
- co, INT, (long)maxeri, ibits,
- "but only for addition, not multiplication",
- "(I smell a Cyber!)",
- oc);
- }
-
- if (minneri<int_min) {
- Vprintf("%sThere is a smaller %s, %ld, %s %s%s\n",
- co, INT, (long)minneri,
- "but only for addition, not multiplication",
- "(I smell a Cyber!)",
- oc);
- }
-}
-
-Procedure UPROP () {
- /* The properties of unsigned short/int/long */
-#ifdef OK_UI
- Volatile unsigned Integer u_max, newi, two;
- newi=1; u_max=0; two=2;
-
- if (setjmp(lab)==0) { /* Yields u_max */
- while(newi>u_max) {
- u_max=newi;
- newi=newi*two+1;
- }
- }
- Unexpected(11);
- Vprintf("%sMaximum unsigned %s = %lu%s\n",
- co, INT, (unsigned long) u_max, oc);
-
- /* Oh woe: new standard C defines value preserving promotions */
- if (L) {
- if (PASS == 1 && sizeof(short) < sizeof(int)) {
- /* Special only for short */
- i_define(D_UINT_MAX, INT, Uname, "_MAX",
- (unsigned long) u_max, 0L,
- (unsigned long) U_MAX, IMARK);
- } else {
- u_define(D_UINT_MAX, INT, Uname, "_MAX",
- (unsigned long) u_max,
- (unsigned long) U_MAX, IMARK);
- }
- }
-#endif
-}
-
-#endif /* Integer */
-
-#ifdef Number
-
-/* The following routines are intended to defeat any attempt at optimisation
- or use of extended precision, and to defeat faulty narrowing casts.
- The weird prototypes are because of widening incompatibilities.
-*/
-#ifdef STDC
-#define ARGS1(atype, a) (atype a)
-#define ARGS2(atype, a, btype, b) (atype a, btype b)
-#else
-#define ARGS1(atype, a) (a) atype a;
-#define ARGS2(atype, a, btype, b) (a, b) atype a; btype b;
-#endif
-
-Procedure Store ARGS2(Number, a, Number *, b) { *b=a; }
-Number Sum ARGS2(Number, a, Number, b) {Number r; Store(a+b, &r); return (r); }
-Number Diff ARGS2(Number, a, Number, b){Number r; Store(a-b, &r); return (r); }
-Number Mul ARGS2(Number, a, Number, b) {Number r; Store(a*b, &r); return (r); }
-Number Div ARGS2(Number, a, Number, b) {Number r; Store(a/b, &r); return (r); }
-Number Self ARGS1(Number, a) {Number r; Store(a, &r); return (r); }
-
-Procedure F_check ARGS((int precision, Long_double val1));
-
-Procedure F_check(precision, val1) int precision; Long_double val1; {
- /* You don't think I'm going to go to all the trouble of writing
- a program that works out what all sorts of values are, only to
- have printf go and print the wrong values out, do you?
- No, you're right, so this function tries to see if printf
- has written the right value, by reading it back again.
- This introduces a new problem of course: suppose printf writes
- the correct value, and scanf reads it back wrong... oh well.
- But I'm adamant about this: the precision given is enough
- to uniquely identify the printed number, therefore I insist
- that sscanf read the number back identically. Harsh yes, but
- sometimes you've got to be cruel to be kind.
- */
- Number val, new, diff;
- double rem;
- int e;
- char *rep;
- char *f2;
-
-#ifdef NO_LONG_DOUBLE_IO
- double new1;
- /* On the Sun 3, sscanf clobbers 4 words,
- which leads to a crash when this function tries to return. */
- f2= "%le"; /* Input */
- /* It is no use checking long doubles if we can't
- read and write them. */
- if (sizeof (Number) > sizeof(double))
- return;
-#else
- Long_double new1;
- if (sizeof(double) == sizeof(Long_double)) {
- /* Assume they're the same, and use non-stdc format */
- /* This is for stdc compilers using non-stdc libraries */
- f2= "%le"; /* Input */
- } else {
- /* It had better support Le then */
- f2= "%Le";
- }
-#endif
- val= val1;
- rep= f_rep(precision, (Long_double) val);
- if (setjmp(lab)==0) {
- sscanf(rep, f2, &new1);
- } else {
- eek_a_bug("sscanf caused a trap");
- printf("%s scanning: %s format: %s%s\n\n", co, rep, f2, oc);
- Unexpected(12);
- return;
- }
-
- if (setjmp(lab)==0) { /* See if new is usable */
- new= new1;
- if (new != 0.0) {
- diff= val/new - 1.0;
- if (diff < 0.1) diff= 1.0;
- /* That should be enough to generate a trap */
- }
- } else {
- eek_a_bug("sscanf returned an unusable number");
- printf("%s scanning: %s with format: %s%s\n\n",
- co, rep, f2, oc);
- Unexpected(13);
- return;
- }
-
- Unexpected(14);
- if (new != val) {
- eek_a_bug("Possibly bad output from printf above");
- if (!exponent((Long_double)val, &rem, &e)) {
- printf("%s but value was an unusable number%s\n\n",
- co, oc);
- return;
- }
- printf("%s expected value around %.*fe%d, bit pattern:\n ",
- co, precision, rem, e);
- bitpattern((char *) &val, (unsigned)sizeof(val));
- printf ("%s\n", oc);
- printf("%s sscanf gave %s, bit pattern:\n ",
- co, f_rep(precision, (Long_double) new));
- bitpattern((char *) &new, (unsigned)sizeof(new));
- printf ("%s\n", oc);
- if (setjmp(lab) == 0) {
- diff= val-new;
- printf("%s difference= %s%s\n\n",
- co, f_rep(precision, (Long_double) diff), oc);
- } /* else forget it */
- Unexpected(15);
- }
-}
-
-#ifdef VERIFY
-Procedure Validate(prec, val, req, same) int prec, same; Long_double val, req; {
- /* Check that the compiler has read a #define value correctly */
- Unexpected(16);
- if (!same) {
- printf("%s*** Verify failed for above #define!\n", co);
- if (setjmp(lab) == 0) { /* for the case that req == nan */
- printf(" Compiler has %s for value%s\n",
- f_rep(prec, req), oc);
- } else {
- printf(" Compiler has %s for value%s\n",
- "an unusable number", oc);
- }
- if (setjmp(lab) == 0) {
- F_check(prec, (Long_double) req);
- } /*else forget it*/
- if (setjmp(lab) == 0) {
- if (req > 0.0 && val > 0.0) {
- printf("%s difference= %s%s\n",
- co, f_rep(prec, val-req), oc);
- }
- } /*else forget it*/
- Unexpected(17);
- printf("\n");
- bugs++;
- } else if (val != req) {
- if (stdc) eek_a_bug("constant has the wrong precision");
- else eek_a_bug("the cast didn't work");
- printf("\n");
- }
-}
-#endif /* VERIFY */
-
-int FPROP(bits_per_byte) int bits_per_byte; {
- /* Properties of floating types, using algorithms by Cody and Waite
- from MA Malcolm, as modified by WM Gentleman and SB Marovich.
- Further extended by S Pemberton.
-
- Returns the number of digits in the fraction.
- */
-
- Volatile int
- i, f_radix, iexp, irnd, mrnd, f_rounds, f_mant_dig,
- iz, k, inf, machep, f_max_exp, f_min_exp, mx, negeps,
- mantbits, digs, f_dig, trap,
- hidden, normal, f_min_10_exp, f_max_10_exp;
- Volatile Number
- a, b, base, basein, basem1, f_epsilon, epsneg,
- eps, epsp1, etop, ebot,
- f_max, newxmax, f_min, xminner, y, y1, z, z1, z2;
-
- Unexpected(18);
-
- Vprintf("%sPROPERTIES OF %s%s\n", co, THING, oc);
-
- /* Base and size of significand **************************************/
- /* First repeatedly double until adding 1 has no effect. */
- /* For instance, if base is 10, with 3 significant digits */
- /* it will try 1, 2, 4, 8, ... 512, 1024, and stop there, */
- /* since 1024 is only representable as 1020. */
- a=1.0;
- if (setjmp(lab)==0) { /* inexact trap? */
- do { a=Sum(a, a); }
- while (Diff(Diff(Sum(a, ONE), a), ONE) == ZERO);
- } else {
- fprintf(stderr, "*** Program got loss-of-precision trap!\n");
- /* And supporting those is just TOO much trouble! */
- farewell(bugs+1);
- }
- Unexpected(19);
- /* Now double until you find a number that can be added to the */
- /* above number. For 1020 this is 8 or 16, depending whether the */
- /* result is rounded or truncated. */
- /* In either case the result is 1030. 1030-1020= the base, 10. */
- b=1.0;
- do { b=Sum(b, b); } while ((base=Diff(Sum(a, b), a)) == ZERO);
- f_radix=base;
- Vprintf("%sBase = %d%s\n", co, f_radix, oc);
-
- /* Sanity check; if base<2, I can't guarantee the rest will work */
- if (f_radix < 2) {
- eek_a_bug("Function return or parameter passing faulty? (This is a guess.)");
- printf("\n");
- return(0);
- }
-
- if (PASS == 1) { /* only for FLT */
- flt_radix= f_radix;
- if (F) i_define(D_FLT_RADIX, "", "FLT", "_RADIX",
- (long) f_radix, 0L, (long) F_RADIX, "");
- } else if (f_radix != flt_radix) {
- printf("\n%s*** WARNING: %s %s (%d) %s%s\n",
- co, thing, "arithmetic has a different radix",
- f_radix, "from float", oc);
- bugs++;
- }
-
- /* Now the number of digits precision */
- f_mant_dig=0; b=1.0;
- do { f_mant_dig++; b=Mul(b, base); }
- while (Diff(Diff(Sum(b, ONE), b), ONE) == ZERO);
- f_dig=floor_log(10, (Long_double)(b/base)) + (base==10?1:0);
- Vprintf("%sSignificant base digits = %d %s %d %s%s\n",
- co, f_mant_dig, "(= at least", f_dig, "decimal digits)", oc);
- if (F) i_define(D_MANT_DIG, thing, Fname, "_MANT_DIG",
- (long) f_mant_dig, 0L, (long) F_MANT_DIG, "");
- if (F) i_define(D_DIG, thing, Fname, "_DIG",
- (long) f_dig, 0L, (long) F_DIG, "");
- digs= ceil_log(10, (Long_double)b); /* the number of digits to printf */
-
- /* Rounding *******************************************************/
- basem1=Diff(base, HALF);
- if (Diff(Sum(a, basem1), a) != ZERO) {
- if (f_radix == 2) basem1=0.375;
- else basem1=1.0;
- if (Diff(Sum(a, basem1), a) != ZERO) irnd=2; /* away from 0 */
- else irnd=1; /* to nearest */
- } else irnd=0; /* towards 0 */
-
- basem1=Diff(base, HALF);
-
- if (Diff(Diff(-a, basem1), -a) != ZERO) {
- if (f_radix == 2) basem1=0.375;
- else basem1=1.0;
- if (Diff(Diff(-a, basem1), -a) != ZERO) mrnd=2; /* away from 0*/
- else mrnd=1; /* to nearest */
- } else mrnd=0; /* towards 0 */
-
- f_rounds= -1; /* Unknown rounding */
- if (irnd==0 && mrnd==0) f_rounds=0; /* zero = chops */
- if (irnd==1 && mrnd==1) f_rounds=1; /* nearest */
- if (irnd==2 && mrnd==0) f_rounds=2; /* +inf */
- if (irnd==0 && mrnd==2) f_rounds=3; /* -inf */
-
- if (f_rounds != -1) {
- Vprintf("%sArithmetic rounds towards ", co);
- switch (f_rounds) {
- case 0: Vprintf("zero (i.e. it chops)"); break;
- case 1: Vprintf("nearest"); break;
- case 2: Vprintf("+infinity"); break;
- case 3: Vprintf("-infinity"); break;
- default: Vprintf("???"); break;
- }
- Vprintf("%s\n", oc);
- } else { /* Hmm, try to give some help here */
- Vprintf("%sArithmetic rounds oddly: %s\n", co, oc);
- Vprintf("%s Negative numbers %s%s\n",
- co, mrnd==0 ? "towards zero" :
- mrnd==1 ? "to nearest" :
- "away from zero",
- oc);
- Vprintf("%s Positive numbers %s%s\n",
- co, irnd==0 ? "towards zero" :
- irnd==1 ? "to nearest" :
- "away from zero",
- oc);
- }
- /* An extra goody */
- if (f_radix == 2 && f_rounds == 1) {
- if (Diff(Sum(a, ONE), a) != ZERO) {
- Vprintf("%s Tie breaking rounds up%s\n", co, oc);
- } else if (Diff(Sum(a, THREE), a) == FOUR) {
- Vprintf("%s Tie breaking rounds to even%s\n", co, oc);
- } else {
- Vprintf("%s Tie breaking rounds down%s\n", co, oc);
- }
- }
- if (PASS == 1) { /* only for FLT */
- flt_rounds= f_rounds;
- /* Prefer system float.h definition of F_ROUNDS,
- since it's more likely to be right than our "1". */
- if (F && (!SYS_FLOAT_H_WRAP || F_ROUNDS == UNDEFINED))
- i_define(D_FLT_ROUNDS, "", "FLT", "_ROUNDS",
- (long) f_rounds, 1L, (long) F_ROUNDS, "");
- } else if (f_rounds != flt_rounds) {
- printf("\n%s*** WARNING: %s %s (%d) %s%s\n",
- co, thing, "arithmetic rounds differently",
- f_rounds, "from float", oc);
- bugs++;
- }
-
- /* Various flavours of epsilon ************************************/
- negeps=f_mant_dig+f_mant_dig;
- basein=1.0/base;
- a=1.0;
- for(i=1; i<=negeps; i++) a*=basein;
-
- b=a;
- while (Diff(Diff(ONE, a), ONE) == ZERO) {
- a*=base;
- negeps--;
- }
- negeps= -negeps;
- Vprintf("%sSmallest x such that 1.0-base**x != 1.0 = %d%s\n",
- co, negeps, oc);
-
- etop = ONE;
- ebot = ZERO;
- eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
- /* find the smallest epsneg (1-epsneg != 1) by binary search.
- ebot and etop are the current bounds */
- while (eps != ebot && eps != etop) {
- epsp1 = Diff(ONE, eps);
- if (epsp1 < ONE) etop = eps;
- else ebot = eps;
- eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
- }
- eps= etop;
- /* Sanity check */
- if (Diff(ONE, etop) >= ONE || Diff(ONE, ebot) != ONE) {
- eek_a_bug("internal error calculating epsneg");
- }
- Vprintf("%sSmallest x such that 1.0-x != 1.0 = %s%s\n",
- co, f_rep(digs, (Long_double) eps), oc);
- if (V) F_check(digs, (Long_double) eps);
-
- epsneg=a;
- if ((f_radix!=2) && irnd) {
- /* a=(a*(1.0+a))/(1.0+1.0); => */
- a=Div(Mul(a, Sum(ONE, a)), Sum(ONE, ONE));
- /* if ((1.0-a)-1.0 != 0.0) epsneg=a; => */
- if (Diff(Diff(ONE, a), ONE) != ZERO) epsneg=a;
- }
- /* epsneg is used later */
- Unexpected(20);
-
- machep= -f_mant_dig-f_mant_dig;
- a=b;
- while (Diff(Sum(ONE, a), ONE) == ZERO) { a*=base; machep++; }
- Vprintf("%sSmallest x such that 1.0+base**x != 1.0 = %d%s\n",
- co, machep, oc);
-
- etop = ONE;
- ebot = ZERO;
- eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
- /* find the smallest eps (1+eps != 1) by binary search.
- ebot and etop are the current bounds */
- while (eps != ebot && eps != etop) {
- epsp1 = Sum(ONE, eps);
- if (epsp1 > ONE) etop = eps;
- else ebot = eps;
- eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
- }
- /* Sanity check */
- if (Sum(ONE, etop) <= ONE || Sum(ONE, ebot) != ONE) {
- eek_a_bug("internal error calculating eps");
- }
- f_epsilon=etop;
-
- Vprintf("%sSmallest x such that 1.0+x != 1.0 = %s%s\n",
- co, f_rep(digs, (Long_double) f_epsilon), oc);
-
- f_epsilon= Diff(Sum(ONE, f_epsilon), ONE); /* New C standard defn */
- Vprintf("%s(Above number + 1.0) - 1.0 = %s%s\n",
- co, f_rep(digs, (Long_double) (f_epsilon)), oc);
-
- /* Possible loss of precision warnings here from non-stdc compilers */
- if (F) f_define(D_EPSILON, thing,
- Fname, "_EPSILON", digs,
- (Long_double) f_epsilon,
- (Long_double) F_EPSILON, MARK);
- if (V || F) F_check(digs, (Long_double) f_epsilon);
- Unexpected(21);
- if (F) Validate(digs, (Long_double) f_epsilon, (Long_double) F_EPSILON,
- f_epsilon == Self(F_EPSILON));
- Unexpected(22);
-
- /* Extra chop info *************************************************/
- if (f_rounds == 0) {
- if (Diff(Mul(Sum(ONE,f_epsilon),ONE),ONE) != ZERO) {
- Vprintf("%sAlthough arithmetic chops, it uses guard digits%s\n", co, oc);
- }
- }
-
- /* Size of and minimum normalised exponent ************************/
- y=0; i=0; k=1; z=basein; z1=(1.0+f_epsilon)/base;
-
- /* Coarse search for the largest power of two */
- if (setjmp(lab)==0) { /* for underflow trap */ /* Yields i, k, y, y1 */
- do {
- y=z; y1=z1;
- z=Mul(y,y); z1=Mul(z1, y);
- a=Mul(z,ONE);
- z2=Div(z1,y);
- if (z2 != y1) break;
- if ((Sum(a,a) == ZERO) || (fabs(z) >= y)) break;
- i++;
- k+=k;
- } while(1);
- } else {
- Vprintf("%s%s underflow generates a trap%s\n", co, Thing, oc);
- }
- Unexpected(23);
-
- if (f_radix != 10) {
- iexp=i+1; /* for the sign */
- mx=k+k;
- } else {
- iexp=2;
- iz=f_radix;
- while (k >= iz) { iz*=f_radix; iexp++; }
- mx=iz+iz-1;
- }
-
- /* Fine tune starting with y and y1 */
- if (setjmp(lab)==0) { /* for underflow trap */ /* Yields k, f_min */
- do {
- f_min=y; z1=y1;
- y=Div(y,base); y1=Div(y1,base);
- a=Mul(y,ONE);
- z2=Mul(y1,base);
- if (z2 != z1) break;
- if ((Sum(a,a) == ZERO) || (fabs(y) >= f_min)) break;
- k++;
- } while (1);
- }
- Unexpected(24);
-
- f_min_exp=(-k)+1;
-
- if ((mx <= k+k-3) && (f_radix != 10)) { mx+=mx; iexp+=1; }
- Vprintf("%sNumber of bits used for exponent = %d%s\n", co, iexp, oc);
- Vprintf("%sMinimum normalised exponent = %d%s\n", co, f_min_exp-1, oc);
- if (F)
- i_define(D_MIN_EXP, thing, Fname, "_MIN_EXP",
- (long) f_min_exp, (long) maxint, (long) F_MIN_EXP, "");
-
- if (setjmp(lab)==0) {
- Vprintf("%sMinimum normalised positive number = %s%s\n",
- co, f_rep(digs, (Long_double) f_min), oc);
- } else {
- eek_a_bug("printf can't print the smallest normalised number");
- printf("\n");
- }
- Unexpected(25);
- /* Possible loss of precision warnings here from non-stdc compilers */
- if (setjmp(lab) == 0) {
- if (F) f_define(D_MIN, thing,
- Fname, "_MIN", digs,
- (Long_double) f_min,
- (Long_double) F_MIN, MARK);
- if (V || F) F_check(digs, (Long_double) f_min);
- } else {
- eek_a_bug("xxx_MIN caused a trap");
- printf("\n");
- }
-
- if (setjmp(lab) == 0) {
- if (F) Validate(digs, (Long_double) f_min, (Long_double) F_MIN,
- f_min == Self(F_MIN));
- } else {
- printf("%s*** Verify failed for above #define!\n %s %s\n\n",
- co, "Compiler has an unusable number for value", oc);
- bugs++;
- }
- Unexpected(26);
-
- a=1.0; f_min_10_exp=0;
- while (a > f_min*10.0) { a/=10.0; f_min_10_exp--; }
- if (F) i_define(D_MIN_10_EXP, thing, Fname, "_MIN_10_EXP",
- (long) f_min_10_exp, (long) maxint,
- (long) F_MIN_10_EXP, "");
-
- /* Minimum exponent ************************************************/
- if (setjmp(lab)==0) { /* for underflow trap */ /* Yields xminner */
- do {
- xminner=y;
- y=Div(y,base);
- a=Mul(y,ONE);
- if ((Sum(a,a) == ZERO) || (fabs(y) >= xminner)) break;
- } while (1);
- }
- Unexpected(27);
-
- if (xminner != 0.0 && xminner != f_min) {
- normal= 0;
- Vprintf("%sThe smallest numbers are not kept normalised%s\n",
- co, oc);
- if (setjmp(lab)==0) {
- Vprintf("%sSmallest unnormalised positive number = %s%s\n",
- co, f_rep(digs, (Long_double) xminner), oc);
- if (V) F_check(digs, (Long_double) xminner);
- } else {
- eek_a_bug("printf can't print the smallest unnormalised number.");
- printf("\n");
- }
- Unexpected(28);
- } else {
- normal= 1;
- Vprintf("%sThe smallest numbers are normalised%s\n", co, oc);
- }
-
- /* Maximum exponent ************************************************/
- f_max_exp=2; f_max=1.0; newxmax=base+1.0;
- inf=0; trap=0;
- while (f_max<newxmax) {
- f_max=newxmax;
- if (setjmp(lab) == 0) { /* Yields inf, f_max_exp */
- newxmax=Mul(newxmax, base);
- } else {
- trap=1;
- break;
- }
- if (Div(newxmax, base) != f_max) {
- inf=1; /* ieee infinity */
- break;
- }
- f_max_exp++;
- }
- Unexpected(29);
- if (trap) {
- Vprintf("%s%s overflow generates a trap%s\n", co, Thing, oc);
- }
-
- if (inf) Vprintf("%sThere is an 'infinite' value%s\n", co, oc);
- Vprintf("%sMaximum exponent = %d%s\n", co, f_max_exp, oc);
- if (F) i_define(D_MAX_EXP, thing, Fname, "_MAX_EXP",
- (long) f_max_exp, 0L, (long) F_MAX_EXP, "");
-
- /* Largest number ***************************************************/
- f_max=Diff(ONE, epsneg);
- if (Mul(f_max,ONE) != f_max) f_max=Diff(ONE, Mul(base,epsneg));
- for (i=1; i<=f_max_exp; i++) f_max=Mul(f_max, base);
-
- if (setjmp(lab)==0) {
- Vprintf("%sMaximum number = %s%s\n",
- co, f_rep(digs, (Long_double) f_max), oc);
- } else {
- eek_a_bug("printf can't print the largest double.");
- printf("\n");
- }
- if (setjmp(lab)==0) {
- /* Possible loss of precision warnings here from non-stdc compilers */
- if (F) f_define(D_MAX, thing,
- Fname, "_MAX", digs,
- (Long_double) f_max,
- (Long_double) F_MAX, MARK);
- if (V || F) F_check(digs, (Long_double) f_max);
- } else {
- eek_a_bug("xxx_MAX caused a trap");
- printf("\n");
- }
- if (setjmp(lab)==0) {
- if (F) Validate(digs, (Long_double) f_max, (Long_double) F_MAX,
- f_max == Self(F_MAX));
- } else {
- printf("%s*** Verify failed for above #define!\n %s %s\n\n",
- co, "Compiler has an unusable number for value", oc);
- bugs++;
- }
- Unexpected(30);
-
- a=1.0; f_max_10_exp=0;
- while (a < f_max/10.0) { a*=10.0; f_max_10_exp++; }
- if (F) i_define(D_MAX_10_EXP, thing, Fname, "_MAX_10_EXP",
- (long) f_max_10_exp, 0L, (long) F_MAX_10_EXP, "");
-
- /* Hidden bit + sanity check ****************************************/
- if (f_radix != 10) {
- hidden=0;
- mantbits=floor_log(2, (Long_double)f_radix)*f_mant_dig;
- if (mantbits == 64
- && iexp == 15
- && f_max_exp+f_min_exp > 0 /* ??? f_min_exp may be wrong. */
- && mantbits+iexp+17 == (int)sizeof(Number)*bits_per_byte) {
- Vprintf("%sArithmetic probably doesn't use a hidden bit%s\n", co, oc);
- Vprintf("%sIt's probably 80387 or 68881 extended real%s\n", co, oc);
- goto is_extended;
- }
- if (mantbits+iexp == (int)sizeof(Number)*bits_per_byte) {
- hidden=1;
- Vprintf("%sArithmetic uses a hidden bit%s\n", co, oc);
- } else if (mantbits+iexp+1 == (int)sizeof(Number)*bits_per_byte) {
- Vprintf("%sArithmetic doesn't use a hidden bit%s\n",
- co, oc);
- } else {
- printf("\n%s%s\n %s %s %s!%s\n\n",
- co,
- "*** Something fishy here!",
- "Exponent size + significand size doesn't match",
- "with the size of a", thing,
- oc);
- }
- if (hidden && f_radix == 2 && f_max_exp+f_min_exp==3) {
- Vprintf("%sIt looks like %s length IEEE format%s\n",
- co, f_mant_dig==24 ? "single" :
- f_mant_dig==53 ? "double" :
- f_mant_dig >53 ? "extended" :
- "some", oc);
-is_extended:
- if (f_rounds != 1 || normal) {
- Vprintf("%s though ", co);
- if (f_rounds != 1) {
- Vprintf("the rounding is unusual");
- if (normal) Vprintf(" and ");
- }
- if (normal) Vprintf("the normalisation is unusual");
- Vprintf("%s\n", oc);
- }
- } else {
- Vprintf("%sIt doesn't look like IEEE format%s\n",
- co, oc);
- }
- }
- printf("\n"); /* regardless of verbosity */
- return f_mant_dig;
-}
-
-Procedure EPROP(fprec, dprec, lprec) int fprec, dprec, lprec; {
- /* See if expressions are evaluated in extended precision.
- Some compilers optimise even if you don't want it,
- and then this function fails to produce the right result.
- We try to diagnose this if it happens.
- */
- Volatile int eprec;
- Volatile double a, b, base, old;
- Volatile Number d, oldd, dbase, one, zero;
- Volatile int bad=0;
-
- /* Size of significand **************************************/
- a=1.0;
- if (setjmp(lab) == 0) { /* Yields nothing */
- do { old=a; a=a+a; }
- while ((((a+1.0)-a)-1.0) == 0.0 && a>old);
- } else bad=1;
-
- /* Avoid the comparison if bad is set,
- to avoid trouble on the convex. */
- if (!bad && (a <= old)) bad=1;
-
- if (!bad) {
- b=1.0;
- if (setjmp(lab) == 0) { /* Yields nothing */
- do { old=b; b=b+b; }
- while ((base=((a+b)-a)) == 0.0 && b>old);
- if (b <= old) bad=1;
- } else bad=1;
- }
-
- if (!bad) {
- eprec=0; d=1.0; dbase=base; one=1.0; zero=0.0;
- if (setjmp(lab) == 0) { /* Yields nothing */
- do { eprec++; oldd=d; d=d*dbase; }
- while ((((d+one)-d)-one) == zero && d>oldd);
- if (d <= oldd) bad=1;
- } else bad=1;
- }
-
- Unexpected(31);
-
- if (bad) {
- Vprintf("%sCan't determine precision for %s expressions:\n%s%s\n",
- co, thing, " check that you compiled without optimisation!",
- oc);
- } else if (eprec==dprec) {
- Vprintf("%s%s expressions are evaluated in double precision%s\n",
- co, Thing, oc);
- } else if (eprec==fprec) {
- Vprintf("%s%s expressions are evaluated in float precision%s\n",
- co, Thing, oc);
- } else if (eprec==lprec) {
- Vprintf("%s%s expressions are evaluated in long double precision%s\n",
- co, Thing, oc);
- } else {
- Vprintf("%s%s expressions are evaluated in a %s %s %d %s%s\n",
- co, Thing, eprec>dprec ? "higher" : "lower",
- "precision than double,\n using",
- eprec, "base digits",
- oc);
- }
-}
-
-#else /* not Number */
-
-#ifdef FPROP /* Then create dummy routines for long double */
-/* ARGSUSED */
-int FPROP(bits_per_byte) int bits_per_byte; { return 0; }
-#endif
-#ifdef EPROP
-/* ARGSUSED */
-Procedure EPROP(fprec, dprec, lprec) int fprec, dprec, lprec; {}
-#endif
-
-#endif /* ifdef Number */
-
-/* Increment the pass number */
-#undef PASS
-
-#ifdef PASS2
-#undef PASS2
-#define PASS 3
-#define PASS3 1
-#endif
-
-#ifdef PASS1
-#undef PASS1
-#define PASS 2
-#define PASS2 1
-#endif
-
-#ifdef PASS0
-#undef PASS0
-#endif
-
-#ifdef PASS /* then rescan this file */
-#ifdef NO_FILE
-#include "enquire.c"
-#else
-#include FILENAME /* if this line fails to compile, define NO_FILE */
-#endif
-#endif /* PASS */
-
diff --git a/contrib/gcc_update b/contrib/gcc_update
index 06a7852155c..d00fd43c6b6 100755
--- a/contrib/gcc_update
+++ b/contrib/gcc_update
@@ -104,6 +104,8 @@ libjava/libltdl/aclocal.m4: libjava/libltdl/configure.in libjava/libltdl/acinclu
libjava/libltdl/Makefile.in: libjava/libltdl/Makefile.am libjava/libltdl/configure.in libjava/libltdl/aclocal.m4
libjava/libltdl/configure: libjava/libltdl/configure.in libjava/libltdl/aclocal.m4
libjava/libltdl/stamp-h.in: libjava/libltdl/configure.in libjava/libltdl/aclocal.m4 libjava/libltdl/acconfig.h
+# Top level
+Makefile.in: Makefile.tpl Makefile.def
EOF
}
diff --git a/contrib/paranoia.cc b/contrib/paranoia.cc
new file mode 100644
index 00000000000..fafb92b708f
--- /dev/null
+++ b/contrib/paranoia.cc
@@ -0,0 +1,2699 @@
+/* A C version of Kahan's Floating Point Test "Paranoia"
+
+Thos Sumner, UCSF, Feb. 1985
+David Gay, BTL, Jan. 1986
+
+This is a rewrite from the Pascal version by
+
+B. A. Wichmann, 18 Jan. 1985
+
+(and does NOT exhibit good C programming style).
+
+Adjusted to use Standard C headers 19 Jan. 1992 (dmg);
+
+(C) Apr 19 1983 in BASIC version by:
+Professor W. M. Kahan,
+567 Evans Hall
+Electrical Engineering & Computer Science Dept.
+University of California
+Berkeley, California 94720
+USA
+
+converted to Pascal by:
+B. A. Wichmann
+National Physical Laboratory
+Teddington Middx
+TW11 OLW
+UK
+
+converted to C by:
+
+David M. Gay and Thos Sumner
+AT&T Bell Labs Computer Center, Rm. U-76
+600 Mountain Avenue University of California
+Murray Hill, NJ 07974 San Francisco, CA 94143
+USA USA
+
+with simultaneous corrections to the Pascal source (reflected
+in the Pascal source available over netlib).
+[A couple of bug fixes from dgh = sun!dhough incorporated 31 July 1986.]
+
+Reports of results on various systems from all the versions
+of Paranoia are being collected by Richard Karpinski at the
+same address as Thos Sumner. This includes sample outputs,
+bug reports, and criticisms.
+
+You may copy this program freely if you acknowledge its source.
+Comments on the Pascal version to NPL, please.
+
+The following is from the introductory commentary from Wichmann's work:
+
+The BASIC program of Kahan is written in Microsoft BASIC using many
+facilities which have no exact analogy in Pascal. The Pascal
+version below cannot therefore be exactly the same. Rather than be
+a minimal transcription of the BASIC program, the Pascal coding
+follows the conventional style of block-structured languages. Hence
+the Pascal version could be useful in producing versions in other
+structured languages.
+
+Rather than use identifiers of minimal length (which therefore have
+little mnemonic significance), the Pascal version uses meaningful
+identifiers as follows [Note: A few changes have been made for C]:
+
+
+BASIC C BASIC C BASIC C
+
+A J S StickyBit
+A1 AInverse J0 NoErrors T
+B Radix [Failure] T0 Underflow
+B1 BInverse J1 NoErrors T2 ThirtyTwo
+B2 RadixD2 [SeriousDefect] T5 OneAndHalf
+B9 BMinusU2 J2 NoErrors T7 TwentySeven
+C [Defect] T8 TwoForty
+C1 CInverse J3 NoErrors U OneUlp
+D [Flaw] U0 UnderflowThreshold
+D4 FourD K PageNo U1
+E0 L Milestone U2
+E1 M V
+E2 Exp2 N V0
+E3 N1 V8
+E5 MinSqEr O Zero V9
+E6 SqEr O1 One W
+E7 MaxSqEr O2 Two X
+E8 O3 Three X1
+E9 O4 Four X8
+F1 MinusOne O5 Five X9 Random1
+F2 Half O8 Eight Y
+F3 Third O9 Nine Y1
+F6 P Precision Y2
+F9 Q Y9 Random2
+G1 GMult Q8 Z
+G2 GDiv Q9 Z0 PseudoZero
+G3 GAddSub R Z1
+H R1 RMult Z2
+H1 HInverse R2 RDiv Z9
+I R3 RAddSub
+IO NoTrials R4 RSqrt
+I3 IEEE R9 Random9
+
+SqRWrng
+
+All the variables in BASIC are true variables and in consequence,
+the program is more difficult to follow since the "constants" must
+be determined (the glossary is very helpful). The Pascal version
+uses Real constants, but checks are added to ensure that the values
+are correctly converted by the compiler.
+
+The major textual change to the Pascal version apart from the
+identifiersis that named procedures are used, inserting parameters
+wherehelpful. New procedures are also introduced. The
+correspondence is as follows:
+
+
+BASIC Pascal
+lines
+
+90- 140 Pause
+170- 250 Instructions
+380- 460 Heading
+480- 670 Characteristics
+690- 870 History
+2940-2950 Random
+3710-3740 NewD
+4040-4080 DoesYequalX
+4090-4110 PrintIfNPositive
+4640-4850 TestPartialUnderflow
+
+*/
+
+ /* This version of paranoia has been modified to work with GCC's internal
+ software floating point emulation library, as a sanity check of same.
+
+ I'm doing this in C++ so that I can do operator overloading and not
+ have to modify so damned much of the existing code. */
+
+ extern "C" {
+#include <stdio.h>
+#include <stddef.h>
+#include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <unistd.h>
+#include <float.h>
+
+ /* This part is made all the more awful because many gcc headers are
+ not prepared at all to be parsed as C++. The biggest stickler
+ here is const structure members. So we include exactly the pieces
+ that we need. */
+
+#define GTY(x)
+
+#include "ansidecl.h"
+#include "auto-host.h"
+#include "hwint.h"
+
+#undef EXTRA_MODES_FILE
+
+ struct rtx_def;
+ typedef struct rtx_def *rtx;
+ struct rtvec_def;
+ typedef struct rtvec_def *rtvec;
+ union tree_node;
+ typedef union tree_node *tree;
+
+#define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
+ enum tree_code {
+#include "tree.def"
+ LAST_AND_UNUSED_TREE_CODE
+ };
+#undef DEFTREECODE
+
+#define ENUM_BITFIELD(X) enum X
+#define class klass
+
+#include "real.h"
+
+#undef class
+ }
+
+/* We never produce signals from the library. Thus setjmp need do nothing. */
+#undef setjmp
+#define setjmp(x) (0)
+
+static bool verbose = false;
+static int verbose_index = 0;
+
+/* ====================================================================== */
+/* The implementation of the abstract floating point class based on gcc's
+ real.c. I.e. the object of this excersize. Templated so that we can
+ all fp sizes. */
+
+class real_c_float
+{
+ public:
+ static const enum machine_mode MODE = SFmode;
+
+ private:
+ long image[128 / 32];
+
+ void from_long(long);
+ void from_str(const char *);
+ void binop(int code, const real_c_float&);
+ void unop(int code);
+ bool cmp(int code, const real_c_float&) const;
+
+ public:
+ real_c_float()
+ { }
+ real_c_float(long l)
+ { from_long(l); }
+ real_c_float(const char *s)
+ { from_str(s); }
+ real_c_float(const real_c_float &b)
+ { memcpy(image, b.image, sizeof(image)); }
+
+ const real_c_float& operator= (long l)
+ { from_long(l); return *this; }
+ const real_c_float& operator= (const char *s)
+ { from_str(s); return *this; }
+ const real_c_float& operator= (const real_c_float &b)
+ { memcpy(image, b.image, sizeof(image)); return *this; }
+
+ const real_c_float& operator+= (const real_c_float &b)
+ { binop(PLUS_EXPR, b); return *this; }
+ const real_c_float& operator-= (const real_c_float &b)
+ { binop(MINUS_EXPR, b); return *this; }
+ const real_c_float& operator*= (const real_c_float &b)
+ { binop(MULT_EXPR, b); return *this; }
+ const real_c_float& operator/= (const real_c_float &b)
+ { binop(RDIV_EXPR, b); return *this; }
+
+ real_c_float operator- () const
+ { real_c_float r(*this); r.unop(NEGATE_EXPR); return r; }
+ real_c_float abs () const
+ { real_c_float r(*this); r.unop(ABS_EXPR); return r; }
+
+ bool operator < (const real_c_float &b) const { return cmp(LT_EXPR, b); }
+ bool operator <= (const real_c_float &b) const { return cmp(LE_EXPR, b); }
+ bool operator == (const real_c_float &b) const { return cmp(EQ_EXPR, b); }
+ bool operator != (const real_c_float &b) const { return cmp(NE_EXPR, b); }
+ bool operator >= (const real_c_float &b) const { return cmp(GE_EXPR, b); }
+ bool operator > (const real_c_float &b) const { return cmp(GT_EXPR, b); }
+
+ const char * str () const;
+ const char * hex () const;
+ long integer () const;
+ int exp () const;
+ void ldexp (int);
+};
+
+void
+real_c_float::from_long (long l)
+{
+ REAL_VALUE_TYPE f;
+
+ real_from_integer (&f, MODE, l, l < 0 ? -1 : 0, 0);
+ real_to_target (image, &f, MODE);
+}
+
+void
+real_c_float::from_str (const char *s)
+{
+ REAL_VALUE_TYPE f;
+ const char *p = s;
+
+ if (*p == '-' || *p == '+')
+ p++;
+ if (strcasecmp(p, "inf") == 0)
+ {
+ real_inf (&f);
+ if (*s == '-')
+ real_arithmetic (&f, NEGATE_EXPR, &f, NULL);
+ }
+ else if (strcasecmp(p, "nan") == 0)
+ real_nan (&f, "", 1, MODE);
+ else
+ real_from_string (&f, s);
+
+ real_to_target (image, &f, MODE);
+}
+
+void
+real_c_float::binop (int code, const real_c_float &b)
+{
+ REAL_VALUE_TYPE ai, bi, ri;
+
+ real_from_target (&ai, image, MODE);
+ real_from_target (&bi, b.image, MODE);
+ real_arithmetic (&ri, code, &ai, &bi);
+ real_to_target (image, &ri, MODE);
+
+ if (verbose)
+ {
+ char ab[64], bb[64], rb[64];
+ const real_format *fmt = real_format_for_mode[MODE - QFmode];
+ const int digits = (fmt->p * fmt->log2_b + 3) / 4;
+ char symbol_for_code;
+
+ real_from_target (&ri, image, MODE);
+ real_to_hexadecimal (ab, &ai, sizeof(ab), digits, 0);
+ real_to_hexadecimal (bb, &bi, sizeof(bb), digits, 0);
+ real_to_hexadecimal (rb, &ri, sizeof(rb), digits, 0);
+
+ switch (code)
+ {
+ case PLUS_EXPR:
+ symbol_for_code = '+';
+ break;
+ case MINUS_EXPR:
+ symbol_for_code = '-';
+ break;
+ case MULT_EXPR:
+ symbol_for_code = '*';
+ break;
+ case RDIV_EXPR:
+ symbol_for_code = '/';
+ break;
+ default:
+ abort ();
+ }
+
+ fprintf (stderr, "%6d: %s %c %s = %s\n", verbose_index++,
+ ab, symbol_for_code, bb, rb);
+ }
+}
+
+void
+real_c_float::unop (int code)
+{
+ REAL_VALUE_TYPE ai, ri;
+
+ real_from_target (&ai, image, MODE);
+ real_arithmetic (&ri, code, &ai, NULL);
+ real_to_target (image, &ri, MODE);
+
+ if (verbose)
+ {
+ char ab[64], rb[64];
+ const real_format *fmt = real_format_for_mode[MODE - QFmode];
+ const int digits = (fmt->p * fmt->log2_b + 3) / 4;
+ const char *symbol_for_code;
+
+ real_from_target (&ri, image, MODE);
+ real_to_hexadecimal (ab, &ai, sizeof(ab), digits, 0);
+ real_to_hexadecimal (rb, &ri, sizeof(rb), digits, 0);
+
+ switch (code)
+ {
+ case NEGATE_EXPR:
+ symbol_for_code = "-";
+ break;
+ case ABS_EXPR:
+ symbol_for_code = "abs ";
+ break;
+ default:
+ abort ();
+ }
+
+ fprintf (stderr, "%6d: %s%s = %s\n", verbose_index++,
+ symbol_for_code, ab, rb);
+ }
+}
+
+bool
+real_c_float::cmp (int code, const real_c_float &b) const
+{
+ REAL_VALUE_TYPE ai, bi;
+ bool ret;
+
+ real_from_target (&ai, image, MODE);
+ real_from_target (&bi, b.image, MODE);
+ ret = real_compare (code, &ai, &bi);
+
+ if (verbose)
+ {
+ char ab[64], bb[64];
+ const real_format *fmt = real_format_for_mode[MODE - QFmode];
+ const int digits = (fmt->p * fmt->log2_b + 3) / 4;
+ const char *symbol_for_code;
+
+ real_to_hexadecimal (ab, &ai, sizeof(ab), digits, 0);
+ real_to_hexadecimal (bb, &bi, sizeof(bb), digits, 0);
+
+ switch (code)
+ {
+ case LT_EXPR:
+ symbol_for_code = "<";
+ break;
+ case LE_EXPR:
+ symbol_for_code = "<=";
+ break;
+ case EQ_EXPR:
+ symbol_for_code = "==";
+ break;
+ case NE_EXPR:
+ symbol_for_code = "!=";
+ break;
+ case GE_EXPR:
+ symbol_for_code = ">=";
+ break;
+ case GT_EXPR:
+ symbol_for_code = ">";
+ break;
+ default:
+ abort ();
+ }
+
+ fprintf (stderr, "%6d: %s %s %s = %s\n", verbose_index++,
+ ab, symbol_for_code, bb, (ret ? "true" : "false"));
+ }
+
+ return ret;
+}
+
+const char *
+real_c_float::str() const
+{
+ REAL_VALUE_TYPE f;
+ const real_format *fmt = real_format_for_mode[MODE - QFmode];
+ const int digits = int(fmt->p * fmt->log2_b * .30102999566398119521 + 1);
+
+ real_from_target (&f, image, MODE);
+ char *buf = new char[digits + 10];
+ real_to_decimal (buf, &f, digits+10, digits, 0);
+
+ return buf;
+}
+
+const char *
+real_c_float::hex() const
+{
+ REAL_VALUE_TYPE f;
+ const real_format *fmt = real_format_for_mode[MODE - QFmode];
+ const int digits = (fmt->p * fmt->log2_b + 3) / 4;
+
+ real_from_target (&f, image, MODE);
+ char *buf = new char[digits + 10];
+ real_to_hexadecimal (buf, &f, digits+10, digits, 0);
+
+ return buf;
+}
+
+long
+real_c_float::integer() const
+{
+ REAL_VALUE_TYPE f;
+ real_from_target (&f, image, MODE);
+ return real_to_integer (&f);
+}
+
+int
+real_c_float::exp() const
+{
+ REAL_VALUE_TYPE f;
+ real_from_target (&f, image, MODE);
+ return real_exponent (&f);
+}
+
+void
+real_c_float::ldexp (int exp)
+{
+ REAL_VALUE_TYPE ai;
+
+ real_from_target (&ai, image, MODE);
+ real_ldexp (&ai, &ai, exp);
+ real_to_target (image, &ai, MODE);
+}
+
+/* ====================================================================== */
+/* An implementation of the abstract floating point class that uses native
+ arithmetic. Exists for reference and debugging. */
+
+template<typename T>
+class native_float
+{
+ private:
+ // Force intermediate results back to memory.
+ volatile T image;
+
+ static T from_str (const char *);
+ static T do_abs (T);
+ static T verbose_binop (T, char, T, T);
+ static T verbose_unop (const char *, T, T);
+ static bool verbose_cmp (T, const char *, T, bool);
+
+ public:
+ native_float()
+ { }
+ native_float(long l)
+ { image = l; }
+ native_float(const char *s)
+ { image = from_str(s); }
+ native_float(const native_float &b)
+ { image = b.image; }
+
+ const native_float& operator= (long l)
+ { image = l; return *this; }
+ const native_float& operator= (const char *s)
+ { image = from_str(s); return *this; }
+ const native_float& operator= (const native_float &b)
+ { image = b.image; return *this; }
+
+ const native_float& operator+= (const native_float &b)
+ {
+ image = verbose_binop(image, '+', b.image, image + b.image);
+ return *this;
+ }
+ const native_float& operator-= (const native_float &b)
+ {
+ image = verbose_binop(image, '-', b.image, image - b.image);
+ return *this;
+ }
+ const native_float& operator*= (const native_float &b)
+ {
+ image = verbose_binop(image, '*', b.image, image * b.image);
+ return *this;
+ }
+ const native_float& operator/= (const native_float &b)
+ {
+ image = verbose_binop(image, '/', b.image, image / b.image);
+ return *this;
+ }
+
+ native_float operator- () const
+ {
+ native_float r;
+ r.image = verbose_unop("-", image, -image);
+ return r;
+ }
+ native_float abs () const
+ {
+ native_float r;
+ r.image = verbose_unop("abs ", image, do_abs(image));
+ return r;
+ }
+
+ bool operator < (const native_float &b) const
+ { return verbose_cmp(image, "<", b.image, image < b.image); }
+ bool operator <= (const native_float &b) const
+ { return verbose_cmp(image, "<=", b.image, image <= b.image); }
+ bool operator == (const native_float &b) const
+ { return verbose_cmp(image, "==", b.image, image == b.image); }
+ bool operator != (const native_float &b) const
+ { return verbose_cmp(image, "!=", b.image, image != b.image); }
+ bool operator >= (const native_float &b) const
+ { return verbose_cmp(image, ">=", b.image, image >= b.image); }
+ bool operator > (const native_float &b) const
+ { return verbose_cmp(image, ">", b.image, image > b.image); }
+
+ const char * str () const;
+ const char * hex () const;
+ long integer () const
+ { return long(image); }
+ int exp () const;
+ void ldexp (int);
+};
+
+template<typename T>
+inline T
+native_float<T>::from_str (const char *s)
+{
+ return strtold (s, NULL);
+}
+
+template<>
+inline float
+native_float<float>::from_str (const char *s)
+{
+ return strtof (s, NULL);
+}
+
+template<>
+inline double
+native_float<double>::from_str (const char *s)
+{
+ return strtod (s, NULL);
+}
+
+template<typename T>
+inline T
+native_float<T>::do_abs (T image)
+{
+ return fabsl (image);
+}
+
+template<>
+inline float
+native_float<float>::do_abs (float image)
+{
+ return fabsf (image);
+}
+
+template<>
+inline double
+native_float<double>::do_abs (double image)
+{
+ return fabs (image);
+}
+
+template<typename T>
+T
+native_float<T>::verbose_binop (T a, char symbol, T b, T r)
+{
+ if (verbose)
+ {
+ const int digits = int(sizeof(T) * CHAR_BIT / 4) - 1;
+#ifdef NO_LONG_DOUBLE
+ fprintf (stderr, "%6d: %.*a %c %.*a = %.*a\n", verbose_index++,
+ digits, (double)a, symbol,
+ digits, (double)b, digits, (double)r);
+#else
+ fprintf (stderr, "%6d: %.*La %c %.*La = %.*La\n", verbose_index++,
+ digits, (long double)a, symbol,
+ digits, (long double)b, digits, (long double)r);
+#endif
+ }
+ return r;
+}
+
+template<typename T>
+T
+native_float<T>::verbose_unop (const char *symbol, T a, T r)
+{
+ if (verbose)
+ {
+ const int digits = int(sizeof(T) * CHAR_BIT / 4) - 1;
+#ifdef NO_LONG_DOUBLE
+ fprintf (stderr, "%6d: %s%.*a = %.*a\n", verbose_index++,
+ symbol, digits, (double)a, digits, (double)r);
+#else
+ fprintf (stderr, "%6d: %s%.*La = %.*La\n", verbose_index++,
+ symbol, digits, (long double)a, digits, (long double)r);
+#endif
+ }
+ return r;
+}
+
+template<typename T>
+bool
+native_float<T>::verbose_cmp (T a, const char *symbol, T b, bool r)
+{
+ if (verbose)
+ {
+ const int digits = int(sizeof(T) * CHAR_BIT / 4) - 1;
+#ifndef NO_LONG_DOUBLE
+ fprintf (stderr, "%6d: %.*a %s %.*a = %s\n", verbose_index++,
+ digits, (double)a, symbol,
+ digits, (double)b, (r ? "true" : "false"));
+#else
+ fprintf (stderr, "%6d: %.*La %s %.*La = %s\n", verbose_index++,
+ digits, (long double)a, symbol,
+ digits, (long double)b, (r ? "true" : "false"));
+#endif
+ }
+ return r;
+}
+
+template<typename T>
+const char *
+native_float<T>::str() const
+{
+ char *buf = new char[50];
+ const int digits = int(sizeof(T) * CHAR_BIT * .30102999566398119521 + 1);
+#ifndef NO_LONG_DOUBLE
+ sprintf (buf, "%.*e", digits - 1, (double) image);
+#else
+ sprintf (buf, "%.*Le", digits - 1, (long double) image);
+#endif
+ return buf;
+}
+
+template<typename T>
+const char *
+native_float<T>::hex() const
+{
+ char *buf = new char[50];
+ const int digits = int(sizeof(T) * CHAR_BIT / 4);
+#ifndef NO_LONG_DOUBLE
+ sprintf (buf, "%.*a", digits - 1, (double) image);
+#else
+ sprintf (buf, "%.*La", digits - 1, (long double) image);
+#endif
+ return buf;
+}
+
+template<typename T>
+int
+native_float<T>::exp() const
+{
+ int e;
+ frexp (image, &e);
+ return e;
+}
+
+template<typename T>
+void
+native_float<T>::ldexp (int exp)
+{
+ image = ldexpl (image, exp);
+}
+
+template<>
+void
+native_float<float>::ldexp (int exp)
+{
+ image = ldexpf (image, exp);
+}
+
+template<>
+void
+native_float<double>::ldexp (int exp)
+{
+ image = ::ldexp (image, exp);
+}
+
+/* ====================================================================== */
+/* Some libm routines that Paranoia expects to be available. */
+
+template<typename FLOAT>
+inline FLOAT
+FABS (const FLOAT &f)
+{
+ return f.abs();
+}
+
+template<typename FLOAT, typename RHS>
+inline FLOAT
+operator+ (const FLOAT &a, const RHS &b)
+{
+ return FLOAT(a) += FLOAT(b);
+}
+
+template<typename FLOAT, typename RHS>
+inline FLOAT
+operator- (const FLOAT &a, const RHS &b)
+{
+ return FLOAT(a) -= FLOAT(b);
+}
+
+template<typename FLOAT, typename RHS>
+inline FLOAT
+operator* (const FLOAT &a, const RHS &b)
+{
+ return FLOAT(a) *= FLOAT(b);
+}
+
+template<typename FLOAT, typename RHS>
+inline FLOAT
+operator/ (const FLOAT &a, const RHS &b)
+{
+ return FLOAT(a) /= FLOAT(b);
+}
+
+template<typename FLOAT>
+FLOAT
+FLOOR (const FLOAT &f)
+{
+ /* ??? This is only correct when F is representable as an integer. */
+ long i = f.integer();
+ FLOAT r;
+
+ r = i;
+ if (i < 0 && f != r)
+ r = i - 1;
+
+ return r;
+}
+
+template<typename FLOAT>
+FLOAT
+SQRT (const FLOAT &f)
+{
+#if 0
+ FLOAT zero = long(0);
+ FLOAT two = 2;
+ FLOAT one = 1;
+ FLOAT diff, diff2;
+ FLOAT z, t;
+
+ if (f == zero)
+ return zero;
+ if (f < zero)
+ return zero / zero;
+ if (f == one)
+ return f;
+
+ z = f;
+ z.ldexp (-f.exp() / 2);
+
+ diff2 = FABS (z * z - f);
+ if (diff2 > zero)
+ while (1)
+ {
+ t = (f / (two * z)) + (z / two);
+ diff = FABS (t * t - f);
+ if (diff >= diff2)
+ break;
+ z = t;
+ diff2 = diff;
+ }
+
+ return z;
+#elif defined(NO_LONG_DOUBLE)
+ double d;
+ char buf[64];
+
+ d = strtod (f.hex(), NULL);
+ d = sqrt (d);
+ sprintf(buf, "%.35a", d);
+
+ return FLOAT(buf);
+#else
+ long double ld;
+ char buf[64];
+
+ ld = strtold (f.hex(), NULL);
+ ld = sqrtl (ld);
+ sprintf(buf, "%.35La", ld);
+
+ return FLOAT(buf);
+#endif
+}
+
+template<typename FLOAT>
+FLOAT
+LOG (FLOAT x)
+{
+#if 0
+ FLOAT zero = long(0);
+ FLOAT one = 1;
+
+ if (x <= zero)
+ return zero / zero;
+ if (x == one)
+ return zero;
+
+ int exp = x.exp() - 1;
+ x.ldexp(-exp);
+
+ FLOAT xm1 = x - one;
+ FLOAT y = xm1;
+ long n = 2;
+
+ FLOAT sum = xm1;
+ while (1)
+ {
+ y *= xm1;
+ FLOAT term = y / FLOAT (n);
+ FLOAT next = sum + term;
+ if (next == sum)
+ break;
+ sum = next;
+ if (++n == 1000)
+ break;
+ }
+
+ if (exp)
+ sum += FLOAT (exp) * FLOAT(".69314718055994530941");
+
+ return sum;
+#elif defined (NO_LONG_DOUBLE)
+ double d;
+ char buf[64];
+
+ d = strtod (x.hex(), NULL);
+ d = log (d);
+ sprintf(buf, "%.35a", d);
+
+ return FLOAT(buf);
+#else
+ long double ld;
+ char buf[64];
+
+ ld = strtold (x.hex(), NULL);
+ ld = logl (ld);
+ sprintf(buf, "%.35La", ld);
+
+ return FLOAT(buf);
+#endif
+}
+
+template<typename FLOAT>
+FLOAT
+EXP (const FLOAT &x)
+{
+ /* Cheat. */
+#ifdef NO_LONG_DOUBLE
+ double d;
+ char buf[64];
+
+ d = strtod (x.hex(), NULL);
+ d = exp (d);
+ sprintf(buf, "%.35a", d);
+
+ return FLOAT(buf);
+#else
+ long double ld;
+ char buf[64];
+
+ ld = strtold (x.hex(), NULL);
+ ld = expl (ld);
+ sprintf(buf, "%.35La", ld);
+
+ return FLOAT(buf);
+#endif
+}
+
+template<typename FLOAT>
+FLOAT
+POW (const FLOAT &base, const FLOAT &exp)
+{
+ /* Cheat. */
+#ifdef NO_LONG_DOUBLE
+ double d1, d2;
+ char buf[64];
+
+ d1 = strtod (base.hex(), NULL);
+ d2 = strtod (exp.hex(), NULL);
+ d1 = pow (d1, d2);
+ sprintf(buf, "%.35a", d1);
+
+ return FLOAT(buf);
+#else
+ long double ld1, ld2;
+ char buf[64];
+
+ ld1 = strtold (base.hex(), NULL);
+ ld2 = strtold (exp.hex(), NULL);
+ ld1 = powl (ld1, ld2);
+ sprintf(buf, "%.35La", ld1);
+
+ return FLOAT(buf);
+#endif
+}
+
+/* ====================================================================== */
+/* Real Paranoia begins again here. We wrap the thing in a template so
+ that we can instantiate it for each floating point type we care for. */
+
+int NoTrials = 20; /*Number of tests for commutativity. */
+bool do_pause = false;
+
+enum Guard { No, Yes };
+enum Rounding { Other, Rounded, Chopped };
+enum Class { Failure, Serious, Defect, Flaw };
+
+template<typename FLOAT>
+struct Paranoia
+{
+ FLOAT Radix, BInvrse, RadixD2, BMinusU2;
+
+ /* Small floating point constants. */
+ FLOAT Zero;
+ FLOAT Half;
+ FLOAT One;
+ FLOAT Two;
+ FLOAT Three;
+ FLOAT Four;
+ FLOAT Five;
+ FLOAT Eight;
+ FLOAT Nine;
+ FLOAT TwentySeven;
+ FLOAT ThirtyTwo;
+ FLOAT TwoForty;
+ FLOAT MinusOne;
+ FLOAT OneAndHalf;
+
+ /* Declarations of Variables. */
+ int Indx;
+ char ch[8];
+ FLOAT AInvrse, A1;
+ FLOAT C, CInvrse;
+ FLOAT D, FourD;
+ FLOAT E0, E1, Exp2, E3, MinSqEr;
+ FLOAT SqEr, MaxSqEr, E9;
+ FLOAT Third;
+ FLOAT F6, F9;
+ FLOAT H, HInvrse;
+ int I;
+ FLOAT StickyBit, J;
+ FLOAT MyZero;
+ FLOAT Precision;
+ FLOAT Q, Q9;
+ FLOAT R, Random9;
+ FLOAT T, Underflow, S;
+ FLOAT OneUlp, UfThold, U1, U2;
+ FLOAT V, V0, V9;
+ FLOAT W;
+ FLOAT X, X1, X2, X8, Random1;
+ FLOAT Y, Y1, Y2, Random2;
+ FLOAT Z, PseudoZero, Z1, Z2, Z9;
+ int ErrCnt[4];
+ int Milestone;
+ int PageNo;
+ int M, N, N1;
+ Guard GMult, GDiv, GAddSub;
+ Rounding RMult, RDiv, RAddSub, RSqrt;
+ int Break, Done, NotMonot, Monot, Anomaly, IEEE, SqRWrng, UfNGrad;
+
+ /* Computed constants. */
+ /*U1 gap below 1.0, i.e, 1.0-U1 is next number below 1.0 */
+ /*U2 gap above 1.0, i.e, 1.0+U2 is next number above 1.0 */
+
+ int main ();
+
+ FLOAT Sign (FLOAT);
+ FLOAT Random ();
+ void Pause ();
+ void BadCond (int, const char *);
+ void SqXMinX (int);
+ void TstCond (int, int, const char *);
+ void notify (const char *);
+ void IsYeqX ();
+ void NewD ();
+ void PrintIfNPositive ();
+ void SR3750 ();
+ void TstPtUf ();
+
+ // Pretend we're bss.
+ Paranoia() { memset(this, 0, sizeof (*this)); }
+};
+
+template<typename FLOAT>
+int
+Paranoia<FLOAT>::main()
+{
+ /* First two assignments use integer right-hand sides. */
+ Zero = long(0);
+ One = long(1);
+ Two = long(2);
+ Three = long(3);
+ Four = long(4);
+ Five = long(5);
+ Eight = long(8);
+ Nine = long(9);
+ TwentySeven = long(27);
+ ThirtyTwo = long(32);
+ TwoForty = long(240);
+ MinusOne = long(-1);
+ Half = "0x1p-1";
+ OneAndHalf = "0x3p-1";
+ ErrCnt[Failure] = 0;
+ ErrCnt[Serious] = 0;
+ ErrCnt[Defect] = 0;
+ ErrCnt[Flaw] = 0;
+ PageNo = 1;
+ /*=============================================*/
+ Milestone = 7;
+ /*=============================================*/
+ printf ("Program is now RUNNING tests on small integers:\n");
+
+ TstCond (Failure, (Zero + Zero == Zero), "0+0 != 0");
+ TstCond (Failure, (One - One == Zero), "1-1 != 0");
+ TstCond (Failure, (One > Zero), "1 <= 0");
+ TstCond (Failure, (One + One == Two), "1+1 != 2");
+
+ Z = -Zero;
+ if (Z != Zero)
+ {
+ ErrCnt[Failure] = ErrCnt[Failure] + 1;
+ printf ("Comparison alleges that -0.0 is Non-zero!\n");
+ U2 = "0.001";
+ Radix = 1;
+ TstPtUf ();
+ }
+
+ TstCond (Failure, (Three == Two + One), "3 != 2+1");
+ TstCond (Failure, (Four == Three + One), "4 != 3+1");
+ TstCond (Failure, (Four + Two * (-Two) == Zero), "4 + 2*(-2) != 0");
+ TstCond (Failure, (Four - Three - One == Zero), "4-3-1 != 0");
+
+ TstCond (Failure, (MinusOne == (Zero - One)), "-1 != 0-1");
+ TstCond (Failure, (MinusOne + One == Zero), "-1+1 != 0");
+ TstCond (Failure, (One + MinusOne == Zero), "1+(-1) != 0");
+ TstCond (Failure, (MinusOne + FABS (One) == Zero), "-1+abs(1) != 0");
+ TstCond (Failure, (MinusOne + MinusOne * MinusOne == Zero),
+ "-1+(-1)*(-1) != 0");
+
+ TstCond (Failure, Half + MinusOne + Half == Zero, "1/2 + (-1) + 1/2 != 0");
+
+ /*=============================================*/
+ Milestone = 10;
+ /*=============================================*/
+
+ TstCond (Failure, (Nine == Three * Three), "9 != 3*3");
+ TstCond (Failure, (TwentySeven == Nine * Three), "27 != 9*3");
+ TstCond (Failure, (Eight == Four + Four), "8 != 4+4");
+ TstCond (Failure, (ThirtyTwo == Eight * Four), "32 != 8*4");
+ TstCond (Failure, (ThirtyTwo - TwentySeven - Four - One == Zero),
+ "32-27-4-1 != 0");
+
+ TstCond (Failure, Five == Four + One, "5 != 4+1");
+ TstCond (Failure, TwoForty == Four * Five * Three * Four, "240 != 4*5*3*4");
+ TstCond (Failure, TwoForty / Three - Four * Four * Five == Zero,
+ "240/3 - 4*4*5 != 0");
+ TstCond (Failure, TwoForty / Four - Five * Three * Four == Zero,
+ "240/4 - 5*3*4 != 0");
+ TstCond (Failure, TwoForty / Five - Four * Three * Four == Zero,
+ "240/5 - 4*3*4 != 0");
+
+ if (ErrCnt[Failure] == 0)
+ {
+ printf ("-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K.\n");
+ printf ("\n");
+ }
+ printf ("Searching for Radix and Precision.\n");
+ W = One;
+ do
+ {
+ W = W + W;
+ Y = W + One;
+ Z = Y - W;
+ Y = Z - One;
+ }
+ while (MinusOne + FABS (Y) < Zero);
+ /*.. now W is just big enough that |((W+1)-W)-1| >= 1 ... */
+ Precision = Zero;
+ Y = One;
+ do
+ {
+ Radix = W + Y;
+ Y = Y + Y;
+ Radix = Radix - W;
+ }
+ while (Radix == Zero);
+ if (Radix < Two)
+ Radix = One;
+ printf ("Radix = %s .\n", Radix.str());
+ if (Radix != One)
+ {
+ W = One;
+ do
+ {
+ Precision = Precision + One;
+ W = W * Radix;
+ Y = W + One;
+ }
+ while ((Y - W) == One);
+ }
+ /*... now W == Radix^Precision is barely too big to satisfy (W+1)-W == 1
+ ... */
+ U1 = One / W;
+ U2 = Radix * U1;
+ printf ("Closest relative separation found is U1 = %s .\n\n", U1.str());
+ printf ("Recalculating radix and precision\n ");
+
+ /*save old values */
+ E0 = Radix;
+ E1 = U1;
+ E9 = U2;
+ E3 = Precision;
+
+ X = Four / Three;
+ Third = X - One;
+ F6 = Half - Third;
+ X = F6 + F6;
+ X = FABS (X - Third);
+ if (X < U2)
+ X = U2;
+
+ /*... now X = (unknown no.) ulps of 1+... */
+ do
+ {
+ U2 = X;
+ Y = Half * U2 + ThirtyTwo * U2 * U2;
+ Y = One + Y;
+ X = Y - One;
+ }
+ while (!((U2 <= X) || (X <= Zero)));
+
+ /*... now U2 == 1 ulp of 1 + ... */
+ X = Two / Three;
+ F6 = X - Half;
+ Third = F6 + F6;
+ X = Third - Half;
+ X = FABS (X + F6);
+ if (X < U1)
+ X = U1;
+
+ /*... now X == (unknown no.) ulps of 1 -... */
+ do
+ {
+ U1 = X;
+ Y = Half * U1 + ThirtyTwo * U1 * U1;
+ Y = Half - Y;
+ X = Half + Y;
+ Y = Half - X;
+ X = Half + Y;
+ }
+ while (!((U1 <= X) || (X <= Zero)));
+ /*... now U1 == 1 ulp of 1 - ... */
+ if (U1 == E1)
+ printf ("confirms closest relative separation U1 .\n");
+ else
+ printf ("gets better closest relative separation U1 = %s .\n", U1.str());
+ W = One / U1;
+ F9 = (Half - U1) + Half;
+
+ Radix = FLOOR (FLOAT ("0.01") + U2 / U1);
+ if (Radix == E0)
+ printf ("Radix confirmed.\n");
+ else
+ printf ("MYSTERY: recalculated Radix = %s .\n", Radix.str());
+ TstCond (Defect, Radix <= Eight + Eight,
+ "Radix is too big: roundoff problems");
+ TstCond (Flaw, (Radix == Two) || (Radix == 10)
+ || (Radix == One), "Radix is not as good as 2 or 10");
+ /*=============================================*/
+ Milestone = 20;
+ /*=============================================*/
+ TstCond (Failure, F9 - Half < Half,
+ "(1-U1)-1/2 < 1/2 is FALSE, prog. fails?");
+ X = F9;
+ I = 1;
+ Y = X - Half;
+ Z = Y - Half;
+ TstCond (Failure, (X != One)
+ || (Z == Zero), "Comparison is fuzzy,X=1 but X-1/2-1/2 != 0");
+ X = One + U2;
+ I = 0;
+ /*=============================================*/
+ Milestone = 25;
+ /*=============================================*/
+ /*... BMinusU2 = nextafter(Radix, 0) */
+ BMinusU2 = Radix - One;
+ BMinusU2 = (BMinusU2 - U2) + One;
+ /* Purify Integers */
+ if (Radix != One)
+ {
+ X = -TwoForty * LOG (U1) / LOG (Radix);
+ Y = FLOOR (Half + X);
+ if (FABS (X - Y) * Four < One)
+ X = Y;
+ Precision = X / TwoForty;
+ Y = FLOOR (Half + Precision);
+ if (FABS (Precision - Y) * TwoForty < Half)
+ Precision = Y;
+ }
+ if ((Precision != FLOOR (Precision)) || (Radix == One))
+ {
+ printf ("Precision cannot be characterized by an Integer number\n");
+ printf
+ ("of significant digits but, by itself, this is a minor flaw.\n");
+ }
+ if (Radix == One)
+ printf
+ ("logarithmic encoding has precision characterized solely by U1.\n");
+ else
+ printf ("The number of significant digits of the Radix is %s .\n",
+ Precision.str());
+ TstCond (Serious, U2 * Nine * Nine * TwoForty < One,
+ "Precision worse than 5 decimal figures ");
+ /*=============================================*/
+ Milestone = 30;
+ /*=============================================*/
+ /* Test for extra-precise subexpressions */
+ X = FABS (((Four / Three - One) - One / Four) * Three - One / Four);
+ do
+ {
+ Z2 = X;
+ X = (One + (Half * Z2 + ThirtyTwo * Z2 * Z2)) - One;
+ }
+ while (!((Z2 <= X) || (X <= Zero)));
+ X = Y = Z = FABS ((Three / Four - Two / Three) * Three - One / Four);
+ do
+ {
+ Z1 = Z;
+ Z = (One / Two - ((One / Two - (Half * Z1 + ThirtyTwo * Z1 * Z1))
+ + One / Two)) + One / Two;
+ }
+ while (!((Z1 <= Z) || (Z <= Zero)));
+ do
+ {
+ do
+ {
+ Y1 = Y;
+ Y =
+ (Half - ((Half - (Half * Y1 + ThirtyTwo * Y1 * Y1)) + Half)) +
+ Half;
+ }
+ while (!((Y1 <= Y) || (Y <= Zero)));
+ X1 = X;
+ X = ((Half * X1 + ThirtyTwo * X1 * X1) - F9) + F9;
+ }
+ while (!((X1 <= X) || (X <= Zero)));
+ if ((X1 != Y1) || (X1 != Z1))
+ {
+ BadCond (Serious, "Disagreements among the values X1, Y1, Z1,\n");
+ printf ("respectively %s, %s, %s,\n", X1.str(), Y1.str(), Z1.str());
+ printf ("are symptoms of inconsistencies introduced\n");
+ printf ("by extra-precise evaluation of arithmetic subexpressions.\n");
+ notify ("Possibly some part of this");
+ if ((X1 == U1) || (Y1 == U1) || (Z1 == U1))
+ printf ("That feature is not tested further by this program.\n");
+ }
+ else
+ {
+ if ((Z1 != U1) || (Z2 != U2))
+ {
+ if ((Z1 >= U1) || (Z2 >= U2))
+ {
+ BadCond (Failure, "");
+ notify ("Precision");
+ printf ("\tU1 = %s, Z1 - U1 = %s\n", U1.str(), (Z1 - U1).str());
+ printf ("\tU2 = %s, Z2 - U2 = %s\n", U2.str(), (Z2 - U2).str());
+ }
+ else
+ {
+ if ((Z1 <= Zero) || (Z2 <= Zero))
+ {
+ printf ("Because of unusual Radix = %s", Radix.str());
+ printf (", or exact rational arithmetic a result\n");
+ printf ("Z1 = %s, or Z2 = %s ", Z1.str(), Z2.str());
+ notify ("of an\nextra-precision");
+ }
+ if (Z1 != Z2 || Z1 > Zero)
+ {
+ X = Z1 / U1;
+ Y = Z2 / U2;
+ if (Y > X)
+ X = Y;
+ Q = -LOG (X);
+ printf ("Some subexpressions appear to be calculated "
+ "extra precisely\n");
+ printf ("with about %s extra B-digits, i.e.\n",
+ (Q / LOG (Radix)).str());
+ printf ("roughly %s extra significant decimals.\n",
+ (Q / LOG (FLOAT (10))).str());
+ }
+ printf
+ ("That feature is not tested further by this program.\n");
+ }
+ }
+ }
+ Pause ();
+ /*=============================================*/
+ Milestone = 35;
+ /*=============================================*/
+ if (Radix >= Two)
+ {
+ X = W / (Radix * Radix);
+ Y = X + One;
+ Z = Y - X;
+ T = Z + U2;
+ X = T - Z;
+ TstCond (Failure, X == U2,
+ "Subtraction is not normalized X=Y,X+Z != Y+Z!");
+ if (X == U2)
+ printf ("Subtraction appears to be normalized, as it should be.");
+ }
+ printf ("\nChecking for guard digit in *, /, and -.\n");
+ Y = F9 * One;
+ Z = One * F9;
+ X = F9 - Half;
+ Y = (Y - Half) - X;
+ Z = (Z - Half) - X;
+ X = One + U2;
+ T = X * Radix;
+ R = Radix * X;
+ X = T - Radix;
+ X = X - Radix * U2;
+ T = R - Radix;
+ T = T - Radix * U2;
+ X = X * (Radix - One);
+ T = T * (Radix - One);
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero))
+ GMult = Yes;
+ else
+ {
+ GMult = No;
+ TstCond (Serious, false, "* lacks a Guard Digit, so 1*X != X");
+ }
+ Z = Radix * U2;
+ X = One + Z;
+ Y = FABS ((X + Z) - X * X) - U2;
+ X = One - U2;
+ Z = FABS ((X - U2) - X * X) - U1;
+ TstCond (Failure, (Y <= Zero)
+ && (Z <= Zero), "* gets too many final digits wrong.\n");
+ Y = One - U2;
+ X = One + U2;
+ Z = One / Y;
+ Y = Z - X;
+ X = One / Three;
+ Z = Three / Nine;
+ X = X - Z;
+ T = Nine / TwentySeven;
+ Z = Z - T;
+ TstCond (Defect, X == Zero && Y == Zero && Z == Zero,
+ "Division lacks a Guard Digit, so error can exceed 1 ulp\n"
+ "or 1/3 and 3/9 and 9/27 may disagree");
+ Y = F9 / One;
+ X = F9 - Half;
+ Y = (Y - Half) - X;
+ X = One + U2;
+ T = X / One;
+ X = T - X;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero))
+ GDiv = Yes;
+ else
+ {
+ GDiv = No;
+ TstCond (Serious, false, "Division lacks a Guard Digit, so X/1 != X");
+ }
+ X = One / (One + U2);
+ Y = X - Half - Half;
+ TstCond (Serious, Y < Zero, "Computed value of 1/1.000..1 >= 1");
+ X = One - U2;
+ Y = One + Radix * U2;
+ Z = X * Radix;
+ T = Y * Radix;
+ R = Z / Radix;
+ StickyBit = T / Radix;
+ X = R - X;
+ Y = StickyBit - Y;
+ TstCond (Failure, X == Zero && Y == Zero,
+ "* and/or / gets too many last digits wrong");
+ Y = One - U1;
+ X = One - F9;
+ Y = One - Y;
+ T = Radix - U2;
+ Z = Radix - BMinusU2;
+ T = Radix - T;
+ if ((X == U1) && (Y == U1) && (Z == U2) && (T == U2))
+ GAddSub = Yes;
+ else
+ {
+ GAddSub = No;
+ TstCond (Serious, false,
+ "- lacks Guard Digit, so cancellation is obscured");
+ }
+ if (F9 != One && F9 - One >= Zero)
+ {
+ BadCond (Serious, "comparison alleges (1-U1) < 1 although\n");
+ printf (" subtraction yields (1-U1) - 1 = 0 , thereby vitiating\n");
+ printf (" such precautions against division by zero as\n");
+ printf (" ... if (X == 1.0) {.....} else {.../(X-1.0)...}\n");
+ }
+ if (GMult == Yes && GDiv == Yes && GAddSub == Yes)
+ printf
+ (" *, /, and - appear to have guard digits, as they should.\n");
+ /*=============================================*/
+ Milestone = 40;
+ /*=============================================*/
+ Pause ();
+ printf ("Checking rounding on multiply, divide and add/subtract.\n");
+ RMult = Other;
+ RDiv = Other;
+ RAddSub = Other;
+ RadixD2 = Radix / Two;
+ A1 = Two;
+ Done = false;
+ do
+ {
+ AInvrse = Radix;
+ do
+ {
+ X = AInvrse;
+ AInvrse = AInvrse / A1;
+ }
+ while (!(FLOOR (AInvrse) != AInvrse));
+ Done = (X == One) || (A1 > Three);
+ if (!Done)
+ A1 = Nine + One;
+ }
+ while (!(Done));
+ if (X == One)
+ A1 = Radix;
+ AInvrse = One / A1;
+ X = A1;
+ Y = AInvrse;
+ Done = false;
+ do
+ {
+ Z = X * Y - Half;
+ TstCond (Failure, Z == Half, "X * (1/X) differs from 1");
+ Done = X == Radix;
+ X = Radix;
+ Y = One / X;
+ }
+ while (!(Done));
+ Y2 = One + U2;
+ Y1 = One - U2;
+ X = OneAndHalf - U2;
+ Y = OneAndHalf + U2;
+ Z = (X - U2) * Y2;
+ T = Y * Y1;
+ Z = Z - X;
+ T = T - X;
+ X = X * Y2;
+ Y = (Y + U2) * Y1;
+ X = X - OneAndHalf;
+ Y = Y - OneAndHalf;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T <= Zero))
+ {
+ X = (OneAndHalf + U2) * Y2;
+ Y = OneAndHalf - U2 - U2;
+ Z = OneAndHalf + U2 + U2;
+ T = (OneAndHalf - U2) * Y1;
+ X = X - (Z + U2);
+ StickyBit = Y * Y1;
+ S = Z * Y2;
+ T = T - Y;
+ Y = (U2 - Y) + StickyBit;
+ Z = S - (Z + U2 + U2);
+ StickyBit = (Y2 + U2) * Y1;
+ Y1 = Y2 * Y1;
+ StickyBit = StickyBit - Y2;
+ Y1 = Y1 - Half;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)
+ && (StickyBit == Zero) && (Y1 == Half))
+ {
+ RMult = Rounded;
+ printf ("Multiplication appears to round correctly.\n");
+ }
+ else if ((X + U2 == Zero) && (Y < Zero) && (Z + U2 == Zero)
+ && (T < Zero) && (StickyBit + U2 == Zero) && (Y1 < Half))
+ {
+ RMult = Chopped;
+ printf ("Multiplication appears to chop.\n");
+ }
+ else
+ printf ("* is neither chopped nor correctly rounded.\n");
+ if ((RMult == Rounded) && (GMult == No))
+ notify ("Multiplication");
+ }
+ else
+ printf ("* is neither chopped nor correctly rounded.\n");
+ /*=============================================*/
+ Milestone = 45;
+ /*=============================================*/
+ Y2 = One + U2;
+ Y1 = One - U2;
+ Z = OneAndHalf + U2 + U2;
+ X = Z / Y2;
+ T = OneAndHalf - U2 - U2;
+ Y = (T - U2) / Y1;
+ Z = (Z + U2) / Y2;
+ X = X - OneAndHalf;
+ Y = Y - T;
+ T = T / Y1;
+ Z = Z - (OneAndHalf + U2);
+ T = (U2 - OneAndHalf) + T;
+ if (!((X > Zero) || (Y > Zero) || (Z > Zero) || (T > Zero)))
+ {
+ X = OneAndHalf / Y2;
+ Y = OneAndHalf - U2;
+ Z = OneAndHalf + U2;
+ X = X - Y;
+ T = OneAndHalf / Y1;
+ Y = Y / Y1;
+ T = T - (Z + U2);
+ Y = Y - Z;
+ Z = Z / Y2;
+ Y1 = (Y2 + U2) / Y2;
+ Z = Z - OneAndHalf;
+ Y2 = Y1 - Y2;
+ Y1 = (F9 - U1) / F9;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)
+ && (Y2 == Zero) && (Y2 == Zero) && (Y1 - Half == F9 - Half))
+ {
+ RDiv = Rounded;
+ printf ("Division appears to round correctly.\n");
+ if (GDiv == No)
+ notify ("Division");
+ }
+ else if ((X < Zero) && (Y < Zero) && (Z < Zero) && (T < Zero)
+ && (Y2 < Zero) && (Y1 - Half < F9 - Half))
+ {
+ RDiv = Chopped;
+ printf ("Division appears to chop.\n");
+ }
+ }
+ if (RDiv == Other)
+ printf ("/ is neither chopped nor correctly rounded.\n");
+ BInvrse = One / Radix;
+ TstCond (Failure, (BInvrse * Radix - Half == Half),
+ "Radix * ( 1 / Radix ) differs from 1");
+ /*=============================================*/
+ Milestone = 50;
+ /*=============================================*/
+ TstCond (Failure, ((F9 + U1) - Half == Half)
+ && ((BMinusU2 + U2) - One == Radix - One),
+ "Incomplete carry-propagation in Addition");
+ X = One - U1 * U1;
+ Y = One + U2 * (One - U2);
+ Z = F9 - Half;
+ X = (X - Half) - Z;
+ Y = Y - One;
+ if ((X == Zero) && (Y == Zero))
+ {
+ RAddSub = Chopped;
+ printf ("Add/Subtract appears to be chopped.\n");
+ }
+ if (GAddSub == Yes)
+ {
+ X = (Half + U2) * U2;
+ Y = (Half - U2) * U2;
+ X = One + X;
+ Y = One + Y;
+ X = (One + U2) - X;
+ Y = One - Y;
+ if ((X == Zero) && (Y == Zero))
+ {
+ X = (Half + U2) * U1;
+ Y = (Half - U2) * U1;
+ X = One - X;
+ Y = One - Y;
+ X = F9 - X;
+ Y = One - Y;
+ if ((X == Zero) && (Y == Zero))
+ {
+ RAddSub = Rounded;
+ printf ("Addition/Subtraction appears to round correctly.\n");
+ if (GAddSub == No)
+ notify ("Add/Subtract");
+ }
+ else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ }
+ else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ }
+ else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ S = One;
+ X = One + Half * (One + Half);
+ Y = (One + U2) * Half;
+ Z = X - Y;
+ T = Y - X;
+ StickyBit = Z + T;
+ if (StickyBit != Zero)
+ {
+ S = Zero;
+ BadCond (Flaw, "(X - Y) + (Y - X) is non zero!\n");
+ }
+ StickyBit = Zero;
+ if ((GMult == Yes) && (GDiv == Yes) && (GAddSub == Yes)
+ && (RMult == Rounded) && (RDiv == Rounded)
+ && (RAddSub == Rounded) && (FLOOR (RadixD2) == RadixD2))
+ {
+ printf ("Checking for sticky bit.\n");
+ X = (Half + U1) * U2;
+ Y = Half * U2;
+ Z = One + Y;
+ T = One + X;
+ if ((Z - One <= Zero) && (T - One >= U2))
+ {
+ Z = T + Y;
+ Y = Z - X;
+ if ((Z - T >= U2) && (Y - T == Zero))
+ {
+ X = (Half + U1) * U1;
+ Y = Half * U1;
+ Z = One - Y;
+ T = One - X;
+ if ((Z - One == Zero) && (T - F9 == Zero))
+ {
+ Z = (Half - U1) * U1;
+ T = F9 - Z;
+ Q = F9 - Y;
+ if ((T - F9 == Zero) && (F9 - U1 - Q == Zero))
+ {
+ Z = (One + U2) * OneAndHalf;
+ T = (OneAndHalf + U2) - Z + U2;
+ X = One + Half / Radix;
+ Y = One + Radix * U2;
+ Z = X * Y;
+ if (T == Zero && X + Radix * U2 - Z == Zero)
+ {
+ if (Radix != Two)
+ {
+ X = Two + U2;
+ Y = X / Two;
+ if ((Y - One == Zero))
+ StickyBit = S;
+ }
+ else
+ StickyBit = S;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (StickyBit == One)
+ printf ("Sticky bit apparently used correctly.\n");
+ else
+ printf ("Sticky bit used incorrectly or not at all.\n");
+ TstCond (Flaw, !(GMult == No || GDiv == No || GAddSub == No ||
+ RMult == Other || RDiv == Other || RAddSub == Other),
+ "lack(s) of guard digits or failure(s) to correctly round or chop\n\
+(noted above) count as one flaw in the final tally below");
+ /*=============================================*/
+ Milestone = 60;
+ /*=============================================*/
+ printf ("\n");
+ printf ("Does Multiplication commute? ");
+ printf ("Testing on %d random pairs.\n", NoTrials);
+ Random9 = SQRT (FLOAT (3));
+ Random1 = Third;
+ I = 1;
+ do
+ {
+ X = Random ();
+ Y = Random ();
+ Z9 = Y * X;
+ Z = X * Y;
+ Z9 = Z - Z9;
+ I = I + 1;
+ }
+ while (!((I > NoTrials) || (Z9 != Zero)));
+ if (I == NoTrials)
+ {
+ Random1 = One + Half / Three;
+ Random2 = (U2 + U1) + One;
+ Z = Random1 * Random2;
+ Y = Random2 * Random1;
+ Z9 = (One + Half / Three) * ((U2 + U1) + One) - (One + Half /
+ Three) * ((U2 + U1) +
+ One);
+ }
+ if (!((I == NoTrials) || (Z9 == Zero)))
+ BadCond (Defect, "X * Y == Y * X trial fails.\n");
+ else
+ printf (" No failures found in %d integer pairs.\n", NoTrials);
+ /*=============================================*/
+ Milestone = 70;
+ /*=============================================*/
+ printf ("\nRunning test of square root(x).\n");
+ TstCond (Failure, (Zero == SQRT (Zero))
+ && (-Zero == SQRT (-Zero))
+ && (One == SQRT (One)), "Square root of 0.0, -0.0 or 1.0 wrong");
+ MinSqEr = Zero;
+ MaxSqEr = Zero;
+ J = Zero;
+ X = Radix;
+ OneUlp = U2;
+ SqXMinX (Serious);
+ X = BInvrse;
+ OneUlp = BInvrse * U1;
+ SqXMinX (Serious);
+ X = U1;
+ OneUlp = U1 * U1;
+ SqXMinX (Serious);
+ if (J != Zero)
+ Pause ();
+ printf ("Testing if sqrt(X * X) == X for %d Integers X.\n", NoTrials);
+ J = Zero;
+ X = Two;
+ Y = Radix;
+ if ((Radix != One))
+ do
+ {
+ X = Y;
+ Y = Radix * Y;
+ }
+ while (!((Y - X >= NoTrials)));
+ OneUlp = X * U2;
+ I = 1;
+ while (I <= NoTrials)
+ {
+ X = X + One;
+ SqXMinX (Defect);
+ if (J > Zero)
+ break;
+ I = I + 1;
+ }
+ printf ("Test for sqrt monotonicity.\n");
+ I = -1;
+ X = BMinusU2;
+ Y = Radix;
+ Z = Radix + Radix * U2;
+ NotMonot = false;
+ Monot = false;
+ while (!(NotMonot || Monot))
+ {
+ I = I + 1;
+ X = SQRT (X);
+ Q = SQRT (Y);
+ Z = SQRT (Z);
+ if ((X > Q) || (Q > Z))
+ NotMonot = true;
+ else
+ {
+ Q = FLOOR (Q + Half);
+ if (!(I > 0 || Radix == Q * Q))
+ Monot = true;
+ else if (I > 0)
+ {
+ if (I > 1)
+ Monot = true;
+ else
+ {
+ Y = Y * BInvrse;
+ X = Y - U1;
+ Z = Y + U1;
+ }
+ }
+ else
+ {
+ Y = Q;
+ X = Y - U2;
+ Z = Y + U2;
+ }
+ }
+ }
+ if (Monot)
+ printf ("sqrt has passed a test for Monotonicity.\n");
+ else
+ {
+ BadCond (Defect, "");
+ printf ("sqrt(X) is non-monotonic for X near %s .\n", Y.str());
+ }
+ /*=============================================*/
+ Milestone = 110;
+ /*=============================================*/
+ printf ("Seeking Underflow thresholds UfThold and E0.\n");
+ D = U1;
+ if (Precision != FLOOR (Precision))
+ {
+ D = BInvrse;
+ X = Precision;
+ do
+ {
+ D = D * BInvrse;
+ X = X - One;
+ }
+ while (X > Zero);
+ }
+ Y = One;
+ Z = D;
+ /* ... D is power of 1/Radix < 1. */
+ do
+ {
+ C = Y;
+ Y = Z;
+ Z = Y * Y;
+ }
+ while ((Y > Z) && (Z + Z > Z));
+ Y = C;
+ Z = Y * D;
+ do
+ {
+ C = Y;
+ Y = Z;
+ Z = Y * D;
+ }
+ while ((Y > Z) && (Z + Z > Z));
+ if (Radix < Two)
+ HInvrse = Two;
+ else
+ HInvrse = Radix;
+ H = One / HInvrse;
+ /* ... 1/HInvrse == H == Min(1/Radix, 1/2) */
+ CInvrse = One / C;
+ E0 = C;
+ Z = E0 * H;
+ /* ...1/Radix^(BIG Integer) << 1 << CInvrse == 1/C */
+ do
+ {
+ Y = E0;
+ E0 = Z;
+ Z = E0 * H;
+ }
+ while ((E0 > Z) && (Z + Z > Z));
+ UfThold = E0;
+ E1 = Zero;
+ Q = Zero;
+ E9 = U2;
+ S = One + E9;
+ D = C * S;
+ if (D <= C)
+ {
+ E9 = Radix * U2;
+ S = One + E9;
+ D = C * S;
+ if (D <= C)
+ {
+ BadCond (Failure,
+ "multiplication gets too many last digits wrong.\n");
+ Underflow = E0;
+ Y1 = Zero;
+ PseudoZero = Z;
+ Pause ();
+ }
+ }
+ else
+ {
+ Underflow = D;
+ PseudoZero = Underflow * H;
+ UfThold = Zero;
+ do
+ {
+ Y1 = Underflow;
+ Underflow = PseudoZero;
+ if (E1 + E1 <= E1)
+ {
+ Y2 = Underflow * HInvrse;
+ E1 = FABS (Y1 - Y2);
+ Q = Y1;
+ if ((UfThold == Zero) && (Y1 != Y2))
+ UfThold = Y1;
+ }
+ PseudoZero = PseudoZero * H;
+ }
+ while ((Underflow > PseudoZero)
+ && (PseudoZero + PseudoZero > PseudoZero));
+ }
+ /* Comment line 4530 .. 4560 */
+ if (PseudoZero != Zero)
+ {
+ printf ("\n");
+ Z = PseudoZero;
+ /* ... Test PseudoZero for "phoney- zero" violates */
+ /* ... PseudoZero < Underflow or PseudoZero < PseudoZero + PseudoZero
+ ... */
+ if (PseudoZero <= Zero)
+ {
+ BadCond (Failure, "Positive expressions can underflow to an\n");
+ printf ("allegedly negative value\n");
+ printf ("PseudoZero that prints out as: %s .\n", PseudoZero.str());
+ X = -PseudoZero;
+ if (X <= Zero)
+ {
+ printf ("But -PseudoZero, which should be\n");
+ printf ("positive, isn't; it prints out as %s .\n", X.str());
+ }
+ }
+ else
+ {
+ BadCond (Flaw, "Underflow can stick at an allegedly positive\n");
+ printf ("value PseudoZero that prints out as %s .\n",
+ PseudoZero.str());
+ }
+ TstPtUf ();
+ }
+ /*=============================================*/
+ Milestone = 120;
+ /*=============================================*/
+ if (CInvrse * Y > CInvrse * Y1)
+ {
+ S = H * S;
+ E0 = Underflow;
+ }
+ if (!((E1 == Zero) || (E1 == E0)))
+ {
+ BadCond (Defect, "");
+ if (E1 < E0)
+ {
+ printf ("Products underflow at a higher");
+ printf (" threshold than differences.\n");
+ if (PseudoZero == Zero)
+ E0 = E1;
+ }
+ else
+ {
+ printf ("Difference underflows at a higher");
+ printf (" threshold than products.\n");
+ }
+ }
+ printf ("Smallest strictly positive number found is E0 = %s .\n", E0.str());
+ Z = E0;
+ TstPtUf ();
+ Underflow = E0;
+ if (N == 1)
+ Underflow = Y;
+ I = 4;
+ if (E1 == Zero)
+ I = 3;
+ if (UfThold == Zero)
+ I = I - 2;
+ UfNGrad = true;
+ switch (I)
+ {
+ case 1:
+ UfThold = Underflow;
+ if ((CInvrse * Q) != ((CInvrse * Y) * S))
+ {
+ UfThold = Y;
+ BadCond (Failure, "Either accuracy deteriorates as numbers\n");
+ printf ("approach a threshold = %s\n", UfThold.str());
+ printf (" coming down from %s\n", C.str());
+ printf
+ (" or else multiplication gets too many last digits wrong.\n");
+ }
+ Pause ();
+ break;
+
+ case 2:
+ BadCond (Failure,
+ "Underflow confuses Comparison, which alleges that\n");
+ printf ("Q == Y while denying that |Q - Y| == 0; these values\n");
+ printf ("print out as Q = %s, Y = %s .\n", Q.str(), Y2.str());
+ printf ("|Q - Y| = %s .\n", FABS (Q - Y2).str());
+ UfThold = Q;
+ break;
+
+ case 3:
+ X = X;
+ break;
+
+ case 4:
+ if ((Q == UfThold) && (E1 == E0) && (FABS (UfThold - E1 / E9) <= E1))
+ {
+ UfNGrad = false;
+ printf ("Underflow is gradual; it incurs Absolute Error =\n");
+ printf ("(roundoff in UfThold) < E0.\n");
+ Y = E0 * CInvrse;
+ Y = Y * (OneAndHalf + U2);
+ X = CInvrse * (One + U2);
+ Y = Y / X;
+ IEEE = (Y == E0);
+ }
+ }
+ if (UfNGrad)
+ {
+ printf ("\n");
+ if (setjmp (ovfl_buf))
+ {
+ printf ("Underflow / UfThold failed!\n");
+ R = H + H;
+ }
+ else
+ R = SQRT (Underflow / UfThold);
+ if (R <= H)
+ {
+ Z = R * UfThold;
+ X = Z * (One + R * H * (One + H));
+ }
+ else
+ {
+ Z = UfThold;
+ X = Z * (One + H * H * (One + H));
+ }
+ if (!((X == Z) || (X - Z != Zero)))
+ {
+ BadCond (Flaw, "");
+ printf ("X = %s\n\tis not equal to Z = %s .\n", X.str(), Z.str());
+ Z9 = X - Z;
+ printf ("yet X - Z yields %s .\n", Z9.str());
+ printf (" Should this NOT signal Underflow, ");
+ printf ("this is a SERIOUS DEFECT\nthat causes ");
+ printf ("confusion when innocent statements like\n");;
+ printf (" if (X == Z) ... else");
+ printf (" ... (f(X) - f(Z)) / (X - Z) ...\n");
+ printf ("encounter Division by Zero although actually\n");
+ if (setjmp (ovfl_buf))
+ printf ("X / Z fails!\n");
+ else
+ printf ("X / Z = 1 + %s .\n", ((X / Z - Half) - Half).str());
+ }
+ }
+ printf ("The Underflow threshold is %s, below which\n", UfThold.str());
+ printf ("calculation may suffer larger Relative error than ");
+ printf ("merely roundoff.\n");
+ Y2 = U1 * U1;
+ Y = Y2 * Y2;
+ Y2 = Y * U1;
+ if (Y2 <= UfThold)
+ {
+ if (Y > E0)
+ {
+ BadCond (Defect, "");
+ I = 5;
+ }
+ else
+ {
+ BadCond (Serious, "");
+ I = 4;
+ }
+ printf ("Range is too narrow; U1^%d Underflows.\n", I);
+ }
+ /*=============================================*/
+ Milestone = 130;
+ /*=============================================*/
+ Y = -FLOOR (Half - TwoForty * LOG (UfThold) / LOG (HInvrse)) / TwoForty;
+ Y2 = Y + Y;
+ printf ("Since underflow occurs below the threshold\n");
+ printf ("UfThold = (%s) ^ (%s)\nonly underflow ", HInvrse.str(), Y.str());
+ printf ("should afflict the expression\n\t(%s) ^ (%s);\n",
+ HInvrse.str(), Y2.str());
+ printf ("actually calculating yields:");
+ if (setjmp (ovfl_buf))
+ {
+ BadCond (Serious, "trap on underflow.\n");
+ }
+ else
+ {
+ V9 = POW (HInvrse, Y2);
+ printf (" %s .\n", V9.str());
+ if (!((V9 >= Zero) && (V9 <= (Radix + Radix + E9) * UfThold)))
+ {
+ BadCond (Serious, "this is not between 0 and underflow\n");
+ printf (" threshold = %s .\n", UfThold.str());
+ }
+ else if (!(V9 > UfThold * (One + E9)))
+ printf ("This computed value is O.K.\n");
+ else
+ {
+ BadCond (Defect, "this is not between 0 and underflow\n");
+ printf (" threshold = %s .\n", UfThold.str());
+ }
+ }
+ /*=============================================*/
+ Milestone = 160;
+ /*=============================================*/
+ Pause ();
+ printf ("Searching for Overflow threshold:\n");
+ printf ("This may generate an error.\n");
+ Y = -CInvrse;
+ V9 = HInvrse * Y;
+ if (setjmp (ovfl_buf))
+ {
+ I = 0;
+ V9 = Y;
+ goto overflow;
+ }
+ do
+ {
+ V = Y;
+ Y = V9;
+ V9 = HInvrse * Y;
+ }
+ while (V9 < Y);
+ I = 1;
+overflow:
+ Z = V9;
+ printf ("Can `Z = -Y' overflow?\n");
+ printf ("Trying it on Y = %s .\n", Y.str());
+ V9 = -Y;
+ V0 = V9;
+ if (V - Y == V + V0)
+ printf ("Seems O.K.\n");
+ else
+ {
+ printf ("finds a ");
+ BadCond (Flaw, "-(-Y) differs from Y.\n");
+ }
+ if (Z != Y)
+ {
+ BadCond (Serious, "");
+ printf ("overflow past %s\n\tshrinks to %s .\n", Y.str(), Z.str());
+ }
+ if (I)
+ {
+ Y = V * (HInvrse * U2 - HInvrse);
+ Z = Y + ((One - HInvrse) * U2) * V;
+ if (Z < V0)
+ Y = Z;
+ if (Y < V0)
+ V = Y;
+ if (V0 - V < V0)
+ V = V0;
+ }
+ else
+ {
+ V = Y * (HInvrse * U2 - HInvrse);
+ V = V + ((One - HInvrse) * U2) * Y;
+ }
+ printf ("Overflow threshold is V = %s .\n", V.str());
+ if (I)
+ printf ("Overflow saturates at V0 = %s .\n", V0.str());
+ else
+ printf ("There is no saturation value because "
+ "the system traps on overflow.\n");
+ V9 = V * One;
+ printf ("No Overflow should be signaled for V * 1 = %s\n", V9.str());
+ V9 = V / One;
+ printf (" nor for V / 1 = %s.\n", V9.str());
+ printf ("Any overflow signal separating this * from the one\n");
+ printf ("above is a DEFECT.\n");
+ /*=============================================*/
+ Milestone = 170;
+ /*=============================================*/
+ if (!(-V < V && -V0 < V0 && -UfThold < V && UfThold < V))
+ {
+ BadCond (Failure, "Comparisons involving ");
+ printf ("+-%s, +-%s\nand +-%s are confused by Overflow.",
+ V.str(), V0.str(), UfThold.str());
+ }
+ /*=============================================*/
+ Milestone = 175;
+ /*=============================================*/
+ printf ("\n");
+ for (Indx = 1; Indx <= 3; ++Indx)
+ {
+ switch (Indx)
+ {
+ case 1:
+ Z = UfThold;
+ break;
+ case 2:
+ Z = E0;
+ break;
+ case 3:
+ Z = PseudoZero;
+ break;
+ }
+ if (Z != Zero)
+ {
+ V9 = SQRT (Z);
+ Y = V9 * V9;
+ if (Y / (One - Radix * E9) < Z || Y > (One + Radix * E9) * Z)
+ { /* dgh: + E9 --> * E9 */
+ if (V9 > U1)
+ BadCond (Serious, "");
+ else
+ BadCond (Defect, "");
+ printf ("Comparison alleges that what prints as Z = %s\n",
+ Z.str());
+ printf (" is too far from sqrt(Z) ^ 2 = %s .\n", Y.str());
+ }
+ }
+ }
+ /*=============================================*/
+ Milestone = 180;
+ /*=============================================*/
+ for (Indx = 1; Indx <= 2; ++Indx)
+ {
+ if (Indx == 1)
+ Z = V;
+ else
+ Z = V0;
+ V9 = SQRT (Z);
+ X = (One - Radix * E9) * V9;
+ V9 = V9 * X;
+ if (((V9 < (One - Two * Radix * E9) * Z) || (V9 > Z)))
+ {
+ Y = V9;
+ if (X < W)
+ BadCond (Serious, "");
+ else
+ BadCond (Defect, "");
+ printf ("Comparison alleges that Z = %s\n", Z.str());
+ printf (" is too far from sqrt(Z) ^ 2 (%s) .\n", Y.str());
+ }
+ }
+ /*=============================================*/
+ Milestone = 190;
+ /*=============================================*/
+ Pause ();
+ X = UfThold * V;
+ Y = Radix * Radix;
+ if (X * Y < One || X > Y)
+ {
+ if (X * Y < U1 || X > Y / U1)
+ BadCond (Defect, "Badly");
+ else
+ BadCond (Flaw, "");
+
+ printf (" unbalanced range; UfThold * V = %s\n\t%s\n",
+ X.str(), "is too far from 1.\n");
+ }
+ /*=============================================*/
+ Milestone = 200;
+ /*=============================================*/
+ for (Indx = 1; Indx <= 5; ++Indx)
+ {
+ X = F9;
+ switch (Indx)
+ {
+ case 2:
+ X = One + U2;
+ break;
+ case 3:
+ X = V;
+ break;
+ case 4:
+ X = UfThold;
+ break;
+ case 5:
+ X = Radix;
+ }
+ Y = X;
+ if (setjmp (ovfl_buf))
+ printf (" X / X traps when X = %s\n", X.str());
+ else
+ {
+ V9 = (Y / X - Half) - Half;
+ if (V9 == Zero)
+ continue;
+ if (V9 == -U1 && Indx < 5)
+ BadCond (Flaw, "");
+ else
+ BadCond (Serious, "");
+ printf (" X / X differs from 1 when X = %s\n", X.str());
+ printf (" instead, X / X - 1/2 - 1/2 = %s .\n", V9.str());
+ }
+ }
+ /*=============================================*/
+ Milestone = 210;
+ /*=============================================*/
+ MyZero = Zero;
+ printf ("\n");
+ printf ("What message and/or values does Division by Zero produce?\n");
+ printf (" Trying to compute 1 / 0 produces ...");
+ if (!setjmp (ovfl_buf))
+ printf (" %s .\n", (One / MyZero).str());
+ printf ("\n Trying to compute 0 / 0 produces ...");
+ if (!setjmp (ovfl_buf))
+ printf (" %s .\n", (Zero / MyZero).str());
+ /*=============================================*/
+ Milestone = 220;
+ /*=============================================*/
+ Pause ();
+ printf ("\n");
+ {
+ static const char *msg[] = {
+ "FAILUREs encountered =",
+ "SERIOUS DEFECTs discovered =",
+ "DEFECTs discovered =",
+ "FLAWs discovered ="
+ };
+ int i;
+ for (i = 0; i < 4; i++)
+ if (ErrCnt[i])
+ printf ("The number of %-29s %d.\n", msg[i], ErrCnt[i]);
+ }
+ printf ("\n");
+ if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[Defect] + ErrCnt[Flaw]) > 0)
+ {
+ if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[Defect] == 0)
+ && (ErrCnt[Flaw] > 0))
+ {
+ printf ("The arithmetic diagnosed seems ");
+ printf ("Satisfactory though flawed.\n");
+ }
+ if ((ErrCnt[Failure] + ErrCnt[Serious] == 0) && (ErrCnt[Defect] > 0))
+ {
+ printf ("The arithmetic diagnosed may be Acceptable\n");
+ printf ("despite inconvenient Defects.\n");
+ }
+ if ((ErrCnt[Failure] + ErrCnt[Serious]) > 0)
+ {
+ printf ("The arithmetic diagnosed has ");
+ printf ("unacceptable Serious Defects.\n");
+ }
+ if (ErrCnt[Failure] > 0)
+ {
+ printf ("Potentially fatal FAILURE may have spoiled this");
+ printf (" program's subsequent diagnoses.\n");
+ }
+ }
+ else
+ {
+ printf ("No failures, defects nor flaws have been discovered.\n");
+ if (!((RMult == Rounded) && (RDiv == Rounded)
+ && (RAddSub == Rounded) && (RSqrt == Rounded)))
+ printf ("The arithmetic diagnosed seems Satisfactory.\n");
+ else
+ {
+ if (StickyBit >= One &&
+ (Radix - Two) * (Radix - Nine - One) == Zero)
+ {
+ printf ("Rounding appears to conform to ");
+ printf ("the proposed IEEE standard P");
+ if ((Radix == Two) &&
+ ((Precision - Four * Three * Two) *
+ (Precision - TwentySeven - TwentySeven + One) == Zero))
+ printf ("754");
+ else
+ printf ("854");
+ if (IEEE)
+ printf (".\n");
+ else
+ {
+ printf (",\nexcept for possibly Double Rounding");
+ printf (" during Gradual Underflow.\n");
+ }
+ }
+ printf ("The arithmetic diagnosed appears to be Excellent!\n");
+ }
+ }
+ printf ("END OF TEST.\n");
+ return 0;
+}
+
+template<typename FLOAT>
+FLOAT
+Paranoia<FLOAT>::Sign (FLOAT X)
+{
+ return X >= FLOAT (long (0)) ? 1 : -1;
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::Pause ()
+{
+ if (do_pause)
+ {
+ fputs ("Press return...", stdout);
+ fflush (stdout);
+ getchar();
+ }
+ printf ("\nDiagnosis resumes after milestone Number %d", Milestone);
+ printf (" Page: %d\n\n", PageNo);
+ ++Milestone;
+ ++PageNo;
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::TstCond (int K, int Valid, const char *T)
+{
+ if (!Valid)
+ {
+ BadCond (K, T);
+ printf (".\n");
+ }
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::BadCond (int K, const char *T)
+{
+ static const char *msg[] = { "FAILURE", "SERIOUS DEFECT", "DEFECT", "FLAW" };
+
+ ErrCnt[K] = ErrCnt[K] + 1;
+ printf ("%s: %s", msg[K], T);
+}
+
+/* Random computes
+ X = (Random1 + Random9)^5
+ Random1 = X - FLOOR(X) + 0.000005 * X;
+ and returns the new value of Random1. */
+
+template<typename FLOAT>
+FLOAT
+Paranoia<FLOAT>::Random ()
+{
+ FLOAT X, Y;
+
+ X = Random1 + Random9;
+ Y = X * X;
+ Y = Y * Y;
+ X = X * Y;
+ Y = X - FLOOR (X);
+ Random1 = Y + X * FLOAT ("0.000005");
+ return (Random1);
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::SqXMinX (int ErrKind)
+{
+ FLOAT XA, XB;
+
+ XB = X * BInvrse;
+ XA = X - XB;
+ SqEr = ((SQRT (X * X) - XB) - XA) / OneUlp;
+ if (SqEr != Zero)
+ {
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ J = J + 1;
+ BadCond (ErrKind, "\n");
+ printf ("sqrt(%s) - %s = %s\n", (X * X).str(), X.str(),
+ (OneUlp * SqEr).str());
+ printf ("\tinstead of correct value 0 .\n");
+ }
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::NewD ()
+{
+ X = Z1 * Q;
+ X = FLOOR (Half - X / Radix) * Radix + X;
+ Q = (Q - X * Z) / Radix + X * X * (D / Radix);
+ Z = Z - Two * X * D;
+ if (Z <= Zero)
+ {
+ Z = -Z;
+ Z1 = -Z1;
+ }
+ D = Radix * D;
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::SR3750 ()
+{
+ if (!((X - Radix < Z2 - Radix) || (X - Z2 > W - Z2)))
+ {
+ I = I + 1;
+ X2 = SQRT (X * D);
+ Y2 = (X2 - Z2) - (Y - Z2);
+ X2 = X8 / (Y - Half);
+ X2 = X2 - Half * X2 * X2;
+ SqEr = (Y2 + Half) + (Half - X2);
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ SqEr = Y2 - X2;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ }
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::IsYeqX ()
+{
+ if (Y != X)
+ {
+ if (N <= 0)
+ {
+ if (Z == Zero && Q <= Zero)
+ printf ("WARNING: computing\n");
+ else
+ BadCond (Defect, "computing\n");
+ printf ("\t(%s) ^ (%s)\n", Z.str(), Q.str());
+ printf ("\tyielded %s;\n", Y.str());
+ printf ("\twhich compared unequal to correct %s ;\n", X.str());
+ printf ("\t\tthey differ by %s .\n", (Y - X).str());
+ }
+ N = N + 1; /* ... count discrepancies. */
+ }
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::PrintIfNPositive ()
+{
+ if (N > 0)
+ printf ("Similar discrepancies have occurred %d times.\n", N);
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::TstPtUf ()
+{
+ N = 0;
+ if (Z != Zero)
+ {
+ printf ("Since comparison denies Z = 0, evaluating ");
+ printf ("(Z + Z) / Z should be safe.\n");
+ if (setjmp (ovfl_buf))
+ goto very_serious;
+ Q9 = (Z + Z) / Z;
+ printf ("What the machine gets for (Z + Z) / Z is %s .\n", Q9.str());
+ if (FABS (Q9 - Two) < Radix * U2)
+ {
+ printf ("This is O.K., provided Over/Underflow");
+ printf (" has NOT just been signaled.\n");
+ }
+ else
+ {
+ if ((Q9 < One) || (Q9 > Two))
+ {
+ very_serious:
+ N = 1;
+ ErrCnt[Serious] = ErrCnt[Serious] + 1;
+ printf ("This is a VERY SERIOUS DEFECT!\n");
+ }
+ else
+ {
+ N = 1;
+ ErrCnt[Defect] = ErrCnt[Defect] + 1;
+ printf ("This is a DEFECT!\n");
+ }
+ }
+ V9 = Z * One;
+ Random1 = V9;
+ V9 = One * Z;
+ Random2 = V9;
+ V9 = Z / One;
+ if ((Z == Random1) && (Z == Random2) && (Z == V9))
+ {
+ if (N > 0)
+ Pause ();
+ }
+ else
+ {
+ N = 1;
+ BadCond (Defect, "What prints as Z = ");
+ printf ("%s\n\tcompares different from ", Z.str());
+ if (Z != Random1)
+ printf ("Z * 1 = %s ", Random1.str());
+ if (!((Z == Random2) || (Random2 == Random1)))
+ printf ("1 * Z == %s\n", Random2.str());
+ if (!(Z == V9))
+ printf ("Z / 1 = %s\n", V9.str());
+ if (Random2 != Random1)
+ {
+ ErrCnt[Defect] = ErrCnt[Defect] + 1;
+ BadCond (Defect, "Multiplication does not commute!\n");
+ printf ("\tComparison alleges that 1 * Z = %s\n", Random2.str());
+ printf ("\tdiffers from Z * 1 = %s\n", Random1.str());
+ }
+ Pause ();
+ }
+ }
+}
+
+template<typename FLOAT>
+void
+Paranoia<FLOAT>::notify (const char *s)
+{
+ printf ("%s test appears to be inconsistent...\n", s);
+ printf (" PLEASE NOTIFY KARPINKSI!\n");
+}
+
+/* ====================================================================== */
+
+int main(int ac, char **av)
+{
+ while (1)
+ switch (getopt (ac, av, "pvg:fdl"))
+ {
+ case -1:
+ return 0;
+ case 'p':
+ do_pause = true;
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 'g':
+ {
+ static const struct {
+ const char *name;
+ const struct real_format *fmt;
+ } fmts[] = {
+#define F(x) { #x, &x##_format }
+ F(ieee_single),
+ F(ieee_double),
+ F(ieee_extended_motorola),
+ F(ieee_extended_intel_96),
+ F(ieee_extended_intel_128),
+ F(ibm_extended),
+ F(ieee_quad),
+ F(vax_f),
+ F(vax_d),
+ F(vax_g),
+ F(i370_single),
+ F(i370_double),
+ F(c4x_single),
+ F(c4x_extended),
+#undef F
+ };
+
+ int i, n = sizeof (fmts)/sizeof(*fmts);
+
+ for (i = 0; i < n; ++i)
+ if (strcmp (fmts[i].name, optarg) == 0)
+ break;
+
+ if (i == n)
+ {
+ printf ("Unknown implementation \"%s\"; "
+ "available implementations:\n", optarg);
+ for (i = 0; i < n; ++i)
+ printf ("\t%s\n", fmts[i].name);
+ return 1;
+ }
+
+ // We cheat and use the same mode all the time, but vary
+ // the format used for that mode.
+ real_format_for_mode[int(real_c_float::MODE) - int(QFmode)]
+ = fmts[i].fmt;
+
+ Paranoia<real_c_float>().main();
+ break;
+ }
+
+ case 'f':
+ Paranoia < native_float<float> >().main();
+ break;
+ case 'd':
+ Paranoia < native_float<double> >().main();
+ break;
+ case 'l':
+#ifndef NO_LONG_DOUBLE
+ Paranoia < native_float<long double> >().main();
+#endif
+ break;
+
+ case '?':
+ puts ("-p\tpause between pages");
+ puts ("-g<FMT>\treal.c implementation FMT");
+ puts ("-f\tnative float");
+ puts ("-d\tnative double");
+ puts ("-l\tnative long double");
+ return 0;
+ }
+}
+
+/* GCC stuff referenced by real.o. */
+
+extern "C" void
+fancy_abort ()
+{
+ abort ();
+}
+
+int target_flags = 0;
diff --git a/contrib/regression/ChangeLog b/contrib/regression/ChangeLog
index e5239c5a8f9..9b3406a71c2 100644
--- a/contrib/regression/ChangeLog
+++ b/contrib/regression/ChangeLog
@@ -1,3 +1,16 @@
+2002-10-11 Geoffrey Keating <geoffk@apple.com>
+
+ * objs-gcc.sh: Don't install GDB testsuite if GDB was not built.
+ * btest-gcc.sh: Don't run GDB testsuite if it doesn't exist.
+
+2002-10-09 Phil Edwards <pme@gcc.gnu.org>
+
+ * btest-gcc.sh, objs-gcc.sh: Update TARGET comments.
+
+2002-10-09 Geoffrey Keating <geoffk@apple.com>
+
+ * objs-gcc.sh: On (non-linux) native hosts, use 'make bootstrap'.
+
2002-03-09 Geoffrey Keating <geoffk@redhat.com>
* btest-gcc.sh: For crosses, assume newlib and GNU binutils.
diff --git a/contrib/regression/btest-gcc.sh b/contrib/regression/btest-gcc.sh
index dbdd6697c21..7dfddb86ed6 100755
--- a/contrib/regression/btest-gcc.sh
+++ b/contrib/regression/btest-gcc.sh
@@ -19,8 +19,9 @@
# INPUT:
# btest <target> <source> <prefix> <state> <build>
-# TARGET is the target triplet. It should be the same one
-# as used in constructing PREFIX.
+# TARGET is the target triplet. It should be the same one as used in
+# constructing PREFIX. Or it can be the keyword 'native', indicating
+# a target of whatever platform the script is running on.
TARGET=$1
# SOURCE is the directory containing the toplevel configure.
SOURCE=$2
@@ -126,6 +127,7 @@ make check-target-libstdc++-v3
# Test the just-built GCC with the GDB testsuite.
mkdir test-gdb || exit 1
+if [ -d $GDB_TESTSUITE ] ; then
cd $GDB_TESTSUITE || exit 1
for i in gdb.* ; do
if [ -d $i ] ; then
@@ -141,6 +143,9 @@ echo "set build_alias $H_BUILD" >> site.exp
echo "set build_triplet $H_BUILD" >> site.exp
echo "set srcdir $GDB_TESTSUITE" >> site.exp
runtest --tool gdb
+else
+ echo 'gdb tests not run' > $BUILD/test-gdb/gdb.sum
+fi
# Sanity-check the testlogs. They should contain at least one PASS.
cd $BUILD || exit 1
diff --git a/contrib/regression/objs-gcc.sh b/contrib/regression/objs-gcc.sh
index 839fcffb612..cc152d1f80c 100755
--- a/contrib/regression/objs-gcc.sh
+++ b/contrib/regression/objs-gcc.sh
@@ -19,8 +19,9 @@
# INPUT:
# btest <target> <source> <prefix> <state> <build>
-# TARGET is the target triplet. It should be the same one
-# as used in constructing PREFIX.
+# TARGET is the target triplet. It should be the same one as used in
+# constructing PREFIX. Or it can be the keyword 'native', indicating
+# a target of whatever platform the script is running on.
TARGET=$1
# SOURCE is the directory containing the toplevel configure.
SOURCE=$2
@@ -104,18 +105,23 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-gnu ]
then
make all-gdb all-dejagnu all-ld || exit 1
make install-gdb install-dejagnu install-ld || exit 1
+elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
+ make bootstrap || exit 1
+ make install || exit 1
else
make || exit 1
make install || exit 1
fi
-mkdir -p $PREFIX/share/gdb-testsuite || exit 1
-cd $SOURCE/gdb/testsuite || exit 1
-find . -print | cpio -pdmu $PREFIX/share/gdb-testsuite || exit 1
-# selftest.exp requires keeping old sources around, which is impractical
-rm $PREFIX/share/gdb-testsuite/gdb.base/selftest.exp
-# these tests seem to be broken and randomly failing
-rm -r $PREFIX/share/gdb-testsuite/gdb.mi
+if [ -x $PREFIX/bin/$TARGET-gdb ] ; then
+ mkdir -p $PREFIX/share/gdb-testsuite || exit 1
+ cd $SOURCE/gdb/testsuite || exit 1
+ find . -print | cpio -pdmu $PREFIX/share/gdb-testsuite || exit 1
+ # selftest.exp requires keeping old sources around, which is impractical
+ rm $PREFIX/share/gdb-testsuite/gdb.base/selftest.exp
+ # these tests seem to be broken and randomly failing
+ rm -r $PREFIX/share/gdb-testsuite/gdb.mi
+fi
echo pass > $RESULT
exit 0
diff --git a/fastjar/.cvsignore b/fastjar/.cvsignore
new file mode 100644
index 00000000000..67c7a2e782d
--- /dev/null
+++ b/fastjar/.cvsignore
@@ -0,0 +1,3 @@
+fastjar.info
+grepjar.1
+jar.1
diff --git a/fastjar/ChangeLog b/fastjar/ChangeLog
index 42cc98ab390..c85058ed47c 100644
--- a/fastjar/ChangeLog
+++ b/fastjar/ChangeLog
@@ -1,3 +1,60 @@
+2002-10-20 Tom Tromey <tromey@redhat.com>
+
+ * jartool.c: Use mode 0666 when opening new file.
+
+2002-09-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ * jargrep.c (chk_wrd): Remove unused variable(s).
+ * jartool.c (main, create_central_header, list_jar): Likewise.
+
+2002-10-15 Ranjit Mathew <rmathew@hotmail.com>
+
+ * configure, config.h.in: Rebuilt.
+ * configure.in: Call gcc_AC_FUNC_MKDIR_TAKES_ONE_ARG.
+
+2002-09-11 Tom Tromey <tromey@redhat.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (TEXINFO_TEX): New macro.
+ (info_TEXINFOS): Likewise.
+ (fastjar_TEXINFOS): Likewise.
+ (man_MANS): Likewise.
+ (EXTRA_DIST): Likewise.
+ (my_makei_flags): Likewise.
+ (fastjar.info): New rule.
+ (fastjar_TEXINFOS): Don't mention `$(srcdir)'.
+ (TEXINFO_TEX): Likewise.
+ (AUTOMAKE_OPTIONS): Added `cygnus'.
+
+2002-09-11 Matthias Klose <doko@debian.org>
+
+ * Makefile.am: Revert the previous patch.
+ * Makefile.in: Regenerated.
+
+2002-09-10 Matthias Klose <doko@debian.org>
+
+ * fastjar.texi: New.
+ * Makefile.am: Support building info docs and manpages.
+ * Makefile.in: Regenerated.
+ * configure.in: Set gcc_version.
+ * configure: Regenerated.
+ * jargrep.c: Update usage and help strings.
+
+2002-09-09 Tom Tromey <tromey@redhat.com>
+
+ * jartool.c (mkdir): Define.
+ * config.h.in: Rebuilt.
+ * aclocal.m4, configure: Rebuilt.
+ * acinclude.m4: New file. Copied gcc_AC_COMPILE_CHECK_SIZEOF,
+ gcc_AC_EXAMINE_OBJECT, and fastjar_AC_COMPILE_C_BIGENDIAN from
+ aclocal.m4.
+
+2002-09-04 Tom Tromey <tromey@redhat.com>
+
+ From greenrd@hotmail.com:
+ * jartool.c (list_jar): Correctly determine when new `filename'
+ buffer must be allocated. Fixes PR java/7830.
+
2002-06-03 Geoffrey Keating <geoffk@redhat.com>
* configure.in: Support cross-compiling.
@@ -72,7 +129,7 @@
* aclocal.m4: Regenerated.
* stamp-h.in: Regenerated.
* jargrep.c: Eliminate some signed/unsigned and default
- uninitialized warnings. Use HAVE_STDLIB_H instead of
+ uninitialized warnings. Use HAVE_STDLIB_H instead of
STDC_HEADERS macro.
* jartool.c: Likewise.
* compress.c: Likewise.
@@ -114,7 +171,7 @@
2001-05-15 Per Bothner <per@bothner.com>
- * Makefile.am (bin_PROGRAMS): Renamed from "fastjar" to "jar".
+ * Makefile.am (bin_PROGRAMS): Renamed from "fastjar" to "jar".
2001-05-03 John David Anglin <dave@hiauly1.hia.nrc.ca>
@@ -132,7 +189,7 @@
* jartool.c (MAXPATHLEN): Provide if not defined.
2000-12-15 Tom Tromey <tromey@redhat.com>
- Kelley Cook <kelleycook@home.com>
+ Kelley Cook <kelleycook@home.com>
* jargrep.c: Include getopt.h if it exists.
(optind): Declare.
diff --git a/fastjar/Makefile.am b/fastjar/Makefile.am
index 4e95c444295..39a57c40d22 100644
--- a/fastjar/Makefile.am
+++ b/fastjar/Makefile.am
@@ -57,3 +57,42 @@ grepjar_LDADD = $(ZLIBS) $(LIBIBERTY)
grepjar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY)
AM_CFLAGS = @fastjar_warn_cflags@
+
+TEXINFO_TEX = ../gcc/doc/include/texinfo.tex
+info_TEXINFOS = fastjar.texi
+fastjar_TEXINFOS = \
+ ../gcc/doc/include/gcc-common.texi \
+ ../gcc/doc/include/fdl.texi \
+ ../gcc/doc/include/gpl.texi
+man_MANS = jar.1 grepjar.1
+EXTRA_DIST = $(man_MANS)
+
+## This is a hack. We can't set AM_MAKEINFOFLAGS, since that isn't
+## available in 1.4. Nor can we override or append to MAKEINFO or
+## MAKEINFOFLAGS, since these are overridden by the top-level
+## Makefile. So, we just duplicate the rules. FIXME: remove this
+## when we upgrade automake. Note that we don't include $(srcdir) in
+## my_makei_flags; makeinfo is run in srcdir.
+my_makei_flags += -I ../gcc/doc/include
+fastjar.info: fastjar.texi $(fastjar_TEXINFOS)
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) $(my_makei_flags) `echo $< | sed 's,.*/,,'`
+
+
+TEXI2POD = perl $(srcdir)/../contrib/texi2pod.pl
+POD2MAN = pod2man --center="GNU" --release="gcc-@gcc_version@"
+
+$(srcdir)/jar.1: $(srcdir)/fastjar.texi
+ -$(TEXI2POD) -D jar < $(srcdir)/fastjar.texi > fastjar.pod
+ ($(POD2MAN) --section=1 fastjar.pod > jar.1.T$$$$ && \
+ mv -f jar.1.T$$$$ $(srcdir)/jar.1) || \
+ (rm -f jar.1.T$$$$ && exit 1)
+ rm -f fastjar.pod
+
+$(srcdir)/grepjar.1: $(srcdir)/fastjar.texi
+ -$(TEXI2POD) -D grepjar < $(srcdir)/fastjar.texi > grepjar.pod
+ ($(POD2MAN) --section=1 grepjar.pod > grepjar.1.T$$$$ && \
+ mv -f grepjar.1.T$$$$ $(srcdir)/grepjar.1) || \
+ (rm -f grepjar.1.T$$$$ && exit 1)
+ rm -f grepjar.pod
diff --git a/fastjar/Makefile.in b/fastjar/Makefile.in
index f2bb31e9d4b..4b6675000fe 100644
--- a/fastjar/Makefile.in
+++ b/fastjar/Makefile.in
@@ -73,6 +73,7 @@ ZDEPS = @ZDEPS@
ZINCS = @ZINCS@
ZLIBS = @ZLIBS@
fastjar_warn_cflags = @fastjar_warn_cflags@
+gcc_version = @gcc_version@
AUTOMAKE_OPTIONS = no-dependencies
@@ -133,6 +134,21 @@ grepjar_LDADD = $(ZLIBS) $(LIBIBERTY)
grepjar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY)
AM_CFLAGS = @fastjar_warn_cflags@
+
+TEXINFO_TEX = ../gcc/doc/include/texinfo.tex
+info_TEXINFOS = fastjar.texi
+fastjar_TEXINFOS = \
+ ../gcc/doc/include/gcc-common.texi \
+ ../gcc/doc/include/fdl.texi \
+ ../gcc/doc/include/gpl.texi
+
+man_MANS = jar.1 grepjar.1
+EXTRA_DIST = $(man_MANS)
+
+my_makei_flags = -I ../gcc/doc/include
+
+TEXI2POD = perl $(srcdir)/../contrib/texi2pod.pl
+POD2MAN = pod2man --center="GNU" --release="gcc-@gcc_version@"
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = config.h
@@ -153,21 +169,30 @@ CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
-Makefile.am Makefile.in NEWS aclocal.m4 config.h.in configure \
-configure.in install-defs.sh.in install-sh missing mkinstalldirs
+TEXI2DVI = texi2dvi
+INFO_DEPS = fastjar.info
+DVIS = fastjar.dvi
+TEXINFOS = fastjar.texi
+man1dir = $(mandir)/man1
+MANS = $(man_MANS)
+
+NROFF = nroff
+DIST_COMMON = README $(fastjar_TEXINFOS) ./stamp-h.in AUTHORS COPYING \
+ChangeLog INSTALL Makefile.am Makefile.in NEWS acinclude.m4 aclocal.m4 \
+config.h.in configure configure.in install-defs.sh.in install-sh \
+missing mkinstalldirs
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = tar
+TAR = gtar
GZIP_ENV = --best
SOURCES = $(jar_SOURCES) $(grepjar_SOURCES)
OBJECTS = $(jar_OBJECTS) $(grepjar_OBJECTS)
all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .o .s
+.SUFFIXES: .S .c .dvi .info .o .ps .s .texi .texinfo .txi
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
@@ -175,7 +200,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4
cd $(srcdir) && $(ACLOCAL)
config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -265,6 +290,162 @@ grepjar$(EXEEXT): $(grepjar_OBJECTS) $(grepjar_DEPENDENCIES)
@rm -f grepjar$(EXEEXT)
$(LINK) $(grepjar_LDFLAGS) $(grepjar_OBJECTS) $(grepjar_LDADD) $(LIBS)
+fastjar.info: fastjar.texi $(fastjar_TEXINFOS)
+fastjar.dvi: fastjar.texi $(fastjar_TEXINFOS)
+
+
+DVIPS = dvips
+
+.texi.info:
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
+
+.texi.dvi:
+ TEXINPUTS=$(srcdir)/../gcc/doc/include:$$TEXINPUTS \
+ MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
+
+.texi:
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
+
+.texinfo.info:
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
+
+.texinfo:
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
+
+.texinfo.dvi:
+ TEXINPUTS=$(srcdir)/../gcc/doc/include:$$TEXINPUTS \
+ MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
+
+.txi.info:
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
+
+.txi.dvi:
+ TEXINPUTS=$(srcdir)/../gcc/doc/include:$$TEXINPUTS \
+ MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
+
+.txi:
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
+.dvi.ps:
+ $(DVIPS) $< -o $@
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(infodir)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ d=$(srcdir); \
+ for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
+ if test -f $$d/$$ifile; then \
+ echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \
+ $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
+ install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
+ done; \
+ else : ; fi
+
+uninstall-info:
+ $(PRE_UNINSTALL)
+ @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
+ ii=yes; \
+ else ii=; fi; \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ test -z "$ii" \
+ || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \
+ done
+ @$(NORMAL_UNINSTALL)
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
+ done
+
+dist-info: $(INFO_DEPS)
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ d=$(srcdir); \
+ for file in `cd $$d && eval echo $$base*`; do \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -f fastjar.aux fastjar.cp fastjar.cps fastjar.dvi fastjar.fn \
+ fastjar.fns fastjar.ky fastjar.kys fastjar.ps fastjar.log \
+ fastjar.pg fastjar.toc fastjar.tp fastjar.tps fastjar.vr \
+ fastjar.vrs fastjar.op fastjar.tr fastjar.cv fastjar.cn
+
+clean-aminfo:
+
+distclean-aminfo:
+
+maintainer-clean-aminfo:
+ cd $(srcdir) && for i in $(INFO_DEPS); do \
+ rm -f $$i; \
+ if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \
+ rm -f $$i-[0-9]*; \
+ fi; \
+ done
+
+install-man1:
+ $(mkinstalldirs) $(DESTDIR)$(man1dir)
+ @list='$(man1_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+ done
+
+uninstall-man1:
+ @list='$(man1_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+ rm -f $(DESTDIR)$(man1dir)/$$inst; \
+ done
+install-man: $(MANS)
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-man1
+uninstall-man:
+ @$(NORMAL_UNINSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-man1
+
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP)
@@ -335,16 +516,17 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
d=$(srcdir); \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ cp -pr $$d/$$file $(distdir)/$$file; \
else \
test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-info-am:
+ $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info
+info-am: $(INFO_DEPS)
info: info-am
-dvi-am:
+dvi-am: $(DVIS)
dvi: dvi-am
check-am: all-am
check: check-am
@@ -356,20 +538,21 @@ all-recursive-am: config.h
install-exec-am: install-binPROGRAMS
install-exec: install-exec-am
-install-data-am:
+install-data-am: install-info-am install-man
install-data: install-data-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-am
-uninstall-am: uninstall-binPROGRAMS
+uninstall-am: uninstall-binPROGRAMS uninstall-info uninstall-man
uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) config.h
+all-am: Makefile $(INFO_DEPS) $(PROGRAMS) $(MANS) config.h
all-redirect: all-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
+ $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(infodir) \
+ $(DESTDIR)$(mandir)/man1
mostlyclean-generic:
@@ -382,25 +565,27 @@ distclean-generic:
maintainer-clean-generic:
mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \
- mostlyclean-compile mostlyclean-tags \
+ mostlyclean-compile mostlyclean-aminfo mostlyclean-tags \
mostlyclean-generic
mostlyclean: mostlyclean-am
-clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \
- clean-generic mostlyclean-am
+clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-aminfo \
+ clean-tags clean-generic mostlyclean-am
clean: clean-am
distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \
- distclean-tags distclean-generic clean-am
+ distclean-aminfo distclean-tags distclean-generic \
+ clean-am
distclean: distclean-am
-rm -f config.status
maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \
- maintainer-clean-compile maintainer-clean-tags \
- maintainer-clean-generic distclean-am
+ maintainer-clean-compile maintainer-clean-aminfo \
+ maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
@@ -411,14 +596,35 @@ maintainer-clean: maintainer-clean-am
mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile tags mostlyclean-tags distclean-tags \
-clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
-check-am installcheck-am installcheck all-recursive-am install-exec-am \
+maintainer-clean-compile install-info-am uninstall-info \
+mostlyclean-aminfo distclean-aminfo clean-aminfo \
+maintainer-clean-aminfo install-man1 uninstall-man1 install-man \
+uninstall-man tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck all-recursive-am install-exec-am \
install-exec install-data-am install-data install-am install \
uninstall-am uninstall all-redirect all-am all installdirs \
mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+fastjar.info: fastjar.texi $(fastjar_TEXINFOS)
+ @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
+ cd $(srcdir) \
+ && $(MAKEINFO) $(my_makei_flags) `echo $< | sed 's,.*/,,'`
+
+$(srcdir)/jar.1: $(srcdir)/fastjar.texi
+ -$(TEXI2POD) -D jar < $(srcdir)/fastjar.texi > fastjar.pod
+ ($(POD2MAN) --section=1 fastjar.pod > jar.1.T$$$$ && \
+ mv -f jar.1.T$$$$ $(srcdir)/jar.1) || \
+ (rm -f jar.1.T$$$$ && exit 1)
+ rm -f fastjar.pod
+
+$(srcdir)/grepjar.1: $(srcdir)/fastjar.texi
+ -$(TEXI2POD) -D grepjar < $(srcdir)/fastjar.texi > grepjar.pod
+ ($(POD2MAN) --section=1 grepjar.pod > grepjar.1.T$$$$ && \
+ mv -f grepjar.1.T$$$$ $(srcdir)/grepjar.1) || \
+ (rm -f grepjar.1.T$$$$ && exit 1)
+ rm -f grepjar.pod
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/fastjar/acinclude.m4 b/fastjar/acinclude.m4
new file mode 100644
index 00000000000..0a45d735bd2
--- /dev/null
+++ b/fastjar/acinclude.m4
@@ -0,0 +1,133 @@
+
+dnl Host type sizes probe.
+dnl By Kaveh R. Ghazi. One typo fixed since.
+dnl
+AC_DEFUN([gcc_AC_COMPILE_CHECK_SIZEOF],
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence.
+ AC_TRY_COMPILE([#include "confdefs.h"
+#include <sys/types.h>
+$2
+], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
+ if test x$AC_CV_NAME != x ; then break; fi
+done
+])
+if test x$AC_CV_NAME = x ; then
+ AC_MSG_ERROR([cannot determine a size for $1])
+fi
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
+dnl Utility macro used by next two tests.
+dnl AC_EXAMINE_OBJECT(C source code,
+dnl commands examining object file,
+dnl [commands to run if compile failed]):
+dnl
+dnl Compile the source code to an object file; then convert it into a
+dnl printable representation. All unprintable characters and
+dnl asterisks (*) are replaced by dots (.). All white space is
+dnl deleted. Newlines (ASCII 0x10) in the input are preserved in the
+dnl output, but runs of newlines are compressed to a single newline.
+dnl Finally, line breaks are forcibly inserted so that no line is
+dnl longer than 80 columns and the file ends with a newline. The
+dnl result of all this processing is in the file conftest.dmp, which
+dnl may be examined by the commands in the second argument.
+dnl
+AC_DEFUN([gcc_AC_EXAMINE_OBJECT],
+[AC_LANG_SAVE
+AC_LANG_C
+dnl Next bit cribbed from AC_TRY_COMPILE.
+cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+$1
+]EOF
+if AC_TRY_EVAL(ac_compile); then
+ od -c conftest.o |
+ sed ['s/^[0-7]*[ ]*/ /
+ s/\*/./g
+ s/ \\n/*/g
+ s/ [0-9][0-9][0-9]/./g
+ s/ \\[^ ]/./g'] |
+ tr -d '
+ ' | tr -s '*' '
+' | fold | sed '$a\
+' > conftest.dmp
+ $2
+ifelse($3, , , else
+ $3
+)dnl
+fi
+rm -rf conftest*
+AC_LANG_RESTORE])
+
+dnl Host endianness probe.
+dnl Differs from AC_C_BIGENDIAN in that it does not require
+dnl running a program on the host.
+dnl
+AC_DEFUN([fastjar_AC_COMPILE_C_BIGENDIAN],
+[AC_CACHE_CHECK(byte ordering, ac_cv_c_compile_endian,
+[ac_cv_c_compile_endian=unknown
+gcc_AC_EXAMINE_OBJECT([
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+/* This structure must have no internal padding. */
+ struct {
+ char prefix[sizeof "\nendian:" - 1];
+ short word;
+ char postfix[2];
+ } tester = {
+ "\nendian:",
+#if SIZEOF_SHORT == 4
+ ('A' << (CHAR_BIT * 3)) | ('B' << (CHAR_BIT * 2)) |
+#endif
+ ('A' << CHAR_BIT) | 'B',
+ 'X', '\n'
+};],
+ [if grep 'endian:AB' conftest.dmp >/dev/null 2>&1; then
+ ac_cv_c_compile_endian=big-endian
+ elif grep 'endian:BA' conftest.dmp >/dev/null 2>&1; then
+ ac_cv_c_compile_endian=little-endian
+ fi])
+])
+if test $ac_cv_c_compile_endian = unknown; then
+ AC_MSG_ERROR([*** unable to determine endianness])
+elif test $ac_cv_c_compile_endian = big-endian; then
+ AC_DEFINE(WORDS_BIG_ENDIAN, 1,
+ [Define if the host machine stores words of multi-word integers in
+ big-endian order.])
+fi
+])
+
+dnl Define MKDIR_TAKES_ONE_ARG if mkdir accepts only one argument instead
+dnl of the usual 2.
+AC_DEFUN(gcc_AC_FUNC_MKDIR_TAKES_ONE_ARG,
+[AC_CACHE_CHECK([if mkdir takes one argument], gcc_cv_mkdir_takes_one_arg,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_DIRECT_H
+# include <direct.h>
+#endif], [mkdir ("foo", 0);],
+ gcc_cv_mkdir_takes_one_arg=no, gcc_cv_mkdir_takes_one_arg=yes)])
+if test $gcc_cv_mkdir_takes_one_arg = yes ; then
+ AC_DEFINE(MKDIR_TAKES_ONE_ARG, 1, [Define if host mkdir takes a
+single argument.])
+fi
+])
diff --git a/fastjar/aclocal.m4 b/fastjar/aclocal.m4
index ed682bbd090..5a9b493923f 100644
--- a/fastjar/aclocal.m4
+++ b/fastjar/aclocal.m4
@@ -10,6 +10,140 @@ dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
dnl PARTICULAR PURPOSE.
+
+dnl Host type sizes probe.
+dnl By Kaveh R. Ghazi. One typo fixed since.
+dnl
+AC_DEFUN([gcc_AC_COMPILE_CHECK_SIZEOF],
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence.
+ AC_TRY_COMPILE([#include "confdefs.h"
+#include <sys/types.h>
+$2
+], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
+ if test x$AC_CV_NAME != x ; then break; fi
+done
+])
+if test x$AC_CV_NAME = x ; then
+ AC_MSG_ERROR([cannot determine a size for $1])
+fi
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
+dnl Utility macro used by next two tests.
+dnl AC_EXAMINE_OBJECT(C source code,
+dnl commands examining object file,
+dnl [commands to run if compile failed]):
+dnl
+dnl Compile the source code to an object file; then convert it into a
+dnl printable representation. All unprintable characters and
+dnl asterisks (*) are replaced by dots (.). All white space is
+dnl deleted. Newlines (ASCII 0x10) in the input are preserved in the
+dnl output, but runs of newlines are compressed to a single newline.
+dnl Finally, line breaks are forcibly inserted so that no line is
+dnl longer than 80 columns and the file ends with a newline. The
+dnl result of all this processing is in the file conftest.dmp, which
+dnl may be examined by the commands in the second argument.
+dnl
+AC_DEFUN([gcc_AC_EXAMINE_OBJECT],
+[AC_LANG_SAVE
+AC_LANG_C
+dnl Next bit cribbed from AC_TRY_COMPILE.
+cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+$1
+]EOF
+if AC_TRY_EVAL(ac_compile); then
+ od -c conftest.o |
+ sed ['s/^[0-7]*[ ]*/ /
+ s/\*/./g
+ s/ \\n/*/g
+ s/ [0-9][0-9][0-9]/./g
+ s/ \\[^ ]/./g'] |
+ tr -d '
+ ' | tr -s '*' '
+' | fold | sed '$a\
+' > conftest.dmp
+ $2
+ifelse($3, , , else
+ $3
+)dnl
+fi
+rm -rf conftest*
+AC_LANG_RESTORE])
+
+dnl Host endianness probe.
+dnl Differs from AC_C_BIGENDIAN in that it does not require
+dnl running a program on the host.
+dnl
+AC_DEFUN([fastjar_AC_COMPILE_C_BIGENDIAN],
+[AC_CACHE_CHECK(byte ordering, ac_cv_c_compile_endian,
+[ac_cv_c_compile_endian=unknown
+gcc_AC_EXAMINE_OBJECT([
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+/* This structure must have no internal padding. */
+ struct {
+ char prefix[sizeof "\nendian:" - 1];
+ short word;
+ char postfix[2];
+ } tester = {
+ "\nendian:",
+#if SIZEOF_SHORT == 4
+ ('A' << (CHAR_BIT * 3)) | ('B' << (CHAR_BIT * 2)) |
+#endif
+ ('A' << CHAR_BIT) | 'B',
+ 'X', '\n'
+};],
+ [if grep 'endian:AB' conftest.dmp >/dev/null 2>&1; then
+ ac_cv_c_compile_endian=big-endian
+ elif grep 'endian:BA' conftest.dmp >/dev/null 2>&1; then
+ ac_cv_c_compile_endian=little-endian
+ fi])
+])
+if test $ac_cv_c_compile_endian = unknown; then
+ AC_MSG_ERROR([*** unable to determine endianness])
+elif test $ac_cv_c_compile_endian = big-endian; then
+ AC_DEFINE(WORDS_BIG_ENDIAN, 1,
+ [Define if the host machine stores words of multi-word integers in
+ big-endian order.])
+fi
+])
+
+dnl Define MKDIR_TAKES_ONE_ARG if mkdir accepts only one argument instead
+dnl of the usual 2.
+AC_DEFUN(gcc_AC_FUNC_MKDIR_TAKES_ONE_ARG,
+[AC_CACHE_CHECK([if mkdir takes one argument], gcc_cv_mkdir_takes_one_arg,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_DIRECT_H
+# include <direct.h>
+#endif], [mkdir ("foo", 0);],
+ gcc_cv_mkdir_takes_one_arg=no, gcc_cv_mkdir_takes_one_arg=yes)])
+if test $gcc_cv_mkdir_takes_one_arg = yes ; then
+ AC_DEFINE(MKDIR_TAKES_ONE_ARG, 1, [Define if host mkdir takes a
+single argument.])
+fi
+])
+
# Do all the work for Automake. This macro actually does too much --
# some checks are only needed if your package does certain things.
# But this isn't really a big deal.
@@ -158,114 +292,3 @@ else
$1_FALSE=
fi])
-dnl Host type sizes probe.
-dnl By Kaveh R. Ghazi. One typo fixed since.
-dnl
-AC_DEFUN([gcc_AC_COMPILE_CHECK_SIZEOF],
-[changequote(<<, >>)dnl
-dnl The name to #define.
-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
-dnl The cache variable name.
-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
-changequote([, ])dnl
-AC_MSG_CHECKING(size of $1)
-AC_CACHE_VAL(AC_CV_NAME,
-[for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence.
- AC_TRY_COMPILE([#include "confdefs.h"
-#include <sys/types.h>
-$2
-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
- if test x$AC_CV_NAME != x ; then break; fi
-done
-])
-if test x$AC_CV_NAME = x ; then
- AC_MSG_ERROR([cannot determine a size for $1])
-fi
-AC_MSG_RESULT($AC_CV_NAME)
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
-undefine([AC_TYPE_NAME])dnl
-undefine([AC_CV_NAME])dnl
-])
-
-dnl Utility macro used by next two tests.
-dnl AC_EXAMINE_OBJECT(C source code,
-dnl commands examining object file,
-dnl [commands to run if compile failed]):
-dnl
-dnl Compile the source code to an object file; then convert it into a
-dnl printable representation. All unprintable characters and
-dnl asterisks (*) are replaced by dots (.). All white space is
-dnl deleted. Newlines (ASCII 0x10) in the input are preserved in the
-dnl output, but runs of newlines are compressed to a single newline.
-dnl Finally, line breaks are forcibly inserted so that no line is
-dnl longer than 80 columns and the file ends with a newline. The
-dnl result of all this processing is in the file conftest.dmp, which
-dnl may be examined by the commands in the second argument.
-dnl
-AC_DEFUN([gcc_AC_EXAMINE_OBJECT],
-[AC_LANG_SAVE
-AC_LANG_C
-dnl Next bit cribbed from AC_TRY_COMPILE.
-cat > conftest.$ac_ext <<EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-$1
-]EOF
-if AC_TRY_EVAL(ac_compile); then
- od -c conftest.o |
- sed ['s/^[0-7]*[ ]*/ /
- s/\*/./g
- s/ \\n/*/g
- s/ [0-9][0-9][0-9]/./g
- s/ \\[^ ]/./g'] |
- tr -d '
- ' | tr -s '*' '
-' | fold | sed '$a\
-' > conftest.dmp
- $2
-ifelse($3, , , else
- $3
-)dnl
-fi
-rm -rf conftest*
-AC_LANG_RESTORE])
-
-dnl Host endianness probe.
-dnl Differs from AC_C_BIGENDIAN in that it does not require
-dnl running a program on the host.
-dnl
-AC_DEFUN([fastjar_AC_COMPILE_C_BIGENDIAN],
-[AC_CACHE_CHECK(byte ordering, ac_cv_c_compile_endian,
-[ac_cv_c_compile_endian=unknown
-gcc_AC_EXAMINE_OBJECT([
-#ifdef HAVE_LIMITS_H
-# include <limits.h>
-#endif
-/* This structure must have no internal padding. */
- struct {
- char prefix[sizeof "\nendian:" - 1];
- short word;
- char postfix[2];
- } tester = {
- "\nendian:",
-#if SIZEOF_SHORT == 4
- ('A' << (CHAR_BIT * 3)) | ('B' << (CHAR_BIT * 2)) |
-#endif
- ('A' << CHAR_BIT) | 'B',
- 'X', '\n'
-};],
- [if grep 'endian:AB' conftest.dmp >/dev/null 2>&1; then
- ac_cv_c_compile_endian=big-endian
- elif grep 'endian:BA' conftest.dmp >/dev/null 2>&1; then
- ac_cv_c_compile_endian=little-endian
- fi])
-])
-if test $ac_cv_c_compile_endian = unknown; then
- AC_MSG_ERROR([*** unable to determine endianness])
-elif test $ac_cv_c_compile_endian = big-endian; then
- AC_DEFINE(WORDS_BIG_ENDIAN, 1,
- [Define if the host machine stores words of multi-word integers in
- big-endian order.])
-fi
-])
-
diff --git a/fastjar/config.h.in b/fastjar/config.h.in
index d1c71b04cdc..ae4fb96c5cb 100644
--- a/fastjar/config.h.in
+++ b/fastjar/config.h.in
@@ -9,25 +9,6 @@
/* Define if your <sys/time.h> declares struct tm. */
#undef TM_IN_SYS_TIME
-/* Define if your processor stores words with the most significant
- byte first (like Motorola and SPARC, unlike Intel and VAX). */
-#undef WORDS_BIGENDIAN
-
-/* The number of bytes in a char. */
-#undef SIZEOF_CHAR
-
-/* The number of bytes in a int. */
-#undef SIZEOF_INT
-
-/* The number of bytes in a long. */
-#undef SIZEOF_LONG
-
-/* The number of bytes in a long long. */
-#undef SIZEOF_LONG_LONG
-
-/* The number of bytes in a short. */
-#undef SIZEOF_SHORT
-
/* Define if you have the <dirent.h> header file. */
#undef HAVE_DIRENT_H
@@ -58,3 +39,26 @@
/* Version number of package */
#undef VERSION
+/* Define if host mkdir takes a
+single argument. */
+#undef MKDIR_TAKES_ONE_ARG
+
+/* The number of bytes in type char */
+#undef SIZEOF_CHAR
+
+/* The number of bytes in type short */
+#undef SIZEOF_SHORT
+
+/* The number of bytes in type int */
+#undef SIZEOF_INT
+
+/* The number of bytes in type long */
+#undef SIZEOF_LONG
+
+/* The number of bytes in type long long */
+#undef SIZEOF_LONG_LONG
+
+/* Define if the host machine stores words of multi-word integers in
+ big-endian order. */
+#undef WORDS_BIG_ENDIAN
+
diff --git a/fastjar/configure b/fastjar/configure
index f96a4ddd622..719d3e32b05 100755
--- a/fastjar/configure
+++ b/fastjar/configure
@@ -33,6 +33,7 @@ program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
+sitefile=
srcdir=
target=NONE
verbose=
@@ -147,6 +148,7 @@ Configuration:
--help print this message
--no-create do not create output files
--quiet, --silent do not print \`checking...' messages
+ --site-file=FILE use FILE as the site file
--version print the version of autoconf that created configure
Directory and file names:
--prefix=PREFIX install architecture-independent files in PREFIX
@@ -317,6 +319,11 @@ EOF
-site=* | --site=* | --sit=*)
site="$ac_optarg" ;;
+ -site-file | --site-file | --site-fil | --site-fi | --site-f)
+ ac_prev=sitefile ;;
+ -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+ sitefile="$ac_optarg" ;;
+
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
@@ -482,12 +489,16 @@ fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
- if test "x$prefix" != xNONE; then
- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
- else
- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+if test -z "$sitefile"; then
+ if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
fi
+else
+ CONFIG_SITE="$sitefile"
fi
for ac_site_file in $CONFIG_SITE; do
if test -r "$ac_site_file"; then
@@ -557,7 +568,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:561: checking for a BSD compatible install" >&5
+echo "configure:572: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -610,7 +621,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:614: checking whether build environment is sane" >&5
+echo "configure:625: checking whether build environment is sane" >&5
# Just in case
sleep 1
echo timestamp > conftestfile
@@ -667,7 +678,7 @@ test "$program_suffix" != NONE &&
test "$program_transform_name" = "" && program_transform_name="s,x,x,"
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:671: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:682: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -713,7 +724,7 @@ EOF
missing_dir=`cd $ac_aux_dir && pwd`
echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:717: checking for working aclocal" >&5
+echo "configure:728: checking for working aclocal" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -726,7 +737,7 @@ else
fi
echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:730: checking for working autoconf" >&5
+echo "configure:741: checking for working autoconf" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -739,7 +750,7 @@ else
fi
echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:743: checking for working automake" >&5
+echo "configure:754: checking for working automake" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -752,7 +763,7 @@ else
fi
echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:756: checking for working autoheader" >&5
+echo "configure:767: checking for working autoheader" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -765,7 +776,7 @@ else
fi
echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:769: checking for working makeinfo" >&5
+echo "configure:780: checking for working makeinfo" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -785,7 +796,7 @@ fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:789: checking for $ac_word" >&5
+echo "configure:800: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -815,7 +826,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:819: checking for $ac_word" >&5
+echo "configure:830: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -866,7 +877,7 @@ fi
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:870: checking for $ac_word" >&5
+echo "configure:881: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -898,7 +909,7 @@ fi
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:902: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:913: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -909,12 +920,12 @@ cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF
-#line 913 "configure"
+#line 924 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:918: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:929: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
@@ -940,12 +951,12 @@ if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:944: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:955: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:949: checking whether we are using GNU C" >&5
+echo "configure:960: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -954,7 +965,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:958: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:969: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -973,7 +984,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:977: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:988: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1016,7 +1027,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1020: checking for a BSD compatible install" >&5
+echo "configure:1031: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1071,7 +1082,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
# Extract the first word of "rm", so it can be a program name with args.
set dummy rm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1075: checking for $ac_word" >&5
+echo "configure:1086: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1107,7 +1118,7 @@ fi
# Extract the first word of "cp", so it can be a program name with args.
set dummy cp; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1111: checking for $ac_word" >&5
+echo "configure:1122: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_CP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1143,7 +1154,7 @@ fi
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1147: checking for $ac_word" >&5
+echo "configure:1158: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_STRIP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1179,7 +1190,7 @@ fi
# Extract the first word of "chmod", so it can be a program name with args.
set dummy chmod; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1183: checking for $ac_word" >&5
+echo "configure:1194: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_CHMOD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1213,12 +1224,12 @@ else
fi
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:1217: checking for Cygwin environment" >&5
+echo "configure:1228: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1222 "configure"
+#line 1233 "configure"
#include "confdefs.h"
int main() {
@@ -1229,7 +1240,7 @@ int main() {
return __CYGWIN__;
; return 0; }
EOF
-if { (eval echo configure:1233: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1244: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cygwin=yes
else
@@ -1246,19 +1257,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes
echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:1250: checking for mingw32 environment" >&5
+echo "configure:1261: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1255 "configure"
+#line 1266 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
-if { (eval echo configure:1262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1273: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_mingw32=yes
else
@@ -1277,7 +1288,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=yes
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1281: checking for executable suffix" >&5
+echo "configure:1292: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1287,10 +1298,10 @@ else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
- if { (eval echo configure:1291: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ if { (eval echo configure:1302: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
- *.c | *.o | *.obj) ;;
+ *.c | *.o | *.obj | *.ilk | *.pdb) ;;
*) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
esac
done
@@ -1309,7 +1320,7 @@ ac_exeext=$EXEEXT
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:1313: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:1324: checking whether to enable maintainer-specific portions of Makefiles" >&5
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
@@ -1342,12 +1353,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:1346: checking for $ac_hdr that defines DIR" >&5
+echo "configure:1357: checking for $ac_hdr that defines DIR" >&5
if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1351 "configure"
+#line 1362 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>
@@ -1355,7 +1366,7 @@ int main() {
DIR *dirp = 0;
; return 0; }
EOF
-if { (eval echo configure:1359: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1370: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_header_dirent_$ac_safe=yes"
else
@@ -1380,7 +1391,7 @@ done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:1384: checking for opendir in -ldir" >&5
+echo "configure:1395: checking for opendir in -ldir" >&5
ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1388,7 +1399,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldir $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1392 "configure"
+#line 1403 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1399,7 +1410,7 @@ int main() {
opendir()
; return 0; }
EOF
-if { (eval echo configure:1403: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1414: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1421,7 +1432,7 @@ fi
else
echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:1425: checking for opendir in -lx" >&5
+echo "configure:1436: checking for opendir in -lx" >&5
ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1429,7 +1440,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lx $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1433 "configure"
+#line 1444 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1440,7 +1451,7 @@ int main() {
opendir()
; return 0; }
EOF
-if { (eval echo configure:1444: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1463,7 +1474,7 @@ fi
fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1467: checking how to run the C preprocessor" >&5
+echo "configure:1478: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -1478,13 +1489,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1482 "configure"
+#line 1493 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1499: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1495,13 +1506,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1499 "configure"
+#line 1510 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1505: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1516: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1512,13 +1523,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1516 "configure"
+#line 1527 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1522: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1543,12 +1554,12 @@ fi
echo "$ac_t""$CPP" 1>&6
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1547: checking for ANSI C header files" >&5
+echo "configure:1558: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1552 "configure"
+#line 1563 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -1556,7 +1567,7 @@ else
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1560: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1571: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -1573,7 +1584,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 1577 "configure"
+#line 1588 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@@ -1591,7 +1602,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 1595 "configure"
+#line 1606 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@@ -1612,7 +1623,7 @@ if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
-#line 1616 "configure"
+#line 1627 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1623,7 +1634,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
-if { (eval echo configure:1627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
@@ -1647,12 +1658,12 @@ EOF
fi
echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:1651: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:1662: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1656 "configure"
+#line 1667 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
@@ -1660,7 +1671,7 @@ int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
-if { (eval echo configure:1664: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1675: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm=time.h
else
@@ -1684,17 +1695,17 @@ for ac_hdr in fcntl.h unistd.h sys/param.h stdlib.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1688: checking for $ac_hdr" >&5
+echo "configure:1699: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1693 "configure"
+#line 1704 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1698: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1709: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -1722,12 +1733,12 @@ done
echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:1726: checking for off_t" >&5
+echo "configure:1737: checking for off_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1731 "configure"
+#line 1742 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -1755,12 +1766,12 @@ EOF
fi
echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:1759: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:1770: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1764 "configure"
+#line 1775 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
@@ -1768,7 +1779,7 @@ int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
-if { (eval echo configure:1772: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1783: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm=time.h
else
@@ -1789,14 +1800,59 @@ EOF
fi
+# mkdir takes a single argument on some systems.
+echo $ac_n "checking if mkdir takes one argument""... $ac_c" 1>&6
+echo "configure:1806: checking if mkdir takes one argument" >&5
+if eval "test \"`echo '$''{'gcc_cv_mkdir_takes_one_arg'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1811 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_DIRECT_H
+# include <direct.h>
+#endif
+int main() {
+mkdir ("foo", 0);
+; return 0; }
+EOF
+if { (eval echo configure:1828: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ gcc_cv_mkdir_takes_one_arg=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ gcc_cv_mkdir_takes_one_arg=yes
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gcc_cv_mkdir_takes_one_arg" 1>&6
+if test $gcc_cv_mkdir_takes_one_arg = yes ; then
+ cat >> confdefs.h <<\EOF
+#define MKDIR_TAKES_ONE_ARG 1
+EOF
+
+fi
+
+
echo $ac_n "checking size of char""... $ac_c" 1>&6
-echo "configure:1794: checking size of char" >&5
+echo "configure:1850: checking size of char" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_char'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1800 "configure"
+#line 1856 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1806,7 +1862,7 @@ int main() {
switch (0) case 0: case (sizeof (char) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1866: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_char=$ac_size
else
@@ -1829,13 +1885,13 @@ EOF
echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:1833: checking size of short" >&5
+echo "configure:1889: checking size of short" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1839 "configure"
+#line 1895 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1845,7 +1901,7 @@ int main() {
switch (0) case 0: case (sizeof (short) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1849: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1905: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_short=$ac_size
else
@@ -1868,13 +1924,13 @@ EOF
echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:1872: checking size of int" >&5
+echo "configure:1928: checking size of int" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1878 "configure"
+#line 1934 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1884,7 +1940,7 @@ int main() {
switch (0) case 0: case (sizeof (int) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1888: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1944: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_int=$ac_size
else
@@ -1907,13 +1963,13 @@ EOF
echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:1911: checking size of long" >&5
+echo "configure:1967: checking size of long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1917 "configure"
+#line 1973 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1923,7 +1979,7 @@ int main() {
switch (0) case 0: case (sizeof (long) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1927: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1983: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long=$ac_size
else
@@ -1946,13 +2002,13 @@ EOF
echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:1950: checking size of long long" >&5
+echo "configure:2006: checking size of long long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1956 "configure"
+#line 2012 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1962,7 +2018,7 @@ int main() {
switch (0) case 0: case (sizeof (long long) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1966: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2022: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long_long=$ac_size
else
@@ -1986,7 +2042,7 @@ EOF
echo $ac_n "checking byte ordering""... $ac_c" 1>&6
-echo "configure:1990: checking byte ordering" >&5
+echo "configure:2046: checking byte ordering" >&5
if eval "test \"`echo '$''{'ac_cv_c_compile_endian'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2000,7 +2056,7 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
-#line 2004 "configure"
+#line 2060 "configure"
#include "confdefs.h"
#ifdef HAVE_LIMITS_H
@@ -2020,7 +2076,7 @@ cat > conftest.$ac_ext <<EOF
'X', '\n'
};
EOF
-if { (eval echo configure:2024: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
od -c conftest.o |
sed 's/^[0-7]*[ ]*/ /
s/\*/./g
@@ -2072,7 +2128,7 @@ ZINCS=
use_zlib=maybe
if test "$with_system_zlib" = yes; then
echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6
-echo "configure:2076: checking for deflate in -lz" >&5
+echo "configure:2132: checking for deflate in -lz" >&5
ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2080,7 +2136,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lz $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2084 "configure"
+#line 2140 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -2091,7 +2147,7 @@ int main() {
deflate()
; return 0; }
EOF
-if { (eval echo configure:2095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2126,6 +2182,16 @@ fi
+# Get the version trigger filename from the toplevel
+if test "${with_gcc_version_trigger+set}" = set; then
+ gcc_version_trigger=$with_gcc_version_trigger
+else
+ gcc_version_trigger=${srcdir}/version.c
+fi
+gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*"\([^"]*\)".*/\1/'`
+gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
+
+
trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
@@ -2284,6 +2350,7 @@ s%@CPP@%$CPP%g
s%@ZLIBS@%$ZLIBS%g
s%@ZDEPS@%$ZDEPS%g
s%@ZINCS@%$ZINCS%g
+s%@gcc_version@%$gcc_version%g
CEOF
EOF
@@ -2292,7 +2359,7 @@ cat >> $CONFIG_STATUS <<\EOF
# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_max_sed_cmds=60 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
diff --git a/fastjar/configure.in b/fastjar/configure.in
index b27a8665aeb..c2e686e0f8c 100644
--- a/fastjar/configure.in
+++ b/fastjar/configure.in
@@ -30,6 +30,9 @@ dnl Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_OFF_T
AC_STRUCT_TM
+# mkdir takes a single argument on some systems.
+gcc_AC_FUNC_MKDIR_TAKES_ONE_ARG
+
dnl Check for type-widths
gcc_AC_COMPILE_CHECK_SIZEOF(char)
gcc_AC_COMPILE_CHECK_SIZEOF(short)
@@ -63,4 +66,16 @@ AC_SUBST(ZLIBS)
AC_SUBST(ZDEPS)
AC_SUBST(ZINCS)
+# Get the version trigger filename from the toplevel
+if test "${with_gcc_version_trigger+set}" = set; then
+ gcc_version_trigger=$with_gcc_version_trigger
+else
+ gcc_version_trigger=${srcdir}/version.c
+fi
+changequote(,)dnl
+gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*"\([^"]*\)".*/\1/'`
+gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
+changequote([,])dnl
+AC_SUBST(gcc_version)
+
AC_OUTPUT(Makefile install-defs.sh)
diff --git a/fastjar/fastjar.texi b/fastjar/fastjar.texi
new file mode 100644
index 00000000000..7942accc3b6
--- /dev/null
+++ b/fastjar/fastjar.texi
@@ -0,0 +1,262 @@
+@\input texinfo @c -*-texinfo-*-
+@setfilename fastjar.info
+@settitle Guide to GNU jar utilites
+
+@c Note: When reading this manual you'll find lots of strange
+@c circumlocutions like ``compiler for the Java language''.
+@c This is necessary due to Sun's restrictions on the use of
+@c the word ``Java'.
+
+@c When this manual is copyrighted.
+@set copyrights-fastjar 2002
+
+@include gcc-common.texi
+
+@c Versions
+@set which-gcj GCC-@value{version-GCC}
+
+@ifinfo
+@format
+@dircategory Programming
+@direntry
+* fastjar: (fastjar). GNU jar utilities
+@end direntry
+
+@dircategory Individual utilities
+@direntry
+* jar: Invoking jar.
+ An archive tool for Java archives
+* grepjar: Invoking grepjar.
+ Search files in a jar file for a pattern
+@end direntry
+@end format
+
+@c man begin COPYRIGHT
+Copyright (C) @value{copyrights-fastjar} Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', the Front-Cover
+texts being (a) (see below), and with the Back-Cover Texts being (b)
+(see below). A copy of the license is included in the
+@c man end
+section entitled
+``GNU Free Documentation License''.
+@ignore
+@c man begin COPYRIGHT
+man page gfdl(7).
+@c man end
+@end ignore
+
+(a) The FSF's Front-Cover Text is:
+
+ A GNU Manual
+
+(b) The FSF's Back-Cover Text is:
+
+ You have freedom to copy and modify this GNU Manual, like GNU
+ software. Copies published by the Free Software Foundation raise
+ funds for GNU development.
+@end ifinfo
+
+@titlepage
+@title GNU jar utilites
+@author Brian Burns
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} @value{copyrights-gcj} Free Software Foundation, Inc.
+@sp 2
+For the @value{which-gcj} Version*
+@sp 1
+Published by the Free Software Foundation @*
+59 Temple Place - Suite 330@*
+Boston, MA 02111-1307, USA@*
+@sp 1
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', the Front-Cover
+texts being (a) (see below), and with the Back-Cover Texts being (b)
+(see below). A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+(a) The FSF's Front-Cover Text is:
+
+ A GNU Manual
+
+(b) The FSF's Back-Cover Text is:
+
+ You have freedom to copy and modify this GNU Manual, like GNU
+ software. Copies published by the Free Software Foundation raise
+ funds for GNU development.
+@end titlepage
+@contents
+@page
+
+
+@node Top
+@top Introduction
+
+This manual describes how to use @command{jar} and @command{grepjar}.
+
+@menu
+* Invoking jar:: Options supported by @command{jar}
+* Invoking grepjar:: Options supported by @command{grepjar}
+* Copying:: The GNU General Public License
+* GNU Free Documentation License::
+ How you can share and copy this manual
+@end menu
+
+@node Invoking jar
+@chapter Invoking jar
+
+@c man title jar archive tool for Java archives
+
+@c man begin DESCRIPTION jar
+
+@code{fastjar} is an implementation of Sun's jar utility that comes with
+the JDK, written entirely in C, and runs in a fraction of the time while
+being feature compatible.
+
+If any file is a directory then it is processed recursively. The
+manifest file name and the archive file name needs to be specified in
+the same order the @option{-m} and @option{-f} flags are specified.
+
+@c man end
+
+@ignore
+@c man begin SYNOPSIS jar
+jar @option{-ctxu} [@option{OPTIONS}] [@var{jar-file}] [@var{manifest-file}] [@option{-C} @var{dir}] @var{files}@dots{}
+@c man end
+@c man begin SEEALSO jar
+gcj(1), gij(1), grepjar(1)
+and the Info entry for @file{gcj}.
+@c man end
+@end ignore
+
+@c man begin OPTIONS jar
+
+Exactly one of the following actions must be specified:
+
+@table @gcctabopt
+
+@item -c
+Create new archive.
+
+@item -t
+List table of contents for archive.
+
+@item -x
+Extract named (or all) files from archive.
+
+@item -u
+Update existing archive. This option is disabled due to bugs (currently
+fails with exit status 1 and does nothing).
+
+@end table
+
+The following parameters are optional:
+
+@table @gcctabopt
+
+@item -@@
+Read the names of the files to add to the archive from stdin. This
+option is supported only in combination with @option{-c} or @option{-u}.
+Non standard option added in the GCC version.
+
+@item -C @var{directory}
+Change to the @var{directory} and include the following file.
+
+@item -E
+Prevent fastjar from reading the content of a directory when specifying
+one (and instead relying on the provided list of files to populate the
+archive with regard to the directory entry). Non standard option added
+in the GCC version.
+
+@item -M
+Do not create a manifest file for the entries.
+
+@item -0
+Store only; use no ZIP compression.
+
+@item -V
+@itemx --version
+Display version information.
+
+@item -f @var{archive}
+Specify archive file name.
+
+@item -m @var{manifest}
+Include manifest information from specified @var{manifest} file.
+
+@item -v
+Generate verbose output on standard output.
+
+@end table
+
+All remaining options are considered to be names of files.
+
+@c man end
+
+@node Invoking grepjar
+@chapter Invoking grepjar
+
+@c man title grepjar search files in a jar file for a pattern
+
+@c man begin DESCRIPTION grepjar
+
+The @code{grepjar} program can be used to search files in a jar file for
+a pattern.
+
+@c man end
+
+@ignore
+@c man begin SYNOPSIS grepjar
+grepjar [@option{-bcinsw}] @option{-e} @var{PATTERN} | @var{PATTERN} @var{files}@dots{}
+@c man end
+@c man begin SEEALSO grepjar
+jar(1), gcj(1), gij(1), gfdl(7) and the Info entry for @file{gcj}.
+@c man end
+@end ignore
+
+@c man begin OPTIONS grepjar
+
+@table @gcctabopt
+@item -b
+Print byte offset of match.
+
+@item -c
+Print number of matches.
+
+@item -i
+Compare case-insensitively.
+
+@item -n
+Print line number of each match.
+
+@item -s
+Suppress error messages.
+
+@item -w
+Force @var{PATTERN} to match only whole words.
+
+@item -e @var{PATTERN}
+Use @var{PATTERN} as regular expression.
+
+@item --help
+Print help, then exit.
+
+@item -V
+@itemx --version
+Print version number, then exit.
+@end table
+
+@c man end
+
+@include gpl.texi
+
+@include fdl.texi
+
+@bye
diff --git a/fastjar/jargrep.c b/fastjar/jargrep.c
index 4c934a30403..01c04500c5b 100644
--- a/fastjar/jargrep.c
+++ b/fastjar/jargrep.c
@@ -126,7 +126,7 @@ will test some other platforms later.
void version(void);
void help(const char *name);
-#define Usage "Usage: %s [-bcinsw] <-e PATTERN | PATTERN> FILE ...\n"
+#define Usage "Usage: %s [-bcinsVw] [--version|--help] <-e PATTERN | PATTERN> FILE ...\n"
/*
Function name: opt_valid
@@ -373,7 +373,6 @@ returns: TRUE if it is a word, FALSE of it is a substring.
static int chk_wrd(regex_t *exp, const char *str) {
int wrd_fnd = FALSE;
- int regflag;
int frnt_ok;
int bck_ok;
const char *str2;
@@ -381,7 +380,7 @@ static int chk_wrd(regex_t *exp, const char *str) {
str2 = str;
frnt_ok = bck_ok = FALSE;
- while(!wrd_fnd && !(regflag = regexec(exp, str2, 1, &match, 0))) {
+ while(!wrd_fnd && !regexec(exp, str2, 1, &match, 0)) {
if(!match.rm_so && (str2 == str)) frnt_ok = TRUE;
else if(!isalnum((unsigned char)str2[match.rm_so - 1])
&& str2[match.rm_so - 1] != '_')
@@ -769,7 +768,9 @@ Search files in a jar file for a pattern.\n\
-n print line number of each match\n\
-s suppress error messages\n\
-w force PATTERN to match only whole words\n\
- -e PATTERN use PATTERN as regular exprssion\n\
+ -e PATTERN use PATTERN as regular expression\n\
+ -V|--version print version number and exit\n\
+ --help print help\n\
");
exit (0);
diff --git a/fastjar/jartool.c b/fastjar/jartool.c
index 2436606d502..dc247ad77cb 100644
--- a/fastjar/jartool.c
+++ b/fastjar/jartool.c
@@ -239,6 +239,12 @@
#include "pushback.h"
#include "compress.h"
+/* Some systems have mkdir that takes a single argument. */
+#ifdef MKDIR_TAKES_ONE_ARG
+# define mkdir(a,b) mkdir(a)
+#endif
+
+
#ifdef WORDS_BIGENDIAN
#define L2BI(l) ((l & 0xff000000) >> 24) | \
@@ -321,7 +327,6 @@ int main(int argc, char **argv){
int manifest = TRUE;
int opt;
- int j;
int jarfd = -1;
/* These are used to collect file names and `-C' options for the
@@ -339,8 +344,6 @@ int main(int argc, char **argv){
if(argc < 2)
usage(argv[0]);
- j = strlen(argv[1]);
-
new_argc = 0;
new_argv = (char **) malloc (argc * sizeof (char *));
@@ -433,8 +436,7 @@ int main(int argc, char **argv){
/* create the jarfile */
if(action == ACTION_CREATE){
if(jarfile){
- jarfd = open(jarfile, O_CREAT | O_BINARY | O_WRONLY | O_TRUNC,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ jarfd = open(jarfile, O_CREAT | O_BINARY | O_WRONLY | O_TRUNC, 0666);
if(jarfd < 0){
fprintf(stderr, "Error opening %s for writing!\n", jarfile);
@@ -1115,13 +1117,10 @@ int create_central_header(int fd){
ub1 end_header[22];
int start_offset;
int dir_size;
- int *iheader;
int total_in = 0, total_out = 22;
zipentry *ze;
- iheader = (int*)header;
-
/* magic number */
header[0] = 'P';
header[1] = 'K';
@@ -1544,7 +1543,6 @@ int extract_jar(int fd, char **files, int file_num){
}
int list_jar(int fd, char **files, int file_num){
- int rdamt;
ub4 signature;
ub4 csize;
ub4 usize;
@@ -1657,7 +1655,7 @@ int list_jar(int fd, char **files, int file_num){
strftime(ascii_date, 30, "%a %b %d %H:%M:%S %Z %Y", s_tm);
}
- if(filename_len < fnlen){
+ if(filename_len < fnlen + 1){
if(filename != NULL)
free(filename);
@@ -1706,7 +1704,7 @@ int list_jar(int fd, char **files, int file_num){
init_inflation();
for(;;){
- if((rdamt = pb_read(&pbf, scratch, 4)) != 4){
+ if(pb_read(&pbf, scratch, 4) != 4){
perror("read");
break;
}
@@ -1735,7 +1733,7 @@ int list_jar(int fd, char **files, int file_num){
break;
}
- if((rdamt = pb_read(&pbf, (file_header + 4), 26)) != 26){
+ if(pb_read(&pbf, (file_header + 4), 26) != 26){
perror("read");
break;
}
@@ -1776,7 +1774,7 @@ int list_jar(int fd, char **files, int file_num){
strftime(ascii_date, 30, "%a %b %d %H:%M:%S %Z %Y", s_tm);
}
- if(filename_len < fnlen){
+ if(filename_len < fnlen + 1){
if(filename != NULL)
free(filename);
diff --git a/gcc/ABOUT-GCC-NLS b/gcc/ABOUT-GCC-NLS
index e6e15271c6a..b0919d1b2ac 100644
--- a/gcc/ABOUT-GCC-NLS
+++ b/gcc/ABOUT-GCC-NLS
@@ -5,19 +5,16 @@ Some work remains in other areas; for example, GCC does not yet allow
non-ASCII letters in identifiers.
Not all of GCC's diagnostic messages have been internationalized. Programs
-like `enquire' and `genattr' (in fact all gen* programs) are not
-internationalized, as their users are GCC maintainers who typically need
-to be able to read English anyway; internationalizing them would thus
-entail needless work for the human translators. Messages used for
-debugging, such as used in dumped tables, should also not be translated.
+like `genattr' (in fact all gen* programs) are not internationalized, as
+their users are GCC maintainers who typically need to be able to read
+English anyway; internationalizing them would thus entail needless work for
+the human translators. Messages used for debugging, such as used in dumped
+tables, should also not be translated.
The GCC library should not contain any messages that need
internationalization, because it operates below the internationalization
library.
-Currently, the only language translation supplied is en_UK (British
-English).
-
Unlike some other GNU programs, the GCC sources contain few instances
of explicit translation calls like _("string"). Instead, the
diagnostic printing routines automatically translate their arguments.
diff --git a/gcc/ABOUT-NLS b/gcc/ABOUT-NLS
index 5fde45a0b5a..f76b5d7b004 100644
--- a/gcc/ABOUT-NLS
+++ b/gcc/ABOUT-NLS
@@ -60,7 +60,7 @@ library will be used. This library is wholly contained within this
package, usually in the `intl/' subdirectory, so prior installation of
the GNU `gettext' package is _not_ required. Installers may use
special options at configuration time for changing the default
-behaviour. The commands:
+behavior. The commands:
./configure --with-included-gettext
./configure --disable-nls
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b27072afe79..3a2b9f25b1b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,5248 @@
+Wed Oct 23 12:42:32 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (movti_rex64): Fix constraints.
+
+Wed Oct 23 12:01:21 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (abssf,absdf): Use vector operands for SSE
+ (abssf2_ifs, absdf2_ifs, absdf2_ifs_rex64 and splitters): Update for
+ vector operand.
+
+2002-10-21 Richard Henderson <rth@redhat.com>
+
+ * config/i386/i386.c (ix86_function_ok_for_sibcall): Look at
+ the function type, not the return type.
+
+2002-10-20 Zack Weinberg <zack@codesourcery.com>
+
+ * config/i386/i386.c (ix86_function_ok_for_sibcall): Fix an
+ inverted test in the conditional determining the possibility
+ of sibcalls in PIC mode.
+
+2002-10-20 Richard Henderson <rth@redhat.com>
+
+ * target.h (struct gcc_target): Line wrap.
+
+ * config/alpha/alpha.c (alpha_output_mi_thunk_osf): Static.
+ (TARGET_ASM_OUTPUT_MI_THUNK): Define here...
+ * config/alpha/alpha.h: ... not here.
+ * config/alpha/alpha-protos.h: Update.
+
+ * config/arm/arm.c, config/arm/arm.h, config/arm/arm-protos.h
+ config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.h,
+ config/frv/frv-protos.h, config/frv/frv.c, config/frv/frv.h,
+ config/i386/i386-protos.h, config/i386/i386.c, config/i386/openbsd.h,
+ config/i386/unix.h, config/i960/i960-protos.h, config/i960/i960.c,
+ config/i960/i960.h, config/ia64/ia64-protos.h, config/ia64/ia64.c,
+ config/ia64/ia64.h, config/m68k/linux.h, config/m68k/m68k-protos.h,
+ config/m68k/m68k.c, config/m68k/netbsd-elf.h, config/m68k/openbsd.h,
+ config/mmix/mmix-protos.h, config/mmix/mmix.c, config/mmix/mmix.h,
+ config/pa/pa-protos.h, config/pa/pa.c, config/pa/pa.h,
+ config/s390/s390-protos.h, config/s390/s390.c, config/s390/s390.h,
+ config/sparc/openbsd.h, config/sparc/sparc-protos.h,
+ config/sparc/sparc.c, config/sparc/sparc.h,
+ config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c,
+ config/stormy16/stormy16.h: Similarly.
+
+ * config/m68k/m68k.c (m68k_output_mi_thunk): Replicate mnemonic
+ selection logic from call patterns.
+
+2002-10-20 Mark Mitchell <mark@codesourcery.com>
+
+ * config/m68k/m68k.c (m68k_output_mi_thunk): Fix typo.
+
+2002-10-20 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
+ PR other/8202
+ * i386.c (ix86_init_mmx_sse_builtins, ix86_expand_builtin): Define and
+ expand __builtin_ia32_pslldqi128 and __builtin_ia32_psrldqi128.
+ * i386.h (IX86_BUILTIN_PSLLDQI128, IX86_BUILTIN_PSRLDQI128): New.
+ * xmmintrin.h (_mm_srli_si128, _mm_slli_si128): New.
+
+2002-10-20 Roger Sayle <roger@eyesopen.com>
+
+ PR c/761
+ * toplev.c (flag_unsafe_profile_arcs): Remove.
+ (flag_bounded_pointers): Remove.
+ (flag_bounds_check): Correct comments.
+ (lang_independent_options): Remove -funsafe-profile-arcs and
+ -fbounded-pointers. Correct -fbounds-check comments.
+
+ * flags.h: Correct flag_schedule_interblock comments.
+ (flag_bounded_pointers): Remove prototype.
+ (flag_bounds_check): Correct comments.
+
+ * c-opts.c (c_common_init_options): No need to mark
+ flag_bounds_check as unspecified.
+ (c_common_post_options): And no need to set it from
+ flag_bounded_pointers if its still unspecified.
+
+ * doc/invoke.texi: Fix some overfull hboxes in "make dvi".
+ Document --version, -feliminate-dwarf-2-dups, -fno-sched-interblock,
+ -fno-sched-spec, -fsched-spec-load, -fsched-spec-load-dangerous,
+ -fsched-verbose=n, -fno-branch-count-reg and -fbounds-check.
+
+Sat Oct 19 22:02:28 2002 Alexandre Oliva <aoliva@redhat.com>
+ Angela Marie Thomas <angela@releasedominatrix.com>
+ Brendan Kehoe <brendan@zen.org>
+ Nick Clifton <nickc@redhat.com>
+ Andrew Haley <aph@redhat.com>
+
+ * configure.in (--with-sysroot): New. Don't inhibit libc if
+ given. AC_SUBST TARGET_SYSTEM_ROOT, TARGET_SYSTEM_ROOT_DEFINE
+ and CROSS_SYSTEM_HEADER_DIR.
+ * configure: Rebuilt.
+ * Makefile.in (CROSS_SYSTEM_HEADER_DIR): Set in configure.
+ (TARGET_SYSTEM_ROOT): New.
+ (DRIVER_DEFINES): Define CROSS_INCLUDE_DIR from
+ CROSS_SYSTEM_HEADER_DIR.
+ (install-gcc-tooldir): New target.
+ (stmp-fixinc): Do not create $(libsubdir), but rather bail out
+ if SYSTEM_HEADER_DIR does not exist and it's not the default
+ sys-include directory.
+ (deduced.h, stmp-fixproto): Quote SYSTEM_HEADER_DIR properly.
+ (install-mkheaders): Likewise.
+ * gcc.c (target_system_root): New variable.
+ (add_sysrooted_prefix): New function.
+ (process_command): Recompute run-time target_system_root from
+ gcc_exec_prefix, keeping it unchanged if the relocated sysroot
+ does not exist.
+ (do_spec_1): Process 'R' spec.
+ (main): Add md_exec_prefix to exec_prefixes regardless of
+ startfile_prefix_spec. Use add_sysrooted_prefix for
+ startfile_prefixes, and don't skip the default ones when cross
+ compiling with sysroot enabled. Removed unused case of
+ non-absolute standard_startfile_prefix.
+ * config/interix.h: Remove the only potential, yet disabled,
+ occurrence of non-absolute (empty) standard_startfile_prefix.
+ * config/sh/linux.h (LIB_SPEC): Add -rpath-link in non-static
+ linking.
+ * config/mips/linux.h (LIB_SPEC): Define as in sh/linux.h.
+ * doc/install.texi (--with-sysroot): Document.
+ (--with-headers, --with-libs): Deprecate.
+
+2002-10-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+ Mark Mitchell <mark@codesourcery.com>
+
+ * alpha-protos.h (alpha_output_mi_thunk_osf): Update signature to
+ match target.h.
+ * arm-protos.h, arm.c (arm_output_mi_thunk): Likewise.
+ * cris-protos.h, cris.c (cris_asm_output_mi_thunk): Likewise.
+ * frv-protos.h, frv.c (frv_asm_output_mi_thunk): Likewise.
+ * i386-protos.h, i386.c (x86_output_mi_vcall_thunk,
+ x86_output_mi_thunk): Likewise.
+ * i960-protos.h, i960.c (i960_output_mi_thunk): Likewise.
+ * ia64-protos.h, ia64.c (ia64_output_mi_thunk): Likewise.
+ * m68k-protos.h, m68k.c (m68k_output_mi_thunk): Likewise.
+ * mmix-protos.h, mmix.c (mmix_asm_output_mi_thunk): Likewise.
+ * rs6000-protos.h, rs6000.c (output_mi_thunk): Likewise.
+ * s390-protos.h, s390.c (s390_output_mi_thunk): Likewise.
+ * stormy16-protos.h, stormy16.c (xstormy16_asm_output_mi_thunk):
+ Likewise.
+ * vax-protos.h, vax.c (vax_output_mi_thunk): Likewise.
+
+ * target.h (gcc_target): Update output_mi_thunk and
+ output_mi_vcall_thunk to take a HOST_WIDE_INT delta and
+ vcall_index.
+
+ * config/alpha/alpha.c: Replace ASM_OUTPUT_MI_THUNK with
+ TARGET_ASM_OUTPUT_MI_THUNK in comments.
+ * config/alpha/vms.h (ASM_OUTPUT_MI_THUNK): Don't #undef it.
+ (TARGET_ASM_OUTPUT_MI_THUNK): #undef it.
+ * config/frv/frv.h (DEFAULT_VTABLE_THUNKS): Remove definition.
+ * config/i386/i386-protos.h (x86_output_mi_vcall_thunk): Update
+ signature.
+ * config/i386/i386.c (x86_output_mi_vcall_thunk): Likewise.
+ * config/i386/openbsd.h: Replace ASM_OUTPUT_MI_THUNK with
+ TARGET_ASM_OUTPUT_MI_THUNK in comments.
+ * config/i960/i960.h (ASM_OUTPUT_MI_THUNK): Don't define.
+ (TARGET_ASM_OUTPUT_MI_THUNK): Do define.
+ * config/m68k/openbsd.h: Replace ASM_OUTPUT_MI_THUNK with
+ TARGET_ASM_OUTPUT_MI_THUNK in comments.
+ * config/rs6000/rs6000.c (rs6000_ra_ever_killed): Remove #ifdef
+ ASM_OUTPUT_MI_THUNK and replace with check of targetm.
+
+ * doc/tm.texi (TARGET_ASM_OUTPUT_MI_THUNK): Update signature.
+ (TARGET_ASM_OUTPU_MI_VCALL_THUNK): Likewise.
+
+2002-10-19 Brad Lucier <lucier@math.purdue.edu>
+
+ * real.c (do_add): Fix 0+0 sign corner case.
+ (do_divide): Fix Inf/0 corner case.
+
+Sun Oct 20 00:31:31 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (classify_argument): Pass MMX arguments in memory
+ (ix86_expand_builtin): Expand proper address mode for cflush.
+ * i386.md (movdqa): Fix typo.
+ (sse2_cflush): Accept DImode addresses.
+
+ * xmmintrin.h (_mm_sqrt_sd): Accept two arguments.
+ (_mm_max_sd): Fix pasto.
+ (_mm_storeh_pd, _mm_storel_pd): Fix.
+
+ * i386.c (bdesc_comi): Fix to match specification.
+ (ix86_expand_sse_comi): Emit the comparison properly.
+ * i386.md (sse_comi, sse2_comi, sse_ucomi, sse2_ucomi):
+ Do not use comparison operator.
+ (vnmaskcmp): Fix template.
+
+ * xmmintrin.h (_mm_cvtps_pi16): Fix.
+
+2002-10-19 Sebastian Pop <s.pop@laposte.net>
+
+ * dependence.c : Removed.
+ * Makefile.in : Remove dependence.o.
+
+Sat Oct 19 10:46:52 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * mmintrin.h (__m64): typedef it to v2si.
+ (_mm_cvtsi32_si64, _mm_cvtsi32_si64_mm_sll_pi16,
+ _mm_sll_pi32, _mm_sll_pi64, _mm_slli_pi64, _mm_sra_pi16,
+ _mm_sra_pi32, _mm_srl_pi16, _mm_srl_pi32, _mm_srl_pi64,
+ _mm_srli_pi64, _mm_and_si64, _mm_andnot_si64,
+ _mm_or_si64, _mm_xor_si64): Add neccesary casts.
+ * xmmintrin.h (_mm_setzero_si64): Likewise.
+
+ * i386.h (ALIGN_MODE_128): Update comment; add missing modes
+ (SSE_REG_MODE_P, MMX_REG_MODE_P): New macros.
+
+ PR target/7693
+ Patch by Shawn Wagner
+ * mmintrin.h: Replace pi64 by si64.
+
+2002-10-18 David Edelsohn <edelsohn@gnu.org>
+
+ * rs6000.md (movdf_hardfloat32): Order alternatives consistently.
+ Use length of 4 not *.
+ (movdf_hardfloat64): Same. Support DFmode moves to/from CTR/LR.
+ (movdf_softfloat64): Likewise.
+ (movdi_internal32): Use length of 4 not *.
+ (movti_power): Same.
+ (ctrsi, ctrdi): Same.
+
+2002-10-18 Zack Weinberg <zack@codesourcery.com>
+
+ * c-decl.c (start_decl): Point users of the old initialized-
+ typedef extension at __typeof__.
+
+2002-10-18 Richard Henderson <rth@redhat.com>
+
+ * real.c (cmp_significand_0, rtd_divmod, ten_to_mptwo): New.
+ (real_to_decimal): Re-implement using the logic from the
+ gcc 3.2 etoasc. Comment heavily.
+ (div_significands): Simplify loop startup and comparison logic.
+
+2002-10-18 Mark Mitchell <mark@codesourcery.com>
+
+ * target-def.h (TARGET_ASM_OUTPUT_MI_THUNK): Default to NULL.
+ (TARGET_ASM_OUTPUT_MI_VCALL_THUNK): Likewise.
+ (TARGET_ASM_OUT): Add them.
+ * target.h (asm_out): Add output_mi_thunk and
+ output_mi_vcall_thunk.
+ * config/alpha/alpha.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/arm/arm-protos.h (arm_output_mi_thunk): Declare.
+ * config/arm/arm.c (arm_output_mi_thunk): Define.
+ * config/arm/arm.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/cris/cris.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/frv/frv.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/i386/i386-protos.h (x86_output_mi_thunk): Adjust
+ prototype.
+ (x86_output_mi_vcall_thunk): Declare.
+ * config/i386/i386.c (override_options): Clear
+ output_mi_vcall_thunk in 64-bit mode.
+ (ix86_fntype_regparm): New function.
+ (ix86_return_pops_args): Use it.
+ (ia32_this_parameter): New function.
+ (x86_output_mi_vcall_thunk): New function.
+ (x86_output_mi_thunk): Use it
+ * config/i386/unix.h (TARGET_ASM_OUTPUT_MI_THUNK): Adjust.
+ (TARGET_ASM_OUTPUT_MI_VCALL_THUNK): Define.
+ * config/i960/i960-protos.h (i960_output_mi_thunk): Declare.
+ * config/i960/i960.c (i960_output_mi_thunk): New function.
+ * config/i960/i960.h (ASM_OUTPUT_MI_THUNK): Adjust.
+ * config/ia64/ia64-protos.h (ia64_output_mi_thunk): Declare.
+ * config/ia64/ia64.c (ia64_output_mi_thunk): Define.
+ * config/ia64/ia64.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/m68k/m68k-protos.h (m68k_output_mi_thunk): New function.
+ * config/m68k/linux.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/m68k/netbsd-elf.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/mmix/mmix.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/pa/pa.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/rs6000/sysv4.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/s390/s390-protos.h (s390_output_mi_thunk): Declare.
+ * config/s390/s390.c (s390_output_mi_thunk): Define.
+ * config/s390/s390.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/sparc/sparc.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/stormy16/stormy16.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * config/vax/vax-protos.h (vax_output_mi_thunk): Declare.
+ * config/vax/vax.c (vax_output_mi_thunk): Define.
+ * config/vax/vax.h (ASM_OUTPUT_MI_THUNK): Rename to ...
+ (TARGET_ASM_OUTPUT_MI_THUNK): ... this.
+ * doc/tm.texi: Adjust documentation.
+
+2002-10-18 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define
+ __enable_execute_stack function.
+ * config/alpha/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Define
+ as NETBSD_ENABLE_EXECUTE_STACK.
+ * config/i386/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+ * config/i386/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+ * config/i386/netbsd64.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+ * config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+ * config/sparc/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
+
+2002-10-18 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/i386/i386.c (x86_initialize_trampoline): Emit a call
+ to __enable_execute_stack with the address of the trampoline
+ if TRANSFER_FROM_TRAMPOLINE is defined.
+ * config/i386/i386.h (TARGET_64BIT): Expand to a compile-time
+ constant if building libgcc2.
+
+Thu Oct 17 17:40:05 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (pentium4_cost): Fix according to Intel recommendations.
+ (ix86_memory_move_cost): Fix for 64bit compilation.
+
+2002-10-17 Roger Sayle <roger@eyesopen.com>
+
+ * doc/c-tree.texi: Update description of COND_EXPR tree nodes.
+
+2002-10-17 Geoffrey Keating <geoffk@apple.com>
+
+ * config/rs6000/rs6000.h (HARD_REGNO_MODE_OK): Allow arbitrary modes
+ in CTR/LR/MQ.
+ * config/rs6000/rs6000.md (movcc_internal1): Support CCmode moves
+ to/from CTR/LR/MQ.
+ (movsf_hardfloat): Support SFmode moves to/from CTR/LR/MQ.
+ (movsf_softfloat): Likewise.
+
+2002-10-17 Janis Johnson <janis187@us.ibm.com>
+
+ * Makefile.in (site.exp): Add ALT_CXX_UNDER_TEST and COMPAT_OPTIONS.
+
+2002-10-17 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/alpha/alpha.c (alpha_initialize_trampoline): Use
+ tramp, not addr, to pass the trampoline address to
+ __enable_execute_stack.
+
+Thu Oct 17 18:40:47 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * mmintrin.h: Guard by __MMX__
+ * xmmintrin.h: Guard by __SSE__
+
+ PR other/8062
+ * xmmintrin.h (_MM_SHUFFLE2): New macro.
+ (_mm_load*_?d): New functions.
+ (_mm_set*_?d): New functions.
+ (_mm_store*_?d): New functions.
+
+Wed Oct 16 15:01:29 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ Really commit patch announced at Oct 14
+ PR c/7344
+ * predict.c (can_predict_insn_p): New function.
+ (estimate_probability): Avoid unnecesary work.
+ (process_note_prediction): Likewise.
+ * toplev.c (rest_of_compilation): Account early branch prediction pass
+ as TV_BRANCH_PROB.
+
+ PR other/8048
+ Found by Ian Ollmann
+ * xmmintrin.h (_mm_shuffle_pd): Fix typo.
+ (_mm_load?_pd): Likewise.
+ (_mm_store?_pd): Likewise.
+
+ PR target/7386
+ * i386.c (builtin_description):Drop cmpg[te]s[sd].
+ * xmmintrin.h (__mm_cmpg[te]_s[sd]): Rewrite using
+ swapped alternative.
+
+ PR opt/7630
+ * reload1.c (reload_inner_reg_of_subreg): New argument output;
+ (push_reload): Update call.
+
+2002-10-17 Richard Sandiford <rsandifo@redhat.com>
+
+ * config.gcc (mips*-*-*): Add OBJECT_FORMAT_ELF to $tm_defines
+ if using mips/elf.h or mips/elf64.h.
+ * config/mips/elf.h (OBJECT_FORMAT_ELF): Remove.
+ * config/mips/elf64.h (OBJECT_FORMAT_ELF): Remove.
+
+2002-10-16 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.c (function_arg): Set inner mode of V1DI to
+ SI.
+
+2002-10-16 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/linux.h (ASM_DOUBLE, _ASM_OUTPUT_LONG): Remove.
+ (LPREFIX): Likewise.
+ (ASM_COMMENT_START, LOCAL_LABEL_PREFIX, ASM_FORMAT_PRIVATE_NAME,
+ ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT,
+ ASM_OUTPUT_ALIGN, ASM_OUTPUT_SKIP, ASM_OUTPUT_ALIGNED_BSS,
+ TEXT_SECTION_ASM_OP, DATA_SECTION_ASM_OP, BSS_SECTION_ASM_OP,
+ GLOBAL_ASM_OP, ASM_OUTPUT_MI_THUNK): Move to s390.h.
+
+ * config/s390/s390.h (ASM_COMMENT_START, LOCAL_LABEL_PREFIX,
+ ASM_FORMAT_PRIVATE_NAME, ASM_OUTPUT_ALIGN, ASM_OUTPUT_SKIP,
+ ASM_OUTPUT_ALIGNED_BSS, TEXT_SECTION_ASM_OP, DATA_SECTION_ASM_OP,
+ BSS_SECTION_ASM_OP): Move from linux.h.
+ (ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
+ Also, use ASM_GENERATE_INTERNAL_LABEL instead of LPREFIX.
+
+ * config/s390/s390.c (s390_function_profiler): Use
+ ASM_GENERATE_INTERNAL_LABEL instead of LPREFIX.
+
+2002-10-15 Eric Christopher <echristo@redhat.com>
+
+ * stor-layout.c (layout_type): Call GET_MODE_BITSIZE once.
+ * java/parse.y (obtain_incomplete_type): Make pointer
+ ptr_mode.
+
+2002-10-15 Richard Henderson <rth@redhat.com>
+
+ * real.c (real_to_decimal): Accept BUF_SIZE and CROP_TRAILING_ZEROS
+ as arguments. Bound DIGITS by the available buffer size.
+ (real_to_hexadecimal): Likewise.
+ * real.h (real_to_decimal, real_to_hexadecimal): Update prototypes.
+ (REAL_VALUE_TO_DECIMAL): Remove.
+ * c-common.c, c-pretty-print.c, print-rtl.c, print-tree.c,
+ sched-vis.c, config/arc/arc.c, config/c4x/c4x.c, config/fr30/fr30.c,
+ config/i370/i370.h, config/i386/i386.c, config/i960/i960.c,
+ config/ip2k/ip2k.c, config/m32r/m32r.c, config/m68hc11/m68hc11.c,
+ config/m68k/hp320.h, config/m68k/m68k.h, config/m68k/sun2o4.h,
+ config/m68k/sun3.h, config/mips/mips.c, config/ns32k/ns32k.c,
+ config/pdp11/pdp11.h, config/vax/vax.h: Update all callers to
+ use real_to_decimal directly, and with the proper arguments.
+ * doc/tm.texi (REAL_VALUE_TO_DECIMAL): Remove.
+
+2002-10-15 Jim Wilson <wilson@redhat.com>
+
+ * reload1.c (merge_assigned_reloads): After converting overlapping
+ reloads to RELOAD_OTHER, abort if there are now conflicting reloads.
+
+ * config/i386/i386.md (adddi3_1): Add call to ix86_binary_operator_ok.
+
+Tue Oct 15 22:08:35 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * expr.c (do_tablejump): Fix typo in my previous commit.
+
+2002-10-15 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/vr.h (DRIVER_SELF_SPECS): Change %<mgp32 to %{<mgp32}.
+
+2002-10-15 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_split_branches): Add return
+ value. Add parameters TEMP_REG and TEMP_USED. Use unspec 104.
+
+ (find_base_register_in_addr): New function.
+ (find_base_register_ref): New function.
+ (replace_base_register_ref): New function.
+
+ (struct constant_pool): Add members pool_insn, insns, and anchor.
+ Remove member last_insn.
+ (s390_start_pool): Initialize them.
+ (s390_end_pool): Emit pool placeholder insn.
+ (s390_add_pool_insn): New function.
+ (s390_find_pool): Use insns bitmap instead of addresses.
+ (s390_dump_pool): Replace placeholder insn. Emit anchor.
+ Replace unspec 104 by local-pool-relative references.
+ (s390_output_constant_pool): Output anchor label if required.
+ (s390_output_symbolic_const): Handle unspec 104 and 105.
+ (s390_add_pool): Remove, replace by ...
+ (s390_add_constant, s390_find_constant): ... these new functions.
+ (s390_add_anchor): New function.
+
+ (s390_chunkify_pool): Delete, replace by ...
+ (s390_chunkify_start, s390_chunkify_finish,
+ s390_chunkify_cancel): ... these new functions.
+ (s390_optimize_prolog): Add parameter TEMP_REGNO.
+ Recompute register live data for special registers.
+ (s390_fixup_clobbered_return_reg): New function.
+ (s390_machine_dependent_reorg): Rewrite to use new
+ s390_chunkify_... routines.
+
+ config/s390/s390.md ("reload_base"): Rename to ...
+ ("reload_base_31"): ... this.
+ ("reload_base_64"): New insn.
+ ("reload_base2"): Remove.
+ ("reload_anchor"): New insn.
+ ("pool"): New insn.
+
+ s390.c (s390_pool_overflow): Remove.
+ s390.h (s390_pool_overflow): Likewise.
+ s390.md ("cjump", "icjump", "doloop_si"): Remove s390_pool_overflow.
+
+Tue Oct 15 16:51:04 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.md (movv8qi_i+2): Don't split if source is -1.
+
+2002-10-15 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/install.texi: Formatting changes for conformance to HTML 4.01.
+
+2002-10-15 Ulrich Weigand <uweigand@de.ibm.com>
+
+ PR opt/7409
+ * loop.c (loop_regs_scan): Mark registers used for function
+ argument passing as MAY_NOT_OPTIMIZE.
+
+Mon Oct 14 19:22:19 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * gcov-io.h (gcov_info): Fix type.
+ * profile.c (create_profiler): Fix type mismatch.
+
+Mon Oct 14 20:33:12 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (movv2di_internal): New pattern.
+ (movv2df_internal, movv8hi_internal, movv16qi_internal): Fix predicate.
+ (movv2di): New expander.
+ * i386.c (ix86_preferred_reload_class): Return NO_REGS for vector operands.
+
+ * i386.c (ix86_expand_timode_binop_builtin): Delete.
+ (builtin_description): Add SSE1 logicals; rename SSE2 logicals.
+ (ix86_init_mmx_sse_builtins): Kill SSE1 logicals.
+ (ix86_expand_builtin): Likewise.
+ * i386.h (sse_andti4_df_1, sse_andti3_df_2, sse_andti3_sf_1, sse_andti3_sf_2,
+ sse_andti3,
+ sse_andnti4_df_1, sse_andti3_df_2, sse_andti3_sf_1, sse_andti3_sf_2,
+ sse_andnti3,
+ sse_orti4_df_1, sse_orti3_df_2, sse_orti3_sf_1, sse_orti3_sf_2,
+ sse_orti3,
+ sse_xorti4_df_1, sse_xorti3_df_2, sse_xorti3_sf_1, sse_xorti3_sf_2,
+ sse_xorti3): Kill.
+ (sse_andv4sf3, sse_andnv4sf3, sse_orv2df3, sse_xorv2df3, sse_andv2df3,
+ sse_andnv2df3, sse_orv2df3, sse_xorv2df3): New expanders.
+ (*sse_andv4sf3, *sse_andnv2df3, *sse_orv4sf3, *sse_xorv4sf3, *sse_andv2df3,
+ *sse_andnv2df3, *sse_orv2df3, *sse_xorv2df3): New patterns.
+ (*sse_andsf3, *sse_andndf3, *sse_ordf3, *sse_xordf3, *sse_anddf3,
+ *sse_andndf3, *sse_orv2df3, *sse_xorv2df3): New patterns.
+
+ * xmmintrin.h (__m128i): Define as __v2di.
+
+ PR c++/6419
+ (expand_expr): Use DECL_RTL_SET_P.
+
+2002-10-14 Roger Sayle <roger@eyesopen.com>
+
+ * combine.c (simplify_set): Treat MODE_CC registers like cc0.
+
+2002-10-14 Roger Sayle <roger@eyesopen.com>
+ Zack Weinberg <zack@codesourcery.com>
+
+ * config/i386/i386.c (k6_cost): Correct typo.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ PR optimization/6631
+ * alias.c (objects_must_conflict_p): Check honor_readonly when
+ examining TYPE_READONLY.
+ * function.c (assign_stack_temp_for_type): Likewise.
+
+2002-10-14 Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
+
+ * config/alpha/alpha.md (extendsidi2_nofix, extendsidi2_fix):
+ Swap zero extension arguments.
+ (umaxhi3): Fix instruction class.
+ PR target/7211
+ (prefetch): Fix prefetch instructions.
+ PR target/7238
+ (pkwb): Fix output constraint.
+
+2002-10-14 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/mips/mips.c (print_operand): Increase buffer size for
+ real numbers.
+
+2002-10-14 Richard Henderson <rth@redhat.com>
+
+ PR opt/8165
+ * gcse.c (adjust_libcall_notes): Revert last change.
+ * simplify-rtx.c (simplify_replace_rtx): Handle LO_SUM.
+
+2002-10-14 Andrew Haley <aph@redhat.com>
+
+ * tree-inline.c (remap_block): All local class initialization
+ flags go in the outermost scope.
+ (expand_call_inline): Call java_inlining_map_static_initializers.
+ (expand_call_inline): Call java_inlining_merge_static_initializers.
+ * java/lang.c (merge_init_test_initialization): New.
+ (java_inlining_merge_static_initializers): New.
+ (inline_init_test_initialization): New.
+ (java_inlining_map_static_initializers): New.
+
+ * tree-inline.c (expand_call_inline): Convert retvar to expected
+ type.
+
+2002-10-14 Graham Stott <graham.stott@btinternet.com>
+
+ * stmt.c (decl_conflicts_with_clobbers_p): Add REG_P check.
+
+2002-10-14 Aldy Hernandez <aldyh@redhat.com>
+
+ * stmt.c: Fix typo in comment.
+
+Mon Oct 14 11:35:49 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * c-common.c (c_common_type_for_mode): Add V2HImode case.
+ * tree.c (build_common_tree_nodes_2): Initialize
+ unsigned_V2HI_type_node and V2HI_type_node.
+ * tree.h (enum tree_index): Add TI_UV2HI_TYPE and TI_V2HI_TYPE.
+ (unsigned_V2HI_type_node, V2HI_type_node): Define.
+
+2002-10-14 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.h (ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP):
+ Handle TARGET_64BIT.
+
+2002-10-14 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/vr.h (DRIVER_SELF_SPECS): Define.
+ * config/mips/t-vr (MULTILIB_OPTIONS): Remove mlong32.
+ (MULTILIB_DIRNAMES): Remove long32.
+ (MULTILIB_EXCEPTIONS): Don't build -mabi=32 -mgp32 multilibs.
+ (MULTILIB_REDUNDANT_DIRS): Remove.
+
+2002-10-14 Richard Sandiford <rsandifo@redhat.com>
+
+ * doc/tm.texi (DRIVER_SELF_SPECS): Document.
+ * gcc.c (driver_self_specs): New variable.
+ (do_self_spec): New function.
+ (main): Use it to process driver_self_specs.
+
+2002-10-13 Richard Henderson <rth@redhat.com>
+
+ * config/i386/i386.c (ix86_function_ok_for_sibcall): Reject
+ indirect sibcalls when regparm >= 3.
+
+ * config/i386/i386.c (sibcall_insn_operand): New.
+ * config/i386/i386.h (PREDICATE_CODES): Update.
+ * config/i386/i386-protos.h: Update.
+ * config/i386/i386.md (sibcall_1, sibcall_value_1): Use it.
+
+ * rtl.c (shallow_copy_rtx): Use memcpy for the entire node.
+
+2002-10-12 Roger Sayle <roger@eyesopen.com>
+
+ * simplify-rtx.c (simplify_binary_operation) [ASHIFTRT]: Optimize
+ arithmetic right shifts of ~0 during RTL simplifications.
+
+2002-10-12 Neil Booth <neil@daikokuya.co.uk>
+
+ PR preprocessor/7862
+ PR preprocessor/8190
+ * gcc.c (cpp_unique_options): Don't delete .d files.
+ Remove stray whitespace.
+
+2002-10-12 Naohiko Shimizu <pshimizu@fa2.so-net.ne.jp>
+
+ * pdp11.h (ASM_OUTPUT_SKIP): Add preceding 0 for octal constant.
+ (ASM_OUTPUT_COMMON, ASM_OUTPUT_LOCAL): Likewise.
+ * pdp11.c (pdp11_output_function_prologue): 0%o -> %#o.
+ (pdp11_output_function_epilogue, output_ascii): Likewise.
+ (output_addr_const_pdp11): Likewise.
+ * pdp11.md (movdi): Use offsetable memory for floating store.
+ (lshrsi3, negsi2): Delete irrelevant comment.
+
+2002-10-11 Andreas Bauer <baueran@in.tum.de>
+
+ * config/i386/i386.c (ix86_function_ok_for_sibcall): Allow
+ indirect calls to be sibcall optimized.
+ * config/i386/i386.md (sibcall_1): New.
+ (call_1): Add no-sibcalls condition.
+ (sibcall_value_1): New.
+ (call_value_1): Add no-sibcalls condition.
+
+2002-10-11 Eric Christopher <echristo@redhat.com>
+
+ * output.h (default_valid_pointer_mode): Declare.
+ * varasm.c (default_valid_pointer_mode): Define.
+ * target-def.h (TARGET_VALID_POINTER_MODE): Use.
+ * target.h: Ditto.
+ * tree.c (build_pointer_type_for_mode): New function.
+ (build_pointer_type): Use.
+ (build_reference_type_for_mode): New function.
+ (build_reference_type): Use.
+ * tree.h: Declare new functions.
+ * c-common.c (handle_mode_attribute): Use new functions, check
+ for type.
+ * stor-layout.c (layout_type): Depend on machine mode for
+ REFERENCE_TYPE and POINTER_TYPE.
+ * dwarf2out.c (simple_type_size_in_bits): Move upward in file.
+ (modified_type_die): Use instead of PTR_SIZE for POINTER_TYPE
+ and REFERENCE_TYPE.
+ * config/mips/mips.c (mips_valid_pointer_mode): New function.
+ (TARGET_VALID_POINTER_MODE): Use and define.
+ * config/mips/mips-protos.h (mips_valid_pointer_mode): Declare.
+
+2002-10-11 Geoffrey Keating <geoffk@apple.com>
+
+ * cse.c (mention_regs): Set SUBREG_TICKED to the register number,
+ not the address of the REG.
+ (struct cse_reg_info): Make subreg_ticked unsigned.
+
+2002-10-11 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/compat.texi: Add info about C++ libraries.
+
+2002-10-11 Richard Henderson <rth@redhat.com>
+
+ PR opt/8165
+ * gcse.c (adjust_libcall_notes): Also adjust notes for INSN.
+
+2002-10-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * cfganal.c (dfs_enumerate_from): Use PARAMS.
+ * genautomata.c (output_insn_code_cases): Likewise.
+ * real.c (real_format): Likewise.
+ * tree.c (tree_size): Revise expressions using TREE_CODE_LENGTH to
+ ensure value is promoted before doing subtraction.
+
+Fri Oct 11 22:22:38 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * calls.c (expand_call): Simplify noreturn call.
+
+ PR c/7344
+ * cfgbuild.c (make_edges): Create edge cache when we do have
+ large jumptable.
+ * expr.c (do_tablejump): Note size of maximal jumptable.
+ * function.c (prepare_function_start): Zero out size.
+ * function.h (function): Add max_jumptable_ents.
+
+ * cfgcleanup.c (insn_match_p): Verify sibcall flag for calls to.
+
+Fri Oct 11 12:34:33 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.md (movv8qi_i+2): For V8QI destinations, generate V4HI
+ register for mperm_w operation.
+
+Fri Oct 11 10:56:17 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * emit-rtl.c (gen_lowpart_common): When asked to make a vector from
+ an integer, use simplify_gen_subreg.
+
+2002-10-10 Diego Novillo <dnovillo@redhat.com>
+
+ * calls.c (flags_from_decl_or_type): Make extern.
+ (ECF_*): Move ...
+ * rtl.h (ECF_*): ... here.
+ (flags_from_decl_or_type): Declare.
+
+2002-10-10 Roger Sayle <roger@eyesopen.com>
+ Nathan Sidwell <nathan@codesourcery.com>
+
+ * fold-const.c (fold) [RSHIFT_EXPR]: Optimize arithmetic right
+ shifts of the form -1 >> x.
+
+Thu Oct 10 16:52:55 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * cfgcleanup.c (insn_match_p): Verify sibcall flag for calls to.
+
+2002-10-10 Aldy Hernandez <aldyh@redhat.com>
+
+ * extend.texi (Vector Extensions): Remove comment about single
+ element vectors.
+
+2002-10-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * fold-const.c (size_htab_hash): Use htab_hash_pointer.
+ * function.c (insns_for_mem_hash): Likewise.
+ * varasm.c (STRHASH): Likewise.
+
+2002-10-10 Stuart Hastings <stuart@apple.com>
+
+ * cse.c (struct cse_reg_info): Add subreg_ticked.
+ (SUBREG_TICKED): New.
+ (get_cse_reg_info): Initialize SUBREG_TICKED.
+ (mention_regs): Use it.
+ (invalidate): Set SUBREG_TICKED.
+ (invalidate_for_call): Likewise.
+ (addr_affects_sp_p): Likewise.
+
+2002-10-10 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.md (tls_local_dynamic_base): Put pic reg
+ into proper operand.
+
+2002-10-10 Denis Chertykov <denisc@overta.ru>
+
+ * config/ip2k/ip2k.c (function_epilogue): Optimize stack
+ deallocation.
+ * config/ip2k/libgcc.S: Combine routines used by function
+ epilogue.
+
+2002-10-10 Jim Wilson <wilson@redhat.com>
+
+ * cse.c (fold_rtx): Don't perform associative optimization for DIV and
+ UDIV.
+
+2002-10-10 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/aix52.h: New file.
+ * config/rs6000/t-aix52: New File.
+ * config.gcc (rs6000-ibm-aix5.1.*): New entry.
+ (rs6000-ibm-aix[56789].*): Default to AIX 5.2.
+
+Thu Oct 10 19:37:54 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ PR target/5610
+ * invoke.texi (-msse-math): Kill
+ (-msse): Add note to mfpmath=sse.
+
+Thu Oct 10 17:08:30 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ PR target/7723
+ * i386.c (ix86_expand_vector_move): Do not generate const0->mem moves.
+
+2002-10-10 Neil Booth <neil@daikokuya.co.uk>
+
+ PR preprocessor/8179
+ * gcc.c (cpp_options): Add {ansi}, move %{m*} to same location
+ as cc1_options.
+ (default_compilers): Pass debug options when preprocessing
+ stdin.
+
+2002-10-06 Richard Henderson <rth@redhat.com>
+
+ * toplev.c (rest_of_compilation): Revert opt/2960 change.
+
+Wed Oct 9 21:18:43 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (*_cost): Add branch costs.
+ (override_options): set ix86_branch_cost.
+ (ix86_expand_int_movcc): Use BRANCH_COST.
+ * i386.h (costs): Add branch_cost.
+
+2002-10-09 Zack Weinberg <zack@codesourcery.com>
+
+ PR c/7353
+ * c-decl.c (start_decl): Unconditionally issue error for
+ 'typedef foo = bar'.
+ (finish_decl): Remove special case for TYPE_DECL with initializer.
+
+ * doc/extend.texi: Delete "Naming Types" section. Change all
+ cross-references to that section to refer to "Typeof" instead.
+ Add the useful safe-max()-macro example from "Naming Types" to
+ "Typeof", rewritten using that extension. Add some compatibility
+ notes to "Typeof."
+
+2002-10-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * loop.c: Revert 2002-08-15 change.
+ (LOOP_REGNO_NREGS): Ensure type is int.
+
+2002-10-09 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.md (extenddftf2): Change to define_insn
+ which copies first FPR and clears second.
+ (extendsftf2): Same.
+ (floatditf2): Fix typo.
+ (floatsitf2): Same.
+ (fix_trunctfdi2): Same.
+ (fix_trunctfsi2): Same.
+
+2002-10-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * conflict.c (arc_hash): Change return type to hashval_t.
+ * cselib.c (get_value_hash): Likewise.
+ * genautomata.c (automaton_decl_hash, insn_decl_hash, decl_hash,
+ state_hash, automata_list_hash): Likewise.
+ * read-rtl.c (def_hash): Likewise.
+ * tree.c (type_hash_hash): Likewise.
+
+2002-10-08 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.c (rs6000_ra_ever_killed): Call
+ prologue_epilogue_contains instead of using REG_MAYBE_DEAD notes.
+
+Wed Oct 9 15:54:49 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.md (ffssi2): Fix emitted code.
+
+2002-10-09 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * cse.c (insn_live_p): Pass insn pattern, not full insn
+ to may_trap_p.
+
+2002-10-09 Neil Booth <neil@daikokuya.co.uk>
+
+ * cppmacro.c (paste_tokens): Only allow / to paste with =.
+
+2002-10-09 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.md (movdf splitter): Use gen_int_mode on
+ 64-bit hosts.
+ (movtf_internal): Reference correct displacement for second value
+ in memory.
+ (movtf splitter): Correct generation of constants in 64-bit mode.
+
+2002-10-09 Alan Modra <amodra@bigpond.net.au>
+
+ * libgcc2.c (__floatdisf): Properly cure double rounding.
+
+2002-10-09 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * c-common.c (cb_register_builtins): Define __WCHAR_MAX__.
+ * doc/cpp.texi (Common Predefined Macros): Document.
+
+2002-10-09 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ PR doc/7484
+ * doc/invoke.texi (Option Summary): List
+ -Wmissing-declarations as a C only option.
+
+2002-10-08 Roger Sayle <roger@eyesopen.com>
+
+ * fold-const.c (fold) [LROTATE_EXPR, RROTATE_EXPR]: Optimize
+ left and right rotates of ~0, i.e. integer_all_onesp (arg0).
+ [LSHIFT_EXPR, RSHIFT_EXPR]: Optimize shifts and rotates of zero.
+
+Tue Oct 8 01:24:19 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (x86_sse_partial_reg_dependency, x86_sse_partial_regs,
+ x86_sse_typeless_stores, x86_sse_load0_by_pxor): New global
+ variables.
+ (safe_vector_operand): Update sse_clrv4sf call.
+ (ix86_expand_buildin): Likewise
+ * i386.h (x86_sse_partial_reg_dependency, x86_sse_partial_regs,
+ x86_sse_typeless_stores, x86_sse_load0_by_pxor): Declare.
+ (TARGET_SSE_PARTIAL_REG_DEPENDENCY, TARGET_SSE_PARTIAL_REGS,
+ TARGET_SSE_TYPELESS_STORES, TARGET_SSE_TYPELESS_LOAD0): New
+ macros.
+ * i386.md (movsf*, movdf*, movti, movv4sf, movv2df, movv16qi, movv8hi,
+ movv4si): Obey the new flags.
+ (floatsi2sf, floatdi2sf, truncatedf2sf): Emit extra load of 0 to avoid
+ reformating penalty.
+ (anddf, cmov patterns): Avoid reformating by first converting.
+ (sse_cvtsd2ss): Fix predicate.
+ (sse2_clrti): Fix mode,
+ (sse_clrv4sf): Avoid unspec.
+
+2002-10-08 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/t-linux64 (MULTILIB_OPTIONS): Remove
+ mno-app-regs|mcmodel=medany.
+ (MULTILIB_DIRNAMES, MULTILIB_OSDIRNAMES): Remove alt.
+ (MULTILIB_EXCEPTIONS, MULTILIB_EXCLUSIONS, MULTILIB_MATCHES): Remove.
+ (CRTSTUFF_T_CFLAGS): Define.
+
+2002-10-08 Roger Sayle <roger@eyesopen.com>
+
+ PR target/8087
+ * simplify-rtx.c (avoid_constant_pool_reference): Allow constant
+ pool references that are constructed using LO_SUM.
+
+2002-10-08 Nathan Sidwell <nathan@codesourcery.com>
+
+ * c-opts.c (c_common_decode_option): Add warn_strict_aliasing to
+ -Wall.
+ * c-typeck.c (build_c_cast): Use warn_strict_aliasing, tweak
+ message.
+ * flags.h (warn_strict_aliasing): Declare.
+ * toplev.c (warn_strict_aliasing): Define.
+ (lang_independent_options): Add it.
+ * doc/invoke.texi (-Wstrict-aliasing): Document it.
+
+2002-10-08 Zack Weinberg <zack@codesourcery.com>
+
+ * system.h (GCCBUGURL): Delete.
+ * version.c (bug_report_url): New. Add commentary about
+ modifying both these strings in modified distributions.
+ * version.h: Declare bug_report_url.
+
+ * diagnostic.c, gcc.c, gcov.c: Globally replace GCCBUGURL with
+ bug_report_url.
+
+2002-10-08 Nick Clifton <nickc@redhat.com>
+
+ * config/rs6000/spe.h (__ev_set_acc_u64): Use __ev_create_u64 to
+ convert uint64_t into __ev64_opaque__.
+ (__ev_set_acc_s64): Likewise, but using signed types.
+
+2002-10-08 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.md ("*doloop_si_long"): Add missing operand.
+ ("*doloop_di_long"): Likewise.
+
+Tue Oct 8 16:50:10 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * print-rtl.c (print_rtx): Increase buffer size for real numbers.
+
+2002-10-08 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips.md (define_attr cpu): Add r4111.
+
+2002-10-08 Anthony Green <green@redhat.com>
+
+ * bitmap.c (bitmap_equal_p): Clear all bitmap_head fields.
+
+2002-10-08 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
+
+ * config/c4x/c4x.c (c4x_print_operand): Enlarge buffer
+ for REAL_VALUE_TO_DECIMAL output.
+
+2002-10-07 Richard Henderson <rth@redhat.com>
+
+ * cse.c (fixed_base_plus_p): Turn FIXED_BASE_PLUS_P into a
+ function; cleanup PLUS case by using recursion. Update all users.
+ (NONZERO_BASE_PLUS_P): Remove.
+ (find_comparison_args): Use rtx_addr_can_trap_p instead.
+ (fold_rtx): Use nonzero_address_p.
+ * rtl.h (nonzero_address_p): Declare.
+ * rtlanal.c (rtx_varies_p): Handle ADDRESSOF.
+ (rtx_addr_can_trap_p): Likewise.
+ (nonzero_address_p): New.
+ * simplify-rtx.c (NONZERO_BASE_PLUS_P): Remove.
+ (simplify_relational_operation): Use nonzero_address_p.
+
+2002-10-07 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_override_options): Set
+ real_format_for_mode for IBM extended format, if enabled.
+ (easy_fp_constant): Add TFmode.
+ (rs6000_legitimize_address): Add TFmode.
+ (rs6000_legitimate_address): Same.
+ (function_arg_advance): TFmode uses two FPRs.
+ (rs6000_emit_prologue): Fix warning.
+ (rs6000_output_function_epilogue): Add TFmode.
+ (output_toc): Add TFmode.
+ * rs6000.h (SLOW_UNALIGNED_ACCESS): Add TFmode.
+ (LEGITIMATE_OFFSET_ADDRESS_P): Add TFmode.
+ * rs6000.md (movtf splitter): Load TFmode constant.
+
+2002-10-07 Dale Johannesen <dalej@apple.com>
+
+ * rtl.h: Add NOTE_PRECONDITIONED.
+ * unroll.c: Set it.
+ * loop.c: Set loop_info->preconditioned from it.
+ * doloop.c: Permit doloop treatment when loop_info->preconditoned.
+
+2002-10-07 Richard Henderson <rth@redhat.com>
+
+ * config/i960/i960.c (i960_setup_incoming_varargs): Create a
+ new rtx for comparing the argument pointer against zero.
+ (i960_va_start): Similarly.
+
+2002-10-07 Richard Henderson <rth@redhat.com>
+
+ * config/i960/i960.md (*): Use TFmode, not XFmode.
+ * config/i960/i960.c (*): Likewise.
+ (i960_arg_size_and_align): Remove XFmode alignment hack.
+ (i960_round_align): Merge code from ROUND_TYPE_ALIGN.
+ * config/i960/i960.h (LONG_DOUBLE_TYPE_SIZE): Use 128, not 96.
+ (MAX_LONG_DOUBLE_TYPE_SIZE): Likewise.
+ (DATA_ALIGNMENT, ROUND_TYPE_SIZE): Remove.
+
+2002-10-07 Richard Henderson <rth@redhat.com>
+
+ * config/fp-bit.c (EXTENDED_FLOAT_STUBS): Flush out all XF/TFmode
+ entry points; use void return value and argument list.
+
+2002-10-06 Andreas Bauer <baueran@in.tum.de>
+
+ * calls.c (expand_call): Fix function-is-volatile check.
+
+2002-10-05 Naohiko Shimizu <nshimizu@keyaki.cc.u-tokai.ac.jp>
+
+ * t-pdp11: Add MULTILIB support for msoft-float.
+ * pdp11.h (LEGITIMATE_CONSTANT_P): Fix soft-float case.
+
+ * t-pdp11: Add LIB2FUNCS_EXTRA.
+ * pdp11.c (pdp11_output_function_prologue): Restrict offset to 16bit,
+ add preceding 0 to the octal constant, rename 'fp' to 'r5', rename
+ 'fldd' to 'ldd', rename 'fstd' to 'std'.
+ (pdp11_output_function_epilogue): Likewise.
+ (output_move_quad): Make the comment gas compatible.
+ (output_ascii): Add preceding 0 to the octal constant.
+ (print_operand_address): Add pre_modify, post_modify.
+ (output_addr_const_pdp11): Add preceding 0 to the octal constant.
+ * pdp11.h (GO_IF_LEGITIMATE_ADDRESS) : Add 'movb' pre_modify case
+ with the indication of Paul Koning.
+ (PRINT_OPERAND): Fix floating constant.
+ * pdp11.md (movdi): Restrict matching pattern.
+ (movqi): Generalize the matching pattern.
+ (movdf): Restrict matching pattern.
+ (zero_extendqihi2): Change constant representation.
+ (floatsidf2): Fix wrong operands.
+ (addqi3): Fix wrong instruction name.
+ (subqi3): Fix wrong instruction name.
+ (andsi3, andhi3, andqi3): Simplify and fix to use 'bic'.
+ (xorsi3): Fix wrong insn.
+ (one_cmplqi2): Add two operand pattern.
+ (lsrsi3): New.
+ (negsi2): New.
+ (call): Add register indirect case.
+ (mod): Fix wrong subreg.
+
+2002-09-25 Eric Botcazou <ebotcazou@libertysurf.fr>
+ Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c/7411
+ * expr.c (expand_expr) [PLUS]: Simplify after the operands
+ have been expanded in EXPAND_NORMAL mode.
+
+2002-10-06 Richard Henderson <rth@redhat.com>
+
+ * config/rs6000/rs6000.md (load_toc_v4_PIC_2): Fix base constraint.
+
+2002-10-06 Richard Henderson <rth@redhat.com>
+
+ PR optimization/2960
+ * toplev.c (rest_of_compilation): Don't copy_loop_headers if
+ optimize_size.
+
+2002-10-06 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/mips/mips.h (SIZE_TYPE, PTRDIFF_TYPE): Override
+ previously definitions.
+
+2002-10-06 Frank Ch. Eigler <fche@redhat.com>
+
+ * cppinit.c (init_standard_includes, parse_option): Use strncmp.
+ * c-opts.c (find_opt): Similarly.
+
+Sat Oct 5 22:48:06 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * athlon.md: rewrite to DFA.
+ * i386 (ix86_adjust_cost): Drop memory latency code.
+ (ia32_use_dfa_pipeline_interface): Return true for Athlon.
+
+2002-10-05 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c (set_multilib_dir): Don't access *end.
+ Use memcpy instead of strncpy. Don't write beyond malloced buffer.
+ (print_multilib_info): Don't show paths starting with ".:".
+ * genmultilib: Add new option, "yes" if multilibs are enabled.
+ Update comments. If multilibs not enabled, print .:${osdirout}
+ for each directory. If multilibs are enabled, always print
+ ${dirout}:${osdirout}, even if the two are the same.
+ * Makefile.in (s-mlib): Pass @enable_multilib@ to genmultilib.
+ Pass all MULTILIB_* variables to genmultilib even if
+ --disable-multilib but MULTILIB_OSDIRNAMES is not empty.
+
+2002-10-04 Zack Weinberg <zack@codesourcery.com>
+
+ * gcc.c (process_command): Set .validated for -pipe. Correct
+ grammar in comment.
+
+2002-10-04 Bruce Korb <bkorb@gnu.org>
+
+ * fixinc/inclhack.def(hpux11_abs): use format fix
+ * fixinc/fixincl.x: regenerate
+ * fixinc/tests/base/stdlib.h: accommodate new fix test
+
+Sat Oct 5 19:42:45 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * c-common.c (cb_register_builtins): Use really_no_inline.
+
+2002-10-04 David Edelsohn <edelsohn@gnu.org>
+
+ * unroll.c (copy_loop_body): Remove REG_EQUAL note attached to
+ copied instruction if the note is not loop invariant.
+
+2002-10-04 Loren J. Rittle <ljrittle@acm.org>
+
+ * gcc/ginclude/stddef.h: Support the FreeBSD 5 typedef system.
+
+2002-10-04 Steve Ellcey <sje@cup.hp.com>
+
+ * doc/invoke.texi (HPPA): Add -mlinker-opt, -mgnu-ld,
+ and -mhp-ld options to list of options. Add -mgnu-ld
+ and -mhp-ld option descriptions.
+
+2002-10-04 Steve Ellcey <sje@cup.hp.com>
+
+ * fixinc/inclhack.def (hpux11_abs): New.
+ (stdio_va_list): change __va_list__ to __gnuc_va_list.
+ * fixinc/fixincl.x: Rebuild.
+
+2002-10-04 Roger Sayle <roger@eyesopen.com>
+
+ * config/i386/i386.h (processor_costs): Add new fields fadd,
+ fmul, fdiv, fabs, fchs and fsqrt to costs structure.
+ (RTX_COSTS): Use these fields to determine the RTX costs
+ of floating point addition/subtraction, multiplication,
+ division, fabs, negation and square root respectively.
+ * config/i386/i386.c (size_cost): Provide instruction sizes
+ for these new fields.
+ (i386_cost, i486_cost, pentium_cost, pentiumpro_cost,
+ k6_cost, athlon_cost, pentium4_cost): Provide typical cycle
+ counts for these new fields for all x86 processor variants.
+
+2002-10-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * mips.c (mips_const_double_ok): Delete unused variable.
+
+ * gengtype.c (rtx_next): Change type to int.
+
+2002-10-04 Andreas Jaeger <aj@suse.de>
+
+ * config/i386/t-linux64 (MULTILIB_OSDIRNAMES): Fix value.
+
+2002-10-04 Richard Henderson <rth@redhat.com>
+
+ * real.h (SIGNIFICAND_BITS): Add one more word.
+ (CONST_DOUBLE_FORMAT): Accomodate 6 words.
+ * real.c (times_pten): New.
+ (real_to_decimal, real_from_string): Use it.
+ (sticky_rshift_significand): Use & to find modulus.
+ (rshift_significand, lshift_significand): Likewise.
+ (do_divide): Apply sticky bit after normalization.
+ (real_to_decimal, real_to_hexadecimal): Fix sign of Inf and NaN.
+
+2002-10-03 Andreas Bauer <baueran@in.tum.de>
+
+ * doc/tm.texi (FUNCTION_OK_FOR_SIBCALL): Remove.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): New.
+
+2002-10-03 Andreas Jaeger <aj@suse.de>
+
+ * gengtype.c (adjust_field_rtx_def): Cast variables of type size_t
+ to unsigned long, adjust printf format string.
+ (output_mangled_typename): Likewise.
+
+2002-10-03 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/vax/vax.c (vax_output_function_prologue): Use asm_fprintf.
+ * config/vax/vax.h (VAX_FUNCTION_PROFILER_NAME): New.
+ (FUNCTION_PROFILER): Rewrite to use ASM_GENERATE_INTERNAL_LABEL,
+ assemble_name, asm_fprintf, and VAX_FUNCTION_PROFILER_NAME.
+ (ASM_OUTPUT_MI_THUNK): Use asm_fprintf instead of REGISTER_PREFIX.
+ (PRINT_OPERAND_PUNCT_VALID_P): Fix comment.
+ * config/vax/elf.h (FUNCTION_PROFILER): Remove.
+ (VAX_FUNCTION_PROFILER_NAME): Redefine as "__mcount".
+
+2002-10-03 Mark Mitchell <mark@codesourcery.com>
+
+ * doc/invoke.texi (-Wabi): Document mangling bug.
+
+2002-10-04 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (rs6000_output_function_epilogue): Use a
+ name for the tbtab label that depends on the function asm name.
+ Don't output tbtab label unless optional_tbtab.
+ (output_mi_thunk): Formatting.
+
+2002-10-03 Richard Henderson <rth@redhat.com>
+
+ * config/m68k/m68k.h (OVERRIDE_OPTIONS): Move additional code ...
+ * config/m68k/m68k.c (override_options): ... here.
+ * config/m68k/m68kelf.h (OVERRIDE_OPTIONS): Remove.
+ * config/m68k/m68kv4.h (OVERRIDE_OPTIONS): Remove.
+ * config/m68k/linux.h (SUBTARGET_OVERRIDE_OPTIONS): Remove.
+ * config/m68k/netbsd-elf.h (SUBTARGET_OVERRIDE_OPTIONS): Remove.
+
+2002-10-03 Richard Henderson <rth@redhat.com>
+
+ * real.h (struct real_value): Use ENUM_BITFIELD.
+
+2002-10-03 Richard Henderson <rth@redhat.com>
+
+ * config/i960/i960.md (call, call_value): Use emit_call_insn.
+
+2002-10-03 Steve Ellcey <sje@cup.hp.com>
+
+ * config/pa/pa64-hpux.h (INIT_ENVIRONMENT): New.
+
+2002-10-03 Steve Ellcey <sje@cup.hp.com>
+
+ * config.gcc (hppa*64*-*-hpux11*): Check gnu_ld.
+ * config/pa/pa.h (MASK_GNU_LD): New.
+ (TARGET_GNU_LD): New.
+ * config/pa/pa64-hpux.h (LINK_SPEC): Set based
+ on gnu-ld and MASK_GNU_LD.
+ (SUBTARGET_SWITCHES): New gnu-ld & hp-ld flags.
+
+Thu Oct 3 23:35:51 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (athlon_cost): Fix the move costs.
+
+Thu Oct 3 23:20:58 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * final.c (final): Use symbol name as function name for profiling.
+ * profile.c (get_exec_counts): Likewise.
+ (branch_prob): Likewise.
+
+2002-10-03 Jakub Jelinek <jakub@redhat.com>
+
+ * longlong.h (__udiv_qrnnd): Remove PARAMS from prototype.
+
+2002-10-03 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c (print_multi_os_directory): New variable.
+ (option_map): Support --print-multi-os-directory.
+ (struct prefix_list): Add os_multilib field.
+ (multilib_os_dir): New variable.
+ (static_specs): Add multilib_options.
+ (find_a_file): Add multilib argument. Search in GCC or OS multilib
+ subdirs if non-zero.
+ (read_specs, execute): Update callers.
+ (find_file): Likewise. Don't prefix name with multilib_dir, instead
+ pass 1 as multilib option.
+ (display_help): Include --print-multi-os-directory.
+ (add_prefix): Add os_multilib argument. Initialize pl->os_multilib.
+ (process_command): Update callers. Handle --print-multi-os-directory.
+ (do_spec_1) ['D']: Use multilib_os_directory if pl->os_multilib is
+ set.
+ (main): Update find_a_file and add_prefix callers.
+ Handle print_multi_os_directory.
+ (struct mdswitchstr): New.
+ (mdswitches, n_mdswitches): New variables.
+ (used_arg): Add MULTILIB_DEFAULT switches too if they are not
+ present on the command line nor their mutually incompatible
+ switches.
+ (default_arg): Optimize.
+ (set_multilib_dir): Compute multilib_os_dir. Initialize mdswitches
+ array.
+ (print_multilib_info): Only print GCC multilib dir name, not OS
+ multilib dirname.
+ * genmultilib: Add osdirnames parameter. Output multilib_options
+ variable. If osdirnames is specified, output dirnames as
+ dirname:osdirname.
+ * mklibgcc.in: Use MULTILIB_OSDIRNAMES, --print-multi-directory
+ and --print-multi-os-directory instead of SHLIB_SLIBDIR_SUFFIXES
+ to compute libgcc_s soname and install path.
+ * Makefile.in (libgcc.mk): Pass MULTILIB_OSDIRNAMES instead of
+ SHLIB_SLIBDIR_SUFFIXES to mklibgcc.
+ (s_mlib): Pass MULTILIB_OSDIRNAMES or nothing as last genmultilib
+ argument.
+
+ * config/sparc/t-linux64 (MULTILIB_OSDIRNAMES): Set.
+ (SHLIB_SLIBDIR_SUFFIXES): Remove.
+ * config/sparc/linux64.h (STARTFILE_SPEC32, STARTFILE_SPEC64,
+ ENDFILE_SPEC32, ENDFILE_SPEC64, ENDFILE_COMMON): Remove.
+ (STARTFILE_SPEC, ENDFILE_SPEC): Don't distinguish between -m32
+ and -m64.
+ * config/sparc/t-sol2-64 (MULTILIB_OSDIRNAMES): Set.
+ (SHLIB_SLIBDIR_SUFFIXES): Remove.
+ * config/sparc/sol2-bi.h (STARTFILE_ARCH64_SPEC): Remove.
+ (STARTFILE_ARCH_SPEC): Remove.
+ * config/i386/t-linux64 (MULTILIB_OSDIRNAMES): Set.
+ (SHLIB_SLIBDIR_SUFFIXES): Remove.
+ * config/i386/linux64.h (STARTFILE_PREFIX_SPEC): Remove.
+ * config/mips/t-iris6 (MULTILIB_OSDIRNAMES): Set.
+ (SHLIB_SLIBDIR_SUFFIXES): Remove.
+
+Thu Oct 3 21:42:20 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * predict.c (choose_function_section): Avoid choice for linkonce functions.
+
+Thu Oct 3 15:15:00 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (lea to mul peep2): Fix condition.
+
+2002-10-02 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa-linux.h (FUNCTION_OK_FOR_SIBCALL): Delete macro.
+ * pa32-linux.h (FUNCTION_OK_FOR_SIBCALL): Define.
+
+2002-10-02 David Mosberger-Tang <David.Mosberger@acm.org>
+
+ * unwind.h (_Unwind_GetTextRelBase): Mark _C argument with
+ attribute "unused".
+
+ * config/t-libunwind: Mention unwind-sjlj.c.
+ * unwind-libunwind.c: Change #ifdef __USING_LIBUNWIND_EXCEPTIONS__
+ to #ifndef __USING_SJLJ_EXCEPTIONS__.
+
+ * configure.in: Move sjlj-exceptions and --enable-libunwind-exceptions
+ before inclusion of config.gcc, but after configuring the compiler etc.
+ Determine default value for --enable-libunwind-exceptions based on
+ whether the host has a libunwind library (not guaranteed to be correct,
+ but it's a reasonable first guess and can always be overridden with an
+ explicit --enable/disable-libunwind-exceptions.
+ * config.gcc: For target ia64*-*-linux*, mention t-libunwind as a
+ tmake_file when $use_libunwind_exceptions is enabled.
+ * Makefile.in: Update comment: LIB2ADDEH is updated not just by
+ ia64 (e.g., config/t-linux also updates it).
+ * gcc.c (init_spec) [USE_LIBUNWIND_EXCEPTIONS]: Mention -lunwind
+ along with the shared version of libgcc since the latter requires
+ the former.
+ * unwind-libunwind.c: New file.
+ * config/t-libunwind: Ditto.
+
+2002-10-02 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * config.gcc: Remove support for vax-*-vms*.
+ * config/vax/vms.h: Remove.
+ * config/vax/xm-vms.h: Remove.
+ * config/vax/vax-protos.h: Remove VMS-specific code.
+ * config/vax/vax.c: Remove VMS-specific code.
+
+2002-10-02 Richard Henderson <rth@redhat.com>
+
+ PR opt/7124
+ * config/i386/i386.c (ix86_register_move_cost): Increase cost
+ for secondary_memory_needed pairs.
+
+2002-10-02 Nathanael Nerode <neroden@gcc.gnu.org>
+
+ * doc/vms.texi: Blow away false include file section.
+
+2002-10-02 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6627
+ * toplev.c (force_align_functions_log): New global variable.
+ * flags.h (force_align_functions_log): Add extern prototype.
+ * varasm.c (assemble_start_function): Use it to force minimum
+ function alignment.
+ * config/i386/i386.h (FUNCTION_BOUNDARY): Set the correct
+ minimum function alignment to one byte.
+ (TARGET_PTRMEMFUNC_VBIT_LOCATION): Store the virtual bit in
+ the least significant bit of vtable member function pointers.
+ * tree.h (enum ptrmemfunc_vbit_where_t): Move definition to
+ here from cp/cp-tree.h.
+
+Wed Oct 2 17:01:36 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (print_operand_address): Use RIP addressing for offsetted
+ label refs too.
+
+2002-09-30 David S. Miller <davem@redhat.com>
+
+ PR middle-end/7151
+ * config/sparc/sparc.md (movdi_insn_sp32_v9): Accept 'e' regs.
+ (movdi reg/reg split): Match only on sparc32, and v9 when int regs.
+
+2002-10-01 Andreas Bauer <baueran@in.tum.de>
+
+ * calls.c (expand_call): Remove the `no indirect check'
+ for sibcall optimization; use function_ok_for_sibcall
+ target hook; refine check for `function is volatile'.
+ (FUNCTION_OK_FOR_SIBCALL): Remove the redefinition.
+ * hooks.c (hook_tree_tree_bool_false): New.
+ * hooks.h (hook_tree_tree_bool_false): Declare.
+ * target-def.h (TARGET_FUNCTION_OK_FOR_SIBCALL): New.
+ (TARGET_INITIALIZER): Add it.
+ * target.h (struct gcc_target): Add function_ok_for_sibcall.
+ * config/alpha/alpha.c: (alpha_function_ok_for_sibcall): New.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/alpha/alpha.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/arm/arm-protos.h: (arm_function_ok_for_sibcall):
+ Remove function declaration.
+ * config/arm/arm.c: (arm_function_ok_for_sibcall): Make
+ function static and accept another argument of type `tree'.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/arm/arm.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/frv/frv.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/i386/i386.c: (ix86_function_ok_for_sibcall): New.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/i386/i386.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/pa/pa-linux.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ (TARGET_HAS_STUBS_AND_ELF_SECTIONS): New definition.
+ * config/pa/pa.c: (pa_function_ok_for_sibcall): New.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/pa/pa.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/rs6000/rs6000-protos.h: (function_ok_for_sibcall):
+ Remove function declaration.
+ * config/rs6000/rs6000.c: (rs6000_function_ok_for_sibcall):
+ Rename function_ok_for_sibcall to rs6000_function_ok_for_sibcall;
+ rename first argument to `decl'; accept another argument
+ of type `tree'; make static.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/rs6000/rs6000.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/sh/sh.c: (sh_function_ok_for_sibcall): New.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/sh/sh.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/sparc/sparc.c: (sparc_function_ok_for_sibcall): New.
+ (TARGET_FUNCTION_OK_FOR_SIBCALL): Redefine accordingly.
+ * config/sparc/sparc.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+ * config/xtensa/xtensa.h: (FUNCTION_OK_FOR_SIBCALL): Remove.
+
+2002-10-01 Roger Sayle <roger@eyesopen.com>
+
+ * unroll.c (loop_iterations): Revert 2002-09-08 change.
+
+2002-10-01 Richard Henderson <rth@redhat.com>
+
+ * real.c (real_to_decimal): Crop trailing zeros for DIGITS < 0.
+ (real_to_hexadecimal): Likewise.
+ * print-rtl.c (print_rtx): If we are linked with real.c, don't
+ dump the XWINT fields of a floating point CONST_DOUBLE.
+
+2002-10-01 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/vax/elf.h (FUNCTION_PROFILER): Fix __mcount call.
+
+2002-10-01 Richard Henderson <rth@redhat.com>
+
+ * calls.c (precompute_register_parameters): Force non-legitimate
+ constants into pseudos.
+
+2002-10-01 Nick Clifton <nickc@redhat.com>
+
+ * config/rs6000/spe.md (spe_evrlwi): Add missing third operand
+ to assembler template.
+
+2002-10-01 Richard Henderson <rth@redhat.com>
+
+ * dwarf2out.c (loc_descriptor_from_tree): Relax requirement
+ for TLS debug info to !DECL_EXTERNAL.
+
+2002-10-01 Matt Thomas <matt@3am-software.com>
+ Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config.gcc (vax-*-netbsdelf*): Enable configuration.
+ * config/elfos.h (PCC_BITFIELD_TYPE_MATTERS): Define only
+ if not already defined.
+ * config/vax/elf.h: New file.
+ * config/vax/netbsd-elf.h: New file.
+ * config/vax/vax.c: Include "debug.h".
+ (vax_output_function_prologue): Add dwarf2 support. Use
+ MAIN_NAME_P when checking for VMS_TARGET stack adjust.
+ * config/vax/vax.h (CONST_OK_FOR_LETTER_P): Add cases for
+ 'J' [0..63], 'K' [-128..127], 'L' [-32768..32767],
+ 'M' [0..255], 'N' [0..65535], and, 'O' [-63..-1].
+ (VAX_ISTREAM_SYNC): Remove.
+ (INITIALIZE_TRAMPOLINE): Use gen_sync_istream.
+ (JUMP_TABLES_IN_TEXT_SECTION): Define.
+ (ASM_OUTPUT_REG_POP): Use reg_names for the stack pointer.
+ (ASM_OUTPUT_ADDR_VEC_ELT): Use ASM_GENERATE_INTERNAL_LABEL
+ and assemble_name.
+ (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
+ (PRINT_OPERAND_PUNCT_VALID_P): Accept '|'.
+ (PRINT_OPERAND): Output REGISTER_PREFIX for '|'.
+ (INCOMING_RETURN_ADDR_RTX): Define.
+ * config/vax/vax.md (VUNSPEC_BLOCKAGE)
+ (VUNSPEC_SYNC_ISTREAM): Define.
+ (blockage): Use VUNSPEC_BLOCKAGE.
+ (sync_istream): New insn.
+
+2002-10-01 Richard Henderson <rth@redhat.com>
+
+ * config/vax/vax.md (call_pop, *call_pop, call_value_pop)
+ (*call_value_pop, call, call_value): Add dwarf2 EH support.
+ (*call): New insn.
+
+2002-10-01 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c/8083
+ * c-typeck.c (build_c_cast): Warn about type punning which breaks
+ type based aliasing.
+
+2002-10-01 Mark Mitchell <mark@codesourcery.com>
+
+ * stor-layout.c (update_alignment_for_field): New function.
+ (place_union_field): Use it.
+ (place_field): Likewise.
+
+2002-10-01 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR other/8077
+ * gcc.c (cc1_options): Add space on -auxbase-strip.
+
+2002-10-01 Jim Wilson <wilson@redhat.com>
+
+ * config/v850/v850.h (EPILOGUE_USES): Define.
+
+2002-09-30 Andrew Haley <aph@redhat.com>
+
+ * flow.c (insn_dead_p): When using non-call-exceptions, don't
+ eliminate insns that may trap.
+ * cse.c (insn_live_p): Likewise.
+
+2002-10-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips.h (PROCESSOR_R4121): Rename to PROCESSOR_R4120.
+ (TARGET_MIPS4121): Rename to TARGET_MIPS4120.
+ * config/mips/mips.c (mips_cpu_info): Rename vr4121 to vr4120.
+ * config/mips/mips.md: Apply same renaming here.
+
+2002-10-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips.c (PROCESSOR_R4320, TARGET_MIPS4320): Remove.
+ (GENERATE_MULT3_SI): Remove use of TARGET_MIPS4320.
+ * config/mips/mips.c (mips_cpu_info): Remove vr4320 entry.
+ * config/mips/mips.md (define_attr cpu): Remove r4320.
+ Remove vr4320 scheduler and uses of TARGET_MIPS4320.
+
+2002-10-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips.c (mips16_strings): New variable.
+ (mips_output_function_epilogue): Clear the SYMBOL_REF_FLAG of every
+ symbol in mips16_strings. Free the list.
+ (mips_encode_section_info): Keep track of local strings.
+
+2002-10-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips.md (bunge, bltgt, bungt): New define_expands.
+ (sordered_df, sordered_sf): Remove.
+ * config/mips/mips.c (get_float_compare_codes): New fn.
+ (gen_int_relational, gen_conditional_move): Use it.
+
+2002-10-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips-protos.h (mips_emit_fcc_reload): Declare.
+ * config/mips/mips.h (PREDICATE_CODES): Add fcc_register_operand.
+ * config/mips/mips.c (fcc_register_operand): New function.
+ (mips_emit_fcc_reload): New function, extracted from reload_incc.
+ (override_options): Allow TFmode values in float registers
+ if ISA_HAS_8CC.
+ * cnfig/mips/mips.md (reload_incc): Change destination prediate
+ to fcc_register_operand. Remove misleading source constraint.
+ Use mips_emit_fcc_reload.
+ (reload_outcc): Duplicate reload_incc.
+
+2002-09-30 Zack Weinberg <zack@codesourcery.com>
+
+ * gcc.c (validate_switches): Handle all new forms of spec
+ syntax introduced recently. Now returns a char *.
+ (validate_all_switches): Repetitive logic broken out to...
+ (validate_switches_from_spec): ...here.
+ * mklibgcc.in: Don't @-flag commands to generate .oS files.
+
+2002-09-30 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * longlong.h: Partially synchronize with GMP-4.1 version:
+ Use i370 definitions also for s390.
+ Add generic definition of umul_ppmm in terms of smul_ppmm.
+ [s390] (umul_ppmm): Remove.
+ [s390] (smul_ppmm): Fix incorrect assembler constraints.
+ [s390] (smul_ppmm, sdiv_qrnnd): Rename __xx to __x.
+
+2002-09-30 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.h (REG_CLASS_NAMES, REG_CLASS_CONTENTS):
+ Add new RL_REGS register class.
+ (PREFERRED_RELOAD_CLASS, PREFERRED_OUTPUT_RELOAD_CLASS):
+ Call xtensa_preferred_reload_class for both input and output reloads.
+ * config/xtensa/xtensa.c (xtensa_regno_to_class): Use new RL_REGS class.
+ (xtensa_preferred_reload_class): Handle output reloads; use RL_REGS
+ instead of either AR_REGS or GR_REGS classes.
+ (xtensa_secondary_reload_class): Use new RL_REGS class.
+ * config/xtensa/xtensa-protos.h (xtensa_preferred_reload_class): Update.
+
+2002-09-30 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.c (hppa_encode_label): Don't drop '*' from function labels.
+ (pa_strip_name_encoding): Strip '@' and '*', in that order.
+ * pa.h (ASM_OUTPUT_LABELREF): Output user_label_prefix except when
+ there is a '*' prefix in NAME.
+
+Mon Sep 30 21:33:23 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * reload.c (push_reload): Handle subregs and secondary memory.
+ * reload1.c (gen_reload): Likewise.
+
+ * jump.c (reg_or_subregno): New function.
+ * rtl.h (reg_or_subregno): Declare
+ * unroll.c (find_splittable_givs): Handle subregs.
+
+2002-09-30 Mark Mitchell <mark@codesourcery.com>
+
+ * store-layout.c (finish_record_layout): Add free_p parameter.
+ (layout_type): Pass it.
+ * tree.h (finish_record_layout): Update prototype.
+
+Mon Sep 30 14:57:18 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.h (TARGET_CPP_CPU_BUILTINS): Define __SSE_MATH__.
+
+ * gcse.c (cprop_jump): Check that the register has not
+ been modified
+ (cprop_jump): Likewise.
+
+2002-09-30 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm.h (BASE_REG_CLASS): Always return LO_REGS for Thumb.
+ (MODE_BASE_REG_CLASS, case Thumb): Only return BASE_REGS if we know
+ that we have a SImode access, and only then if reload hasn't completed;
+ for all other cases, use LO_REGS.
+
+2002-09-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * openbsd.h: Fix typo in last change.
+
+2002-09-29 Richard Henderson <rth@redhat.com>
+
+ * real.c (real_from_string): Apply sign last. Tidy exponent handling.
+
+2002-09-29 Richard Henderson <rth@redhat.com>
+
+ PR c/8002
+ * combine.c (force_to_mode): Handle FLOAT_MODE destinations
+ for CONST_INT.
+
+2002-09-29 David Edelsohn <edelsohn@gnu.org>
+
+ * real.h (ibm_extended_format): Declare.
+ * real.c (encode_ibm_extended, decode_ibm_extended): New
+ functions.
+
+2002-09-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * darwin-protos.h (darwin_asm_output_dwarf_delta): Prototype.
+
+ * ia64.c (ia64_hpux_asm_file_end): Const-ify.
+
+2002-09-29 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * expmed.c (extract_bit_field): Fix bit-field extraction from SUBREGs.
+
+2002-09-29 Kazu Hirata <kazu@cs.umass.edu>
+
+ * builtins.def: Fix comment formatting.
+ * c-common.def: Likewise.
+ * cfgcleanup.c: Likewise.
+ * combine.c: Likewise.
+ * gengtype.c: Likewise.
+ * params.def: Likewise.
+ * predict.def: Likewise.
+ * rtl.def: Likewise.
+ * stab.def: Likewise.
+ * stor-layout.c: Likewise.
+ * tree.def: Likewise.
+ * config/darwin.c: Likewise.
+ * config/darwin.h: Likewise.
+ * config/dbxcoff.h: Likewise.
+ * config/elfos.h: Likewise.
+ * config/fp-bit.c: Likewise.
+ * config/freebsd-spec.h: Likewise.
+ * config/interix.h: Likewise.
+ * config/libgloss.h: Likewise.
+ * config/linux-aout.h: Likewise.
+ * config/linux.h: Likewise.
+ * config/lynx-ng.h: Likewise.
+ * config/lynx.h: Likewise.
+ * config/netbsd-aout.h: Likewise.
+ * config/netbsd.h: Likewise.
+ * config/netware.h: Likewise.
+ * config/psos.h: Likewise.
+ * config/ptx4.h: Likewise.
+
+2002-09-28 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog.4: Fix typos.
+ * ChangeLog.6: Likewise.
+ * FSFChangeLog.10: Likewise.
+ * genattrtab.c: Fix comment typos.
+ * haifa-sched.c: Likewise.
+ * real.c: Likewise.
+ * tree.h: Likewise.
+ * config/arm/arm.c: Likewise.
+ * config/arm/crti.asm: Likewise.
+ * config/arm/crtn.asm: Likewise.
+ * config/frv/frv.c: Likewise.
+ * config/frv/frv.md: Likewise.
+ * config/h8300/h8300.md: Likewise.
+ * config/i386/rtemself.h: Likewise.
+ * config/ia64/unwind-ia64.c: Likewise.
+ * config/ip2k/ip2k.h: Likewise.
+ * config/m88k/m88k.c: Likewise.
+ * config/m88k/m88k.md: Likewise.
+ * config/mips/sr71k.md: Likewise.
+ * config/mmix/mmix.c: Likewise.
+ * config/rs6000/rs6000.c: Likewise.
+ * config/sh/sh.md: Likewise.
+
+2002-09-26 Theodore A. Roth <troth@verinet.com>
+
+ * config/avr/avr.c: Eliminate use of _PC_ in pc relative insns.
+ * config/avr/avr.md: Ditto.
+
+2002-09-27 Alexander N. Kabaev <ak03@gte.com>
+
+ PR preprocessor/8055
+ * cppmacro.c (stringify_arg): Do not overflow the buffer
+ with the terminating NUL when the argument to be stringified
+ has no tokens.
+
+2002-09-27 Richard Henderson <rth@redhat.com>
+
+ * unroll.c (simplify_cmp_and_jump_insns): New.
+ (unroll_loop): Use it. Use simplify_gen_foo+force_operand
+ instead of expand_simple_foo.
+
+2002-09-27 Richard Henderson <rth@redhat.com>
+
+ PR optimization/7520
+ * cfganal.c (flow_active_insn_p): New.
+ (forwarder_block_p): Use it.
+
+2002-09-27 Richard Henderson <rth@redhat.com>
+
+ * emit-rtl.c (active_insn_p): Revert last change.
+
+2002-09-27 Jakub Jelinek <jakub@redhat.com>
+
+ * doc/extend.texi (tls_model): Document.
+ * varasm.c (decl_tls_model): New.
+ * c-common.c (handle_tls_model_attribute): New.
+ (c_common_attribute_table): Add tls_model.
+ * config/alpha/alpha.c (alpha_encode_section_info): Use
+ decl_tls_model.
+ * flags.h (enum tls_model, flag_tls_default): Move...
+ * tree.h (enum tls_model, flag_tls_default): ...here.
+ (decl_tls_model): New prototype.
+ * config/ia64/ia64.c (ia64_encode_section_info): Likewise.
+ * config/i386/i386.c (ix86_encode_section_info): Likewise.
+ * config/i386/i386.md (tls_global_dynamic, tls_local_dynamic_base):
+ Allow !flag_pic.
+
+2002-09-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * LANGUAGES: Follow spelling conventions.
+ * rtl.def: Likewise.
+ * sbitmap.c: Likewise.
+ * sched-int.h: Likewise.
+ * sched-rgn.c: Likewise.
+ * sibcall.c: Likewise.
+ * simplify-rtx.c: Likewise.
+ * ssa.c: Likewise.
+ * stab.def: Likewise.
+ * stmt.c: Likewise.
+ * stor-layout.c: Likewise.
+ * target.h: Likewise.
+ * timevar.c: Likewise.
+ * toplev.c: Likewise.
+ * tree-dump.c: Likewise.
+ * tree-inline.c: Likewise.
+ * tree.c: Likewise.
+ * tree.def: Likewise.
+ * tree.h: Likewise.
+ * unroll.c: Likewise.
+ * varasm.c: Likewise.
+ * vmsdbgout.c: Likewise.
+ * treelang/treelang.texi: Likewise.
+ * treelang/treetree.c: Likewise.
+
+2002-09-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.c (compute_saved_regs): Use a macro
+ instead of a hard register number.
+ (get_shift_alg): Use an enumerated type instead of numbers.
+ (h8300_shift_needs_scratch_p): Likewise.
+
+2002-09-26 Kazu Hirata <kazu@cs.umass.edu>
+
+ * varasm.c (force_data_section): Remove.
+ (assemble_constant_align): Likewise.
+ * output.h: Remove corresponding prototypes.
+
+2002-09-26 Roger Sayle <roger@eyesopen.com>
+
+ * stmt.c (expand_exit_loop_if_false): Expand a simple conditional
+ jump, if the loop to exit is the top of the current nesting stack.
+
+2002-09-26 Torbjorn Granlund <tege@swox.com>
+
+ * libgcc2.c (fixunsdfdi, fixunssfdi): Rewrite, avoiding `long long'
+ arithmetic.
+
+2002-09-26 David S. Miller <davem@redhat.com>
+
+ PR optimization/7335
+ * calls.c (emit_library_call_value_1): Passing args by reference
+ converts a CONST function into a PURE one.
+
+2002-09-26 David Edelsohn <edelsohn@gnu.org>
+
+ * dbxout.c (FORCE_TEXT): Switch to current_function_decl, not
+ text_section.
+ * xcoffout.h (DBX_STATIC_BLOCK_START): Remove explicit change to
+ text section.
+ * config/rs6000/rs6000.c (rs6000_override_options): Allow
+ function-sections and data-sections functionality on AIX.
+
+2002-09-26 David Edelsohn <edelsohn@gnu.org>
+ Dale Johannesen <dalej@apple.com>
+
+ * config/rs6000/rs6000.c (rs6000_emit_move): Insert zero-extend
+ in RTL for sub-word loads from memory.
+
+2002-09-26 Richard Henderson <rth@redhat.com>
+
+ PR c/7160
+ * sched-deps.c (sched_analyze_insn): Make clobber insns depend
+ on call insns.
+
+2002-09-26 Richard Henderson <rth@redhat.com>
+
+ * emit-rtl.c (const_double_htab_eq): Remove unused variable.
+
+2002-09-26 Chris Lattner <sabre@nondot.org>
+
+ * ssa.c (rename_insn_1): Handle RENAME_NO_RTX correctly when
+ handling undefined values.
+
+2002-09-26 Richard Henderson <rth@redhat.com>
+
+ PR opt/7520
+ * emit-rtl.c (active_insn_p): Consider a clobber of the
+ function return value to be active even after reload.
+
+2002-09-27 Alan Modra <amodra@bigpond.net.au>
+
+ * doloop.c (doloop_modify_runtime <biv skips initial incr>): Adjust
+ by absolute loop increment, not loop increment.
+
+2002-09-26 Kazu Hirata <kazu@cs.umass.edu>
+
+ * c-common.h: Follow spelling conventions.
+ * cpplex.c: Likewise.
+ * cpplib.h: Likewise.
+ * gthr-dce.h: Likewise.
+ * gthr-posix.h: Likewise.
+ * optabs.c: Likewise.
+ * output.h: Likewise.
+ * profile.c: Likewise.
+ * protoize.c: Likewise.
+ * ra-rewrite.c: Likewise.
+ * real.c: Likewise.
+ * recog.c: Likewise.
+ * reg-stack.c: Likewise.
+ * regclass.c: Likewise.
+ * regmove.c: Likewise.
+ * reload.c: Likewise.
+ * reload.h: Likewise.
+ * reload1.c: Likewise.
+ * reorg.c: Likewise.
+ * resource.c: Likewise.
+ * rtl.h: Likewise.
+ * rtlanal.c: Likewise.
+
+2002-09-26 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/ia64.c (ia64_expand_load_address): Ensure correct mode
+ for symbol address.
+
+2002-09-24 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/elf.h: Add HANDLE_SYSV_PRAGMA.
+ * config/mips/elf64.h: Ditto.
+
+2002-09-24 Eric Christopher <echristo@redhat.com>
+
+ * except.c (expand_builtin_extract_return_address): Handle case
+ where Pmode != ptr_mode.
+
+2002-09-26 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/hpux.h (ASM_OUTPUT_EXTERNAL_LIBCALL): New
+
+2002-09-26 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/hpux.h (TARGET_DEFAULT): Include TARGET_ILP32.
+
+2002-09-26 Igor Shevlyakov <igor@microunity.com>
+
+ * combine.c (simplify_set): Don't call to force_to_mode if size
+ of integer type is larger than HOST_BITS_PER_WIDE_INT.
+
+2002-09-26 Janis Johnson <janis187@us.ibm.com>
+
+ * Makefile.in (qmtest-g++): Fix file path.
+
+2002-09-26 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * expr.c (expand_expr) [MINUS_EXPR]: Convert A - const to
+ A + (-const) on RTX level, even for unsigned types.
+
+2002-09-26 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * reload.c (dup_replacements): New function.
+ (find_reloads): Use it to duplicate replacements at the top level
+ of match_dup operands.
+
+2002-09-26 Miles Bader <miles@gnu.org>
+
+ * v850.md ("length"): Change default value to 4.
+
+2002-09-26 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog.1: Follow spelling conventions.
+ * ChangeLog.4: Likewise.
+ * ChangeLog.6: Likewise.
+ * FSFChangeLog.11: Likewise.
+ * doc/cpp.texi: Likewise.
+ * doc/invoke.texi: Likewise.
+ * doc/tm.texi: Likewise.
+
+2002-09-26 Nick Clifton <nickc@redhat.com>
+
+ * config.gcc: Add x prefix to v850e case for handling
+ --with-cpu=v850e.
+
+2002-09-25 Zack Weinberg <zack@codesourcery.com>
+
+ * gcc.c (input_suffix_matches, switch_matches,
+ mark_matching_switches, process_marked_switches,
+ process_brace_body): New functions - split from handle_braces.
+ (handle_braces): Rewrite; handle %{S:X;T:Y;:D} syntax; accept
+ and ignore whitespace in more places.
+ (specs documentation comment): Document %{S:X;T:Y;:D}.
+ Clarify other %{...} docs.
+ * doc/invoke.texi: Document %{S:X;T:Y;:D}. Clarify other
+ %{...} docs.
+
+ * config/arm/aof.h (LINK_SPEC): Change %{ov*,*} to %{ov*}.
+ * config/rs6000/sysv4.h: Use N-way choice spec syntax.
+
+2002-09-25 David S. Miller <davem@redhat.com>
+
+ PR target/7842
+ * config/sparc/sparc.c (set_extends): SImode ASHIFT does not
+ extend.
+
+2002-09-25 Richard Henderson <rth@redhat.com>
+
+ * emit-rtl.c (const_double_htab_eq): Distinguish integer and
+ fp CONST_DOUBLE; use real_identical.
+
+2002-09-25 Mark Mitchell <mark@codesourcery.com>
+
+ * doc/invoke.texi: Add more -Wabi examples.
+
+2002-09-25 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips.h (TARGET_MIPS4100): Add missing bracket.
+
+2002-09-24 Nathan Sidwell <nathan@codesourcery.com>
+
+ * profile.c (end_branch_prob): Only look for __gcov_init on
+ weak-enabled native compilers.
+
+2002-09-24 Denis Chertykov <denisc@overta.ru>
+
+ * config/ip2k/ip2k.c (function_epilogue): Fix wrong numbers in
+ cases of optimizing "add sp,w" to "inc sp".
+
+2002-09-24 Adam Nemet <anemet@lnxw.com>
+
+ * config/arm/arm.c (thumb_unexpanded_epilogue): Don't generate
+ epilogue for naked functions.
+
+2002-09-24 Adam Nemet <anemet@lnxw.com>
+ Nick Clifton <nickc@redhat.com>
+
+ * config/arm/arm.h (THUMB_FUNCTION_PROFILER): Remove.
+ (FUNCTION_PROFILER): Only invoke THUMB_FUNCTION_PROFILER if it
+ is defined.
+
+2002-09-24 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (preferred_la_operand_p): New function.
+ * config/s390/s390-protos.h (preferred_la_operand_p): Declare it.
+ * config/s390/s390.md ("addaddr_esame", "*la_ccclobber"): Replace by ...
+ ("*la_64_cc", "*la_31_cc", splitters): ... these.
+ ("*la_31"): Deactivate for TARGET_64BIT.
+ ("*la_31_and", "*la_31_and_cc"): New.
+
+2002-09-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * real.h (real_value): Make `exp' explicitly signed.
+
+2002-09-24 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/elfos.h: Follow spelling conventions.
+ * config/alpha/alpha.h: Likewise.
+ * config/arc/arc.h: Likewise.
+ * config/arm/arm.md: Likewise.
+ * config/avr/avr.h: Likewise.
+ * config/cris/cris.md: Likewise.
+ * config/d30v/d30v.h: Likewise.
+ * config/frv/frv.c: Likewise.
+ * config/frv/frv.h: Likewise.
+ * config/h8300/h8300.c: Likewise.
+ * config/h8300/h8300.h: Likewise.
+ * config/h8300/h8300.md: Likewise.
+ * config/i386/cygwin.h: Likewise.
+ * config/i386/i386.h: Likewise.
+ * config/i386/sysv3.h: Likewise.
+ * config/i960/i960.h: Likewise.
+ * config/ia64/ia64.h: Likewise.
+ * config/ia64/ia64.md: Likewise.
+ * config/ip2k/ip2k.h: Likewise.
+ * config/m32r/m32r.h: Likewise.
+ * config/m68k/m68k.h: Likewise.
+ * config/m88k/m88k.h: Likewise.
+ * config/mcore/mcore.c: Likewise.
+ * config/mcore/mcore.h: Likewise.
+ * config/mcore/mcore.md: Likewise.
+ * config/mips/mips.h: Likewise.
+ * config/mmix/mmix.h: Likewise.
+ * config/mmix/mmix.md: Likewise.
+ * config/ns32k/netbsd.h: Likewise.
+ * config/ns32k/ns32k.h: Likewise.
+ * config/ns32k/ns32k.md: Likewise.
+ * config/pa/pa.h: Likewise.
+ * config/romp/romp.h: Likewise.
+ * config/rs6000/rs6000.h: Likewise.
+ * config/rs6000/rs6000.md: Likewise.
+ * config/sparc/sparc.h: Likewise.
+ * config/stormy16/stormy-abi: Likewise.
+ * config/stormy16/stormy16.h: Likewise.
+ * config/vax/vax.h: Likewise.
+
+2002-09-23 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/alpha/alpha.h: Remove commented-out macro
+ definitions of HAVE_{POST|PRE}_{INC|DEC}REMENT.
+ * config/avr/avr.h: Likewise.
+ * config/d30v/d30v.h: Likewise.
+ * config/dsp16xx/dsp16xx.h: Likewise.
+ * config/i370/i370.h: Likewise.
+ * config/i386/i386.h: Likewise.
+ * config/i960/i960.h: Likewise.
+ * config/m68k/m68k.h: Likewise.
+ * config/m88k/m88k.h: Likewise.
+ * config/mips/mips.h: Likewise.
+ * config/ns32k/ns32k.h: Likewise.
+ * config/pdp11/pdp11.h: Likewise.
+ * config/romp/romp.h: Likewise.
+ * config/rs6000/rs6000.h: Likewise.
+ * config/s390/s390.h: Likewise.
+ * config/sh/sh.h: Likewise.
+ * config/sparc/sparc.h: Likewise.
+ * config/stormy16/stormy16.h: Likewise.
+ * config/vax/vax.h: Likewise.
+
+2002-09-23 Kazu Hirata <kazu@cs.umass.edu>
+
+ * function.c (push_temp_slots_for_block): Remove.
+ (push_temp_slots_for_target): Likewise.
+ (get_target_temp_slot_level): Likewise.
+ (set_target_temp_slot_level): Likewise.
+ (get_first_block_beg): Likewise.
+ * function.h: Remove corresponding prototypes.
+
+2002-09-23 Zack Weinberg <zack@codesourcery.com>
+
+ * version.c (version_string): Now const char[].
+ * version.h: Update to match.
+
+2002-09-23 Richard Henderson <rth@redhat.com>
+
+ * config/i386/i386.h (MASK_ACCUMULATE_OUTGOING_ARGS_SET, MASK_MMX_SET,
+ MASK_SSE_SET, MASK_SSE2_SET, MASK_3DNOW_SET, MASK_3DNOW_A_SET): Kill.
+ (TARGET_SWITCHES): Don't reference them.
+ * config/i386/i386.c (override_options): Use target_flags_explicit
+ to examine bits set by the user.
+
+2002-09-23 Dale Johannesen <dalej@apple.com>
+
+ * dbxout.c (dbxout_parms): Set current_sym_code for params
+ passed on stack by invisible reference.
+
+2002-09-23 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm/unknown-elf.h (ASM_OUTPUT_ALIGNED_DECL_LOCAL): Always allocate
+ at least one byte of space.
+
+2002-09-23 Mark Mitchell <mark@codesourcery.com>
+
+ * c-common.h (flag_abi_version): Fix typo in comment.
+ * doc/invoke.texi (flag_abi_version): Document default value.
+
+2002-09-23 Hans-Peter Nilsson <hp@axis.com>
+
+ * doc/extend.texi (Extended Asm): Clarify that overlap between
+ asm-declared register variables used in an asm and the asm clobber
+ list is not allowed.
+ * stmt.c (decl_conflicts_with_clobbers_p): New function.
+ (expand_asm_operands): Keep track of clobbered registers. Call
+ decl_conflicts_with_clobbers_p for each input and output operand.
+ If no conflicts found before, also do conflict sanity check when
+ emitting clobbers.
+
+2002-09-23 Richard Henderson <rth@redhat.com>
+
+ * c-common.c (cpp_define_data_format): Remove.
+ (cb_register_builtins): Don't define __WCHAR_BIT__, __SHRT_BIT__,
+ __INT_BIT__, __LONG_BIT__, __LONG_LONG_BIT__, __FLOAT_BIT__,
+ __DOUBLE_BIT__, __LONG_DOUBLE_BIT__.
+ * doc/cpp.texi: Don't document them either.
+ (__SCHAR_MAX__, __SHRT_MAX__, __INT_MAX__, __LONG_MAX__,
+ __LONG_LONG_MAX__): Document.
+ (__TARGET_FLOAT_FORMAT__): Remove.
+
+2002-09-23 Richard Henderson <rth@redhat.com>
+
+ * real.c (do_multiply): Normalize U before addition.
+
+2002-09-23 Mark Mitchell <mark@codesourcery.com>
+
+ * c-common.c (flag_abi_version): New variable.
+ * c-common.h (flag_abi_version): Declare it.
+ * c-opts.c (missing_arg): Add -fabi-version.
+ (c_common_decode_option): Process -fabi-version.
+ * doc/invoke.texi (-fabi-version): Document it.
+ (-Wabi): Add information about bit-fields in unions.
+
+2002-09-22 Roger Sayle <roger@eyesopen.com>
+
+ * expr.c (STORE_BY_PIECES_P): New target macro.
+ (can_store_by_pieces, store_by_pieces): Use STORE_BY_PIECES_P
+ instead of MOVE_BY_PIECES_P.
+ * doc/tm.texi: Document this new macro.
+
+2002-09-22 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/mips/netbsd.h (SUBTARGET_ASM_SPEC): Always pass -KPIC
+ unless -fno-pic or -fno-PIC is specified.
+
+2002-09-22 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * c-common.c (preprocessing_trad_p): Define.
+ * pa-hiux.h, pa-hpux.h, pa-hpux7.h (CPP_PREDEFINES): Delete.
+ (TARGET_OS_CPP_BUILTINS, SUBTARGET_SWITCHES): Define.
+ * pa-hpux10.h (TARGET_OS_CPP_BUILTINS, CPP_SPEC): Define.
+ * pa-hpux11.h (TARGET_OS_CPP_BUILTINS): Define.
+ * pa-linux.h (CPP_PREDEFINES): Delete.
+ (TARGET_OS_CPP_BUILTINS, CPP_SPEC): Define.
+ * pa32-linux.h, pa64-linux.h (CPP_SPEC): Delete.
+ * pa-osf.h, pa-pro-end.h, rtems.h (CPP_PREDEFINES): Delete.
+ (TARGET_OS_CPP_BUILTINS): Define.
+ * pa.h (MASK_SIO, TARGET_SIO, TARGET_PA_10): Define.
+ (TARGET_SWITCHES): Reformat. Use N_() macro. Add SUBTARGET_SWITCHES.
+ (SUBTARGET_SWITCHES): Provide default definition.
+ (TARGET_OPTIONS): Reformat. Use N_() macro.
+ (CPP_PA10_SPEC, CPP_PA11_SPEC, CPP_PA20_SPEC, CPP_64BIT_SPEC,
+ CPP_CPU_DEFAULT_SPEC, CPP_64BIT_DEFAULT_SPEC, SUBTARGET_EXTRA_SPECS,
+ EXTRA_SPECS, CPP_SPEC, CPLUSPLUS_CPP_SPEC, CPP_PREDEFINES): Delete.
+ (TARGET_CPU_CPP_BUILTINS): Define.
+ (TARGET_OS_CPP_BUILTINS): Define for BSD-like systems.
+ * doc/invoke.texi (msio, mwsio): Document new hppa options.
+ * doc/tm.texi (TARGET_CPU_CPP_BUILTINS): Document macro
+ preprocessing_trad_p().
+
+2002-09-22 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * doc/install.texi: Document behavior of --with-headers and
+ --with-libs when arguments are omitted.
+
+2002-09-22 Kazu Hirata <kazu@cs.umass.edu>
+
+ * dbxout.c: Follow spelling conventions.
+ * defaults.h: Likewise.
+ * df.c: Likewise.
+ * diagnostic.h: Likewise.
+ * doloop.c: Likewise.
+ * dwarf2out.c: Likewise.
+ * dwarfout.c: Likewise.
+ * emit-rtl.c: Likewise.
+ * except.c: Likewise.
+ * explow.c: Likewise.
+ * expmed.c: Likewise.
+ * expr.c: Likewise.
+ * expr.h: Likewise.
+ * flags.h: Likewise.
+ * flow.c: Likewise.
+ * fold-const.c: Likewise.
+ * function.c: Likewise.
+ * function.h: Likewise.
+ * gcc.c: Likewise.
+ * gcov-io.h: Likewise.
+ * gcov.c: Likewise.
+ * gcse.c: Likewise.
+ * genattrtab.c: Likewise.
+ * genconfig.c: Likewise.
+ * genrecog.c: Likewise.
+ * ggc-page.c: Likewise.
+ * ggc.h: Likewise.
+ * global.c: Likewise.
+ * gthr-win32.h: Likewise.
+ * integrate.c: Likewise.
+ * jump.c: Likewise.
+ * langhooks.c: Likewise.
+ * langhooks.h: Likewise.
+ * line-map.h: Likewise.
+ * local-alloc.c: Likewise.
+ * longlong.h: Likewise.
+ * loop.c: Likewise.
+ * loop.h: Likewise.
+
+Tue Aug 27 22:26:35 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.h (BIGGEST_FIELD_ALIGNMENT): Set proper default for x86_64.
+
+Tue Aug 27 20:07:01 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (overwrite_options): Set -mpreferred-stack-boundary to 128
+ for -Os/TARGET_64BIT too.
+
+2002-09-21 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.0: Likewise.
+ * ChangeLog.1: Likewise.
+ * ChangeLog.2: Likewise.
+ * ChangeLog.3: Likewise.
+ * ChangeLog.4: Likewise.
+ * ChangeLog.5: Likewise.
+ * ChangeLog.6: Likewise.
+ * FSFChangeLog.10: Likewise.
+ * FSFChangeLog.11: Likewise.
+ * alias.c: Likewise.
+ * basic-block.h: Likewise.
+ * c-aux-info.c: Likewise.
+ * c-common.c: Likewise.
+ * c-common.h: Likewise.
+ * c-decl.c: Likewise.
+ * c-format.c: Likewise.
+ * c-semantics.c: Likewise.
+ * c-typeck.c: Likewise.
+ * calls.c: Likewise.
+ * cfganal.c: Likewise.
+ * cfgloop.c: Likewise.
+ * collect2.c: Likewise.
+ * combine.c: Likewise.
+ * conflict.c: Likewise.
+ * cppexp.c: Likewise.
+ * cppfiles.c: Likewise.
+ * cpphash.h: Likewise.
+ * cppinit.c: Likewise.
+ * cpplex.c: Likewise.
+ * cpplib.c: Likewise.
+ * cpplib.h: Likewise.
+ * cppmacro.c: Likewise.
+ * cse.c: Likewise.
+
+2002-09-21 Richard Earnshaw <rearnsha@arm.com>
+
+ * netbsd-aout.h (NETBSD_LINK_SPEC_AOUT): New, takes old definition of
+ LINK_SPEC.
+ (LINK_SPEC): Define to NETBSD_LINK_SPEC_AOUT.
+ * arm/netbsd.h (SUBTARGET_EXTRA_SEPCS): Add NETBSD_LINK_SPEC_AOUT.
+ (LINK_SPEC): Rework to use NETBSD_LINK_SPEC_AOUT).
+
+2002-09-21 Richard Earnshaw <rearnsha@arm.com>
+
+ PR opt/7930
+ * cse.c (fold_rtx): Calculate old_cost before we fold each
+ operand.
+
+2002-09-21 Richard Henderson <rth@redhat.com>
+
+ * c-common.c (cpp_define_data_format): Remove __GCC_LITTLE_ENDIAN__,
+ __GCC_BIG_ENDIAN__, __TARGET_BITS_ORDER__, __TARGET_BYTES_ORDER__,
+ __TARGET_INT_WORDS_ORDER__, __TARGET_FLOAT_WORDS_ORDER__,
+ __TARGET_USES_VAX_F_FLOAT__, __TARGET_USES_VAX_D_FLOAT__,
+ __TARGET_USES_VAX_G_FLOAT__, __TARGET_USES_VAX_H_FLOAT__.
+ * doc/cpp.texi: Don't document them.
+
+2002-09-21 Richard Henderson <rth@redhat.com>
+
+ * c-common.c (builtin_define_float_constants): Use real_format
+ to get the floating-point parameters.
+
+2002-09-21 Richard Henderson <rth@redhat.com>
+
+ * real.c (struct real_format): Move to real.h.
+ (real_format_for_mode): Rename from fmt_for_mode; update all users;
+ initialize with ieee defaults.
+ (real_to_target_fmt, real_from_target_fmt): New.
+ (ieee_single_format, ieee_double_format, ieee_extended_motorola_format,
+ ieee_extended_intel_96_format, ieee_extended_intel_128_format,
+ ieee_quad_format, i370_single_format, i370_double_format,
+ c4x_single_format, c4x_extended_format): Rename from s/_format//.
+ (ieee_quad_format): Fix emin.
+ (format_for_size, init_real_once): Remove.
+ * real.h (struct real_format): Move from real.c.
+ (real_format_for_mode): Declare.
+ (real_to_target_fmt, real_from_target_fmt): Declare.
+ (ieee_single_format, ieee_double_format, ieee_extended_motorola_format,
+ ieee_extended_intel_96_format, ieee_extended_intel_128_format,
+ ieee_quad_format, vax_f_format, vax_d_format, vax_g_format,
+ i370_single_format, i370_double_format, c4x_single_format,
+ c4x_extended_format): Declare.
+ * toplev.c (do_compile): Don't call init_real_once.
+
+ * defaults.h (INTEL_EXTENDED_IEEE_FORMAT): Remove.
+ * doc/tm.texi (INTEL_EXTENDED_IEEE_FORMAT): Remove.
+
+ * config/alpha/alpha.h (TARGET_FLOAT_FORMAT): Define.
+ * config/alpha/osf5.h (LONG_DOUBLE_TYPE_SIZE): 64, if vax mode.
+ * config/alpha/alpha.c (override_options): Set real_format_for_mode
+ for VAX, if enabled.
+
+ * config/c4x/c4x.c (c4x_override_options): Set real_format_for_mode
+ for C4X.
+
+ * config/i370/i370.h (OVERRIDE_OPTIONS): New.
+ * config/i370/i370.c (override_options): New.
+ * config/i370/i370-protos.h: Update.
+
+ * config/i386/i386.c (override_options): Set real_format_for_mode
+ for Intel 80-bit extended.
+ * config/i386/i386.h (INTEL_EXTENDED_IEEE_FORMAT): Remove.
+
+ * config/i960/i960.h (LONG_DOUBLE_TYPE_SIZE): Mind -mlong-double-64.
+ (OVERRIDE_OPTIONS): Move code...
+ * config/i960/i960.c (i960_initialize): ... here. Set
+ real_format_for_mode for Intel 80-bit extended.
+
+ * config/ia64/ia64.c (ia64_override_options): Set real_format_for_mode
+ for Intel 80-bit extended, if enabled.
+
+ * config/m68k/m68k.c (override_options): Set real_format_for_mode
+ for Motorola 96-bit extended.
+
+ * config/vax/vax.h (OVERRIDE_OPTIONS): New.
+ * config/vax/vax.c (override_options): New.
+ * config/vax/vax-protos.h: Update.
+
+2002-09-21 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.md (builtin_setjmp_receiver): Add
+ #if TARGET_MACHO.
+
+ * config/rs6000/rs6000.md (floatdisf2_internal2): Combine
+ insns. Supply missing clobber of scratch reg.
+
+2002-09-20 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/m32r/m32r.c: Follow spelling conventions.
+ * config/m32r/m32r.h: Likewise.
+ * config/m32r/m32r.md: Likewise.
+ * config/m68k/m68k.c: Likewise.
+ * config/m88k/m88k.c: Likewise.
+ * config/mcore/mcore.c: Likewise.
+ * config/mips/mips.c: Likewise.
+ * config/mips/mips.h: Likewise.
+ * config/mmix/mmix.c: Likewise.
+ * config/mn10200/mn10200.c: Likewise.
+ * config/ns32k/ns32k.h: Likewise.
+ * config/pa/pa.c: Likewise.
+ * config/pa/pa64-linux.h: Likewise.
+ * config/pdp11/pdp11.h: Likewise.
+ * config/romp/romp.c: Likewise.
+ * config/romp/romp.h: Likewise.
+ * config/rs6000/eabi.asm: Likewise.
+ * config/rs6000/linux64.h: Likewise.
+ * config/rs6000/rs6000.c: Likewise.
+ * config/rs6000/rs6000.h: Likewise.
+ * config/rs6000/rs6000.md: Likewise.
+ * config/rs6000/sysv4.h: Likewise.
+ * config/rs6000/xcoff.h: Likewise.
+
+2002-09-20 Jim Wilson <wilson@redhat.com>
+
+ * config/v850/v850/lib1funcs.asm (__muldi3): Change r5 to r28.
+
+2002-09-20 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.md (UNSPEC_GOTNTPOFF, UNSPEC_INDNTPOFF): New.
+ * config/i386/i386.c (legitimate_pic_address_disp_p): Handle
+ UNSPEC_GOTNTPOFF and UNSPEC_INDNTPOFF like UNSPEC_GOTTPOFF.
+ (legitimate_address_p): Likewise.
+ (legitimize_address): Use @gotntpoff and @indntpoff.
+ (output_pic_addr_const): Handle UNSPEC_GOTNTPOFF and UNSPEC_INDNTPOFF.
+ (output_addr_const_extra): Likewise.
+
+2002-09-20 Jim Wilson <wilson@redhat.com>
+
+ * combine.c (try_combine): When split an instruction pair, where the
+ first has a sign_extend src, verify that the src and dest modes match.
+
+2002-09-20 Richard Henderson <rth@redhat.com>
+
+ * config/mips/mips.c (dfhigh, dflow, sfhigh, sflow): Remove.
+ (override_options): Do not initialize them.
+ (mips_const_double_ok): Allow no fp constants except zero,
+ and not even that for mips16.
+ (const_float_1_operand): Use dconst1.
+ * config/mips/mips.md (movsf, movsf_internal1, movsf_internal2,
+ movdf, movdf_internal1, movdf_internal1a, movdf_internal2):
+ Don't allow arbitrary constants; fix predicates and C constraint.
+
+2002-09-20 Neil Booth <neil@daikokuya.co.uk>
+
+ * cppmacro.c: Don't warn about function-like macros without
+ '(' during pre-expansion.
+
+2002-09-20 Jim Wilson <wilson@redhat.com>
+
+ * config/v850/v850.c (current_function_anonymous_args): Delete.
+ (expand_prologue): Use current_function_args_info.anonymous_args.
+ (expand_epilogue): Delete use of current_function_anonymous_args.
+ * config/v850/v850.h (struct cum_arg): Add anonymous_args field.
+ (INIT_CUMULATIVE_ARGS): Clear anonymous_args field.
+ (current_function_anonymous_args): Delete extern declaration.
+ (SETUP_INCOMING_VARARGS): Set anonymous_args field.
+
+2002-09-20 Geoffrey Keating <geoffk@apple.com>
+
+ * config/rs6000/rs6000.c (rs6000_emit_prologue): Update for change
+ to load_macho_picbase.
+ * config/rs6000/rs6000.md: Document Darwin-specific unspec IDs.
+ (load_macho_picbase): Take the symbol to use as a parameter.
+ (macho_correct_pic): New insn.
+ (builtin_setjmp_reciever): On Darwin, restore the PIC register.
+
+ * config/rs6000/rs6000.h (ELIMINABLE_REGS): Use
+ RS6000_PIC_OFFSET_TABLE_REGNUM rather than hardcoding 30.
+ (CAN_ELIMINATE): Likewise.
+ (INITIAL_ELIMINATION_OFFSET): Likewise.
+ (TOC_REGISTER): Likewise.
+
+2002-09-20 Richard Henderson <rth@redhat.com>
+
+ * real.c (real_hash): New.
+ * real.h: Declare it.
+ * cse.c (canon_hash): Use it.
+ * cselib.c (hash_rtx): Likewise.
+ * emit-rtl.c (const_double_htab_hash): Likewise.
+ * rtl.h (CONST_DOUBLE_REAL_VALUE): New.
+ * varasm.c (struct rtx_const): Reduce vector size; separate
+ integer and fp vectors.
+ (HASHBITS): Remove.
+ (const_hash_1): Rename from const_hash. Use real_hash. Do not
+ take modulus MAX_HASH_TABLE.
+ (const_hash): New. Do take modulus MAX_HASH_TABLE.
+ (output_constant_def): Do not take modulus MAX_HASH_TABLE.
+ (SYMHASH): Don't use HASHBITS.
+ (decode_rtx_const): Copy only active bits from REAL_VALUE_TYPE.
+ Fix CONST_VECTOR thinko wrt fp vectors. Fix kind comparison.
+ (simplify_subtraction): Fix kind comparison.
+ (const_hash_rtx): Return unsigned int. Don't use HASHBITS.
+ Use a union to pun integer array.
+ * config/rs6000/rs6000.c (rs6000_hash_constant): Use real_hash;
+ only hash two words of integral CONST_DOUBLE.
+
+2002-09-20 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/hpux.h (STARTFILE_SPEC): Modify.
+ (STARTFILE_PREFIX_SPEC): New.
+ (LINK_SPEC): Modify.
+ (LIB_SPEC): Modify.
+ (LIBGCC_SPEC): New.
+
+2002-09-20 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.c (legitimate_pic_address_disp_p): Allow
+ UNSPEC_NTPOFF and UNSPEC_DTPOFF to be offsetted by constant.
+
+2002-09-20 Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
+
+ * config/arm/arm.md (sign_extract_onebit, not_signextract_onebit):
+ Add clobber of the condition code register.
+
+2002-09-20 Richard Henderson <rth@redhat.com>
+
+ * real.c (do_fix_trunc): Static.
+ (encode_ieee_single, encode_ieee_double, encode_ieee_extended,
+ encode_ieee_quad, encode_vax_f, encode_vax_d, encode_vax_g,
+ encode_i370_single, encode_i370_double, encode_c4x_single,
+ encode_c4x_extended): Add default abort case.
+
+2002-09-20 Richard Henderson <rth@redhat.com>
+
+ * real.h (enum real_value_class, SIGNIFICAND_BITS, EXP_BITS,
+ MAX_EXP, SIGSZ, SIG_MSB, struct real_value): Move from real.c.
+ (struct realvaluetype): Remove.
+ (REAL_VALUE_TYPE): Use struct real_value.
+ (REAL_VALUE_TYPE_SIZE): Use SIGNIFICAND_BITS.
+ (test_real_width): New.
+ * real.c: Global replace struct real_value with REAL_VALUE_TYPE.
+ (real_arithmetic): Avoid hoops for REAL_VALUE_TYPE parameters.
+ (real_compare, real_exponent, real_ldexp, real_isinf, real_isnan,
+ real_isneg, real_isnegzero, real_identical, exact_real_inverse,
+ real_to_integer, real_to_integer2, real_to_decimal,
+ real_to_hexadecimal, real_from_string, real_from_integer,
+ real_inf, real_nan, real_2expN, real_convert, real_to_target,
+ real_from_target): Likewise.
+ * tree.h (struct tree_real_cst): Use real_value not realvaluetype.
+ * gengtype-yacc.y (bitfieldopt): Accept an ID as well.
+
+2002-09-20 Richard Henderson <rth@redhat.com>
+
+ * real.h (UNKNOWN_FLOAT_FORMAT, IEEE_FLOAT_FORMAT, VAX_FLOAT_FORMAT,
+ IBM_FLOAT_FORMAT, C4X_FLOAT_FORMAT, TARGET_FLOAT_FORMAT): Move ...
+ * defaults.h: ... here.
+ * config/arm/arm.h, config/avr/avr.h, config/d30v/d30v.h,
+ config/fr30/fr30.h, config/frv/frv.h, config/ia64/ia64.h,
+ config/ip2k/ip2k.h, config/mips/mips.h, config/stormy16/stormy16.h,
+ config/xtensa/xtensa.h (TARGET_FLOAT_FORMAT): Remove.
+
+2002-09-20 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.md ("negdf2"): Rewrite.
+ ("*expanded_negdf2"): New.
+
+2002-09-19 Jim Wilson <wilson@redhat.com>
+
+ * combine.c (simplify_set): When optimizing a subreg src with a
+ cc0 dest, use GET_MODE (src) for mask instead of inner_mode.
+
+2002-09-19 Dale Johannesen <dalej@apple.com>
+ * combine.c (make_extraction): Don't create
+ invalid subreg.
+
+2002-09-19 Roger Sayle <roger@eyesopen.com>
+
+ * tree.c (integer_nonzerop): New predicate for nonzero integers.
+ * tree.h (integer_nonzerop): Add function prototype.
+ * stmt.c (expand_end_loop): Don't rotate the loop when there
+ are no instructions in the test, i.e. the loop is unconditional.
+ (expand_exit_loop_if_false): Optimize RTL generation of loop
+ tests when the condition is always true or always false.
+ * c-semantics.c (genrtl_do_stmt): Optimize RTL generation of
+ do-loops when the condition is always true.
+ (genrtl_for_stmt): Optimize RTL generation of for-loops when
+ the for-expression is empty.
+
+2002-09-19 Zack Weinberg <zack@codesourcery.com>
+
+ * gcc.c (use_pipes): New flag.
+ (process_command): Set it. Adjust check for -pipe conflicting
+ with -time or -save-temps.
+ (do_spec_1): Use it. Handle %|SUFFIX, %mSUFFIX, and
+ %<SWITCH. Drop %| (without a SUFFIX).
+ (handle_braces): Drop %{<SWITCH}, %{^SWITCH}, %{|...}.
+ (give_switch): Third argument eliminated.
+ (invoke_as, @assembler_with_cpp spec): Use %|.s or %m.s
+ depending on AS_NEEDS_DASH_FOR_PIPED_INPUT.
+ (specs documentation comment): Update.
+
+ * config/netbsd-aout.h, config/openbsd.h, config/ptx4.h,
+ config/svr4.h, config/i386/freebsd-aout.h,
+ config/m68k/netbsd-elf.h, config/m68k/netbsd.h,
+ config/m68k/openbsd.h, config/mips/openbsd.h,
+ config/sparc/sparc.h: Define AS_NEEDS_DASH_FOR_PIPED_INPUT
+ instead of putting %| into ASM_SPEC and/or ASM_FINAL_SPEC.
+ * config/avr/avr.h: Delete do-nothing ASM_FINAL_SPEC.
+ * config/cris/cris.h: Update comment.
+
+ * ada/lang-specs.h: Use %(invoke_as). Straighten out
+ error messages. Don't use %{^SWITCH}.
+ * ada/misc.c (gnat_decode_option): Handle -I with a
+ separate argument.
+
+ * f/lang-specs.h: Use %| and %m.
+ * java/jvspec.c: Use %m and %(invoke_as). Change all
+ uses of %{<SWITCH} to %<SWITCH.
+
+ * doc/invoke.texi: Update documentation of specs.
+ * doc/tm.texi: Document AS_NEEDS_DASH_FOR_PIPED_INPUT.
+
+2002-09-19 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (addr_generation_dependency_p): Handle SUBREG
+ and STRICT_LOW_PART within SET_DEST.
+ * config/s390/s390.md ("*extractqi", "*extracthi"): New insns with
+ splitters, replacing pre-reload splitters.
+ ("*zero_extendhisi2_31", "*zero_extendqisi2_31",
+ "*zero_extendqihi2_31"): New insns.
+ ("*zero_extendqihi2_64"): Do not clobber CC.
+
+2002-09-18 Devang Patel <dpatel@apple.com>
+
+ * cp/cp-tree.h: New prototype for walk_vtables().
+ * cp/decl.c (walk_vtables_r): New function.
+ (struct cp_binding_level): Add new members, namespaces,
+ names_size and vtables.
+ (add_decl_to_level): Add decl in namespaces or vtables
+ chain, if conditions match.
+ (walk_vtables): New function.
+ (walk_namespaces_r): Travers separate namespace chain
+ for namespace decls.
+ (wrapup_globals_for_namespace): Use names_size instead
+ of list_length().
+ * cp/decl2.c (finish_file): Use walk_vtables() instead of
+ walk_globals() to walk vtable decls.
+
+2002-09-19 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/hpux.h (CTORS_SECTION_ASM_OP): New.
+ (DTORS_SECTION_ASM_OP): Ditto.
+ (READONLY_DATA_SECTION_ASM_OP): Moved.
+ (DATA_SECTION_ASM_OP): New.
+ (SDATA_SECTION_ASM_OP): New.
+ (BSS_SECTION_ASM_OP): New.
+ (SBSS_SECTION_ASM_OP): New.
+ (TEXT_SECTION_ASM_OP): New.
+
+2002-09-19 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/fp-bit.c: Follow spelling conventions.
+ * config/d30v/d30v.c: Likewise.
+ * config/d30v/d30v.h: Likewise.
+ * config/fr30/fr30.c: Likewise.
+ * config/fr30/fr30.h: Likewise.
+ * config/fr30/fr30.md: Likewise.
+ * config/frv/frv.c: Likewise.
+ * config/frv/frv.h: Likewise.
+ * config/h8300/h8300.c: Likewise.
+ * config/h8300/lib1funcs.asm: Likewise.
+ * config/i370/i370.c: Likewise.
+ * config/i386/i386.h: Likewise.
+ * config/i386/i386.md: Likewise.
+ * config/i386/pentium.md: Likewise.
+ * config/i386/winnt.c: Likewise.
+ * config/i960/i960.c: Likewise.
+ * config/ia64/ia64.h: Likewise.
+ * config/ip2k/ip2k.c: Likewise.
+ * config/ip2k/ip2k.h: Likewise.
+ * config/ip2k/ip2k.md: Likewise.
+ * config/ip2k/libgcc.S: Likewise.
+
+2002-09-19 Stephen Clarke <stephen.clarke@superh.com>
+
+ * config/sh/sh.h (UNSPEC_GOTOFF_P): Define.
+ (GOTOFF_P): Extend to allow gotoff plus constant.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * ifcvt.c (noce_process_if_block): Correctly detect X modified
+ with INSN_B before COND_EARLIEST. Don't check A and B for
+ modification in condition range. Reorder INSN_B for A==B properly.
+ (if_convert): Iterate until no matches for a block.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * calls.c (store_one_arg): Rename default_align to parm_align;
+ always adjust parm_align for downward padding.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * toplev.c (backend_init): Move init_real_once invocation ...
+ (do_compile): ... here.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * sibcall.c (optimize_sibling_and_tail_recursive_call): Also remove
+ RTX_UNCHANGING_P markers for successful tail-recursive replacement.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * real.c (round_for_format): Collect sticky as unsigned long, not bool.
+
+2002-09-19 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.md: (floatdisf2): Rename to
+ floatdisf2_internal1.
+ (floatdisf2): New define_expand.
+ (floatdisf2_internal2): Likewise.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * real.c (sticky_rshift_significand): Collect sticky as
+ unsigned long, not bool.
+
+2002-09-18 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_address_cost): New function.
+ config/s390/s390-protos.h (s390_address_cost): Add prototype.
+ config/s390/s390.h (ADDRESS_COST): Call s390_address_cost.
+ (RTX_COST): Use COSTS_N_INSNS.
+
+2002-09-18 Douglas Rupp <rupp@gnat.com>
+ Donn Terry <donnte@microsoft.com>
+
+ * stor-layout.c (place_field): Handle alignment of whole
+ structures when MSVC compatible bitfields are involved.
+ Change method of computing location of MS bitfields to
+ be compatible with #pragma pack(n).
+
+ * tree.h (record_layout_info): Add new field
+ remaining_in_alignment.
+
+ * doc/tm.texi: (TARGET_MS_BITFIELD_LAYOUT_P): Update.
+ (pragma pack): Add paragraph on MSVC bitfield packing.
+
+2002-09-18 Richard Earnshaw (reanrsha@arm.com)
+
+ PR optimization/7967
+ * arm.md (ne_zeroextractsi): Add clobber of the condition code
+ register.
+
+2002-09-18 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/s390/s390.c: Follow spelling conventions.
+ * config/sh/lib1funcs.asm: Likewise.
+ * config/sh/sh.c: Likewise.
+ * config/sh/sh.h: Likewise.
+ * config/sparc/sparc.c: Likewise.
+ * config/sparc/sparc.h: Likewise.
+ * config/sparc/sparc.md: Likewise.
+ * config/stormy16/stormy16.c: Likewise.
+ * config/stormy16/stormy16.h: Likewise.
+ * config/v850/v850.c: Likewise.
+ * config/v850/v850.h: Likewise.
+ * config/vax/vax.c: Likewise.
+ * config/vax/vax.h: Likewise.
+
+2002-09-18 Nick Clifton <nickc@redhat.com>
+
+ * config/rs60000/rs6000.c (rs6000_emit_move): Handle V1DImode moves.
+ * config/rs60000/rs6000.c (SPE_VECTOR_MODE): Include V1DImode.
+ * config/rs6000/spe.md (movv1di, movv1di_internal): New patterns.
+
+2002-09-17 Kazu Hirata <kazu@cs.umass.edu>
+
+ * function.c (max_parm_reg_num): Remove.
+ * stmt.c (in_control_zone_p, stmt_loop_nest_empty,
+ drop_through_at_end_p, move_cleanups_up,
+ expand_end_case_dummy, case_index_expr_type): Likewise.
+ * stor-layout.c (pos_from_byte): Likewise.
+ * tree.c (chain_member_value, chain_member_purpose, listify,
+ tree_int_cst_msb, index_type_equal): Likewise.
+ * tree.h: Remove prototypes for unused functions.
+
+2002-09-17 Zack Weinberg <zack@codesourcery.com>
+
+ * ABOUT-GCC-NLS: Remove reference to enquire, and out-of-date
+ statement that the only translation is to en_UK.
+
+2002-09-17 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/alpha/alpha.c: Follow spelling conventions.
+ * config/alpha/alpha.h: Likewise.
+ * config/alpha/alpha.md: Likewise.
+ * config/arc/arc.h: Likewise.
+ * config/arm/arm.c: Likewise.
+ * config/arm/arm.h: Likewise.
+ * config/arm/arm.md: Likewise.
+ * config/arm/pe.c: Likewise.
+ * config/arm/unknown-elf.h: Likewise.
+ * config/avr/avr.c: Likewise.
+ * config/avr/avr.h: Likewise.
+ * config/c4x/c4x.c: Likewise.
+ * config/cris/cris.c: Likewise.
+ * config/cris/cris.h: Likewise.
+
+2002-09-17 Samuel Figueroa <figueroa@apple.com>
+
+ * final.c (final_scan_insn): Use new macro ASM_OUTPUT_ALIGN_WITH_NOP.
+ * config/sparc/sparc.h (ASM_OUTPUT_ALIGN_WITH_NOP) New macro.
+ * doc/tm.texi (ASM_OUTPUT_ALIGN_WITH_NOP) New description.
+
+2002-09-17 Dale Johannesen <dalej@apple.com>
+
+ * cfgcleanup.c (try_forward_edges): Do not forward a
+ branch to just after a loop exit before loop optimization;
+ this interfered with doloop detection.
+
+2002-09-17 Nick Clifton <nickc@redhat.com>
+
+ * config/arm/arm.c (output_return_instruction): Do not
+ writeback the stack pointer when it is being loaded.
+ (arm_output_epilogue): Likewise.
+
+2002-09-17 Kazu Hirata <kazu@cs.umass.edu>
+
+ * optabs.c (prepare_cmp_insn): Let emit_library_call_value
+ generate a pseudo reg that receives the result of a libcall.
+ (prepare_float_lib_cmp): Likewise.
+
+2002-09-17 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/elf.h: Remove CPP_PREDEFINES.
+
+Tue Sep 17 13:58:04 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ Fix PR/7014 and related objc bugs:
+ * c-typeck.c (comp_target_types): Added a reflexive argument.
+ Pass it to ObjC when/if calling objc_comptypes(). Updated all
+ callers to provide the appropriate reflexive argument.
+ * objc/objc-act.c (objc_comptypes): Carefully checked and fixed
+ typechecking for all cases of comparisons and assignments,
+ particularly the obscure and less common ones involving protocols.
+
+2002-09-17 Nick Clifton <nickc@redhat.com>
+
+ * machmode.def (V1DImode): New mode. A single element vector.
+ * tree.h (TI_UV1DI_TYPE, TI_V1DI_TYPE): New tree_index enums.
+ (unsigned_V1DI_type_node, V1D1_type_node): New type nodes.
+ * tree.c (build_common_tree_nodes_2): Build
+ unsigned_V1DI_type_node and V1D1_type_node.
+ * c-common.c (c_common_type_for_mode): Return
+ unsigned_V1DI_type_node or V1D1_type_node for V1DImode.
+ * rtl.c (class_narrowest_): Start integer vector nodes with V1DImode.
+
+Tue Sep 17 13:40:13 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * doc/objc.texi (Constant string objects): Extended documentation
+ to make clear that the constant string class ivar layout is
+ completely fixed.
+
+2002-09-17 Roger Sayle <roger@eyesopen.com>
+
+ * cfgrtl.c (flow_delete_block_noexpunge): Delete orphaned
+ NOTE_INSN_LOOP_CONT notes when deleting basic blocks.
+
+2002-09-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ * config/mips/mips.c (save_restore_insns): Remove unused variable.
+ * gcc.c (make_relative_prefix): Likewise.
+ * loop.c (check_final_value): Likewise.
+ * jump.c (init_label_info): Remove return value.
+ * cse.c (prev_insn): Move variable between #ifdef HAVE_cc0 ... #endif.
+
+2002-09-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * dsp16xx.h (ASM_FORMAT_PRIVATE_NAME): Delete.
+ (ASM_PN_FORMAT): Define.
+
+2002-09-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * alpha.h, alpha/vms.h, arc.h, arm/aof.h, arm/aout.h, avr.h,
+ c4x.h, cris.h, d30v.h, fr30.h, frv.h, h8300.h, i370.h, i386.h,
+ i960.h, ia64.h, ip2k.h, m32r.h, m68hc11.h, m68k/3b1.h,
+ m68k/hp320.h, m68k.h, m68k/mot3300.h, m68k/sgs.h, m68k/tower-as.h,
+ m88k.h, mcore.h, mips.h, mmix.h, mn10200.h, mn10300.h, ns32k.h,
+ pa.h, pdp11.h, romp.h, rs6000.h, s390/linux.h, sh.h, sparc.h,
+ stormy16.h, v850.h, vax.h, xtensa.h (ASM_FORMAT_PRIVATE_NAME):
+ Delete.
+ * alpha/vms.h, h8300.h, i370.h, ia64.h, m68k/3b1.h, m68k/hp320.h,
+ m68k/mot3300.h, m68k/sgs.h, m68k/tower-as.h, mmix.h, mn10200.h,
+ mn10300.h, pa.h, v850.h (ASM_PN_FORMAT): Define.
+
+ * defaults.h (ASM_PN_FORMAT, ASM_FORMAT_PRIVATE_NAME): Define.
+ * doc/tm.texi (ASM_FORMAT_PRIVATE_NAME): Update documentation.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * expr.c (emit_block_move): Set memory block size as appropriate
+ for the copy.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ PR fortran/3924
+ * sdbout.c (sdbout_symbol): Don't handle offsets from a symbol.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * emit-rtl.c (set_mem_attributes_minus_bitpos): Adjust SIZE
+ as well as OFFSET for BITPOS.
+
+2002-09-16 Jeff Garzik <jgarzik@mandrakesoft.com>
+
+ * config.gcc: Treat winchip_c6-*|winchip2-*|c3-* as pentium-mmx.
+ * config/i386/i386.c (processor_alias_table): Add winchip-c6,
+ winchip2 and c3.
+ * doc/invoke.texi: Mention new aliases.
+
+2002-09-16 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * calls.c (store_one_arg): Set default alignment for BLKmode arguments
+ to BITS_PER_UNIT when ARGS_GROW_DOWNWARD and the padding direction is
+ downward.
+ * function.c (pad_below): Always compile.
+ (locate_and_pad_parm): If defined ARGS_GROW_DOWNWARD, pad argument to
+ alignment when it is not in a register or REG_PARM_STACK_SPACE is true.
+ Pad below when the argument is not in a register and the padding
+ direction is downward.
+
+ * pa-64.h (MUST_PASS_IN_STACK): Move define to pa.h.
+ (PAD_VARARGS_DOWN): Define.
+ * pa.c (function_arg_padding): Revise padding directions to make them
+ compatible with the 32 and 64-bit runtime architecture documentation.
+ (hppa_va_arg): Add code to handle variable and size zero arguments
+ passed by reference on TARGET_64BIT. Reformat.
+ (function_arg): Use a PARALLEL for BLKmode and aggregates args on
+ TARGET_64BIT. Use a DImode PARALLEL for BLKmode args 5 to 8 bytes
+ wide when !TARGET_64BIT. Move forward check for mode==VOIDmode.
+ Add comments.
+ * pa.h (MAX_PARM_BOUNDARY): Correct define for TARGET_64BIT.
+ (RETURN_IN_MEMORY): Return size zero types in memory.
+ (FUNCTION_VALUE): Return TFmode in general registers.
+ (MUST_PASS_IN_STACK): Define.
+ (FUNCTION_ARG_BOUNDARY): Simplify.
+ (FUNCTION_ARG_PASS_BY_REFERENCE): Pass variable and zero sized types
+ by reference.
+ (FUNCTION_ARG_CALLEE_COPIES): Define to FUNCTION_ARG_PASS_BY_REFERENCE.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * real.c (do_fix_trunc): New.
+ (real_arithmetic): Call it.
+ * simplify-rtx.c (simplify_unary_operation): Handle FIX
+ with a floating-point result mode.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * builtin-types.def (BT_FN_FLOAT_CONST_STRING): New.
+ (BT_FN_DOUBLE_CONST_STRING, BT_FN_LONG_DOUBLE_CONST_STRING): New.
+ * builtins.def (__builtin_nan, __builtin_nanf, __builtin_nanl): New.
+ (__builtin_nans, __builtin_nansf, __builtin_nansl): New.
+ * builtins.c (fold_builtin_nan): New.
+ (fold_builtin): Call it.
+ * real.c (real_nan): Parse a non-empty string.
+ (round_for_format): Fix NaN significand truncation.
+ * real.h (real_nan): Return bool.
+ * doc/extend.texi: Document new builtins.
+
+2002-09-16 Jason Merrill <jason@redhat.com>
+ Danny Smith <dannysmith@users.sourceforge.net>
+
+ * config/i386/winnt.c (ix86_handle_dll_attribute): Set
+ DECL_EXTERN and TREE_PUBLIC for dllimported variables here...
+ (i386_pe_mark_dllimport): Not here.
+
+2002-09-16 Nathan Sidwell <nathan@codesourcery.com>
+
+ * c-semantics.c (genrtl_do_stmt): Cope with NULL cond.
+
+2002-09-16 Geoffrey Keating <geoffk@redhat.com>
+
+ * config/rs6000/rs6000.c (build_mask64_2_operands): Suppress
+ warnings about unused operands when HOST_BITS_PER_WIDE_INT is
+ < 64.
+ (rs6000_emit_cmove): Use real_isinf not target_isinf.
+
+2002-09-16 Kazu Hirata <kazu@cs.umass.edu>
+
+ * calls.c (emit_library_call_value_1): Don't refer to
+ hard_libcall_value.
+ * optabs.c (prepare_float_lib_cmp): Likewise.
+
+2002-09-16 Geoffrey Keating <geoffk@apple.com>
+
+ * ggc-common.c (ggc_mark_rtx_children_1): Update for changed name
+ mangling.
+
+ The following changes are merged from pch-branch:
+
+ * doc/gty.texi (GTY Options): Document %a.
+ * gengtype.c (do_scalar_typedef): New function.
+ (process_gc_options): Handle `length' option.
+ (set_gc_used_type): A pointer to an array of structures doesn't
+ qualify as a pointer to a structure.
+ (output_escaped_param): Add `%a' escape.
+ (write_gc_structure_fields): Allow 'desc' on array of unions.
+ (main): Define `uint8', `jword' and `JCF_u2' as scalars; use
+ do_scalar_typedef.
+
+ * gengtype.c (enum rtx_code): Make global.
+ (rtx_format): Make global.
+ (rtx_next): New.
+ (gen_rtx_next): New.
+ (write_rtx_next): New.
+ (adjust_field_rtx_def): Skip fields marked by chain_next.
+ (open_base_files): Delete redundant prototype.
+ (write_enum_defn): New.
+ (output_mangled_typename): Correct abort call.
+ (write_gc_marker_routine_for_structure): Handle chain_next and
+ chain_prev options.
+ (finish_root_table): Don't output redundant \n.
+ (main): Call gen_rtx_next, write_rtx_next, write_enum_defn.
+ * c-tree.h (union lang_tree_node): Add chain_next option.
+
+ * gengtype.h (NUM_PARAM): New definition.
+ (struct type): For TYPE_PARAM_STRUCT, allow multiple parameters.
+ * gengtype.c (find_param_structure): New.
+ (adjust_field_type): Handle param<n>_is option.
+ (process_gc_options): Detect use_params option. Update callers.
+ (set_gc_used_type): Add 'param' parameter, update callers. Handle
+ 'use_params' option.
+ (open_base_files): Add splay-tree.h to list of files included.
+ (output_mangled_typename): New.
+ (write_gc_structure_fields): Update 'param' parameter to support
+ multiple parameters. Change name mangling. Allow parameterized
+ fields to have an apparent scalar type. Handle param<n>_is options,
+ use_param option.
+ (write_gc_marker_routine_for_structure): Update for change to name
+ mangling. Better guess the output file for parameterized types.
+ (write_gc_types): Update for change to name mangling.
+ (write_gc_root): Update for change to name mangling. Handle (ignore)
+ param<n>_is options.
+ * doc/gty.texi (GTY Options): Add description of param<n>_is
+ options, use_params option.
+ * ggc.h (ggc_mark_rtx): Update for changed name mangling.
+ * gengtype-lex.l: Produce token for param<n>_is.
+ * gengtype-yacc.y: Parse param<n>_is.
+
+ * gengtype.c (adjust_field_tree_exp): Don't name a variable 'rindex'.
+
+ * rtl.c: Update comment describing rtx_format.
+ * rtl.h (union rtunion): Separate definition and typedef.
+ (struct rtx_def): Use gengtype to mark.
+ * Makefile.in (gengtype.o): Also depend on rtl.def.
+ * ggc.h (ggc_mark_rtx_children): Delete prototype.
+ (ggc_mark_rtx): Change to alias of gengtype-generated routine.
+ * ggc-common.c (ggc_mark_rtx_children): Delete.
+ (ggc_mark_rtx_children_1): Delete.
+ (gt_ggc_m_rtx_def): Delete.
+ * gengtype.c (adjust_field_rtx_def): New.
+ (adjust_field_type): Call adjust_field_rtx_def.
+ (write_gc_structure_fields): Add 'default' case to switch if none
+ is specified; remove unused code.
+
+ * tree.h (struct tree_exp): Update for change to meaning
+ of special.
+ * gengtype.c (adjust_field_tree_exp): New function.
+ (adjust_field_type): Handle `tree_exp' special here.
+ (write_gc_structure_fields): Don't handle `tree_exp' special here.
+ Handle new `dot' option.
+
+ * gengtype.h: Make `info' a pointer-to-const.
+ * gengtype-yacc.y (yacc_ids): Use xasprintf.
+
+ * gengtype.c (write_gc_structure_fields): Remove implementation
+ of `always' option, add `default' option.
+ * doc/gty.texi (GTY Options): Remove documentation of `always',
+ add `default'.
+
+2002-09-16 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * output.h: Remove #ifdef RTX_CODE and #ifdef TREE_CODE.
+
+2002-09-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * m68hc11.md (addhi_sp): Fix uninitialized variable bug.
+
+ * c4x-c.c, c4x.c, darwin.c, i370-c.c, m32r.c: Include tm_p.h
+ instead of the *-protos.h file directly.
+ * t-c4x, t-i370, t-v850: Depend on $(TM_P_H).
+ * darwin.c (machopic_output_stub): Move prototype ...
+ * darwin-protos.h (machopic_output_stub): ... here.
+ * rs6000-protos.h (machopic_output_stub): Don't declare.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * c-common.c (builtin_define_float_constants): Emit __FOO_DENORM_MIN__.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * real.c, real.h: Rewrite from scratch.
+
+ * Makefile.in (simplify-rtx.o): Depend on TREE_H.
+ (paranoia): New target.
+ * builtins.c (fold_builtin_inf): Use new real.h interface.
+ * c-common.c (builtin_define_with_hex_fp_value): Likewise.
+ * c-lex.c (interpret_float): Likewise.
+ * emit-rtl.c (gen_lowpart_common): Likewise.
+ * optabs.c (expand_float): Use real_2expN.
+ * config/ia64/ia64.md (divsi3, udivsi3): Likewise.
+ * defaults.h (INTEL_EXTENDED_IEEE_FORMAT): New.
+ (FLOAT_WORDS_BIG_ENDIAN): New.
+ * cse.c (find_comparison_args): Don't pass FLOAT_STORE_FLAG_VALUE
+ directly to REAL_VALUE_NEGATIVE.
+ * loop.c (canonicalize_condition): Likewise.
+ * simplify-rtx.c: Include tree.h.
+ (simplify_unary_operation): Don't handle FIX and UNSIGNED_FIX
+ with floating-point result modes.
+ * toplev.c (backend_init): Call init_real_once.
+
+ * fold-const.c (force_fit_type): Don't call CHECK_FLOAT_VALUE.
+ * tree.c (build_real): Likewise.
+ * config/alpha/alpha.c, config/vax/vax.c (float_strings,
+ float_values, inited_float_values, check_float_value): Remove.
+ * config/alpha/alpha.h, config/m68hc11/m68hc11.h,
+ config/m88k/m88k.h, config/vax/vax.h (CHECK_FLOAT_VALUE): Remove.
+ * doc/tm.texi (CHECK_FLOAT_VALUE): Remove.
+ (VAX_HALFWORD_ORDER): Remove.
+
+2002-09-16 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c: (legitimize_la_operand): Remove, replace by ...
+ (s390_load_address): ... this new function.
+ (s390_decompose_address): Allow the argument pointer and all
+ virtual registers as 'pointer' registers.
+ (s390_expand_plus_operand): Use s390_load_address.
+ config/s390/s390.md (movti, movdi, movdf splitters): Likewise.
+ ("force_la_31"): New insn pattern.
+ config/s390/s390-protos.h (legitimize_la_operand): Remove.
+ (s390_load_address): Add prototype.
+
+ * config/s390/s390.c: Include "optabs.h".
+ (s390_expand_movstr, s390_expand_clrstr, s390_expand_cmpstr): New.
+ config/s390/s390-protos.h (s390_expand_movstr, s390_expand_clrstr,
+ s390_expand_cmpstr): Add prototypes.
+ config/s390/s390.md ("movstrdi", "movstrsi"): Call s390_expand_movstr.
+ ("movstrdi_short"): Rename to "movstr_short_64". Change predicates
+ for operands 0 and 1 to "memory_operand". Add type attribute.
+ ("movstrsi_short"): Rename to "movstr_short_31". Change predicates
+ for operands 0 and 1 to "memory_operand". Add type attribute.
+ ("movstrdi_long", "movstrsi_long"): Remove.
+ ("movstrdi_64"): Rename to "movstr_long_64". Add type attribute.
+ ("movstrsi_31"): Rename to "movstr_long_31". Add type attribute.
+ ("clrstrdi", "clrstrsi"): Call s390_expand_clrstr.
+ ("clrstrsico"): Remove, replace by ...
+ ("clrstr_short_64", "clrstr_short_31"): ... these new patterns.
+ ("clrstrsi_64"): Rename to "clrstr_long_64".
+ ("clrstrsi_31"): Rename to "clrstr_long_31".
+ ("cmpstrdi", "cmpstrsi"): Call s390_expand_cmpstr.
+ ("cmpstr_const"): Remove, replace by ...
+ ("cmpstr_short_64", "cmpstr_short_31"): ... these new patterns.
+ ("cmpstr_64"): Rename to "cmpstr_long_64".
+ ("cmpstr_31"): Rename to "cmpstr_long_31".
+
+2002-09-16 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ABOUT-NLS: Follow spelling conventions.
+ * ChangeLog: Likewise.
+ * ChangeLog.1: Likewise.
+ * ChangeLog.2: Likewise.
+ * ChangeLog.3: Likewise.
+ * ChangeLog.4: Likewise.
+ * ChangeLog.5: Likewise.
+ * ChangeLog.6: Likewise.
+ * FSFChangeLog.10: Likewise.
+ * FSFChangeLog.11: Likewise.
+ * c-common.c: Likewise.
+ * c-lex.c: Likewise.
+ * c-objc-common.c: Likewise.
+ * cppexp.c: Likewise.
+ * cppinit.c: Likewise.
+ * cpplex.c: Likewise.
+ * doloop.c: Likewise.
+ * flow.c: Likewise.
+ * function.c: Likewise.
+ * integrate.c: Likewise.
+ * loop.c: Likewise.
+ * reg-stack.c: Likewise.
+ * reload.h: Likewise.
+ * ssa.c: Likewise.
+
+2002-09-15 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.in (vmsdbgout.o): Depend on $(TARGET_H)
+ * vmsdbgout.c: Include "target.h".
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.0: Likewise.
+ * ChangeLog.1: Likewise.
+ * ChangeLog.2: Likewise.
+ * ChangeLog.4: Likewise.
+ * ChangeLog.6: Likewise.
+ * config.gcc: Likewise.
+ * dwarfout.c: Likewise.
+ * reload1.c: Likewise.
+ * simplify-rtx.c: Likewise.
+ * unwind-sjlj.c: Likewise.
+ * config/avr/avr.h: Likewise.
+ * config/d30v/d30v.h: Likewise.
+ * config/frv/frv.c: Likewise.
+ * config/frv/frv.h: Likewise.
+ * config/ip2k/ip2k.h: Likewise.
+ * config/m88k/m88k-move.sh: Likewise.
+ * config/stormy16/stormy16.c: Likewise.
+ * config/stormy16/stormy16.h: Likewise.
+ * doc/extend.texi: Likewise.
+ * doc/interface.texi: Likewise.
+ * doc/invoke.texi: Likewise.
+ * doc/md.texi: Likewise.
+ * doc/rtl.texi: Likewise.
+ * doc/tm.texi: Likewise.
+ * doc/trouble.texi: Likewise.
+ * ginclude/float.h: Likewise.
+ * treelang/treelang.texi: Likewise.
+
+2002-09-15 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * i386-protos.h (i386_pe_dllexport_name_p,
+ i386_pe_dllimport_name_p, i386_pe_unique_section,
+ i386_pe_declare_function_type, i386_pe_record_external_function,
+ i386_pe_record_exported_symbol, i386_pe_asm_file_end): Add
+ prototype.
+ * i386/t-cygwin (winnt.o): Depend on $(TM_P_H).
+ * i386/t-interix (winnt.o): Likewise.
+
+ * v850-protos.h (v850_output_addr_const_extra): Prototype.
+
+2002-09-15 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/mips/netbsd.h (TARGET_OS_CPP_BUILTINS): Add
+ MIPS ABI CPP macros.
+ (TARGET_CPU_CPP_BUILTINS): Redefine.
+ (SUBTARGET_EXTRA_SPECS): Remove subtarget_endian_default.
+ (SUBTARGET_ENDIAN_DEFAULT_SPEC): Remove.
+
+2002-09-15 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * ia64/aix.h (TARGET_OS_CPP_BUILTINS): Fix typo.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.0: Likewise.
+ * ChangeLog.1: Likewise.
+ * ChangeLog.2: Likewise.
+ * ChangeLog.3: Likewise.
+ * ChangeLog.4: Likewise.
+ * ChangeLog.5: Likewise.
+ * ChangeLog.6: Likewise.
+ * FSFChangeLog.10: Likewise.
+ * FSFChangeLog.11: Likewise.
+ * c-common.c: Likewise.
+ * c-common.h: Likewise.
+ * c-format.c: Likewise.
+ * c-opts.c: Likewise.
+ * cpplib.c: Likewise.
+ * langhooks.h: Likewise.
+ * real.c: Likewise.
+ * reg-stack.c: Likewise.
+ * toplev.c: Likewise.
+ * config/arm/arm.c: Likewise.
+ * config/arm/arm.md: Likewise.
+ * config/arm/linux-gas.h: Likewise.
+ * config/arm/netbsd.h: Likewise.
+ * config/c4x/c4x.c: Likewise.
+ * config/c4x/c4x.h: Likewise.
+ * config/c4x/c4x.md: Likewise.
+ * config/c4x/libgcc.S: Likewise.
+ * config/fr30/fr30.md: Likewise.
+ * config/frv/frv.md: Likewise.
+ * config/ia64/ia64.md: Likewise.
+ * config/mips/mips.h: Likewise.
+ * config/mn10300/mn10300.c: Likewise.
+ * config/stormy16/stormy16.c: Likewise.
+ * config/v850/v850.md: Likewise.
+ * doc/extend.texi: Likewise.
+ * doc/invoke.texi: Likewise.
+ * doc/md.texi: Likewise.
+
+2002-09-15 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/netbsd.h (LIB_SPEC): Include the appropriate pthread
+ library if -pthread is specified.
+
+2002-09-15 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config.gcc (*-*-netbsd*): Set thread_file to 'posix'
+ for --enable-threads=yes and --enable-threads=posix.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/sparc/cypress.md: Replace Sparc with SPARC.
+ * config/sparc/freebsd.h: Likewise.
+ * config/sparc/gmon-sol2.c: Likewise.
+ * config/sparc/hypersparc.md: Likewise.
+ * config/sparc/lb1spc.asm: Likewise.
+ * config/sparc/lb1spl.asm: Likewise.
+ * config/sparc/linux.h: Likewise.
+ * config/sparc/linux64.h: Likewise.
+ * config/sparc/lynx.h: Likewise.
+ * config/sparc/sol2.h: Likewise.
+ * config/sparc/sparc-modes.def: Likewise.
+ * config/sparc/sparc.c: Likewise.
+ * config/sparc/sparc.h: Likewise.
+ * config/sparc/sparc.md: Likewise.
+ * config/sparc/sparclet.md: Likewise.
+ * config/sparc/supersparc.md: Likewise.
+ * config/sparc/sysv4.h: Likewise.
+ * config/sparc/vxsim.h: Likewise.
+ * config/sparc/vxsparc64.h: Likewise.
+
+2002-09-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * c-lex.c (cb_ident): Mark variable with ATTRIBUTE_UNUSED.
+ * collect2.c (ignore_library, aix_std_libs): Move into the context
+ where it is used.
+ * m68hc11.c (m68hc11_autoinc_compatible_p): Delete prototype.
+ (autoinc_mode, m68hc11_make_autoinc_notes): Add prototypes.
+ * m88k.c (output_call): Wrap variables with macro controlling use.
+ * rs6000.md: Likewise. Const-ify variable.
+ * sh.h (ASM_OUTPUT_LABELREF): Likewise.
+ * final.c (only_leaf_regs_used): Likewise.
+ * regrename.c (maybe_mode_change): Mark parameter with
+ ATTRIBUTE_UNUSED.
+ * reload.c (find_valid_class): Likewise. Likewise for variable.
+ (find_reloads_address_1): Likewise.
+ * varasm.c (weak_finish): Wrap variable with macro controlling use.
+
+2002-09-14 Marek Michalkiewicz <marekm@amelek.gda.pl>
+
+ * config/avr/avr.c (output.h): Move after inclusion of tree.h.
+
+2002-09-14 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.0: Likewise.
+ * ChangeLog.2: Likewise.
+ * ChangeLog.3: Likewise.
+ * ChangeLog.4: Likewise.
+ * ChangeLog.5: Likewise.
+ * ChangeLog.6: Likewise.
+ * cppfiles.c: Likewise.
+ * cppinit.c: Likewise.
+ * cpplib.h: Likewise.
+ * cse.c: Likewise.
+ * debug.h: Likewise.
+ * df.c: Likewise.
+ * dominance.c: Likewise.
+ * hashtable.c: Likewise.
+ * hashtable.h: Likewise.
+ * loop.c: Likewise.
+ * config/arm/README-interworking: Likewise.
+ * config/arm/arm.c: Likewise.
+ * config/arm/arm.h: Likewise.
+ * config/arm/arm.md: Likewise.
+ * config/dsp16xx/dsp16xx.h: Likewise.
+ * config/frv/frv.c: Likewise.
+ * config/frv/frv.h: Likewise.
+ * config/ip2k/ip2k.h: Likewise.
+ * config/rs6000/rs6000.c: Likewise.
+ * config/stormy16/stormy-abi: Likewise.
+ * config/stormy16/stormy16.h: Likewise.
+ * config/v850/v850.c: Likewise.
+
+2002-09-14 Kazu Hirata <kazu@cs.umass.edu>
+
+ * loop.c: Fix a comment typo.
+
+2002-09-14 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/fr30/fr30.h: Fix comment typos.
+ * config/frv/frv.c: Likewise.
+ * config/i386/xmmintrin.h: Likewise.
+ * config/mips/mips.c: Likewise.
+ * config/sh/sh.c: Likewise.
+
+2002-09-14 Kazu Hirata <kazu@cs.umass.edu>
+
+ * haifa-sched.c: Follow spelling conventions.
+ * regclass.c: Likewise.
+ * regrename.c: Likewise.
+ * config/fp-bit.c: Likewise.
+ * config/frv/frv.h: Likewise.
+ * config/m88k/m88k.c: Likewise.
+ * config/mcore/mcore.c: Likewise.
+ * config/rs6000/darwin.h: Likewise.
+ * config/rs6000/gnu.h: Likewise.
+ * config/rs6000/linux.h: Likewise.
+ * config/rs6000/linux64.h: Likewise.
+ * config/rs6000/rs6000.c: Likewise.
+ * config/rs6000/rs6000.h: Likewise.
+ * config/sh/sh.c: Likewise.
+ * config/sparc/sparc.c: Likewise.
+ * config/sparc/ultra1_2.md: Likewise.
+
+2002-09-14 Stephane Carrez <stcarrez@nerim.fr>
+
+ * config/m68hc11/m68hc11.md ("movdi_internal"): Allow any offsetable
+ memory operand when source is 0 (K constraint).
+ ("movsi_internal"): Likewise.
+ ("movdf_internal"): Likewise.
+ ("movsf_internal"): Likewise.
+
+2002-09-14 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (rs6000_elf_encode_section_info): Use
+ targetm.binds_local_p to set SYMBOL_REF_FLAG.
+ (rs6000_xcoff_encode_section_info): Likewise.
+ * config/rs6000/xcoff.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
+
+2002-09-10 Theodore A. Roth <troth@verinet.com>
+
+ * gcc/config/avr/avr.h: Set default options for C++ for avr.
+
+2002-09-13 Roger Sayle <roger@eyesopen.com>
+
+ * stmt.c (struct nexting): Remove unused alt_end_label field.
+ (expand_start_loop): Delete initialization of alt_end_label.
+ (expand_start_null_loop): Likewise.
+ (expand_exit_loop_if_false): Delete updating of alt_end_label.
+
+2002-09-13 Richard Henderson <rth@redhat.com>
+
+ * Makefile.in (toplev.o): Depend on real.h.
+ (print-rtl.o, varasm.o, ifcvt.o): Likewise.
+
+2002-09-14 Alan Modra <amodra@bigpond.net.au>
+
+ * doc/tm.texi (DBX_OUTPUT_NFUN): Describe.
+ * dbxout.c (dbxout_function_end): Use DBX_OUTPUT_NFUN.
+ * config/rs6000/linux64.h (DBX_OUTPUT_NFUN): Define.
+
+2002-09-13 Nathan Sidwell <nathan@codesourcery.com>
+
+ * ggc-common.c (ggc_mark_roots): Don't iterate NULL hash tables.
+
+2002-09-13 Steve Ellcey <sje@cup.hp.com>
+
+ * config.gcc (ia64*-*-aix*, ia64*-*-elf*, ia64*-*-freebsd*,
+ ia64*-*-linux*): Set extra_parts.
+ * config/ia64/t-aix (EXTRA_PARTS): Remove.
+ * config/ia64/t-ia64 (EXTRA_PARTS): Remove.
+
+2002-09-13 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/fixunssfsi.c: Replace H8/S with H8S.
+ * config/h8300/h8300.c: Likewise.
+ * config/h8300/h8300.h: Likewise.
+ * config/h8300/h8300.md: Likewise.
+ * doc/invoke.texi: Likewise.
+
+2002-09-13 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.c (h8300_init_once): Fix formatting.
+
+2002-09-13 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.md (attr type): Add callpal.
+ (imb, trap, load_tp, set_tp): Use it.
+ * config/alpha/ev4.md (ev4_callpal): New.
+ * config/alpha/ev5.md (ev5_callpal): New.
+ * config/alpha/ev6.md (ev6_ibr): Handle callpal.
+ * config/alpha/alpha.c (alphaev4_insn_pipe): Handle TYPE_CALLPAL.
+ (alphaev5_insn_pipe): Likewise.
+
+2002-09-13 Andreas Jaeger <aj@suse.de>
+
+ * Makefile.in (print-rtl.o): Depend on CONFIG_H.
+
+2002-09-13 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/t-hpux (LIBGCC1_TEST, STMP_FIXPROTO,
+ LIB2ADDEH): New, set to NULL.
+ (SHLIB_EXT, SHLIB_LINK, SHLIB_INSTALL, SHLIB_MKMAP): New.
+
+2002-09-13 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/quadlib.c (_U_Qfcmp): Make extern.
+ (_U_Qfcnvfxt_quad_to_sgl): Remove declaration.
+ (_U_Qfeq, _U_Qfne, _U_Qfgt, _U_Qfge, U_Qflt, U_Qfle, _U_Qfcomp):
+ Add declarations.
+ (_U_Qfneg): Remove.
+
+2002-09-13 Dhananjay Deshpande <dhananjayd@kpit.com>
+
+ * config/h8300/h8300.h (EIGHTBIT_CONSTANT_ADDRESS_P): Add support
+ for H8/300, H8S aa:8 mode.
+ (TINY_CONSTANT_ADDRESS_P): Add support for H8S aa:16 mode.
+ * config/h8300/h8300.c (h8300_adjust_insn_length): Adjust length
+ for H8/300 aa:8 mode.
+
+2002-09-13 Hartmut Penner <hpenner@de.ibm.com>
+
+ * config/s390/s390.md ("trap", "conditional_trap", "*trap"): New
+ insns.
+
+2002-09-12 Richard Henderson <rth@redhat.com>
+
+ * Makefile.in (HOST_PRINT): Use print-rtl1.o
+ (print-rtl.o): Don't define GENERATOR_FILE.
+ (print-rtl1.o): Rename from $(BUILD_PREFIX_1)print-rtl.o.
+ * print-rtl.c (print_rtx): Include CONST_DOUBLE fp decimal output
+ unless GENERATOR_FILE.
+
+2002-09-12 Stan Shebs <shebs@apple.com>
+
+ * config/darwin.h (USER_LABEL_PREFIX): Define here...
+ * config/i386/darwin.h: ... instead of here.
+
+ * target.h (struct gcc_target): New field
+ terminate_dw2_eh_frame_info.
+ * target-def.h (TARGET_TERMINATE_DW2_EH_FRAME_INFO): Define.
+ (TARGET_INITIALIZER): Add it.
+ * dwarf2out.c (output_call_frame_info): Use target hook.
+ * dwarf2asm.c (dw2_asm_output_delta): Use macro
+ ASM_OUTPUT_DWARF_DELTA if defined.
+ * doc/tm.texi (TARGET_TERMINATE_DW2_EH_FRAME_INFO): Document.
+ (ASM_OUTPUT_DWARF_DELTA): Ditto.
+ (ASM_OUTPUT_DWARF_OFFSET): Ditto.
+ (ASM_OUTPUT_DWARF_PCREL): Ditto.
+ * config.gcc (i[34567]86-*-darwin*): Define extra_parts.
+ (powerpc-*-darwin*): Ditto.
+ * crtstuff.c [OBJECT_FORMAT_MACHO]: Update the Mach-O bits
+ to work correctly for Darwin.
+ * config/darwin.h (OBJECT_FORMAT_MACHO): Define.
+ (STARTFILE_SPEC): Add crtbegin.o.
+ (ENDFILE_SPEC): Define.
+ (EXTRA_SECTION_FUNCTIONS): Put gcc_except_tab in data segment.
+ (ASM_PREFERRED_EH_DATA_FORMAT): Handle more cases.
+ (ASM_OUTPUT_DWARF_DELTA): Define.
+ (TARGET_TERMINATE_DW2_EH_FRAME_INFO): Define.
+ * config/darwin.c (darwin_asm_output_dwarf_delta): New function.
+
+2002-09-13 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (rs6000_emit_load_toc_table): Remove "if"
+ nesting. Correct test for non-PowerPC64 ELF ABI_AIX.
+ * config/rs6000/rs6000.md (load_toc_v4_PIC*): Disable when ABI_AIX.
+
+2002-09-12 Zack Weinberg <zack@codesourcery.com>
+
+ * toplev.c: Move default definition of USER_LABEL_PREFIX...
+ * defaults.h: ... here.
+
+2002-09-12 Richard Henderson <rth@redhat.com>
+
+ * vax.c: Include tree.h earlier.
+
+2002-09-12 Stan Shebs <shebs@apple.com>
+
+ * config/darwin.c (machopic_finish): Remove #if 0 chunks.
+ (machopic_operand_p): Ditto.
+
+2002-09-12 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/arm/arm.c (arm_compute_initial_elimination_offset):
+ Fix a comment typo.
+
+2002-09-12 Kazu Hirata <kazu@cs.umass.edu>
+
+ * toplev.c (do_abort): Fix a comment typo.
+
+2002-09-12 Kazu Hirata <kazu@cs.umass.edu>
+
+ * cselib.c: Fix comment formatting.
+ * gengtype.c: Likewise.
+
+2002-09-12 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.md (udivmodqi4): Do not use an expander.
+ (udivmodhi4): Likewise.
+
+2002-09-12 Graham Stott <graham.stott@btinternet.com>
+ Roger Sayle <roger@eyesopen.com>
+
+ * i386.c (any_fp_register_operand, fp_register_operand,
+ register_and_not_any_fp_reg_operand, register_and_not_fp_reg_operand):
+ New predicate functions.
+ * i386-protos.h: Add their prototypes.
+ * i386.h: Add them to PREDICATE_CODES.
+ * i386.md ("*pushsf_rex64"+2, "*pushsf_rex64"+3, "*pushdf_integer"+1,
+ "*pushdf_integer"+2, "*pushtf_integer"+1, "*pushtf_integer"+2,
+ "*pushtf_integer"+3, "*pushtf_integer"+4, "*dummy_extendsfdf2"+1,
+ "*dummy_extendsfdf2"+2, "*dummy_extendsfxf2"+1,
+ "*dummy_extendsftf2"+1, "*dummy_extendsftf2"+2,
+ "*dummy_extenddfxf2"+1, "*dummy_extenddftf2"+1,
+ "*dummy_extenddftf2"+2, "*negsf2_if"+1, "*negsf2_if"+2,
+ "*negdf2_if_rex64"+1, "*negdf2_if_rex64"+2, "*negxf2_if"+1,
+ "*negxf2_if"+2, "*negtf2_if"+1, "*negtf2_if"+2, "*abssf2_if"+1,
+ "*abssf2_if"+2, "*absdf2_if_rex64"+1, "*absdf2_if_rex64"+2,
+ "*absxf2_if"+1, "*absxf2_if"+2, "*abstf2_if"+1, "*abstf2_if"+2):
+ Use these new predicates to simplify and correct the use of
+ FP_REG_P, ANY_FP_REG_P, FP_REGNO_P and any ANY_FP_REGNO_P.
+
+2002-09-12 Jason Merrill <jason@redhat.com>
+
+ * diagnostic.c (output_add_identifier): New fn.
+ * diagnostic.h: Declare it.
+
+ * calls.c (store_one_arg): Use size_in_bytes to determine the
+ amount of space to push.
+
+2002-09-12 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/linux64.h (STARTFILE_SPEC32): Fix a typo.
+
+2002-09-12 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390-modes.def (CCAPmode, CCANmode): New CC modes.
+ * config/s390/s390.c (s390_match_ccmode_set): Support new CC modes.
+ (s390_select_ccmode): Likewise.
+ (s390_branch_condition_mask): Likewise.
+ (optimization_options): Do not set flag_branch_on_count.
+ (s390_split_branches): Handle doloop branches.
+ (s390_chunkify_pool): Likewise.
+ * config/s390/s390.md ("*adddi3_imm_cc", "*addsi3_imm_cc"): New insns.
+ ("doloop_end"): New expander.
+ ("doolop_si", "*doloop_si_long", "doloop_di", "*doloop_di_long",
+ associated splitters): New.
+
+2002-09-11 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ * genattrtab.c (simplify_cond): Remove unused variable(s).
+ * global.c (record_conflicts): Likewise.
+ * jump.c (rebuild_jump_labels): Likewise.
+ * loop.c (scan_loop, check_final_value): Likewise.
+ * ra-colorize.c (colorize_one_web, assign_colors): Likewise.
+ * reload1.c (eliminate_regs_in_insn, do_input_reload): Likewise.
+ * rtlanal.c (reg_set_p): Likewise.
+ * stmt.c (expand_asm_operands, expand_decl): Likewise.
+ * genautomata.c (empty_reserv): Remove.
+ * loop.c (max_luid): Likewise.
+ * sched-rgn.c (bitlst_table_size): Likewise.
+
+2002-09-11 Nathan Sidwell <nathan@codesourcery.com>
+
+ Reimplement gcov format.
+ * gcov-io.h: Replace.
+ * gcov.c: Reimplement.
+ * gcov-iov.c: New file.
+ * gcov-dump.c: New file.
+ * libgcc2.c (L_bb): Replace with ...
+ (L_gcov): ... this.
+ (struct bb_function_info, struct bb): Remove.
+ (inhibit_libc): Never inhibit.
+ (gcov_list, gcov_crc): New static variables.
+ (gcov_version_mismatch): New static function.
+ (__bb_exit_func): Renamed to ...
+ (__gcov_exit): ... here. Made static. Reimplement.
+ (__gcov_init_func): Rename to ...
+ (__gcov_init): ... here. Check version, update crc.
+ (__bb_fork_func): Rename to ...
+ (__gcov_flush): ... here.
+ * libgcc2.h (struct bb, __bb_exit_func, __bb_init_func,
+ __bb_fork_func, gcov_type, __bb_find_arc_counters): Remove.
+ * calls.c (expand_call): Call __gcov_flush.
+ * profile.c (bb_file, last_bb_file_name): Remove.
+ (bbg_file_name): New global variable.
+ (output_gcov_string): Remove.
+ (get_exec_counts): Reimplement.
+ (branch_prob): Reimplement gcov file writing.
+ (init_branch_prob): Create bbg_file_name, don't create
+ bb_file_name.
+ (end_branch_prob): Adjust. Don't remove counter file when
+ instrumenting ourselves.
+ (create_profiler): Adjust.
+ * doc/gcov.texi (Gcov Data Files): Remove detailed specification,
+ point to gcov-io.h.
+ * Makefile.in (LANGUAGES): Add gcov-dump.
+ (coverageexts): Remove .bb.
+ (STAGESTUFF): Add gcov-dump.
+ (LIB2FUNCS_ST): Replace _bb with _gcov.
+ (profile.o): Depend on gcov-iov.h.
+ (final.o): Don't depend on profile.h, gcov.h.
+ (gcov.o): Depend on gcov-iov.h.
+ (gcov-iov.o): New target.
+ (gcov-iov): New target.
+ (gcov-iov.h): New target.
+ (gcov-dump.o): New target.
+ (GCOV_DUMP_OBJS): New variable.
+ (gcov-dump): New target.
+ (distclean): Remove coverageexts.
+ (stage1): Remove coverageexts.
+
+2002-09-11 Hartmut Penner <hpenner@de.ibm.com>
+
+ * fold-const.c (make_range): Only narrow to signed range if
+ the signed range is smaller than the unsigned range.
+
+2002-09-12 Alan Modra <amodra@bigpond.net.au>
+
+ * emit-rtl.c (set_mem_size): New function.
+ * expr.h (set_mem_size): Declare.
+ * config/rs6000/rs6000.c (expand_block_move_mem): Exterminate.
+ (expand_block_move): Instead, use adjust_address and
+ replace_equiv_address to generate proper aliasing info.
+ Move common code out of conditionals. Localize vars.
+
+2002-09-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * h8300.md: Fix signed/unsigned warnings.
+ * mcore.md: Likewise.
+ * mn10300.c (mask_ok_for_mem_btst): Likewise.
+
+2002-09-09 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * optabs.c (expand_binop): Minor cleanup.
+ (expand_twoval_binop): Convert CONST_INTs like in expand_binop.
+
+2002-09-11 Dan Nicolaescu <dann@ics.uci.edu>
+
+ * print-tree.c (print_node): Print the restrict qualifier.
+
+2002-09-11 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/install.texi: Fix typos.
+
+2002-09-11 Zack Weinberg <zack@codesourcery.com>
+
+ * Makefile.in: Remove all references to s-under and underscore.c.
+ * collect2.c, tlink.c: Change all uses of prepends_underscore
+ to look directly at USER_LABEL_PREFIX.
+
+2002-09-11 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_xcoff_asm_named_section): Append
+ alignment to csect.
+ (rs6000_xcoff_unique_section): Only set section name for public
+ data.
+ (rs6000_xcoff_section_type_flags): Store log2 alignment in flags.
+ * config/rs6000/xcoff.h (TARGET_ASM_SELECT_SECTION): Remove
+ duplicate definition.
+
+2002-09-10 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.md (extzv): Check predicates before emitting extzv_32.
+ (insv): Likewise.
+
+2002-09-10 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.h (MOVE_MAX): Define to correct value.
+ (MAX_MOVE_MAX): Define.
+ (MOVE_BY_PIECES_P): Define.
+ (CLEAR_BY_PIECES_P): Define.
+
+2002-09-10 Denis Chertykov <denisc@overta.ru>
+
+ * config/avr/avr.md (movstrhi): Use right operands for conversion.
+
+2002-09-10 Richard Earnshaw <rearnsha@arm.com>
+
+ PR c/7873
+ * arm.md (insv): Use reg_or_int_operand for operand[3].
+
+2002-09-10 David Edelsohn <edelsohn@gnu.org>
+
+ * rs6000.c (rs6000_assemble_visibility): Protect declaration
+ inside macro. Correct function definition typo.
+ (rs6000_xcoff_section_type_flags): New function.
+ (TARGET_SECTION_TYPE_FLAGS): Remove definition.
+ (rs6000_elf_section_type_flags): Call default_section_type_flags_1
+ with appropriate PIC test.
+ (rs6000_xcoff_select_section): Use decl_readonly_section_1 to
+ determine readonly.
+ (rs6000_binds_local_p): Combine PIC flags.
+ * sysv4.h (TARGET_SECTION_TYPE_FLAGS): Define.
+ * xcoff.h (TARGET_SECTION_TYPE_FLAGS): Define.
+
+2002-09-09 Per Bothner <per@bothner.com>
+
+ * print-tree.c (print_node): In a STRING_CST, escape non-ascii
+ characters, and only print TREE_STRING_LENGTH chars.
+
+2002-09-09 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/hpux.h (TARGET_HPUX_LD): New, define true.
+ (ASM_FILE_END) New.
+ * config/ia64/ia64.h (TARGET_HPUX_LD): New, define false.
+ * config/ia64/ia64-protos.h (ia64_hpux_asm_file_end): New.
+ * config/ia64/ia64.c (ia64_asm_output_external): Create list
+ of external functions if TARGET_HPUX_LD is true.
+ (ia64_hpux_add_extern_decl): New, routine to put names on
+ list of external functions.
+ (ia64_hpux_asm_file_end): Put out declarations for external
+ functions if and only if they are used.
+
+2002-09-09 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.md (exception_receiver, builtin_setjmp_receiver): Add blockage
+ on TARGET_64BIT before pic register restore.
+
+2002-09-09 David Edelsohn <edelsohn@gnu.org>
+
+ * doc/tm.texi (TARGET_HAVE_SRODATA_SECTION): New description.
+ (TARGET_HAVE_TLS): New description.
+
+2002-09-09 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/extend.texi (Statement Exprs): Fix broken link.
+
+2002-09-09 Denis Chertykov <denisc@overta.ru>
+
+ * config/avr/avr.md (movstrhi, clrstrhi): Use gen_int_mode for
+ right conversion of operands[1].
+
+2002-09-09 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.md ("*tmdi_reg", "*tmsi_reg"): Do not mark as
+ commutative. Use "nonimmediate_operand" instead of "register_operand"
+ as predicate for operand 0. Move to after the "*tmXX_mem" insns.
+
+ ("*tmdi_mem", "*tmsi_mem", "*tmhi_mem", "*tmqi_mem"): Do not mark
+ as commutative.
+
+ ("*anddi3_ni", "*andsi3_ni", "*iordi3_ni", "*iorsi3_ni"): Do not
+ mark as commutative. Use "nonimmediate_operand" instead of
+ "register_operand" as predicate for operand 1.
+
+ ("movstrictsi"): Fix typo in insn name.
+
+2002-09-09 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (index_register_operand): New.
+ * i386.h (predicate_codes): Add new predicate.
+ * i386.md (lea_general_*): Use index_regsiter_operand
+ (ashift to lea splitter): Do not produce invalid leas
+ (ashift to mov+ashift split): New.
+
+2002-09-09 Nick Clifton <nickc@redhat.com>
+
+ * config/fr30/fr30.c (output.h): Move after inclusion of tree.h.
+ Fix folding marks.
+
+2002-09-09 Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com>
+ J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh/sh.h (OVERRIDE_OPTIONS): align_functions is in bytes, not bits.
+
+2002-09-09 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (rs6000_binds_local_p): Return bool.
+ (function_ok_for_sibcall): Use binds_local_p. Respect longcall
+ attributes.
+
+2002-09-08 Nathan Sidwell <nathan@codesourcery.com>
+
+ * basic_block.h (gcov_type): Explain why it is signed.
+ * final.c: Don't include profile.h.
+ (struct function_list, functions_head, functions_tail,
+ end_final): Moved to profile.c
+ (final): Move arc chaining code to profile.c.
+ * function.c (prepare_function_start): Remove duplicate line.
+ * output.h (end_final): Remove prototype.
+ * predict.c (estimate_loops_at_level): Use gcov_type.
+ * profile.c (struct function_list, functions_head,
+ functions_tail): Moved from final.c
+ (need_func_profiler): Remove.
+ (instrument_edges): Don't set need_func_profiler.
+ (get_exec_counts): Avoid signed/unsigned warning.
+ (compute_checksum): Use crc32.
+ (branch_prob): Adjust. Chain onto functions_head.
+ (init_branch_prob): Absorb init_edge_profiler.
+ (init_edge_profiler): Remove.
+ (create_profiler): Moved and renamed from final.c:end_final.
+ Emit data and constructor.
+ (output_func_start_profiler): Remove.
+ * profile.h (struct profile_info): checksum is unsigned.
+ * rtl.h (output_func_start_profiler): Remove prototype.
+ (create_profiler): Declare.
+ * toplev.c (compile_file): Call create_profiler, if instrumenting
+ arcs. Don't call end_final.
+
+2002-09-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * fr30.c (fr30_print_operand): Fix bug in output of CONST_DOUBLE.
+
+2002-09-08 Richard Henderson <rth@redhat.com>
+
+ * dwarf2.h (DW_OP_call_ref): Rename from DW_OP_calli.
+ (DW_OP_GNU_push_tls_address): New.
+ (DW_OP_lo_user): Fix.
+ * dwarf2out.c (INTERNAL_DW_OP_tls_addr): New.
+ (dwarf_stack_op_name): Handle it, plus other dwarf3 opcodes.
+ (size_of_loc_descr): Likewise.
+ (output_loc_operands): Handle INTERNAL_DW_OP_tls_addr.
+ (add_AT_location_description): Take a dw_loc_descr_ref not an rtx.
+ (loc_descriptor_from_tree): Handle TLS variables.
+ (rtl_for_decl_location): Do avoid_constant_pool_reference here ...
+ (add_location_or_const_value_attribute): ... not here. Defer
+ to loc_descriptor_from_tree for TLS variables.
+
+ * config/i386/i386.h (ASM_OUTPUT_DWARF_DTPREL): New.
+ * config/i386/i386.c (i386_output_dwarf_dtprel): New.
+ * config/i386/i386-protos.h: Update.
+
+2002-09-08 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6405
+ * unroll.c (loop_iterations): last_loop_insn should be the previous
+ non-note instruction before loop->end.
+ * loop.c (strength_reduce): The conditional jump is the last
+ non-note instruction before loop->end (as above).
+
+2002-09-08 Roger Sayle <roger@eyesopen.com>
+
+ * combine.c (try_combine): Handle the case that undobuf.other_insn
+ has been turned into a return or unconditional jump, by inserting
+ a BARRIER if necessary.
+ (simplify_set): Test if a condition code setter has a constant
+ comparison at compile time, if so convert this insn to a no-op move
+ and update/simplify the condition code user (undobuf.other_insn).
+
+2002-09-08 Krister Walfridsson <cato@df.lth.se>
+
+ * config/arm/netbsd.h (INITIALIZE_TRAMPOLINE): Redefine.
+ (CLEAR_INSN_CACHE): Define.
+
+2002-09-08 Kazu Hirata <kazu@cs.umass.edu>
+
+ * basic-block.h: Fix comment formatting.
+ * c-common.c: Likewise.
+ * c-common.h: Likewise.
+ * c-lex.c: Likewise.
+ * c-pretty-print.c: Likewise.
+ * cfglayout.c: Likewise.
+ * cfgloop.c: Likewise.
+ * defaults.h: Likewise.
+ * et-forest.c: Likewise.
+ * explow.c: Likewise.
+ * function.h: Likewise.
+ * gcov.c: Likewise.
+ * genattrtab.c: Likewise.
+ * gengtype.c: Likewise.
+ * ifcvt.c: Likewise.
+ * libgcc2.c: Likewise.
+ * loop.c: Likewise.
+ * profile.c: Likewise.
+ * ra-build.c: Likewise.
+ * real.c: Likewise.
+ * rtl.h: Likewise.
+ * tracer.c: Likewise.
+ * tree-inline.c: Likewise.
+ * varasm.c: Likewise.
+
+2002-09-08 Jan Hubicka <jh@suse.cz>
+
+ * emit-rtl.c (set_mem_attributes_minus_bitpos): Fix array_ref
+ handling.
+
+ * loop.c (loop_gics_reduce): Emit addition after.
+
+2002-09-08 Alan Modra <amodra@bigpond.net.au>
+
+ * varasm.c (default_assemble_visibility): Rename from
+ assemble_visibility.
+ * output.h: Here too.
+ * target-def.h (TARGET_ASM_ASSEMBLE_VISIBILITY): And here.
+ * config/rs6000/rs6000.c (rs6000_assemble_visibility): And here.
+
+2002-09-08 Alan Modra <amodra@bigpond.net.au>
+
+ * reload.c (find_reloads <p constraint>): Pass operand_mode to
+ find_reloads_address.
+
+2002-09-08 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.md (udivmodqi4): Enable on H8/300.
+ (anonymous pattern): Likewise.
+
+2002-09-07 Igor Shevlyakov <igor@microunity.com>
+
+ * machmode.def: Add modes for half-float vectors.
+
+2002-09-07 Scott Snyder <snyder@fnal.gov>
+
+ PR target/7374
+ * config/alpha/alpha.md (abstf2): Fix typo: 'neg' for 'abs'.
+
+2002-09-07 Roger Sayle <roger@eyesopen.com>
+
+ * basic-block.h (struct loop): Remove unused cont_dominator field.
+
+2002-09-07 Igor Shevlyakov <igor@microunity.com>
+
+ * varasm.c (decode_rtx_const): Don't check undefined field for
+ CONST_VECTOR.
+
+2002-09-07 Glen Nakamura <glen@imodulo.com>
+
+ PR opt/7814
+ * sched-deps.c (sched_analyze_insn): Make sure to add insn
+ to reg_last->sets after flushing the dependency lists to guarantee
+ that subsequent clobbers will be dependent on it.
+
+2002-09-07 Igor Shevlyakov <igor@microunity.com>
+
+ * combine.c (simplify_shift_const): Calculate rotate count
+ correctly for vector operands.
+
+2002-09-07 Ansgar Esztermann <ansgar@thphy.uni-duesseldorf.de>
+
+ * c-typeck.c (c_tree_expr_nonnegative_p): New function.
+ (build_binary_op): Call c_tree_expr_nonnegative_p rather than
+ tree_expr_nonnegative_p.
+ (build_conditional_expr): Likewise.
+ * c-tree.h (c_tree_expr_nonnegative_p): Declare.
+
+2002-09-07 Richard Henderson <rth@redhat.com>
+
+ * builtins.def (inf, inff, infl): Mark const.
+ (huge_val, huge_valf, huge_vall): Likewise.
+ (BUILT_IN_GETEXP, BUILT_IN_GETMAN): Remove.
+
+ * real.c (ereal_inf): Clear E before use.
+
+2002-09-07 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.md (udivmodqi4): Split the pattern into
+ an expander and an anonymous pattern. Zero out the upper half
+ of the dividend in the expander.
+ (udivmodqi4): Likewise.
+
+2002-09-07 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.c: Fix formatting.
+ * config/h8300/h8300.h: Likewise.
+ * config/h8300/h8300.md: Likewise.
+
+2002-09-07 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
+ * cfgcleanup.c (try_crossjump_to_edge): Fix updating of liveness
+ information.
+
+2002-09-07 Graham Stott <graham.stott@btinternet.com>
+
+ * rtlanal.c (dead_or_set_regno_p): Fix typo.
+
+2002-09-07 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/linux64.h (ASM_PREFERRED_EH_DATA_FORMAT): Define.
+
+ * doc/tm.texi (TARGET_ASM_ASSEMBLE_VISIBILITY): Describe.
+ * target-def.h (TARGET_ASM_ASSEMBLE_VISIBILITY): Define.
+ (TARGET_ASM_OUT): Add the above here.
+ * target.h (struct gcc_target): Add "visibility" field.
+ * varasm.c (maybe_assemble_visibility): Call targetm visibility func.
+ * config/rs6000/rs6000.c (rs6000_assemble_visibility): New function.
+ (TARGET_ASM_ASSEMBLE_VISIBILITY): Define.
+ (rs6000_legitimize_reload_address, first_reg_to_save): Formatting.
+
+2002-09-06 Ziemowit Laski <zlaski@apple.com>
+
+ * c-lang.c (objc_is_id): New stub.
+ * c-tree.h (objc_is_id): New forward declaration.
+ * c-typeck.c (build_c_cast): Do not strip protocol
+ qualifiers from 'id' type.
+ * objc/objc-act.c (objc_comptypes): Correct handling
+ of protocol qualifiers.
+ (objc_is_id): New.
+
+Fri Sep 6 13:10:08 2002 Jeffrey A Law (law@redhat.com)
+
+ * pentium.md (pentium-firstvboth): Fix typo.
+
+2002-09-06 Dhananjay Deshpande <dhananjayd@kpit.com>
+
+ * h8300.c (enum shift_alg): Move to earlier in h8300.c.
+ (enum shift_type, enum h8_cpu): Likewise.
+ (INL, ROT, LOP, SPC macros): Likewise.
+ (shift_alg_qi, shift_alg_hi, shift_alg_si): Likewise. Lose
+ const designator.
+ (h8300_init_once): Update shift_alg_{qi,hi,si} to use more
+ space efficient algorithms when optimize for codesize.
+
+Fri Sep 6 16:35:32 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ Fix PR/1727 and long-standing failing testcase
+ objc/formal-protocol-6.m.
+ * objc-act.c (build_protocol_expr): If compiling for the GNU
+ runtime, create a list of Protocol statically allocated instances
+ if it doesn't exist, then add the Protocol object to this same
+ list.
+ (get_objc_string_decl): Fixed typo/bug - TREE_VALUE had been used
+ instead of TREE_CHAIN.
+
+Fri Sep 6 16:17:33 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * objc/objc-act.c (dump_interface): Enlarged the char * buffer to
+ 10k. Fixed category dumping - print out category names with the
+ proper syntax. Print '@end\n' and not '\n@end' at the end of the
+ interface.
+ (finish_objc): Fixed the -gen-decls option. It was printing out
+ only the last class. Dump an interface declaration of all classes
+ being compiled instead.
+
+2002-09-06 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/arm/arm-protos.h (arm_gen_return_addr_mask): New
+ prototype.
+ * config/arm/arm.c (arm_gen_return_addr_mask): New function.
+ * config/arm/arm.h (MASK_RETURN_ADDR): Use arm_gen_return_addr_mask
+ if not APCS26 and not Thumb or ARMv4-or-higher. Use gen_int_mode
+ rather than GEN_INT.
+ * config/arm/arm.md (UNSPEC_CHECK_ARCH): Define.
+ (return_addr_mask, *check_arch2): New.
+
+2002-09-06 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.md ("*adddi3_cc", "*adddi3_cconly",
+ "*adddi3_cconly2", "*adddi3_64", "*adddi3_31", "adddi3",
+ "*addsi3_carry1_cc", "*addsi3_carry1_cconly",
+ "*addsi3_carry2_cc", "*addsi3_carry2_cconly",
+ "*addsi3_cc", "*addsi3_cconly", "*addsi3_cconly2", "addsi3",
+ "adddf3", "*adddf3", "*adddf3_ibm",
+ "addsf3", "*addsf3", "*addsf3_ibm",
+ "muldi3", "mulsi3", "mulsidi3",
+ "muldf3", "*muldf3", "*muldf3_ibm",
+ "mulsf3", "*mulsf3", "*mulsf3_ibm",
+ "*anddi3_cc", "*anddi3_cconly", "anddi3",
+ "*andsi3_cc", "*andsi3_cconly", "andsi3",
+ "*iordi3_cc", "*iordi3_cconly", "iordi3",
+ "*iorsi3_cc", "*iorsi3_cconly", "iorsi3",
+ "*xordi3_cc", "*xordi3_cconly", "xordi3",
+ "*xorsi3_cc", "*xorsi3_cconly", "xorsi3"): Use "nonimmediate_operand"
+ instead of "register_operand" as predicate for "%0" operand.
+
+2002-09-06 Jakub Jelinek <jakub@redhat.com>
+
+ * configure.in (HAVE_AS_OFFSETABLE_LO10): Use -xarch=v9
+ unconditionally when gcc_cv_as_flags64 checks are gone.
+ * configure: Rebuilt.
+
+2002-09-06 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.md (extzvsi_internal2): Revert most of
+ 2002-07-26 change. Comment.
+
+2002-09-05 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * frv.c (frv_unique_section, frv_select_section,
+ frv_select_rtx_section): Delete.
+ (frv_in_small_data_p): New.
+ (TARGET_ASM_UNIQUE_SECTION, TARGET_ASM_SELECT_SECTION,
+ TARGET_ASM_SELECT_RTX_SECTION): Delete.
+ (TARGET_IN_SMALL_DATA_P): Define.
+
+2002-09-05 Dale Johannesen <dalej@apple.com>
+
+ * reload1.c (reload): Retain only those memory clobbers
+ added for variable-array handling.
+
+2002-09-05 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/arm/arm.c (arm_return_in_memory): Implement ATPCS
+ return-in-memory rules.
+ * config/arm/arm.h (ARM_FLAG_ATPCS, TARGET_ATPCS): Define.
+
+2002-09-05 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/xcoff.h (HOT_TEXT_SECTION_NAME): Delete.
+ (UNLIKELY_EXECUTED_TEXT_SECTION_NAME): Delete.
+
+2002-09-05 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * real.c: Avoid parse error if FLOAT_WORDS_BIG_ENDIAN is
+ not a compile-time constant for the non-IBM case.
+ * config/arm/arm-protos.h (arm_float_words_big_endian): New
+ prototype.
+ * config/arm/arm.c (arm_float_words_big_endian): New function.
+ * config/arm/arm.h (TARGET_CPU_CPP_BUILTINS): Define __VFP_FP__
+ if TARGET_VFP and not TARGET_HARD_FLOAT.
+ (ARM_FLAG_VFP, TARGET_VFP): Define.
+ (FLOAT_WORDS_BIG_ENDIAN): Use arm_float_words_big_endian.
+
+2002-09-05 David Edelsohn <edelsohn@gnu.org>
+
+ * doc/install.texi: Correct text of s390-*-linux* and s390x-*-linux*
+ URLs. Fix AIX wording.
+
+2002-09-05 Stan Shebs <shebs@apple.com>
+
+ * config/rs6000/rs6000.c (rs6000_override_options): Make -fpic and
+ -fPIC equivalent on Darwin.
+
+Thu Sep 5 16:27:47 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.c (sh_expand_builtin): Return early if encountering an
+ error_mark for a type.
+
+2002-09-05 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_expand_plus_operand): Do not require
+ double-word scratch register.
+ config/s390/s390.md ("reload_indi", "reload_insi"): Adapt.
+
+ ("*tmqi_ext", "*tmdi_mem", "*tmsi_mem", "*tmhi_mem", "*tmqi_mem",
+ "*cli"): Replace s_operand by memory_operand.
+ ("cmpstrdi", "cmpstrsi"): Replace s_operand by general_operand.
+
+2002-09-05 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.c (asm_file_start): Add a missing
+ semicolon.
+
+2002-09-04 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ * c-typeck.c (build_function_call): Remove unused variable(s).
+ (build_c_cast): Likewise.
+ * calls.c (rtx_for_function_call): Likewise.
+ * cfglayout.c (duplicate_insn_chain): Likewise.
+ * cfgloop.c (flow_loop_nodes_find): Likewise.
+ * cfgrtl.c (split_edge): Likewise.
+ * df.c (df_ref_create): Likewise.
+ * except.c (expand_end_catch): Likewise.
+ * expr.c (emit_push_insn, store_constructor, expand_expr): Likewise.
+ * function.c (emit_return_into_block): Likewise.
+ (reposition_prologue_and_epilogue_notes): Likewise.
+ * gengtype.c (get_file_basename, write_gc_structure_fields): Likewise.
+ * combine.c (subst_prev_insn, need_refresh): Remove.
+ * dwarf2out.c (primary_filename): Remove.
+ * final.c (new_block): Remove.
+ * gcse.c (orig_bb_count): Remove.
+
+2002-09-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * dsp16xx-protos.h (dsp16xx_compare_gen): Change to bool.
+ * dsp16xx.c (dsp16xx_compare_gen): Likewise.
+ * dsp16xx.md: Treat dsp16xx_compare_gen as a bool. Call functions
+ directly instead of using a function pointer.
+
+2002-09-04 Krister Walfridsson <cato@df.lth.se>
+
+ * config/i386/i386.h (GOT_SYMBOL_NAME): Define.
+ * config/i386/i386.c (output_set_got): Use GOT_SYMBOL_NAME.
+ (ix86_output_addr_diff_elt) Likewise.
+ (x86_output_mi_thunk) Likewise.
+ * config/i386/netbsd.h (GOT_SYMBOL_NAME): Redefine.
+
+2002-09-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * frv.c (frv_encode_section_info): Fix error in last change.
+
+2002-09-04 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_flag_pic): New variable.
+ (rs6000_elf_encode_section_info): ATTRIBUTE_UNUSED.
+ (TARGET_BINDS_LOCAL_P): Define.
+ (rs6000_override_options): Save original flag_pic value.
+ (rs6000_elf_select_section): Call default_elf_select_section_1.
+ (rs6000_elf_unique_section): Call default_unique_section_1.
+ (rs6000_elf_in_small_data_p): New function.
+ (rs6000_xcoff_asm_named_section): Determine storage mapping class.
+ (rs6000_xcoff_select_section): Update based on defaults.
+ (rs6000_xcoff_unique_section): Set to basic name if not common.
+ (rs6000_binds_local_p): New function.
+ * config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Set
+ targetm.have_srodata_section if SDATA_EABI.
+ (TARGET_IN_SMALL_DATA_P): Define.
+
+2002-09-04 Dale Johannesen <dalej@apple.com>
+
+ * varasm.c (struct rtx_const, decode_rtx_const):
+ Make veclo and vechi fields not share storage.
+
+Thu Sep 5 00:34:33 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * loop.c (scan_loop): Don't mark separate insns out of a libcall
+ for moving.
+ (move_movables): Abort if we see the first insn of a libcall.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * builtin-types.def (BT_FN_FLOAT): New.
+ (BT_FN_DOUBLE, BT_FN_LONG_DOUBLE): New.
+ * builtins.def (BUILT_IN_INF, BUILT_IN_INFF, BUILT_IN_INFL,
+ BUILT_IN_HUGE_VAL, BUILT_IN_HUGE_VALF, BUILT_IN_HUGE_VALL): New.
+ * builtins.c (fold_builtin_inf): New.
+ (fold_builtin): Call it.
+ * real.c (ereal_inf): New.
+ * real.h: Declare it.
+ * doc/extend.texi: Document new builtins.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * cse.c (cse_insn): Avoid subreg games if the equivalence
+ is already in the proper mode.
+
+2002-09-04 Eric Botcazou <ebotcazou@multimania.com>
+
+ PR c/7102
+ * optabs.c (expand_binop): Convert CONST_INTs in all cases.
+
+2002-09-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.md (setccfp0, setccfp1): New patterns.
+
+2002-09-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * frv-protos.h (frv_init_builtins, frv_expand_builtin,
+ frv_select_section, frv_select_rtx_section,
+ frv_encode_section_info, frv_unique_section): Delete.
+ * frv.c: Update for target hooks.
+ * frv.h (STRIP_NAME_ENCODING, SLOW_ZERO_EXTEND, SELECT_SECTION,
+ SELECT_RTX_SECTION, ENCODE_SECTION_INFO, UNIQUE_SECTION,
+ EASY_DIV_EXPR, MD_INIT_BUILTINS, MD_EXPAND_BUILTIN): Delete.
+
+2002-09-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * ip2k-protos.h (function_prologue, function_epilogue,
+ encode_section_info): Update to match target hook specification.
+ * ip2k.c: Wrap `MDR' code in IP2K_MD_REORG_PASS.
+ (function_prologue, function_epilogue, encode_section_info):
+ Update to match target hook specification.
+ * ip2k.h (SELECT_SECTION, SELECT_RTX_SECTION, ASM_OPEN_PAREN,
+ ASM_CLOSE_PAREN, EASY_DIV_EXPR): Delete.
+ (NOTICE_UPDATE_CC): Cast to void.
+ * ip2k.md: Add defaults in switch statements.
+
+2002-09-04 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/trouble.texi (Interoperation): Update information about C++ ABI
+ issues.
+
+2002-09-04 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/sparc/t-netbsd64: Disable multilib for now.
+
+2002-09-04 David Edelsohn <edelsohn@gnu.org>
+
+ * target-def.h (TARGET_HAVE_SRODATA_SECTION): New macro.
+ * target.h (gcc_target): Add have_srodata_section member.
+ * varasm.c (section_category): Add SECCAT_SRODATA.
+ (categorize_decl_for_section): Return SECCAT_SRODATA for sdata if
+ READONLY_SDATA_SECTION defined.
+ (decl_readonly_section_1): True for SECCAT_SRODATA also.
+ (default_elf_select_section_1): Map SECCAT_SRODATA to .sdata2.
+ (default_unique_section_1): Likewise.
+
+2002-09-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * expr.c (emit_group_load): Revise to allow splitting TCmode source
+ into DImode pieces.
+
+ * pa-64.h (LONG_DOUBLE_TYPE_SIZE): Define to 128.
+ * pa64-regs.h (CLASS_CANNOT_CHANGE_MODE_P): Inhibit changes from SImode
+ for floating-point register class.
+ * pa.c (function_arg): Fix handling of modes wider than one word for
+ TARGET_64BIT.
+
+Wed Sep 4 18:48:10 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * combine.c (make_compound_operation): Don't generate zero / sign
+ extensions in floating point modes.
+
+2002-09-04 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/c-tree.texi: Fix overfull hboxes.
+ * doc/cppopts.texi: Ditto.
+ * doc/extend.texi: Ditto.
+ * doc/gty.texi: Ditto.
+ * doc/invoke.texi: Ditto.
+ * doc/makefile.texi: Ditto.
+ * doc/rtl.texi: Ditto.
+ * doc/standards.texi: Ditto.
+ * doc/tm.texi: Ditto.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * c-common.c (builtin_define_with_hex_fp_value): New.
+ (builtin_define_float_constants): Use it. Fix H_FLOAT mant_dig.
+
+2002-09-04 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/invoke.texi (-fshort-wchar): Move to Code Generation Options.
+ (-fpcc-struct-return, -freg-struct-return, -fshort-enums,
+ -fshort-double, -fshort-wchar, -fpack-struct, -fleading-underscore):
+ Warn that these options can break ABI compatibility.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * real.c (ereal_to_decimal): Add digits parameter.
+ * real.h (REAL_VALUE_TO_DECIMAL): Remove format; add digits parameter.
+ * c-pretty-print.c (pp_c_real_literal): Update call.
+ * print-rtl.c (print_rtx): Likewise.
+ * print-tree.c (print_node_brief, print_node): Likewise.
+ * sched-vis.c (print_value): Likewise.
+ * config/arc/arc.c (arc_print_operand): Likewise.
+ * config/c4x/c4x.c (c4x_print_operand): Likewise.
+ * config/i370/i370.h (PRINT_OPERAND): Likewise.
+ * config/i386/i386.c (print_operand): Likewise.
+ * config/i960/i960.c (i960_print_operand): Likewise.
+ * config/ip2k/ip2k.c (asm_output_float): Likewise.
+ * config/m32r/m32r.c (m32r_print_operand): Likewise.
+ * config/m68hc11/m68hc11.c (print_operand): Likewise.
+ * config/m68k/hp320.h (PRINT_OPERAND, ASM_OUTPUT_FLOAT_OPERAND,
+ ASM_OUTPUT_DOUBLE_OPERAND, ASM_OUTPUT_LONG_DOUBLE_OPERAND): Likewise.
+ * config/m68k/m68k.h (ASM_OUTPUT_FLOAT_OPERAND,
+ ASM_OUTPUT_DOUBLE_OPERAND, ASM_OUTPUT_LONG_DOUBLE_OPERAND): Likewise.
+ * config/m68k/sun2o4.h (ASM_OUTPUT_FLOAT_OPERAND,
+ ASM_OUTPUT_DOUBLE_OPERAND): Likewise.
+ * config/m68k/sun3.h (ASM_OUTPUT_FLOAT_OPERAND,
+ ASM_OUTPUT_DOUBLE_OPERAND): Likewise.
+ * config/mips/mips.c (print_operand): Likewise.
+ * config/ns32k/ns32k.c (print_operand): Likewise.
+ * config/pdp11/pdp11.h (PRINT_OPERAND): Likewise.
+ * config/vax/vax.h (PRINT_OPERAND): Likewise.
+ * doc/tm.texi (REAL_VALUE_TO_DECIMAL): Update docs.
+
+2002-09-04 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/elf.h (TARGET_SECTION_TYPE_FLAGS): Define to
+ xtensa_multibss_section_type_flags.
+ * config/xtensa/xtensa.c (xtensa_multibss_section_type_flags): Define.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * doc/install-old.texi: Don't mention enquire.
+ * doc/sourcebuild.texi: Update float.h description.
+
+Wed Sep 4 11:22:14 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.md (mperm_w_little, mperm_w_big): Supply mode for zero_extract.
+
+2002-09-03 Roger Sayle <roger@eyesopen.com>
+
+ * builtins.c (build_function_call_expr): Remove prototype, export
+ as non-static and add a comment above function definition.
+ (builtin_mathfn_code): New function to check for math builtins.
+ (fold_builtin): Optimize sqrt(0.0) as 0.0, sqrt(1.0) as 1.0,
+ exp(0.0) as 1.0, and log(1.0) as 0.0. Optimize exp(log(x)) and
+ log(exp(x)) as x. Optimize sqrt(exp(x)) as exp(x/2.0) and
+ log(sqrt(x)) as log(x)/2.0.
+
+ * tree.h: Prototype build_function_call_expr and builtin_mathfn_code
+ in new "builtins.c" section. Place the build_range_type prototype
+ with the other prototypes from "tree.c".
+
+ * fold-const.c (fold) [ABS_EXPR]: Fold fabs(sqrt(x)) as sqrt(x)
+ and fabs(exp(x)) as exp(x). [MULT_EXPR]: Fold sqrt(x)*sqrt(y)
+ as sqrt(x*y) and exp(x)*exp(y) as exp(x+y). [RDIV_EXPR]: Fold
+ x/exp(y) as x*exp(-y).
+
+2002-09-03 David Edelsohn <edelsohn@gnu.org>
+
+ * varasm.c (default_section_type_flags): Append _1 to name with
+ shlib parameter. Use original name to call new function with
+ implicit flag_pic.
+ (decl_readonly_section): Likewise.
+ (default_elf_select_section): Likewise.
+ (default_unique_section): Likewise.
+ (default_bind_local_p): Likewise.
+ (categorize_decl_for_section): Add shlib parameter to use in place
+ of implicit flag_pic.
+ * output.h: Declare new functions with _1 and shlib argument.
+
+2002-09-03 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/install.texi: Fix typos, formatting problems, and obvious
+ overfull/underfull boxes.
+
+ * Makefile.in (TEXI_GCC_FILES): Add compat.texi.
+ * doc/gcc.texi (Top): Add new chapter, Binary Compatibility, and
+ include its file, compat.texi.
+ * doc/compat.texi: New file with new chapter, Binary Compatibility.
+
+2002-09-03 Neil Booth <neil@daikokuya.co.uk>
+
+ Debian BTS Bug #157416
+ * cpphash.h (FIRST, LAST, CUR, RLIMIT): Fix definitions.
+ * cpplib.c (destringize_and_run): Kludge around getting
+ tokens from in-progress macros.
+ (_cpp_do__Pragma): Simplify.
+
+2002-09-03 Steve Ellcey <sje@cup.hp.com>
+
+ * config/ia64/ia64.h (EXTRA_SPECS): Remove cpp_cpu.
+ (CPP_CPU_SPEC): Remove.
+ (TARGET_CPU_CPP_BUILTINS): New.
+ * config/ia64/hpux.h (CPP_PREDEFINES): Remove.
+ (CPP_SPEC): Remove.
+ (TARGET_OS_CPP_BUILTINS): New.
+ * config/ia64/linux.h (CPP_PREDEFINES): Remove.
+ (TARGET_OS_CPP_BUILTINS): New.
+ * config/ia64/aix.h (CPP_SPEC): Move some stuff to
+ TARGET_OS_CPP_BUILTINS.
+ (CPP_PREDEFINES): Remove.
+ (CPLUSPLUS_CPP_SPEC): Remove.
+ (TARGET_OS_CPP_BUILTINS): New.
+
+2002-09-03 Richard Henderson <rth@redhat.com>
+
+ * Makefile.in (USER_H): Add ginclude/float.h.
+ (FLOAT_H): Remove.
+ (stmp-int-hdrs, install-mkheaders): Don't handle FLOAT_H.
+ (mostlyclean): Don't remove float.h intermediate files.
+ (distclean): Don't remove float.h.
+ * config.gcc: Remove all float_format references.
+ * configure.in (float_format, float_h_file): Remove.
+
+ * c-common.c: Include tree-inline.h.
+ (builtin_define_with_int_value): New.
+ (builtin_define_type_precision): Use it.
+ (builtin_define_float_constants): New.
+ (cb_register_builtins): Use it. Define __FLT_RADIX__ and
+ __FLT_EVAL_METHOD__.
+ * defaults.h (TARGET_FLT_EVAL_METHOD): New.
+ * config/i386/i386.h (TARGET_FLT_EVAL_METHOD): New.
+ * config/m68k/m68k.h (TARGET_FLT_EVAL_METHOD): New.
+ * doc/tm.texi (INTEL_EXTENDED_IEEE_FORMAT): Mention moto 96-bit format.
+ (TARGET_FLT_EVAL_METHOD): New.
+
+ * config/float-c4x.h, config/float-i128.h, config/float-i32.h,
+ config/float-i386.h, config/float-i64.h, config/float-m68k.h,
+ config/float-sh.h, config/float-sparc.h, config/float-vax.h: Remove.
+ * ginclude/float.h: New.
+
+2002-09-03 Stan Shebs <shebs@apple.com>
+
+ * config/darwin.h (WARN_FOUR_CHAR_CONSTANTS): Remove, never used.
+ (DWARF2_DEBUGGING_INFO): Remove until assembler accepts Dwarf-2.
+ (PREFERRED_DEBUGGING_TYPE): Ditto.
+ (ASM_OUTPUT_IDENT): Remove empty definition.
+
+2002-09-03 Steve Ellcey <sje@cup.hp.com>
+
+ * config.gcc (ia64*-*-hpux*): Add ia64-c.o to c_target and
+ cxx_target.
+ * config/ia64/hpux.h (REGISTER_TARGET_PRAGMAS): Register pragma
+ handling routine for builtin pragma.
+ * config/ia64/ia64-protos.h (ia64_hpux_handle_builtin_pragma):
+ Registered pragma handling routine.
+ * ia64-c.c (ia64_hpux_handle_builtin_pragma): Ditto.
+ (ia64_hpux_add_pragma_builtin) New subroutine used by above.
+ If builtin pragma seen for math routine and C89 conformance is
+ requested use different math function in order to set errno.
+ * t-ia64 (ia64-c.o): Add new rule for new file.
+
+2002-09-03 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.md ("movti"): Add Q->Q alternative.
+ ("*movdi_64", "*movdi_31", "*movsi", "movhi", "movqi_64",
+ "movqi", "*movdf_64", "*movdf_31", "*movsf"): Likewise.
+
+ ("*movti_ss", "*movdi_ss", "*movsi_ss", "*movdf_ss",
+ "*movsf_ss"): Remove.
+
+2002-09-03 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa32-regs.h (CLASS_CANNOT_CHANGE_MODE, CLASS_CANNOT_CHANGE_MODE_P):
+ Delete macros.
+
+2002-09-03 Arati Dikey <aratid@kpit.com>
+
+ * h8300.c (asm_file_start): Corrected optimization comment.
+
+2002-09-03 Stan Shebs <shebs@apple.com>
+
+ * c-lang.c (recognize_objc_keyword): Remove, no longer used.
+ * c-tree.h (recognize_objc_keyword): Remove decl.
+ * c-typeck.c (comp_target_types): Update a comment.
+
+2002-09-03 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_decompose_address): Remove STRICT parameter
+ and register validity checks.
+ (general_s_operand): Adapt to s390_decompose_address interface change.
+ (q_constraint): Likewise.
+ (s390_expand_plus_operand): Likewise.
+ (legitimiate_address_p): Likewise.
+ (legitimate_la_operand_p): Likewise.
+ (legitimize_la_operand): Likewise.
+ (print_operand_address): Likewise.
+ (print_operand): Likewise.
+
+Tue Sep 3 11:32:14 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ PR objc/5956:
+ * objc/objc-act.c (build_typed_selector_reference): Fix typo which
+ was causing the new selector never to match the existing ones
+ (Patch by Alexander Malmberg <alexander@malmberg.org>).
+
+2002-09-03 Graham Stott <graham.stott@btinternet.com>
+
+ * config/i386/i386.md ("femms"): Add "memory" attr "none".
+
+2002-09-03 Graham Stott <graham.stott@btinternet.com>
+
+ * expr.c (expand_expr): Remove extraneous comment and code.
+
+2002-09-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ * stor-layout (finish_builtin_struct): Renamed and moved from c++
+ frontend. Take chain of fields. Allow NULL alignment type.
+ * tree.h (finish_builtin_struct): Declare.
+
+2002-09-01 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * config/alpha/alpha.c config/alpha/alpha.h config/alpha/alpha.md
+ config/alpha/elf.h config/alpha/unicosmk.h config/alpha/vms.h
+ config/arc/arc.c config/arc/arc.h config/arm/aout.h
+ config/arm/arm.c config/arm/arm.h config/arm/arm.md
+ config/avr/avr.h config/d30v/d30v.h config/dbxcoff.h
+ config/dbxelf.h config/elfos.h config/fr30/fr30.h config/frv/frv.h
+ config/i386/i386.c config/i386/i386.md config/i386/sco5.h
+ config/ia64/ia64.h config/ip2k/ip2k.h config/m68hc11/m68hc11.md
+ config/m68k/hp320.h config/m68k/m68k.c config/m68k/m68k.md
+ config/m68k/mot3300.h config/m68k/sgs.h config/m68k/tower-as.h
+ config/m88k/m88k.c config/m88k/m88k.h config/mcore/mcore-pe.h
+ config/mcore/mcore.c config/mips/mips.c config/mips/mips.h
+ config/ns32k/ns32k.md config/pa/pa-linux.h config/pa/pa.c
+ config/pa/pa.h config/pa/pa.md config/romp/romp.h
+ config/rs6000/linux64.h config/rs6000/lynx.h
+ config/rs6000/rs6000.c config/rs6000/sysv4.h config/rs6000/xcoff.h
+ config/s390/s390.c config/s390/s390.md config/sh/sh.c
+ config/sparc/sparc.c config/sparc/sysv4.h
+ config/stormy16/stormy16.h dbxout.c defaults.h dwarf2out.c
+ dwarfout.c except.c final.c varasm.c vmsdbgout.c: Replace
+ ASM_OUTPUT_INTERNAL_LABEL macro with a call to the target hook.
+
+ * doc/tm.texi: Update docs.
+ * default.h (ASM_OUTPUT_INTERNAL_LABEL): Don't define.
+ * system.h (ASM_OUTPUT_INTERNAL_LABEL): Poison.
+
+2002-08-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.in (sdbout.o, insn-output.o): Depend on $(TARGET_H).
+ * arc.c (arc_internal_label): New function.
+ (TARGET_ASM_INTERNAL_LABEL): Set.
+ * arc.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * arm.c (arm_internal_label): New function.
+ (TARGET_ASM_INTERNAL_LABEL): Set.
+ * arm.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * arm/elf.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * i370.c (i370_internal_label): New function.
+ (TARGET_ASM_INTERNAL_LABEL): Set.
+ * i370.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * m68k/hp320.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * m68k.c (m68k_hp320_internal_label): New function.
+ (TARGET_ASM_INTERNAL_LABEL): Set.
+ * m88k.c (m88k_internal_label): New function.
+ (TARGET_ASM_INTERNAL_LABEL): Set.
+ * m88k.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * defaults.h (ASM_OUTPUT_INTERNAL_LABEL): Set to target hook.
+ * genoutput.c (output_prologue): Include target.h in output file.
+ * output.h (default_internal_label): Declare.
+ * sdbout.c: Include target.h.
+ * target-def.h (TARGET_ASM_INTERNAL_LABEL): Set and add to
+ TARGET_ASM_OUT.
+ * target.h (internal_label): Add to struct gcc_target.
+ * varasm.c (default_internal_label): New function.
+
+2002-08-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * alpha.h (ASM_OUTPUT_INTERNAL_LABEL): Delete.
+ * avr.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * c4x.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * cris.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * d30v.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * darwin.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * dsp16xx.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * elfos.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * h8300.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i386/att.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i386/bsd.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i386/i386-coff.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i386/lynx-ng.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i386/lynx.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i386/sco5.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * i960/i960.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m68k/3b1.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m68k/amix.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m68k/atari.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m68k.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m68k/mot3300.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m68k/tower-as.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * m88k.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * mcore.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * mips.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * mmix-protos.h (mmix_asm_output_internal_label): Likewise.
+ * mmix.c (mmix_asm_output_internal_label): Likewise.
+ * mmix.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * ns32k.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * pa.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * pdp11.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * romp.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * rs6000/xcoff.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sh/coff.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sh/elf.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/freebsd.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/linux.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/linux64.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/netbsd-elf.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/pbd.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/sol2.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * sparc/vxsim.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * stormy16.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * svr3.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+ * vax.h (ASM_OUTPUT_INTERNAL_LABEL): Likewise.
+
+ * defaults.h (ASM_OUTPUT_INTERNAL_LABEL): Define.
+
+2002-08-31 Richard Henderson <rth@redhat.com>
+
+ * expr.c (block_move_libcall_safe_for_call_parm): Fix thinko.
+
+2002-08-31 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.c (pa_globalize_label): Add ATTRIBUTE_UNUSED to prototype.
+
+2002-08-30 Richard Henderson <rth@redhat.com>
+
+ PR opt/7515
+ * c-objc-common.c: Include target.h.
+ (c_cannot_inline_tree_fn): Don't auto-inline functions that
+ don't bind locally. Factor setting DECL_UNINLINABLE.
+ * Makefile.in (c-objc-common.o): Update.
+
+2002-08-30 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/install.texi (Configuration, Building): Fix a typo and
+ some formatting directives.
+
+2002-08-30 Paul Koning <pkoning@equallogic.com>
+
+ * doc/c-tree.texi (RDIV_EXPR): Fix typo.
+ * doc/rtl.texi (post_modify): Remove misplaced text, remove "not
+ implemented" note.
+ * doc/md.texi (IP2K): Move machine-specific constraints before MIPS
+ for alphabetic order.
+ * doc/tm.texi (TARGET_FLOAT_FORMAT): Update description for
+ VAX_FLOAT_FORMAT. Remove reference to HOST_FLOAT_FORMAT.
+ (VAX_HALFWORD_ORDER): Document.
+ (LARGEST_EXPONENT_IS_NORMAL): Remove note about being only for
+ IEEE float format.
+ (TARGET_SCHED_ISSUE_RATE): Reword reference to MAX_DFA_ISSUE_RATE.
+ (ASM_OUTPUT_LABEL_REF): Fix font.
+ (CASE_VECTOR_SHORTEN_MODE): Ditto.
+
+2002-08-30 Denis Chertykov <denisc@overta.ru>
+
+ * config/ip2k/ip2k.c (ip2k_set_compare): Remove all const_double
+ stuff.
+ (ip2k_gen_unsigned_comp_branch): Handle CONST_INT and
+ CONST_DOUBLE constants.
+
+2002-08-30 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/alpha/alpha.h (TARGET_CPU_CPP_BUILTINS): Move language-
+ related defines to...
+ (SUBTARGET_LANGUAGE_CPP_BUILTINS): ...here.
+ * config/alpha/netbsd.h (SUBTARGET_LANGUAGE_CPP_BUILTINS): Redefine
+ as a no-op.
+
+2002-08-30 Krister Walfridsson <cato@df.lth.se>
+
+ * config/arm/arm.c (arm_asm_output_labelref): New function.
+ * config/arm/arm.h (ASM_OUTPUT_LABELREF): Call arm_asm_output_labelref.
+ * config/arm/arm-protos.h: Add prototype for arm_asm_output_labelref.
+
+2002-08-29 Rodney Brown <rbrown64@csc.com.au>
+
+ * doc/install.texi (Specific, alpha*-dec-osf*): Add "virtual
+ memory exhausted" workarounds.
+
+2002-08-30 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * diagnostic.c (fancy_abort): Don't repeat "internal error".
+ * toplev.c (crash_signal): Likewise.
+
+Fri Aug 30 00:33:37 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * doc/cpp.texi (__NEXT_RUNTIME__): Extended documentation.
+ * doc/invoke.texi (-fnext-runtime, -Wno-protocol, -Wselector):
+ Extended, updated documentation.
+ (-Wundeclared-selector): Documented.
+
+2002-08-29 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/chorus.h: Consistently define *_DEBUGGING_INFO with
+ the value 1. Do not undef before defining.
+ * config/darwin.h: Likewise.
+ * config/dbx.h: Likewise.
+ * config/dbxcoff.h: Likewise.
+ * config/dbxelf.h: Likewise.
+ * config/elfos.h: Likewise.
+ * config/interix.h: Likewise.
+ * config/lynx-ng.h: Likewise.
+ * config/lynx.h: Likewise.
+ * config/netware.h: Likewise.
+ * config/psos.h: Likewise.
+ * config/svr3.h: Likewise.
+ * config/alpha/alpha.h: Likewise.
+ * config/alpha/elf.h: Likewise.
+ * config/alpha/vms.h: Likewise.
+ * config/arc/arc.h: Likewise.
+ * config/arm/aout.h: Likewise.
+ * config/arm/coff.h: Likewise.
+ * config/c4x/c4x.h: Likewise.
+ * config/h8300/h8300.h: Likewise.
+ * config/i386/cygwin.h: Likewise.
+ * config/i386/djgpp.h: Likewise.
+ * config/i386/gas.h: Likewise.
+ * config/i386/gstabs.h: Likewise.
+ * config/i386/i386-coff.h: Likewise.
+ * config/i386/i386-interix.h: Likewise.
+ * config/i386/sco5.h: Likewise.
+ * config/i386/svr3dbx.h: Likewise.
+ * config/i386/sysv3.h: Likewise.
+ * config/i386/win32.h: Likewise.
+ * config/i386/x86-64.h: Likewise.
+ * config/i960/i960.h: Likewise.
+ * config/ia64/ia64.h: Likewise.
+ * config/ip2k/ip2k.h: Likewise.
+ * config/m32r/m32r.h: Likewise.
+ * config/m68k/3b1.h: Likewise.
+ * config/m68k/3b1g.h: Likewise.
+ * config/m68k/ccur-GAS.h: Likewise.
+ * config/m68k/coff.h: Likewise.
+ * config/m68k/hp2bsd.h: Likewise.
+ * config/m68k/hp310g.h: Likewise.
+ * config/m68k/hp320g.h: Likewise.
+ * config/m68k/hp3bsd.h: Likewise.
+ * config/m68k/hp3bsd44.h: Likewise.
+ * config/m68k/linux-aout.h: Likewise.
+ * config/m68k/m68k-aout.h: Likewise.
+ * config/m68k/mot3300.h: Likewise.
+ * config/m68k/netbsd.h: Likewise.
+ * config/m68k/openbsd.h: Likewise.
+ * config/m68k/pbb.h: Likewise.
+ * config/m68k/plexus.h: Likewise.
+ * config/m68k/sun2.h: Likewise.
+ * config/m68k/sun3.h: Likewise.
+ * config/m68k/tower-as.h: Likewise.
+ * config/m68k/vxm68k.h: Likewise.
+ * config/m88k/aout-dbx.h: Likewise.
+ * config/m88k/m88k-aout.h: Likewise.
+ * config/mcore/mcore-elf.h: Likewise.
+ * config/mcore/mcore-pe.h: Likewise.
+ * config/mips/elf.h: Likewise.
+ * config/mips/elf64.h: Likewise.
+ * config/mips/iris5gas.h: Likewise.
+ * config/mips/iris6.h: Likewise.
+ * config/mips/mips.h: Likewise.
+ * config/mips/sni-gas.h: Likewise.
+ * config/mmix/mmix.h: Likewise.
+ * config/ns32k/netbsd.h: Likewise.
+ * config/pa/pa64-hpux.h: Likewise.
+ * config/romp/romp.h: Likewise.
+ * config/rs6000/sysv4.h: Likewise.
+ * config/rs6000/xcoff.h: Likewise.
+ * config/sh/coff.h: Likewise.
+ * config/sh/elf.h: Likewise.
+ * config/sparc/linux64.h: Likewise.
+ * config/sparc/liteelf.h: Likewise.
+ * config/sparc/netbsd.h: Likewise.
+ * config/sparc/openbsd.h: Likewise.
+ * config/sparc/pbd.h: Likewise.
+ * config/sparc/sp64-elf.h: Likewise.
+ * config/sparc/sp86x-elf.h: Likewise.
+ * config/sparc/sparc.h: Likewise.
+ * config/vax/vax.h: Likewise.
+ * config/vax/vaxv.h: Likewise.
+
+2002-08-29 "Dhananjay R. Deshpande" <dhananjayd@kpit.com>
+
+ * h8300.c (shift_alg_hi): Various tweaks to improve performance
+ of HImode shifts.
+ (get_shift_alg): Corresponding changes.
+
+2002-08-29 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * som.h (ALWAYS_STRIP_DOTDOT): Define to 1.
+
+2002-08-29 Richard Henderson <rth@redhat.com>
+
+ * expr.h (enum block_op_methods): New.
+ (emit_block_move): Update prototype.
+ * expr.c (block_move_libcall_safe_for_call_parm): New.
+ (emit_block_move_via_loop): New.
+ (emit_block_move): Use them. New argument METHOD.
+ (emit_push_insn): Always respect the given alignment.
+ (expand_assignment): Update call to emit_block_move.
+ (store_expr, store_field, expand_expr): Likewise.
+ * builtins.c (expand_builtin_apply): Likewise.
+ (expand_builtin_memcpy, expand_builtin_va_copy): Likewise.
+ * function.c (expand_function_end): Likewise.
+ * config/sh/sh.c (sh_initialize_trampoline): Likewise.
+ * config/sparc/sparc.c (sparc_va_arg): Likewise.
+ * calls.c (expand_call, emit_library_call_value_1): Likewise.
+ (save_fixed_argument_area): Use emit_block_move with
+ BLOCK_OP_CALL_PARM instead of move_by_pieces.
+ (restore_fixed_argument_area): Likewise.
+ (store_one_arg): Fix alignment parameter to emit_push_insn.
+
+2002-08-29 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * install.texi (hppa64-hp-hpux11*): Document installation procedure.
+
+2002-08-29 Catherine Moore <clm@redhat.com>
+
+ * config/v850/v850.h (MULDI3_LIBCALL, UCMPDI2_LIBCALL, CMPDI2_LIBCALL,
+ NEGDI2_LIBCALL, INIT_TARGET_OPTABS, MASK_STRICT_ALIGN): Define.
+ (PREDICATE_CODES): Include new predicates.
+ (RTX_COSTS): Handle UMOD and UDIV. Tune MULT for v850e.
+ (TARGET_SWITCHES): Add strict-align.
+ (TARGET_STRICT_ALIGN): New.
+ (MASK_DEFAULT, STRICT_ALIGNMENT): Redefine.
+ * config/v850/t-v850 (MULTILIB_OPTIONS, MULTILIB_DIRNAMES):
+ Define.
+ (LIB1ASMFUNCS): Add v850_negdi2, v850_cmpdi2, v850_ucmpdi2,
+ v850_muldi3.
+ * config/v850/lib1funcs.asm (L_callt_save_r2_r29, L_return_r2_r29,
+ L_callt_save_r2_r31, L_return_r2_r31,
+ L_save_all_interrupt): Change addi to add.
+ (L_save_interrupt, L_return_interrupt): Rework.
+ (__return_r31): Correct .size directive.
+ (mulsi3, divsi3, udivsi3, umodsi3, modsi3): Tune for v850e.
+ (v850_negdi2, v850_cmpdi2, v850_ucmpdi2, v850_muldi3):
+ New routines.
+ * config/v850/v850.c (expand_prologue): Call
+ gen_callt_save_interrupt, gen_callt_restore_all_interrupt,
+ gen_callt_return_interrupt and gen_callt_save_all_interrupt.
+ (reg_or_int9_operand): New predicate.
+ (reg_or_const_operand): New routine.
+ * config/v850/v850.md (return_interrupt): Changed from
+ restore_interrupt.
+ (callt_save_all_interrupt): Changed from save_all_interrupt_v850e.
+ (callt_save_interrupt): Change save sequence.
+ (callt_return_interrupt): New.
+ (save_interrupt): Don't use runtime function for LONG_CALLS
+ and TARGET_PROLOG_FUNCTION.
+ (save_all_interrupt): Likewise.
+ (mulsi3): Use new predicate.
+ (moviscc): Disallow some combination of constants.
+ Fix define_split for sasf insns, so that it will not generate bad
+ code if operand0 and operand5 are the same.
+ * config/v850/v850-protos.h: Prototype new predicates.
+
+2002-08-29 Zack Weinberg <zack@codesourcery.com>
+
+ * config/rs6000/rs6000.c (processor_target_table): Add 405f.
+ * config/rs6000/rs6000.h (ASM_CPU_SPEC): Likewise.
+
+2002-08-28 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * c-common.c (builtin_define_type_precision): New function.
+ (cb_register_builtins): Use it. Define __WCHAR_UNSIGNED__ is
+ wchar_t is unsigned in C++.
+ * doc/cpp.texi (Common Predefined Macros): Document
+ __WCHAR_UNSIGNED__, __CHAR_BIT__, __WCHAR_BIT__, __SHRT_BIT__,
+ __INT_BIT__, __LONG_BIT__, __LONG_LONG_BIT__, __FLOAT_BIT__,
+ __DOUBLE_BIT__, __LONG_DOUBLE_BIT__.
+
+2002-08-28 Sylvain Pion <pion@cs.nyu.edu>
+
+ * doc/invoke.texi (-Wreorder): Remove remaining pieces from the generic
+ section. Mention that it is enabled by -Wall.
+ (-Wall): Mention that there can be language-specific warnings as well.
+ (-Wctor-dtor-privacy): Mention that it is enabled by default.
+ (-Wnon-virtual-dtor): Mention that it is enabled by -Wall.
+
+Wed Aug 28 15:35:17 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.c (calc_live_regs): Save FPSCR_REG in an interrupt handler
+ if it is ever live.
+
+ * sh.c (sh_handle_interrupt_handler_attribute): Reject interrupt_handler
+ attribute for SHCOMPACT.
+
+ * sh.h (OVERRIDE_OPTIONS): If align_function isn't set, set it
+ appropriately.
+ (FUNCTION_BOUNDARY): Specify only the minimum alignment required
+ by the ABI.
+
+ * sh.h (SH5_WOULD_BE_PARTIAL_NREGS): Also handle TImode case.
+
+2002-08-28 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config.gcc (mips*-*-netbsd*): Set target_cpu_default to
+ "MASK_GAS|MASK_ABICALLS".
+ * config/mips/netbsd.h (TARGET_ENDIAN_DEFAULT)
+ (TARGET_DEFAULT): Remove.
+ (MACHINE_TYPE): Undefine before defining.
+ (DBX_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE): Remove.
+
+2002-08-27 Mark Mitchell <mark@codesourcery.com>
+
+ * c-common.c (warn_abi): New variable.
+ * c-common.h (warn_abi): Likewise.
+ * c-opts.c (COMMAND_LINE_OPTIONS): Add -Wabi.
+ (c_common_decode_option): Handle it.
+ * doc/invoke.texi: Document -Wabi.
+
+Tue Aug 27 23:03:52 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * c-common.c (warn_undeclared_selector): New variable.
+ * c-common.h (warn_undeclared_selector): Idem.
+ * c-opts.c (c_common_decode_option): Set warn_undeclared_selector
+ to on when -Wundeclared-selector is found.
+ (COMMAND_LINE_OPTIONS): Added -Wundeclared-selector.
+ * objc/objc-act.c (build_selector_expr): If
+ warn_undeclared_selector is set, check that the selector has
+ already been defined, and emit a warning if not.
+
+2002-08-27 Nick Clifton <nickc@redhat.com>
+ Catherine Moore <clm@redhat.com>
+ Jim Wilson <wilson@cygnus.com>
+
+ * config.gcc: Add v850e-*-* target.
+ Add --with-cpu= support for v850.
+ * config/v850/lib1funcs.asm: Add v850e callt functions.
+ * config/v850/v850.h: Add support for v850e target.
+ * config/v850/v850.c: Add functions to support v850e target.
+ * config/v850/v850-protos.h: Add prototypes for new functions in v850.c.
+ * config/v850/v850.md: Add patterns for v850e instructions.
+ * doc/invoke.texi: Document new v850e command line switches.
+
+Tue Aug 27 18:30:47 2002 J"orn Rennecke <joern.rennecke@superh.com>
+ Aldy Hernandez <aldyh at redhat dot com>
+
+ * doc/tm.texi: Applied numerous fixes to the automaton based
+ scheduler descrition.
+
+Tue Aug 27 19:51:05 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (classify_argument): Handle variable sized objects.
+
+Tue Aug 27 19:18:16 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (ix86_expand_int_movcc): Fix RTL sharing problem
+
+Tue Aug 27 18:01:45 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * libgcc2.c (__bb_exit_func): Properly write the summarized statistics.
+
+Tue Aug 27 18:00:11 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (classify_argument): Properly compute word size of the analyzed object.
+
+Tue Aug 27 14:39:09 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.md (attribute type): Add types mt_group, fload, pcfload, fpul_gp,
+ mac_gp ftrc_s and cwb. Add / Adjust definitions in individual insn
+ accordingly.
+ (attribute insn_class): Provide default definitions based on type.
+ Remove all insn-specific settings.
+ (various function units): Remove old SH4 scheduling.
+ (branch_zero, dfp_comp, late_fp_use, any_fp_comp, any_int_load):
+ New attributes. Set them where appropriate.
+ (cpu unit FS): Don't define / use.
+ (F3, load_store): New cpu units.
+ (F01): New reservation.
+ (all insn_reservations): Make dependent on sh4 pipeline model.
+ Fix latencies.
+ (nil, reg_mov, freg_mov, sh4_fpul_gp, sh4_call): New insn_reservations.
+ (sh4_mac_gp, fp_arith_ftrc, arith3, arith3b): Likewise.
+ (mt insn_reservation): Use type mt_group.
+ (insn_reservation load_store): Split into sh4_load, sh4_load_si,
+ sh4_fload and sh4_store.
+ (insn_reservation branch_zero and branch): Replace with sh4_branch.
+ (insn_reservation branch_far): Replace with sh4_return.
+ (insn_reservation return_from_exp): Rename to:
+ (sh4_return_from_exp). Change to be just d_lock*5.
+ (insn_reservation lds_to_pr): Rename to:
+ (sh4_lds_to_pr). Change to be just d_lock*2.
+ (insn_reservation ldsmem_to_pr, sts_from_pr): Change to be just
+ d_lock*2.
+ (insn_reservation prload_mem): Rename to:
+ (sh4_prstore_mem). Change to d_lock*2,nothing,memory.
+ (insn_reservation fpscr_store): Rename to:
+ (fpscr_load). Change to d_lock,nothing,F1*3.
+ (insn_reservation fpscr_store_mem): Rename to:
+ (fpscr_load_mem). Change to d_lock,nothing,(F1+memory),F1*2.
+ (insn_reservation multi): Change to
+ d_lock,(d_lock+f1_1),(f1_1|f1_2)*3,F2.
+ (insn_reservation fp_arith): Change to issue,F01,F2.
+ (insn_reservation fp_div: Change to issue,F01+F3,F2+F3,F3*7,F1+F3,F2.
+ (insn_reservation dp_float): Change to issue,F01,F1+F2,F2.
+ (insn_reservation fp_double_arith): Change to issue,F01,F1+F2,fpu*4,F2.
+ (insn_reservation fp_double_cmp): Change to
+ d_lock,(d_lock+F01),F1+F2,F2.
+ (insn_reservation dp_div): Change to
+ issue,F01+F3,F1+F2+F3,F2+F3,F3*16,F1+F3,(fpu+F3)*2,F2.
+ * sh.c (flow_dependent_p, flow_dependent_p_1): New functions.
+ (sh_adjust_cost, SHcompact): Differentiate between different
+ kinds of dependencies. Drop factor of ten for superscalar.
+ Use new instruction types. Add new exception rules.
+
+ * sh.md (mulhisi3, umulhisi3: Add a REG_EQUAL note.
+
+ * sh.md (mperm_w): Add DONE.
+
+2002-08-27 David Edelsohn <edelsohn@gnu.org>
+
+ * longlong.h: Import current PowerPC defintion from GMP-4.1.
+
+ * config/rs6000/rs6000.h (MIN_UNITS_PER_WORD): Add IN_LIBGCC2 case.
+
+ * config/rs6000/linux64.h (ADJUST_FIELD_ALIGN): Undef before define.
+
+Tue Aug 27 13:53:57 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.h (MAX_FIXED_MODE_SIZE): Define.
+
+2002-08-27 Gabriel Dos Reis <gdr@soliton.integrable-solutions.net>
+
+ * doc/cpp.texi (Common Predefined Macros): Don't mess with table
+ delimiter.
+
+2002-08-27 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * c-common.c (cpp_define_data_format): New function.
+ (cb_register_builtins): Call it.
+
+ * doc/cpp.texi (Common Predefined Macros): Document
+ __TARGET_BITS_ORDER__, __TARGET_BYTES_ORDER__,
+ __TARGET_INT_WORDS_ORDER__, __TARGET_FLOAT_WORDS_ORDER__,
+ __TARGET_FLOAT_FORMAT__, __TARGET_USES_VAX_F_FLOAT__,
+ __TARGET_USES_VAX_D_FLOAT__, __TARGET_USES_VAX_G_FLOAT__,
+ __TARGET_USES_VAX_H_FLOAT__.
+
+2002-08-26 Ziemowit Laski <zlaski@apple.com>
+
+ * objc/objc-act.c (get_super_receiver): If inside a class method
+ of a category, cast the receiver to 'id' before accessing the 'isa'
+ field so that <objc/objc-class.h> is not needed. For NeXT runtime.
+
+2002-08-26 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390-protos.h (s390_function_prologue,
+ s390_function_epilogue): Remove.
+ config/s390/s390.c (s390_function_prologue, s390_function_epilogue,
+ TARGET_ASM_FUNCTION_PROLOGUE, TARGET_ASM_FUNCTION_EPILOGUE): Remove.
+
+ config/s390/s390.c (s390_machine_dependent_recorg): New function.
+ config/s390/s390-protos.h (s390_machine_dependent_reorg): Declare it.
+ config/s390/s390.h (MACHINE_DEPENDENT_REORG): Call it.
+ config/s390/s390.c (s390_split_branches, s390_chunkify_pool): Adapt
+ to being called from MACHINE_DEPENDENT_REORG. Update regs_ever_live.
+
+ config/s390/s390.c (s390_frame_info): Inline save_fprs_p. Always
+ assume BASE_REGISTER and RETURN_REGNUM need to be saved.
+ (s390_emit_prologue): Assume RETURN_REGNUM to be saved iff
+ function is not a leaf function. Use save_gprs and restore_gprs.
+ (s390_emit_epilogue): Likewise.
+ (save_gprs, restore_gprs): New functions.
+ (struct s390_frame): Remove return_reg_saved_p member.
+ (save_fprs_p): Remove.
+ (s390_optimize_prolog): New function.
+ (s390_legitimate_reload_constant): Remove now unnecessary check.
+
+ (s390_function_count): Remove.
+ (s390_output_symbolic_const): Replace s390_function_count by
+ current_function_funcdef_no.
+ (s390_output_constant_pool): Likewise.
+
+ (legitimize_pic_address): Use regs_ever_live to track PIC register
+ instead of current_function_uses_pic_offset_table.
+ (s390_emit_prologue): Likewise.
+ config/s390/s390.md ("call", "call_value"): Likewise.
+
+2002-08-26 Neil Booth <neil@daikokuya.co.uk>
+
+ * c-opts.c (find_opt): Don't complain about wrong languages
+ here. Return exact matches even for wrong language.
+ (c_common_decode_option): Complain about wrong languages
+ here.
+
+2002-08-24 Stuart Hastings <stuart@apple.com>
+
+ * function.h (struct function): Add flag
+ all_throwers_are_sibcalls.
+ * except.c (set_nothrow_function_flags): Replaces
+ nothrow_function_p. Set new flag.
+ * except.h (set_nothrow_function_flags): Replaces
+ nothrow_function_p.
+ * dwarf2out.c (struct dw_fde_struct): Add flag
+ all_throwers_are_sibcalls.
+ (output_call_frame_info): Test it.
+ (dwarf2out_begin_prologue) Propagate it from cfun to
+ dw_fde_struct.
+ * toplev.c (rest_of_compilation): Update calls to
+ nothrow_function_p.
+
+2002-08-23 Zack Weinberg <zack@codesourcery.com>
+
+ * ggc-page.c (compute_inverse): Short circuit calculation for
+ object sizes larger than half a page.
+
+2002-08-23 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_elf_select_section): Treat
+ DEFAULT_ABI == ABI_AIX like PIC. Test PIC & reloc for readonly
+ default.
+ (rs6000_elf_unique_section): Likewise.
+
+2002-08-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * ns32k.c (ns32k_globalize_label): Delete.
+ * ns32k.h (ASM_OUTPUT_LABEL, TARGET_ASM_GLOBALIZE_LABEL): Delete.
+
+2002-08-23 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (output_mi_thunk): Don't determine insns
+ for loading delta with num_insns_constant_wide. Calculate
+ delta_low, delta_high without using a conditional.
+
+2002-08-22 Jason Merrill <jason@redhat.com>
+
+ * c-common.h (RETURN_STMT_EXPR): Rename from RETURN_EXPR.
+ * c-common.def: Adjust.
+ * c-dump.c (c_dump_tree): Adjust.
+ * c-semantics.c (genrtl_return_stmt): Adjust.
+ * c-pretty-print.c (pp_c_statement): Adjust.
+ * tree-inline.c (copy_body_r): Adjust.
+
2002-08-22 Zack Weinberg <zack@codesourcery.com>
* ggc-page.c: Avoid division in ggc_set_mark.
@@ -1370,12 +6615,8 @@ Sat Aug 10 19:59:43 CEST 2002 Jan Hubicka <jh@suse.cz>
* testsuite/gcc.dg/tls/diag-3.c: New.
-2002-08-06 Jason Merrill <jason@redhat.com>
-
- * c-common.c (c_expand_expr) [STMT_EXPR]: If the last expression is
- a VAR_DECL with RTL that matches the target, just return that RTL.
-
2002-08-06 Dale Johannesen <dalej@apple.com>
+
* c-common.c (fname_decl): Use line number 0 for
__func__, to avoid confusing debuggers.
@@ -1482,7 +6723,7 @@ Sat Aug 10 19:59:43 CEST 2002 Jan Hubicka <jh@suse.cz>
* Makefile.in (sdbout.o): Doesn't need $(OBSTACK_H).
* collect2.h (permanent_obstack): Delete declaration.
* collect2.c (permanent_obstack): Delete definition.
- (main): Don't initialise permanent_obstack. Use xstrdup instead.
+ (main): Don't initialize permanent_obstack. Use xstrdup instead.
* expr.c: Don't include obstack.h.
(permanent_obstack): Delete declaration.
* function.c: Don't include obstack.h.
@@ -1922,7 +7163,7 @@ cp:
* pa-linux.h (GLOBAL_ASM_OP): Fix typo.
-2002-07-31 Graham Stott <grahams@btinternet.com>
+2002-07-31 Graham Stott <graham.stott@btinternet.com>
* config/stormy16/stormy16.h (BSS_SECTION_ASM_OP): Add missing
.section prefix.
@@ -2154,7 +7395,7 @@ Tue Jul 30 11:21:44 2002 J"orn Rennecke <joern.rennecke@superh.com>
(Identifiers implementation): Document that there's normally no
limit on identifier names.
(Integers implementation): Document two's complement.
- (Hints implementation): Document that GCC honours 'inline', mostly.
+ (Hints implementation): Document that GCC honors 'inline', mostly.
(Preprocessing directives implementation): Document that GCC
requires the current time.
@@ -3530,7 +8771,7 @@ Wed Jul 17 17:08:06 2002 J"orn Rennecke <joern.rennecke@superh.com>
Add DF_HI_REGS.
(CLASS_CANNOT_CHANGE_MODE, CLASS_CANNOT_CHANGE_MODE_P): Allow
lowpart fp regs - only for big endian for now.
- (LEGITIMATE_CONSTANT_P): Don't allow non-zero float vectors
+ (LEGITIMATE_CONSTANT_P): Don't allow nonzero float vectors
when FPU is in use.
(EXTRA_CONTRAINT_U): Check against CONST0_RTX.
(LOAD_EXTEND_OP): NIL for SImode.
@@ -4826,21546 +10067,4 @@ Mon Jul 1 19:55:17 2002 J"orn Rennecke <joern.rennecke@superh.com>
* mips.h (FUNCTION_ARG_REGNO_P): Fix parentheses.
-2002-06-30 Devang Patel <dpatel@apple.com>
-
- * objc/objc-act.c (finish_file): Avoid finish_objc() if
- -fsyntax-only.
-
-Fri Jun 28 17:22:37 2002 Denis Chertykov <denisc@overta.ru>
- Frank Ch. Eigler <fche@redhat.com>
- Matthew Green <mrg@redhat.com>
- Richard Henderson <rtl@redhat.com>
- Dave Hudson <dave.hudson@ubicom.com>
- Jeff Johnston <jjohnstn@redhat.com>
- Alan Lehotsky <apl@alum.mit.edu>
- Bernd Schmidt <bernds@redhat.com>
- Graham Stott <grahams@redhat.com>
-
- * doc/extend.texi: Add ip2k port to description of attribute
- naked.
- * doc/install.texi (Specific): Add ip2k description.
- * doc/install-old.texi (Configurations): Add ip2k to possible
- cpu types.
- * doc/md.texi: Document ip2k constraints.
- * config/ip2k/crt0.S: New file.
- * config/ip2k/ip2k-protos.h: New file.
- * config/ip2k/ip2k.c: New file.
- * config/ip2k/ip2k.h: New file.
- * config/ip2k/ip2k.md: New file.
- * config/ip2k/libgcc.S: New file.
- * config/ip2k/t-ip2k: New file.
-
-2002-06-30 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.md ("return"): New pattern.
- * config/mmix/mmix.h (TARGET_MASK_USE_RETURN_INSN)
- (TARGET_USE_RETURN_INSN): New macros.
- (TARGET_DEFAULT): Include TARGET_MASK_USE_RETURN_INSN.
- (TARGET_SWITCHES): Add -msingle-exit and -mno-single-exit.
- * config/mmix/mmix.c (MMIX_OUTPUT_REGNO): Fix spacing.
- (MMIX_POP_ARGUMENT): New macro.
- (mmix_target_asm_function_prologue): When no epilogue is executed,
- just emit a blank line. Use MMIX_POP_ARGUMENT with final POP insn.
- (mmix_print_operand) <case '.'>: New case.
- (mmix_print_operand_punct_valid_p): Match '.'.
- (mmix_use_simple_return): New function.
- * config/mmix/mmix-protos.h (mmix_use_simple_return): Prototype.
- * doc/invoke.texi (Option Summary) <MMIX Summary>: Add
- -msingle-exit, -mno-single-exit.
- (MMIX Options): Ditto.
-
-2002-06-30 Aldy Hernandez <aldyh@redhat.com>
-
- * config/i386/i386.c (ix86_init_mmx_sse_builtins): Fix typos.
-
-2002-06-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * gengtype.c (oprintf): Move VA_CLOSE after all fixedarg uses.
-
-2002-06-30 Alan Modra <amodra@bigpond.net.au>
-
- * unroll.c (loop_iterations): Handle EQ loops.
-
-2002-06-29 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.md (ctrdi): Allocate pseudo for FPR
- constraint in define_expand, not splitter.
- Formatting.
-
-2002-06-29 Aldy Hernandez <aldyh@redhat.com>
-
- * config/i386/i386.c (ix86_init_mmx_sse_builtins): Use
- build_function_type_list instead of build_function_type.
-
- * config/ia64/ia64.c (ia64_init_builtins): Same.
-
- * config/alpha/alpha.c (alpha_init_builtins): Same.
-
- * config/rs6000/rs6000.c (altivec_init_builtins): Same.
-
- * config/arm/arm.c (arm_init_builtins): Same.
-
- * tree.h: Add build_function_type_list prototype.
-
- * tree.c (build_function_type_list): New.
-
-2002-06-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * collect2.c (scan_prog_file): Fix typo in message.
-
-2002-06-28 Aaron Lehmann <aaronl@vitelus.com>
-
- * fold-cont.c: Remove unused CHARMASK.
-
-2002-06-29 Neil Booth <neil@daikokuya.co.uk>
-
- PR preprocessor/7150
- * cppmain.c (scan_translation_unit_trad): Simplify.
- * cppmacro.c (cpp_scan_nooutput): Handle traditional case.
-
-2002-06-29 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * config/i386/crtdll.h: Define EXTRA_OS_CPP_BUILTINS.
- Don't use CPP_PREDEFINES.
- * config/i386/cygwin.h (EXTRA_OS_CPP_BUILTINS): New.
- Used TARGET_OS_CPP_BUILTINS in preference to CPP_PREDEFINES.
- * config/i386/djgpp.h, config/i386/i386-coff.h,
- config/i386/i386-interix.h, config/i386/i386-interix3.h,
- config/i386/lynx-ng.h, config/i386/lynx.h, config/i386/mingw32.h,
- config/i386/openbsd.h, config/i386/ptx4-i.h, config/i386/sysv3.h,
- config/i386/uwin.h: Similarly.
-
-2002-06-29 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
-
- * c4x.h: (TARGET_CPU_CPP_BUILTINS): Check flag_inline_functions and
- flag_inline_trees to enable inlining.
-
-2002-06-28 Phil Edwards <pme@gcc.gnu.org>
-
- * configure.in (gcc_gxx_include_dir): Change to match versioned
- C++ headers if --enable-version-specific-runtime-libs is used.
- * configure: Regenerate.
-
-2002-06-28 Jan Hubicka <jh@suse.cz>
-
- * gcse.c (gcse_emit_move_after): Use gen_move_insn to produce the move.
-
-2002-06-28 Stephen Clarke <stephen.clarke@superh.com>
-
- * combine.c (combine_simplify_rtx): Pass the mode of the
- shift count, not the shift operation when trying to simplify
- a shift on a SHIFT_COUNT_TRUNCATED target.
-
-2002-06-28 Stephane Carrez <stcarrez@nerim.fr>
-
- * config/m68hc11/m68hc11.md ("*addsi3"): Use 'o' constraint to
- avoid the auto increment addressing modes.
- ("*subsi3"): Likewise.
- (split for add/sub on address): For 68HC12 push the value on
- the stack and do the operation with a pop.
-
-2002-06-28 Neil Booth <neil@daikokuya.co.uk>
-
- * cpplib.c (_cpp_handle_directive): Move #define-specific
- code to the #define handler...
- (do_define): ...here.
- (lex_macro_node): No longer a need to check for comments here.
-
-2002-06-28 Stephane Carrez <stcarrez@nerim.fr>
-
- * config/m68hc11/m68hc11.h (OPTIMIZATION_OPTIONS): Define.
- * config/m68hc11/m68hc11-protos.h (m68hc11_optimization_options):
- Declare.
- * config/m68hc11/m68hc11.c (m68hc11_optimization_options): New,
- do not reorder basic blocks at the end when optimizing for size.
-
-2002-06-28 Stephane Carrez <stcarrez@nerim.fr>
-
- * config/m68hc11/m68hc11.c (autoinc_mode): New function.
- (m68hc11_make_autoinc_notes): New function.
- (m68hc11_split_move): Be very cautious when spliting a move with
- auto increment/decrement modes because this may result in incompatible
- directions; add REG_INC notes to the resulting insn for CSE reg.
-
-2002-06-28 Stephane Carrez <Stephane.Carrez@nerim.fr>
-
- * config/m68hc11/m68hc11.c (register_indirect_p): For 68HC12 a constant
- can be a valid address.
-
-2002-06-28 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c: Remove unusued variables from last
- patch.
-
-2002-06-27 Aldy Hernandez <aldyh@redhat.com>
-
- Revert:
- * config/rs6000/rs6000.c (rs6000_override_options): Move
- *SUBTARGET_OVERRIDE_OPTIONS before the -m options.
-
-2002-06-27 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (altivec_expand_builtin): Move
- lvx/stv/dst builtins...
- (altivec_expand_ld_builtin): ...to here.
- (altivec_expand_st_builtin): ...here.
- (altivec_expand_dst_builtin): ...and here (respectively).
-
-2002-06-28 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.h (RETURN_IN_MEMORY): Update comment.
-
-2001-06-08 Bernd Schmidt <bernds@redhat.com>
-
- * emit-rtl.c (gen_lowpart_common): Don't create paradoxical FLOAT_MODE
- subregs.
- * recog.c (general_operand, register_operand): Disallow them.
-
-2002-06-28 Neil Booth <neil@daikokuya.co.uk>
-
- PR preprocessor/7138
- * cpplib.c (_cpp_handle_directive): Do traditional
- preparation after setting state.angled_headers.
- * cpptrad.c (scan_out_logical_line): Fix potential
- quote bug.
-
-2002-06-27 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (rs6000_override_options): Move
- *SUBTARGET_OVERRIDE_OPTIONS before the -m options.
-
-2002-06-27 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.md: Give "*xxx" names to all unnamed insn's.
- (*lsiu, *ssiu, movstrsi_internal, zero_cost_loop_start,
- zero_cost_loop_end): Remove unnecessary "parallel" from insns.
-
-2002-06-27 Roger Sayle <roger@eyesopen.com>
-
- * config/d30v/d30v.h: Remove commented out STACK_REGS #defines.
- * config/stormy16/stormy16.h: Likewise.
-
- * config/stormy16/stormy16.h (CUMULATIVE_ARGS): Replace typedef
- with #define.
-
-2002-06-26 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/install.texi (Binaries): Add Sinix/Reliant Unix. Move
- Hitachi entry. Make punctuation more consistent.
-
-2002-06-27 Matt Kraai <kraai@alumni.cmu.edu>
-
- * doc/install.texi: Change ` bit' to `-bit'.
- * doc/md.texi: Change `-bits' to `-bit'.
- * doc/tm.texi: Change `-bits' to ` bits'.
-
-2002-06-27 Daniel Berlin <dberlin@dberlin.org>
-
- * gcse.c (hoist_code): Rewrite to only get list of dominated
- blocks once per BB. Also fix reversed test (by removing need for
- the test at all).
-
-2002-06-27 Neil Booth <neil@daikokuya.co.uk>
-
- * cpphash.h (_cpp_set_trad_context): Remove.
- * cpplib.c (prepare_directive_trad): Do nothing for #define.
- (cpp_push_buffer, _cpp_pop_buffer): Don't call _cpp_set_trad_context.
- * cpptrad.c: Update comments.
- (_cpp_read_logical_line_trad): Let scan_logical_line handle
- updating the current context.
- (scan_logical_line): Update the current context.
- (_cpp_create_trad_definition): Similarly.
- (_cpp_set_trad_context): Remove.
-
-2002-06-27 Neil Booth <neil@daikokuya.co.uk>
-
- PR preprocessor/7070
- * c-lex.c (cb_def_pragma): Don't try to spell CPP_EOF.
-
-2002-06-26 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa-protos.h (xtensa_return_addr): Declare.
- config/xtensa/xtensa.c (xtensa_return_addr): New function.
- config/xtensa/xtensa.h (RETURN_ADDR_RTX): Use xtensa_return_addr.
- config/xtensa/xtensa.md (fix_return_addr): New pattern.
-
-2002-06-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * mips.c (coprocessor_operand, coprocessor2_operand,
- symbolic_operand): Move prototypes from here...
- * mips-protos.h (coprocessor_operand, coprocessor2_operand,
- symbolic_operand): ...to here.
-
-Wed Jun 26 16:32:57 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * config/sh/crt1.asm: remove _stack label definition
- and sentinel value.
-
-2002-06-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * varasm.c: Include real.h before output.h.
-
-2002-06-26 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.h (ALTIVEC_VECTOR_MODE): Revert change to
- check for TARGET_ALTIVEC.
-
-2002-06-26 Nathanael Nerode <neroden@gcc.gnu.org>
-
- * config.gcc (vax-*-vms*): Make obselete.
-
-2002-06-25 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * gcc.c (warn_std): Delete.
-
-2002-06-25 Loren J. Rittle <ljrittle@acm.org>
-
- * doc/extend.texi: Fix formatting of last checkin.
-
-2002-06-25 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * config/alpha/alpha.h (TARGET_CPU_CPP_BUILTINS): Remove leading
- underscore from __IEEE_FP and __IEEE_FP_INEXACT.
-
-2002-06-25 Aldy Hernandez <aldyh@redhat.com>
-
- * doc/extend.texi (PowerPC AltiVec Built-in Functions): Document
- discrepancies from motorola's documentation.
-
-Tue Jun 25 21:51:13 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * optabs.c (expand_vector_binop, expand_vector_unop): Don't assume
- GET_MODE_UNIT_SIZE (mode) == UNITS_PER_WORD.
-
- * config/sh/lib1funcs.asm (udivdi3): Make first divide step
- produce a 32 bit result before normalization, then normalize with a
- left shift. Compute approximative error of 2nd reciprocal
- approximation in 2's complement. Fix mask generation from upper
- longword of second divide stage result.
- For large divisor, fix shift count used to truncate first stage
- divide result; make decision if to adjust upwards based on comparison
- of higher parts of normalized values.
- (udivdi): Likewise. Undo normalization of result for large divisor
- case.
-
-2002-06-25 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.md: Change \\{t,n} to \{t,n}.
-
-2002-06-25 Neil Booth <neil@daikokuya.co.uk>
-
- * cpplib.c (do_include_common): Revert to correct line number
- if -traditional.
- * cpptrad.c (scan_out_logical_line): Treat null directive as
- white space. Invlidate MI optimization for non-whitespace
- text outside a directive.
-
-2002-06-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * Makefile.in (SHELL): Set to @SHELL@.
- * fixinc/Makefile.in (SHELL): Likewise.
-
- * mips.md (fixuns_truncdfsi2, fixuns_truncdfdi2,
- fixuns_truncsfsi2, fixuns_truncsfdi2): Avoid automatic aggregate
- initialization.
-
-2002-06-24 Jeff Law <law@redhat.com>
-
- * flow.c (propagate_one_insn): When removing an insn
- with a REG_LIBCALL note but not the entire libcall sequence,
- delete the associated REG_RETVAL note.
-
-Mon Jun 24 21:05:09 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * lib1funcs.asm (sdivsi3): Add optimized SH64 implementations.
- (udivsi3): Likewise. Rewrite SH1 implementation.
- (udivdi3, divdi3, umoddi3, moddi3): New SHmedia functions.
- * sh.md (R20_REG, R21_REG, R22_REG, R23_REG, FR23_REG): New constants.
- (udivsi3_i1_media, divsi3_i1_media): Fix clobber list.
- * config/sh/t-sh64 (LIB1ASMFUNCS): (_udivdi3, _divdi3, _umoddi3): Add.
- (_moddi3): Likewise.
-
- * lib1funcs.asm (ic_invalidate): Add data cache line writeback.
-
- * sh.h (FUNCTION_ARG_ADVANCE): Take SHCOMPACT_FORCE_ON_STACK
- arguments into account for stack_regs.
-
-2002-06-24 Matt Kraai <kraai@alumni.cmu.edu>
-
- * doc/extend.texi: Change `@dots{}' to `/* @r{@dots{}} */'
- in examples.
-
-2002-06-24 Art Haas <ahaas@neosoft.com>
-
- * doc/extend.texi (Other Builtins): Change `...' to `@dots{}'.
- * doc/tm.texi (Frame Layout): Likewise.
-
-2002-06-20 Steve Ellcey <sje@cup.hp.com>
-
- * gcc/config.gcc (ia64*-*-hpux*): Set use_collect2 to no.
- Set float_format to i128.
-
-2002-06-24 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.c (INIT_TARGET_OPTABS): If ARCH64, set the
- 32-bit ABI libfuncs to NULL.
-
- * config/sparc/sparc.md: Use define_insn_and_split. Use braced
- strings instead of quoted strings for code blocks.
-
- * expmed.c (expand_divmod): Do not set optab1/optab2 to the shift
- optabs if op1 is const0_rtx.
-
- * Makefile.in (GTFILES): Add basic-block.h
- * basic-block.h (label_value_list, tail_recursion_label_list):
- Mark with GTY.
-
-2002-06-24 Neil Booth <neil@daikokuya.co.uk>
-
- * cpptrad.c (scan_out_logical_line): Check recursing only when
- we know we have a macro invocation in the function-like case.
- Only call _cpp_handle_directive if we know we have a good
- directive, or we want to reject a bad directive.
-
-2002-06-24 Alan Modra <amodra@bigpond.net.au>
-
- * doloop.c (doloop_valid_p): Correct comment.
- (doloop_modify_runtime <abs_inc != 1>): Simplify.
- (doloop_modify_runtime <do-while>): Don't emit code when NE.
-
-Thu Jun 20 00:26:53 2002 Denis Chertykov <denisc@overta.ru>
-
- * config.gcc: Add support for ip2k.
-
-2002-06-23 Jan Hubicka <jh@suse.cz>
- Jeff Law <law@redhat.com>
-
- * function.h (struct emit_status): Clarify potential contents
- of regno_reg_rtx array.
- * integrate.c (copy_rtx_and_substitute): Update comments. Make
- sure entry in regno_reg_rtx is a REG before checking REG_POINTER.
-
- * reg-stack.c (convert_regs_exit): Push the registers to stack in
- proper order.
-
-2002-06-22 Ulrich Weigand <uweigand@de.ibm.com>
-
- PR middle-end/6963
- * function.c (assign_stack_temp_for_type): Do not return
- the same MEM rtx for multiple uses of a stack slot.
-
-2002-06-22 David S. Miller <davem@redhat.com>
-
- PR target/6841 target/6770 target/6719
- * config/sparc/sparc.h (PREFERRED_RELOAD_CLASS): Return
- NO_REGS for constant X when CLASS is GENERAL_OR_FP_REGS or
- GENERAL_OR_EXTRA_FP_REGS.
-
-2002-06-22 Neil Booth <neil@daikokuya.co.uk>
-
- * cpptrad.c (struct fun_macro): Add line number.
- (scan_out_logical_line): Set it, and use it to report unterminated
- macro invocations.
-
-2002-06-21 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * genautomata.c (copy_node, VLA_PTR_CREATE, VLA_PTR_EXPAND,
- VLA_PTR_ADD, VLA_HWINT_CREATE, VLA_HWINT_EXPAND, VLA_HWINT_ADD,
- DECL_UNIT, DECL_BYPASS, DECL_AUTOMATON, DECL_EXCL, DECL_PRESENCE,
- DECL_ABSENCE, DECL_RESERV, DECL_INSN_RESERV, REGEXP_UNIT,
- REGEXP_RESERV, REGEXP_SEQUENCE, REGEXP_REPEAT, REGEXP_ALLOF,
- REGEXP_ONEOF, check_name): Const-ify.
-
-2002-06-21 Matt Thomas <matt@3am-software.com>
-
- * config/vax/vax.c (vax_output_function_prologue): Use
- REGISTER_PREFIX. Fix some indentation.
- * config/vax/vax.h (FUNCTION_PROFILER): Use reg_names[].
- (VAX_ISTREAM_SYNC): Define.
- (INITIALIZE_TRAMPOLINE): Use VAX_ISTREAM_SYNC. Move the
- i-stream sync to the end.
- (REGISTER_PREFIX): Define as "".
- (ASM_OUTPUT_MI_THUNK): Use REGISTER_PREFIX.
-
-2002-06-21 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (ns32k-*-netbsd*): Remove from list of obsolete
- configurations.
-
-2002-06-21 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * tree.c (tree_node_kind, tree_node_counts, tree_node_sizes,
- tree_node_kind_names): Wrap in GATHER_STATISTICS macro.
-
-2002-06-21 Matt Thomas <matt@3am-software.com>
-
- * config/vax/netbsd.h: Adjust a comment.
- (TARGET_DEFAULT): Redefine as 0.
-
-2002-06-21 Richard Henderson <rth@redhat.com>
-
- * bb-reorder.c (make_reorder_chain_1): Search harder for the
- vax casesi fallthru edge.
- * cfglayout.c (cleanup_unconditional_jumps): Use
- redirect_edge_succ_nodup. Do not delete ADDR_VEC insns as dead.
- * cfgrtl.c (force_nonfallthru_and_redirect): Place redirection
- block after ADDR_VEC.
-
-2002-06-21 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * config/sparc/t-linux64 (EXTRA_MULTILIB_PARTS): Add crtfastmath.o.
-
-2002-06-21 Neil Booth <neil@daikokuya.co.uk>
-
- * cpperror.c (cpp_error): For traditional CPP, default to
- diagnostics on pfile->line.
- * cpplib.c (prepare_directive_trad): Set line number for
- diagnostics for #define too.
- * cpptrad.c (skip_whitespace): Skip comments properly.
- (_cpp_expansions_different_trad): Initialize quote2.
-
-2002-06-21 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.md: Change GNU CC to GCC in file header comment.
- * config/mmix/mmix.h: Ditto.
- * config/mmix/mmix-protos.h: Ditto.
- * config/mmix/mmix.c: Ditto. Fix typo in comment.
- * config/mmix/mmix-modes.def: Change GNU CC to GCC in file header
- comment. Comment extra CC modes.
-
-2002-06-20 Jan Hubicka <jh@suse.cz>
-
- * cfglayout.c (scope_to_insns_initialize): Call set_block_levels.
- (scope_to_insns_finalize): Do not call set_block_levels; handle
- sequences.
- (choose_inner_scope): New.
- * rtl.h (choose_inner_scope): Declare.
-
-2002-06-20 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa-protos.h (pa_asm_output_mi_thunk): Change third argument to
- HOST_WIDE_INT.
- * pa.c (pa_asm_output_mi_thunk): Likewise.
- (n_deferred_plabels): Change type to size_t.
- (output_deferred_plabels, output_call): Use size_t instead of int.
-
-2002-06-20 Richard Henderson <rth@redhat.com>
-
- PR target/4041
- * config/m68k/m68k.md (zero_extendsidi2): Create expander; duplicate
- pattern and adjust constraints for coldfire.
-
-2002-06-20 Richard Henderson <rth@redhat.com>
-
- * explow.c (probe_stack_range): Use gen_rtx_fmt_ee.
-
-2002-06-20 Chris Demetriou <cgd@broadcom.com>
-
- * config.gcc (mipsisa64-*-elf*, mipsisa64el-*-elf*): New targets.
-
-2002-06-20 Chris Demetriou <cgd@broadcom.com>
-
- * config/mips/mips.h (ISA_HAS_FP4): Fix comment to reflect use.
-
-2002-06-20 Stan Shebs <shebs@apple.com>
-
- * dominance.c: Include errors.h instead of error.h.
-
-2002-06-20 Neil Booth <neil@daikokuya.co.uk>
-
- * cppexp.c (cpp_interpret_integer): Don't force traditional
- numbers to be unsigned.
- * cpplib.c (prepare_directive_trad): Set line number for
- diagnostics.
- * cpptrad.c (scan_out_logical_line): Continue scanning out
- at start of buffer.
- * gcc.c (trad_capable_cpp): Use cc1 always.
-
-2002-06-20 Jeffrey Law <law@redhat.com>
-
- * i386.h (TARGET_DEFAULT): Do not turn on frame pointer
- elimination in leaf functions by default yet.
-
-2002-06-20 Richard Sandiford <rsandifo@redhat.com>
-
- * combine.c (make_extraction): Reapply to the argument of an ASHIFT.
-
-2002-06-20 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * config/sparc/t-crtfm (crtfastmath.o): Prefix with $(T) for
- multilibs.
- * config/sparc/t-sol2-64 (EXTRA_MULTILIB_PARTS): Add crtfastmath.o.
- Fixes PR other/6836.
-
-Thu Jun 20 19:42:21 CEST 2002 Jan Hubicka <jh@suse.cz>
- Pavel Nejedly <bim@atrey.karlin.mff.cuni.cz>
-
- Mon Jun 10 20:42:34 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h: Do not include et-forest.h
- (dominance_info): Declare as struct dominance-info.
- * cfglayout.c (cleanup_unconditional_jumps): Remove the edge before
- deleting block.
- * dominance.c (struct dominance_info): Define.
- (BB_NODE, SET_BB_NODE): New macros.
- (bb_hash_func, bb_eq_func): Kill.
- (calculate_dominace_info, free_dominacne_info, set_immediate_dominator,
- nearest_common_dominator, dominated_by_p, recount_dominator,
- add_to_dominance_info, delete_from_dominance_info): update for new
- representation.
- (get_dominated_by, redirect_immediate_dominators): Rewrite using
- enumerate_sons.
- * ifcvt.c (process_double_test_block, merge_if_block, find_cond_trap,
- find_if_case_1, find_if_case_2): Remove killed blocks from dominance
- structure.
-
- * et-forest.h: Update copyright; revamp all function to operate on
- nodes
- (et_forest_value): Kill.
- (et_forest_enumerate_sons, et_forest_node_value): New.
- * et-forest.c: Update copyright.
- * et-forest.h: Update copyright; revamp all function to operate on
- nodes
- (et_forest_value): Kill.
- (et_forest_enumerate_sons, et_forest_node_value): New.
-
- Thu Jun 6 22:43:43 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h: Inlude et-forest.h
- (basic_block_def): Kill dominator.
- (dominance_info): New type.
- (loops): Use dominace_info.
- (dominace handling functions): Take dominace_info as argument
- instead of bitmaps.
- (create_preheader): Likewise.
- * cfg.c (entry_exit_blocks): Kill dominator.
- (dump_flow_info): Do not dump dominators.
- * cfglayout.c (cleanup_unconditonal_jumps): Delete deleted block from
- dominators.
- * cfgloop.c (flow_pre_header_find): Use dominacne_info.
- (flow_loops_pre_header_scan, make_forwarder_block,
- canonicale_loop_headers, flow_loops_find): Likewise.
- * dominance.c: Include error.h
- (idoms_to_doms): Kill.
- (bb_hash_func, bb_eq_func): New static functions.
- (debug_dominace_info): New global function.
- (calculate_dominance_info): Use new et forest structure.
- (free_dominace_info, get_immediate_dominator, set_immediate_dominator,
- get_dominated_by, redirect_immediate_dominators,
- nearest_common_dominator, dominated_by_p, verify_dominators,
- recount_dominator, iterate_fix_dominators, add_to_dominace_info,
- delete_from_dominance_info): New global functions.
- * gcse.c (domnators): CHange to dominance_info.
- (alloc_hoist_mem): Do not alloc dominators
- (free_code_hoist_mem): Use free_dominance_info.
- (compute_code_hoist_data): Use dominance_info.
- (hoist_code): Likewise.
- * ifcvt.c (post_dominators): Likewise.
- (find_if_case_2, if_convert): Likewise.
- * predict.c (process_note_predictions, process_note_prediction,
- estimate-probability): Likewise.
- * sched-rgn.c (find_rgns, init_regions): Likewise.
- * ssa-dce.c (find_all_control_dependences, fint_control_depemndence,
- find_pdom, delete_insn_bb, ssa_eliminate_dead_code): Likewise.
- * ssa.c (compute_dominance_frontiers_1, rename_block, rename_registers,
- find_evaluations, convert_to_ssa): Likewise.
- * ssa.h (compute_dominance_frontiers): Likewise.
-
- Thu Jun 6 22:57:34 CEST 2002 Pavel Nejedly <bim@atrey.karlin.mff.cuni.cz>
-
- * Makefile.in (et-forest.c): Add.
- * et-forest.c: New file.
- * at-forest.h: New file.
-
-2002-06-20 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * c-decl.c (c_decode_option): Use ARRAY_SIZE in lieu of explicit
- array size calculation.
- * gengtype.c (NUM_BASE_FILES, create_file, write_gc_root):
- Likewise.
-
- * diagnostic.c (diagnostic_kind_text): Const-ify.
- * gengtype.c (lang_names): Likewise.
-
-Thu Jun 20 17:25:29 CEST 2002 JAn HUbicka <jh@suse.cz>
-
- * combine.c (subst): Be prepared for simplify_subreg to return VOIDmode.
-
-2002-06-20 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * config/sol2.h: New file.
- * config.gcc (i?86-*-solaris2*): Include it before i386/sol2.h.
- (sparc64-wrs-vxworks*): Include it before sparc/sol2.h.
- (sparc-*-chorusos*): Likewise.
- (sparc-*-elf*): Likewise.
- (sparc-*-rtems*, sparc-*-rtemself*): Likewise.
- (sparc64-*-solaris2*, sparcv9-*-solaris2*): Likewise.
- (sparc-hal-solaris2*): Likewise.
- (sparc-*-solaris2*): Likewise.
- (sparclite-*-elf*): Likewise.
- (sparc86x-*-elf*): Likewise.
- (sparc64-*-elf*): Likewise.
-
- * config/i386/sol2.h (PREFERRED_DEBUGGING_TYPE): Moved to
- config/sol2.h.
- (ASM_SPEC): Override config/sol2.h version for now.
- Removed obsolete GAS_REJECTS_MINUS_S variant.
- (WINT_TYPE, WINT_TYPE_SIZE): Moved to config/sol2.h.
- (HANDLE_PRAGMA_REDEFINE_EXTNAME): Likewise.
- (TARGET_OS_CPP_BUILTINS): Likewise.
- Assert system=unix.
- (CPP_SPEC): Simplified using new CPP_SUBTARGET_SPEC.
- (LIB_SPEC, ENDFILE_SPEC, STARTFILE_SPEC, LINK_SPEC): Moved to
- config/sol2.h.
- (SWITCH_TAKES_ARG, STDC_0_IN_SYSTEM_HEADERS): Likewise.
- (ASM_CPU_SPEC): Define.
- (SUBTARGET_EXTRA_SPECS): Define.
-
- * config/sparc/sol2-bi.h (LONG_DOUBLE_TYPE_SIZE): Removed, already
- in config/sparc/sol2.h.
- (ASM_SPEC): Moved to config/sol2.h.
- (CPP_CPU_SPEC): Simplified.
- (STARTFILE_SPEC32): Likewise, renamed to STARTFILE_ARCH32_SPEC for
- consistency.
- (STARTFILE_SPEC64): Renamed to STARTFILE_ARCH64_SPEC.
- (STARTFILE_ARCH_SPEC): Use new names STARTFILE_ARCH32_SPEC,
- STARTFILE_ARCH64_SPEC.
- (STARTFILE_SPEC): Moved to config/sol2.h
- (SUBTARGET_EXTRA_SPECS): Add startfile_arch.
- (LINK_ARCH32_SPEC): Moved to config/sol2.h.
- (LINK_ARCH64_SPEC): Simplified.
- (LINK_ARCH_SPEC): Redefined config/sol2.h version for 64-bit support.
- (LINK_SPEC): Moved to config/sol2.h
-
- * config/sparc/sol2.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Moved to
- config/sol2.h.
- Use BITS_PER_WORD for size.
- (WINT_TYPE, WINT_TYPE_SIZE): Likewise.
- (HANDLE_PRAGMA_REDEFINE_EXTNAME): Likewise.
- (CPP_PREDEFINES): Removed OS-specific part handled by
- TARGET_OS_CPP_BUILTINS.
- (CPP_SUBTARGET_SPEC): Moved to config/sol2.h.
- (CPLUSPLUS_CPP_SPEC): Removed, handled by TARGET_OS_CPP_BUILTINS.
- (ASM_SPEC): Moved to config/sol2.h.
- (PREFERRED_DEBUGGING_TYPE): Likewise.
- (STARTFILE_SPEC, LIB_SPEC, LINK_SPEC): Likewise.
- (SWITCH_TAKES_ARG, STDC_0_IN_SYSTEM_HEADERS): Likewise.
- (TARGET_DEFAULT): Reordered to match config/sparc/sol2-bi.h version.
- (TRANSFER_FROM_TRAMPOLINE): Moved to config/sol2.h
-
- * config.gcc (i?86-*-solaris2*): Removed obsolete gas support.
- * config/i386/sol2gas.h: Removed.
-
-Thu Jun 20 12:14:01 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (xorqi_1_slp, xorqi_2_slp): New patterns.
-
-2002-06-16 Aldy Hernandez <aldyh@redhat.com>
-
- * gcc.c-torture/execute/simd-1.c: New.
-
- * gcc.dg/simd-1.c: New.
-
- * doc/extend.texi (Vector Extensions): Document that we can
- specify simd types not specifically supported by the hardware.
- Document that simd types can be used as function arguments.
- Document that signness does make a difference in SIMD types.
- Misc cleanups and revisions to the vector extensions section.
-
- * simplify-rtx.c (simplify_subreg): Simplify subregs of vector
- constants.
-
- * expr.c (vector_mode_valid_p): New.
-
- * expr.h: Add vector_mode_valid_p.
-
- * defaults.h (VECTOR_MODE_SUPPORTED_P): Set default.
-
- * c-common.c (type_for_mode): Always build vector nodes regardless
- of VECTOR_MODE_SUPPORTED_P.
- (handle_mode_attribute): Error if we can't emulate a nonexisting
- vector mode.
- (handle_vector_size_attribute): Same.
-
- * optabs.c (expand_binop): Open-code vector operations.
- (expand_unop): Open-code vector unops.
- (expand_vector_binop): New.
- (expand_vector_unop): New.
-
- * c-typeck.c (build_binary_op): Allow vectors in binops.
- Allow vectors in conditional operatiors.
- (build_unary_op): Allow vectors in unary minus.
-
- * config/rs6000/rs6000.h (ALTIVEC_VECTOR_MODE): Conditionalize on
- TARGET_ALTIVEC.
-
-2002-05-20 Richard Henderson <rth@redhat.com>
-
- * c-common.c (c_common_get_alias_set): Correctly handle characters.
- Rearrange order of expressions; don't handle vectors here.
- * alias.c (get_alias_set): Let vectors match their components.
-
-2002-06-19 Chris Demetriou <cgd@broadcom.com>
-
- * config/mips/mips.c (mips_emit_prefetch): Use hints which
- match desired locality.
-
-2002-06-19 Dhananjay R. Deshpande <dhananjayd@kpit.com>
-
- * config/h8300/h8300.c (TARGET_INSERT_ATTRIBUTES): Define.
- (h8300_insert_attributes): New.
-
-2002-06-19 Akim Demaille <akim@epita.fr>
-
- * c-parse.in (initelt: identifier ':' initval): Add an empty
- action to fix a type clash.
- (aliasdecl, classdef): Add the missing closing `;'.
- Whitespace changes.
- * gengtype-yacc.y (typedef_struct): Add an empty action to preevnt
- $$ = $1 type clashes.
-
-2002-06-19 Eric Christopher <echristo@redhat.com>
-
- * config/mips/mips.c (symbol_operand): New function.
- (mips_emit_prefetch): Ditto.
- * config/mips/mips-protos.h: Define.
- * config/mips/mips.h (ISA_HAS_PREFETCH): Define.
- (CONSTANT_ADDRESS_P): Adjust, use TARGET_GAS.
- (LEGITIMIZE_ADDRESS): Ditto.
- * config/mips/mips.md (prefetch, prefetch_si_address,
- prefetch_si, prefetch_di_address, prefetch_di): New patterns.
-
-2002-06-19 Eric Christopher <echristo@redhat.com>
-
- * config/fp-bit.h: Add unordered defines for gofast.
-
-2002-06-19 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (DECL_UNIT, DECL_BYPASS, DECL_AUTOMATON,
- DECL_EXCL, DECL_PRESENCE, DECL_ABSENCE, DECL_RESERV,
- DECL_INSN_RESERV, REGEXP_UNIT, REGEXP_RESERV, REGEXP_SEQUENCE,
- REGEXP_REPEAT, REGEXP_ALLOF, REGEXP_ONEOF): New macros with
- checking and without it.
- (decl_name, decl_mode_check_failed, regexp_name,
- regexp_mode_check_failed): New functions.
- (gen_cpu_unit, gen_query_cpu_unit, gen_bypass, gen_excl_set,
- gen_presence_set, gen_absence_set, gen_automaton,
- gen_regexp_repeat, gen_regexp_allof, gen_regexp_oneof,
- gen_regexp_sequence, gen_reserv, gen_insn_reserv,
- automaton_decl_hash, automaton_decl_eq_p): Use the macros.
- (find_automaton_decl): Ditto. Set up mode of work_automaton_decl.
- (insn_decl_hash, insn_decl_hash, insn_decl_eq_p): Use the macros.
- (find_insn_decl): Ditto. Set up mode of work_insn_decl.
- (decl_hash, decl_eq_p): Use the macros.
- (find_decl): Ditto. Set up mode of work_decl.
- (process_excls, process_presence_absence, process_decls,
- check_automaton_usage, process_regexp, process_regexp_decls,
- check_usage, loop_in_regexp, check_loops_in_regexps,
- process_regexp_cycles, add_advance_cycle_insn_decl,
- initiate_states, initiate_excl_sets,
- initiate_presence_absence_sets, copy_insn_regexp, transform_1,
- transform_2): Use the macros.
- (transform_3): Ditto. Check mode before making transformations of
- ALLOF.
- (regexp_transform_func, transform_insn_regexps,
- process_unit_to_form_the_same_automaton_unit_lists,
- form_the_same_automaton_unit_lists_from_regexp,
- form_the_same_automaton_unit_lists,
- process_seq_for_forming_states, process_alts_for_forming_states,
- create_alt_states, form_ainsn_with_same_reservs, make_automaton,
- form_arcs_marked_by_insn, NDFA_to_DFA, set_new_cycle_flags,
- estimate_one_automaton_bound, compare_max_occ_cycle_nums,
- units_to_automata_heuristic_distr, create_ainsns,
- units_to_automata_distr, create_automata): Use the macros.
- (form_regexp): Ditto. Fix typo in access to fields of ALLOF.
- (longest_path_length, min_issue_delay_pass_states,
- output_dead_lock_vect, output_tables, output_insn_code_cases,
- output_internal_insn_latency_func, output_print_reservation_func,
- output_description, output_automaton_units, generate): Use the
- macros.
- (make_insn_alts_attr): Ditto. Check case when there are not
- alternatives in the reservation.
- (make_internal_dfa_insn_code_attr, make_default_insn_latency_attr,
- make_bypass_attr, form_important_insn_automata_lists,
- expand_automata): Use the macros.
-
-2002-06-20 Tim Josling <tej@melbpc.org.au>
-
- * Makefile.in: Clean up code to check for misspecified languages
- in enable-languages.
-
-2002-06-19 Andrew Pinski <pinskia@physics.uc.edu>
-
- * cpptrad.c (_cpp_replacement_text_len): initialize len.
-
-2002-06-19 Jason Merrill <jason@redhat.com>
-
- * Makefile.in (unstrap, restrap): New targets.
- (bootstrap): Mention restrap.
-
-2002-06-19 Matt Kraai <kraai@alumni.cmu.edu>
-
- * except.c (ehl_free): Remove.
-
- * doc/tm.texi (TARGET_CPU_CPP_BUILTINS): Correct misnamings of
- builtin_define and builtin_define_std.
-
-2002-06-19 Ian Dall <ian@sibyl.beware.dropbear.id.au>
-
- * config/ns32k/ns32k.md: Give "*xxx" names to all unnamed insn's.
- (sCOND): Restrict operand class so that gcc knows how to reload them.
- (bitfield_set): Merge two unnamed insn's using alternatives.
- (call_value): Remove constraint on unused uperand.
- (udivmodhi4, udivmodsi4, udivmoddihi4_internal): Remove.
- (udivmoddiqi4_internal, udivmoddihi4, udivmoddiqi4): Remove.
-
- * longlong.h (count_trailing_zeros): Escape newline and beautify.
-
-2002-06-19 Mark Mitchell <mark@codesourcery.com>
-
- * Makefile.in (QMTEST_DIR): Simplify definition.
-
-2002-06-19 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/d30v/d30v.h (CUMULATIVE_ARGS): Replace typedef with
- #define.
-
-2002-06-19 Neil Booth <neil@daikokuya.co.uk>
-
- * cpphash.h (struct cpp_reader): Make date and time strings.
- (_cpp_builtin_macro_text, _cpp_copy_replacement_text,
- _cpp_replacement_text_len): New.
- * cppinit.c (cpp_create_reader): Update.
- (init_builtins): Register appropriate builtins for -traditional-cpp.
- * cppmacro.c (new_number_token): Remove.
- (_cpp_builtin_macro_text): New.
- (builtin_macro): Use it.
- (cpp_macro_definition): Update to handle traditional macros.
- * cppmain.c (cb_line_change): Don't do column positioning for
- traditional output.
- * cpptrad.c (enum ls): Rename ls_fun_macro to ls_fun_open. New
- state ls_fun_close.
- (skip_whitespace): Fix.
- (maybe_start_funlike): Don't set state.parsing_args.
- (scan_out_logical_line): Remove duplicate error. Use lex_state
- rather than state.parsing_args.
- (push_replacement_text): Handle builtins.
- (_cpp_replacement_text_len, _cpp_copy_replacement_text): New.
-
-2002-06-18 Hans-Peter Nilsson <hp@axis.com>
- Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * config/fp-bit.c (_fpmul_parts, _fpdiv_parts): Mark with
- attribute __always_inline__.
-
-2002-06-18 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.h (FUNCTION_PROFILER): Respect flag_pic
- when generating the call to _mcount.
- (NO_PROFILE_COUNTERS): Define.
-
-2002-06-18 Richard Henderson <rth@redhat.com>
-
- * print-rtl.c (print_rtx): Adjust NOTE argument numbers for
- 2002-06-02 change.
-
-Tue Jun 18 20:53:32 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * t-sh (MULTILIB_EXCEPTIONS): Set to ml.
- config/sh/t-linux (MULTILIB_EXCEPTIONS): Clear.
- * config/sh/t-netbsd (MULTILIB_EXCEPTIONS): Likewise.
- * config/sh/t-sh64 (MULTILIB_EXCEPTIONS): Likewise.
-
- * sh-protos.h (sh_pr_interrupt): Declare.
- * sh.c (sh_pr_interrupt): New function.
- (print_operand, calc_live_regs, sh_expand_prologue): Use it.
- (sh_hard_regno_rename_ok): Likewise.
- * sh.h (NORMAL_MODE): FP_MODE_NONE for interupt handlers.
-
-2002-06-18 Vladimir Makarov <vmakarov@redhat.com>
-
- * rtl.def (DEFINE_AUTOMATON): Add description of new options
- `time' and `v'. Fix incorrect description of option `w'.
-
- * doc/md.texi: Ditto.
-
- * genautomata.c (TIME_OPTION, V_OPTION): New macros.
- (gen_automata_option): Process the new options.
- (transform_2, transform_3): Initialize some variables.
- (initiate_automaton_gen): Use the new macros.
-
-2002-06-18 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips-protos.h (mips_initial_elimination_offset): Declare.
- (mips_set_return_address, mips_restore_gp): Declare.
- * config/mips/mips.h (struct mips_frame_info): Move to mips.c
- (current_frame_info): Remove.
- (INITIAL_ELIMINATION_OFFSET): Use mips_initial_elimination_offset.
- * config/mips/mips.c: Remove uses of current_frame_info.
- (struct mips_frame_info): Moved from mips.h. Remove 'insns_len'.
- (struct machine_function): Add 'frame' and 'insns_len'.
- (current_frame_info, zero_frame_info): Remove.
- (mips_restore_gp, mips_set_return_address): New.
- (mips_initial_elimination_offset): New.
- * config/mips/mips.md (exception_receiver): Use mips_restore_gp.
- (eh_return define_split): Use mips_set_return_address.
-
-2002-06-18 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplib.c (dtable): Update.
- (end_directive): Decrement expansion prevention count.
- Clear state.in_expression.
- (prepare_directive_trad): Set state.in_expression.
- Increment expansion prevention count.
- * cpptrad.c (enum ls): New.
- (_cpp_overlay_buffer): Set overlaid_buffer.
- (_cpp_remove_overlay): Use overlaid_buffer.
- (_cpp_read_logcial_line_trad): Update buffer when it might
- have changed.
- (scan_out_logical_line): Handle state transitions for assertions
- and defined() in #if, and for funlike invocations including the
- directive case. Handle '<' and '>' as a quote mechanism in
- #include. Warn about unterminated macro invocations.
- * cpphash.h (struct lexer_state): New member in_expression.
- (struct cpp_reader): New member overlaid buffer.
-
-2002-06-18 Hans-Peter Nilsson <hp@axis.com>
-
- * config/cris/arit.c (do_31div, __Udiv, __Umod): Mark prototype
- __always_inline__.
-
-2002-06-18 Alan Modra <amodra@bigpond.net.au>
-
- * config/ia64/ia64.md (doloop_end_internal): Correct rtl.
-
- * doloop.c (doloop_optimize): Extract pattern from insn.
-
-2002-06-17 Matt Kraai <kraai@alumni.cmu.edu>
-
- * doc/extend.texi (Function Attributes): Remove `,...' from @var.
-
-2002-06-17 Jeff Law <law@redhat.com>
-
- * libgcc2.c: Do not include symcat.h or machmode.h.
-
-2002-06-17 Richard Henderson <rth@redhat.com>
-
- PR target/6922
- * expmed.c (make_tree): Handle SIGN_EXTEND/ZERO_EXTEND.
-
-2002-06-17 Tom Tromey <tromey@redhat.com>
-
- * dwarfout.c: Include function.h.
-
-2002-06-17 Andreas Schwab <schwab@suse.de>
-
- * print-rtl.c (print_rtx): Print space before vector, not after.
- (debug_rtx): Clear sawclose before printing.
- (debug_rtx_list): Print newline after each list element.
- (debug_rtx_range): Likewise.
-
-2002-06-17 Richard Henderson <rth@redhat.com>
-
- * function.h (struct function) [funcdef_no]: Rename profile_label_no.
- (current_function_funcdef_no): Similarly.
- * function.c (funcdef_no): Similarly.
- (prepare_function_start): Set current_function_funcdef_no.
- (expand_function_start): Don't set current_function_profile_label_no.
- * dwarf2out.h (current_funcdef_number): Remove.
- * dwarf2out.c (current_funcdef_number): Remove. Replace with
- current_function_funcdef_no throughout.
- * dwarfout.c, vmsdbgout.c: Similarly.
- * except.c (sjlj_funcdef_number): Remove.
- (sjlj_emit_function_enter): Use current_function_funcdef_no instead.
- (output_function_exception_table): Likewise.
- * final.c (profile_function): Use current_function_funcdef_no
- instead of current_function_profile_label_no.
-
-2002-06-17 Vladimir Makarov <vmakarov@redhat.com>
-
- * sched-ebb.c (init_ready_list): Check INSN_P first.
-
-Mon Jun 17 17:26:15 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.md (divsi3): Update way how to find insns in a sequence.
-
- * reload1.c (merge_assigned_reloads): Don't change reloads
- other than RELOAD_FOR_INPUT_ADDRESS / RELOAD_FOR_INPADDR_ADDRESS
- to RELOAD_OTHER when there are conflicting input reloads.
-
-2002-06-17 Richard Earnshaw (rearnsha@arm.com)
-
- * function.c (epilogue_done): Correctly build a sequence of insns for
- a sibcall epilogue.
-
-2002-06-17 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/fr30/fr30.h (CUMULATIVE_ARGS): Replace typedef with
- #define.
-
- * config/m32r/m32r.md: Replace gen_sequence with get_insns.
-
-2002-06-16 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.h (BIGGEST_FIELD_ALIGNMENT): Define instead
- of ADJUST_FIELD_ALIGN if IN_TARGET_LIBS.
-
-2002-06-16 Richard Henderson <rth@redhat.com>
-
- PR opt/6722
- * regclass.c (globalize_reg): Update regs_invalidated_by_call.
-
-2002-06-16 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * config.gcc: Add i386/sysv4-cpp.h; remove i386-aout.h from vxworks.
- * config/i386/i386-aout.h, config/i386/i386elf.h,
- config/i386/sysv4.h: Remove CPP_PREDEFINES.
- * config/i386/linux64.h, config/i386/i386elf.h, config/i386/mach.h,
- config/i386/netware.h, config/i386/rtemself.h, config/i386/sco5.h,
- config/i386/sol2.h, config/i386/vsta.h, config/i386/vxi386.h,
- config/i386/win32.h: Use TARGET_OS_CPP_BUILTINS rather than
- CPP_PREDEFINES and part of CPP_SPEC.
- * config/i386/sysv4-cpp.h: New.
-
-2002-06-16 Richard Henderson <rth@redhat.com>
-
- PR c/7030
- * dwarf2out.c (modified_type_die): Don't assign the qualified die
- to the unqualified type.
-
-Sun Jun 16 22:16:10 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386-protos.h (x86_field_alignment): Declare.
- * i386.c (x86_field_alignment): Define.
- * i386.h (ADJUST_FIELD_ALIGNMENT): New.
- (BIGGEST_FIELD_ALIGNMENT): Kill.
-
-2002-06-16 Richard Henderson <rth@redhat.com>
-
- * vax.md (casesi): Use emit_jump_insn. Tidy expander pattern.
-
-2002-06-16 Richard Henderson <rth@redhat.com>
-
- * c-common.c (flag_ms_extensions): Move from c++ front end.
- * c-common.h (flag_ms_extensions): Declare.
- * c-decl.c (c_decode_option): Add -fms-extensions.
- (grokfield): Don't accept anonymous structures in ISO C mode;
- accept only unnamed anonymous structures in GNU C mode; accept
- Plan 9 extensions in MS mode.
- * c-parse.in (SAVE_EXT_FLAGS, RESTORE_EXT_FLAGS): Rename from
- SAVE/RESTORE_WARN_FLAGS; add flag_iso frobbing; update all callers.
- (extension): Clear flag_iso.
- * doc/invoke.texi (C Dialect Options): Add -fms-extensions.
-
-2002-06-16 Hans-Peter Nilsson <hp@axis.com>
-
- PR target/7042
- * reorg.c (make_return_insns) [DELAY_SLOTS_FOR_EPILOGUE]: Exit
- early if current_function_epilogue_delay_list is non-empty.
- * config/cris/cris.md ("return"): Add sanity check asserting that
- current_function_epilogue_delay_list is empty.
-
-2002-06-16 Jeff Law <law@redhat.com>
-
- * emit-rtl.c (gen_rtx_REG): Temporarily turn off automatic
- sharing of hard registers.
-
- * toplev.c (rest_of_compilation): Remove redundant conditional.
-
- * toplev.c (rest_of_compilation): Perform a simpler, less costly
- cleanup of the CFG when not optimizing.
-
-2002-06-16 Alan Modra <amodra@bigpond.net.au>
-
- * gcc.c (main): Correct startfile_prefix_spec check.
-
-2002-06-12 Geoffrey Keating <geoffk@redhat.com>
-
- * config.gcc: Revert rth's patch of 2002-05-18. Instead,
- include both darwin.o and rs6000-c.o.
-
-2002-06-15 Roger Sayle <roger@eyesopen.com>
-
- * expr.c (compare_from_rtx): Call simplify_relational_operation
- on all comparisons, not just those between integer constants,
- with the correct (possibly unsigned) comparison code.
- (do_compare_rtx_and_jump): Likewise.
-
-2002-06-15 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * Makefile.in (tm_defines): New configuration variable.
- (cs-config.h, cs-hconfig.h, cs-tconfig.h): Rename DEFINES to XM_DEFINES.
- Pass tm_defines in TM_DEFINES.
- (cs-tm_p.h): Rename DEFINES to XM_DEFINES. Pass TM_DEFINES.
- * config.gcc (tm_defines): New configuration variable.
- (hppa*-*-* | parisc*-*-*): Use tm_defines instead of pa-700.h and
- pa-7100.h headers. Change hppa1* scheduling default to 7100LC.
- * configure.in: Substitute tm_defines.
- * configure: Rebuilt.
- * mkconfig.sh: Rename DEFINES to XM_DEFINES. Output TM_DEFINES.
- * doc/install.texi: Update.
- * pa/pa-700.h: Delete file.
- * pa/pa-7100.h: Delete file.
-
-2002-06-15 Roger Sayle <roger@eyesopen.com>
-
- * fold-const.c (comparison_to_compcode): New function to convert
- an comparison TREE CODE into a bit-based representation.
- (compcode_to_comparison): New function to convert from this bit
- based representation back to a comparison TREE CODE.
- (fold_truthop): Simplify (x<y) && (x==y) and related composite
- comparisons.
-
-2002-06-15 Aldy Hernandez <aldyh@redhat.com>
-
- * tm.texi (MEMBER_TYPE_FORCES_BLK): Document MODE argument.
-
- * stor-layout.c (compute_record_mode): Remove check for
- FUNCTION_ARG_REG_LITTLE_ENDIAN and VOIDmode when checking for
- MEMBER_TYPE_FORCES_BLK. Pass new mode field to
- MEMBER_TYPE_FORCES_BLK.
-
- * config/ia64/hpux.h (MEMBER_TYPE_FORCES_BLK): Same.
-
- * config/c4x/c4x.h (MEMBER_TYPE_FORCES_BLK): Same.
-
-2002-06-14 Jeff Sturm <jsturm@one-point.com>
-
- * config/sparc/sparc.h (DYNAMIC_CHAIN_ADDRESS): Add SPARC_STACK_BIAS.
-
-2002-06-14 Steve Ellcey <sje@cup.hp.com>
-
- * configure.in (USE_UNWIND_EXCEPTIONS): Add support to set
- USE_UNWIND_EXCEPTIONS if --enable-libunwind-exceptions is set.
- * configure, config.in: Regenerate.
-
-2002-06-14 Eric Botcazou <ebotcazou@multimania.com>
-
- * loop.c (check_final_value): Use v->always_executed
- instead of v->always_computable.
- * unroll.c (final_giv_value): Don't calculate the final
- value as a function of the biv if the giv is not computed
- for every loop iteration.
-
-2002-06-14 Eric Botcazou <ebotcazou@multimania.com>
-
- * loop.c (for_each_insn_in_loop): Fix formatting and comments.
-
-2002-06-14 Eric Botcazou <ebotcazou@multimania.com>
-
- PR c/6677
- * convert.c (convert_to_integer) [LSHIFT_EXPR]: Don't pass
- the truncation down when the target type is signed.
- [trunc1]: Use unsigned arithmetic for LSHIFT_EXPR.
- * fold-const.c (extract_muldiv) [NOP_EXPR]: Don't pass through
- the conversion if the target type is a smaller type.
-
-2002-06-14 Richard Henderson <rth@redhat.com>
-
- * fold-const.c (fold) [compare ops]: Move X>=C / X<C transfomation
- earlier. Re-factor comparisons vs extrema.
-
-2002-06-14 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (builtin_zapnot): Fix op2 mode.
-
-2002-06-14 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * rtl.h (SCHED_GROUP_P): Disallow CODE_LABEL, BARRIER and NOTE.
- * sched-deps.c (add_dependence): Likewise.
- (group_leader): Likewise.
- * sched-rgn.c (init_ready_list): Likewise.
- * doc/rtl.texi: Adjust accordingly.
-
-2002-06-13 Jeffrey Law <law@redhat.com>
-
- * gcse.c (delete_null_pointer_checks_1): Inform caller if any
- null pointer checks were eliminated. Update prototype.
- (delete_null_pointer_checks): Similarly.
- * rtl.h (delete_null_pointer_checks): Update prototype.
- * toplev.c (rest_of_compilation): Only run cleanup_cfg if
- delete_null_pointer_checks deletes one or more null
- pointer checks. Do not run cleanup_cfg before gcse, the
- CFG is accurate and optimized at that point..
-
- * rs6000.c (rs6000_frame_related): Avoid unwanted sharing
- of hard registers.
-
-2002-06-14 Ulrich Weigand <uweigand@de.ibm.com>
-
- * Makefile.in (libgcc.mk): Depend on specs.
-
-Fri Jun 14 12:15:11 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.md (mulsi3): Update way how to find insns in a sequence.
-
-Fri Jun 14 12:04:02 2002 Dhananjay R. Deshpande <dhananjayd@kpit.com>
-
- * sh.h: Define HARD_REGNO_RENAME_OK
- * sh.c: sh_hard_regno_rename_ok: New. If current function has
- interrupt_handler attribute, only registers saved on stack are OK.
- * sh-protos.h: Declare sh_hard_regno_rename_ok.
-
-2002-06-14 Kaz Kojima <kkojima@gcc.gnu.org>
-
- * config/sh/sh.md (jump): Emit jump insn.
- (call_pcrel): Get pattern of the result of gen_call_site.
- (call_value_pcrel, sibcall_pcrel, GOTaddr2picreg): Likewise.
-
-2002-06-14 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (struct cpp_buffer): Remove saved_line_base.
- * cpptrad.c: Update comments.
- (skip_whitespace, copy_comment): Take a new parameter.
- (skip_escaped_newlines): Don't duplicate escaped newline test.
- (copy_comment): Different location for CUR, decide here how
- to copy / replace the comment.
- (skip_whitespace): Copy whitespace.
- (_cpp_overlay_buffer, _cpp_remove_overlay): Don't play with line_base.
- (scan_out_logical_line): Let copy comment handle keeping or
- replacing comments.
- (scan_parameters, _cpp_create_trad_definition): Update.
-
-2002-06-13 Alan Lehotsky <apl@alum.mit.edu>
-
- * reload.c (get_secondary_mem,find_reloads_address,
- find_reloads_address_1): Pass reference to MEM to find_reloads_address
- so that LEGITIMIZE_RELOAD_ADDRESS will be called.
-
-2002-06-13 Jessica Han <jessica@cup.hp.com>
-
- * defaults.h (TARGET_VTABLE_ENTRY_ALIGN): New.
- (TARGET_VTABLE_DATA_ENTRY_DISTANCE): New.
- * doc/tm.texi: Document them.
- * config/ia64/ia64.h (TARGET_VTABLE_ENTRY_ALIGN): New.
- (TARGET_VTABLE_DATA_ENTRY_DISTANCE): New.
- (TARGET_VTABLE_USES_DESCRIPTORS): 4 word descriptors for 32-bit mode.
- (ASM_OUTPUT_FDESC): Likewise.
-
-2002-06-13 Eric Christopher <echristo@redhat.com>
-
- * diagnostic.c (output_format): Fix thinko.
-
-Thu Jun 13 22:34:33 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * config/sh/coff.h (HAS_INIT_SECTION, INVOKE__MAIN): Don't define.
- (DWARF2_UNWIND_INFO): Define to 0.
-
- * config/sh/sh.c (calc_live_regs): Don't use initial_value
- optimization for PR_MEDIA_REG.
-
-2002-06-13 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (_cpp_lex_identifier_trad): Remove.
- * cpplib.c (end_directive): Don't skip, always remove overlay
- apart from #define.
- (prepare_directive_trad): Handle NULL pfile->directive.
- (_cpp_handle_directive): Always call prepare_directive_trad
- if traditional.
- * cppmain.c (check_multiline_token): Rename account_for_newlines,
- generalize inputs.
- (scan_translation_unit_trad): Use it.
- * cpptrad.c (skip_comment): Rename copy_comment, copy comment to
- output, get escaped newline in comment close correct.
- (check_output_buffer, skip_whitespace): Update.
- (_cpp_lex_identifier_trad): Remove.
- (scan_out_logical_line): Handle -C and comments in directives
- properly.
-
-Thu Jun 13 20:18:38 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * config.gcc: Add support for sh[234]*-*-elf*, sh[2346lbe]*-*-linux*.
- * config/sh/linux.h (TARGET_DEFAULT): Use TARGET_CPU_DEFAULT.
- * sh.h (SELECT_SH1, SELECT_SH2, SELECT_SH3, SELECT_SH3E): New macros.
- (SELECT_SH4_NOFPU, SELECT_SH4_SINGLE_ONLY, SELECT_SH4): Likewise.
- (SELECT_SH4_SINGLE, SELECT_SH5_64, SELECT_SH5_64_NOFPU): Likewise.
- (SELECT_SH5_32, SELECT_SH5_32_NOFPU, SELECT_SH5_COMPACT): Likewise.
- (SELECT_SH5_COMPACT_NOFPU): Likewise.
- (TARGET_SWITCHES): Use them.
- (TARGET_CPU_DEFAULT): Define if not already defined.
- (TARGET_DEFAULT): Use it.
- (LINK_DEFAULT_CPU_EMUL): Value now depends on TARGET_CPU_DEFAULT.
- * config/sh/t-linux (MULTILIB_OPTIONS): Use MULTILIB_ENDIAN.
- * config/sh/t-monolib: New file.
-
-2002-06-13 Roger Sayle <roger@eyesopen.com>
-
- * toplev.c (rest_of_compilation): Simplify (and correct) the
- logic of the first delete-null-pointer-checks pass.
-
-Thu Jun 13 18:24:17 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (ix86_expand_movstr): Fix pasto.
-
-Thu Jun 13 18:18:17 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * reload.c (find_valid_class): Fix thinko in my previous patch.
-
-2002-06-13 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.h (TARGET_CPU_CPP_BUILTINS): New macro.
- * config/s390/linux.h (TARGET_OS_CPP_BUILTINS): New macro.
- (CPP_PREDEFINES, CPP_SPEC, CPP_ARCH31_SPEC, CPP_ARCH64_SPEC): Remove.
- (EXTRA_SPECS): Remove cpp_arch31 and cpp_arch64.
-
-2002-06-13 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * tree-inline.c (expand_call_inline): Don' mess with _DECL
- fields.
-
-2002-06-13 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * diagnostic.c (output_format): Recognize "%H" as a format
- specifier for a location_t.
- (text_specifies_location): New function.
- (diagnostic_set_info): Use it.
-
-2002-06-13 Jeffrey Law <law@redhat.com>
-
- * emit-rtl.c (static_regno_reg_rtx): Define.
- (init_emit_once): Initialize static_regno_reg_rtx.
- (init_emit): Copy static_regno_reg_rtx into regno_reg_rtx instead
- of building new hard reg objects once per function.
- (gen_rtx_REG): Try to share hard regs.
- * regclass.c (init_fake_stack_mems): New function broken out from
- init_regs.
- * rtl.h (init_fake_stack_mems): Declare.
- * toplev.c (lang_independent_init): Call init_regs before
- init_emit_once. Call init_fake_stack_mems after init_emit_once.
-
- * i386.md (extenddfxf2, extenddftf2): Fix typo/thinko.
-
- * alias.c (argument_registers): Remove.
- (init_alias_once): Initialize static_reg_base_value here. Remove
- initialization of argument_registers.
- (init_alias_once_per_function): Remove.
- (init_alias_analysis): Copy all the entries from static_reg_base_value
- into new_reg_base_value all at once.
- * rtl.h (init_alias_once_per_function): Remove declaration.
- * function.c (prepare_function_start): Do not call
- init_alias_once_per_function.
-
- * caller-save.c (init_caller_save): Use gen_rtx_INSN instead of
- starting a sequence and emitting an INSN.
-
-2002-06-13 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/r3900.h (MIPS_CPU_STRING_DEFAULT): Make lower case.
-
-2002-06-13 David S. Miller <davem@redhat.com>
-
- * expmed.c (init_expmed): Remove duplicate init of 'reg'.
-
-2002-06-13 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplib.c (end_directive): Handle line skipping. Only remove
- the rest of the line if the directive was valid.
- * cppmacro.c (_cpp_push_text_context): Set NODE_DISABLED when
- expanding a traditional macro.
- * cpptrad.c (recursive_macro): New.
- (read_logical_line_trad): Handle skipping.
- (scan_out_logical_line): Continue after a successful directive.
- Don't expand macros whilst skipping, or if recursing.
- (_cpp_create_trad_definition): scan_out_logical_line now sets
- the output current position.
-
-2002-06-12 Eric Christopher <echristo@redhat.com>
-
- From Chris Demetriou <cgd@broadcom.com>
- * config/mips/mips.h (ISA_HAS_FP4): Add ISA_MIPS64 and fix
- comment.
- (ISA_HAS_MADD_MSUB): Ditto.
- (ISA_HAS_NMADD_NMSUB): Ditto.
-
-2002-06-12 Eric Christopher <echristo@redhat.com>
-
- * config.gcc: Consolidate little endian handling and
- little/big endian targets.
- * config/mips/elfl.h: Remove file.
- * config/mips/elfl64.h: Ditto.
- * config/mips/ecoffl.h: Ditto.
- * config/mips/r3900.h (SUBTARGET_CPP_SPEC): Remove.
-
-2002-06-12 Geoffrey Keating <geoffk@redhat.com>
-
- * gengtype.h (xvasprintf): New prototype.
- (xasprintf): New prototype.
- (struct outf): New.
- (get_output_file): Return an outf_p.
- (header_file): Is now an outf_p.
- (base_files): Now are outf_p.
- (oprintf): New.
- * gengtype.c: Replace all output FILE * with outf_p; use oprintf
- rather than stdio operations. Use xasprintf in a few places,
- when appropriate.
- (xvasprintf): New.
- (xasprintf): New.
- (struct filemap): Delete.
- (files): Delete.
- (output_files): New.
- (oprintf): New.
- (create_file): Create an outf_p. Add parameter to indicate output
- file name, change all callers.
- (open_base_files): Create gtype-desc.c here.
- (get_output_file_with_visibility): Rewrite.
- (get_output_file_name): Just look at 'name' field in struct outf.
- (close_output_files): Rewrite.
-
-2002-06-12 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/vax/vax.h (MASK_UNIX_ASM, MASK_VAXC_ALIGNMENT)
- (MASK_G_FLOAT): Define.
- (TARGET_UNIX_ASM, TARGET_VAXC_ALIGNMENT, TARGET_G_FLOAT): Use them.
- (TARGET_SWITCHES): Likewise.
- (TARGET_DEFAULT): Likewise.
-
-2002-06-12 Daniel Jacobowitz <drow@mvista.com>
-
- * config/mips/elf.h (DWARF2_DEBUG_INFO): Define.
- * config/mips/mips.c (mips_output_filename): Don't print a
- ".file" directive if we are using DWARF-2.
- (mips_output_function_prologue): Do not emit source file
- name for TARGET_GAS.
-
-Wed Jun 12 16:45:13 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (shift patterns): Use (TARGET_SHIFT1 || optimize_size) to
- decide whether emit the short opcode.
- * i386.h (x86_shift1): Declare.
- (TARGET_SHIFT1): New macro.
- * i386.c (x86_shift1): New global variable.
-
- * toplev.c (rest_of_compilation): Call find_basic_block pre-loop
- unconditionally; make loop to rebuild CFG; kill unnecesary
- find_basic_block calls; kill compute_bb_for_insn call.
- * cfgbuild.c (find_basic_blocks): Kill compute_bb_for_insn call.
- * haifa-sched.c (sched_init): Likewise.
- * ssa-ccp.c (ssa_const_prop): Likewise.
- * ssa-dce.c (ssa_eliminate_dead_code): Likewise.
-
-2002-06-11 David S. Miller <davem@redhat.com>
-
- * emit-rtl.c (emit_*_scope): Only access INSN_SCOPE if
- active_insn_p.
-
-2002-06-11 Richard Henderson <rth@redhat.com>
-
- * c-common.c (builtin_define_type_max): New.
- (cb_register_builtins): Define __SCHAR_MAX__, __SHRT_MAX__,
- __INT_MAX__, __LONG_MAX__, __LONG_LONG_MAX__, __CHAR_BIT__.
-
- From Joseph S. Myers:
- * glimits.h: Rewrite to expect the double underscore definitions
- from the compiler.
-
- * config/alpha/unicosmk.h, config/avr/avr.h, config/h8300/h8300.h,
- config/i386/linux64.h, config/ia64/aix.h, config/ia64/hpux.h,
- config/ia64/ia64.h, config/m68hc11/m68hc11.h, config/m68hc11/m68hc12.h,
- config/mips/mips.h, config/mmix/mmix.h, config/mn10200/mn10200.h,
- config/pa/pa.h, config/rs6000/aix43.h, config/rs6000/aix51.h,
- config/rs6000/linux64.h, config/s390/linux.h, config/sh/sh.h,
- config/stormy16/stormy16.h: Don't define any of __SHRT_MAX__,
- __INT_MAX__, __LONG_MAX__, or __LONG_LONG_MAX__.
-
-2002-06-11 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (ALPHA_BUILTIN_THREAD_POINTER): New.
- (ALPHA_BUILTIN_SET_THREAD_POINTER): New.
- (code_for_builtns): Update.
- (alpha_init_builtins): Add __builtin_thread_pointer and
- __builtin_set_thread_pointer.
- (alpha_expand_builtin): Handle void builtins.
- * doc/extend.texi (Alpha Built-in Functions): Update.
-
-2002-06-11 Hans-Peter Nilsson <hp@axis.com>
-
- PR target/6997
- * config/cris/cris.md ("sleu"): Set attribute "cc" to "none".
-
-2002-06-11 Zack Weinberg <zack@codesourcery.com>
-
- * config.gcc: Make the name of the extra-modes file adjustable
- by target stanzas.
- (s390x, strongarm, xscale stanzas): Use this facility.
- * configure.in: Update to match.
- * configure: Regenerate.
-
-2002-06-11 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (rs6000_emit_minmax): Treat unsigned
- max/mins as unsigned GE compares.
-
-2002-06-11 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (vax-*-bsd*): Add vax/bsd.h to ${tm_file}.
- * config/vax/bsd.h: New file.
- * config/vax/netbsd.h: Add missing notice.
- (CPP_PREDEFINES): Remove.
- (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_SPEC): Use NETBSD_CPP_SPEC.
- * config/vax/openbsd.h: Update copyright years.
- (CPP_PREDEFINES): Remove.
- (TARGET_OS_CPP_BUILTINS): Define.
- * config/vax/ultrix.h: Likewise.
- * config/vax/vaxv.h: Likewise.
- * config/vax/vms.h: Likewise.
- * config/vax/vax.h (TARGET_CPU_CPP_BUILTINS): Define.
- (CPP_PREDEFINES, CPP_SPEC): Remove.
-
-Wed Jun 12 01:50:28 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (addqi_1_slp, subqi_1_slp
- (andqi_ext0, testqi_ext0): Remove unnecesary check.
- (addhi*, addqi*): Simplify "dec" condition.
- (testsi to testqi splitters): Remove TARGET_PROMOTE_QImode check.
- (and, or, xor to QImode splitters): New.
- (iorqi_ext*): New.
- (xorqi_ext_0): New.
- (xorqi_ext_1): Rename to xorqi_ext_2; bring to sync with and versions.
- (andqi_ext_1_rex64): New.
- (ashrqi*_slp): New.
- (ashlqi*_slp): New.
- (lshlqi*_slp): New.
- (rotrqi3*_slp): New.
- (rotlqi3*_slp): New.
-
-2002-06-11 Geoffrey Keating <geoffk@redhat.com>
-
- * config.gcc (powerpc*-*-*, rs6000-*-*-*): Don't bother including
- softfloat.h.
- * config/rs6000/vxppc.h (CPP_ENDIAN_BIG_SPEC): Delete.
- (CPP_ENDIAN_LITTLE_SPEC): Delete.
- * config/rs6000/sysv4le.h (CPP_ENDIAN_DEFAULT_SPEC): Delete.
- * config/rs6000/sysv4.h (CPP_SYSV_SPEC): Delete _SOFT_FLOAT setting,
- __LONG_DOUBLE_128__ setting, _CALL_* setting.
- (CPP_DEFAULT_SPEC): Delete.
- (CPP_FLOAT_DEFAULT_SPEC): Delete.
- (CPP_LONGDOUBLE_DEFAULT_SPEC): Delete.
- (CPP_SYSV_DEFAULT_SPEC): Delete.
- (CPP_ENDIAN_BIG_SPEC): Delete.
- (CPP_ENDIAN_LITTLE_SPEC): Delete.
- (CPP_ENDIAN_SPEC): Delete.
- (CPP_SPEC): Don't include cpp_endian, cpp_cpu.
- (SUBTARGET_EXTRA_SPECS): Delete cpp_sysv_default, cpp_endian_default,
- cpp_endian, cpp_endian_big, cpp_endian_little, cpp_float_default,
- cpp_longdouble_default.
- * config/rs6000/softfloat.h: Delete.
- * config/rs6000/rs6000.h (CPP_CPU_SPEC): Delete.
- (EXTRA_SPECS): Delete cpp_cpu.
- (TARGET_CPU_CPP_BUILTINS): New.
- * config/rs6000/rs6000-protos.h (rs6000_cpu_cpp_builtins): New
- prototype.
- * config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): New.
- * config/rs6000/linux64.h (CPP_PREDEFINES): Remove endianness defines.
- (CPP_DEFAULT_SPEC): Delete.
- * config/rs6000/eabiaix.h (CPP_SYSV_DEFAULT_SPEC): Delete.
- * config/rs6000/darwin.h (CPP_PREDEFINES): Don't define __BIG_ENDIAN__.
- * config/rs6000/beos.h (CPP_SPEC): Remove cpp_cpu.
- (CPP_DEFAULT_SPEC): Delete.
- * config/rs6000/aix51.h (CPP_SPEC): Remove cpp_cpu, -D_ARCH_PPC.
- (CPLUSPLUS_CPP_SPEC): Likewise.
- (CPP_CPU_SPEC): Delete.
- (CPP_DEFAULT_SPEC): Delete.
- * config/rs6000/aix43.h (CPP_SPEC): Remove cpp_cpu, -D_ARCH_PPC.
- (CPLUSPLUS_CPP_SPEC): Likewise.
- (CPP_CPU_SPEC): Delete.
- (CPP_DEFAULT_SPEC): Delete.
- * config/rs6000/aix41.h (CPP_SPEC): Remove cpp_cpu.
- (CPP_DEFAULT_SPEC): Delete.
- * config/rs6000/aix.h (CPP_SPEC): Remove cpp_cpu.
- (CPP_DEFAULT_SPEC): Delete.
-
- * doc/gty.texi: Small updates.
-
-2002-06-12 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * objc/objc-act.c (warn_with_ivar): Adjust calls to
- diagnostic_count_error.
- (warn_with_method): Likewise.
-
- * diagnostic.h (warnings_are_errors_message): New field of
- diagnostic_context.
- (diagnostic_count_error): Rename to diagnostic_count_diagnostic to
- match semantics.
- * diagnostic.c: Adjust calls to diagnostic_count_error through out.
- (diagnostic_count_diagnostic): Make aware of other kinds of
- diagnostics.
- (diagnostic_initialize): Initialize warnings_are_errors_message field.
-
-2002-06-11 Tom Tromey <tromey@redhat.com>
-
- For PR java/6520:
- * fold-const.c (fold_convert): Don't modify existing tree's type.
-
-2002-06-11 Geoffrey Keating <geoffk@redhat.com>
-
- * config/rs6000/ppc-asm.h: Remove some Windows NT leftovers.
-
-2002-06-11 Richard Henderson <rth@redhat.com>
-
- * caller-save.c (init_caller_save): Clear INSN_CODE each iteration.
-
-2002-06-11 Richard Henderson <rth@redhat.com>
-
- * defaults.h (EH_FRAME_SECTION_NAME): Don't define if
- DWARF2_UNWIND_INFO is false.
-
-2002-06-11 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/t-xtensa (LIBGCC1_TEST, CROSS_LIBGCC1): Delete.
-
- * config/s390/s390.c (emit_prologue): gen_store_multiple
- returns an insn now, not a pattern.
-
-2002-06-11 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * Makefile.in (gccinstall.dvi): Pass absolute pathnames to
- $(TEXI2DVI) -o.
-
-Tue Jun 11 21:53:37 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (x86_promote_QImode): Set for Athlon
- (x86_fast_prefix): New global variable.
- (x86_arch_always_fancy_math_387): Fix formating.
- * i386.h (x86_fast_prefix): Declare
- (TARGET_FAST_PREFIX): define.
- * i386.md (and to strict_low_part, HI to SI
- promoting splitter): Use new macro.
-
- * i386.h (RTX_COSTS): float_extend is not for free for SSE.
-
-2002-06-11 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (distclean): Delete junk left in testsuite
- directory, too.
-
-2002-06-11 Jeffrey Law <law@redhat.com>
-
- * emit-rtl.c (try_split): Use INSN_LAST, not LAST_INSN to get the
- last insn created by the splitter.
-
- * caller-save.c (init_caller_save): Move creation of SAVEINSN
- and RESTINSN into into the scope of the sequence.
-
- * mips.c (mips_expand_prologue): Use emit_jump_insn for trivial
- RETURN insns.
-
- * loop.c (loop_regs_scan): Avoid useless generation of REG objects.
-
- * mips.c (function_arg_advance): gen_ashldi3 returns an INSN now,
- not the pattern. So extract the pattern from the insn.
-
- * mips.c (embedded_pic_fnaddr_reg): Fix typo.
-
-2002-06-11 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.md (movsi): Only use floating point
- register alternatives when operands are already fprs.
- (movdi_31, movdi_64): Likewise.
-
-2002-06-11 David S. Miller <davem@redhat.com>
-
- * emit-rtl.c (try_split): Do not abort on non-INSN_P.
- Only run RTX equality checks on INSN_P rtl.
-
-2002-06-11 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.md (reload_base, ltorg): Remove.
- * s390.c (s390_stop_dump_lit_p, s390_dump_literal_pool,
- s390_asm_output_pool_prologue, s390_pool_start_insn): Remove.
- * s390-protos.h (s390_stop_dump_lit_p, s390_dump_literal_pool,
- s390_asm_output_pool_prologue): Likewise.
- * s390.h (s390_pool_start_insn): Likewise.
-
- * s390.c (s390_output_symbolic_const): Remove support for
- old-style pool chunks.
- (s390_function_epilogue): Likewise.
- (s390_output_constant_pool): Likewise. Also, fix incorrect
- alignment for 64-bit literal pools.
- (print_operand_address): Remove 'y' and 'Y' format flags.
- * s390.h (ASM_OUTPUT_POOL_PROLOGUE): Remove support for
- old-style pool chunks.
- (ASM_OUTPUT_SPECIAL_POOL_ENTRY): Likewise.
- (ASM_OUTPUT_POOL_EPILOGUE): Remove.
- (S390_CHUNK_MAX, S390_CHUNK_OV, S390_POOL_MAX): Remove.
-
- * s390.c (consttable_operand): New function.
- * s390-protos.h (consttable_operand): Declare it.
- * s390.h (PREDICATE_CODES): Add consttable_operand.
- * s390.md (consttable_qi, consttable_hi, consttable_si, consttable_di,
- consttable_sf, consttable_df, pool_start_31, pool_end_31,
- pool_start_64, pool_end_64, reload_base, reload_base2): New insns.
- * s390.c (struct constant, struct constant_pool): New data types.
- (constant_modes, gen_consttable): New variables.
- (s390_start_pool, s390_end_pool, s390_add_pool,
- s390_dump_pool, s390_free_pool): New functions.
- (s390_chunkify_pool): Completely reimplement literal pool
- overflow handling.
-
- * s390.c (s390_pool_overflow): New variable.
- * s390.h (s390_pool_overflow): Declare it.
- * s390.md (cjump, icjump): Use it to adapt length for out-of-range
- jumps in literal pool overflow situations.
-
- * s390.c (s390_decompose_address): Accept new-style pool chunk offsets.
- (s390_frame_info): Account for possible use of RETURN_REGNUM
- by new literal pool overflow code.
- (s390_emit_prologue): Likewise.
-
-2002-06-05 David S. Miller <davem@redhat.com>
-
- Delete SEQUENCE rtl usage outside of reorg and ssa passes.
- * rtl.h (gen_sequence, emit_insns, emit_insns_before,
- emit_insns_before_scope, emit_insns_after,
- emit_insns_after_scope): Delete declaration.
- * ada/misc.c (insert_code_for): Use emit_insn* instead of
- emit_insns_foo.
- * config/alpha/alpha.c (alpha_set_memflags_1): Abort on SEQUENCE.
- (alpha_set_memflags): Fix comment.
- (set_frame_related_p): Use get_insns instead of gen_sequence.
- * config/alpha/alpha.md (setjmp receiver splitter): Avoid
- emitting no insns.
- * config/arm/arm.c (arm_finalize_pic): Use get_insns instead of
- gen_sequence.
- (arm_gen_load_multiple, arm_gen_store_multiple): Likewise.
- * config/fr30/fr30.c (fr30_move_double): Likewise.
- * config/i386/i386.c (ix86_expand_int_movcc, ix86_expand_movstr):
- Likewise.
- * config/ia64/ia64.c (spill_restore_mem): Likewise.
- * config/ia64/ia64.md (conditional move spliiter): Avoid emitting
- no insns.
- * config/m32r/m32r.c (gen_split_move_double): Use get_insns
- instead of gen_sequence.
- * config/mips/mips.c (embedded_pic_fnaddr_reg): Likewise.
- (mips_expand_prologue, mips16_gp_pseudo_reg): Likewise.
- * config/sh/sh.c (sh_need_epilogue): Likewise.
- * config/sparc/sparc.md (current_function_calls_alloca, flat): New
- attributes.
- (setjmp pattern and split): Use them to avoid splitter which emits
- no RTL.
- * genattrtab.c (main): Emit include of function.h
- * config/stormy16/stormy16.c (xstormy16_split_cbranch): Use
- get_insns instead of gen_sequence.
- * config/cris/cris.c (cris_split_movdx): Likewise.
- * emit-rtl.c (emit_insns*): Kill.
- (try_split): Expect insn list instead of SEQUENCE.
- (make_jump_insn_raw, make_call_insn_raw): Fix comments.
- (emit_*insn*): Reimplement to work with INSN lists and PATTERNs.
- Make them abort if a SEQUENCE is given and RTL checking is
- enabled.
- (emit_*_scope): Don't forget to set scope on final insn.
- (gen_sequence): Move from here...
- * ssa.c (gen_sequence): To here as private function.
- * builtins.c (expand_builtin_apply_args): Use emit_insn_foo, fix
- comments.
- (expand_builtin_return, expand_builtin_mathfn): Likewise.
- (expand_builtin_strlen): Use get_insns instead of gen_sequence.
- (expand_builtin_saveregs): Use emit_insn_foo, fix comments.
- (expand_builtin_expect_jump): Use get_insns and fix comments.
- * calls.c (try_to_integrate): Use emit_insn_foo.
- (expand_call, emit_library_call_value_1): Likewise.
- * expr.c (emit_queue): Handle insn lists instead of SEQUENCE.
- (emit_move_insn_1): Use get_insns instead of gen_sequence.
- (expand_expr): Use emit_insn_foo.
- * cfgrtl.c (commit_one_edge_insertion): Use emit_insn_foo.
- * except.c (build_post_landing_pads): Likewise.
- * flow.c (attempt_auto_inc): Likewise.
- * stmt.c (expand_fixup, fixup_gotos, expand_nl_handler_label,
- expand_nl_goto_receivers, expand_decl_cleanup): Likewise.
- * function.c (fixup_var_refs_insn): Use get_insns instead of
- gen_sequence.
- (fixup_var_refs_1): Likewise and expect insn list from gen_foo.
- (fixup_memory_subreg): Use get_insns instead of gen_sequence.
- (fixup_stack_1, purge_addressof_1, expand_main_function,
- get_arg_pointer_save_area): Likewise.
- (optimize_bit_field, instantiate_virtual_regs_1, assign_parms,
- expand_function_end): Use emit_insn_foo.
- (record_insns, keep_stack_depressed): Work with insn list instead
- of SEQUENCE, fix comments.
- * ifcvt.c (noce_emit_store_flag, noce_try_store_flag,
- noce_try_store_flag_constants, noce_try_store_flag_inc,
- noce_try_store_flag_mask, noce_emit_cmove, noce_try_cmove_arith,
- noce_try_minmax, noce_try_abs): Use emit_insn_foo.
- (noce_process_if_block): Use get_insns instead of gen_sequence.
- * optabs.c (add_equal_note): Work with insn list, fix comments.
- (expand_binop): Expect insn list from GEN_FCN(), use emit_insn_foo.
- (expand_unop, expand_complex_abs, expand_unop_insn,
- expand_no_conflict_block): Likewise.
- (gen_move_insn): Use get_insns instead of gen_sequence.
- (gen_cond_trap): Likewise.
- * integrate.c (copy_rtx_and_substitute): Likewise.
- (emit_initial_value_sets): Use emit_insn_foo.
- * reload1.c (emit_output_reload_insns, emit_reload_insns): Likewise.
- (fixup_abnormal_edges): Avoid losing REG_NOTES more intelligently
- now that RTL generators give insn lists.
- * sibcall.c (replace_call_placeholder): Use emit_insn_foo.
- * doloop.c (doloop_modify, doloop_modify_runtime): Use get_insns
- instead of gen_sequence.
- (doloop_optimize): Work with insn lists instead of SEQUENCE rtl.
- * explow.c (emit_stack_save, emit_stack_restore): Use get_insns
- instead of gen_sequence.
- * loop.c (move_movables, emit_prefetch_instructions,
- gen_add_mult, check_dbra_loop, gen_load_of_final_value):
- Likewise.
- (loop_regs_update): Work with insn list instead of SEQUENCE rtl.
- (product_cheap_p): Likewise, and add commentary about RTL wastage
- here.
- * lcm.c (optimize_mode_switching): Use get_insns instead of
- gen_sequence.
- * profile.c (gen_edge_profiler): Likewise.
- * regmove.c (copy_src_to_dest): Likewise.
- * reg-stack.c (compensate_edge): Likewise and fix comment.
- * gcse.c (process_insert_insn): Likewise.
- (insert_insn_end_bb): Work with insn list instead of SEQUENCE rtl.
- * jump.c (delete_prior_computation): Update comment.
- * genemit.c (gen_expand, gen_split, main): Use get_insns instead
- of gen_sequence, update comments to match.
- * recog.c (peephole2_optimize): Work with insn lists instead of
- SEQUENCE rtl.
- * sched-vis.c (print_pattern): Abort on SEQUENCE.
- * unroll.c (unroll_loop, find_splittable_givs, final_giv_value):
- Use get_insns instead of gen_sequence.
- (copy_loop_body): Likewise and don't emit dummy NOTE.
- * genrecog.c: Don't mention SEQUENCE rtl in comments.
- * combine.c (try_combine): Expect insn lists from split generator.
- * reorg.c (relax_delay_slots): Emit SEQUENCE into insn list by
- hand.
-
-2002-06-11 Roger Sayle <roger@eyesopen.com>
- Andreas Jaeger <aj@suse.de>
-
- * cfgbuild.c: Update copyright years.
-
-2002-06-11 Andreas Schwab <schwab@suse.de>
-
- * config/m68k/m68k.h (PREDICATE_CODES): Define.
-
-2002-06-11 Eric Christopher <echristo@redhat.com>
-
- * doc/tm.texi (Run-time Target): Add comment about flag_iso
- and strict ANSI.
- * config/mips/ecoff.h (CPP_PREDEFINES): Remove.
- * config/mips/ecoffl.h: Ditto.
- * config/mips/elf64.h (SUBTARGET_CPP_SPEC): Remove.
- (CPP_PREDEFINES): Ditto.
- * config/mips/elfl64.h: Ditto.
- * config/mips/elfl.h: Ditto.
- * config/mips/iris3.h (CPP_PREDEFINES, SUBTARGET_CPP_SPEC): #if 0
- out until irix header consolidation.
- * config/mips/iris5.h (CPP_PREDEFINES, SUBTARGET_CPP_SPEC): Replace
- with SUBTARGET_OS_CPP_BUILTINS.
- * config/mips/iris6.h: Ditto.
- (CPLUSPLUS_CPP_SPEC): Remove.
- * config/mips/linux.h: Ditto.
- * config/mips/netbsd.h: Ditto.
- * config/mips/openbsd.h: Ditto.
- * config/mips/rtems.h: Ditto.
- * config/mips/rtems64.h: Ditto.
- * config/mips/sni-svr4.h: Ditto.
- * config/mips/mips.h (ISA_MIPS1, ISA_MIPS2, ISA_MIPS3, ISA_MIPS4,
- ISA_MIPS32, ISA_MIPS64): New defines.
- (GENERATE_MULT3_SI, HAVE_SQRT_P, ISA_HAS_64BIT_REGS,
- ISA_HAS_BRANCHLIKELY, ISA_HAS_CONDMOVE, ISA_HAS_8CC, ISA_HAS_FP4,
- ISA_HAS_COND_TRAP, ISA_HAS_MADD_MSUB, ISA_HAS_NMADD_NMSUB,
- ISA_HAS_CLZ_CLO, ISA_HAS_DCLZ_DCLO): Use.
- (TARGET_CPU_CPP_BUILTINS): Define.
- (CPP_PREDEFINES, LONG_MAX_SPEC, CPP_FPR_SPEC, CPP_SPEC): Remove.
- * config/mips/mips.md (mulsi3_mult3): Use ISA_MIPS32/64.
- (movdicc): Remove check for ISA_MIPS32.
- (bunordered, bordered, bungt, bunlt, buneq, bunge, bunle,
- sunordered_df, sunordered_sf, sordered_df, sordered_sf,
- sunlt_df, sunlt_sf, sungt_df, sungt_sf, suneq_df, suneq_sf, sunge_df,
- sunge_sf, sunle_df, sunle_sf): New patterns.
-
-2002-06-11 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in: Update cppmain.o.
- * cpphash.h (struct cpp_reader): Move some members to a
- nested structure.
- (trad_line): Rename saved_line.
- (_cpp_read_logical_line_trad): Update.
- (_cpp_remove_overlay): New.
- * cppinit.c (cpp_create_reader): No need to set saved_line.
- (cpp_destroy): Update.
- (cpp_read_main_file): Only overlay if compiling.
- * cpplex.c (continue_after_nul): Return false if in directive.
- * cpplib.c (EXPAND): New.
- (directive_table, SEEN_EOL): Update.
- (end_directive): Remove overlay if traditional; don't skip
- line in traditional #define.
- (prepare_directive_trad): New.
- (_cpp_handle_directive, run_directive): Update for traditional
- directives.
- (lex_macro_node): Simplify, don't use lex_identifier_trad.
- * cpplib.h (struct options): Add preprocess_only.
- * cppmain.c: Don't include intl.h.
- (cpp_preprocess_file): Set options->preprocess_only.
- (scan_translation_unit_trad): Fix, and print line numbers.
- * cpptrad.c (check_output_buffer, lex_identifier, scan_parameters,
- maybe_start_funlike, scan_out_logical_line, replace_args_and_push,
- save_replacement_text, _cpp_create_trad_definition): Update for
- variable renaming.
- (_cpp_overlay_buffer): Save line number.
- (_cpp_remove_overlay): Rename from restore_buff, restore line.
- (_cpp_read_logical_line_trad): Don't handle overlays here.
- (scan_out_logical_line): Process directives.
-
-2002-06-11 Danny Smith <dannysmith@users.sourforge.net>
-
- * gthr-win32.h: Wrap functions in extern "C".
- (__gthread_key_t): Typedef as unsigned long,
- not win32 DWORD.
- (__GTHREAD_ONCE_INIT): Use 0, not win32 FALSE.
- (__gthread_mutex_t): Typedef as void*, not win32 HANDLE.
- (__gthr_win32_once, __gthr_win32_key_create,
- __gthr_win32_key_delete, __gthr_win32_getspecific,
- __gthr_win32_setspecific, __gthr_win32_mutex_init_function,
- __gthr_win32_mutex_lock,__gthr_win32_mutex_trylock,
- __gthr_win32_mutex_unlock): Declare.
- (__gthread_once,__gthread_key_create,
- __gthread_key_delete, __gthread_getspecific,
- __gthread_setspecific, __gthread_mutex_init_function,
- __gthread_mutex_lock,__gthread_mutex_trylock,
- __gthread_mutex_unlock): Call corresponding
- __gthr_win32_* extern implementations if #defined
- __GTHREAD_HIDE_WIN32API.
- * config/i386/t-mingw32 (LIB2FUNCS_EXTRA): Set to
- $(srcdir)/config/i386/gthr-win32.c
- * config/i386/gthr-win32.c: New implementation file.
- (__gthr_win32_once, __gthr_win32_key_create,
- __gthr_win32_key_delete, __gthr_win32_getspecific,
- __gthr_win32_setspecific, __gthr_win32_mutex_init_function,
- __gthr_win32_mutex_lock,__gthr_win32_mutex_trylock,
- __gthr_win32_mutex_unlock): New functions, based on
- static inlines in gthr-win32.h.
-
-2002-06-10 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.c (override_options): Don't warn about
- using -fpic or -fPIC when PIC is enabled by default.
-
-2002-06-10 Roger Sayle <roger@eyesopen.com>
-
- * toplev.c (rest_of_compilation): Revert flag_if_conversion change.
-
-2002-06-10 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (MACHMODE_H): Add @extra_modes_file@.
- * configure.in: If $srcdir/config/${cpu_type}/${cpu_type}-modes.def
- exists, substitute its pathname as @extra_modes_file@, define
- EXTRA_MODES_FILE to be an appropriate string to #include it
- with, and define EXTRA_CC_MODES to 1.
-
- * machmode.def: Update comments. Include EXTRA_MODES_FILE if
- it's defined. Get rid of redundancy in calling sequence for
- CC; don't use it to define CCmode, to avoid a warning.
- * libgcc2.c: Include symcat.h for the sake of machmode.def.
-
- * arc-modes.def, arm-modes.def, c4x-modes.def, i386-modes.def,
- i960-modes.def, ia64-modes.def, m88k-modes.def, mmix-modes.def,
- pa-modes.def, pdp11-modes.def, rs6000-modes.def, sparc-modes.def:
- New files.
- * arc.h, arm.h, c4x.h, i386.h, i960.h, ia64.h, m88k.h, mmix.h,
- pa.h, pdp11.h, rs6000.h, sparc.h: Don't define EXTRA_CC_MODES.
-
- * doc/sourcebuild.texi, doc/tm.texi: Document new scheme for
- defining extra CC modes.
-
-2002-06-10 Roger Sayle <roger@eyesopen.com>
- Andreas Jaeger <aj@suse.de>
-
- * cfgrtl.c (create_basic_block_structure): Remove index argument
- and use last_basic_block++ instead. (create_basic_block): Update.
- * cfgbuild.c (find_basic_blocks_1): Likewise.
-
- * cfgrtl.c (compute_bb_for_insn): Remove unused "max" argument.
- * haifa-sched.c (sched_init): Update compute_bb_for_insn caller.
- * sched-ebb.c (schedule_ebbs): Likewise.
- * sched-rgn.c (schedule_insns): Likewise.
- * ssa-ccp.c (ssa_const_prop): Likewise.
- * ssa-dcs.c (ssa_eliminate_dead_code): Likewise.
- * toplev.c (rest_of_compilation): Likewise.
- * config/ia64/ia64.c (ia64_reorg): Likewise.
-
-2002-06-10 Roger Sayle <roger@eyesopen.com>
-
- * simplify-rtx.c (simplify_replace_rtx): Allow replacement
- of matching registers.
-
-2002-06-10 Roger Sayle <roger@eyesopen.com>
-
- * toplev.c (rest_of_compilation): Disable early if-conversion pass.
- * gcse.c (bypass_conditional_jumps): Fix typo in setcc test.
-
-2002-06-10 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.h: Improve comments.
- (CPP_SPEC, CPP_PREDEFINES): Don't define.
- (TARGET_CPU_CPP_BUILTINS): Define.
- (CANONICALIZE_COMPARISON): Don't define, replace with comment.
- (PREDICATE_CODES) <"mmix_reg_or_8bit_or_256_operand">: Remove
- unused predicate.
- * config/mmix/mmix.c (MMIX_OUTPUT_REGNO): Add cast to avoid
- compiler warning.
- (mmix_constant_address_p): Remove another
- redundant test before case.
- (mmix_canonicalize_comparison): Remove unused function.
- (mmix_print_operand_address): Don't test and adjust for operand in
- non-canonical format.
- (mmix_reg_or_8bit_or_256_operand): Remove unused predicate.
- (mmix_gen_compare_reg): Don't use CANONICALIZE_COMPARISON.
-
-2002-06-10 Zack Weinberg <zack@codesourcery.com>
-
- * config/m32r/m32r.h: Don't define SELECT_CC_MODE.
- * config/m32r/m32r-protos.h: Don't prototype m32r_select_cc_mode.
- * config/m32r/m32r.c: Don't define m32r_select_cc_mode.
- (gen_compare): Use CCmode unconditionally.
-
-2002-06-10 Jakub Jelinek <jakub@redhat.com>
-
- PR optimization/6759
- * cse.c (cse_insn): Fold src_eqv just once, store it folded back into
- the REQ_EQUAL note.
-
-2002-06-10 Jakub Jelinek <jakub@redhat.com>
-
- PR c/6660
- * c-decl.c (grokfield): Allow user defined types if they declare
- structs or unions for unnamed fields.
-
-2002-06-10 Jakub Jelinek <jakub@redhat.com>
-
- PR c/6809
- * print-rtl.c (print_mem_expr): Don't crash on unnamed fields.
-
-2002-06-10 Jakub Jelinek <jakub@redhat.com>
-
- PR optimization/6842
- * combine.c (combine_simplify_rtx) [SUBREG]: Don't ICE if VOIDmode
- operand subreg cannot be simplified.
-
-2002-06-10 Jakub Jelinek <jakub@redhat.com>
-
- * varasm.c (const_hash): Handle FDESC_EXPR like ADDR_EXPR.
- (compare_constant): Likewise.
- (output_addressed_constants): Likewise.
-
-2002-06-10 Jakub Jelinek <jakub@redhat.com>
-
- * cfgcleanup.c (try_optimize_cfg): Make sure merge_blocks doesn't
- merge bb with itself.
-
-2002-06-10 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (builtin_zap): Fix thinkos expanding mask.
- (builtin_zapnot): Likewise.
-
- * config/alpha/ev5.md: Don't combine shift and mvi insns in one
- reservation.
-
-2002-06-10 Eric Christopher <echristo@redhat.com>
-
- * config/i386/i386.c (ix86_osf_output_function_prologue): Remove
- prototype and function.
- (TARGET_ASM_FUNCTION_PROLOGUE): Remove OSF version.
- (call_insn_operand): Remove half pic references.
- (legitimate_address_p): Ditto.
- * config/i386/i386.h: Remove half pic defines.
-
-2002-06-10 Eric Christopher <echristo@redhat.com>
-
- * doc/extend.texi (Return Address): Add note explaining the side-
- effects of inlining on __builtin_return_address.
-
-2002-06-10 Tom Tromey <tromey@redhat.com>
-
- * Makefile.in (LANGHOOKS_DEF_H): Include langhooks-def.h.
- (c-common.o): Depend on langhooks.h.
-
-2002-06-10 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (_cpp_read_logical_line_trad,
- _cpp_expansions_different_trad): Update prototypes.
- * cpplex.c (continue_after_nul): New.
- * cppmain.c: Include cpphash.h.
- (scan_translation_unit_trad): New.
- (cpp_preprocess_file): Call it.
- * cpptrad.c (_cpp_read_logical_line_trad): Take new parameter
- overlay.
- (_cpp_expansions_different_trad): Update prototype.
-
-Mon Jun 10 18:02:24 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- Fix cfi generation for SH[1-4]:
-
- * sh.c (frame_insn): New function.
- (output_stack_adjust): Add parameter emit_fn. All callers changed.
- (push): Now returns rtx. Use frame_insn.
- (sh_expand_prologue): Clear RTX_FRAME_RELATED_P for second push
- of a DF register.
- * sh.h (INCOMING_RETURN_ADDR_RTX, DWARF_FRAME_RETURN_COLUMN): Define.
-
-2002-06-10 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (STAGESTUFF): Add s-gtype, gt-*.h, gtype-*.h,
- and gtype-desc.c.
- (mostlyclean): Delete specs.h, options.h, gencheck.h here...
- (distclean): ... not here. But do delete all testsuite/*.log,
- testsuite/*.sum files here. Delete mkheaders. Delete
- po/*.gmo and the testsuite directory in a split tree build.
-
-2002-06-10 Jeffrey Law <law@redhat.com>
-
- * alias.c (static_reg_base_value): New to hold RTL for
- items allocated once per function for the aliasing code.
- (init_alias_once_per_function): Initialize static_reg_base_value.
- (init_alias_analysis): Avoid throw-away allocations of RTL by
- using pre-computed values in static_reg_base_value.
- * function.c (prepare_function_start): Call
- init_alias_once_per_function appropriately.
- * rtl.h (init_alias_once_per_function): Declare.
- * caller-save (init_caller_save): Restructure slightly to
- avoid lots of silly RTL generation.
- * expr.c (init_expr_once): Likewise.
- * reload1.c (reload_cse_regs_1): Allocate throw-away register
- RTL object here. Pass it into children.
- (reload_cse_simplify_operands): Use passed-in register RTL
- object.
- (reload_cse_simplify): Pass through throw-away register
- RTL object.
-
-2002-06-10 Daniel Berlin <dberlin@dberlin.org>
-
- * Makefile.in (ssa.o): Add dependency on $(RTL_H), which was missing.
-
-2002-06-10 Richard Sandiford <rsandifo@redhat.com>
-
- * gcc.c (process_command): Avoid assignment to read-only location.
- Fix sizeof calculation.
-
-2002-06-10 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (struct cpp_macro): Put comments on their own lines.
- (_cpp_expansions_different_trad): New.
- * cppmacro.c (warn_of_redefinition): Fix for traditional case.
- * cpptrad.c (canonicalize_text): New.
- (scan_out_logical_line): Handle no arguments correctly.
- (save_replacement_text): Commit memory when finished.
- (_cpp_expansions_different_trad): New.
-
-2002-06-10 Tim Josling <tej@melbpc.org.au>
-
- * gengtype.c (unnamed enum containing BASE_FILE_*): Add languages
- TREELANG and COBOL.
- (lang_names): Add treelang and cobol.
- (get_file_basename): Add code to support treelang and cobol as
- 4th and 5th users of c-common.c.
-
-2002-06-09 Geoffrey Keating <geoffk@redhat.com>
-
- * Makefile.in (install-driver): Install driver as
- $(target_alias)-gcc-$(version).
- * gcc.c (spec_version): Make const.
- (process_command): Handle -V and -b by using exec.
- * doc/invoke.texi (Target Options): Restore -V option,
- update docs for -b option.
-
-2002-06-10 Tim Josling <tej@melbpc.org.au>
-
- * configure.in (remaining_languages_check):
- Added check that all languages specified were found.
- Exit if not found. Previous behaviour was silent failure.
- * configure: Regenerated.
-
-2002-06-10 Tim Josling <tej@melbpc.org.au>
-
- First steps to making treelang documentation compliant, based on
- instructions in sourcebuild.texi. Also add to gcc.c list of
- default languages.
-
- * doc/contrib.texi: Add self as contributor of treelang.
-
- * doc/frontends.texi: Add mention of treelang.
-
- * doc/invoke.texi (Overall Options): Add mention of treelang.
-
- * doc/standards.texi: Add mention of treelang.
-
-2002-06-09 Hans-Peter Nilsson <hp@axis.com>
-
- * config/cris/cris.c: Include ggc.h
-
-2002-06-09 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (_cpp_push_text_context): Update.
- (_cpp_arguments_ok): New.
- * cppmacro.c (_cpp_arguments_ok): New, split out from...
- (collect_args): ...here.
- (_cpp_push_text_context): Change inputs.
- * cpptrad.c (struct fun_macro, maybe_start_funlike, save_argument,
- replace_args_and_push): New.
- (lex_identifier, _cpp_lex_identifier_trad, scan_parameters):
- Don't use IS macros directly.
- (scan_out_logical_line): Handle function-like macro argument
- collection.
- (push_replacement_text): Update.
- (replacement_length): Remove.
- (_cpp_create_trad_definition): Don't skip whitespace before
- checking for '('.
-
-2002-06-09 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_mcu_types): Update for new devices.
- * config/avr/avr.h (TARGET_SWITCHES, AVR_MEGA): Add -mshort-calls.
- (LINK_SPEC, CRT_BINUTILS_SPECS): Update for new devices.
- * config/avr/avr.md ("type" and "length" attributes): New type
- "xcall", length 1 or 2 if AVR_MEGA. Use in all patterns that
- output a single "call" or "rcall" insn depending on device size.
- * config/avr/t-avr (MULTILIB_MATCHES): Update for new devices.
-
-2002-06-09 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/{aix43.h,aix5.1} (ASM_CPU_SPEC): Add power3
- synonym for 630. Add power4. Remove embedded processors. Use -m604
- assembler option.
- (CPP_CPU_SPEC): Add power3 and power4.
- (PROCESSOR_DEFAULT): Change to 604e.
- * config/rs6000/rs6000.h (ASM_CPU_SPEC): Similar additions.
- (CPP_CPU_SPEC): Similar additions.
- (enum process_type): Add POWER4.
- (RTX_COSTS): Add POWER4.
- (CPP_CPU_SPEC): Similar additions.
- * config/rs6000/linux64.h (PROCESSOR_DEFAULT): Define.
- (PROCESSOR_DEFAULT64): Define.
- * config/rs6000/rs6000.c (rs6000_override_options): Add power4.
- (rs6000_adjust_cost): Add 603, 604, 604e, 620, 630, Power4 to
- branch adjustment.
- (rs6000_issue_rate): Add Power4.
- * config/rs6000/rs6000.md (cpu attr): Add power4.
- (iu compare): Remove 604, 604e, 620, 630.
- Add basic Power4 scheduling information.
- (mfcr/mtcrf): Change type attribute to cr_logical.
-
-2002-06-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * gengtype.h (error_at_line): Use PARAMS, not VPARAMS. Add
- ATTRIBUTE_PRINTF_2.
- * gengtype-lex.l: Fix format specifier warning.
-
- * genautomata.c: Don't include ctype.h or limits.h. Use ISSPACE,
- not isspace.
- * gengtype-lex.l: Don't include ctype.h and use ISSPACE/ISIDNUM in
- lieu of isspace/IDchar.
- * gengtype.c: Likewise for ctype.h and ISALNUM vs isalnum.
- * read-rtl.c: Likewise for ctype.h. Don't define ISDIGIT or
- ISSPACE.
-
-2002-06-08 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (LIBCPP_OBJS): Take out version.o.
- * cpphash.h (cpp_reader): Take out print_version member.
- * cppinit.c: (cpp_handle_option): Don't do anything with
- -version. Just set help_only for --version, --target-help.
- Just set verbose option for -v.
- (cpp_post_options): Don't print a version string.
-
-2002-06-08 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (TARGET_SECTION_TYPE_FLAGS): New.
- (avr_section_type_flags): New, handle .noinit* sections.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/sh/netbsd-elf.h (SUBTARGET_EXTRA_SPECS): Define
- and include netbsd_entry_point.
- (SUBTARGET_LINK_SPEC): Define as NETBSD_LINK_SPEC_ELF.
- (NETBSD_ENTRY_POINT): Define.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/sh/sh.h (SUBTARGET_EXTRA_SPECS): Define empty
- if not already defined.
- (EXTRA_SPECS): Add SUBTARGET_EXTRA_SPECS.
-
-2002-06-08 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_regs_to_save): No need to save any registers
- in a noreturn function.
- (avr_output_function_prologue, avr_output_function_epilogue):
- Correct function size calculation. Do not crash on empty function.
- (avr_output_function_epilogue): No need for epilogue after a BARRIER.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/mips/netbsd.h (SUBTARGET_EXTRA_SPECS): Add
- netbsd_link_spec and netbsd_entry_point.
- (LINK_SPEC): Use %(netbsd_link_spec).
- (NETBSD_ENTRY_POINT): Define.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/sparc/netbsd-elf.h (LINK_ARCH32_SPEC): Only specify
- linker emulation.
- (LINK_ARCH64_SPEC): Likewise.
- (LINK_SPEC, NETBSD_ENTRY_POINT): Define.
- (SUBTARGET_EXTRA_SPECS): Add netbsd_link_spec and netbsd_entry_point.
-
-2002-06-08 Marc Espie <espie@openbsd.org>
-
- * lists.c (free_list): Fix typo in comment.
-
-2002-06-08 Andreas Jaeger <aj@suse.de>
-
- * lcm.c (optimize_mode_switching): Add unused attribute for
- variable.
-
- * sched-deps.c (sched_analyze): Remove unused variable.
-
-2002-06-08 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * diagnostic.def: Don't capitalize diagnostict descriptors.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/m68k/netbsd-elf.h (EXTRA_SPECS): Add netbsd_entry_point.
- (LINK_SPEC): Define as NETBSD_LINK_SPEC_ELF.
- (NETBSD_ENTRY_POINT): Define.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/i386/netbsd-elf.h (LINK_SPEC): Define as
- NETBSD_LINK_SPEC_ELF.
- (SUBTARGET_EXTRA_SPECS): Add netbsd_entry_point.
- (NETBSD_ENTRY_POINT): Define.
- * config/i386/netbsd64.h (LINK_SPEC): Use %(netbsd_link_spec).
- (SUBTARGET_EXTRA_SPECS): Add netbsd_link_spec and
- netbsd_entry_point.
- (NETBSD_ENTRY_POINT): Define.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/alpha/netbsd.h (SUBTARGET_EXTRA_SPECS): Add
- netbsd_link_spec and netbsd_entry_point.
- (LINK_SPEC): Use %(netbsd_link_spec).
- (NETBSD_ENTRY_POINT): Define.
-
-2002-06-08 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/netbsd-elf.h (LINK_SPEC): Rename to...
- (NETBSD_LINK_SPEC_ELF): ...this. Use %(netbsd_entry_point)
- to specify program entry point.
-
-2002-06-07 Jeff Law <law@redhat.com
-
- * emit-rtl.c (init_emit): Add hard registers to regno_reg_rtx.
- * combine.c (move_deaths): Use regno_reg_rtx for hard regs rather
- than creating a new register.
- (distribute_notes): Likewise.
- * df.c (df_reg_use_gen): Likewise.
- (df_reg_clobber_gen): Likewise.
- (df_ref_record): Likewise.
- * expr.c (use_regs): Likewise.
- * flow.c (propagate_one_insn): Likewise.
- (mark_set_1): Likewise.
- (mark_used_reg): Likewise.
- * reload.c (emit_reload_insns): Likewise.
-
-2002-06-07 Roger Sayle <roger@eyesopen.com>
-
- * simplify-rtx.c (simplify_gen_relational): Simplify RTL of the form
- (ne (comp x y) 0) into (comp x y) where comp is a comparison code.
- Simplify (eq (comp x y) 0) into (revcomp x y) if the sense of the
- comparison code comp can be reversed.
-
-2002-06-07 Roger Sayle <roger@eyesopen.com>
-
- * fold-const.c (fold) [EQ_EXPR]: Place both integer and real
- constants last in comparisons. Optimize (x+1.0)>0.0 into the
- equivalent x > -1.0 when -ffast-math.
-
-2002-06-07 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (mips*-*-netbsd*): Add mips/t-netbsd to ${tmake_file}.
- * config/mips/t-netbsd: New file.
-
-2002-06-07 Zack Weinberg <zack@codesourcery.com>
-
- * cppinit.c (COMMAND_LINE_OPTIONS): Give all relevant -W
- options their own entries.
- (parse_option): Clarify comment.
- (cpp_handle_option): Remove 'ignore' parameter and OPT_W
- special case. Replace if/strcmp chain for -W options with
- use of new OPT_* entries for them.
- (cpp_handle_options): Update to match.
- * cpplib.h: Remove last parameter to cpp_handle_option from prototype.
- * c-decl.c: Update call to cpp_handle_option.
-
-2002-06-07 Akim Demaille <akim@epita.fr>
-
- * gengtype-yacc.y (optionseqopt): Add the ending `;' to the action.
- Whitespace changes.
-
-2002-06-07 Jeffrey Law <law@redhat.com>
-
- * sched-deps.c (free_deps): Avoid calling free_INSN_LIST_list
- on empty lists.
-
-2002-06-07 H.J. Lu (hjl@gnu.org)
-
- * configure.in: Add --enable-__cxa_atexit.
- * configure: Regenerated.
- * config.in: Likewise.
-
- * defaults.h (DEFAULT_USE_CXA_ATEXIT): New. Defined to be 0 if
- not defined.
-
-2002-06-07 Gabriel Dos Reis <gdr@merlin.nerim.net>
-
- * diagnostic.c (diagnostic_build_prefix): Fix initialization.
-
-2002-06-07 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/mips/netbsd.h (CACHE_FLUSH_FUNC): Define.
-
-2002-06-07 Jason Merrill <jason@redhat.com>
-
- * cppexp.c (num_equality_op): Use a temporary variable to work
- around gcc 3.0.4 bug.
-
-2002-06-07 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * diagnostic.c (diagnostic_build_prefix): Tidy.
-
-2002-06-07 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpptrad.c (struct block, BLOCK_HEADER_LEN, BLOCK_LEN,
- scan_parameters, save_replacement_text, replacement_length): New.
- (scan_out_logical_line): Take a macro and save parameters if
- non-NULL.
- (_cpp_logical_line_trad): Update.
- (_cpp_create_trad_definition): Update to handle function-like
- macros.
- * cpplex.c (new_buff): Update.
- (struct dummy, DEFAULT_ALIGNMENT, CPP_ALIGN): Move...
- * cpphash.h: ...here.
- (CPP_ALIGN2, _cpp_save_parameter): New.
- * cppmacro.c (save_parameter): Rename, export.
- (parse_params): Update.
-
-2002-06-07 Andreas Jaeger <aj@suse.de>
-
- * config/mmix/mmix.c: Remove extra broken prototype for
- mmix_init_machine_status.
-
-2002-06-06 Geoffrey Keating <geoffk@redhat.com>
-
- * gengtype.c: Add comments before all the routines.
-
-2002-06-07 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (sh5*-*-netbsd*): Remove sh/t-netbsd-sh5-32
- from and add t-sh64 to ${tmake_file}.
- (sh64*-*-netbsd*): Add t-sh64 to ${tmake_file}.
- * config/sh/t-netbsd-sh5 (LIB1ASMFUNCS): Remove.
- * config/sh/t-netbsd-sh5-32: Remove.
- * config/sh/t-netbsd-sh5-64 (MULTILIB_OPTIONS): Use
- MULTILIB_ENDIAN.
- (MULTILIB_DIRNAMES): Define.
-
-Thu Jun 6 23:14:46 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (and promoting splitters): Disable QI to SImode promoting
- when doing so changes immediate to be 32bit.
-
- * rtl.h (emit_*_scope): Declare.
- * emit-rtl.c (emit_*_scope): New global functions.
- (try_split): Copy scope.
- * ifcvt.c (noce_try_store_flag, noce_try_store_flag_constants,
- noce_try_flag_inc, noce_try_store_flag_mask, noce_try_cmove,
- noce_try_cmove_arith, noce_try_minmax, noce_try_abs,
- noce_process_if_block, find_cond_trap): Copy scopes.
- * recog.c (peephole2_optimize): likewise.
-
-2002-06-06 Jeffrey Law <law@redhat.com>
-
- * h8300.h (OK_FOR_U): Fix thinko exposed by flag checking.
-
-Thu Jun 6 21:06:25 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * gengtype-lex.l (INITIAL): New rule for "'"("\\".|[^\\])"'".
-
-2002-06-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * Makefile.in (TEXI_GCCINSTALL_FILES): Define.
- ($(docdir)/gccinstall.info): New target.
- (info): Depend on it.
- (gccinstall.dvi): New target.
- (dvi): Depend on it.
- * doc/.cvsignore: Ignore new info files.
- * doc/install.texi (@setfilename): Reflect new info filename.
-
-Thu Jun 6 15:57:23 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.c (machine_dependent_reorg): Don't set RTX_UNCHANGING_P
- on an UNSPEC.
-
-Thu Jun 6 07:17:43 2002 Nicola Pero <n.pero@mi.flashnet.it>
-
- PR objc/6834
- * objc/objc-lang.c (LANG_HOOKS_GET_ALIAS_SET): Define to be
- c_common_get_alias_set.
- (LANG_HOOKS_SAFE_FROM_P): Define to be c_safe_from_p.
-
-2002-06-06 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * emit-rtl.c (get_first_nonnote_insn, get_last_nonnote_insn): New
- functions.
- * rtl.h (get_first_nonnote_insn, get_last_nonnote_insn): Declare.
- * avr/avr.c (avr_output_function_epilogue): Use above to determine
- function size.
- * pa/pa.c (pa_output_function_prologue): Likewise.
-
-2002-06-05 David S. Miller <davem@redhat.com>
-
- * integrate.c (subst_constants): Handle 'B' RTL format.
-
-2002-06-05 Eric Christopher <echristo@redhat.com>
-
- * varasm.c (make_decl_rtl): Fix comment for removed
- halfpic.c.
-
-2002-06-05 Eric Christopher <echristo@redhat.com>
-
- * Makefile.in: Remove missed halfpic bits.
-
-2002-06-05 Eric Christopher <echristo@redhat.com>
-
- * toplev.c: Remove half-pic.
- * config/mips/mips.c: Ditto.
- * config/mips/mips.h: Ditto. Remove unused defines.
- * config/mips/openbsd.h: Update comment to reflect above.
- * config/mips/mips.md: Remove half-pic constraints.
- * halfpic.h: Delete.
- * halfpic.c: Ditto.
-
-2002-06-05 Jeffrey Law <law@redhat.com>
-
- * pa.h (EXTRA_CONSTRAINT, T case): Further refine so that it
- rejects (mem (lo_sum (reg) (unspec))), but will allow
- (mem (lo_sum (reg) (symbol_ref)) for PA2.0.
-
-2002-06-05 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (_cpp_create_definition): Update prototype.
- (_cpp_push_text_context, _cpp_create_trad_definition): New.
- ( cpp_lex_identifier_trad): New.
- (_cpp_set_trad_context): New.
- * cppinit.c (cpp_finish_options): Don't conditionalize builtins.
- * cpplib.c (SEEN_EOL): Update.
- (lex_macro_node): Update for -traditional.
- (cpp_push_buffer, _cpp_pop_buffer): Similarly.
- * cppmacro.c (_cpp_create_definition): Split into
- create_iso_definition() and _cpp_create_trad_definition().
- (warn_of_redefinition): Update prototype; handle traditional
- macros.
- (_cpp_push_text_context): New.
- * cpptrad.c (skip_whitespace, push_replacement_text): New.
- (lex_identifier): Call ht_lookup with correct start.
- (_cpp_lex_identifier_tradm _cpp_create_trad_definition,
- _cpp_set_trad_context): New.
- (scan_out_logical_line): Update to handle changing contexts.
-
-Wed Jun 5 20:42:31 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * config.gcc (sh-*-elf*, sh64*-*-elf*): Unify.
- (shl*-*-elf*): Add.
- * config/sh/t-be (MULTILIB_ENDIAN): Set.
- * config/sh/t-le (MULTILIB_ENDIAN): Likewise.
- * t-sh (MULTILIB_ENDIAN): Set.
- (MULTILIB_OPTIONS): Use it.
- * t-sh64 (MULTILIB_OPTIONS): Likewise.
- (MULTILIB_DIRNAMES): Likewise.
-
-2002-06-05 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * toplev.h (report_error_function): Remove.
-
- * diagnostic.h (location_t): New datatype.
- (text_info): Likewise.
- (diagnostic_info): Likewise.
- (output_prefix): New macro.
- (diagnostic_last_function_changed): Likewise.
- (diagnostic_set_last_function): Likewise.
- (diagnostic_last_module_changed): Likewise.
- (diagnostic_set_last_module): Likewise.
- (report_diagnostic): Now macro.
- (diagnostic_set_info): Declare.
-
- * diagnostic.c (report_problematic_module): Rename to
- diagnostic_repor_current_module.
- (set_diagnostic_context): Remove.
- (count_error): Rename to diagnostic_error_count.
- (error_function_changed): Remove.
- (record_last_error_function): Likewise.
- (error_module_changed): Likewise.
- (record_last_error_module): Likewise.
- (context_as_prefix): Rename to diagnostic_build_prefix.
- (flush_diagnostic_buffer): Rename to diagnostic_flush_buffer.
- (diagnostic_set_info): New function.
-
- * objc/objc-act.c: #include diagnostic.h
- (error_with_ivar): Adjust call to count_error.
- (warn_with_method): Likewise.
- * objc/Make-lang.in (objc-act.o): Depend on diagnostic.h
-
-2002-06-05 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.c (xtensa_build_va_list): Use
- lang_hooks.types.make_type instead of make_node; set up
- __va_list_tag type decl.
- (xtensa_builtin_saveregs): Remove broken use of
- RTX_UNCHANGING_P and unnecessary use of MEM_IN_STRUCT_P
- for saved registers; add varargs alias set.
-
-2002-06-05 Neil Booth <neil@daikokuya.demon.co.uk>
-
-config:
- * alpha/gnu.h: Undef TARGET_OS_CPP_BUILTINS.
- * i386/beos-elf.h: Use TARGET_OS_CPP_BUILTINS rather than
- CPP_PREDEFINES and part of CPP_SPEC.
- i386/freebsd-aout.h, i386/gas.h, i386/gnu.h, i386/linux-aout.h,
- i386/linux.h, i386/moss.h, i386/xm-vsta.h: Similarly.
-
-Wed Jun 5 15:20:58 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * reg-stack.c (reg_to_stack): Do not call find_basic_blocks.
-
-2002-06-05 Alan Modra <amodra@bigpond.net.au>
-
- * config/rs6000/linux64.h (ASM_OUTPUT_SOURCE_LINE): Define.
-
-2002-06-04 Zack Weinberg <zack@codesourcery.com>
-
- * gengtype-yacc.y: Make sure all rules end with a semicolon.
-
-2002-06-04 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.c (xtensa_init_machine_status): Fix
- typo in function prototype and include "ggc.h" header.
-
-2002-06-04 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (mode_mask_operand): Simplify without ifdefs.
- (print_operand) ['U']: Likewise.
- (alpha_expand_unaligned_store): Correct constants for 32-bit cross.
- (alpha_expand_unaligned_store_words): Likewise.
- (alpha_expand_builtin_vector_binop): Fix typo.
- (enum alpha_builtin, code_for_builtin): Add remaining ext, ins, msk,
- umulh, and cix insns.
- (one_arg_builtins): Add cix builtins.
- (two_arg_builtins): Add ext, ins, msk, umulh builtins.
- (alpha_expand_builtin): Fix typo in arity.
- * config/alpha/alpha.md (UNSPEC_CTLZ, UNSPEC_CTPOP): New.
- (builtin_extbl, builtin_extwl, builtin_extll, builtin_extwh,
- builtin_extlh, builtin_insbl, builtin_inswl, builtin_insll,
- builtin_insql, builtin_inswh, builtin_inslh, builtin_insqh,
- builtin_mskbl, builtin_mskwl, builtin_mskll, builtin_mskql,
- builtin_mskwh, builtin_msklh, builtin_mskqh, builtin_cttz,
- builtin_ctlz, builtin_ctpop): New.
- * doc/extend.texi (Alpha Built-in Functions): Update.
-
-2002-06-04 Geoffrey Keating <geoffk@redhat.com>
-
- * gengtype.c (write_gc_root): Don't unnecessarily prevent
- global variable-length arrays being roots.
-
- * config.gcc (powerpc-*-darwin*): Set config_gtfiles.
- * configure.in (config_gtfiles): New variable.
- (all_gtfiles): Initialise from config_gtfiles.
- * configure: Regenerate.
-
-2002-06-04 Neil Booth <neil@daikokuya.demon.co.uk>
-
-config/i386:
- * beos-elf.h, cygwin.h, djgpp.h, gas.h, gnu.h, i386-interix.h,
- i386-interix3.h, i386elf.h, linux-aout.h, linux.h, linux64.h,
- mingw32.h, netbsd-elf.h, netbsd.h, netbsd64.h, rtemself.h,
- sco5.h, sol2.h, sysv3.h, sysv4.h, sysv5.h, uwin.h, vxi386.h,
- win32.h (CPP_SPEC): Remove cpp_cpu.
- * i386.h (TARGET_CPU_CPP_BUILTINS): Use.
- (CPP_CPU_DEFAULT_SPEC, CPP_CPU_SPEC): Die!
-
-2002-06-04 Janis Johnson <janis187@us.ibm.com>
-
- * config/ia64/ia64.c (gen_thread_pointer): Fix variable name.
-
-2002-06-04 Jeff Law <law@redhat.com.
- David Edelsohn <edelsohn@gnu.org>
- Michael Matz <matz@kde.org>
-
- * sched-int.h (struct deps): New field libcall_block_tail_insn.
- * sched_deps.c (init_deps): Initialize libcall_block_tail_insn.
- * sched_deps.c (sched_analyze_insn): If libcall_block_tail_insn
- is set, then mark the current insn as being part of a libcall
- scheduling group.
- (sched_analyze): Set and clear libcall_block_tail_insn appropriately.
-
- * haifa-sched.c (schedule_block): Do not count USE or CLOBBER
- insns against the issue rate.
-
-Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfglayout.c (duplicate_insn_chain): Kill NOTE_INSN_RANGE notes.
- * final.c (final_scan_insn): Likewise.
- * ggc-common.c (ggc_mark_rtx_children_1): Likewise; use
- NOTE_EXPECTED_VALUE instead of NOTE_RANGE.
- * haifa-sched.c (unlink_other_notes): Likeewise.
- (reemit_notes): Likewise.
- * print-rtl.c (print_rtx): Likewise.
- * sched-deps (sched-analyze): Likewise.
- * rtl.c (note_insn_name): Likewise.
- * rtl.h (NOTE_RANGE_INFO, NOTE_LIVE_INFO): Kill.
- (enum insn_note): Kill NOTE_INSN_RANGE_*, NOTE_INSN_LIVE.
- (RANGE_*): Kill.
-
-2002-06-04 Jason Thorpe <thorpej@wasabisystems.com>
-
- * varasm.c (mark_constants): Handle RTX format 'B'.
-
-2002-06-04 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (FIRST, LAST, CUR, RLIMIT): New.
- (struct cpp_context): Add traditional fields.
- * cppmacro.c (paste_all_tokens, push_ptoken_context,
- push_token_context, cpp_get_token, _cpp_backup_tokens): Update.
- * cpptrad.c (skip_comment, lex_identifier,
- _cpp_read_logical_line_trad, scan_out_logical_line): Update.
-
-2002-06-04 Kazu Hirata <kazu@cs.umass.edu>
-
- * gbl-ctors.h: Fix formatting.
- * gcc.c: Likewise.
- * gccspec.c: Likewise.
- * gcov.c: Likewise.
- * gcov-io.h: Likewise.
- * gcse.c: Likewise.
- * ggc-common.c: Likewise.
- * ggc.h: Likewise.
- * ggc-page.c: Likewise.
- * ggc-simple.c: Likewise.
- * global.c: Likewise.
- * graph.h: Likewise.
- * gthr-dce.h: Likewise.
- * gthr.h: Likewise.
- * gthr-posix.h: Likewise.
- * gthr-rtems.h: Likewise.
- * gthr-solaris.h: Likewise.
- * gthr-win32.h: Likewise.
-
-2002-06-03 Geoffrey Keating <geoffk@redhat.com>
-
- Merge from pch-branch:
-
- * gengtype.h (UNION_OR_STRUCT_P): New macro.
- * gengtype.c (write_gc_structure_fields): Use it.
- (write_gc_root): Use it here too.
-
- * gengtype.c (write_gc_structure_fields): Assume that lengths
- of typenames fit into an 'int'; don't pass a size_t to "%d" in
- printf.
- (write_gc_marker_routine_for_structure): Likewise.
- (write_gc_types): Likewise.
- (write_gc_root): Likewise.
-
- * varray.h (VARRAY_CLEAR): New.
- (varray_clear): Prototype.
- * varray.c (varray_clear): New.
- * cselib.c (reg_values_old): New.
- (used_regs_old): New.
- (cselib_init): Use cached varrays if available to avoid
- generating large amounts of garbage.
- (cselib_finish): Don't throw away old varrays.
-
- * final.c (insn_addresses_): Move out of ifdef.
-
- * varray.c (uses_ggc): Make more varray kinds GCable.
- * varray.h (union varray_data_tag): Let gengtype see
- fields 'generic' and 'te'.
- * reg-stack.c: Include gt-reg-stack.h, ggc.h.
- (stack_regs_mentioned_data): Move out of ifdef; mark with gengtype.
- (reg_to_stack): Don't call VARRAY_FREE.
- * insn-addr.h (INSN_ADDRESSES_FREE): Don't use VARRAY_FREE.
- (insn_addresses_): Use gengtype to mark.
- * gengtype.c (write_gc_structure_fields): Handle arrays of generic
- pointers; handle generic pointers in unused union fields.
- (get_output_file_with_visibility): Include cselib.h,
- insn-addr.h in gtype-desc.c.
- * function.c (prologue): Use gengtype to mark.
- (epilogue): Likewise.
- (sibcall_epilogue): Likewise.
- * dependence.c: Include gt-dependence.h, ggc.h.
- (struct def_use): Use gengtype to mark.
- (struct loop): Likewise.
- (struct induction): Likewise.
- (struct dependence): Likewise.
- (def_use_chain): Likewise.
- (dep_chain): Likewise.
- (loop_chain): Likewise.
- (induction_chain): Likewise.
- (init_dependence_analysis): Don't free anything, just clear pointers.
- (build_def_use): Use GGC to allocate def_use.
- (add_loop): Use GGC to allocate loop.
- (find_induction_variable): Use GGC to allocate induction.
- (check_node_dependence): Use GGC to allocate induction, dependence.
- (dump_node_dependence): Don't free varrays.
- (end_dependence_analysis): Likewise.
- * cselib.h (struct cselib_val_struct): Use gengtype to mark.
- (struct elt_loc_list): Likewise.
- (struct elt_list): Likewise.
- * cselib.c: Don't include obstack.h.
- (hash_table): Use gengtype to mark.
- (reg_values): Use gengtype to mark.
- (used_regs): Use gengtype to mark.
- (cselib_obstack): Delete.
- (cselib_startobj): Delete.
- (empty_vals): Mark as deletable.
- (empty_elt_lists): Mark as deletable.
- (empty_elt_loc_lists): Mark as deletable.
- (new_elt_list): Use GGC to allocate struct elt_list.
- (new_elt_loc_list): Use GGC to allocate struct elt_loc_list.
- (clear_table): Don't delete obstack; don't unnecessarily clear
- deletable variables.
- (new_cselib_val): Use GGC to allocate struct cselib_val.
- (cselib_init): Don't set up obstacks. Use GGC to allocate
- hash table.
- (cselib_finish): Just clear variables, don't free anything.
- * Makefile.in (cselib.o): Remove dependency on $(OBSTACK_H).
- (reg-stack.o): Add dependency on gt-reg-stack.h, $(GGC_H).
- (dependence.o): Add dependency on gt-dependence.h, $(GGC_H).
- (GTFILES): Add insn-addr.h, cselib.h, dependence.c, reg-stack.c.
- (gt-reg-stack.h): New rule.
- (gt-dependence.h): New rule.
- (gtype-desc.o): Add cselib.h, insn-addr.h.
-
- * varray.c: Use only necessary headers.
- (element_size): New.
- (uses_ggc): New.
- (varray_init): Take type, not size. Use GGC if appropriate.
- (varray_grow): Update for change to struct varray_head_tag.
- Use GGC if appropriate.
- * varray.h (struct const_equiv_data): Use gengtype.
- (enum varray_data_enum): New.
- (union varray_data_tag): Use gengtype.
- (struct varray_head_tag): Use gengtype. Replace size field with
- enum varray_data_enum.
- (varray_init): Update prototype.
- (VARRAY_SCHED_INIT): Delete.
- (VARRAY_*_INIT): Update for change to varray_init.
- (VARRAY_SCHED): Delete.
- (VARRAY_PUSH_SCHED): Delete.
- (VARRAY_TOP_SCHED): Delete.
- * tree.h: Update for change to length specifier.
- * tree-inline.c (optimize_inline_calls): Don't use VARRAY_FREE.
- (clone_body): Likewise.
- * ssa.h (ssa_definition): Use gengtype to mark.
- * ssa.c (convert_from_ssa): Don't use VARRAY_FREE.
- * ssa-dce.c (ssa_eliminate_dead_code): Don't use VARRAY_FREE.
- * rtl.h (struct rtvec_def): Update for change to length specifier.
- * integrate.c (expand_inline_function): Don't use VARRAY_FREE.
- (struct initial_value_struct): Update for change to length specifier.
- * ggc.h (ggc_add_rtx_varray_root): Delete prototype.
- (ggc_add_tree_varray_root): Delete prototype.
- (ggc_mark_rtx_varray): Delete prototype.
- (ggc_mark_tree_varray): Delete prototype.
- * ggc-common.c (ggc_add_rtx_varray_root): Delete.
- (ggc_add_tree_varray_root): Delete.
- (ggc_mark_rtx_varray): Delete.
- (ggc_mark_tree_varray): Delete.
- (ggc_mark_rtx_varray_ptr): Delete.
- (ggc_mark_tree_varray_ptr): Delete.
- * gengtype.h (enum typekind): Remove TYPE_VARRAY.
- (create_varray): Delete prototype.
- * gengtype.c (varrays): Delete.
- (create_varray): Delete.
- (adjust_field_type): Detect array of string pointers.
- (process_gc_options): Remove code to handle varray_type option.
- (set_gc_used_type): Remove TYPE_VARRAY case.
- (output_escaped_param): New.
- (write_gc_structure_fields): Use output_escaped_param on all
- parameters. Handle 'skip' with 'use_param' option. Handle
- arrays of strings. Remove TYPE_VARRAY handling.
- (write_gc_roots): Use boolean to detect 'length' option.
- * gengtype-yacc.y (VARRAY_TYPE): Delete token.
- (struct_fields): Call adjust_field_type on array fields.
- (type): Remove VARRAY_TYPE case.
- (type_option): Likewise.
- * gengtype-lex.l: Don't consider varray_type a keyword.
- * function.h: Update for change to length specifier.
- (free_eh_status): Delete prototype.
- * function.c (free_after_compilation): Don't call free_eh_status.
- (reorder_blocks): Don't use VARRAY_FREE.
- * except.c (struct eh_status): Update for change to length specifier.
- remove varray_type specifier.
- (free_eh_status): Delete.
- * dwarf2out.c: Include gt-dwarf2out.h.
- (used_rtx_varray): Use gengtype to mark, move
- outside ifdefs.
- (incomplete_types): Likewise.
- (decl_scope_table): Likewise.
- (dwarf2out_init): Don't call ggc_add_tree_varray_root.
- * cfglayout.c (scope_to_insns_finalize): Don't use VARRAY_FREE.
- * c-tree.h (struct lang_type): Update for change to length specifier.
- * c-parse.in (yylexstring): Don't use VARRAY_FREE.
- * c-objc-common.c: Include gt-c-objc-common.h.
- (deferred_fns): Mark for gengtype.
- (c_objc_common_init): Don't call ggc_add_tree_varray_root.
- (expand_deferred_fns): Just set deferred_fns to 0 to free it.
- * Makefile.in (c-objc-common.o): Add gt-c-objc-common.h.
- (gtype-desc.o): Update dependencies.
- (dwarf2out.o): Add gt-dwarf2out.h.
- (varray.o): Update dependencies.
- (GTFILES): Add varray.h, ssa.h, dwarf2out.c, c-objc-common.c.
- (gt-c-objc-common.h): New rule.
- (gt-dwarf2out.h): New rule.
- * objc/objc-act.c (build_objc_string_object): Don't use VARRAY_FREE.
-
- * doc/gty.texi (GTY Options): Correct spelling.
- (GGC Roots): Likewise.
- * Makefile.in (TEXI_CPP_FILES): New.
- (TEXI_GCC_FILES): New.
- (TEXI_GCCINT_FILES): New.
- (TEXI_CPPINT_FILES): New.
- ($(docdir)/cpp.info): Use new macros.
- ($(docdir)/gcc.info): Likewise.
- ($(docdir)/gccint.info): Likewise.
- ($(docdir)/cppinternals.info): Likewise.
- (cpp.dvi): Likewise.
- (gcc.dvi): Likewise.
- (gccint.dvi): Likewise.
- (cppinternals.dvi): Likewise.
-
- * Makefile.in ($(docdir)/gccint.info): Depend on gty.texi.
- * doc/gccint.texi (Top): Include gty.texi.
- * doc/gty.texi: New file.
-
- * bitmap.c: Include ggc.h, gt-bitmap.h.
- (bitmap_ggc_free): New.
- (bitmap_elem_to_freelist): New.
- (bitmap_element_free): Use bitmap_elem_to_freelist.
- (bitmap_element_allocate): Allow use of GGC.
- (bitmap_clear): Use bitmap_elem_to_freelist.
- (bitmap_copy): Update for change to bitmap_element_allocate.
- (bitmap_set_bit): Likewise.
- (bitmap_operation): Update for changes elsewhere.
- (bitmap_initialize): Allow to create bitmaps that will use GGC.
- * bitmap.h (struct bitmap_element_def): Use gengtype.
- (struct bitmap_head_def): Likewise. Also add 'using_obstack' field.
- (bitmap_initialize): Add extra parameter.
- (BITMAP_OBSTACK_ALLOC): Update for change to bitmap_initialize.
- (BITMAP_ALLOCA): Delete.
- (BITMAP_XMALLOC): Update for change to bitmap_initialize.
- (BITMAP_GGC_ALLOC): New.
- * Makefile.in (gtype-desc.o): Add bitmap.h.
- (bitmap.o): Add gt-bitmap.h, $(GGC_H).
- (GTFILES): Add bitmap.c.
- (gt-bitmap.h): New rule.
- ($(HOST_PREFIX_1)bitmap.o): Add gt-bitmap.h.
- * basic-block.h: Update for changes to bitmap_initialize.
- * except.c (exception_handler_label_map): Move into...
- (struct eh_status): Here.
- (struct eh_region): Make 'aka' GCable.
- (free_eh_status): Don't need to specially handle
- exception_handler_label_map.
- (add_ehl_entry): Update for changes to exception_handler_label_map.
- (find_exception_handler_labels): Likewise.
- (remove_exception_handler_label): Likewise.
- (maybe_remove_eh_handler): Likewise.
- (for_each_eh_label): Likewise.
- (remove_eh_handler): Allocate 'aka' using GGC.
- * gengtype.c (get_output_file_with_visibility): Add bitmap.h
- to list of includes.
-
- * gengtype.c (write_gc_marker_routine_for_structure): Name
- the routines 'gt_ggc_mx_*' instead of 'gt_ggc_m_*'.
- (write_gc_types): Arrange for the tests with NULL to be inlined.
- (write_gc_roots): Update uses of procedure pointers.
- * ggc-common.c (gt_ggc_mx_rtx_def): Rename from gt_ggc_m_rtx_def.
-
- * Makefile.in (explow.o): Add dependency on gt-explow.h.
- (sdbout.o): Add dependency on gt-sdbout.h.
-
- * emit-rtl.c (const_int_htab): Use gengtype to clear unused entries.
- (mem_attrs_htab): Likewise.
- (init_emit_once): Don't call ggc_add_deletable_htab.
- * fold-const.c (size_htab): Use gengtype to clear unused entries.
- (size_int_type_wide): Don't call ggc_add_deletable_htab.
- * gengtype.c (finish_root_table): Add LASTNAME and TNAME
- parameters, use them, change callers.
- (write_gc_root): Add IF_MARKED parameter, use it, change callers.
- (write_gc_roots): Handle 'if_marked' option.
- (main): Don't need to call set_gc_used_type any more.
- * ggc.h (ggc_htab_marked_p): Delete.
- (ggc_htab_mark): Delete.
- (struct ggc_cache_tab): New.
- (gt_ggc_cache_rtab): New declaration.
- * ggc-common.c (struct d_htab_root): Delete.
- (d_htab_roots): Delete.
- (ggc_add_deletable_htab): Delete.
- (ggc_htab_delete): Handle new htab-deleting mechanism.
- (ggc_mark_roots): Use new htab-deleting mechanism.
- * tree.c (type_hash_table): Use gengtype to clear unused entries.
- Make static.
- (init_obstacks): Don't call ggc_add_deletable_htab.
-
- * objc/objc-act.h (struct hashed_attribute): Use gengtype.
- (struct hashed_entry): Likewise.
- (nst_method_hash_list): Likewise.
- (cls_method_hash_list): Likewise.
- (HASH_ALLOC_LIST_SIZE): Delete.
- (ATTR_ALLOC_LIST_SIZE): Delete.
- * objc/objc-act.c (hash_init): Use ggc to allocate
- nst_method_hash_list, cls_method_hash_list.
- (hash_enter): Use ggc to allocate; allocate one entry at a time.
- (hash_add_attr): Likewise.
- (ggc_mark_hash_table): Delete.
- (objc_act_parse_init): Delete.
- (objc_init): Delete reference to objc_act_parse_init.
- * tlink.c: Replace hash.h with hashtab.h. Explicitly include
- obstack.h. Replace references to 'struct hash_table' with htab_t.
- (struct symbol_hash_entry): Replace hash header with key field.
- (struct file_hash_entry): Replace hash header with key field.
- (struct demangled_hash_entry): Replace hash header with key field.
- (hash_string_eq): New.
- (hash_string_hash): New.
- (symbol_hash_newfunc): Delete.
- (symbol_hash_lookup): Modify to use htab_t.
- (file_hash_newfunc): Delete.
- (file_hash_lookup): Modify to use htab_t.
- (demangled_hash_newfunc): Delete.
- (demangled_hash_lookup): Modify to use htab_t.
- (tlink_init): Modify to use htab_t.
- * hash.h: Delete.
- * hash.c: Delete.
- * ggc.h: Delete forward structure declarations.
- Delete prototypes for deleted functions.
- * ggc-common.c: Don't include hash.h.
- (ggc_add_tree_hash_table_root): Delete.
- (ggc_mark_tree_hash_table_entry): Delete.
- (ggc_mark_tree_hash_table): Delete.
- (ggc_mark_tree_hash_table_ptr): Delete.
- * gengtype.c (write_gc_structure_fields): Allow param_is option.
- (write_gc_marker_routine_for_structure): Use visibility of
- the parameter if there is one.
- * function.c: Replace hash.h with hashtab.h. Replace references
- to 'struct hash_table *' with htab_t.
- (struct insns_for_mem_entry): Include a plain key.
- (fixup_var_refs_insns_with_hash): Update to use htab_t.
- (insns_for_mem_newfunc): Delete.
- (insns_for_mem_hash): Update to use htab_t.
- (insns_for_mem_comp): Likewise.
- (insns_for_mem_walk): Likewise.
- * c-lang.c: Include ggc.h.
- * Makefile.in (OBJS): Remove hash.o.
- (c-lang.o): Add GGC_H.
- (COLLECT2_OBJS): Remove hash.o.
- (tlink.o): Remove hash.h, add HASHTAB_H and OBSTACK_H.
- (ggc-common.o): Remove hash.h.
- (function.o): Remove hash.h, add HASHTAB_H.
- (genautomata.o): Remove hash.h, add HASHTAB_H.
-
- * varasm.c (mark_const_str_htab_1): Delete.
- (mark_const_str_htab): Delete.
- (const_str_htab_del): Delete.
- (const_str_htab): Use gengtype to mark.
- (init_varasm_once): Use gengtype to mark hashtables. Use GC to
- allocate them.
- * tree.c (mark_tree_hashtable_entry): Delete.
- (mark_tree_hashtable): Delete.
- * tree.h (mark_tree_hashtable): Delete prototype.
- * ggc.h (ggc_test_and_set_mark): Treat (void *)1 like NULL.
- (ggc_mark): Likewise.
- (ggc_calloc): New.
- (htab_create_ggc): New.
- * ggc-common.c (ggc_calloc): New.
- * gengtype.h (enum typekind): Add TYPE_PARAM_STRUCT.
- (struct type): Add param_struct structure.
- * gengtype.c (param_structs): New.
- (adjust_field_type): Handle param_is option.
- (set_gc_used_type): Handle TYPE_PARAM_STRUCT.
- (get_output_file_with_visibility): Include hashtab.h in gtype-desc.c.
- (write_gc_structure_fields): Add new PARAM parameter. Update
- callers. Handle use_param option. Handle TYPE_PARAM_STRUCT.
- (write_gc_marker_routine_for_structure): Add new PARAM parameter.
- Use it to generate function name. Update callers.
- (write_gc_types): Add new PARAM_STRUCTS parameter. Update callers.
- Process them.
- (write_gc_roots): Handle TYPE_PARAM_STRUCT. Allow param_is
- option.
- (main): Define PTR as pointer-to-scalar. Don't specially
- mark deferred_string or ehl_map_entry.
- * gengtype-yacc.y (PARAM_IS): Add new token.
- (externstatic): Use adjust_field_type.
- (type_option): Add PARAM_IS.
- * gengtype-lex.l: Add rule for typedef of function pointers.
- Add rule for PARAM_IS.
- (IWORD): Add size_t.
- * except.c (exception_handler_label_map): Use gengtype to mark.
- (type_to_runtime_map): Likewise.
- (mark_ehl_map_entry): Delete.
- (mark_ehl_map): Delete.
- (init_eh): Use gengtype for roots; use GC to allocate hash tables.
- (t2r_mark_1): Delete.
- (t2r_mark): Delete.
- * Makefile.in (gtype-desc.o): Correct dependencies.
- (GTFILES): Add hashtab.h.
- (genautomata.o): Actually uses hashtab.h.
-
- * Makefile.in (stringpool.o): Add $(GGC_H).
- (dwarf2asm.o): Likewise.
- (GTFILES): Add hashtable.h.
- * c-common.h (struct c_common_identifier): Use gengtype.
- * c-decl.h (c_mark_tree): Delete.
- * c-lang.c (LANG_HOOKS_MARK_TREE): Delete.
- * c-tree.h (struct lang_identifier): Use gengtype.
- (union lang_tree_node): New.
- (c_mark_tree): Delete prototype.
- * dwarf2out.c [!DWARF2_DEBUGGING_INFO]: Define dummy
- dwarf2_debug_hooks.
- * gengtype-lex.l (IWORD): Allow 'bool'.
- (ptr_alias): Match.
- * gengtype-yacc.y (ALIAS): New token.
- (type_option): New rule.
- (option): Use type_option.
- * gengtype.c (process_gc_options): New.
- (set_gc_used_type): Use it.
- (write_gc_structure_fields): Add 'bitmap' parameter, change callers.
- Add new variable 't' to hold the type of the field being processed.
- Add more error checking. Use UNION_P when looking at 'desc' option.
- Handle language-specific structures containing other
- language-specific structures.
- (write_gc_types): Handle 'ptr_alias' option.
- (main): Don't need to specially output lang_type, lang_decl, lang_id2.
- * ggc-common.c (ggc_pending_trees): Delete.
- (ggc_mark_roots): Don't manipulate ggc_pending_trees.
- (ggc_mark_trees): Delete.
- (gt_ggc_m_tree_node): Delete.
- * ggc.h (ggc_pending_trees): Delete.
- (ggc_mark_tree): Make alias of gt_ggc_m_tree_node.
- * hashtable.h (ht_identifier): Use gengtype.
- * langhooks-def.h (LANG_HOOKS_MARK_TREE): Delete.
- * langhooks.h (struct lang_hooks): Delete mark_tree.
- * sdbout.c [! SDB_DEBUGGING_INFO]: Define dummy sdb_debug_hooks
- anyway.
- * system.h: Poison LANG_HOOKS_MARK_TREE.
- * tree.c (tree_node_structure): New.
- * tree.h (struct tree_common): Use gengtype.
- (struct tree_int_cst): Likewise.
- (struct tree_real_cst): Likewise.
- (struct tree_string): Likewise.
- (struct tree_complex): Likewise.
- (struct tree_vector): Likewise.
- (struct tree_identifier): Likewise.
- (struct tree_list): Likewise.
- (struct tree_vec): Likewise.
- (struct tree_exp): Likewise.
- (struct tree_block): Likewise.
- (struct tree_type): Likewise.
- (struct tree_decl): Likewise.
- (enum tree_structure_enum): New.
- (union tree_node): Use gengtype, with an alias.
- (tree_node_structure): Prototype.
- * objc/objc-lang.c (LANG_HOOKS_MARK_TREE): Delete.
-
- Merge to tag pch-merge-20020430. The LANG_HOOKS_FUNCTION_MARK
- macro was deleted. The LANG_HOOKS_FUNCTION_FREE macro was renamed
- to LANG_HOOKS_FUNCTION_FINAL.
- * Makefile.in (GTFILES): Add bitmap.h.
- * except.c (struct eh_region): Mark field 'aka' to be skipped.
-
- * config/alpha/alpha.c [TARGET_ABI_UNICOSMK]
- (alpha_init_machine_status): Give proper type.
- * Makefile.in (c-lang.o): Depend on gtype-c.h.
- (optabs.o): Depend on gt-optabs.h.
- (GTFILES): Add optabs.o.
- (gt-optabs.h): Add rule.
- * optabs.c: Include gt-optabs.h.
-
- * gengtype.c (set_gc_used_type): Correct some errors in last change.
- (write_gc_structure_fields): If a field which should be NULL is
- not, abort.
- * c-pragma.c: Move struct align_stack and variable alignment_stack
- out from the ifdef.
-
- * config/xtensa/t-xtensa: Add dependencies for gt-xtensa.h.
- * config/xtensa/xtensa.c: Include gt-cris.h.
- (struct machine_function): Use gengtype to mark.
- * config/mmix/mmix.h (struct machine_function): Use gengtype
- to mark.
- * config/cris/t-cris: Add dependencies for gt-cris.h.
- * config/cris/cris.c: Include gt-cris.h.
- (struct machine_function): Use gengtype to mark.
- * config/rs6000/rs6000.h (struct machine_function): Use gengtype
- to mark.
- * doc/tm.texi (Per-Function Data): Delete references to
- mark_machine_status.
- * config/ia64/ia64.c (ia64_override_options): Don't set
- mark_machine_status.
- * config/i386/i386.c (override_options): Likewise.
- * config/d30v/d30v.c (d30v_init_expanders): Likewise.
- * config/arm/arm.c (arm_init_expanders): Likewise.
- * config/alpha/alpha.c (override_options): Likewise.
- * gengtype.h (enum gc_used_enum): Add GC_MAYBE_POINTED_TO.
- * gengtype.c (set_gc_used_type): Handle 'maybe_null' option.
- (write_gc_structure_fields): Don't handle 'really' option.
- Handle 'maybe_null' option.
- (write_gc_types): Handle 'maybe_null' option.
- * function.h (struct function): Don't use "really".
- (mark_machine_status): Delete declaration.
- (mark_lang_status): Delete declaration.
- (gt_ggc_mr_machine_function): Delete prototype.
- (gt_ggc_mr_language_function): Delete prototype.
- * function.c (mark_machine_status): Delete.
- (mark_lang_status): Delete.
- (gt_ggc_mr_machine_function): Delete.
- (gt_ggc_mr_language_function): Delete.
- * c-tree.h (mark_c_function_context): Delete prototype.
- * c-objc-common.c (c_objc_common_init): Don't set mark_lang_status.
- * c-decl.c (struct language_function): Rename from struct
- c_language_function. Update uses. Use gengtype to mark.
- (mark_c_function_context): Delete.
- * c-common.h (struct c_language_function): Rename from struct
- language_function.
- (mark_stmt_tree): Delete prototype.
- (c_mark_lang_decl): Delete prototype.
- (mark_c_language_function): Delete prototype.
- * c-common.c (mark_stmt_tree): Delete.
- (c_mark_lang_decl): Delete.
- (mark_c_language_function): Delete.
-
- * gengtype.h (enum typekind): Add TYPE_LANG_STRUCT.
- (lang_bitmap): New typedef. Use where appropriate.
- (struct type): Add gc_used field, lang_struct field.
- (UNION_P): New macro.
- (new_structure): New prototype.
- (find_structure): Remove 'pos' parameter. Change all callers.
- * gengtype-lex.l: Update for changes to find_structure.
- * gengtype-yacc.y (typedef_struct): Use new_structure.
- (yacc_ids): Suppress warning.
- (type): Use new_structure.
- * gengtype.c (string_type): Update for changes to struct type.
- (find_structure): Just find a structure, don't worry about
- creating one.
- (new_structure): New.
- (note_yacc_type): Use new_structure.
- (set_gc_used_type): New.
- (set_gc_used): New.
- (write_gc_structure_fields): Allow for pointers to TYPE_LANG_STRUCT.
- (write_gc_types): Handle TYPE_LANG_STRUCT.
- (write_gc_marker_routine_for_structure): New.
- (main): Call set_gc_used. Add some calls to set_gc_used_type
- for places where GCC doesn't use gengtype properly yet.
- * ggc.h (gt_ggc_m_rtx_def): Don't prototype.
- (gt_ggc_m_tree_node): Likewise.
-
- * varasm.c (copy_constant): Call expand_constant if we hit
- something we can't recognise.
-
- * ggc-common.c (ggc_mark_rtvec_children): Delete.
- (ggc_mark_rtx_children): Use generic name for ggc_mark_rtvec.
- (lang_mark_false_label_stack): Delete.
- * rtl.h (struct rtvec_def): Use gengtype to mark.
- * ggc.h (ggc_mark_rtvec): Delete.
- (gt_ggc_m_rtvec_def): Delete.
- (ggc_mark_nonnull_tree): Delete.
- (ggc_mark_rtvec_children): Delete prototype.
- (lang_mark_false_label_stack): Delete declaration.
-
- * gengtype.h (note_yacc_type): Add prototype.
- * gengtype.c (note_yacc_type): New function.
- * gengtype-lex.l: Add lexer support for yacc files.
- * gengtype-yacc.y (start): Extract union from yacc files.
- (yacc_union): New rule.
- (yacc_typematch): New rule.
- (yacc_ids): New rule.
- (enum_items): Tweak for efficiency.
- (optionseq): Likewise.
-
- * c-common.h (struct language_function): Use gengtype.
- (struct c_lang_decl): Likewise.
- * c-tree.h (struct lang_decl): Likewise.
- (struct lang_type): Likewise.
- * c-decl.c (lang_mark_tree): Use generated marker routines to mark
- tree language substructures.
-
- * stringpool.c (mark_ident): Replace ggc_mark_nonnull_tree with
- ggc_mark_tree.
- * dwarf2asm.c (mark_indirect_pool_entry): Likewise.
-
- * varasm.c (struct rtx_const): Remove 'skip' tags for scalar arrays.
-
- * stmt.c (struct nesting): Add discriminator. Use gengtype to
- mark. Remove 'data.block.cleanup_ptr' field.
- (struct stmt_status): Use usual technique to mark struct nesting.
- (gt_ggc_mr_nesting_cond): Delete.
- (gt_ggc_mr_nesting_loop): Delete.
- (gt_ggc_mr_nesting_block): Delete.
- (gt_ggc_mr_nesting_case_stmt): Delete.
- (expand_start_cond): Set discriminator.
- (expand_start_loop): Likewise.
- (expand_start_null_loop): Likewise.
- (expand_start_bindings_and_block): Set discriminator. Don't set
- deleted fields.
- (expand_decl_cleanup): Replace 'cleanup_ptr' with
- &thisblock->data.block.cleanups.
- (expand_start_case): Set discriminator.
- (expand_start_case_dummy): Set discriminator.
-
- * ggc-callbacks.c: Remove.
-
- * gengtype.h (struct type): Add 'u.s.bitmap' field.
- (find_structure): Add 'pos' parameter.
- * gengtype-lex.l: Update callers to find_structure.
- * gengtype-yacc.y: Likewise.
- * gengtype.c (find_structure): Allow for structures to be defined
- in multiple language backends.
- (get_output_file_with_visibility): Include debug.h in gtype-desc.c.
- (counter): Rename to gc_counter.
- (write_gc_structure_fields): Fail when writing out fields for
- an incomplete structure. Ignore arrays of scalars. Handle
- 'tree_vec' special.
- (write_gc_types): Reset counter for each procedure written.
-
- * stmt.c (add_case_node): Use GGC to allocate struct case_node.
- (free_case_nodes): Delete.
- (expand_end_case_type): Delete call to free_case_nodes.
-
- * Makefile.in (cselib.o): Include gt-<filename>.h.
- (gcse.o): Likewise.
- (profile.o): Likewise.
- (alias.o): Likewise.
- (GTFILES): Add alias.c, cselib.c, gcse.c, profile.c, and
- alphabetize backend files.
- (gt-alias.h, gt-cselib.h, gt-gcse.h, gt-profile.h): New rules.
- * alias.c: Use gengtype for roots.
- * c-common.h (struct stmt_tree_s): Use gengtype.
- * c-decl.c: Use gengtype for roots.
- * cselib.c: Use gengtype for roots.
- * expr.c: Use gengtype for roots.
- * fold-const.c: Use gengtype for roots.
- * gcse.c: Use gengtype for roots.
- * gengtype-lex.l: Handle typedefs of function types.
- Allow for empty array bounds.
- Allow processing to stop on initialisers.
- * gengtype-yacc.y (externstatic): Stop processing on initialisers.
- (semiequal): New rule.
- * gengtype.c (create_file): Tidy output files.
- (get_output_file_with_visibility): Fix paren warning. Fix bug
- involving multiple input files mapping to one output file.
- (write_gc_structure_fields): Skip arrays of scalars.
- (write_gc_types): Tidy output files.
- (write_gc_root): New function.
- (write_gc_roots): Fix bugs, add support for roots that are
- structures.
- * ggc-common.c (ggc_mark_rtx_ptr): Delete.
- (ggc_mark_tree_ptr): Delete.
- (ggc_add_rtx_root): Delete.
- (ggc_add_tree_root): Delete.
- (ggc_del_root): Delete.
- * integrate.c (get_func_hard_reg_initial_val): Use ggc_alloc to
- allocate struct initial_value_struct.
- * profile.c: Use gengtype for roots.
- * sdbout.c: Use gengtype for roots.
- * varasm.c (mark_weak_decls): Delete unused prototype.
- (mark_const_hash_entry): Delete unused function.
- * config/darwin-protos.h: Use gengtype for roots.
- (machopic_add_gc_roots): Delete.
- * config/arm/arm.c: Use gengtype for roots.
- * config/arm/arm.h: Use gengtype for roots.
- * config/c4x/c4x-protos.h: Use gengtype for roots.
- * config/c4x/c4x.c (c4x_add_gc_roots): Delete.
- * config/d30v/d30v-protos.h: Use gengtype for roots.
- * config/d30v/d30v.c (d30v_add_gc_roots): Delete.
- * config/dsp16xx/dsp16xx.c (override_options): Use gengtype for roots.
- * config/dsp16xx/dsp16xx.h: Use gengtype for roots.
- * config/ia64/ia64-protos.h: Use gengtype for roots.
- * config/ia64/ia64.c (ia64_add_gc_roots): Delete.
- * config/m68hc11/m68hc11-protos.h: Use gengtype for roots.
- * config/m68hc11/m68hc11.c (z_reg): Make global.
- (z_reg_qi): Make global.
- (m68hc11_add_gc_roots): Delete.
- * config/mcore/mcore-protos.h: Use gengtype for roots.
- * config/mcore/mcore.c (mcore_add_gc_roots): Delete.
- * config/mips/mips.c (mips_add_gc_roots): Delete.
- * config/mips/mips.h: Use gengtype for roots.
- * config/mmix/mmix.c (override_options): Use gengtype for roots.
- * config/mmix/mmix.h: Use gengtype for roots.
- * config/mn10200/mn10200.c (asm_file_start): Use gengtype for roots.
- * config/mn10200/mn10200.h: Use gengtype for roots.
- * config/pa/pa.c: Use gengtype for roots, marking.
- (struct deferred_plabel): Use GGC, gengtype.
- (pa_add_gc_roots): Delete.
- (mark_deferred_plabels): Delete.
- * config/pj/pj-protos.h: Use gengtype for roots.
- * config/pj/pj.h (OVERRIDE_OPTIONS): Don't define.
- * config/rs6000/rs6000.c: Use gengtype for roots. Don't call
- machopic_add_gc_roots.
- * config/rs6000/rs6000.h: Use gengtype for roots.
- * config/rs6000/t-darwin (darwin.o): Add dependency on gt-darwin.h.
- (gt-darwin.h): Add rule.
- * config/sh/sh.c: Use gengtype for roots.
- * config/sh/t-sh ($(out_object_file)): Add dependency on gt-sh.h.
- (gt-sh.h): Add rule.
- * config/sparc/sparc.c: Use gengtype for roots.
- (sparc_add_gc_roots): Delete.
- (struct ultrasparc_pipeline_state): Use GGC, gengtype.
- (mark_ultrasparc_pipeline_state): Delete.
- * config/sparc/sparc.h: Use gengtype for roots.
-
- * Makefile.in (c-parse.o): Update dependencies.
- (c-common.o): Likewise.
- (GTFILES): Add c-common.h, c-tree.h, c-common.c, c-parse.in.
- Add dependencies for the files they generate.
- * c-common.c: Replace ggc_add_* uses with GTY annotations.
- * c-common.h: Likewise.
- * c-decl.c: Likewise.
- (gt_ggc_mp_binding_level): Delete.
- * c-lang.c: Include gtype-c.h.
- * c-parse.in: Replace ggc_add_* uses with GTY annotations. Include
- gt-c-parse.h.
- * c-pragma.h: Replace ggc_add_* uses with GTY annotations.
- (gt_ggc_mp_align_stack): Delete.
- * c-tree.h: Replace ggc_add_* uses with GTY annotations.
- * function.c: Replace ggc_add_* uses with GTY annotations.
- (gt_ggc_mp_function): Delete.
- * function.h: Replace ggc_add_* uses with GTY annotations.
- * gengtype.c (lang_names): New.
- (NUM_BASE_FILES): New.
- (open_base_files): Create language base files.
- (startswith): New.
- (get_file_basename): New.
- (get_base_file_bitmap): New.
- (get_output_file_with_visibility): Rename from get_output_file.
- Add more mappings for various C/Objc filenames.
- (finish_root_table): New.
- (write_gc_roots): Handle dependencies and scoping properly.
- * gengtype.h: Add prototypes for new functions.
- * ggc-common.c (struct deletable_root): Delete.
- (deletables): Delete.
- (ggc_add_deletable_root): Delete.
- (ggc_mark_roots): No need to deal with deleted functionality.
- * ggc.h (ggc_add_deletable_root): Delete prototype.
- * objc/Make-lang.in (objc-act.o): Add gtype-objc.h dependency.
- (gtype-objc.h): Add rule to create.
- * objc/config-lang.in (gtfiles): New.
- * objc/objc-act.c: Allocate imp_list using GGC. Replace uses of
- ggc_add_* with GTY markers. Include gtype-objc.h.
- (ggc_mark_imp_list): Delete.
- * objc/objc-act.h: Replace uses of ggc_add_* with GTY markers.
- * objc/objc-lang.c: Random Whitespace Change.
-
- * except.h (exception_handler_labels): Delete.
- (get_exception_handler_labels): New.
- * except.c (exception_handler_labels): Delete.
- (struct eh_status): Add exception_handler_labels field.
- (doing_eh): Don't add exception_handler_labels as root.
- (free_eh_status): Don't need to free exception_handler_labels.
- (get_exception_handler_labels): New.
- (find_exception_handler_labels): Update for move of
- exception_handler_labels.
- (remove_exception_handler_label): Likewise.
- * cfgrtl.c (can_delete_label_p): Use get_exception_handler_labels.
- * jump.c (rebuild_jump_labels): Likewise.
- * loop.c (find_and_verify_loops): Likewise.
- * sched-rgn.c (is_cfg_nonregular): Likewise.
-
- * gengtype.c (write_gc_structure_fields): Handle variable-length
- TYPE_ARRAYs.
-
- * varasm.c (struct weak_syms): Use GGC, gengtype.
- (mark_weak_decls): Delete.
- (weak_decls): Likewise.
- (add_weak): Likewise.
- (remove_from_pending_weak_list): Likewise.
- (init_varasm_once): Likewise.
-
- * Makefile.in (gtype-desc.o): Add libfuncs.h dependency.
- (GTFILES): Add tree.h, libfuncs.h, emit-rtl.c, explow.c,
- stor-layout.c, regclass.c, and lists.c.
- Add dependencies of gt-emit-rtl.h gt-explow.h gt-stor-layout.h
- gt-regclass.h and gt-lists.h on s-gtype.
- * emit-rtl.c: Use gengtype for roots. Include gt-emit-rtl.h.
- * except.c: Use gengtype for roots.
- * explow.c: Use gengtype for roots. Include gt-explow.h.
- * expr.h (init_stor_layout_once): Delete prototype.
- * function.c: Use gengtype for roots.
- * gengtype-lex.l: Add ENT_EXTERNSTATIC lexing.
- * gengtype-yacc.y (start): Can also be an externstatic.
- (externstatic): New production.
- (struct_fields): Correct array bounds inversion for 2-d arrays.
- * gengtype.c (variables): New variable.
- (note_variable): New function.
- (get_output_file): Include libfuncs.h into gtype-desc.c.
- (get_output_file_name): New function.
- (write_gc_structure_fields): Suppress warnings.
- (write_gc_types): Make static.
- (put_mangled_filename): New function.
- (write_gc_roots): New function.
- (main): Call write_gc_roots.
- * gengtype.h (note_variable): Prototype.
- (get_output_file_name): Prototype.
- (write_gc_types): Delete prototype.
- * ggc.h: Clean up unnecessary structure predefinitions.
- (struct ggc_root_tab): Define.
- (gt_ggc_m_rtx_def): Make function, not macro.
- (gt_ggc_m_tree_node): Likewise.
- * libfuncs.h: Use gengtype for roots.
- * lists.c: Use gengtype for roots. Include gt-lists.h.
- (init_EXPR_INSN_LIST_cache): Delete.
- * optabs.c: Use gengtype for roots.
- (gt_ggc_mp_optab): Delete.
- * optabs.h: Use gengtype for roots.
- * regclass.c: Use gengtype for roots. Include gt-regclass.h.
- * rtl.h: Use gengtype for roots.
- (init_EXPR_INSN_LIST_cache): Delete prototype.
- * stor-layout.c: Use gengtype for roots.
- Include gt-stor-layout.h.
- (init_stor_layout_once): Delete.
- * toplev.c: Use gengtype for roots. Delete calls to deleted
- routines.
- * tree.c: Use gengtype for roots.
- * tree.h: Use gengtype for roots.
- * varasm.c: Use gengtype for roots.
-
- * Makefile.in (GTFILES): Add @all_gtfiles@.
- * configure: Regenerate.
- * configure.in: Construct all_gtfiles from the gtfiles definitions
- in config-lang.in.
- * gengtype-yacc.y (type): Warn about duplicate structure names.
- * gengtype.c (get_output_file): Handle .c files in language
- subdirectories.
-
- * Makefile.in (GTFILES): Run gengtype on all the config files
- and on the target .c file.
- * except.c (mark_eh_region): Delete.
- (init_eh_for_function): Use GGC on struct eh_status.
- (mark_eh_status): Delete.
- (free_eh_status): Use GGC.
- (expand_eh_region_start): Use GGC to
- (collect_eh_region_array): Allocate last_region_number using GGC.
- (duplicate_eh_region_1): Use GGC to allocate struct eh_region.
- (remove_eh_handler): Let GGC free struct eh_region.
- (add_call_site): Use GGC to reallocate call_site_record array.
- * function.c (init_machine_status): Update calling sequence.
- (mark_machine_status): Likewise.
- (mark_lang_status): Likewise.
- (prepare_function_start): Update init_machine_status call.
- (mark_function_status): Delete.
- (maybe_mark_struct_function): Delete.
- (ggc_mark_struct_function): Delete.
- (gt_ggc_mp_function): New.
- (gt_ggc_mr_machine_function): New.
- (gt_ggc_mr_language_function): New.
- (init_function_once): Use canonical names.
- * function.h (struct function): Use gengtype.
- (init_machine_status): Return the structure.
- (mark_machine_status): Take a 'void *'.
- (mark_lang_status): Likewise.
- * ggc-common.c (ggc_mark_trees): Use canonical name for
- ggc_mark_struct_function.
- * tree.h (ggc_mark_struct_function): Delete prototype.
- * config/alpha/alpha.c (alpha_mark_machine_status): Delete.
- (alpha_init_machine_status): Likewise.
- (override_options): Use canonical name for alpha_mark_machine_status.
- * config/alpha/unicosmk.h (struct machine_function): Use gengtype.
- * config/arm/arm.h (struct machine_function): Use gengtype.
- * config/arm/arm.c (arm_mark_machine_status): Delete.
- (arm_init_machine_status): Update calling sequence.
- (arm_init_expanders): Use canonical name for arm_mark_machine_status.
- * config/cris/cris.c (cris_init_machine_status): Update
- calling sequence.
- * config/d30v/d30v.h (struct machine_function): Use gengtype.
- * config/d30v/d30v.c (d30v_init_machine_status): Update
- calling sequence.
- (d30v_mark_machine_status): Delete.
- * config/i386/i386.c: Include gt-i386.h.
- (struct machine_function): Use gengtype.
- (ix86_init_machine_status): Update calling sequence.
- (ix86_mark_machine_status): Delete.
- (override_options): Use canonical namke for ix86_mark_machine_status.
- * config/ia64/ia64.h (struct machine_function): Use gengtype.
- * config/ia64/ia64.c (ia64_init_machine_status): Update calling
- sequence.
- (ia64_mark_machine_status): Delete.
- (ia64_override_options): Use canonical name for
- ia64_mark_machine_status.
- * config/mmix/mmix.c (mmix_init_machine_status): Update calling
- sequence.
- * config/rs6000/rs6000.c (rs6000_init_machine_status): Likewise.
- * config/xtensa/xtensa.c (xtensa_init_machine_status): Likewise.
- * gengtype.c (get_output_file): Fix warning.
- (main): Add prototype to suppress warning.
- * tree.c: Remove tree_hash_mark prototype.
-
- * tree.h (init_stmt): Delete prototype.
- * toplev.c (lang_independent_init): Don't call init_stmt.
- * stmt.c (ALLOC_NESTING): Use GGC for 'struct nesting'.
- (stmt_obstack): Delete.
- (POPSTACK): No need to free 'struct nesting'.
- (gt_ggc_mr_nesting_cond): Use canonical names.
- (gt_ggc_mr_nesting_loop): Use canonical names.
- (gt_ggc_mr_nesting_block): Use canonical names.
- (gt_ggc_mr_nesting_case_stmt): Use canonical names.
- (mark_stmt_status): Delete.
- (init_stmt): Delete.
- (clear_last_expr): Clear both last_expr_type and last_expr_value.
- Use it everywhere that last_expr_type was cleared.
- * lists.c (init_EXPR_INSN_LIST_cache): Use ggc_add_deletable_root.
- (zap_lists): Delete.
- * ggc.h (ggc_add_deletable_root): Prototype.
- (mark_stmt_status): Remove prototype.
- * ggc-common.c (ggc_add_deletable_root): New.
- (ggc_mark_roots): Handle deletable roots.
- * function.c (ggc_mark_struct_function): Use canonical name
- for mark_stmt_status.
- * emit-rtl.c (free_sequence_stack): New.
- (start_sequence): Use a freelist for sequences.
- (end_sequence): Likewise.
- (init_emit_once): Add free_sequence_stack as a deleteable root.
- * c-pragma.c Include gt-c-pragma.h.
- (struct align_stack): Use gengtype.
- (push_alignment): Use GGC for struct align_stack.
- (mark_align_stack): Delete.
- (gt_ggc_mp_align_stack): New.
- (init_pragma): Use canonical name for mark_align_stack.
- * c-decl.c: Include gt-c-decl.h.
- (struct binding_level): Use gengtype.
- (make_binding_level): Use GGC; handle the freelist here.
- (pop_binding_level): New.
- (pushlevel): Move code into make_binding_level.
- (push_label_level): Likewise.
- (poplevel): Move code into pop_binding_level.
- (pop_label_level): Likewise.
- (mark_binding_level): Delete.
- (gt_ggc_mp_binding_level): New.
- (c_init_decl_processing): Use canonical name for mark_binding_level.
- Add free_binding_level as deletable root.
- (mark_c_function_context): Use canonical name for mark_binding_level.
- * Makefile.in (c-decl.o): Add gt-c-decl.h.
- (c-pragma.o): Add gt-c-pragma.h.
- (GTFILES): Add c-decl.c and c-pragma.c.
- (gt-c-decl.h, gt-c-pragma.h): Create using gengtype.
-
- * tree.c (struct type_hash): Use gengtype.
- (init_obstacks): Use canonical name for type_hash_mark.
- (type_hash_mark): Delete.
- Include gt-tree.h.
- * rtl.h (struct mem_attrs): Use gengtype.
- * optabs.h (struct optab): Use gengtype.
- * optabs.c (expand_binop): Squish signed/unsigned warning.
- (mark_optab): Make local, use canonical name, use autogenerated
- marker procedure.
- (init_optabs): Use canonical name for mark_optab.
- (new_optab): Use GGC to allocate optabs.
- * ggc.h: Delete mark_optab prototype.
- * ggc-common.c (ggc_mark_rtx_children): Use canonical name for
- mem_attrs marker procedure.
- * gengtype.c (get_output_file): Include headers in gtype-desc.c
- explicitly rather than deducing them from file names.
- (write_gc_structure_fields): Handle arrays of structures.
- (main): Return non-zero exit code if errors occur during output.
- * emit-rtl.c (mem_attrs_mark): Delete.
- (init_emit_once): Use canonical name for mem_attrs marker procedure.
- * Makefile.in (gtype-desc.o): Explicitly name dependencies.
- (tree.o): Depend on gt-tree.h.
- (GTFILES): Add rtl.h, optabs.h, tree.c.
- (gt-tree.h): Add it to s-gtype rule.
-
- * .cvsignore: Ignore gengtype flex/bison generated files.
- * Makefile.in (GGC_H): Add gtype-desc.h.
- (OBJS): Add gtype-desc.o.
- (GEN): Add gengtype.
- (STAGESTUFF): Add gengtype.
- (varasm.o): Add gt-varasm.h.
- (stmt.o): Add gt-stmt.h.
- (except.o): Add gt-except.h.
- (integrate.o): Add gt-integrate.h.
- (GTFILES): New.
- Add new rules for new files.
- * configure: Regenerate.
- * configure.in: Correct defaults.h paths.
- * emit-rtl.c (mark_sequence_stack): Delete.
- (mark_emit_status): Delete.
- (start_sequence): Allocate sequence structures using GGC.
- (end_sequence): Allocate sequence structures using GGC.
- * except.c: Use gengtype for various structures. Include
- gt-except.h.
- * expr.c (mark_expr_status): Delete.
- * function.c: Use gengtype for various structures. Include
- gt-function.h.
- (mark_function_status): Use standard gt_ggc names for marker functions.
- (ggc_mark_struct_function): Likewise.
- * function.h: Use gengtype for various structures.
- * gengtype-lex.l: New file.
- * gengtype-yacc.y: New file.
- * gengtype.c: New file.
- * gengtype.h: New file.
- * ggc.h: Include gtype-desc.h. Alias some marker procedures to
- the standard names. Remove some now-unnecessary prototypes.
- * integrate.c: Use gengtype for various structures. Include
- gt-integrate.h.
- (mark_hard_reg_initial_vals): Delete.
- * integrate.h (mark_hard_reg_initial_vals): Delete.
- * stmt.c: Use gengtype for various structures. Include
- gt-stmt.h.
- (mark_case_node): Delete.
- (mark_goto_fixup): Delete.
- (mark_stmt_status): Use standard gt_ggc names for marker functions.
- * system.h: Define GTY to empty. In flex/bison files,
- don't poison malloc or realloc, instead just define them to
- xmalloc and xrealloc.
- * varasm.c: Use gengtype for various structures. Include
- gt-varasm.h. Use standard gt_ggc names for marker functions.
- (mark_pool_constant): Delete.
- (mark_varasm_status): Delete.
- (decode_rtx_const): #if 0 out non-typesafe hack.
-
- * function.h (free_lang_status): Mark as obsolete.
- * function.c (free_lang_status): Mark as obsolete.
- * c-decl.c (push_c_function_context): Use GC to allocate and free
- struct language_function.
- (pop_c_function_context): Likewise.
- * c-common.c (mark_c_language_function): Mark struct
- language_function.
-
- * doc/tm.texi (Per-Function Data): Don't document free_machine_status.
- Document that the machine_function structures must be allocated
- using GC. Update mark_machine_status documentation.
- * function.h: Don't declare free_machine_status.
- * function.c (free_machine_status): Don't define.
- (free_after_compilation): Don't call free_machine_status.
- (ggc_mark_struct_function): Mark f->machine. Call
- mark_machine_status only on non-NULL pointers.
- * system.h: Poison free_machine_status.
- * config/xtensa/xtensa.c (xtensa_init_machine_status): Use GC on
- struct machine_function.
- (xtensa_free_machine_status): Delete.
- (override_options): Don't set free_machine_status.
- * config/rs6000/rs6000.c (rs6000_override_options): Don't set
- free_machine_status.
- (rs6000_init_machine_status): Use GC on struct machine_function.
- (rs6000_free_machine_status): Delete.
- * config/ia64/ia64.c (ia64_init_machine_status): Use GC on struct
- machine_function.
- (ia64_mark_machine_status): Likewise.
- (ia64_free_machine_status): Delete.
- (ia64_override_options): Don't set free_machine_status.
- * config/i386/i386.c (override_options): Don't set
- free_machine_status.
- (ix86_init_machine_status): Use GC on struct machine_function.
- (ix86_mark_machine_status): Likewise.
- (ix86_free_machine_status): Delete.
- * config/d30v/d30v.c: (d30v_init_machine_status): Use GC on struct
- machine_function.
- (d30v_mark_machine_status): Likewise.
- (d30v_free_machine_status): Delete.
- (d30v_init_expanders): Don't set free_machine_status.
- * config/arm/arm.c (arm_mark_machine_status): Use GC on struct
- machine_function.
- (arm_init_machine_status): Likewise.
- (arm_free_machine_status): Delete.
- (arm_init_expanders): Don't set free_machine_status.
- * config/alpha/alpha.c (override_options): Don't set
- free_machine_status.
- (alpha_init_machine_status): Use GC on struct machine_function.
- (alpha_mark_machine_status): Likewise.
- (alpha_free_machine_status): Delete.
-
- * varasm.c (compare_constant): Fix typo.
-
- * varasm.c: Don't include obstack.h.
- (struct varasm_status): x_const_rtx_hash_table is a hash of rtxes.
- (struct rtx_const): Give substructures names, improve formatting.
- (struct constant_descriptor): Delete.
- (struct constant_descriptor_tree): New, based on constant_descriptor.
- (const_hash_table): Is a hash table of trees.
- (mark_const_hash_entry): Is used for hashes of trees. Mark
- constant_descriptor_tree structure.
- (mark_const_str_htab_1): Mark deferred_string structure.
- (compare_constant): Rewrite to compare trees.
- (compare_constant_1): Delete.
- (record_constant): Delete.
- (record_constant_1): Delete.
- (output_constant_def): Use struct constant_descriptor_tree.
- Don't duplicate trees twice.
- (struct constant_descriptor_rtx): New.
- (struct pool_constant): Used for rtx constants.
- (init_varasm_status): Update for change to struct varasm_status.
- (mark_varasm_status): Likewise.
- (free_varasm_status): Delete.
- (compare_constant_rtx): Rewrite to handle constant_descriptor_rtx.
- (record_constant_rtx): Likewise.
- (mem_for_const_double): Update to use struct constant_descriptor_rtx.
- (force_const_mem): Likewise.
- * Makefile.in (varasm.o): Doesn't depend on obstack.h.
- * function.c (free_after_compilation): Don't use free_varasm_status.
- * function.h: Don't prototype free_varasm_status.
-
- * ggc-common.c (ggc_realloc): Handle X being NULL.
-
- * ggc-common.c (ggc_realloc): New function.
- * ggc.h: Prototype it.
- * emit-rtl.c (free_emit_status): Delete.
- (init_emit): Allocate emit subarrays using GC.
- (gen_reg_rtx): Reallocate subarrays using GC.
- (init_emit): Use GC to allocate 'struct emit_status' and its
- subarrays.
- (mark_emit_status): Mark structure and its subarrays.
- * stmt.c (free_stmt_status): Delete.
- * expr.c (free_expr_status): Delete.
- * function.h: Remove prototypes for deleted functions.
- * function.c (free_after_compilation): Don't use deleted functions.
- Don't call free() on x_parm_reg_stack_loc.
- (free_after_parsing): Don't use free_stmt_status.
- (assign_parms): Use GC to allocate and resize x_parm_reg_stack_loc.
- (mark_function_status): Mark x_parm_reg_stack_loc.
-
- * varasm.c (init_varasm_status): Use GC to allocate
- 'struct varasm_status' and its fields x_const_rtx_hash_table
- and x_const_rtx_sym_hash_table.
- (mark_varasm_status): Mark them.
- (free_varasm_status): Use GC to free them.
- * expr.c (init_expr): Use GC to allocate 'struct expr_status'.
- (mark_expr_status): Mark the structure itself.
- (free_expr_status): Use GC to free the structure.
- * stmt.c (free_stmt_status): Use GC to free 'struct stmt_status'.
- (mark_stmt_status): Mark the 'struct stmt_status' itself.
- (init_stmt_for_function): Allocate the structure for GC.
-
- * dwarf2out.c (lookup_type_die): Use TYPE_SYMTAB_DIE.
- (equate_type_number_to_die): Likewise.
- * tree.h (TYPE_SYMTAB_DIE): New macro.
- (struct die_struct): Predeclare.
- (struct tree_type): Add field symtab.die. Add a tag
- to the union type of field symtab.
-
- * varray.h (VARRAY_RTVEC_INIT): A varray of rtvec contains
- 'struct rtvec_def *', not 'struct rtvec_def'.
-
- * function.h (original_arg_vector): Make a real rtvec.
- * function.c (ggc_mark_struct_function): Adjust.
- * integrate.c (expand_inline_function): Adjust.
-
-2002-06-04 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (sh5-*-netbsd*, sh5l*-*-netbsd*)
- (sh64-*-netbsd*, sh64l*-*-netbsd*): New targets.
- * config/sh/netbsd-elf.h (TARGET_VERSION_ENDIAN)
- (TARGET_VERSION_CPU): Define according to the
- default target.
- (TARGET_VERSION): Use TARGET_VERSION_ENDIAN and
- TARGET_VERSION_CPU.
- (TARGET_OS_CPP_BUILTINS): Use NETBSD_OS_CPP_BUILTINS_LP64
- if TARGET_SHMEDIA64.
- (LINK_DEFAULT_CPU_EMUL): Define according to the
- default target.
- (SUBTARGET_LINK_EMUL_SUFFIX): Define.
- (SUBTARGET_LINK_SPEC): Define.
- (LINK_SPEC): Use SH_LINK_SPEC.
- (ASM_SPEC): Remove.
- (TARGET_DEFAULT): Use TARGET_CPU_DEFAULT.
- (FUNCTION_PROFILER): Add cases for TARGET_SHMEDIA32
- and TARGET_SHMEDIA64 which abort, for now.
- * config/sh/t-netbsd-sh5: New file.
- * config/sh/t-netbsd-sh5-32: New file.
- * config/sh/t-netbsd-sh5-64: New file.
-
-2002-06-03 Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
- Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (reg_or_const_int_operand): New.
- (some_operand, input_operand): Accept CONST_VECTOR.
- (alpha_extra_constraint): Add 'W'.
- (alpha_expand_zap_mask): New.
- (alpha_expand_builtin_vector_binop): New.
- (enum alpha_builtin): New.
- (zero_arg_builtins, one_arg_builtins, two_arg_builtins): New.
- (alpha_init_builtins, alpha_expand_builtin): New.
- (TARGET_INIT_BUILTINS, TARGET_EXPAND_BUILTIN): New.
- * config/alpha/alpha.h (VECTOR_MODE_SUPPORTED_P): New.
- (PREDICATE_CODES): Update.
- * config/alpha/alpha-protos.h: Update.
- * config/alpha/alpha.md (UNSPEC_CMPBGE, UNSPEC_ZAP,
- UNSPEC_AMASK, UNSPEC_IMPLVER, UNSPEC_PERR, UNSPECV_RPCC): New.
- (movv8qi, movv8qi_fix, movv8qi_nofix): New.
- (movv4hi, movv4hi_fix, movv4hi_nofix): New.
- (movv2si, movv2si_fix, movv2si_nofix): New.
- (uminv8qi3, sminv8qi3, uminv4hi3, sminv4hi3): New.
- (umaxv8qi3, smaxv8qi3, umaxv4hi3, smaxv4hi3): New.
- (builtin_cmpbge, builtin_extql, builtin_extqh, builtin_zap,
- builtin_zap_1, builtin_zapnot, builtin_zapnot_1, builtin_amask,
- builtin_implver, builtin_rpcc, builtin_minub8, builtin_minsb8,
- builtin_minuw4, builtin_minsw4, builtin_maxub8, builtin_maxsb8,
- builtin_maxuw4, builtin_maxsw4, builtin_perr, builtin_pklb,
- pklb, builtin_pkwb, pkwb, builtin_unpkbl, unpkbl,
- builtin_unpkbw, unpkbw): New.
- * doc/extend.texi (Alpha Built-in Functions): New.
-
-2002-06-03 Richard Henderson <rth@redhat.com>
-
- * crtstuff.c (__EH_FRAME_BEGIN__): Conditionalize on
- USE_EH_FRAME_REGISTRY, not EH_FRAME_SECTION_NAME.
-
-2002-06-03 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha-protos.h: Eliminate unneeded ifdefs.
-
- * config/alpha/alpha.c (reg_or_0_operand): Use CONST0_RTX.
- (const0_operand): New.
- (reg_or_fp0_operand, fp0_operand): Remove.
- * config/alpha/alpha.h (PREDICATE_CODES): Update.
- * config/alpha/alpha-protos.h: Update.
- * config/alpha/alpha.md: Replace all uses of reg_or_fp0_operand
- and fp0_operand with reg_or_0_operand and const0_operand.
-
-2002-06-03 Dan Nicolaescu <dann@godzilla.ics.uci.edu>
-
- * alias.c (nonoverlapping_memrefs_p): Fix off by one error.
-
-2002-06-03 Roger Sayle <roger@eyesopen.com>
-
- * gcse.c (cprop_jump): Use single_set to get the pattern
- from the setcc argument.
-
-2002-06-03 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * diagnostic.h (diagnostic_count): Move from output_buffer to
- diagnostic_context.
- (diagnostic_kind_count): Adjust definition.
-
-Mon Jun 3 19:11:53 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * except.c (except.c): Do not rebuild CFG.
- * toplev.c (rest_of_compilation): Recompute CFG after sibcall
- optimization.
-
-Mon Jun 3 11:53:01 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * integrate.c (copy_insn_list): Properly pace the INSN_SCOPE copies.
- * toplev.c: Include cfglahout.h
- * Makefile.in (toplev.c): Add dependnecy.
-
-2002-06-03 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * config/i386/i386.h (TARGET_CPU_CPP_BUILTINS): New.
- (CPP_CPU32_SPEC, CPP_CPU64_SPEC): Kill.
- (CPP_CPUCOMMON_SPEC): Rename CPP_CPU_SPEC.
-
-2002-06-03 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/ns32k/netbsd.h: Update copyright years.
- (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES): Remove.
- * config/ns32k/ns32k.h (CPP_PREDEFINES): Remove.
- (TARGET_CPU_CPP_BUILTINS): Define.
-
-2002-06-02 Kazu Hirata <kazu@cs.umass.edu>
-
- * emit-rtl.c: Fix formatting.
- * errors.h: Likewise.
- * except.c: Likewise.
- * explow.c: Likewise.
- * expmed.c: Likewise.
- * expr.c: Likewise.
- * expr.h: Likewise.
-
-2002-06-02 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/elf.h: Fix formatting.
- * config/h8300/rtems.h: Likewise.
-
-2002-06-03 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/rs6000/netbsd.h (DRAFT_V4_STRUCT_RET): Remove.
-
-2002-06-02 Tom Tromey <tromey@redhat.com>
-
- * fixinc/fixincl.x: Rebuilt.
- * fixinc/inclhack.def (thread_keyword): Match `*__thread'.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
-config/i370:
- * i370.h (TARGET_CPU_CPP_BUILTINS): Use.
- * linux.h: Use TARGET_OS_CPP_BUILTINS rather than CPP_PREDEFINES.
- * mvs.h: Similarly.
- * oe.h: Similarly.
-
-Mon Jun 3 00:18:20 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * final.c (final): Allow notes to not have computed addresses;
- kill no longer needed STACK_REGS ifdef.
-
-2002-06-02 Richard Henderson <rth@redhat.com>
-
- * gcse.c (bypass_conditional_jumps): Fix typo last change.
-
-Sun Jun 2 23:02:11 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * loop.c (emit_prefetch_instructions): Properly place the address
- computation.
-
-Sun Jun 2 22:56:48 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (basic_block_for_insn, BLOCK_FOR_INSN): Kill.
- (set_block_for_insn): Turn into macro.
- * cfgbuild.c (find_basic_block): Do not clear basic_block_for_insn.
- * cfglayout.c (insn_scopes): Kill.
- (scope_to_insns_initialize): Do not use insn_scopes.
- (scope_to_insns_finalize): Likewise.
- (duplicate_insn_chain): Likewise.
- (cfg_layout_initialize, cfg_layout_finalize): Do not turn scopes to notes.
- * cfgrtl.c (basic_block_for_insn): Kill.
- (delete_insn_and_edges, delete_insn_chain_and_edges): Simplify.
- (create_basic_block_structure): Use reorder_insns.
- (compute_bb_for_insn): Do not use basic_block_for_insn.
- (merge_blocks_nomove): Likewise.
- (update_bb_for_insn): Likewise.
- (verify_flow_info): Likewise.
- (set_block_for_insn): Kill.
- * combine.c (try_combine): Update gen_rtx_INSN call.
- * emit-rtl.c (gen_label_rtx): Update gen_rtx_CODE_LABEL call.
- (mark_insn_raw, make_jump_insn_raw, make_call_insn_raw): Clear
- scopes and BBs.
- (add_insn_after, add_insn_before, remove_insn, reorder_insns): Simplify.
- (emit_note_before, emit_note_after, emit_line_note_after, emit_note):
- Clear BB.
- (emit_insns_after): Simplify.
- (emit_copy_of_insn_after): Copy scope.
- * final.c (final_start_function): Lower scopes.
- * flow.c (check_function_return_warnings): Do not rely on deleted insn.
- * integrate.c (copy_insn_list): Cope scopes.
- * jump.c (duplicate_loop_exit_test): LIkewise; simplify.
- * loop.c (loop_optimize): Do not care block notes.
- * print-rtl.c (print_rtx): Print BB.
- * recog.c (apply_change_group): Simplify.
- * rtl.c (copy_rtx): Handle 'B'.
- * rtl.def (INSN, CALL_INSN, JUMP_INSN, NOTE): Add extra fields.
- * rtl.h (Field accessors): Update indexes.
- * sched-ebb.c (schedule_ebbs): Do not lower notes.
- * sched-rgn.c (schedule_insns): Likewise.
- * toplev.c (rest_of_compilation): Lower notes.
- * unroll.c (unroll_loop): Do not care scoping notes.
- (copy_loop_body): Copy scopes.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
-config/h8300:
- * elf.h: Use TARGET_OS_CPP_BUILTINS rather than
- SUBTARGET_SPEC.
- * rtems.h: Similarly.
- * h8300.h (CPP_PREDEFINES, CPP_SPEC, SUBTARGET_CPP_SPEC,
- EXTRA_SPECS, SUBTARGET_EXTRA_SPECS): Remove.
- (TARGET_CPU_CPP_BUILTINS): Use.
-
-2002-06-02 Richard Henderson <rth@redhat.com>
-
- * alias.c: Include target.h.
- (mark_constant_function): Use targetm.binds_local_p instead
- of checking TREE_PUBLIC ourselves.
- * Makefile.in (alias.o): Add TARGET_H.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-lex.c: Update copyright and file description.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * config/fr30/fr30.h: Update to new CPP macros.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * config/dsp16xx/dsp16xx.h: Update to new CPP macros.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
- Zack Weinberg <zack@codesourcery.com>
-
- * c-common.c (c_common_init): Override cpplib's default
- warn_long_long setting.
- * c-lex.c (lex_number): Replace with interpret_integer,
- interpret_float, narrowest_unsigned_type and
- narrowest_signed_type, taking advantage of the new
- cpplib functionality.
- * cpperror.c (_cpp_begin_message): If a warning is turned
- into an error, avoid printing "warning:".
- * cppexp.c (cpp_num_sign_extend): New.
- * cppinit.c: Update comment.
- * cpplib.h (cpp_num_sign_extend): New.
- * tree.h: Update comment.
-
-2002-06-02 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * diagnostic.h (struct diagnostic_context): Add new member
- internal_error.
- (internal_error_function): Remove declaration.
- * diagnostic.c (internal_error_function): Remove definition..
- (internal_error): Adjust use.
-
-2002-06-02 Richard Henderson <rth@redhat.com>
-
- * rtl.h (CC0_P): New.
- * gcse.c (cprop_jump): Use it with single_set. Tweak dump text.
- (cprop_insn): Allow any mode register; use CC0_P. CSE out single_set.
- (bypass_block): Save old dest block for dump text.
- (bypass_conditional_jumps): Allow any mode register; use CC0_P.
- Allow only true SET insns, not single_set.
-
-2002-06-02 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * diagnostic.c (diagnostic_finish): Rename to output_flush.
- (clear_disgnostic_info): Rename to output_clear_data. Use false
- instead of 0 for boolean value.
- Adjust function call throughout.
-
-Sun Jun 2 19:15:27 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgrtl.c (commit_one_edge_insertion): Fix warning.
- * gcse.c (bypass_conditional_jumps): CSE out single_set call.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * d30v.h (CPP_PREDEFINES): Replace with
- (TARGET_CPU_CPP_BUILTINS): New.
-
-2002-06-02 Roger Sayle <roger@eyesopen.com>
-
- * config/alpha/alpha.h [ASM_OUTPUT_LABELREF]: Fix typo.
-
-Sun Jun 2 12:11:52 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * gcse.c (bypass_conditional_jumps): Use single set to obtain set.
-
-2002-06-02 Richard Henderson <rth@redhat.com>
-
- * rtlanal.c (volatile_refs_p): Not automatically true for CALL.
-
-2002-06-02 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- Support for C++ constructors/destructors.
- * config/avr/avr.c (avr_output_function_epilogue): Jump to exit()
- instead of looping if main() returns.
- (asm_file_start): Output global symbols that cause .data and .bss
- initialization code to be linked in, unconditionally for now.
- (avr_asm_out_ctor, avr_asm_out_dtor): New functions.
- * config/avr/avr.h (CTORS_SECTION_ASM_OP, DTORS_SECTION_ASM_OP): New.
- (TARGET_ASM_CONSTRUCTOR, TARGET_ASM_DESTRUCTOR): New.
- (LIBSTDCXX): New.
- * config/avr/libgcc.S (_exit): Split in .fini9 and .fini0 sections.
- (__tablejump__): New.
- (__do_copy_data, __do_clear_bss): New.
- (__do_global_ctors, __do_global_dtors): New.
- * config/avr/t-avr (LIB1ASMFUNCS): Add _copy_data, _clear_bss,
- _ctors, _dtors.
-
-2002-06-02 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c4x/c4x.h (TARGET_CPU_CPP_BUILTINS): New.
- (CPP_SPEC, CPP_PREDEFINES): Kill.
- * c4x/rtems.h (CPP_PREDEFINES): Kill.
- (TARGET_OS_CPP_BUILTINS): New.
-
-Sat Jun 1 23:29:51 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * Makefile.in (tracer.o): New.
- * params.def (TRACER_*): New options.
- * rtl.h (tracer): Declare.
- * timevar.def (TV_TRACER): New.
- * toplev.c (dump_file_index): Add DFI_tracer.
- (dump_file_info): Add tracer.
- (flag_tracer): New.
- (lang_indepdenent_options): Add tracer.
- (rest_of_compilation): Call tracer.
- * tracer.c: New file.
- * invoke.texi (-ftracer): Document.
- (--param tracer-*): Document.
-
-2002-06-01 Daniel Berlin <dberlin@dberlin.org>
-
- * tree-inline.c (expand_call_inline): Make the statement
- expression we generate have a COMPOUND_STMT.
-
-2002-06-01 Roger Sayle <roger@eyesopen.com>
-
- * gcse.c (cprop_cc0_jump): Function deleted.
- (cprop_jump): Take an additional argument which is the possibly
- NULL cc setting insn immediately before the conditional jump.
- When a MODE_CC set is present, substitute it into the JUMP_INSN
- before attempting the constant propagation.
- (cprop_insn): Recognize cc setters followed by conditional jumps
- as a special case. Use cprop_jump instead of cprop_cc0_jump.
- (cprop_one_pass): Call bypass_conditional_jumps if altering jumps.
- (find_bypass_set): New function based upon find_avail_set used by
- cprop, but finds constant expressions available at the end of
- basic blocks.
- (bypass_block): New function. Given a basic block that begins
- with a conditional jump and multiple incoming edges, perform
- the jump bypass optimization.
- (bypass_conditional_jumps): New function. Call bypass_block with
- each suitable basic block in the CFG using a simple single pass.
-
-2002-06-01 Roger Sayle <roger@eyesopen.com>
-
- * tree.c (real_minus_onep): New function to test for -1.0.
- * fold-const.c (fold) [MULT_EXPR]: Optimize -1.0*x into -x.
-
-2002-06-01 Roger Sayle <roger@eyesopen.com>
-
- * fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0"
- and "!p && !q" into "(p|q) == 0" under suitable conditions.
-
-2002-06-01 Andreas Jaeger <aj@suse.de>
-
- * cppexp.c (cpp_classify_number): Cast precission to int for
- correct printf format.
-
-2002-06-01 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_mcu_types): Remove devices that were once
- expected, but don't really exist: atmega83, atmega85, attiny10.
- * config/avr/avr.h (LINK_SPEC): Update to use the new avr[1-5] ld
- emulations for all devices.
- (CRT_BINUTILS_SPECS): Remove atmega83, atmega85, attiny10.
- * config/avr/t-avr (MULTILIB_MATCHES): Remove atmega83, atmega85.
-
-2002-06-01 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/h8300-protos.h: Add a prototype for
- h8300_shift_needs_scratch_p.
- * config/h8300/h8300.c (h8300_shift_needs_scratch_p): New.
- * config/h8300/h8300.h (OK_FOR_R): New.
- (OK_FOR_S): Likewise.
- (OK_FOR_T): Likewise.
- (EXTRA_CONSTRAINT): Call OK_FOR_R, OK_FOR_S, and OK_FOR_T.
- * config/h8300/h8300.md (anonymous shift patterns): Use
- constraints R, S, and T.
-
-Sat Jun 1 11:23:22 CEST 2002 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * basic-block.h (struct basic_block_def): New field loop_father.
- (BB_VISITED): New flag.
- (struct loop): New field pred, removed field shared.
- (struct loops): New field parray.
- (LOOP_EXITS_DOMS): Removed.
- (flow_loop_tree_node_add, flow_loop_tree_node_remove,
- flow_loop_nested_p, flow_bb_inside_loop_p, get_loop_body,
- dfs_enumerate_from, loop_preheader_edge, loop_latch_edge,
- add_bb_to_loop, remove_bb_from_loops, find_common_loop,
- verify_loop_structure): Declare.
- * cfg.c (entry_exit_blocks): Initialize loop_father field.
- * cfganal.c (dfs_enumerate_from): New function.
- * cfgloop.c (HEAVY_EDGE_RATIO): New constant.
- (flow_loop_entry_edges_find, flow_loop_exit_edges_find,
- flow_loop_nodes_find, flow_loop_level_compute, flow_loop_nested_p,
- flow_loop_dump, flow_loops_dump, flow_loops_free,
- flow_loop_tree_node_add, flow_loop_level_compute,
- flow_loops_level_compute, flow_loop_scan, flow_loops_update,
- flow_loop_outside_edge_p): Modified for new infrastructure.
- (make_forwarder_block, canonicalize_loop_headers, glb_enum_p,
- redirect_edge_with_latch_update, flow_loop_free): New static functions.
- (flow_loop_tree_node_remove, flow_bb_inside_loop_p,
- get_loop_body, add_bb_to_loop, remove_bb_from_loops,
- find_common_loop, verify_loop_structure, loop_latch_edge,
- loop_preheader_edge): New functions.
- (flow_loops_cfg_dump): Do not show dominators, as this information
- does not remain up to date long.
- (flow_loops_find): Store results in new format.
- * predict.c (propagate_freq, estimate_probability,
- estimate_loops_at_level, estimate_bb_frequencies): Use new loop
- infrastructure.
-
-2002-06-01 Alan Lehotsky <apl@alum.mit.edu>
-
- * except.c (nothrow_function_p): Walk epilogue delay list
- checking the insn, not the chain for potential throws.
-
-2002-05-31 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (INSTALL_CPP, UNINSTALL_CPP): Remove.
- (install): Refer to install-cpp directly.
- (uninstall-cpp): Folded into uninstall rule.
- * configure.in: Delete all code relating to --disable-cpp.
- * configure: Regenerate.
- * config/t-install-cpp: Delete.
-
-2002-05-31 Richard Henderson <rth@redhat.com>
-
- * configure.in (HAVE_AS_TLS): Add alpha tests.
- * configure: Rebuild.
- * config/alpha/alpha.c (TARGET_AS_TLS): New.
- (alpha_tls_size, alpha_tls_size_string): New.
- (overide_options): Set it. Always install machine_status hooks.
- (input_operand): Accept got tls predicates.
- (local_symbol_p): Merge into ...
- (local_symbolic_operand): ... here. Reject tls symbols.
- (global_symbolic_operand): Likewise.
- (tls_symbolic_operand_1, dtp16_symbolic_operand): New.
- (dtp32_symbolic_operand, gotdtp_symbolic_operand): New.
- (tp16_symbolic_operand, tp32_symbolic_operand): New.
- (gottp_symbolic_operand, tls_symbolic_operand_type): New.
- (alpha_encode_section_info): Handle TLS symbols.
- (alpha_strip_name_encoding): Likewise.
- (alpha_legitimate_address_p): Likewise.
- (alpha_legitimize_address): Likewise.
- (alpha_expand_mov): Early exit to avoid nop moves.
- (struct machine_function): Move from unicosmk.h. Add some_ld_name.
- (alpha_init_machine_status, alpha_mark_machine_status,
- alpha_free_machine_status): Always define.
- (get_some_local_dynamic_name, get_some_local_dynamic_name_1): New.
- (print_operand, print_operand_address): Add TLS relocs.
- * config/alpha/alpha.h (HAVE_AS_TLS): Default 0.
- (MASK_TLS_KERNEL, TARGET_TLS_KERNEL): New.
- (TARGET_SWITCHES): Add -mtls-kernel.
- (alpha_tls_size, alpha_tls_size_string): New.
- (TARGET_OPTIONS): Add -mtls-size=.
- (reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS,
- REGNO_REG_CLASS, REG_CLASS_FROM_LETTER): Add R0_REG.
- (ASM_OUTPUT_LABELREF): Skip %.
- (PRINT_OPERAND_PUNCT_VALID_P): Add &.
- (PREDICATE_CODES): Update.
- * config/alpha/alpha.md (UNSPEC_TLSGD_CALL, UNSPEC_TLSLDM_CALL,
- UNSPEC_TLSGD, UNSPEC_TLSLDM, UNSPEC_DTPREL, UNSPEC_TPREL,
- UNSPEC_TP, UNSPECV_SET_TP): New.
- (adddi_er_lo16_dtp, adddi_er_hi32_dtp, adddi_er_lo32_dtp,
- adddi_er_lo16_tp, adddi_er_hi32_tp, adddi_er_lo32_tp, load_tp,
- set_tp, movdi_er_tlsgd, movdi_er_tlsldm, movdi_er_gotdtp,
- movdi_er_gottp, call_value_osf_tlsgd, call_value_osf_tlsldm): New.
- (call_value_osf_2_er): Accept anything as op4.
- * config/alpha/alpha-protos.h: Update.
- * config/alpha/unicosmk.h (struct machine_function): Move to alpha.c.
-
-2002-05-31 Zack Weinberg <zack@codesourcery.com>
-
- * cppinit.c (append_include_chain): Always pay attention to
- cxx_aware when setting new->sysp. Remove ATTRIBUTE_UNUSED
- marker on argument.
-
-2002-05-31 Kazu Hirata <kazu@cs.umass.edu>
-
- * target.h: Fix formatting.
- * timevar.h: Likewise.
- * tlink.c: Likewise.
- * toplev.c: Likewise.
- * toplev.h: Likewise.
- * tree.c: Likewise.
- * tree-dump.h: Likewise.
- * tree.h: Likewise.
- * tree-inline.h: Likewise.
- * unroll.c: Likewise.
- * unwind-dw2.c: Likewise.
- * unwind-dw2-fde.c: Likewise.
- * unwind-dw2-fde-glibc.c: Likewise.
- * unwind-dw2-fde.h: Likewise.
- * unwind.h: Likewise.
- * unwind-sjlj.c: Likewise.
- * varasm.c: Likewise.
- * varray.h: Likewise.
- * vmsdbg.h: Likewise.
- * vmsdbgout.c: Likewise.
- * xcoffout.h: Likewise.
-
-2002-05-31 Igor Shevlyakov <igor@microunity.com>
-
- * expr.c (compare_from_rtx): Generate comparison between op0 and op1
- rather than cc0 and 0 in a case when HAVE_cc0 is not defined.
-
-2002-05-31 Matthew Woodcraft <mattheww@chiark.greenend.org.uk>
-
- * gcc.c (cpp_unique_options): Remove "-d" options.
- (cpp_debug_options): New spec string.
- (default_compilers): Use it.
- * objc/lang-specs.h: Likewise.
-
-2002-05-31 Nathanael Nerode <neroden@twcny.rr.com>
-
- * gcc/Makefile.in: Replace HOST_PREFIX, HOST_PREFIX_1 with
- BUILD_PREFIX, BUILD_PREFIX_1, to correct nomenclature.
- * gcc/mklibgcc.in: Likewise.
- * gcc/config/arc/t-arc: Likewise.
- * gcc/configure.in: Likewise.
- * gcc/configure: Regenerate.
-
-2002-05-31 Stan Shebs <shebs@apple.com>
- Turly O'Connor <turly@apple.com>
-
- * c-decl.c (struct binding_level): Change int field n_incomplete
- to tree list incomplete_list.
- (clear_binding_level): Init field with NULL.
- (pushdecl): Add incomplete type to list.
- (mark_binding_level): Mark the incomplete list.
- (finish_struct): Scan the incomplete list for types instead
- of all decls in the current binding level.
-
-2002-05-31 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.c (output_millicode_call): Add missing '%' characters.
- (output_call): Likewise.
-
-2002-05-31 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/xcoff.h (HOT_TEXT_SECTION_NAME): Define.
- (UNLIKELY_EXECUTED_TEXT_SECTION_NAME): Define.
-
-2002-05-31 Alan Lehotsky <apl@alum.mit.edu>
-
- * varasm.c (mark_constant_pool): Walk epilogue delay list
- checking the insn, not the chain for potential constants.
-
-Fri May 31 12:38:43 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * config/sh/elf.h (ASM_SPEC): Use subtarget_endian_asm_spec.
-
-Fri May 31 13:50:19 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (classify_argument): Properly handle base types.
-
- * dwarf2out.c (expand_builin_init_dwarf_reg_sizes):
- Store first DWARF_FRAME_REGISTERS dwarf registers, not pseudo
- registers.
-
-Fri May 31 13:37:54 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * gcse.c (gcse_emit_move_after): New.
- (pre_delete, hoist_store): Use it.
-
- * reload1.c (emit_input_reload_insns): Use constrain_operands
- instead of constraint_accepts_reg_p to verify optimization.
- (constraint_accepts_reg_p): Kill
-
- * reload1.c (reload_cse_delete_noop_set): Kill.
- (reload_cse_simplify): use delte_insn_and_edges.
-
-2002-05-31 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * cfgloop.c (flow_loops_find): Initialize first and last fields
- correctly.
-
-2002-05-31 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (builtin_define_std): Correct logic.
-
-2002-05-31 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.c (output_millicode_call): Correct "be,l" insn for TARGET_PA_20.
- (output_call): Likewise.
-
-2002-05-31 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.c: Move output.h include after tree.h include.
- (pa_asm_output_mi_thunk): Constify identifier lab.
-
-2002-05-31 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/ns32k/ns32k.h: Define named constants for the
- bits in target_flags and use them.
- * config/ns32k/netbsd.h (TARGET_DEFAULT): Use named constants.
-
-2002-05-30 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * config.gcc (tm_file): Prefix pa/pa-700.h to tm_file list for PA1.0
- architecture and pa/pa-7100.h for PA1.1 architecture, respectively.
- * pa/pa.c (override_options): Use TARGET_SCHED_DEFAULT to select
- default scheduling model.
- * pa/pa.h (TARGET_SCHED_DEFAULT): Define if not defined to "8000".
- * pa/pa-700.h (TARGET_SCHED_DEFAULT): New file for "700" scheduling.
- * pa/pa-7100.h (TARGET_SCHED_DEFAULT): New file for "7100" scheduling.
- * doc/install.texi (hppa*-*-*): Document default scheduling.
-
-2002-05-30 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.c (following_call): Check TARGET_JUMP_IN_DELAY.
-
-2002-05-31 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (ns32k-*-netbsd*): Set tm_file to
- "${tm_file} netbsd.h netbsd-aout.h ns32k/netbsd.h"
- * config/ns32k/netbsd.h: Don't include ns32k/ns32k.h,
- netbsd.h, or netbsd-aout.h.
-
-2002-05-31 Jason Thorpe <thorpej@wasabisystems.com>
-
- * longlong.h (count_trailing_zeros): Add missing \, and clean up
- whitespace in __ns32000__ case.
-
-2002-05-31 Aldy Hernandez <aldyh@redhat.com>
-
- * expr.c (expand_expr): Output partially zeroed out vectors with
- output_constant_def.
-
-2002-05-30 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (sh[123456789l]*-*-*): Set cpu_type to sh.
- (sh-*-netbsdelf*)
- (shl*-*-netbsdelf*): New targets.
- * config/sh/netbsd-elf.h: New file.
- * config/sh/t-netbsd: New file.
-
-2002-05-30 Richard Henderson <rth@redhat.com>
- Eric Botcazou <ebotcazou@multimania.com>
-
- PR optimization/6822
- * config/i386/i386.c (ix86_expand_int_movcc): Don't cast INTVAL
- to unsigned int for op1 comparisons. Use gen_int_mode.
-
-2002-05-30 Eric Botcazou <ebotcazou@multimania.com>
-
- * expmed.c (const_mult_add_overflow_p): New.
- * expr.h: Declare it.
- * loop.c (maybe_eliminate_biv_1) [COMPARE]: Use it.
- Don't eliminate the biv if the giv has a constant multiplier and
- the rhs argument of the comparison does satisfy the predicate.
- Use expand_mult_add to compute the replacement constant.
-
-2002-05-30 Osku Salerma <osku@iki.fi>
-
- * c-common.c (c_common_attribute_table): Add "may_alias" entry.
- (c_common_get_alias_set): Handle it.
- * doc/extend.texi: Document it.
-
-2002-05-30 Richard Henderson <rth@redhat.com>
-
- * defaults.h (TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER): Kill.
- * toplev.c (process_options): Don't check it.
- * doc/tm.texi: Don't document it.
- * config/i386/linux.h (SUBTARGET_FRAME_POINTER_REQUIRED): New.
- (TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER): Kill.
- * config/i386/i386.c (ix86_frame_pointer_required): Suppress leaf
- frame pointer optimization if current_function_profile.
-
-2002-05-30 Kazu Hirata <kazu@cs.umass.edu>
-
- * langhooks.c: Fix formatting.
- * langhooks.h: Likewise.
- * lcm.c: Likewise.
- * libgcc2.c: Likewise.
- * lists.c: Likewise.
- * local-alloc.c: Likewise.
- * loop.c: Likewise.
- * loop.h: Likewise.
-
-2002-05-30 Marc Espie <espie@openbsd.org>
-
- * config.gcc (sparc64-*-openbsd*): New.
- * config/sparc/openbsd1-64.h: New.
- * config/sparc/openbsd64.h: New.
-
-2002-05-30 Jeff Law <law@redhat.com>
-
- * flow.c (propagate_one_insn): Revise yesterday's patch. Delete
- a dead insn with a REG_RETVAL note when the entire libcall is not
- dead and remove the associated REG_LIBCALL note at the same time.
-
-Thu May 30 19:54:30 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * lcm.c (output.h): #include.
- (compute_earliest): Remove hack to treat renumbered EXIT_BLOCK
- as an ordinary block.
- (optimize_mode_switching): Don't pretend that the exit block is
- an ordinary block, or handle sucessors of entry block specially.
- Instead, split edges from entry block and to exit block, and
- put a computing definition on the thus gained post-entry-block,
- and a need on the pre-exit-block.
-
-Thu May 30 20:28:01 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * gengenrtl.c (type_from_format, accessor_from_format): Support 'B'.
- * rtl.texi: Document 'B'
-
-2002-05-30 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/m68k/netbsd-elf.h (LONG_DOUBLE_TYPE_SIZE): Compute
- at run-time.
- (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Set to 96 if not __mc68010__.
-
-2002-05-30 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (rs6000_expand_unop_builtin): Return
- const0_rtx instead of NULL_RTX when in error.
- (altivec_expand_abs_builtin): Same.
- (rs6000_expand_binop_builtin): Same.
- (altivec_expand_predicate_builtin): Same.
- (altivec_expand_stv_builtin): Same.
- (rs6000_expand_ternop_builtin): Same.
- (altivec_expand_builtin): Same.
-
-2002-05-29 David S. Miller <davem@redhat.com>
-
- * rtl.h (clear_emit_caches): Delete.
- * integrate.c (output_inline_function): Don't call it.
- * emit-rtl.c (restore_emit_status, init_emit): Likewise.
- (clear_emit_caches): Delete definition.
- (SEQUENCE_RESULT_SIZE, sequence_result, free_insn): Likewise.
-
-2002-05-30 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.c: Include real.h.
- (mmix_constant_address_p): Remove redundant test before switch.
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/mips/mips.h (READONLY_DATA_SECTION_ASM_OP): Define
- only if not already defined.
-
-2002-05-29 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/h8300-protos.h: Remove prototypes for
- ok_for_bclr and small_power_of_two.
- * config/h8300/h8300.c (small_power_of_two): Remove.
- (ok_for_blcr): Likewise.
- (fix_bit_operand): Make WHAT deal with an integer instead of a
- constraint character.
- * config/h8300/h8300.h (CONST_OK_FOR_O): Remove.
- (CONST_OK_FOR_P): Likewise.
- (CONST_OK_FOR_LETTER_P): Do not call CONST_OK_FOR_O or
- CONST_OK_FOR_P any more.
- * config/h8300/h8300.md (andqi3): Adjust to the new prototype
- of fix_bit_operand.
- (iorqi3): Likewise.
- (xorqi3): Likewise.
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/mips/netbsd.h (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES): Make sure this is undefined.
- (CPP_SPEC): Place -D__mips=1 at the beginning of the spec,
- since it is no longer in CPP_PREDEFINES. Don't -U__MIPSEL__
- or -U__MIPSEB__ before defining one or the other. Instead,
- use %(subtarget_endian_default) if neither -EB nor -EL are
- specified.
- (SUBTARGET_EXTRA_SPECS): Define.
- (SUBTARGET_CPP_SPEC): Remove __LONG64 handling. Use
- %(netbsd_cpp_spec).
-
-2002-05-29 Hans-Peter Nilsson <hp@axis.com>
-
- * doc/md.texi (Patterns): Note pattern condition pitfall
- for unnamed insn.
-
-2002-05-29 Aldy Hernandez <aldyh@redhat.com>
-
- * rs6000.c: (altivec_expand_builtin): Only expand altivec builtins
- when TARGET_ALTIVEC. Move handling of generic unary, binary, and
- ternary operations from here...
- (rs6000_expand_builtin): ...to here.
- New argument expandedp.
- Change all instances of altivec_expand_binop_builtin to
- rs6000_expand_binop_builtin.
- (altivec_expand_unop_builtin): Rename to
- rs6000_expand_unop_builtin.
- (altivec_expand_binop_builtin): Rename to
- rs6000_expand_binop_builtin.
- (altivec_expand_ternop_builtin): Rename to
- rs6000_expand_ternop_builtin.
-
-2002-05-29 Richard Henderson <rth@redhat.com>
-
- * config/i386/biarch64.h (TARGET_64BIT_DEFAULT): Define with value.
- (TARGET_BI_ARCH): Likewise.
- * config/i386/i386.h: Test TARGET_64BIT_DEFAULT by value.
- (TARGET_SWITCHES): Combine target defaults here not in TARGET_DEFAULT.
- (TARGET_64BIT_DEFAULT): Default to 0.
- (TARGET_DEFAULT): Default to MASK_OMIT_LEAF_FRAME_POINTER.
-
-2002-05-29 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (USE_HIDDEN_LINKONCE): New.
- (get_pc_thunk_name): New.
- (output_set_got): Use it.
- (ix86_asm_file_end): If USE_HIDDEN_LINKONCE, emit get_pc thunks
- into linkonce sections.
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/sparc/netbsd-elf.h (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES): Make sure this is undefined.
- (CPP_SUBTARGET_SPEC64, CPP_SUBTARGET_SPEC32): Remove.
- (CPP_SUBTARGET_SPEC): Don't provide different versions for
- default-32 and default-64. Just always use %(netbsd_cpp_spec).
- (SUBTARGET_EXTRA_SPECS): Remove cpp_subtarget_spec32 and
- cpp_subtarget_spec64. Add netbsd_cpp_spec.
- * config/sparc/netbsd.h (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES): Make sure this is undefined.
- (SUBTARGET_EXTRA_SPECS): Define.
- (CPP_SPEC): Use %(netbsd_cpp_spec).
-
-2002-05-29 Jeff Law <law@redhat.com>
-
- * pa.h (ASM_OUTPUT_MI_THUNK): Remove unwanted semi-colon.
-
- * flow.c (propagate_one_insn): Do not remove a dead insn if it
- contains a REG_RETVAL note.
-
- * haifa-sched (sched_analyze): Remove another useless clearing
- of SCHED_GROUP_P I missed yesterday.
-
- * pa.h (ASM_OUTPUT_MI_THUNK): Move implementation into pa.c.
- * pa.c (pa_asm_output_mi_thunk): New function.
- * pa-protos.h (pa_asm_output_mi_thunk): Declare.
-
-2002-05-29 Neil Booth <neil@daikokuya.demon.co.uk>
- Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_base_arch_macro, avr_extra_arch_macro): New.
- (avr_asm_only_p): Make non-static.
- (enum avr_arch): Remove.
- (avr_arch_types): New.
- (avr_mcu_types): Update.
- (avr_override_options): Use avr_arch_types table instead of switch.
- * avr.h (CPP_PREDEFINES): Die.
- (avr_base_arch_macro, avr_extra_arch_macro): New.
- (TARGET_CPU_CPP_BUILTINS): New.
- (CPP_SPEC, EXTRA_SPECS): Simplify.
- (CPP_AVR1_SPEC, CPP_AVR2_SPEC, CPP_AVR3_SPEC, CPP_AVR4_SPEC,
- CPP_AVR5_SPEC): Die.
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/arm/netbsd.h (TARGET_OS_CPP_BUILTINS): Use
- NETBSD_OS_CPP_BUILTINS_AOUT.
- (SUBTARGET_EXTRA_SPECS): Define.
- (CPP_SPEC): Use %(netbsd_cpp_spec).
-
-2002-05-29 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_output_function_epilogue): New.
- (TARGET_ASM_FUNCTION_EPILOGUE): New.
- (pic_label_name): Remove.
- (pic_labels_used): New.
- (ix86_asm_file_end): Emit one pc load stub for each register used.
- (output_set_got): Generate deep pc load to any register.
- (ix86_select_alt_pic_regnum): New.
- (ix86_save_reg): Don't save pic register if we can find a valid
- call-clobbered replacement.
- (ix86_expand_prologue): If we found a valid replacement, renumber
- pic_offset_table_rtx.
- * config/i386/i386.h (PIC_OFFSET_TABLE_REGNUM): Look at
- pic_offset_table_rtx after reload.
- (REAL_PIC_OFFSET_TABLE_REGNUM): New.
- * config/i386/i386.md (set_got): Make insn, not expander.
- (set_got_nopic, set_got_deep, set_got_nodeep): Remove.
-
-2002-05-29 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_compute_frame_layout): Do add bottom
- alignment for alloca.
-
-2002-05-29 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (output_pic_addr_const): Lowercase rip.
- (print_operand_address): Only add rip for symbolic addresses
- for which we do not have another relocation type.
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/m68k/netbsd-elf.h (TARGET_OS_CPP_BUILTINS): Define.
- (EXTRA_SPECS): Add netbsd_cpp_spec.
- (CPP_SPEC): Use %(netbsd_cpp_spec).
- (CPP_PREDEFINES): Remove.
- * config/m68k/netbsd.h (TARGET_OS_CPP_BUILTINS): Define.
- (EXTRA_SPECS): Define.
- (CPP_SPEC): Use %(netbsd_cpp_spec).
- (CPP_PREDEFINES): Remove.
-
-2002-05-29 Neil Booth <neil@daikokuya.demon.co.uk>
-
- PR preprocessor/6844
- * cppmacro.c (cpp_macro_definition): Reserve space for terminating
- NUL.
-
-2002-05-29 Eric Christopher <echristo@redhat.com>
-
- * config/mips/linux.h (SUBTARGET_CPP_SPEC): Add support for
- mips5/mips32/mips64 and _MIPS_ISA_MIPSXX.
-
-2002-05-29 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/fr30/fr30.md: Remove previous restriction on splits.
- Enforce conformance through gen_lowpart and cont_int_operand.
- * config/fr30/fr30.h (BSS_SECTION_ASM_OP): Use ".section .bss"
- as the assembler does not support ".bss".
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/i386/netbsd-elf.h (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES): Remove.
- (SUBTARGET_EXTRA_SPECS): Define.
- (CPP_SPEC): Use %(netbsd_cpp_spec).
- * config/i386/netbsd.h (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES): Remove.
- (SUBTARGET_EXTRA_SPECS): Define.
- (CPP_SPEC): Use %(netbsd_cpp_spec).
- * config/i386/netbsd64.h (TARGET_OS_CPP_BUILTINS): Define.
- (CPP_PREDEFINES, CPP_LP64_SPEC, CPP_SUBTARGET_SPEC): Remove.
- (SUBTARGET_EXTRA_SPECS): Remove cpp_lp64 and cpp_subtarget.
- Add netbsd_cpp_spec.
- (CPP_SPEC): Remove %(cpp_subtarget), add %(netbsd_cpp_spec).
-
-2002-05-29 Neil Booth <neil@daikokuya.demon.co.uk>
- Zack Weinberg <zack@codesourcery.com>
-
- * cppexp.c (cpp_num): Move to cpplib.h.
- (CPP_ERROR): Remove.
- (interpret_float_suffix, interpret_int_suffix): New.
- (struct suffix, vsuf_1, vsuf_2, vsuf_3): Remove.
- (cpp_classify_number, cpp_interpret_integer): New.
- (interpret_number): Remove.
- (eval_token): Update to use new routines.
- * cpphash.h (cpp_num_part): Move to cpplib.h.
- * cppinit.c (cpp_post_options): Set warn_long_long.
- * cpplib.h (struct cpp_options): Add warn_long_long.
- (cpp_num, cpp_num_part, CPP_N_CATEGORY, CPP_N_INVALID,
- CPP_N_INTEGER, CPP_N_FLOATING, CPP_N_WIDTH, CPP_N_SMALL,
- CPP_N_MEDIUM, CPP_N_LARGE, CPP_N_RADIX, CPP_N_DEC, CPP_N_HEX,
- CPP_N_OCTAL, CPP_N_UNSIGNED, CPP_N_IMAGINARY, cpp_classify_number,
- cpp_interpret_integer): New.
-
-2002-05-29 Joel Sherrill <joel@OARcorp.com>
-
- * config/rs6000/rs6000.h (ASM_CPU_SPEC): Use -m403 and -m405.
-
-2002-05-29 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/alpha/netbsd.h (TARGET_OS_CPP_BUILTINS): Use
- NETBSD_OS_CPP_BUILTINS_ELF and NETBSD_OS_CPP_BUILTINS_LP64.
- (CPP_SUBTARGET_SPEC): Define.
- (SUBTARGET_EXTRA_SPECS): Define.
- (CPP_SPEC): Remove.
-
-2002-05-29 Chris Lattner <sabre@nondot.org>
-
- * ssa.c (rename_insn_1): Rename uses of undefined registers to
- prevent confusion if/when the register is defined.
-
-2002-05-29 Hans-Peter Nilsson <hp@axis.com>
-
- PR target/6838
- * config/cris/cris.md: Fix typos and thinkos in comments.
- ("*mov_sideqi_biap_mem"): Remove '*' in constraint for operand 4,
- second alternative.
- ("*mov_sidehi_biap_mem", "*mov_sidesi_biap_mem"): Ditto.
- ("*mov_sideqi_mem"): Similar, but for operand 3.
- ("*mov_sidehi_mem", "*mov_sidesi_mem"): Ditto.
- (splitter for mov_sideqi_mem, mov_sidehi_mem, mov_sidesi_mem):
- Remove spurious mode specifier on operand 2.
-
-2002-05-29 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/h8300-protos.h: Remove the prototype for
- o_operand.
- Add prototypes for single_one_operand and single_zero_operand.
- * config/h8300/h8300.c (o_operand): Remove.
- (single_one_operand): New.
- (single_zero_operand): Likewise.
- (print_operand): For 'V' operand, and the operand with 0xff.
- For 'V' and 'W' operands, do not and the bit position with 7.
- * config/h8300/h8300.md (various anonymous patterns): Replace
- use of exact_log2 with single_one_operand/single_zero_operand.
-
-2002-05-29 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/linux.h (MD_FALLBACK_FRAME_STATE_FOR): New.
-
-2002-05-29 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.c (legitimate_pic_operand_p): Do not
- accept symbolic LARL operands.
- (s390_emit_epilogue): Do not set FRAME_RELATED_P on
- epilogue insns.
-
-2002-05-29 Hartmut Penner <hpenner@de.ibm.com>
-
- * config/s390/s390.md (cmpstr_64/31): Mark whole
- input registers as used.
-
-2002-05-28 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_save_reg): Examine regs_ever_live,
- not current_function_uses_pic_offset_table and
- current_function_uses_const_pool; examine current_function_profile.
- (ix86_expand_prologue): Likewise. Add pic_offset_table_rtx as
- input to blockage if needed.
- (ix86_expand_call): Do not set current_function_uses_pic_offset_table.
- (legitimize_pic_address): Likewise. Set regs_ever_live for
- pic_offset_table_rtx when invoked during reload.
- * config/i386/i386.h (FINALIZE_PIC): Remove.
- * config/i386/i386.md (tablejump): Reformat. Do not set
- current_function_uses_pic_offset_table.
- (tls_global_dynamic, tls_local_dynamic_base): Likewise.
- (blockage): Accept anything as operand 0.
-
-2002-05-28 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/netbsd-aout.h (NETBSD_OS_CPP_BUILTINS_AOUT): Define
- common CPP built-ins for all NetBSD a.out targets.
- * config/netbsd-elf.h (NETBSD_OS_CPP_BUILTINS_ELF): Define
- common CPP built-ins for all NetBSD ELF targets.
- * config/netbsd.h: Add missing notice.
- (NETBSD_OS_CPP_BUILTINS_COMMON): Define common CPP built-ins
- for all NetBSD targets.
- (NETBSD_OS_CPP_BUILTINS_LP64): Define common CPP built-ins
- for all NetBSD targets using an LP64 code model.
- (NETBSD_CPP_SPEC): Define CPP_SPEC parts common to all
- NetBSD targets.
-
-2002-05-28 Richard Henderson <rth@redhat.com>
-
- * flow.c (update_life_info_in_dirty_blocks): Only do a partial
- update if UPDATE_LIFE_LOCAL.
-
-2002-05-28 Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com>
-
- * config/sh/sh.c: Include real.h for REAL_VALUE_TYPE.
-
-Tue May 28 21:16:18 2002 J"orn Rennecke <joern.rennecke@superh.com>
- Jason R. Thorpe <thorpej@wasabisystems.com>
-
- config/sh reorganization to factor out endianness and coff:
-
- * config/sh/little.h: New file.
- * config/sh/sh.h (TARGET_ENDIAN_DEFAULT): If not already
- defined, define to 0 to select big-endian.
- (SUBTARGET_ASM_ENDIAN_SPEC): Define according to TARGET_ENDIAN_DEFAULT.
- (TARGET_DEFAULT): Include TARGET_ENDIAN_DEFAULT.
- * config/sh/sh64.h (TARGET_DEFAULT): Include TARGET_ENDIAN_DEFAULT.
- * config/sh/t-be: New file.
- * config/sh/t-le: New file.
-
- * sh.h (SDB_DEBUGGING_INFO, #include "dbxcoff.h"): Moved to sh/coff.h.
- (SDB_DELIM, MAX_OFILE_ALIGNMENT, IDENT_ASM_OP): Likewise.
- (TARGET_ASM_NAMED_SECTION, ASM_OUTPUT_SKIP): Likewise.
- (USER_LABEL_PREFIX, LOCAL_LABEL_PREFIX): Likewise.
- (ASM_GENERATE_INTERNAL_LABEL, ASM_OUTPUT_INTERNAL_LABEL): Likewise.
- (ASM_OUTPUT_COMMON, ASM_OUTPUT_LOCAL): Likewise.
- (ASM_FILE_END, ASM_DECLARE_FUNCTION_NAME): Deleted.
- (CPP_SPEC, SUBTARGET_CPP_ENDIAN_SPEC): Likewise.
- (SUBTARGET_CPP_SPEC, CPP_DEFAULT_CPU_SPEC, CPP_PREDEFINES): Likewise.
- (EXTRA_SPECS): Remove SUBTARGET_CPP_ENDIAN_SPEC and
- CPP_DEFAULT_CPU_SPEC. Add LINK_EMUL_PREFIX, LINK_DEFAULT_CPU_EMUL,
- SUBTARGET_LINK_EMUL_SUFFIX and SUBTARGET_LINK_SPEC.
- (LINK_SPEC): Define to SH_LINK_SPEC.
- (TARGET_CPU_CPP_BUILTINS, SH_LINK_SPEC): Define.
- (LINK_EMUL_PREFIX, LINK_DEFAULT_CPU_EMUL): Likewise.
- (SUBTARGET_LINK_EMUL_SUFFIX, SUBTARGET_LINK_SPEC): Likewise.
- (CPP_SPEC): Reduce to %(subtarget_cpp_spec).
- (TARGET_ENDIAN_DEFAULT): Define if not already defined.
- * config/sh/coff.h: New file.
- (TARGET_ASM_NAMED_SECTION): Now default_coff_asm_named_section
- (TARGET_OBJFMT_CPP_BUILTINS): Define.
- * config/sh/elf.h (IDENT_ASM_OP): No need to #undef at the start.
- (ASM_FILE_END, ASM_OUTPUT_SOURCE_LINE): Likewise.
- (DBX_OUTPUT_MAIN_SOURCE_FILE_END, TARGET_ASM_NAMED_SECTION): Likewise.
- (ASM_DECLARE_FUNCTION_NAME, MAX_OFILE_ALIGNMENT, SIZE_TYPE): Likewise.
- (PTRDIFF_TYPE): Likewise.
- ("dbxelf.h", "elfos.h", "svr4.h"): Don't #include.
- (CPP_PREDEFINES): Don't define.
- (TARGET_OBJFMT_CPP_BUILTINS): Define.
- (LINK_SPEC): Define to SH_LINK_SPEC.
- (LINK_EMUL_PREFIX): Redefine.
- * config/sh/linux.h: (SUBTARGET_CPP_SPEC): Remove -fpic / -fPIC cases.
- (SUBTARGET_CPP_ENDIAN_SPEC, CPP_DEFAULT_CPU_SPEC): Remove redefinition.
- (CPP_PREDEFINES, SUBTARGET_ASM_ENDIAN_SPEC): Likewise.
- (CC1_SPEC, CC1PLUS_SPEC, LINK_SPEC): Likewise.
- (TARGET_OS_CPP_BUILTINS): Define.
- (TARGET_DEFAULT): Redefine.
- (SUBTARGET_LINK_EMUL_SUFFIX, SUBTARGET_LINK_SPEC): Likewise.
- * config/sh/sh64.h (CPP_DEFAULT_CPU_SPEC): Remove.
- (LINK_SPEC): Don't redefine.
- (LINK_DEFAULT_CPU_EMUL): Redefine.
- (TARGET_DEFAULT): Include TARGET_ENDIAN_DEFAULT.
- * sh.c (sh_asm_named_section): Don't declare / define.
- * t-linux (MULTILIB_OPTIONS): Rely on pre-set endianness option.
- * config.gcc (sh-*-elf* tm_file): Add dbxelf.h elfos.h svr4.h.
- (sh64-*-elf* tm_file): Likewise.
- (sh-*-rtemself* tm_file): Likewise.
- (sh-*-linux* tm_file): Likewise. Add sh/little.h.
- (sh-*-linux* tmake_file): Add sh/t-le.
- (sh-*-rtems* tm_file): Add sh/coff.h
- (sh-*-* tm_file): Likewise.
-
-Tue May 28 21:16:18 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.h (LEGITIMATE_PIC_OPERAND_P): Check for SYMBOL_REF before using
- CONSTANT_POOL_ADDRESS_P.
-
- * coff.h (HAS_INIT_SECTION, INVOKE__MAIN): Define.
-
-2002-05-28 David Edelsohn <edelsohn@gnu.org>
- Jeff Law <law@redhat.com>
-
- * optabs.c (expand_binop): Fix nwords sign warnings.
- generate pseudo for add_optab.
-
- * sched-deps.c (sched_analyze): Do not clear SCHED_GROUP_P.
- * haifa-sched.c (move_insn): Clear SCHED_GROUP_P after it is used.
-
-2002-05-28 Marc Espie <espie@openbsd.org>
-
- * config/i386/openbsd.h (HAVE_GAS_MAX_SKIP_P2ALIGN): Remove,
- inherited from gas.h.
- (ASM_QUAD): Undef. OpenBSD does not support it.
-
-2002-05-28 Danny Smith <dannysmith@users.sourceforge.net>
-
- * doc/install.texi (binaries): Change mingw binaries
- link to www.mingw.org.
-
-2002-05-28 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * cfgloop.c (flow_loops_cfg_dump): Use bb->index, not i.
-
-2002-05-28 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_compute_frame_layout): Do not add
- bottom alignment for leaf functions.
-
-2002-05-28 Zack Weinberg <zack@codesourcery.com>
-
- * config/pa/milli32.S, config/pa/lib1funcs.asm,
- config/sparc/sol2-g1.asm: Delete unused files.
-
-2002-05-28 Richard Henderson <rth@redhat.com>
-
- * cfg.c (dump_flow_info): Print bb->index, not i, for block number.
-
- * flow.c (calculate_global_regs_live): Rename call_used to
- invalidated_by_call. Initialize from regs_invalidated_by_call
- instead of call_used_regs.
-
- * varasm.c (default_binds_local_p): Check TREE_PUBLIC before
- DECL_EXTERNAL.
-
-2002-05-28 Zack Weinberg <zack@codesourcery.com>
-
- * tree.h: Don't include real.h.
- Forward-declare struct realvaluetype.
- (struct tree_real_cst): Point to the REAL_VALUE_TYPE, do not
- contain it.
- (TREE_REAL_CST_PTR): New accessor.
- (TREE_REAL_CST): Update.
- * real.h: Include machmode.h.
- (realvaluetype): Make it struct realvaluetype, not a typedef.
- (build_real): Prototype here.
-
- * tree.c: Include real.h.
- (build_real): Allocate the REAL_VALUE_TYPE as a separate
- object in GC memory, set TREE_REAL_CST_PTR to point to it.
- (build_real_from_int_cst): Use build_real.
- * ggc-common.c (ggc_mark_trees): Mark TREE_REAL_CST_PTR of a
- REAL_CST.
-
- * builtins.c, c-common.c, c-lex.c, dwarf2out.c, expr.c,
- fold-const.c, print-tree.c, real.c: Include real.h.
- * Makefile.in: Update dependency lists.
-
-2002-05-28 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * basic-block.h (last_basic_block): Declare.
- (expunge_block_nocompact): Declaration removed.
- (compact_blocks): Declare.
- * cfg.c (last_basic_block): New variable.
- (expunge_block_nocompact): Removed.
- (expunge_block): Do not compact basic blocks.
- (compact_blocks): New.
- * cfganal.c (flow_call_edges_add): Use the fact that bb indices no
- longer change.
- * cfgbuild.c (find_basic_blocks_1, find_basic_blocks): Set
- last_basic_block.
- * cfgcleanup.c (merge_blocks_move_predecessor_nojumps): Do not change
- real positions of blocks.
- (delete_unreachable_blocks): Simplified -- quadratic behavior now
- cannot occur.
- (cleanup_cfg): Compact blocks.
- * cfgrtl.c (create_basic_block): Insert basic blocks to the end of
- basic_block_info varray.
- (flow_delete_block): Comment update.
- (back_edge_of_syntactic_loop_p): Modify position check code.
- (verify_flow_info): Update checking.
- * flow.c (calculate_global_regs_live): Use FOR_EACH_BB.
- * ifcvt.c (SET_ORIG_INDEX, ORIG_INDEX): Removed.
- (find_if_case_1, find_if_case_2, if_convert): Use the fact that bb
- indices no longer change.
- * lcm.c (optimize_mode_switching): Replace n_basic_blocks with
- last_basic_block.
- * predict.c (estimate_bb_frequencies): Remove unneccessary code.
- * profile.c (branch_prob): Compact blocks.
- * sched-rgn.c (find_rgns): Replace n_basic_blocks with
- last_basic_block.
-
-2002-05-28 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/h8300.md (two anonymous patterns): New.
-
-2002-05-28 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.md (cpu): Tidy.
- (type): Delete 'return', add 'ialuX', 'flushw', 'iflush', and
- 'trap'.
- (in_call_delay): Delete reference to 'return' type.
- (eligible_for_return_delay, in_return_delay, define_delay
- referencing those): Delete.
- (rest of file): Use new type attributes as appropriate.
- * config/sparc/sparc-protos.h (eligible_for_return_delay): Delete.
- * config/sparc/sparc.c (eligible_for_return_delay): Likewise.
- * config/sparc/ultra1_2.md (us1_single): New reservation.
- (us1_ialuX): Likewise.
- * config/sparc/ultra3.md (us3_single): Likewise.
- (us3_ialuX): Likewise.
- (us3_imul, us3_idiv): Tweak.
-
-2002-05-28 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (alpha_in_small_data_p): Return false for
- STRING_CST.
-
-2002-05-28 Richard Henderson <rth@redhat.com>
-
- * config.gcc: Obsolete mn10200.
-
-2002-05-28 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppexp.c (interpret_number): Optimize for single-digit
- and less-than-half-precision cases.
- (num_trim, num_positive, num_div_op): Cast constants.
-
-2002-05-27 Bo Thorsen <bo@suse.de>
-
- * config/i386/libgcc-x86_64-glibc.ver: Copy this file from the
- 3.1 branch. The file was made by Jakub Jelinek.
- * config/i386/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Add i386
- support so multilib doesn't break. And don't define this at all
- when -Dinhibit_libc is used.
- (MULTILIB_DEFAULTS): Always set default to 64 bit compilation.
- * config/i386/t-linux64: Implement full multilib support. Patch
- originally done by Andreas Jaeger and Jakub Jelinek.
-
-2002-05-27 Roger Sayle <roger@eyesopen.com>
-
- * c-common.c: Add support for __attribute__((nothrow)) to specify
- that a function cannot throw an exception (using TREE_NOTHROW).
- (handle_nothrow_attribute): New function to process this attribute.
-
- * doc/extend.texi: Document the new nothrow function attribute.
-
-2002-05-27 H.J. Lu (hjl@gnu.org)
-
- * cppexp.c (num_trim): Use 1UL instead of 1 for long int.
- (num_positive): Likewise.
- (num_div_op): Likewise.
-
-2002-05-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_common_init): Always use intmax_t.
-
-2002-05-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_common_init): Use intmax_t for now.
-
-2002-05-24 Andrew Haley <aph@redhat.com>
-
- * fold-const.c (fold): Don't convert (T)(x & c) into (T)x & (T)c
- if T is a boolean type.
-
-2002-05-27 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * basic-block.h (last_basic_block): Defined as synonym for
- n_basic_blocks.
- * cfganal.c (mark_dfs_back_edges, flow_reverse_top_sort_order_compute,
- flow_depth_first_order_compute, flow_preorder_transversal_compute,
- flow_dfs_compute_reverse_init): Replaced relevant occurences of
- n_basic_blocks with last_basic_block.
- * cfgbuild.c (make_edges): Likewise.
- * cfgloop.c (flow_loop_scan, flow_loops_find): Likewise.
- * cfgrtl.c (verify_flow_info, purge_all_dead_edges): Likewise.
- * combine.c (combine_instructions): Likewise.
- * df.c (df_alloc, df_analyse_1, df_analyse, iterative_dataflow_sbitmap,
- iterative_dataflow_bitmap): Likewise.
- * dominance.c (init_dom_info, calc_dfs_tree_nonrec, calc_dfs_tree,
- calc_idoms, idoms_to_doms): Likewise.
- * flow.c (update_life_info_in_dirty_blocks, free_basic_block_vars):
- Likewise.
- * gcse.c (gcse_main, alloc_gcse_mem, compute_local_properties,
- compute_hash_table, expr_reaches_here_p, one_classic_gcse_pass,
- one_cprop_pass, compute_pre_data, pre_expr_reaches_here_p,
- one_pre_gcse_pass, compute_transpout, delete_null_pointer_checks_1,
- delete_null_pointer_checks, compute_code_hoist_vbeinout,
- hoist_expr_reaches_here_p, hoist_code, one_code_hoisting_pass,
- compute_store_table, build_store_vectors): Likewise.
- * haifa-sched.c (sched_init): Likewise.
- * ifcvt.c (if_convert): Likewise.
- * lcm.c (compute_antinout_edge, compute_laterin, compute_insert_delete,
- pre_edge_lcm, compute_available, compute_nearerout,
- compute_rev_insert_delete, pre_edge_rev_lcm, optimize_mode_switching):
- Likewise.
- * predict.c (estimate_probability, process_note_prediction,
- note_prediction_to_br_prob): Likewise.
- * profile.c (GCOV_INDEX_TO_BB, BB_TO_GCOV_INDEX): Likewise.
- * recog.c (split_all_insns, peephole2_optimize): Likewise.
- * regrename.c (copyprop_hardreg_forward): Likewise.
- * resource.c (init_resource_info): Likewise.
- * sched-rgn.c (build_control_flow, find_rgns, compute_trg_info,
- init_regions, schedule_insns): Likewise.
- * ssa-ccp.c (ssa_const_prop): Likewise.
- * ssa-dce.c (ssa_eliminate_dead_code): Likewise.
- * ssa.c (compute_dominance_frontiers,
- compute_iterated_dominance_frontiers, convert_to_ssa): Likewise.
-
- * df.c (df_refs_unlink): Fix FOR_EACH_BB usage (in #if 0'ed code)
- * gcse.c (alloc_rd_mem, alloc_avail_expr_mem): Use n_blocks for vector
- sizes consistently.
-
-Mon May 27 14:28:12 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (can_hoist_p, hoist_insn_after, hoist_insn_to_edge):
- new.
- * rtlanal.c (hoist_test_store, can_hoist_insn_p, hoist_update_store,
- hoist_insn_after, hoist_insn_to_edge): New.
-
-Mon May 27 12:14:02 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (PEOP_SCAN_DEAD_STORES): New.
- (PROP_FINAL): Include.
- * flow.c (life_analysis, update_life_info,
- init_propagate_block_info, mark_set_1, mark_used_rgs):
- Support SCAN_DEAD_STORE.
-
-2002-05-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_common_init): Set CPP arithmetic precision.
- * cppexp.c (cpp_num_part): Move typedef ...
- * cpphash.h: ...here; make unsigned HOST_WIDE_INT.
- * cppinit.c (cpp_create_reader): Default to host long arithmetic.
- (sanity_checks): Update.
-
-2002-05-26 Geoffrey Keating <geoffk@redhat.com>
-
- * Makefile.in (INSTALL_HEADERS): Add 'install-mkheaders'.
- (mkheaders): New rule.
- (install-mkheaders): New rule.
- * configure.in (all_outputs): Add mkheaders.
- * configure: Regenerate.
- * mkheaders.in: New file.
-
-2002-05-26 Jakub Jelinek <jakub@redhat.com>
-
- * cse.c (fold_rtx): Don't optimize if SUBREG changes mode class.
-
-2002-05-26 Andreas Jaeger <aj@suse.de>
-
- * cfg.c (dump_flow_info): Remove extra argument to fprintf.
-
-2002-05-26 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppexp.c (possible_sum_sign, integer_overflow, left_shift,
- right_shift): Remove.
- (cpp_num, cpp_num_part, PART_PRECISION, HALF_MASK, LOW_PART,
- HIGH_PART): New.
- (struct op): Use cpp_num.
- (num_zerop, num_eq, num_positive, num_greater_freq, num_trim,
- num_part_mul, num_unary_op, num_binary_op, num_negate,
- num_bitwise_op, num_inequality_op, num_equality_op, num_mul,
- num_div_op, num_lshift, num_rshift, append_digit): New.
- (interpret_number, parse_defined, eval_token, reduce): Update
- for two-integer arithmetic.
- (binary_handler): New typedef.
- (optab): Update.
- (COMPARE, EQUALITY, BITWISE, MINMAX, UNARY, SHIFT): Delete.
- (_cpp_parse_expr, reduce): Update to handle two-integers.
- * cpplib.c (_cpp_test_assertion): Back up on CPP_EOF.
-
-2002-05-26 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr-protos.h (avr_out_sbxx_branch): Declare.
- * config/avr/avr.c (jump_over_one_insn_p): Take length of the
- branch insn into account, do not assume 1.
- (avr_out_sbxx_branch): New function. Optimize cases of skipping
- over single word insn. Handle upper half of I/O space too.
- * config/avr/avr.md (*sbrx_branch): Use it.
- (*sbrx_and_branchhi, *sbrx_and_branchsi): Likewise.
- (*sbix_branch, *sbix_branch_bit7): Likewise.
- (*sbix_branch_tmp, *sbix_branch_tmp_bit7): New.
- Use RTL peepholes to optimize register operand sign tests.
-
-2002-05-26 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_asm_only_p): New variable.
- (avr_override_options): Set it here if AVR1.
- (asm_file_start): Test it here, report an error if set.
-
-2002-05-26 Kazu Hirata <kazu@cs.umass.edu>
-
- * alias.c: Fix formatting.
- * attribs.c: Likewise.
- * bb-reorder.c: Likewise.
- * bitmap.c: Likewise.
- * bitmap.h: Likewise.
- * builtins.c: Likewise.
-
-Sun May 26 14:00:44 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * reload.c (find_valid_class): Accept new argument DEST,
- choose class accordingly.
- (push_reload): Update callers.
-
-2002-05-26 Andreas Jaeger <aj@suse.de>
-
- * combine.c (combine_instructions): Do not indent #if for
- traditional C.
-
-2002-05-25 Richard Henderson <rth@redhat.com>
-
- * c-pragma.c (apply_pragma_weak): Convert value identifier to
- string for decl_attributes.
- (handle_pragma_weak): Call assemble_alias if we're modifying
- an existing decl.
-
-2002-05-25 Richard Henderson <rth@redhat.com>
-
- PR target/6788
- * config/sparc/sparc.c (sparc_output_mi_thunk): New implementation
- using rtl instead of fprintf.
- * config/sparc/sparc.h (ASM_OUTPUT_MI_THUNK): Use it.
- * config/sparc/sparc-protos.h: Update.
-
-2002-05-25 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (C_COMMON_H): Fix.
- Update other targets.
- * c-common.c: Don't include c-lex.h.
- (builtin_define_with_value): Make static and prototype.
- (builtin_define_std): Move from c-lex.h.
- * c-common.h (init_c_lex): Move from c-lex.h.
- * c-decl.c: Don't include c-lex.h.
- (make_pointer_declarator): Move from c-parse.in.
- * c-lex.c: Don't include c-lex.h.
- * c-lex.h: Remove.
- * c-parse.in: Don't include c-lex.h; include c-pragma.h.
- (make_pointer_declarator): Move to c-decl.c.
- * c-pragma.c: Don't include c-lex.h.
- * c-pragma.h (yydebug, YYDEBUG, parse_in, c_lex): Move from c-lex.h.
- * c-tree.h (make_pointer_declarator): New.
-doc:
- * passes.texi, tm.texi: Update.
-objc:
- * Make-lang.in: Update and correct.
- * objc-act.c: Don't include c-lex.h or cpplib.h.
-treelang:
- * treetree.c: Don't include c-lex.h.
-config:
- * darwin-c.c: Don't include c-lex.h.
- * c4x/c4x-c.c: Don't include c-lex.h.
- * c4x/t-c4x: Update.
- * i370/i370-c.c: Don't include c-lex.h.
- * i370/t-i370: Update.
- * i960/i960-c.c: Don't include c-lex.h.
- * i960/i960.c: Don't include cpplib.h, c-lex.h or c-pragma.h.
- * i960/t-960bare: Update.
- * i960/t-vxworks: Update.
- * rs6000/rs6000-c.c: Don't include c-lex.h; include c-pragma.h.
- * rs6000/t-darwin: Update.
- * rs6000/t-rs6000-c-rule: Update.
- * v850/v850-c.c: Don't include c-lex.h.
- * v850/v850.c: Don't include c-lex.h or cpplib.h.
-
-
-2002-05-25 Kazu Hirata <kazu@cs.umass.edu>
-
- * tree.def: Fix typos.
- * doc/install.texi: Likewise.
-
-2002-05-25 Richard Henderson <rth@redhat.com>
-
- * configure.in (HAVE_AS_TLS): Add ia64 test.
- * configure: Rebuild.
- * config/ia64/ia64.c (ia64_tls_size_string, ia64_tls_size): New.
- (override_options): Set it.
- (TARGET_HAVE_TLS): New.
- (sdata_symbolic_operand): Look for 's'.
- (tls_symbolic_operand): New.
- (ia64_expand_load_address): Abort for tls symbols.
- (gen_tls_get_addr): New.
- (gen_thread_pointer): New.
- (ia64_expand_move): Split out from movdi. Handle tls symbols.
- (rtx_needs_barrier): Add new unspecs.
- (ia64_encode_section_info): Handle tls symbols.
- (ia64_strip_name_encoding): Strip two encoding chars.
- * config/ia64/ia64.h (ia64_tls_size, ia64_tls_size_string): New.
- (TARGET_TLS14, TARGET_TLS22, TARGET_TLS64): New.
- (TARGET_OPTIONS): Add tls-size.
- (ENCODE_SECTION_INFO_CHAR): Rename from SDATA_NAME_FLAG_CHAR.
- * config/ia64/ia64.md (UNSPEC_LTOFF_DTPMOD, UNSPEC_LTOFF_DTPREL,
- UNSPEC_DTPREL, UNSPEC_LTOFF_TPREL, UNSPEC_TPREL, UNSPEC_LD_BASE): New.
- (movqi, movhi, movsi, movdi, movti): Use ia64_expand_move.
- (movsf, movdf): Likewise.
- (movdi_symbolic): Use match_scratch. Don't split if we won't
- have a scratch availiable.
- (load_ltoff_dtpmod, load_dtprel, load_dtprel64, load_dtprel22,
- add_dtprel, add_dtprel14, add_dtprel22, load_ltoff_tprel, load_tprel,
- load_tprel64, load_tprel22, add_tprel, add_tprel14, add_tprel22): New.
- * config/ia64/ia64-protos.h: Update.
- * config/ia64/sysv4.h (ASM_OUTPUT_ALIGNED_DECL_LOCAL): Use
- sdata_symbolic_operand.
- (ASM_OUTPUT_LABELREF): Strip two characters.
-
-2002-05-25 Kazu Hirata <kazu@cs.umass.edu>
-
- * combine.c (simplify_set): Remove an unnecessary subreg.
-
-2002-05-25 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_handle_progmem_attribute): Handle TYPE_DECL.
-
- * config/avr/avr.h (BSS_SECTION_ASM_OP, ASM_OUTPUT_BSS): New.
-
-2002-05-25 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * toplev.c (output_clean_symbol_name): Fix another thinko. Gosh.
-
-2002-05-25 Roger Sayle <roger@eyesopen.com>
-
- * simplify-rtx.c (simplify_gen_relational): Simplify the RTX
- (cond (compare x y) 0) into the equivalent (cond x y).
-
-2002-05-25 Gabriel Dos Reis <gdr@codesourcery.com>
-
- * toplev.c (output_clean_symbol_name): Use xstrdup. Fix thinko.
-
-2002-05-24 Zack Weinberg <zack@codesourcery.com>
-
- * config.gcc: Remove all stanzas for previously obsoleted
- systems. Where necessary, add explicit error stanzas to
- prevent removed systems from being misidentified as something
- else. Begin a fresh obsoletions list, with the systems that
- were reprieved last round.
- * doc/install.texi: Remove all mention of dead targets.
- * fixinc/mkfixinc.sh: Likewise.
-
- * config/arm/arm.h: Bit 31 of target_flags is no longer
- reserved.
-
- * config/1750a/1750a-protos.h, config/1750a/1750a.c,
- config/1750a/1750a.h, config/1750a/1750a.md, config/1750a/ms1750.inc,
- config/a29k/a29k-protos.h, config/a29k/a29k.c, config/a29k/a29k.h,
- config/a29k/a29k.md, config/a29k/rtems.h, config/a29k/t-a29kbare,
- config/a29k/t-vx29k, config/a29k/unix.h, config/a29k/vx29k.h,
- config/alpha/osf12.h, config/alpha/osf2or3.h,
- config/arm/arm-wince-pe.h, config/arm/arm.h, config/arm/riscix.h,
- config/arm/riscix1-1.h, config/arm/rix-gas.h, config/arm/t-riscix,
- config/clipper/clipper-protos.h, config/clipper/clipper.c,
- config/clipper/clipper.h, config/clipper/clipper.md,
- config/clipper/clix.h, config/convex/convex-protos.h,
- config/convex/convex.c, config/convex/convex.h,
- config/convex/convex.md, config/convex/fixinc.convex,
- config/convex/proto.h, config/elxsi/elxsi-protos.h,
- config/elxsi/elxsi.c, config/elxsi/elxsi.h, config/elxsi/elxsi.md,
- config/i386/386bsd.h, config/i386/aix386.h, config/i386/aix386ng.h,
- config/i386/bsd386.h, config/i386/dgux.h, config/i386/djgpp-rtems.h,
- config/i386/isc.h, config/i386/iscdbx.h, config/i386/linux-oldld.h,
- config/i386/next.h, config/i386/osf1-ci.asm, config/i386/osf1-cn.asm,
- config/i386/osf1elf.h, config/i386/osf1elfgdb.h, config/i386/osfelf.h,
- config/i386/osfrose.h, config/i386/rtems.h, config/i386/seq-gas.h,
- config/i386/seq-sysv3.h, config/i386/seq2-sysv3.h,
- config/i386/sequent.h, config/i386/sun.h, config/i386/sun386.h,
- config/i386/t-dgux, config/i386/t-next, config/i386/t-osf,
- config/i386/t-osf1elf, config/i860/bsd-gas.h, config/i860/bsd.h,
- config/i860/fx2800.h, config/i860/i860-protos.h, config/i860/i860.c,
- config/i860/i860.h, config/i860/i860.md, config/i860/mach.h,
- config/i860/paragon.h, config/i860/sysv3.h, config/i860/sysv4.h,
- config/i860/t-fx2800, config/i860/varargs.asm, config/m68k/a-ux.h,
- config/m68k/altos3068.h, config/m68k/apollo68.h,
- config/m68k/aux-crt1.c, config/m68k/aux-crt2.asm,
- config/m68k/aux-crtn.asm, config/m68k/aux-exit.c,
- config/m68k/aux-low.gld, config/m68k/aux-mcount.c,
- config/m68k/auxas.h, config/m68k/auxgas.h, config/m68k/auxgld.h,
- config/m68k/auxld.h, config/m68k/ctix.h, config/m68k/dpx2.h,
- config/m68k/dpx2.ifile, config/m68k/dpx2cdbx.h, config/m68k/dpx2g.h,
- config/m68k/isi-nfp.h, config/m68k/isi.h, config/m68k/lynx-ng.h,
- config/m68k/lynx.h, config/m68k/math-3300.h, config/m68k/news.h,
- config/m68k/news3.h, config/m68k/news3gas.h, config/m68k/newsgas.h,
- config/m68k/next.h, config/m68k/next21.h, config/m68k/rtems.h,
- config/m68k/t-aux, config/m68k/t-lynx, config/m68k/t-next,
- config/m68k/x-next, config/m88k/dgux.h, config/m88k/dgux.ld,
- config/m88k/dguxbcs.h, config/m88k/dolph.h, config/m88k/dolphin.ld,
- config/m88k/luna.h, config/m88k/m88k-coff.h, config/m88k/sysv3.h,
- config/m88k/t-bug, config/m88k/t-dgux, config/m88k/t-dgux-gas,
- config/m88k/t-dguxbcs, config/m88k/t-dolph, config/m88k/t-m88k-gas,
- config/m88k/t-tekXD88, config/m88k/tekXD88.h, config/m88k/tekXD88.ld,
- config/mips/bsd-4.h, config/mips/bsd-5.h, config/mips/dec-bsd.h,
- config/mips/dec-osf1.h, config/mips/elflorion.h,
- config/mips/iris4loser.h, config/mips/mips-5.h, config/mips/news4.h,
- config/mips/news5.h, config/mips/nws3250v4.h, config/mips/osfrose.h,
- config/mips/svr3-4.h, config/mips/svr3-5.h, config/mips/svr4-4.h,
- config/mips/svr4-5.h, config/mips/svr4-t.h, config/mips/t-bsd,
- config/mips/t-bsd-gas, config/mips/t-svr3, config/mips/t-svr3-gas,
- config/mips/t-svr4, config/mips/t-svr4-gas, config/mips/t-ultrix,
- config/mips/ultrix.h, config/nextstep-protos.h, config/nextstep.c,
- config/nextstep.h, config/nextstep21.h, config/ns32k/encore.h,
- config/ns32k/merlin.h, config/ns32k/pc532-mach.h,
- config/ns32k/pc532-min.h, config/ns32k/pc532.h,
- config/ns32k/sequent.h, config/ns32k/tek6000.h,
- config/ns32k/tek6100.h, config/ns32k/tek6200.h, config/pj/lib1funcs.S,
- config/pj/linux.h, config/pj/pj-protos.h, config/pj/pj.c,
- config/pj/pj.h, config/pj/pj.md, config/pj/pjl.h, config/pj/t-pj,
- config/sparc/rtems.h, config/we32k/we32k-protos.h,
- config/we32k/we32k.c, config/we32k/we32k.h, config/we32k/we32k.md:
- Delete file.
-
-2002-05-24 Richard Henderson <rth@redhat.com>
-
- * flags.h (TLS_MODEL_GLOBAL_DYNAMIC): Set to 1.
- * toplev.c (flag_tls_default) Set to TLS_MODEL_GLOBAL_DYNAMIC.
- * config/i386/i386.c (tls_model_chars): Add leading space.
- (tls_symbolic_operand): Don't bias by 1.
- (legitimize_address): Don't unbias by 1.
-
-2002-05-24 Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com>
-
- * lcm.c (optimize_mode_switching): Change bb used as indices
- to bb->index.
-
-2002-05-24 Richard Henderson <rth@redhat.com>
-
- * config/ia64/ia64.c (ia64_reorg): Use update_life_info instead
- of update_life_info_in_dirty_blocks.
-
-2002-05-24 Jakub Jelinek <jakub@redhat.com>
-
- PR other/6782
- * final.c (get_mem_expr_from_op): Return 0 if op is NULL.
-
-2002-05-24 Neil Booth <neil@daikokuya.demon.co.uk>
-
- PR preprocessor/6780
- * cppmacro.c (enter_macro_context): Clear state.angled_headers.
-
-2002-05-24 Jim Blandy <jimb@redhat.com>
-
- * dwarf2out.c (dwarf2out_finish): Don't forget to emit a final
- entry with a type code of zero, marking the end of the compilation
- unit's macro info.
-
-2002-05-24 Richard Henderson <rth@redhat.com>
-
- * varasm.c (asm_output_bss): Always output one byte.
- * config/alpha/elf.h (ASM_OUTPUT_ALIGNED_LOCAL): Likewise.
-
-2002-05-24 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
-
- * tree.c (decl_type_context): Return NULL_TREE if decl's context is a
- namespace.
-
-2002-05-24 Andreas Jaeger <aj@suse.de>
-
- * ggc-page.c (alloc_page): Cast variables of type size_t to
- unsigned long, adjust printf format string.
- (ggc_alloc): Likewise.
- (ggc_print_statistics): Likewise.
- (ggc_print_statistics): Correct printf format string for SCALE to
- use unsigned long.
-
-2002-05-24 Danny Smith <dannysmith@users.sourceforge.net>
-
- * config/i386/mingw32.h (CPP_SPEC): Remove -remap.
-
-2002-05-23 Gabriel Dos Reis <gdr@codesourcery.com>
- Zack Weinberg <zack@codesourcery.com>
-
- * config/i386/mingw32.h (OUTPUT_QUOTED_STRING): Properly output
- quoted strings.
- * dwarf2out.c (lookup_filename): Properly quote filename in .file
- directive in assembly file.
- * config/m68k/dpx2.h (ASM_OUTPUT_SOURCE_FILENAME): Likewise.
- * config/m88k/m88k.h (ASM_OUTPUT_SOURCE_FILENAME): Likewise.
- * config/pj/pj.h (ASM_FILE_START): Likewise.
- * config/rs6000/xcoff.h (ASM_FILE_START): Likewise.
- * config/avr/avr.c (asm_file_end): Likewise.
- * toplev.c (output_quoted_string): Handle possibly signed plain
- char.
- * toplev.h (output_clean_symbol_name): Declare
- * toplev.c (output_clean_symbol_name): Define.
- * config/alpha/alpha.c (unicosmk_output_module_name): Use it.
- * config/1750a/1750a.h (ASM_FILE_START): Likewise.
-
-2002-05-24 Alan Modra <amodra@bigpond.net.au>
-
- * config/rs6000/rs6000.c (output_toc): Mask longs to 32 bits.
-
-2002-05-23 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (reserv_sets_hash_value): Use shift equal to 3/4
- of size of unsigned.
-
-2002-05-23 Richard Henderson <rth@redhat.com>
-
- * configure.in (HAVE_AS_TLS): New test.
- * config.in, configure: Rebuild.
- * config/i386/i386.c (TARGET_HAVE_TLS): Set if HAVE_AS_TLS.
- (ix86_tls_dialect_string, ix86_tls_dialect): New.
- (override_options): Set it.
- (tls_model_chars, tls_symbolic_operand): New.
- (tls_symbolic_operand_1, global_dynamic_symbolic_operand): New.
- (local_dynamic_symbolic_operand, initial_exec_symbolic_operand): New.
- (local_exec_symbolic_operand): New.
- (get_pic_label_name): Merge into output_set_got.
- (ix86_asm_file_end): Emit pic_label_name if defined.
- (legitimate_constant_p, constant_address_p): New.
- (legitimate_pic_operand_p): New.
- (legitimate_pic_address_disp_p): Handle GOTTPOFF, NTPOFF, DTPOFF.
- (legitimate_address_p): Likewise.
- (ix86_encode_section_info): Rename from i386_; handle tls decls.
- (ix86_strip_name_encoding): New.
- (get_thread_pointer): New.
- (legitimize_address): Handle tls symbols.
- (output_pic_addr_const): Handle GOTTPOFF, TPOFF, NTPOFF, DTPOFF.
- Remove UNSPEC_PLT.
- (struct machine_function): Add some_ld_name.
- (get_some_local_dynamic_name, get_some_local_dynamic_name_1): Set it.
- (print_operand) [&]: Use it. Handle UNSPEC_TP.
- (output_addr_const_extra): New.
- (maybe_get_pool_constant): New.
- (ix86_split_to_parts): Use it.
- (ix86_expand_move): Handle tls symbols.
- (ix86_tls_get_addr): New.
- * config/i386/i386.h (TARGET_GNU_TLS, TARGET_SUN_TLS): New.
- (TARGET_OPTIONS): Add tls-dialect.
- (CONSTANT_ADDRESS_P): Use new out-of-line function.
- (LEGITIMATE_CONSTANT_P): Likewise.
- (LEGITIMATE_PIC_OPERAND_P): Likewise.
- (TARGET_STRIP_NAME_ENCODING): New.
- (ASM_OUTPUT_LABELREF): New.
- (PRINT_OPERAND_PUNCT_VALID_P): Add '&'.
- (OUTPUT_ADDR_CONST_EXTRA): New.
- (PREDICATE_CODES): Update.
- (ix86_tls_dialect, ix86_tls_dialect_string): New.
- * config/i386/i386.md: Regroup and renumber unspec constants.
- (tls_global_dynamic_gnu, tls_global_dynamic_sun): New.
- (tls_local_dynamic_base_gnu, tls_local_dynamic_base_sun): New.
- (tls_global_dynamic, tls_local_dynamic_base): New.
- (tls_local_dynamic_once): New.
- * config/i386/i386-protos.h: Update.
-
-2002-05-23 Richard Henderson <rth@redhat.com>
-
- * genemit.c (gen_insn): Print file:lineno comment before function.
- (main): likewise.
- * gensupport.c (struct queue_elem): Add filename member.
- (queue_pattern): Initialize it; update all callers.
- (process_include): Don't free filename.
- (read_md_rtx): Set read_rtx_filename.
-
-2002-05-23 Hans Boehm <Hans_Boehm@hp.com>
-
- * config/ia64/linux.h (IA64_GATE_AREA_END): Adjust for 64K pages.
-
-2002-05-23 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (output_set_got): Fix typo in pic no-deep case.
-
-2002-05-23 Richard Henderson <rth@redhat.com>
-
- * doc/extend.texi (C++98 Thread-Local Edits): Update with
- commentary from Mark.
-
-2002-05-23 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * bb-reorder.c (make_reorder_chain, make_reorder_chain_1):
- Use FOR_EACH_BB macros to iterate over basic block chain.
- * cfg.c (clear_edges, clear_bb_flags, dump_flow_info,
- alloc_aux_for_blocks, clear_aux_for_blocks, alloc_aux_for_edges):
- Likewise.
- * cfganal.c (set_edge_can_fallthru_flag, flow_call_edges_add,
- find_unreachable_blocks, create_edge_list, verify_edge_list,
- remove_fake_edges, add_noreturn_fake_exit_edges,
- flow_preorder_transversal_compute, flow_dfs_compute_reverse_execute):
- Likewise.
- * cfgbuild.c (make_edges, find_basic_blocks, find_many_sub_basic_blocks,
- find_sub_basic_blocks): Likewise.
- * cfgcleanup.c (try_optimize_cfg, delete_unreachable_blocks):
- Likewise.
- * cfglayout.c (record_effective_endpoints, cleanup_unconditional_jumps):
- Likewise.
- * cfgloop.c (flow_loops_cfg_dump, flow_loops_find):
- Likewise.
- * cfgrtl.c (compute_bb_for_insn, tidy_fallthru_edges,
- commit_edge_insertions, commit_edge_insertions_watch_calls,
- print_rtl_with_bb, verify_flow_info, purge_all_dead_edges): Likewise.
- * combine.c (combine_instructions, reg_dead_at_p): Likewise.
- * conflict.c (conflict_graph_compute): Likewise.
- * df.c (df_bitmaps_alloc, df_bitmaps_free, df_alloc, df_analyse_1,
- df_modified_p, df_refs_unlink, df_dump): Likewise.
- * dominance.c (calc_dfs_tree, calculate_dominance_info): Likewise.
- * final.c (compute_alignments): Likewise.
- * flow.c (update_life_info, update_life_info_in_dirty_blocks,
- delete_noop_moves, calculate_global_regs_live, allocate_bb_life_data,
- count_or_remove_death_notes): Likewise.
- * gcse.c (oprs_unchanged_p, record_last_reg_set_info,
- compute_hash_table, compute_kill_rd, compute_rd, compute_ae_kill,
- classic_gcse, compute_transp, cprop, compute_pre_data,
- compute_transpout, invalidate_nonnull_info,
- delete_null_pointer_checks_1, delete_null_pointer_checks,
- compute_code_hoist_vbeinout, hoist_code, compute_ld_motion_mems,
- compute_store_table, build_store_vectors, store_motion): Likewise.
- * global.c (global_conflicts, mark_elimination): Likewise.
- * graph.c (print_rtl_graph_with_bb): Likewise.
- * haifa-sched.c (sched_init): Likewise.
- * ifcvt.c (if_convert): Likewise.
- * lcm.c (compute_antinout_edge, compute_laterin, compute_insert_delete,
- compute_available, compute_nearerout, compute_rev_insert_delete,
- optimize_mode_switching): Likewise.
- * local-alloc.c (local_alloc, update_equiv_regs): Likewise.
- * predict.c (estimate_probability, note_prediction_to_br_prob,
- propagate_freq, counts_to_freqs, expensive_function_p,
- estimate_bb_frequencies): Likewise.
- * profile.c (instrument_edges, get_exec_counts,
- compute_branch_probabilities, compute_checksum, branch_prob,
- find_spanning_tree): Likewise.
- * recog.c (split_all_insns, peephole2_optimize): Likewise.
- * reg-stack.c (reg_to_stack, convert_regs_entry, convert_regs):
- Likewise.
- * regclass.c (scan_one_insn, regclass): Likewise.
- * regmove.c (mark_flags_life_zones, regmove_optimize,
- record_stack_memrefs): Likewise.
- * regrename.c (regrename_optimize, copyprop_hardreg_forward): Likewise.
- * reload1.c (reload, reload_combine, fixup_abnormal_edges): Likewise.
- * resource.c (find_basic_block): Likewise.
- * sched-ebb.c (schedule_ebbs): Likewise.
- * sched-rgn.c (is_cfg_nonregular, build_control_flow,
- find_single_block_region, find_rgns, schedule_insns)
- * sibcall.c (optimize_sibling_and_tail_recursive_call)
- * ssa-ccp.c (optimize_unexecutable_edges,
- ssa_ccp_df_delete_unreachable_insns): Likewise.
- * ssa-dce.c (ssa_eliminate_dead_code): Likewise.
- * ssa.c (find_evaluations, compute_dominance_frontiers_1,
- rename_block, convert_to_ssa, compute_conservative_reg_partition,
- compute_coalesced_reg_partition, rename_equivalent_regs,
- convert_from_ssa): Likewise.
- * config/ia64/ia64.c (emit_predicate_relation_info, process_epilogue,
- process_for_unwind_directive): Likewise.
-
- * df.c (FOR_ALL_BBS): Removed.
- * gcse.c (struct null_pointer_info): Type of current_block field
- changed.
- (struct reg_avail_info): Type of last_bb field changed.
- * config/ia64/ia64.c (block_num): Removed.
- (need_copy_state): Type changed.
- (last_block): New.
-
-2002-05-23 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppinit.c (mark_named_operators): Split out from init_builtins.
- (cpp_finish_options): Call it from here instead.
-
-2002-05-23 Jason Thorpe <thorpej@wasabisystems.com>
-
- * builtin-attrs.def: Update copyright years.
- (ATTR_NONNULL): New attribute identifier.
- (ATTR_NONNULL_1, ATTR_NONNULL_2, ATTR_NONNULL_3): New
- attribute tree lists.
- (DEF_FORMAT_ATTRIBUTE): Chain a nonnull attribute for the
- format operand.
- (ATTR_FORMAT_ARG_1, ATTR_FORMAT_ARG_2): Use...
- (DEF_FORMAT_ARG_ATTRIBUTE): ...this to generate format_arg
- attribute lists. Chain the appropriate nonnull attribute.
- * c-format.c (check_format_arg): Remove null format string
- warning.
- * testsuite/gcc.dg/format/null-1.c: New test.
-
-2002-05-23 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * Makefile.in (ADAC): Define.
- (SYSLIBS): Define.
- (.SUFFIXES): Move before language makefile fragments.
- (STAGE2_FLAGS_TO_PASS): Use stage CC as ADAC.
-
-2002-05-23 Mark Mitchell <mark@codesourcery.com>
-
- * varasm.c (make_decl_rtl): Don't allow weak variables to be
- placed in common.
-
-Thu May 23 19:43:41 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfg.c (dump_flow_info): Print results of
- maybe_hot/probably_never_executed predicates.
- * toplev.c (open_dump_file): Print function frequency.
-
-2002-05-23 David S. Miller <davem@redhat.com>
-
- * cse.c (approx_reg_cost_1, approx_reg_cost): Recode to not use
- regsets.
-
-2002-05-23 Jason Thorpe <thorpej@wasabisystems.com>
-
- * c-common.c (warn_nonnull): Declare.
- (c_common_attribute_table): Add "nonnull" attribute.
- (handle_nonnull_attribute, check_function_nonnull, nonnull_check_p,
- check_nonnull_arg, get_nonnull_operand, check_function_arguments,
- check_function_arguments_recurse): New functions.
- * c-common.h (warn_nonnull): Declare extern.
- (check_function_arguments, check_function_arguments_recurse): New
- prototypes.
- * c-decl.c (c_decode_option): Add -Wnonnull option.
- * c-format.c (set_Wformat): Set warn_nonnull if enabling
- format checking.
- (format_check_context): New structure.
- (check_format_info_recurse): Remove recursion and rename to...
- (check_format_arg): ...this. Update comment.
- (check_format_info): Use check_function_arguments_recurse.
- * c-typeck.c (build_function_call): Call check_function_arguments
- instead of check_function_format.
- * doc/extend.texi: Document "nonnull" attribute.
- * doc/invoke.texi: Docuemnt -Wnonnull option.
- * testsuite/gcc.dg/nonnull-1.c: New test.
- * testsuite/gcc.dg/nonnull-2.c: New test.
-
-2002-05-23 David S. Miller <davem@redhat.com>
-
- * basic-block.h (CLEANUP_NO_INSN_DEL): Define it.
- * cfgcleanup.c (cleanup_cfg): If it is set do not
- attempt to delete trivially dead insns.
- * except.c (finish_eh_generation): Pass it to cleanup_cfg.
- * toplev.c (rest_of_compilation): Document non-trivial aspect
- the RTL before optimize_save_area_alloca is run.
-
-2002-05-23 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-lex.c (indent_level): Remove.
- (cb_file_change, c_lex): Remove indent level handling.
- * c-lex.h (indent_level): Remove.
- * input.h (struct file_stack): Remove indent_level.
- * toplev.c (push_srcloc): Remove indent_level handling.
-
-2002-05-23 Jakub Jelinek <jakub@redhat.com>
-
- PR target/6753
- * config/i386/i386.md (sse_movdfcc, sse_movdfcc_eq): Use Y instead
- of x in constraints for clarity.
- (sse_mov?fcc split): abort if op2 == op3.
- (sse_movsfcc_const0_1, sse_movsfcc_const0_2, sse_movsfcc_const0_3,
- sse_movsfcc_const0_4): Add earlyclobber.
- (sse_movdfcc_const0_1, sse_movdfcc_const0_2, sse_movdfcc_const0_3,
- sse_movdfcc_const0_4): Likewise. Use DFmode, not SFmode.
- Use Y instead of x in constraints.
-
-2002-05-23 Richard Henderson <rth@redhat.com>
-
- * doc/extend.texi (C99 Thread-Local Edits): New subsection.
- (C++98 Thread-Local Edits): New subsection.
-
- * config/i386/i386.c, config/i386/i386.h: Tidy comments and whitespace.
- (ix86_arch): Set type to enum processor_type.
-
- * config/i386/i386.md (movsi_1, movdi_1_rex64): Use
- LEGITIMATE_PIC_OPERAND_P not SYMBOLIC_CONST.
-
-2002-05-23 Jakub Jelinek <jakub@redhat.com>
-
- * configure.in: Fix as version test for binutils 2.12.1 releases
- (without dates).
- * configure: Rebuilt.
-
-2002-05-23 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (get_pic_label_name): New.
- (load_pic_register): Remove.
- (output_set_got): New.
- (ix86_expand_prologue): Use gen_set_got; mark insn REG_MAYBE_DEAD.
- * config/i386/i386.md (UNSPEC_SET_GOT): New.
- (UNSPECV_PROLOGUE_SET_GOT, UNSPECV_PROLOGUE_GET_PC): Remove.
- (prologue_set_got, prologue_get_pc): Remove.
- (set_got, set_got_nopic, set_got_deep, set_got_nodeep): New.
- (builtin_setjmp_receiver): Use gen_set_got.
- * config/i386/i386-protos.h: Update.
-
-Thu May 23 09:22:23 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * gcse.c (hash_expr): Do not use alias set for hashing.
-
-2002-05-22 Kevin Buettner <kevinb@redhat.com>
-
- * dbxout.c (dbxout_class_name_qualifiers): New function.
- (dbxout_symbol): Output class/struct qualifiers for a .stabs entry.
-
-2002-05-23 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpperror.c (_cpp_begin_message): No special casing
- of CPP_FATAL_LIMIT.
- * cppinit.c (sanity_checks): s/DL_FATAL/DL_ICE/.
- (output_deps, cpp_handle_option, cpp_post_options): Use DL_ERROR.
- * cpplib.c (do_include_common): Use DL_ERROR.
- * cpplib.h (CPP_FATAL_LIMIT, CPP_FATAL_ERRORS, DL_FATAL): Remove.
- (DL_ICE): Renumber.
- * fix-header.c (read_scan_file): Update.
-
-2002-05-22 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_expand_call): New function, extracted
- from md call patterns. Add pic_offset_table_rtx to
- CALL_INSN_FUNCTION_USAGE when needed.
- * config/i386/i386.md (call_pop, call): Use ix86_expand_call.
- (call_value_pop, call_value, untyped_call): Likewise.
- (call_exp, call_value_exp): Remove.
- * config/i386/i386-protos.h: Update.
-
-2002-05-22 Richard Henderson <rth@redhat.com>
-
- * varasm.c (default_section_type_flags): Check for VAR_DECL
- before using DECL_THREAD_LOCAL.
-
-2002-05-22 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/aix43.h (LINK_SPEC): Add PE initializer.
- (STARTFILE_SPEC): Delete PE crt0.o.
- * config/rs6000/aix51.h: Same.
- * config/rs6000/rs6000.c: Use TARGET_XCOFF, not OBJECT_FORMAT_COFF.
- * config/rs6000/rs6000.h (ASM_WEAKEN_DECL): Append [DS] to
- function descriptor symbol. Use RS6000_OUTPUT_BASENAME.
- (ASM_OUTPUT_DEF_FROM_DECLS): Use RS6000_OUTPUT_BASENAME.
- * config/rs6000/xcoff.h (ASM_OUTPUT_DEF): Define.
-
-2002-05-22 Richard Henderson <rth@redhat.com>
-
- * varasm.c (default_section_type_flags): Handle tls data and
- default sections.
- (default_unique_section): Handle tls sections.
-
-2002-05-23 Alan Modra <amodra@bigpond.net.au>
-
- * configure.in (CROSS): Define NATIVE_CROSS.
- * configure: Regenerate.
- * gcc.c (STARTFILE_PREFIX_SPEC): Define.
- (startfile_prefix_spec): New var.
- (static_specs): Add startfile_prefix_spec.
- (do_spec_2): Split out from..
- (do_spec): ..here.
- (main): Process startfile_prefix_spec.
- * config/rs6000/linux64.h (LINK_OS_LINUX_SPEC) Change name of
- dynamic linker.
- (STARTFILE_PREFIX_SPEC): Define.
- (STARTFILE_LINUX_SPEC, ENDFILE_LINUX_SPEC): Rewrite without
- absolute paths.
-
-2002-05-22 Kazu Hirata <kazu@cs.umass.edu>
-
- * cpperror.c: Fix formatting.
- * cppexp.c: Likewise.
- * cppfiles.c: Likewise.
- * cpphash.c: Likewise.
- * cpphash.h: Likewise.
- * cppinit.c: Likewise.
- * cpplex.c: Likewise.
- * cpplib.c: Likewise.
- * cppmacro.c: Likewise.
- * cppmain.c: Likewise.
- * cppspec.c: Likewise.
-
-2002-05-22 Jakub Jelinek <jakub@redhat.com>
-
- * combine.c (force_to_mode): Use gen_int_mode.
- Don't clear CONST_INT bits outside of mode.
-
-2002-05-22 Richard Henderson <rth@redhat.com>
-
- * fixinc/inclhack.def (thread_keyword): Match __thread as last arg.
- * fixinc/fixincl.x, fixinc/tests/base/pthread.h: Rebuild.
-
-2002-05-22 Jakub Jelinek <jakub@redhat.com>
-
- PR c/6643
- * emit-rtl.c (widen_memory_access): Only call compare_tree_int
- if DECL_SIZE_UNIT is INTEGER_CST.
-
-2002-05-22 Richard Henderson <rth@redhat.com>
-
- * flow.c (life_analysis): Delete broken reg_label check.
-
-2002-05-22 Richard Henderson <rth@redhat.com>
-
- * fixinc/inclhack.def (thread_keyword): Allow as any prototype arg.
- * fixinc/fixincl.x, fixinc/tests/base/pthread.h: Rebuild.
-
-Wed May 22 18:39:57 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * t-sh (LIB2FUNCS_EXTRA): Now embed-bb.c.
- (embed-bb.c): New rule.
- * t-sh64 (LIB2FUNCS_EXTRA): Don't change.
- * config/sh/embed_bb.c: Delete.
-
-Wed May 22 18:25:29 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * c-common.c (cb_register_builtins): Don't indent '#' of #define.
-
-2002-05-22 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/h8300.md (*andorqi3): New.
-
-2002-05-22 Neil Booth <neil@daikokuya.demon.co.uk>
-
- PR preprocessor/6517
- * Makefile.in: Update.
- * c-common.c (c_common_post_options): Add preprocessor
- errors to the error count.
- * c-lang.c (c_post_options): Kill.
- (LANG_HOOKS_POST_OPTIONS): Use c_common_post_options.
- * hooks.h: Add header guards.
- * langhooks-def.h: Include hooks.h.
- (LANG_HOOKS_POST_OPTIONS): Update.
- * langhooks.h (struct lang_hooks): Update post_options.
- * toplev.c (parse_options_and_default_flags): Update.
-objc:
- * objc-lang.c (objc_post_options): Kill.
- (LANG_HOOKS_POST_OPTIONS): Use c_common_post_options.
-
-2002-05-21 Bruce Korb <bkorb@gnu.org>
-
- * fixinc/tests/base/pthread.h(THREAD_KEYWORD_CHECK): add fix check
- * fixinc/inclhack.def(thread_keyword): use c_fix = format.
- * fixinc/fixincl.x: regen.
-
-2002-05-21 Kazu Hirata <kazu@cs.umass.edu>
-
- * cfgbuild.c: Fix formatting.
- * cfg.c: Likewise.
- * cfgcleanup.c: Likewise.
- * cfglayout.c: Likewise.
- * cfgloop.c: Likewise.
- * cfgrtl.c: Likewise.
-
-2002-05-21 Richard Henderson <rth@redhat.com>
-
- * c-common.h (enum rid): Add RID_THREAD.
- * c-decl.c (start_decl): Do not set DECL_COMMON for tls variables.
- (grokdeclarator): Grok __thread.
- * c-parse.in (reswords): Add __thread.
- (rid_to_yy): Add RID_THREAD.
-
- * tree.h (DECL_THREAD_LOCAL): New.
- (struct tree_decl): Add thread_local_flag.
- * print-tree.c (print_node): Dump DECL_THREAD_LOCAL.
- * tree.c (staticp): TLS variables are not static.
-
- * target-def.h (TARGET_HAVE_TLS): New.
- * target.h (have_tls): New.
- * output.h (SECTION_TLS): New.
- * varasm.c (assemble_variable): TLS variables can't be common for now.
- (default_section_type_flags): Handle .tdata and .tbss.
- (default_elf_asm_named_section): Handle SECTION_TLS.
- (categorize_decl_for_section): Handle DECL_THREAD_LOCAL.
-
- * flags.h (flag_tls_default): Declare.
- * toplev.c (flag_tls_default): Define.
- (display_help): Display help for it.
- (decode_f_option): Set it.
-
- * doc/extend.texi (Thread-Local): New node describing language-level
- thread-local storage.
- * doc/invoke.texi (-ftls-model): Document.
-
- * fixinc/inclhack.def (thread_keyword): New.
- * fixinc/fixincl.x: Rebuild.
-
-2002-05-21 Jeffrey A Law <law@redhat.com>
-
- * optabs.c (expand_binop): For double-word integer multiplies,
- do not compute intermediate results into something that is
- not a register (such as a SUBREG or MEM).
-
- * i386.c (ix86_sched_reorder_ppro): Fix typo/thinko.
- (ix86_sched_reorder): Make sure to initialize scheduling
- data even when there's only one insn in the ready queue.
-
-2002-05-21 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (reserv_sets_hash_value): Fix a typo.
-
-2002-05-21 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (reserv_sets_hash_value): Define hash_value as
- set_el_t. Transform the hash value into unsigned.
- (output_cycle_reservs): Fix bug with output of repeated `nothing'.
- (transform_3): Add code to process `(A,B)+(D,E)'.
-
-2002-05-21 NIIBE Yutaka <gniibe@m17n.org>
-
- * reload1.c (do_output_reload): Run delete_output_reload
- only if optimizing.
-
-2002-05-21 Roger Sayle <roger@eyesopen.com>
-
- PR middle-end/6600
- * expr.c (STORE_MAX_PIECES): New macro to avoid immediate constants
- larger than INTEGER_CST. (store_by_pieces_1): Use it here...
- (can_store_by_pieces): ... and here to limit the largest mode used.
- Add a comment to document this function.
-
-2002-05-21 Richard Henderson <rth@redhat.com>
-
- * flow.c (life_analysis): Fix test for deleted label.
-
-2002-05-21 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * doc/tm.texi: Fix typo.
-
-2002-05-21 Zack Weinberg <zack@codesourcery.com>
-
- * c-common.c (c_common_init): Set options->unsigned_char from
- flag_signed_char.
- (cb_register_builtins): Define __STRICT_ANSI__ and
- __CHAR_UNSIGNED__ here...
- * cppinit.c (init_builtins): Not here.
- (cpp_create_reader): unsigned_char option defaults to 0, not
- !DEFAULT_SIGNED_CHAR.
- (COMMAND_LINE_OPTIONS, cpp_handle_option): Lose -fsigned-char
- and -funsigned-char.
-
- * cpphash.h (struct spec_nodes): Kill n__STRICT_ANSI__.
- * cpphash.c (_cpp_init_hashtable): Don't set it.
- * cppmacro.c (builtin_macro) [BT_STDC]: Use the language setting
- directly. Clarify comment.
-
-2002-05-21 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * bb-reorder.c (make_reorder_chain_1): Use prev_bb/next_bb to get to
- neighbouring basic blocks. Use ENTRY_BLOCK_PTR->next_bb instead of
- BASIC_BLOCK (0). Use EXIT_BLOCK_PTR->prev_bb instead of
- BASIC_BLOCK (n_basic_blocks - 1).
- * cfganal.c (can_fallthru, flow_call_edges_add,
- flow_preorder_transversal_compute): Too.
- * cfgbuild.c (make_edges, find_basic_blocks, find_many_sub_basic_blocks,
- find_sub_basic_blocks): Too.
- * cfgcleanup.c (try_simplify_condjump, try_optimize_cfg): Too.
- * cfglayout.c (skip_insns_after_block, fixup_reorder_chain,
- fixup_fallthru_exit_predecessor, cfg_layout_redirect_edge): Too.
- * cfgrtl.c (tidy_fallthru_edges, verify_flow_info): Too.
- * combine.c (this_basic_block): Type changed to basic_block.
- (combine_instructions, set_nonzero_bits_and_sign_copies, try_combine,
- nonzero_bits, num_sign_bit_copies, get_last_value_validate,
- get_last_value, distribute_notes, distribute_links): Too.
- * final.c (compute_alignments): Too.
- * flow.c (regno_uninitialized, regno_clobbered_at_setjmp): Too.
- * function.c (thread_prologue_and_epilogue_insns): Too.
- * gcse.c (compute_code_hoist_vbeinout): Too.
- * global.c (build_insn_chain): Too.
- * ifcvt.c (find_if_block, find_cond_trap): Too.
- * predict.c (last_basic_block_p, note_prediction_to_br_prob): Too.
- * regmove.c (regmove_optimize): Too.
- * resource.c (find_basic_block): Too.
- * sched-ebb.c (schedule_ebbs): Too.
- * ssa-dce.c (find_control_dependence, find_pdom): Too.
-
-2002-05-21 Andreas Jaeger <aj@suse.de>
-
- * cppinit.c (sanity_checks): Avoid printf mismatch warnings.
-
-2002-05-21 Richard Henderson <rth@redhat.com>
-
- * reg-stack.c (swap_rtx_condition, subst_stack_regs_pat): Use
- unspec names, not numbers.
-
-2002-05-21 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/sourcebuild.texi: Mention snapshot-README and
- snapshot-index.html as needing updating for new front ends.
-
-2002-05-21 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * rtl.h (SUBREG_PROMOTED_UNSIGNED_SET): Avoid warnings when
- disabling checking, and avoid multiple evaluation of RTX.
-
-2002-05-21 Richard Earnshaw <rearnsha@arm.com>
-
- * bitmap.c (bitmap_find_bit): Return early if we have the correct
- element cached.
-
-Tue May 21 10:51:54 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * profile.c (gen_edge_profiler): Set alias set before the memory is
- used.
-
-2002-05-20 David S. Miller <davem@redhat.com>
-
- * cselib.c (max_value_regs): New.
- (cselib_lookup, cselib_invalidate_regno): Initialize it when
- adding new entries to the REG_VALUES table and we are dealing with
- a hard register.
- (clear_table): Initialize it.
- (cselib_invalidate_regno): Use it to determine which hard
- registers to scan when mode is not VOIDmode.
-
-2002-05-20 Duraid Madina <duraid@fl.net.au>
-
- * tradcpp.c (fixup_newlines): Use old-style function header.
-
-2002-05-20 Krister Walfridsson <cato@df.lth.se>
-
- * reload1.c (reload_cse_simplify): Fix typo in rtx code check.
-
-2002-05-20 H.J. Lu (hjl@gnu.org)
-
- Base on suggestions from Zhang Fuxin <fxzhang@ict.ac.cn>:
-
- * config/mips/mips.h (DFMODE_NAN): Defined.
- (SFMODE_NAN): Likewise.
-
-2002-05-20 Dale Johannesen <dalej@apple.com>
-
- * combine.c (cant_combine_insn_p): Back out my
- previous patch.
-
-2002-05-20 Kazu Hirata <kazu@cs.umass.edu>
-
- * params.c: Fix formatting.
- * params.h: Likewise.
- * predict.c: Likewise.
- * prefix.c: Likewise.
- * print-rtl.c: Likewise.
- * print-tree.c: Likewise.
- * profile.c: Likewise.
-
-2002-05-20 H.J. Lu (hjl@gnu.org)
-
- * gcc/config/mips/linux.h (SDB_DEBUGGING_INFO): Undefine.
-
-2002-05-20 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm-wince-pe.h (ASM_SPEC): Pass -mcpu and -march
- switches straight on to the assembler, do not abbreviate them.
- * config/arm/elf.h (ASM_SPEC): As above.
- * config/arm/semi.h (ASM_SPEC): As above.
- * config/arm/unknown-elf-oabi.h (ASM_SPEC): As above.
- * config/arm/xscale-coff.h (SUBTARGET_ASM_SPEC): Pass
- -mcpu=xscale on to the assembler by default.
- * config/arm/xscale-elf.h (SUBTARGET_ASM_SPEC): As above.
-
-2002-05-20 Richard Henderson <rth@redhat.com>
-
- * cse.c (canon_hash): Reorder do_not_record test. Always
- allow pic_offset_table_rtx.
-
-2002-05-19 Toon Moene <toon@moene.indiv.nluug.nl>
-
- * optabs.c (expand_cmplxdiv_wide): Use complex_part_zero_p.
- (expand_binop): Ditto (3 times).
-
-2002-05-19 Mark Mitchell <mitchell@doubledemon.codesourcery.com>
-
- * Makefile.in (distclean): Remove QMTest stuff.
- (QMTEST_PATH): New variable.
- (QMTESTFLAGS): Likewise.
- (QMTESTRUNFLAGS): Likewise.
- (QMTEST): Likewise.
- (QMTEST_GPP_TESTS): Likewise.
- (QMTEST_DIR): Likewise.
- (QMTEST_DIR/context): New target.
- (qmtest-g++): Likeise.
- (qmtest-gui): Likewise.
- (QMTEST_DIR/gpp-expected.qmr): Likewise.
-
-2002-05-19 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.h (FUNCTION_VALUE): Only return vectors in
- an altivec register if TARGET_ALTIVEC.
-
- * config/rs600/rs6000.c (rs6000_emit_move): Change VECTOR_MODE_P
- to ALTIVEC_VECTOR_MODE.
- (rs6000_va_arg): Only vectors of type AltiVec are 16 byte aligned.
- (rs6000_va_arg): Vectors may go in registers if they are not
- altivec vectors.
-
-2002-05-19 Kazu Hirata <kazu@cs.umass.edu>
-
- * protoize.c: Fix formatting.
-
-2002-05-19 Richard Henderson <rth@redhat.com>
-
- * gensupport.c (init_include_reader): Merge into ...
- (process_include): ... here. Simplify composite path creation.
- Plug memory leaks. Fix file/line number tracking. Do not
- process_define_cond_exec. Return void.
- (process_rtx): Don't check process_include return value.
-
-2002-05-20 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * basic_block.h (struct basic_block_def): Added prev_bb and next_bb
- fields.
- (FOR_BB_BETWEEN, FOR_ALL_BB, FOR_ALL_BB_REVERSE): New macros for
- traversing basic block chain.
- (create_basic_block_structure, create_basic_block): Declaration changed.
- (link_block, unlink_block): Declare.
- * cfg.c (entry_exit_blocks): Initialize new fields.
- (link_block, unlink_block): New.
- (expunge_block_nocompact): Unlink basic block.
- (dump_flow_info): Print prev_bb/next_bb fields.
- * cfgbuild.c (find_basic_blocks_1, find_basic_blocks): Modified.
- * cfgcleanup.c (merge_blocks_move_predecessor_nojumps): Modified.
- * cfglayout.c (fixup_reorder_chain, cfg_layout_duplicate_bb): Modified.
- * cfgrtl.c (create_basic_block_structure, create_basic_block,
- split_block, force_nonfallthru_and_redirect, split_edge): Modified.
- (verify_flow_info): Check that list agrees with numbering.
-
-2002-05-19 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (preprocessing_asm): New macro.
- * c-lex.h (builtin_define, builtin_assert): Use pfile.
-doc:
- * tm.texi: Update.
-config/alpha:
- * alpha.h (CPLUSPLUS_CPP_SPEC): Remove.
- (CPP_SPEC): Simplify.
- (TARGET_CPU_CPP_BUILTINS): Update.
- * freebsd.h (TARGET_OS_CPP_BUILTINS): New.
- (CPP_SPEC): Simplify.
- * linux.h (CPLUSPLUS_CPP_SPEC): Remove.
- (TARGET_OS_CPP_BUILTINS): Update.
- * osf.h (CPP_XFLOAT_SPEC): Kill.
- (TARGET_OS_CPP_BUILTINS): Update.
- (CPP_SUBTARGET_SPEC, SUBTARGET_EXTRA_SPECS): Simplify.
- * osf5.h (CPP_XFLOAT_SPEC): Kill.
- * vms.h (CPP_SUBTARGET_SPEC): Kill.
- (TARGET_OS_CPP_BUILTINS): Update.
-
-2002-05-19 Richard Henderson <rth@redhat.com>
-
- * varasm.c (default_binds_local_p): Fix typo.
-
-2002-05-19 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (machine_dependent_reorg): Sign extend the
- CONST_INT operand to the correct mode after adding 1 to it.
-
-2002-05-19 Mark Mitchell <mark@codesourcery.com>
-
- * config.gcc (powerpc-wrs-windiss*): New target.
-
-2002-05-19 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * config/rs6000/rs6000.md (ashrdi3_no_power): New.
- (ashrdi3): Use it.
-
-2002-05-18 Mark Mitchell <mark@codesourcery.com>
-
- * configure.in (AC_CHECK_FUNCS): Add checks for scandir and
- alphasort.
- * config.in: Regenerated.
- * configure: Regenerated.
-
-2002-05-19 Richard Henderson <rth@redhat.com>
-
- * target-def.h (TARGET_BINDS_LOCAL_P): New.
- * target.h (struct gcc_target): Move boolean fields to the end.
- Add binds_local_p.
- * varasm.c (default_binds_local_p): New.
- * output.h: Declare it.
-
- * config/alpha/alpha.c (alpha_encode_section_info): Use the new hook.
- * config/cris/cris.c (cris_encode_section_info): Likewise.
- * config/i386/i386.c (i386_encode_section_info): Likewise.
- * config/ia64/ia64.c (ia64_encode_section_info): Likewise.
- * config/sh/sh.c (sh_encode_section_info): Likewise.
-
- * doc/tm.texi (TARGET_IN_SMALL_DATA_P): New.
- (TARGET_BINDS_LOCAL_P): New.
-
-2002-05-19 Richard Henderson <rth@redhat.com>
-
- * system.h (BLOCK_PROFILER, BLOCK_PROFILER_CODE,
- FUNCTION_BLOCK_PROFILER, FUNCTION_BLOCK_PROFILER_EXIT,
- MACHINE_STATE_SAVE, MACHINE_STATE_RESTORE): Poison.
-
- * toplev.c (display_help): Kill -a -ax help.
-
- * config/1750a/1750a.h, config/alpha/alpha.h,
- config/clipper/clipper.h, config/dsp16xx/dsp16xx.h,
- config/h8300/h8300.h, config/i960/i960.h, config/m68k/tower-as.h,
- config/m88k/m88k.h, config/vax/vax.h, config/we32k/we32k.h:
- (FUNCTION_BLOCK_PROFILER, BLOCK_PROFILER): Kill.
-
- * libgcc2.c [L_bb] (BLOCK_PROFILER_CODE): Kill.
- * config/m68k/sun3.h (BLOCK_PROFILER_CODE): Kill.
-
- * config/i386/i386-protos.h (ix86_output_block_profiler): Kill.
- (ix86_output_function_block_profiler): Kill.
- * config/m68hc11/m68hc11.c (m68hc11_block_profiler): Kill.
- (m68hc11_function_block_profiler): Kill.
- * config/m68hc11/m68hc11-protos.h: Update.
- * config/m88k/m88k.c (output_block_profiler): Kill.
- (output_function_block_profiler): Kill.
- * config/m88k/m88k-protos.h: Update.
-
-2002-05-19 Richard Henderson <rth@redhat.com>
-
- * system.h (STRIP_NAME_ENCODING): Poison it.
- * output.h (STRIP_NAME_ENCODING): Remove.
- (default_strip_name_encoding): Declare.
- * target-def.h (TARGET_STRIP_NAME_ENCODING): New.
- * target.h (strip_name_encoding): New.
- * varasm.c (default_strip_name_encoding): New.
-
- * dwarf2asm.c, varasm.c, config/darwin.c, config/darwin.h,
- config/alpha/alpha.c, config/arm/pe.c, config/avr/avr.c,
- config/cris/cris.c, config/i386/cygwin.h, config/i386/interix.c,
- config/i386/winnt.c, config/m32r/m32r.h, config/mcore/mcore-elf.h,
- config/mcore/mcore-pe.h, config/mcore/mcore.c, config/mcore/mcore.h,
- config/mips/mips.c, config/mn10200/mn10200.h, config/mn10300/mn10300.h,
- config/pa/pa.c, config/pa/pa.h, config/pa/som.h,
- config/rs6000/rs6000.c, config/rs6000/sysv4.h, config/rs6000/xcoff.h,
- config/v850/v850.h: Use the hook, not the macro.
-
- * config/darwin-protos.h, config/darwin.c, config/darwin.h,
- config/alpha/alpha.c, config/alpha/alpha.h, config/h8300/h8300.c,
- config/h8300/h8300.h, config/i386/cygwin.h, config/i386/i386-interix.h,
- config/i386/i386-protos.h, config/i386/win32.h, config/i386/winnt.c,
- config/ia64/ia64.c, config/ia64/ia64.h, config/m32r/m32r.c,
- config/m32r/m32r.h, config/mcore/mcore.c, config/mcore/mcore.h,
- config/pa/pa.c, config/rs6000/rs6000.c, config/rs6000/sysv4.h,
- config/rs6000/xcoff.h, config/sh/sh.c, config/sh/sh.h,
- config/v850/v850.c, config/v850/v850.h:
- Move STRIP_NAME_ENCODING to out-of-line function and add
- TARGET_STRIP_NAME_ENCODING.
-
- * config/arm/arm.c, config/arm/arm.h, config/mmix/mmix-protos.h,
- config/mmix/mmix.c, config/mmix/mmix.h: Replace STRIP_NAME_ENCODING
- with TARGET_STRIP_NAME_ENCODING referencing existing function;
- make function static.
-
- * xcoffout.c: Include target.h
- * Makefile.in (xcoffout.o): Update.
-
- * config/avr/avr.c (avr_encode_section_info): Correct prototype.
- * config/avr/avr.h (STRIP_NAME_ENCODING): Remove.
- * config/rs6000/rs6000.c (rs6000_xcoff_unique_section): Mark
- reloc argument unused.
- * config/sh/sh.c (TARGET_ENCODE_SECTION_INFO): New.
-
- * doc/tm.texi (TARGET_STRIP_NAME_ENCODING): Update from previous
- STRIP_NAME_ENCODING docs.
-
-2002-05-19 Andreas Jaeger <aj@suse.de>
-
- * gengenrtl.c: Add prototype for excluded_rtx.
-
- * real.h: Add prototype for exact_real_truncate.
-
-2002-05-18 Richard Henderson <rth@redhat.com>
-
- * system.h (ENCODE_SECTION_INFO): Poison it.
- * target-def.h (TARGET_ENCODE_SECTION_INFO): New.
- * target.h (encode_section_info): New.
- * varasm.c (make_decl_rtl, output_constant_def): Use it.
- * hooks.c (hook_tree_int_void): New.
- * hooks.h: Declare it.
-
- * config/darwin.h, config/alpha/alpha-protos.h, config/alpha/alpha.c,
- config/alpha/alpha.h, config/arm/pe.h, config/avr/avr-protos.h,
- config/avr/avr.c, config/avr/avr.h, config/c4x/c4x-protos.h,
- config/c4x/c4x.c, config/c4x/c4x.h, config/cris/cris-protos.h,
- config/cris/cris.c, config/cris/cris.h, config/i386/cygwin.h,
- config/i386/win32.h, config/ia64/ia64-protos.h, config/ia64/ia64.c,
- config/ia64/ia64.h, config/m32r/m32r-protos.h, config/m32r/m32r.c,
- config/m32r/m32r.h, config/m68hc11/m68hc11-protos.h,
- config/m68hc11/m68hc11.c, config/m68hc11/m68hc11.h,
- config/mcore/mcore-protos.h, config/mcore/mcore.c,
- config/mcore/mcore.h, config/mmix/mmix-protos.h, config/mmix/mmix.c,
- config/mmix/mmix.h, config/rs6000/rs6000-protos.h,
- config/rs6000/sysv4.h, config/stormy16/stormy16-protos.h,
- config/stormy16/stormy16.c, config/stormy16/stormy16.h:
- Replace ENCODE_SECTION_INFO with TARGET_ENCODE_SECTION_INFO
- referencing existing function. Make function static.
-
- * config/a29k/a29k.c, config/a29k/a29k.h, config/arc/arc.c,
- config/arc/arc.h, config/arm/arm.c, config/arm/arm.h,
- config/h8300/h8300.c, config/h8300/h8300.h, config/i370/i370.c,
- config/i370/i370.h, config/i386/i386-interix.h, config/i386/i386.c,
- config/i386/i386.h, config/i386/interix.c, config/m88k/m88k.c,
- config/m88k/m88k.h, config/mips/mips.c, config/mips/mips.h,
- config/ns32k/ns32k.c, config/ns32k/ns32k.h, config/pa/pa.c,
- config/pa/pa.h, config/romp/romp.c, config/romp/romp.h,
- config/rs6000/linux64.h, config/rs6000/xcoff.h, config/s390/s390.c,
- config/s390/s390.h, config/sh/sh.c, config/sh/sh.h,
- config/sparc/sparc.c, config/sparc/sparc.h, config/v850/v850.c,
- config/v850/v850.h, config/vax/vax.c, config/vax/vms.h,
- config/xtensa/xtensa.c, config/xtensa/xtensa.h:
- Move ENCODE_SECTION_INFO to out-of-line function and add
- TARGET_ENCODE_SECTION_INFO.
-
- * config/darwin.h (ASM_DECLARE_FUNCTION_NAME): Use hook, not macro.
- (ASM_DECLARE_OBJECT_NAME, ASM_OUTPUT_ALIGNED_DECL_LOCAL): Likewise.
-
- * config/arm/pe.h (EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS): Rename
- from SUBTARGET_*
- (switch_to_section): Replace in_rdata case with in_readonly_data.
-
- * config/h8300/h8300.c (h8300_encode_label): Make static.
- * config/h8300/h8300-protos.h: Update.
-
- * config/rs6000/rs6000.c (rs6000_elf_encode_section_info): Rename
- from rs6000_encode_section_info; make static.
- (rs6000_xcoff_encode_section_info): New.
-
- * config/v850/v850.c (v850_encode_data_area): Make static.
- * config/v850/v850-protos.h: Update.
-
- * config/vax/vax.c: Include flags.h.
- (vms_select_section): Fix typo.
-
- * doc/tm.texi (TARGET_ENCODE_SECTION_INFO): Update from previous
- ENCODE_SECTION_INFO docs.
-
-2002-05-18 Richard Henderson <rth@redhat.com>
-
- * config/darwin.h (DARWIN_REGISTER_TARGET_PRAGMAS): Rename from
- REGISTER_TARGET_PRAGMAS.
- * config/rs6000/darwin.h (REGISTER_TARGET_PRAGMAS): Redefine.
-
- * config.gcc: Do not use rs6000-c.c on powerpc-darwin.
-
-2002-05-18 Richard Henderson <rth@redhat.com>
-
- * system.h (SELECT_RTX_SECTION): Poison.
- * target-def.h (TARGET_ASM_SELECT_RTX_SECTION): New.
- * target.h (select_rtx_section): New.
- * varasm.c (output_constant_pool): Use it.
- (default_select_rtx_section, default_elf_select_rtx_section): New.
- * output.h: Declare them.
-
- * config/darwin.h (SELECT_RTX_SECTION): Move ...
- * config/darwin.c (machopic_select_rtx_section): ... here.
- * config/darwin-protos.h: Update.
-
- * config/nextstep.h (SELECT_RTX_SECTION): Move ...
- * config/nextstep.c (machopic_select_rtx_section): ... here.
- (nextstep_select_section): Rename variable to avoid macro clash.
- * config/nextstep-protos.h: Update.
-
- * config/elfos.h, config/svr3.h, config/arm/aof.h, config/c4x/c4x.h,
- config/i386/dgux.h, config/i386/osfrose.h, config/i386/sco5.h,
- config/i386/svr3gas.h, config/i860/paragon.h, config/ia64/aix.h,
- config/m32r/m32r.h, config/m68k/dpx2.h, config/m68k/lynx.h,
- config/m68k/m68k.h, config/m68k/tower-as.h, config/m88k/dgux.h,
- config/mcore/mcore-pe.h, config/mips/mips.h, config/mmix/mmix.h,
- config/pa/pa-linux.h, config/pa/pa.h, config/romp/romp.h,
- config/rs6000/lynx.h, config/rs6000/sysv4.h, config/s390/linux.h,
- config/sparc/sysv4.h, config/xtensa/elf.h, config/xtensa/linux.h
- (SELECT_RTX_SECTION): Remove.
-
- * config/darwin.h, config/elfos.h, config/nextstep.h,
- config/ia64/aix.h, config/ia64/sysv4.h, config/alpha/alpha.c,
- config/mips/mips.c, config/romp/romp.c, config/rs6000/sysv4.h,
- config/rs6000/xcoff.h, config/s390/s390.c, config/sparc/aout.h,
- config/sparc/lynx.h, config/xtensa/xtensa.c
- (TARGET_ASM_SELECT_RTX_SECTION): New.
-
- * config/alpha/elf.h (SELECT_RTX_SECTION): Move ...
- * config/alpha/alpha.c (alpha_elf_select_rtx_section): ... here.
- * config/ia64/sysv4.h (SELECT_RTX_SECTION): Move ...
- * config/ia64/ia64.c (ia64_select_rtx_section): ... here.
- (ia64_aix_select_rtx_section): New.
- * config/mips/iris6.h (READONLY_DATA_SECTION_ASM_OP): Undef before
- redefining.
- * config/mips/mips.c (mips_select_rtx_section): Make static.
- Support ELF SHF_MERGE features.
- * config/mips/mips-protos.h: Update.
- * config/rs6000/xcoff.h (SELECT_RTX_SECTION): Move ...
- * config/rs6000/rs6000.c (rs6000_xcoff_select_rtx_section): ... here.
- (rs6000_elf_select_rtx_section): Rename from rs6000_select_rtx_section;
- make static, fall back to default_elf_select_rtx_section.
- * config/rs6000/rs6000-protos.h: Update.
- * config/sparc/sparc.h (SELECT_RTX_SECTION): Move ...
- * config/sparc/sparc.c (sparc_aout_select_rtx_section): ... here.
- * config/sparc/sunos4.h (on_exit): Declare only if IN_LIBGCC2.
- * config/romp/romp.c (romp_select_rtx_section): New.
- * config/s390/s390.c (s390_select_rtx_section): New.
- * config/xtensa/xtensa.c: Include output.h. Shuffle local function
- declarations before target macro definition.
- (xtensa_emit_call): Use static buffer.
- (xtensa_select_rtx_section): New.
- * config/xtensa/xtensa.h (MAX_INT_TYPE_SIZE): Remove.
- (IMPLICIT_FIX_EXPR, EASY_DIV_EXPR): Remove.
- (ASM_OUTPUT_POOL_PROLOGUE): Update call to resolve_unique_section.
-
- * doc/tm.texi (TARGET_ASM_SELECT_RTX_SECTION): Update from
- SELECT_RTX_SECTION docs.
-
-Sun May 19 00:24:23 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (movsi/movdi): Fix template.
- (sse2 patterns): Set attributes consistently.
-
- * i386.md (pushqi2, ashrqi_*): Fix constraint.
-
-2002-05-18 Toon Moene <toon@moene.indiv.nluug.nl>
-
- * optabs.c (complex_part_zero_p): New.
- * (expand_cmplxdiv_straight): Use it.
- * (expand_cmplxdiv_wide): Ditto.
- * (expand_binop): Ditto.
-
-2002-05-18 Richard Henderson <rth@redhat.com>
-
- * final.c (HAVE_READONLY_DATA_SECTION): New.
- (shorten_branches): Use it instead of ifdefs.
- * varasm.c (enum in_section): Add in_readonly_data.
- (text_section, data_section): Tidy.
- (readonly_data_section): Use READONLY_DATA_SECTION_ASM_OP if present.
-
- * config/darwin.h, config/nextstep.h, config/h8300/elf.h,
- config/i860/paragon.h, config/m68k/dpx2.h, config/m68k/hp320.h
- (READONLY_DATA_SECTION): Don't undef.
-
- * config/alpha/unicosmk.h, config/h8300/elf.h, config/i386/aix386ng.h,
- config/i860/paragon.h, config/m68k/dpx2.h, config/m68k/hp320.h,
- config/rs6000/lynx.h (READONLY_DATA_SECTION_ASM_OP): Undef.
-
- * config/elfos.h, config/svr3.h, config/alpha/alpha-interix.h,
- config/alpha/elf.h, config/c4x/c4x.h, config/i386/i386-interix.h,
- config/i386/sco5.h, config/i386/svr3gas.h, config/i860/sysv3.h,
- config/m88k/m88k.h, config/pa/pa64-hpux.h (USE_CONST_SECTION): Remove.
-
- * config/elfos.h, config/netware.h, config/alpha/alpha-interix.h,
- config/alpha/elf.h, config/alpha/vms.h, config/arc/arc.h,
- config/arm/coff.h, config/c4x/c4x.h, config/dsp16xx/dsp16xx.h,
- config/i386/dgux.h, config/i386/i386-interix.h, config/i386/sco5.h,
- config/ia64/hpux.h, config/m32r/m32r.h, config/m68k/tower-as.h,
- config/m88k/m88k.h, config/mcore/mcore-pe.h, config/mips/iris6.h,
- config/mips/mips.h, config/mmix/mmix.h, config/pa/pa64-hpux.h,
- config/sparc/sysv4.h (READONLY_DATA_SECTION_ASM_OP): Rename from
- CONST_SECTION_ASM_OP/READONLY_SECTION_ASM_OP/RDATA_SECTION_ASM_OP.
-
- * config/elfos.h, config/netware.h, config/1750a/1750a.h,
- config/a29k/a29k.h, config/alpha/alpha-interix.h, config/alpha/alpha.h,
- config/arm/coff.h, config/h8300/h8300.h, config/i386/aix386ng.h,
- config/i386/i386-interix.h, config/i386/osfrose.h, config/mmix/mmix.h,
- config/pa/pa64-hpux.h, config/sparc/litecoff.h
- (EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS): Remove.
-
- * config/elfos.h, config/netware.h, config/svr3.h,
- config/alpha/alpha-interix.h, config/alpha/alpha.h, config/alpha/elf.h,
- config/arm/coff.h, config/c4x/c4x.h, config/dsp16xx/dsp16xx.h,
- config/h8300/h8300.h, config/i386/i386-interix.h,
- config/i386/osfrose.h, config/i386/svr3gas.h, config/mmix/mmix.h,
- config/pa/pa64-hpux.h (READONLY_DATA_SECTION): Remove.
-
- * config/elfos.h, config/netware.h, config/svr3.h,
- config/alpha/alpha-interix.h, config/alpha/alpha.h, config/alpha/elf.h,
- config/c4x/c4x.h, config/i386/aix386ng.h, config/i386/i386-interix.h,
- config/i386/sco5.h, config/i386/svr3gas.h, config/mmix/mmix.h,
- config/pa/pa64-hpux.h (CONST_SECTION_FUNCTION): Remove.
-
- * config/lynx.h, config/svr3.h, config/alpha/elf.h, config/alpha/vms.h,
- config/c4x/c4x.h, config/dsp16xx/dsp16xx.h, config/i386/sco5.h,
- config/i386/svr3gas.h, config/i860/sysv3.h, config/i860/sysv4.h,
- config/ia64/sysv4.h, config/m32r/m32r.h, config/m88k/m88k.h,
- config/mcore/mcore-elf.h, config/mcore/mcore-pe.h, config/mips/elf.h,
- config/mips/elf64.h, config/mips/iris6.h, config/mips/linux.h,
- config/mips/mips.h, config/mips/rtems64.h, config/mips/vxworks.h,
- config/rs6000/sysv4.h, config/v850/v850.h
- (EXTRA_SECTIONS): Remove in_const/in_rdata.
- (EXTRA_SECTION_FUNCTIONS): Remove accompanying function.
-
- * config/svr3.h, config/c4x/c4x.h, config/i386/dgux.h,
- config/i386/sco5.h, config/i386/svr3gas.h, config/ia64/aix.h,
- config/m88k/dgux.h, config/mcore/mcore-pe.h, config/mmix/mmix.h,
- config/sparc/sysv4.h (SELECT_RTX_SECTION): Use readonly_data_section.
- * config/alpha/alpha.c (alpha_start_function): Likewise.
- (alpha_write_linkage): Likewise.
- * config/m32r/m32r.c (m32r_select_section): Likewise.
- * config/m88k/m88k.c (m88k_select_section): Likewise.
- * config/mips/mips.c (mips_select_rtx_section): Likewise.
- * config/rs6000/rs6000.c (rs6000_select_rtx_section): Likewise.
- (rs6000_elf_select_section): Likewise.
- * config/v850/v850.c (v850_select_section): Likewise.
-
- * config/1750a/1750a.h, config/i860/sysv3.h
- (READONLY_DATA_SECTION_ASM_OP): New.
- READONLY_DATA_SECTION_ASM_OP.
- * config/i386/interix.c, config/i386/winnt.c
- (i386_pe_unique_section): Always use .rdata prefix.
- * config/pa/som.h (readonly_data): Always switch to read-only section.
- (READONLY_DATA_SECTION): Predicate on flag_pic.
- * config/we32k/we32k.h (READONLY_DATA_SECTION): Remove parenthesis.
- * doc/tm.texi (READONLY_DATA_SECTION_ASM_OP): New.
- (READONLY_DATA_SECTION): Update.
-
-2002-05-18 Jason Thorpe <thorpej@wasabisystems.com>
-
- * c-common.c (c_common_post_options): Warn if -Wformat-zero-length
- is used without -Wformat.
- * c-common.h (warn_format_zero_length): Declare extern.
- * c-decl.c (warn_options): Add "format-zero-length".
- * c-format.c (warn_format_zero_length): Declare.
- (set_Wformat): Set warn_format_zero_length for -Wformat.
- (check_format_info): Only warn about zero-length formats if
- warn_format_zero_length is true. Include the format type
- name in the warning message.
- * doc/invoke.texi: Document -Wformat-zero-length.
- * testsuite/gcc.dg/format/zero-length-1.c: New test.
-
-2002-05-18 Kazu Hirata <kazu@cs.umass.edu>
-
- * timevar.c: Fix formatting.
- * tlink.c: Likewise.
- * toplev.c: Likewise.
- * tree-dump.c: Likewise.
- * tree-inline.c: Likewise.
-
-2002-05-18 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppinit.c (cpp_post_options): If preprocessed, turn off
- traditional. If traditional, turn off column numbers.
- * cpplib.c (cpp_push_buffer): Lex from stage 3 if traditional.
- * cpptrad.c (handle_newline): Update line_base.
- (skip_comment): Handle -Wcomment.
-
-2002-05-17 Zack Weinberg <zack@codesourcery.com>
-
- * cppinit.c (struct builtin): Remove unused fields.
- (CPLUS, BUILTIN, OPERATOR, O, builtin_array_end): Kill.
- (operator_array): New - was second half of builtin_array.
- (init_builtins): Simplify loop over builtin_array/operator_array.
-
-2002-05-18 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * defaults.h (UNIQUE_SECTION): Remove.
- * system.h (UNIQUE_SECTION, SELECT_SECTION): Poison.
-
-2002-05-17 Richard Henderson <rth@redhat.com>
-
- * expr.c (init_expr_once): Don't use start/end_sequence.
- Use rtx_alloc instead of emit_insn.
- * toplev.c (lang_dependent_init): Run init_expr_once here ...
- (lang_independent_init): ... not here.
-
-2002-05-17 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/sh/lib1funcs.asm (GLOBAL): Use __USER_LABEL_PREFIX__.
-
-2002-05-17 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_regs_to_save): New function. Also check
- for fixed registers, possibly used for global register variables.
- (initial_elimination_offset, avr_output_function_prologue,
- avr_output_function_epilogue): Move common code to avr_regs_to_save.
-
-2002-05-17 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in: Update for cpptrad.c.
- * cpphash.h (struct cpp_buffer): New members for buffer
- overlays.
- (struct cpp_reader): New members for traditional output.
- (_cpp_read_logical_line, _cpp_overlay_buffer): New.
- * cppinit.c (cpp_create_reader): Set trad_line.
- (cpp_destroy): Free trad_out_base if used.
- (cpp_read_main_file): Overlay an empty buffer if traditional.
- (cpp_finish_options): Don't do builtins.
- (COMMAND_LINE_OPTIONS): Add -traditional-cpp.
- (cpp_handle_option): Handle it.
- * cpplex.c (continue_after_nul): New.
- (_cpp_lex_direct): Use handle_nul.
- * cpplib.h (struct cpp_options): New traditional option.
- * cpptrad.c: New file.
-
-2002-05-17 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_common_init_options): Use C89 for Objective-C,
- and set the options flag.
- * cppinit.c (lang_flags): Remove objc.
- (lang_defaults): Remove OBJC and OBJCXX.
- (set_lang): Update.
- (COMMAND_LINE_OPTIONS): Remove -+ and -lang-objc++.
- (cpp_handle_option): Remove -+ and -lang-objc++.
- For ObjC, just set a flag.
- (print_help): Update.
- * cpplib.h (enum c_lang): Remove CLK_OBJC and CLK_OBJCXX.
-
-2002-05-17 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * doc/install.texi (Specific, mips-sgi-irix6): Document need to
- bootstrap with -mips3.
-
-2002-05-17 Kazu Hirata <kazu@cs.umass.edu>
-
- * final.c: Fix formatting.
- * fix-header.c: Likewise.
- * flow.c: Likewise.
- * fold-const.c: Likewise.
- * function.c: Likewise.
-
-2002-05-17 David S. Miller <davem@redhat.com>
-
- PR c/6689, PR optimization/6615
- * local-alloc.c (struct equivalence): Rename 'src' to 'src_p'
- and make it a pointer to rtx. Update comments.
- (update_equiv_regs): When scanning for equivalences, record
- address of SET_SRC (set) in reg_equiv[].src_p. Dereference
- it while making the equiv replacements.
-
-2002-05-17 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * config/sparc/sparc.c (sparc_aout_select_section): Fixed typo.
-
-2002-05-17 kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * config/sh/sh.h (ENCODE_SECTION_INFO): Consider MODULE_LOCAL_P
- when encoding visibility into SYMBOL_REF_FLAG.
-
-2002-05-17 Richard Sandiford <rsandifo@redhat.com>
-
- * expr.c (force_operand): Fix reversed move.
-
-2002-05-17 Kurt Wall <kwall@kurtwerks.com>
-
- * doc/install.texi (Testing): Mention two common DejaGnu warnings
- that can be ignored.
-
-2002-05-16 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/install.texi (Final install): Recommend to install into a
- "clean" target directory.
-
-2002-05-17 Richard Henderson <rth@redhat.com>
-
- * config/ia64/ia64.md: Use braced strings instead of quoted strings
- for code blocks. Tidy whitespace.
-
-2002-05-17 Richard Henderson <rth@redhat.com>
-
- * hooks.c (hook_tree_bool_false): New.
- * hooks.h: Declare it.
- * target-def.h (TARGET_ASM_SELECT_SECTION): New.
- (TARGET_ASM_UNIQUE_SECTION, TARGET_IN_SMALL_DATA_P): New.
- * target.h (select_section, unique_section): New.
- (in_small_data_p): New.
- * varasm.c (resolve_unique_section): Use hooks instead of macros.
- (variable_section, output_constant_def_contents): Likewise.
- (default_select_section, default_unique_section): New.
- (categorize_decl_for_section, default_elf_select_section): New.
- * output.h: Declare them.
-
- * config/darwin.h (ALIAS_SECTION, try_section_alias): Remove.
- (TARGET_ASM_SELECT_SECTION): New.
- (SELECT_SECTION): Move ...
- * config/darwin.c (machopic_select_section): ... here.
- * config/darwin-protos.h: Update.
-
- * config/nextstep.h (TARGET_ASM_SELECT_SECTION): New.
- (SELECT_SECTION): Move ...
- * config/nextstep.c (nextstep_select_section): ... here.
- * config/nextstep-protos.h: Update.
-
- * config/elfos.h (UNIQUE_SECTION, SELECT_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION): New.
- * config/svr3.h (SELECT_SECTION): Remove.
-
- * config/alpha/alpha.c (unicosmk_unique_section): Make static.
- (TARGET_ASM_UNIQUE_SECTION) [UNICOS]: New.
- (TARGET_IN_SMALL_DATA_P, alpha_in_small_data_p): New.
- (alpha_encode_section_info): Use it.
- * config/alpha/alpha-protos.h: Update.
- * config/alpha/elf.h (DO_SELECT_SECTION): Remove.
- (SELECT_SECTION, UNIQUE_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION): New.
- * config/alpha/unicosmk.h (UNIQUE_SECTION): Remove.
-
- * config/arm/pe.h (UNIQUE_SECTION): Remove.
- (TARGET_ASM_UNIQUE_SECTION): New.
-
- * config/avr/avr.c (TARGET_ASM_UNIQUE_SECTION): New.
- (avr_unique_section): Rename from unique_section; make static.
- * config/avr/avr-protos.h: Update.
- * config/avr/avr.h (UNIQUE_SECTION): Remove.
-
- * config/c4x/c4x.h (SELECT_SECTION): Remove.
-
- * config/i386/cygwin.h (UNIQUE_SECTION): Remove.
- (TARGET_ASM_UNIQUE_SECTION): New.
- * config/i386/i386-interix.h: Likewise.
- * config/i386/win32.h: Likewise.
- * config/i386/djgpp.h (UNIQUE_SECTION): Remove.
- * config/i386/i386.c (ix86_asm_file_end): Use target hook not macro.
- * config/i386/sco5.h (SELECT_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION): New.
- * config/i386/svr3gas.h (SELECT_SECTION): Remove.
-
- * config/i860/paragon.h: Undef TARGET_ASM_SELECT_SECTION
- instead of SELECT_SECTION.
- * config/m68k/dpx2.h: Likewise.
- * config/rs6000/lynx.h: Likewise.
-
- * config/ia64/aix.h (SELECT_SECTION, UNIQUE_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION, TARGET_ASM_UNIQUE_SECTION): New.
- * config/ia64/ia64.c (TARGET_IN_SMALL_DATA_P): New.
- (ia64_in_small_data_p): New.
- (ia64_encode_section_info): Use it. Reorganize overlarge conditional.
- (ia64_aix_select_section, ia64_aix_unique_section): New.
- * config/ia64/sysv4.h (DO_SELECT_SECTION): Remove.
- (SELECT_SECTION, UNIQUE_SECTION): Remove.
-
- * config/m32r/m32r.h (SELECT_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION): New.
- * config/m32r/m32r.c (m32r_select_section): Take align argument.
- * config/m32r/m32r-protos.h: Update.
-
- * config/m88k/m88k.h (TARGET_ASM_SELECT_SECTION): New.
- (SELECT_SECTION): Move ...
- * config/m88k/m88k.c (m88k_select_section): ... here.
-
- * config/mcore/mcore-pe.h (SELECT_SECTION): Remove.
- * config/mcore/mcore.h (UNIQUE_SECTION): Remove.
- * config/mcore/mcore.c (TARGET_ASM_UNIQUE_SECTION): New.
- (mcore_unique_section): Make static.
- * config/mcore/mcore-protos.h: Update.
-
- * config/mips/elf.h (UNIQUE_SECTION): Remove.
- (TARGET_ASM_UNIQUE_SECTION): New.
- * config/mips/elf64.h: Likewise.
- * config/mips/iris6gld.h: Likewise.
- * config/mips/linux.h: Likewise.
- * config/mips/mips-protos.h: Update.
- * config/mips/mips.c (mips_select_section): Add align argument.
- * config/mips/mips.h (SELECT_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION): New.
-
- * config/mmix/mmix.h (SELECT_SECTION, UNIQUE_SECTION): Remove.
- * config/mmix/mmix.c (mmix_select_section): Remove.
- (mmix_unique_section): Remove.
- * config/mmix/mmix-protos.h: Update.
-
- * config/pa/pa.h (TARGET_ASM_SELECT_SECTION): New.
- (SELECT_SECTION): Move ...
- * config/pa/pa.c (pa_select_section): ... here.
- * config/pa/pa64-hpux.h (UNIQUE_SECTION): Remove.
-
- * config/rs6000/rs6000.c (rs6000_elf_select_section): Rename
- from rs6000_select_section and make static.
- (rs6000_elf_unique_section): Similarly.
- (rs6000_xcoff_select_section): From xcoff.h.
- (rs6000_xcoff_unique_section): Likewise.
- * config/rs6000/rs6000-protos.h: Update.
- * config/rs6000/sysv4.h (SELECT_SECTION, UNIQUE_SECTION): Remove.
- (TARGET_ASM_SELECT_SECTION, TARGET_ASM_UNIQUE_SECTION): New.
- * config/rs6000/xcoff.h: Likewise.
-
- * config/sparc/aout.h (TARGET_ASM_SELECT_SECTION): New.
- (SELECT_SECTION): Move ...
- * config/sparc/sparc.c (sparc_aout_select_section): ... here.
-
- * config/v850/v850.h (SELECT_SECTION): Move ...
- * config/v850/v850.c (v850_select_section): ... here.
- (TARGET_ASM_SELECT_SECTION): New.
-
- * config/vax/vms.h (SELECT_SECTION): Move ...
- * config/vax/vax.c (vms_select_section): ... here.
- (TARGET_ASM_SELECT_SECTION): New.
-
- * doc/tm.texi: Update SELECT_SECTION and UNIQUE_SECTION docs
- for the target hooks.
-
-2002-05-17 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c (emit_multi_reg_push): Do not set
- RTX_FRAME_RELATED_P on the SEQUENCE.
-
-2002-05-16 Richard Henderson <rth@redhat.com>
-
- * config/ia64/ia64.c (ia64_reorg): Rebuild bb_for_insn before
- splitting. Use split_all_insns; update_life_info_in_dirty_blocks.
-
-2002-05-16 Richard Henderson <rth@redhat.com>
-
- * config/alpha/unicosmk.h (TARGET_OS_CPP_BUILTINS): Fix typo.
-
- * config/ia64/ia64.c (saveable_obstack): Do not declare.
-
-2002-05-16 Richard Henderson <rth@redhat.com>
-
- * basic-block.h, bb-reorder.c, cfg.c, cfganal.c, cfgbuild.c,
- cfgcleanup.c, cfglayout.c, cfgloop.c, cfgrtl.c, combine.c,
- conflict.c, df.c, df.h, dominance.c, final.c, flow.c, function.c,
- gcse.c, global.c, graph.c, haifa-sched.c, ifcvt.c, lcm.c,
- local-alloc.c, loop.c, predict.c, print-rtl.c, profile.c,
- recog.c, reg-stack.c, regclass.c, regmove.c, regrename.c,
- reload1.c, reorg.c, resource.c, sbitmap.c, sched-deps.c,
- sched-ebb.c, sched-rgn.c, sibcall.c, ssa-ccp.c, ssa-dce.c, ssa.c:
- Revert "Basic block renumbering removal", and two followup patches.
-
-2002-05-16 Jason Thorpe <thorpej@wasabisystems.com>
-
- * lcm.c (optimize_mode_switching): Revert previous change.
-
-2002-05-16 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * sched-rgn.c (schedule_insns): Initialize large_region_blocks
- with only extant block numbers.
-
-2002-05-16 Jason Thorpe <thorpej@wasabisystems.com>
-
- * lcm.c (optimize_mode_switching): Fix typo.
-
-2002-05-16 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- * flow.c (calculate_global_regs_live): Queue blocks in program order.
-
-2002-05-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * doc/install.texi (Configuration): Document PWDCMD.
-
-2002-05-16 Dale Johannesen <dalej@apple.com>
-
- * combine.c (cant_combine_insn_p): Reenable combinations
- involving hard regs unless CLASS_LIKELY_SPILLED_P.
-
-2002-05-16 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (cb_register_builtins): Handle more built-ins
- here rather than in gcc.c specs.
- * gcc.c (cpp_unique_options): Move many built-ins to c-common.c.
- (cpp_options): Pass -O flags even when only preprocessing.
- * toplev.c (set_fast_math_flags): New prototype.
- (fast_math_flags_set_p): New.
- (set_no_fast_math_flags): Remove.
- (decode_f_option): Update.
- * toplev.h (set_fast_math_flags): Update.
- (fast_math_flags_set_p): New.
- (set_no_fast_math_flags): Remove.
-config:
- * c4x/c4x.c (c4x_override_options): Update.
-
-2002-05-16 Zack Weinberg <zack@codesourcery.com>
-
- * c-common.c (STDC_0_IN_SYSTEM_HEADERS, REGISTER_PREFIX):
- Default-define here.
- (builtin_define_with_value): Can now wrap the expansion in
- quotation marks if such is wanted.
- (cb_register_builtins): Update calls to builtin_define_with_value.
- Define __REGISTER_PREFIX__, __USER_LABEL_PREFIX__, and __VERSION__
- here.
- (c_common_init): Set options->stdc_0_in_system_headers.
- * c-lex.h: Update prototype of builtin_define_with_value.
- * cppdefault.h: Remove default definitions of USER_LABEL_PREFIX
- and REGISTER_PREFIX.
-
- * cppinit.c (VERS, ULP, C, X): Kill.
- (builtin_array): Remove entries for __VERSION__,
- __USER_LABEL_PREFIX__, __REGISTER_PREFIX__, and
- __HAVE_BUILTIN_SETJMP__. Make __STDC__ always a builtin, not
- a constant.
- (init_builtins): Kill off a bunch of now-dead code.
- (COMMAND_LINE_OPTIONS): Remove -fleading-underscore and
- -fno-leading-underscore.
- (cpp_handle_option): Remove code to set user_label_prefix.
- (cpp_post_options): Likewise.
-
- * cpplib.h (struct cpp_options): Remove user_label_prefix.
- (stdc_0_in_system_headers): New.
- * cppmacro.c (builtin_macro): Check CPP_OPTION (pfile,
- stdc_0_in_system_headers) too to decide the value of __STDC__.
-
- * tradcpp.c (user_label_prefix): Kill.
- (main): Remove code handling -f(no-)leading-underscore.
- (initialize_builtins): Don't define __REGISTER_PREFIX__
- or __USER_LABEL_PREFIX__.
- (install_value): Wrap compound statement in dummy loop so the
- macro works properly in an if statement.
-
-
-2002-05-16 Janis Johnson <janis187@us.ibm.com>
-
- * loop.h (struct loop_info): Add member has_prefetch.
- * loop.c (PREFETCH_CONDITIONAL): Change default to 1.
- (prescan_loop): Initialize has_prefetch.
- (struct prefetch_info): Change prefetch_in_loop and
- prefetch_before_loop from bit fields to ints.
- (emit_prefetch_instructions): Several small fixes.
- (check_dbra_loop): Don't reverse loop that uses prefetch.
-
-2002-05-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * Makefile.in: Allow for PWDCMD to override hardcoded pwd.
- * configure.in: Likewise.
- * fixinc/check.tpl: Likewise.
- * fixinc/fixinc.dgux: Likewise.
- * fixinc/fixinc.svr4: Likewise.
- * fixinc/fixinc.winnt: Likewise.
- * fixinc/fixincl.sh: Likewise.
- * fixproto: Likewise.
- * configure: Regenerate.
-
-2002-05-16 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
-
- Basic block renumbering removal:
- * basic_block.h (struct basic_block_def): Renamed index to sindex,
- added prev_bb and next_bb fields.
- (n_basic_blocks): Renamed to num_basic_blocks.
- (last_basic_block): New, index of last basic block.
- (FOR_BB_BETWEEN, FOR_ALL_BB, FOR_ALL_BB_REVERSE): New macros for
- traversing basic block chain.
- (BLOCK_NUM): index -> sindex.
- (create_basic_block_structure, create_basic_block): Declaration changed.
- (debug_num2bb): Declare.
- (expunge_block_nocompact): Declaration removed.
- (link_block, unlink_block, compact_blocks): Declare.
- * bb-reorder.c (make_reorder_chain, make_reorder_chain_1): Modified.
- * cfg.c (entry_exit_blocks): Initialize new fields.
- (clear_edges, alloc_block, expunge_block, cached_make_edge,
- redirect_edge_pred, dump_flow_info, dump_edge_info,
- alloc_aux_for_blocks, clear_aux_for_blocks, alloc_aux_for_edges,
- free_aux_for_edges): Modified.
- (link_block, unlink_block, compact_blocks, debug_num2bb): New.
- (expunge_block_nocompact): Removed.
- * cfganal.c (can_fallthru, mark_dfs_back_edges, flow_call_edges_add,
- find_unreachable_blocks, create_edge_list, print_edge_list,
- verify_edge_list, flow_edge_list_print, remove_fake_successors,
- remove_fake_edges, flow_reverse_top_sort_order_compute,
- flow_depth_first_order_compute, flow_preorder_transversal_compute,
- flow_dfs_compute_reverse_init, flow_dfs_compute_reverse_add_bb,
- flow_dfs_compute_reverse_execute): Modified.
- * cfgbuild.c (make_edges, make_eh_edge, find_basic_blocks_1,
- find_basic_blocks, find_many_sub_basic_blocks, find_sub_basic_blocks):
- Modified.
- * cfgcleanup.c (try_simplify_condjump, try_forward_edges,
- merge_blocks_move_predecessor_nojumps,
- merge_blocks_move_successor_nojumps, merge_blocks,
- outgoing_edges_match, try_crossjump_to_edge, try_crossjump_bb,
- try_optimize_cfg, delete_unreachable_blocks, cleanup_cfg): Modified.
- * cfglayout.c (skip_insns_after_block, label_for_bb,
- record_effective_endpoints, scope_to_insns_finalize,
- fixup_reorder_chain, verify_insn_chain, cleanup_unconditional_jumps,
- fixup_fallthru_exit_predecessor, cfg_layout_redirect_edge,
- cfg_layout_duplicate_bb): Modified.
- * cfgloop.c (flow_loops_cfg_dump, flow_loop_dump, flow_loops_dump,
- flow_loop_entry_edges_find, flow_loop_exit_edges_find,
- flow_loop_nodes_find, flow_loop_pre_header_find, flow_loop_scan,
- flow_loops_find, flow_loop_outside_edge_p): Modified.
- * cfgrtl.c (create_basic_block_structure, create_basic_block,
- flow_delete_block, compute_bb_for_insn, split_block,
- try_redirect_by_replacing_jump, redirect_edge_and_branch,
- force_nonfallthru_and_redirect, tidy_fallthru_edge,
- back_edge_of_syntactic_loop_p, split_edge, commit_one_edge_insertion,
- commit_edge_insertions, commit_edge_insertions_watch_calls,
- dump_bb, print_rtl_with_bb, verify_flow_info, purge_dead_edges,
- purge_all_dead_edges): Modified.
- * combine.c (combine_instructions, set_nonzero_bits_and_sign_copies,
- try_combine, nonzero_bits, num_sign_bit_copies, get_last_value_validate,
- get_last_value, reg_dead_at_p, distribute_notes, distribute_links):
- Modified.
- * conflict.c (conflict_graph_compute): Modified.
- * df.c (FOR_ALL_BBS): Removed.
- (df_bitmaps_alloc, df_bitmaps_free, df_alloc, df_analyse_1,
- df_modified_p, df_analyse, df_refs_unlink, df_insn_modify,
- df_dump, hybrid_search_bitmap, iterative_dataflow_sbitmap): Modified.
- * df.h (DF_BB_INFO, DF_REF_BBNO): Modified.
- * dominance.c (init_dom_info, calc_dfs_tree_nonrec, calc_dfs_tree,
- calc_idoms, idoms_to_doms, calculate_dominance_info): Modified.
- * final.c (compute_alignments, final_scan_insn): Modified.
- * flow.c (verify_local_live_at_start, update_life_info,
- update_life_info_in_dirty_blocks, free_basic_block_vars,
- delete_noop_moves, calculate_global_regs_live,
- initialize_uninitialized_subregs, allocate_bb_life_data,
- regno_uninitialized, regno_clobbered_at_setjmp, mark_set_1,
- mark_used_reg, count_or_remove_death_notes): Modified.
- * function.c (thread_prologue_and_epilogue_insns): Modified.
- * gcse.c (struct null_pointer_info): Change typo of current_block
- to basic_block.
- (gcse_main, alloc_gcse_mem, compute_local_properties, compute_sets,
- oprs_unchanged_p, load_killed_in_block_p, record_last_reg_set_info,
- compute_hash_table, alloc_rd_mem, handle_rd_kill_set, compute_kill_rd,
- alloc_avail_expr_mem, expr_killed_p, compute_ae_kill,
- expr_reaches_here_p_work, expr_reaches_here_p, handle_avail_expr,
- classic_gcse, one_classic_gcse_pass, compute_transp, cprop,
- one_cprop_pass, compute_pre_data, pre_expr_reaches_here_p_work,
- pre_expr_reaches_here_p, insert_insn_end_bb, pre_edge_insert,
- pre_delete, one_pre_gcse_pass, compute_transpout,
- invalidate_nonnull_info, delete_null_pointer_checks_1,
- free_code_hoist_mem, compute_code_hoist_vbeinout,
- hoist_expr_reaches_here_p, hoist_code, one_code_hoisting_pass,
- compute_ld_motion_mems, store_ops_ok, find_moveable_store,
- compute_store_table, build_store_vectors, insert_insn_start_bb,
- insert_store, replace_store_insn, free_store_memory, store_motion):
- Modified.
- * global.c (global_alloc, global_conflicts, mark_elimination,
- build_insn_chain): Modified.
- * graph.c (print_rtl_graph_with_bb): Modified.
- * haifa-sched.c (sched_init): Modified.
- * ifcvt.c (SET_ORIG_INDEX, ORIG_INDEX): Removed.
- (find_if_block, find_cond_trap, find_if_case_1, find_if_case_2,
- if_convert): Modified.
- * lcm.c (compute_antinout_edge, compute_earliest, compute_laterin,
- compute_insert_delete, pre_edge_lcm, compute_available,
- compute_farthest, compute_nearerout, compute_rev_insert_delete,
- pre_edge_rev_lcm, make_preds_opaque, optimize_mode_switching):
- Modified.
- * local-alloc.c (alloc_qty, local_alloc, update_equiv_regs): Modified.
- * loop.c (loop_dump_aux): Modified.
- * predict.c (combine_predictions_for_insn, estimate_probability,
- last_basic_block_p, process_note_prediction, process_note_predictions,
- note_prediction_to_br_prob, propagate_freq, counts_to_freqs,
- expensive_function_p, estimate_bb_frequencies,
- compute_function_frequency): Modified.
- * print-rtl.c (print_rtx): Modified.
- * profile.c (GCOV_INDEX_TO_BB, BB_TO_GCOV_INDEX, instrument_edges,
- get_exec_counts, compute_branch_probabilities, compute_checksum,
- branch_prob, find_spanning_tree): Modified.
- * recog.c (split_all_insns, peephole2_optimize): Modified.
- * reg-stack.c (reg_to_stack, convert_regs_entry, compensate_edge,
- convert_regs_1, convert_regs_2, convert_regs): Modified.
- * regclass.c (scan_one_insn, regclass): Modified.
- * regmove.c (mark_flags_life_zones, regmove_optimize,
- combine_stack_adjustments): Modified.
- * regrename.c (regrename_optimize, copyprop_hardreg_forward): Modified.
- * reload1.c (reload, reload_combine, copy_eh_notes): Modified.
- * reorg.c (dbr_schedule): Modified.
- * resource.c (find_basic_block, init_resource_info): Modified.
- * sbitmap.c (sbitmap_intersection_of_succs,
- sbitmap_intersection_of_preds, sbitmap_union_of_succs,
- sbitmap_union_of_preds): Modified.
- * sched-deps.c (init_dependency_caches): Modified.
- * sched-ebb.c (schedule_ebbs): Modified.
- * sched-rgn.c (is_cfg_nonregular, build_control_flow, debug_regions,
- find_rgns, compute_trg_info, init_regions, schedule_insns): Modified.
- * sibcall.c (optimize_sibling_and_tail_recursive_call): Modified.
- * ssa-ccp.c (examine_flow_edges, optimize_unexecutable_edges,
- ssa_ccp_substitute_constants, ssa_ccp_df_delete_unreachable_insns,
- ssa_const_prop): Modified.
- * ssa-dce.c (set_control_dependent_block_to_edge_map_,
- find_control_dependence, find_pdom, ssa_eliminate_dead_code): Modified.
- * ssa.c (remove_phi_alternative, find_evaluations,
- compute_dominance_frontiers_1, compute_iterated_dominance_frontiers,
- insert_phi_node, rename_block, convert_to_ssa, eliminate_phi,
- make_regs_equivalent_over_bad_edges,
- make_equivalent_phi_alternatives_equival,
- compute_conservative_reg_partition,
- coalesce_regs_in_successor_phi_nodes, compute_coalesced_reg_partition,
- rename_equivalent_regs, convert_from_ssa, for_each_successor_phi):
- Modified.
-
-2002-05-16 Mark Mitchell <mark@codesourcery.com>
-
- * cfgrtl.c (purge_dead_edges): Correct handling of EDGE_EH.
-
-2002-05-16 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c (arm_rtx_costs): Check for RTX being a
- SYMBOL_REF before calling CONSTANT_POOL_ADDRESS_P.
- (arm_adjust_cost): Check for RTX being a SYMBOL_REF before
- calling CONSTANT_POOL_ADDRESS_P.
- * config/arm/arm.h (TARGET_CPU_CPP_BUILTINS): Fix typo in code
- to decide whether to define __arm__ or __thumb.
- (THUMB_GO_IF_LEGITIMATE_ADDRESS): Check for RTX being a
- SYMBOL_REF before calling CONSTANT_POOL_ADDRESS_P.
-
-2002-05-16 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * config/arc/arc.h (CPP_PREDEFINES): Remove.
- (CPP_SPEC): Update.
- (TARGET_CPU_CPP_BUILTINS): New.
-
-2002-05-16 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (cpp_macro): Move here, and make expansion a union.
- * cppmacro.c (cpp_macro): Remove.
- (enter_macro_context, replace_args, warn_of_redefinition,
- _cpp_create_definition, cpp_macro_definition): Update.
-
-2002-05-16 Jason Merrill <jason@redhat.com>
-
- * config/mips/mips.c (mips_output_external): Don't do sdata
- optimization for a variable with DECL_COMDAT set.
-
-2002-05-15 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/altivec.h: Cleanups for tighter typechecking.
- Cleanups for accepting modifiers on pointers.
- Fix predicate typos.
- Allow long pointers as well as int pointers.
-
-2002-05-15 Richard Henderson <rth@redhat.com>
-
- * varasm.c (merge_weak): Remove special case for extern and common.
-
-2002-05-15 Matt Hiller <hiller@redhat.com>
-
- * testsuite/gcc.c-torture/compile/20000804-1.x: Don't return 1 if
- XFAILing.
- * testsuite/gcc.c-torture/compile/20001226-1.x: Ditto.
- * testsuite/gcc.c-torture/compile/920520-1.x: Ditto.
- * testsuite/gcc.c-torture/compile/mipscop-1.x: XFAIL for now.
- * testsuite/gcc.c-torture/compile/mipscop-2.x: Ditto.
- * testsuite/gcc.c-torture/compile/mipscop-3.x: Ditto.
- * testsuite/gcc.c-torture/compile/mipscop-4.x: Ditto.
-
-2002-05-15 Aldy Hernandez <aldyh@redhat.com>
-
- * reload1.c (forget_old_reloads_1): Do not use subreg offset.
-
-2002-05-15 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.md ("altivec_mtvscr"): Set VSCR register.
- ("altivec_mfvscr"): Read from VSCR.
-
- Add vscr sets for the following insns: altivec_vctuxs,
- altivec_vaddubs, altivec_vaddsbs, altivec_vadduhs,
- altivec_vaddshs, altivec_vadduws, altivec_vaddsws, altivec_vctsxs,
- altivec_vmhaddshs, altivec_vmhraddshs, altivec_vmsumuhs,
- altivec_vmsumshs, altivec_vpkuhss, altivec_vpkshss,
- altivec_vpkuwss, altivec_vpkswss, altivec_vpkuhus,
- altivec_vpkshus, altivec_vpkuwus, altivec_vpkswus,
- altivec_vsububs, altivec_vsubsbs, altivec_vsubuhs,
- altivec_vsubshs, altivec_vsubuws, altivec_vsubsws,
- altivec_vsum4ubs, altivec_vsum4sbs, altivec_vsum4shs,
- altivec_vsum2sws, altivec_vsumsws.
-
- * config/rs6000/rs6000.h: Add VSCR fixed register.
- (CALL_REALLY_USED_REGISTERS): Add vscr.
- (CALL_USED_REGISTERS): Same.
- (FIXED_REGISTERS): Same.
- (REG_ALLOC_ORDER): Same.
- (reg_class): Add VSCR_REGS.
- (REG_CLASS_NAMES): Same.
- (REG_CLASS_CONTENTS): Same.
- (VSCR_REGNO): New.
- (REGISTER_NAMES): Add vscr.
- (DEBUG_REGISTER_NAMES): Same.
- (ADDITIONAL_REGISTER_NAMES): Same.
- (FIRST_PSEUDO_REGISTER): Increment.
- (CONDITIONAL_REGISTER_USAGE): Set VSCR as a global register.
-
-2002-05-15 Jakub Jelinek <jakub@redhat.com>
-
- * fold-const.c (fold): Fix a typo.
-
-2002-05-15 Eric Botcazou <ebotcazou@multimania.com>
-
- * fold-const.c (fold) [LT_EXPR]: Move the transformation of a
- comparison against the highest or lowest integer value before
- the 'X >= CST to X > (CST - 1)' and 'X < CST to X <= (CST - 1)'
- transformation and that of an unsigned comparison against 0
- right after.
-
-2002-05-15 Richard Henderson <rth@redhat.com>
-
- * varasm.c (merge_weak): Error for any weakening after definition.
- Adjust weakening after use warning to catch more cases.
- (assemble_alias): Set TREE_USED and TREE_ASM_WRITTEN consistently.
- * config/alpha/alpha.c (alpha_encode_section_info): Do not abort.
-
-Wed May 15 10:38:27 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * invoke.texi (-malign-double): Re-add lost warning.
-
- * i386-protos.h (x86_output_mi_thunk): Declare.
- * unix.h (ASM_OUTPUT_MI_THUNK): Move offline to ...
- * i386.c (x86_output_mi_thunk): ... here; handle 64bits.
-
- * dwarf2out.c (output_call_frame_info): Do not skip unwind info
- when flag_asynchronous_unwind_tables is set.
-
- * flags.h (flag_reorder_functions): Declare.
- * function.c (prepare_function_start): Initialize frequnecy.
- * params.def (HOT_BB_COUNT_FRACTION, HOT_BB_FREQUENCY_FRACTION): New.
- * Makefile.in (predict.o): Add dependency on target.h and params.h
- * defaults.h (HOT_TEXT_SECTION_NAME,
- UNLIKELY_EXECUTED_TEXT_SECTION_NAME): New macros.
- * predict.c (choose_function_section): New function.
- (estimate_bb_frequencies): Use it.
- * toplev.c (flag_reorder_functions): New global variable.
- (lang_independent_options): New.
- (parse_options_and_default_flags): Set.
- * varasm.c (assemble_start_function): Bypass functdion alignment
- for never executed functions.
- * invoke.texi (-freorder-blocks, -freorder-functions): Document.
- (param hot-bb-count-fraction, hot-bb-frequency-fraction): New.
- * tm.texi (HOT_TEXT_SECTION_NAME, UNLIKELY_EXECUTED_TEXT_SECTION_NAME):
- Document.
-
- Thu Jan 3 21:52:09 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * predict.c: Inlude profile.h
- (MIN_COUNT): Rename to MIN_COUNT_FRACTION
- (maybe_hot_bb_p, probably_cold_bb_p, probably_never_executed_bb_p):
- Use the information about maximal counter in the program.
-
- Thu Dec 20 22:14:00 CET 2001 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (maybe_hot_bb_p, probably_cold_bb_p,
- probably_never_executed_bb_p): New functions.
- * cfgcleanup.c (outgoing_edges_match): Use them.
- * predict.c (MIN_COUNT, MIN_FREQUENCY): New macros.
- (maybe_hot_bb_p, probably_cold_bb_p,
- probably_never_executed_bb_p): New functions.
-
- * function.h (function): Add new field function_frequency.
- * predict.c (compute_function_frequency): New function.
- (estimate_probability): Call it.
-
-2002-03-09 Jakub Jelinek <jakub@redhat.com>
-
- PR optimization/5172, optimization/5200
- * gcse.c (gcse_main): Disable store_motion.
-
-2002-05-14 Zack Weinberg <zack@codesourcery.com>
-
- * c-parse.in (MODIFIED_WCHAR_TYPE): New macro.
- (c_common_nodes_and_builtins): Use it.
- (builtin_define_with_value): New function.
- (cb_register_builtins): Define __SIZE_TYPE__,
- __PTRDIFF_TYPE__, __WCHAR_TYPE__, and __WINT_TYPE__ here,
- using builtin_define_with_value. Use consistent notation when
- defining __GXX_WEAK__.
- (WCHAR_TYPE_SIZE): Don't redefine.
- (combine_strings): Don't use WCHAR_TYPE_SIZE.
-
- * cppdefault.h: Don't provide defaults for SIZE_TYPE,
- PTRDIFF_TYPE, WCHAR_TYPE, or WINT_TYPE.
- * cppinit.c (builtin_array): Remove entries for __SIZE_TYPE__ etc.
- * tradcpp.c (initialize_builtins): Likewise.
- * gcc.c (cpp_unique_options): Don't muck with __WCHAR_TYPE__.
-
- * c-lex.h (builtin_define_with_value): Prototype.
- * system.h: Poison NO_BUILTIN_SIZE_TYPE, NO_BUILTIN_WCHAR_TYPE,
- NO_BUILTIN_PTRDIFF_TYPE, and NO_BUILTIN_WINT_TYPE.
- * doc/tm.texi: Remove mention of NO_BUILTIN_SIZE_TYPE etc.
-
- * config/avr/avr.h, config/h8300/h8300.h, config/i386/i386.h,
- config/ia64/ia64.h, config/mips/dec-osf1.h, config/mips/iris6.h,
- config/mips/linux.h, config/mips/mips.h, config/mips/netbsd.h,
- config/mips/osfrose.h, config/mips/sni-svr4.h, config/rs6000/aix51.h,
- config/s390/linux.h, config/sh/sh.h, config/sh/sh64.h,
- config/sparc/linux64.h, config/sparc/netbsd-elf.h,
- config/sparc/sol2-bi.h, config/sparc/sparc.h:
- Do not define NO_BUILTIN_SIZE_TYPE etc. Remove all references
- to __SIZE_TYPE__ etc from all spec strings. When this makes
- extra specs empty, delete them.
-
-2002-05-14 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.c (override_options): Override TARGET_JUMP_IN_DELAY when scheduling
- for PA8000 or generating dwarf2 call frame information.
- (output_call): Remove DO_FRAME_NOTES check from return pointer
- optimization.
- (following_call): Return 0 when scheduling for PA8000 or generating
- dwarf2 call frame information. Revise comment.
-
-2002-05-14 Neil Booth <neil@daikokuya.demon.co.uk>
-
-config/alpha:
- * alpha.h (TARGET_CPU_CPP_BUILTINS): Define __IEEE_FP
- and __IEEE_FP_INEXACT as appropriate.
- (CPLUSPLUS_CPP_SPEC): Don't define __cplusplus.
- (CPP_SPEC): Remove ieee defines.
- * freebsd.h, netbsd.h: Remove ieee defines and cpp_cpu.
-
-2002-05-14 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_save_reg): Make regno unsigned.
- (ix86_safe_length, ix86_safe_length_prefix, ix86_safe_memory): Kill.
-
-2002-05-14 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * arm/arm.h (TARGET_CPU_CPP_BUILTINS): Define.
- (CPP_SPEC): Update.
- (CPP_APCS_PC_SPEC, CPP_APCS_PC_DEFAULT_SPEC,
- CPP_FLOAT_SPEC, CPP_FLOAT_DEFAULT_SPEC, CPP_ENDIAN_SPEC,
- CPP_ENDIAN_DEFAULT_SPEC, CPP_INTERWORK_DEFAULT_SPEC,
- CPP_INTERWORK_SPEC, CPP_PREDEFINES): Remove.
- (EXTRA_SPECS): Update.
- * arm/conix-elf.h, arm/linux-elf.h, arm/netbsd.h, arm/riscix.h,
- arm/riscix1-1.h, arm/rtems-elf.h, arm/semiaof.h, arm/unknown-elf.h,
- arm/unknown-elf-oabi.h, arm/vxarm.h: Remove CPP_PREDEFINES and
- define TARGET_OS_CPP_BUILTINS if necessary.
-
-2002-05-14 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * gcc.c (cpp_options): Must pass -m* and -f* options
- to the front end even when only preprocessing.
- (cc1_options): Remove redundant -lang-c.
- * tradcpp.c (main): Ignore -m options.
-objc:
- * lang-specs.h: Similarly.
-
-2002-05-14 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (transform_3): Add code for transformation
- `(A,B,...)+C -> A+C,B,...'.
-
-Tue May 14 12:48:22 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * final.c (end_final): Do not output profile_arcs constructor, when
- no functions are instrumented.
-
-Tue May 14 12:38:30 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (testsi to testqi_zext_1 splitter): Fix typo.
-
-2002-05-14 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/install.texi: Remove special markup originally required for
- HTML generation with texi2html.
-
-2002-05-14 Andreas Schwab <schwab@suse.de>
-
- * config/ia64/sysv4.h (DO_SELECT_SECTION): Factored out of
- SELECT_SECTION.
- (UNIQUE_SECTION): Define to get small data correctly.
-
- * varasm.c (resolve_unique_section): Add third parameter
- flag_function_or_data_sections and use it instead of
- flag_function_sections.
- (assemble_start_function): Pass flag_function_sections.
- (asm_emit_uninitialised): Pass flag_data_sections.
- (assemble_variable): Likewise.
-
-2002-05-14 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.md: Use define_constants for unspec numbers.
- * config/i386/i386.c: Likewise.
-
-2002-05-13 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * doc/contrib.texi: Update my entry.
-
-2002-05-13 Mark Mitchell <mark@codesourcery.com>
-
- * fixinc/inclhack.def (winidss_valist): Limit applicability.
- * fixinc/fixincl.x: Regenerated.
- * fixinc/tests/base/math.h: Update.
- * fixinc/tests/base/testing.h: Likewise.
-
-2002-05-13 Zack Weinberg <zack@codesourcery.com>
-
- * genattr.c (gen_attr): Don't emit a comma after the last
- enumerator.
-
-2002-05-13 Richard Henderson <rth@redhat.com>
-
- * cfgrtl.c (purge_dead_edges): Handle abnormal call edges created
- by non-local gotos.
- * recog.c (peephole2_optimize): Likewise.
-
-2002-05-13 Andris Pavenis <pavenis@lanet.lv>
-
- * cppfiles.c (open_file): Change mode (DJGPP only) of redirected
- input to O_BINARY.
-
-2002-05-13 Jeffrey A Law (law@redhat.com)
-
- * flow.c (invalidate_mems_from_autoinc): Rewrite to use for_each_rtx.
- Update prototype and callers.
- (propagate_one_insn): Stack pointer adjustments kill MEMs on
- the mem_set_list which reference the stack pointer, as do
- calls to constant functions as they may clobber outgoing
- argument space.
-
- * i386.c (ia32_multipass_dfa_lookahead): Prototype.
-
- * i386.c (TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD): Define.
- (ia32_multipass_dfa_lookahead): New function.
-
-2002-05-13 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * gcc.c (SWITCH_TAKES_ARG): Remove 'V'.
- (translate_options): Remove 'V'.
- (process_command): Similarly.
-doc:
- * invoke.texi: Remove documentation of 'V'.
-
-2002-05-13 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/linux.h: Revert 2002-04-22 changes.
-
-2002-05-13 Scott Marks <SMarks@mobile-mind.com>
-
- * config/fr30/fr30.md: Only allow splits of immediate loads
- if the destination is a register.
-
-2002-05-13 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (c-common.o, cppinit.o): Update.
- * c-common.c: Include except.h.
- (cb_register_builtins): Handle __USING_SJLJ_EXCEPTIONS__.
- Call TARGET_CPU_CPP_BUILTINS and TARGET_OS_CPP_BUILTINS.
- * cppinit.c (__USING_SJLJ_EXCEPTIONS): Not here.
- * defaults.h (TARGET_OS_CPP_BUILTINS, TARGET_CPU_CPP_BUILTINS,
- CPP_PREDEFINES): Handle here.
-config:
- * alpha/alpha-interix.h, alpha/gnu.h, alpha/linux.h,
- alpha/netbsd.h, alpha/openbsd.h, alpha/osf.h, alpha/unicosmk.h,
- alpha/vms.h, alpha/vxworks.h: Remove CPP_PREDEFINES, define
- TARGET_OS_CPP_BUILTINS.
- * alpha/alpha.h (TARGET_CPU_CPP_BUILTINS): Define.
- (CPP_SPEC, EXTRA_SPECS): Update.
- (CPP_AM_BWX_SPEC, CPP_AM_MAX_SPEC, CPP_AM_FIX_SPEC,
- CPP_AM_CIX_SPEC, CPP_IM_EV4_SPEC, CPP_IM_EV5_SPEC,
- CPP_IM_EV6_SPEC, CPP_CPU_EV4_SPEC, CPP_CPU_EV5_SPEC,
- CPP_CPU_EV56_SPEC, CPP_CPU_PCA56_SPEC, CPP_CPU_EV6_SPEC,
- CPP_CPU_EV67_SPEC, CPP_CPU_DEFAULT_SPEC, CPP_CPU_SPEC): Remove.
-doc:
- * tm.texi (TARGET_REGISTER_CPP_BUILTINS): Remove.
- (TARGET_OS_CPP_BUILTINS, TARGET_CPU_CPP_BUILTINS): Define.
-
-2002-05-12 Zack Weinberg <zack@codesourcery.com>
-
- * emit-rtl.c (global_rtl): Update comment.
- (const_double_htab, const_double_htab_hash,
- const_double_htab_hash, lookup_const_double): New.
- (const_int_htab_hash, const_int_htab_eq): Remove const
- qualifiers, which cause tons of warnings with RTL checking on.
- (gen_rtx_CONST_DOUBLE): Deleted.
- (const_double_from_real_value): New function - bears some
- resemblance to the former immed_real_const_1.
- (immed_double_const): Moved here from varasm.c and
- simplified.
- (gen_rtx_REG): Make REGNO unsigned to squelch warnings.
- (gen_rtx_SUBREG): Use gen_rtx_raw_SUBREG.
- (gen_rtx): Use immed_double_const.
- (init_emit_once): Initialize the const_double_htab. Use
- REAL_VALUE_FROM_INT where possible. Can now use
- CONST_DOUBLE_FROM_REAL_VALUE when setting up const_tiny_rtx.
- * varasm.c (struct varasm_status): Remove x_const_double_chain.
- (const_double_chain, immed_real_const, clear_const_double_mem): Delete.
- (immed_double_const, immed_real_const_1): Moved to emit-rtl.c.
- (init_varasm_status, mark_varasm_status): Don't touch
- x_const_double_chain.
-
- * output.h: Delete prototype for clear_const_double_mem.
- * real.h: Make REAL_VALUE_TYPE a macro again. Remove leading
- '0' slot from all CONST_DOUBLE_FORMAT definitions. Prototype
- const_double_from_real_value, not immed_real_const_1, and use
- it to define CONST_DOUBLE_FROM_REAL_VALUE. Define new macro
- CONST_DOUBLE_ATOF.
- * rtl.h (CONST_DOUBLE_CHAIN): Kill.
- (CONST_DOUBLE_LOW, CONST_DOUBLE_HIGH): Adjust.
- (gen_rtx_CONST_DOUBLE, immed_real_const): Delete prototypes.
- (gen_rtx_REG): Second arg is unsigned.
-
- * gengenrtl.c (special_rtx): Take out CONST_DOUBLE.
- (excluded_rtx): New, return true for CONST_DOUBLE.
- (genmacro): Write nothing for excluded codes.
- * combine.c (combine_simplify_rtx): Use CONST_DOUBLE_FROM_REAL_VALUE.
- * expr.c (expand_expr): Likewise.
- * ggc-common.c (ggc_mark_rtx_children_1): Don't mark the
- CONST_DOUBLE_CHAIN.
- * toplev.c (rest_of_compilation): Don't call
- clear_const_double_mem.
-
- * config/rs6000/rs6000.c (rs6000_float_const): Delete.
- (rs6000_hash_constant): Remove CONST_DOUBLE special case.
- (toc_hash_eq): Remove CONST_DOUBLE and LABEL_REF special cases.
- * config/rs6000/rs6000-protos.h: Don't prototype rs6000_float_const.
- * config/c4x/c4x.md, config/rs6000/rs6000.md: Use CONST_DOUBLE_ATOF.
- * config/dsp16xx/dsp16xx.md, config/mips/mips.md,
- config/pa/pa.md: Use CONST_DOUBLE_FROM_REAL_VALUE.
- * config/sparc/sparc.md, config/sparc/sparc.c: Use immed_double_const.
-
-2002-05-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * mips/iris6.h (CPLUSPLUS_CPP_SPEC): Define.
-
-2002-05-12 Tom Tromey <tromey@redhat.com>
-
- * tree.h (copy_node): Don't mention TREE_PERMANENT.
-
-2002-05-12 Zack Weinberg <zack@codesourcery.com>
-
- * gensupport.c (n_comma_elts): Moved here from genattrtab.c.
- (scan_comma_elt): New function. Accepts whitespace in comma lists.
- * gensupport.h: Prototype new routines.
- * genattr.c (gen_attr): Use scan_comma_elt. Avoid unnecessary
- use of printf.
- * genattrtab.c (n_comma_elts): Moved to gensupport.c.
- (next_comma_elt): Use scan_comma_elt.
-
- * config/i386/i386.md: Use new attribute notation to break up
- long lines in define_attr forms.
-
-2002-05-12 Richard Henderson <rth@redhat.com>
-
- * expr.c (compress_float_constant): New.
- (emit_move_insn): Use it.
- (float_extend_from_mem): New.
- (init_expr_once): Initialize it.
- * real.c (exact_real_truncate): New.
-
- * config/i386/i386.h (CONST_COSTS): Assume CONST_DOUBLE gets
- dropped into memory; penalize for size.
- (RTX_COSTS): FLOAT_EXTEND is free.
- * config/i386/i386.md (extendsfdf2, extendsfxf2, extendsftf2,
- extenddfxf2, extenddftf2): Accept constants and drop them to memory.
-
-2002-05-12 Richard Henderson <rth@redhat.com>
-
- * profile.h (profile_info): Add missing extern to declaration.
- * profile.c (profile_info): Define it.
-
-2002-05-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa/pa32-regs.h (HARD_REGNO_MODE_OK): Revise sets of general registers
- used for DImode and TImode.
-
-2002-05-11 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplex.c (_cpp_lex_direct): When in a directive at EOF
- fake a newline.
-
-2002-05-11 Zack Weinberg <zack@codesourcery.com>
-
- * config/rs6000/rs6000.c (rs6000_default_long_calls,
- rs6000_longcall_switch, rs6000_set_default_type_attributes): New.
- (TARGET_SET_DEFAULT_TYPE_ATTRIBUTES): Set it.
- (rs6000_override_options): Handle -m(no-)longcall.
- (init_cumulative_args, output_mi_thunk): Check for both
- longcall and shortcall attributes on the function.
- (rs6000_attribute_table): Add "shortcall".
- (rs6000_handle_longcall_attribute): Update comment.
- (altivec_expand_unop_builtin, altivec_expand_binop_builtin,
- altivec_expand_ternop_builtin): Add default clauses to switches
- to silence warnings.
-
- * config/rs6000/rs6000.h: Declare rs6000_longcall_switch and
- rs6000_default_long_calls. Define REGISTER_TARGET_PRAGMAS.
- (TARGET_OPTIONS): Add longcall and no-longcall.
-
- * config/rs6000/rs6000.md (call_nonlocal_sysv,
- call_value_nonlocal_sysv): Split by alternatives. One pair
- accepts only SYMBOL_REFs and rejects if CALL_LONG is set in
- the call cookie. The other pair accepts only LR/CTR and has
- no restriction.
-
- * config.gcc (rs6000-*-* | powerpc*-*-* trailer stanza):
- Set c_target_objs, cxx_target_objs; add t-rs6000-c-rule to
- tmake_file.
- * config/rs6000/rs6000-c.c: New file.
- * config/rs6000/t-rs6000-c-rule: New file.
- * config/rs6000/rs6000-protos.c: Add multiple-include guard.
- Prototype rs6000_pragma_longcall.
-
- * doc/extend.texi: Document shortcall attribute.
- * doc/invoke.texi: Document -mlongcall, -mno-longcall.
-
-2002-05-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * reorg.c (dbr_schedule): Remove unnecessary test.
-
-Sat May 11 14:34:35 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (testsi to testqi spliters): New.
-
- 2002-01-14 Josef Zlomek <zlomek@matfyz.cz>
-
- cfg.c (dump_edge_info): added dumping of EDGE_CAN_FALLTHRU.
-
- Wed Jan 9 2002 Josef Zlomek <zlomj9am@artax.karlin.mff.cuni.cz>
-
- * basic-block.h: New flag EDGE_CAN_FALLTHRU
- * cfganal.c (set_edge_can_fallthru_flag): New function; marks the edges
- that can be made fallthru.
-
- Mon Nov 12 16:25:53 CET 2001 Jan Hubicka <jh@suse.cz>
-
- * cfglayout.c (cleanup_unconditional_jumps): New static function.
- (cfg_layout_initialize): Use it.
-
-2002-05-11 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_mcu_types): Update supported devices.
- * config/avr/avr.h (CPP_SPEC, LINK_SPEC, CRT_BINUTILS_SPECS): Likewise.
- * config/avr/t-avr (MULTILIB_MATCHES): Likewise.
-
-2002-05-11 Kazu Hirata <kazu@cs.umass.edu>
-
- * dbxout.c: Fix formatting.
- * dependence.c: Likewise.
- * df.c: Likewise.
- * diagnostic.c: Likewise.
- * doloop.c: Likewise.
- * dominance.c: Likewise.
- * doschk.c: Likewise.
- * dwarf2asm.c: Likewise.
- * dwarf2out.c: Likewise.
- * dwarfout.c: Likewise.
-
-2002-05-10 Richard Henderson <rth@redhat.com>
-
- * final.c (end_final): Tidy whitespace. Don't honor flag_pack_struct.
- Convert integers constants as needed. Replace "nwords" field with
- "sizeof_bb".
- (final): Save profile data if cfun->arc_profile, not profile_arc_flag.
- * function.h: Fix typo in comment.
- * libgcc2.c (struct bb): Replace "nwords" with "sizeof_bb".
-
-2002-05-10 Roger Sayle <roger@eyesopen.com>
-
- * fold-const.c (build_range_check): Optimize (c>=1) && (c<=127)
- into the equivalent (signed char)c > 0.
-
-2002-05-10 Janis Johnson <janis187@us.ibm.com>
-
- * loop.c: (PREFETCH_EXTREME_DIFFERENCE, PREFETCH_BEFORE_LOOP): New.
- (PREFETCH_CONDITIONAL): Renamed from PREFETCH_NOT_ALWAYS.
- (struct prefetch_info): Fix spelling of member bytes_accessed.
- (emit_prefetch_instructions): Make dump messages more regular;
- restructure code to add more dump messages; use new macros for
- heuristics. (There are no code generation changes in any of this).
-
-2002-05-10 David S. Miller <davem@redhat.com>
-
- * rtl.h (INSN_ANNULLED_BRANCH_P): Accept INSN too, update comment.
- (struct rtx_def): Update unchanging flag comment.
- * doc/rtl.texi (INSN_ANNULLED_BRANCH_P): Update description.
- * reorg.c (delete_from_delay_list): INSN_ANNULLED_BRANCH_P needs
- to be handled to INSN too.
- (dbr_schedule): Likewise.
- * resource.c (next_insn_no_annul): Likewise.
-
- * cse.c (rtx_cost): Remove multiplication by power of 2 special
- casing.
-
-2002-05-14 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/install.texi (Specific, *-*-solaris2*): Update passus on
- setting CONFIG_SHELL to /bin/ksh and remove alternate trick to
- (possibly) work around broken /bin/sh.
-
-2002-05-10 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
-
- * config/mips/t-iris6 (SHLIB_SLIBDIR_SUFFIXES): Use mabi=64 and
- . as N64/N32 libgcc_s.so subdirs.
-
-2002-05-10 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.md: Use define_constants for unspec numbers.
-
- * rtl.h (struct rtx_def): Document unchanging and in_struct flags
- more accurately.
- (INSN_ANNULLED_BRANCH_P): Only valid for JUMP_INSN and CALL_INSN, fix
- comment.
- (INSN_FROM_TARGET_P): Valid also for CALL_INSN.
- * doc/rtl.texi: Document these macros more accurately.
- * recog.c (whole file): Only mess with INSN_ANNULLED_BRANCH_P for
- JUMP_INSNs and CALL_INSNs.
- * resource.c (whole file): Only mess with INSN_ANNULLED_BRANCH_P
- or INSN_FROM_TARGET_P if the code is appropriate.
-
-2002-05-10 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (print_operand): Check that addr is a SYMBOL_REF
- before using SYMBOL_REF_FLAG (addr).
-
- * config/avr/avr-protos.h (avr_io_address_p): Declare.
- * config/avr/avr.c (io_address_p): Rename to avr_io_address_p.
- Make non-static. Update all callers.
- * config/avr/avr.md (*cbi, *sbi, *sbix_branch, *sbix_branch_bit7):
- New insns to clear/set/test a single bit in I/O address space.
-
-2002-05-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * rtl.h (ENABLE_RTL_FLAG_CHECKING): Also check for gcc >= 2.7.
-
-2002-05-09 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in: Update.
- * c-common.c (flag_iso, flag_undef, cb_register_builtins,
- builtin_define_std): New.
- (c_common_init): Register CPP builtins callback.
- * c-common.h (flag_iso, flag_undef): New.
- * c-decl.c (c_decode_option): Set flag_iso and flag_undef.
- * c-lex.c: Don't include target.h.
- (cb_register_builtins): Move to c-common.c.
- (init_c_lex): Don't register hook here.
- * c-lex.h (builtin_define, builtin_assert, builtin_define_std): New.
- (cpp_define, cpp_assert): Remove.
- * gcc.c (cc1_options): Pass -undef to front end.
- * target-def.h (TARGET_REGISTER_CPP_BUILTINS): Remove.
- (TARGET_INITIALIZER): Update.
- * target.h (struct cpp_reader): Don't predeclare.
- (struct gcc_target): Remove cpp builtin hook.
- * tree.c (default_register_cpp_builtins): Remove.
-doc:
- * tm.texi: Update.
-
-2002-05-09 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppexp.c (_cpp_expand_op_stack): Set op_limit.
-
-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/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/sparc/t-linux64 (SHLIB_SLIBDIR_SUFFIXES): Define.
- * config/sparc/t-sol2-64 (SHLIB_SLIBDIR_SUFFIXES): Define.
-
-2002-05-09 Richard Henderson <rth@redhat.com>
-
- * config/ia64/ia64.md: Use define_constants for unspec numbers.
- * config/ia64/ia64.c: Likewise.
-
-2002-05-09 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips.c (mips_add_large_offset_to_sp): Remove FILE arg.
- (save_restore_insns): Likewise.
- (mips_expand_prologue, mips_expand_epilogue): Update callers.
- (highpart_shift_operator): Attach ATTRIBUTE_UNUSED to mode argument.
-
-Thu May 9 11:50:09 2002 Jeffrey A Law (law@redhat.com)
-
- * athlon.md, k6.md, pentium.md, ppro.md): New files.
- * i386.md: Move scheduling information into new files.
-
- * i386.md (type attribute): Add "rotate" for rotate insns.
- (rotate insns): Set type to "rotate".
- (various attributes and function units): Treat rotate like shift.
- (pent_pair attribute): Only rotates by one bit position are
- pairable.
- (sbb insns): Explicitly set pent_pair attribute on a couple
- that were missing it.
-
-Thu May 9 18:29:24 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.c (sh_builtin_saveregs): If starting with an odd fp register,
- make sure that buffer starts on odd word address.
- (sh_va_arg): Skip odd fp registers when reading a double precision
- value.
-
-2002-05-09 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * tree.h (preserve_data, object_permanent_p, type_precision):
- Remove.
-
-2002-05-09 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplib.c (cpp_init_internal_pragmas): Remove #pragma poison.
- * cppmacro.c (paste_all_tokens): Bad pastes are a hard error.
-doc:
- * cpp.texi: Update for removal of obsolete features.
-
-Thu May 9 07:46:18 2002 Jan Hubicka <jh@suse.cz>
- Jeffrey A Law (law@redhat.com)
-
- * i386.c (ia32_use_dfa_pipeline_interface): New function. Use
- the DFA interface for Pentium processors.
- (TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE): DEFINE.
- (attr_pent_pair, ix86_pent_find_pair): Remove.
- (ix86_sched_reorder_pentium): Remove.
- (ix86_sched_reorder): Remove reordering for Pentium.
- * i386.md (Pentium scheduling): Rewrite using DFA description.
-
-Thu May 9 14:55:39 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfganal.c (can_fallthru): Fix fast path.
- * cfgrtl.c (verify_flow_info): Avoid crash on conditionals
- with edges to the next block.
-
-Thu May 9 14:52:45 CEST 2002 Jan Hubicka <jh@suse.cz>
- Pavel Nejedly <bim@atrey.karlin.mff.cuni.cz>
-
- * final.c (end_final): Use C trees to output data structures for profiling.
-
- * Makefile.in (LIBGCC_DEPS): Added missing dependency on gcov-io.h
- (profile.o): New dependency profile.h
- (final.o): New dependency profile.h
- * profile.h: New file. New global structure profile_info.
- * final.h (count_edges_instrumented_now): Declare.
- (current_function_cfg_checksum): Declare.
- (function_list): New structure.
- (functions_head, functions_tail): New static variables.
- (end_final): Emits more data, removed some -ax stuff.
- (final): Stores function names and chcksums.
- * gcov-io.h (__write_gcov_string): New function.
- (__read_gcov_string): New function.
- * gcov.c (read_profile): New function.
- (create_program_flow_graph): Uses read_profile instead of reading
- da_file.
- (read_files): Removed da_file checking, it's done by read_profile now.
- * libgcc2.c (bb_function_info): New structure.
- (bb): New field in structure, removed some -ax stuff.
- (__bb_exit_func): Changed structure of da_file.
- * profile.c (count_edges_instrumented_now): New global variable.
- (current_function_cfg_checksum): New global variable.
- (max_counter_in_program): New global variable.
- (get_exec_counts): New function.
- (compute_checksum): New function.
- (instrument_edges): Sets count_edges_instrumented_now.
- (compute_branch_probabilities): Uses get_exec_counts instead of
- reading da_file.
- (branch_prob): Calls compute_checksum and writes extra data to bbg_file.
- (init_branch_prob): Removed da_file checking, done in get_exec_counts
- now.
- (end_branch_prob): Removed da_file checking, done in get_exec_counts
- now.
- * gcov.texi: Updated information about gcov file format.
-
-2002-05-09 Kazu Hirata <kazu@cs.umass.edu>
-
- * sbitmap.c: Fix formatting.
- * scan.c: Likewise.
- * scan-decls.c: Likewise.
- * sched-deps.c: Likewise.
- * sched-ebb.c: Likewise.
- * sched-rgn.c: Likewise.
- * sched-vis.c: Likewise.
- * sdbout.c: Likewise.
- * sibcall.c: Likewise.
- * simplify-rtx.c: Likewise.
- * ssa.c: Likewise.
- * ssa-ccp.c: Likewise.
- * ssa-dce.c: Likewise.
- * stmt.c: Likewise.
- * stor-layout.c: Likewise.
- * stringpool.c: Likewise.
-
-2002-05-09 David S. Miller <davem@redhat.com>
-
- * config/sparc/sol2.h (ASM_CPU_SPEC): Handle -mcpu=v9.
-
-2002-05-07 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.h (TARGET_BUGGY_QP_LIB): Define to zero.
- * config/sparc/sol2.h (TARGET_BUGGY_QP_LIB): Override to one.
- * config/sparc/sparc.c (emit_soft_tfmode_libcall): If the Qp
- library implementation clobbers the output before the inputs
- are fully consumed, use stack temporary for the output.
-
-2002-05-09 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/netbsd.h (CPP_SPEC): Remove.
- * config/i386/netbsd-elf.h (CPP_SPEC): Define.
- * config/i386/netbsd.h (CPP_SPEC): Define.
- * config/ns32k/netbsd.h (CPP_SPEC): Define.
- * config/sparc/netbsd-elf.h (CPP_SPEC): Remove.
- * config/sparc/netbsd.h (CPP_SPEC): Define.
- * config/vax/netbsd.h (CPP_SPEC): Define.
-
-2002-05-08 Kazu Hirata <kazu@cs.umass.edu>
-
- * read-rtl.c: Fix formatting.
- * real.c: Likewise.
- * recog.c: Likewise.
- * regclass.c: Likewise.
- * regmove.c: Likewise.
- * reg-stack.c: Likewise.
- * reload1.c: Likewise.
- * reload.c: Likewise.
- * resource.c: Likewise.
- * rtlanal.c: Likewise.
- * rtl.c: Likewise.
- * rtl-error.c: Likewise.
-
-2002-05-08 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa/pa-64.h (MAX_WCHAR_TYPE_SIZE): Delete.
- * pa/pa.h (MAX_WCHAR_TYPE_SIZE): Delete.
-
-2002-05-08 Bernd Schmidt <bernds@redhat.com>
-
- * config/i386/i386.h (CPP_CPUCOMMON_SPEC): Tweak previous change to
- use __SSE2__ macro instead.
- * config/i386/xmmintrin.h: Likewise.
-
-2002-05-08 Janis Johnson <janis187@us.ibm.com>
-
- * rtl.h (RTL_FLAG_CHECK*): Add an argument for the macro name,
- and use it in all invocations of these macros. Clean up comments.
- * rtl.c (rtl_check_failed_flag): Add an argument for the name
- of the flag access macro whose check failed.
- * doc/rtl.texi (Flags): Document additional flag uses.
-
-2002-05-08 Robert Spier <rspier@pobox.com>
- Neil Booth <neil@daikokuya.demon.co.uk>
-
- PR preprocessor/6521
- * cppfiles.c (handle_missing_header): Don't do anything
- different for <> includes.
-doc:
- * cppopts.texi: Update documentation for -MG.
-
-2002-05-08 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplex.c (cpp_interpret_charconst): Truncate as well as
- sign-extend.
-doc:
- * cpp.texi: Clarify multichar charconst valuation.
-
-2002-05-08 Mark Mitchell <mark@codesourcery.com>
-
- * doc/invoke.texi: Document -mwindiss option.
-
-2002-05-08 Jason Merrill <jason@redhat.com>
-
- * dwarf2out.c (output_call_frame_info): Don't emit a CIE with no FDEs.
-
- * dwarf2out.c (gen_type_die): Abort on broken recursion.
-
- PR c++/6381
- * dwarf2out.c (rtl_for_decl_location): Only expand INTEGER_CST and
- REAL_CST.
-
-2002-05-08 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/t-arm-elf (MULTILIB): Do not allow big-endian/
- little-endian multilibs to override arm/thumb multilibs.
- Do not build hardware floating point multilibs, nor apcs-26
- multilibs for the Thumb.
-
-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.
-
-Wed May 8 13:12:11 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cse.c (dead_libcall_p): Update counts.
- (delete_trivially_dead_insns): Update call of dead_libcall_p.
-
-Wed May 8 11:08:50 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfglayout.c (function_tail_eff_head): Rename to ...
- (function_footer): ... this one.
- (unlink_insn_chain): New functions.
- (label_for_bb): Only call block_label and emit debug message.
- (record_effective_endpoints): Actually unlink the headers and footers.
- (fixup_reorder_cahin): Re-insert the unlinked sequences.
- (cfg_layout_duplicate_bb): Use duplicate_insn_chain.
- * cfglayout.h (struct reorder_block_def): New fields footer/header;
- remove eff_head/eff_end.
- * rtl.h (set_first_insn): Declare.
- * emit-rtl.c (set_first_insn): New function.
-
- * cfglayout.c (fixup_reorder_chain): Dump duplicated
- (cfg_layout_can_duplicate_bb_p, cfg_layout_rerirect_edge,
- cfg_layout_duplicate_bb): New global function.
- (duplicate_insn_chain): New static function.
- * cfglayout.h (cfg_layout_can_duplicate_bb_p, cfg_layout_rerirect_edge,
- cfg_layout_duplicate_bb): Declare.
- (struct reorder_block_def): Add "original" field.
- * emit-rtl.c (emit_copy_of_insn_after): New function.
- * rtl.h (emit_copy_of_insn_after): Declare.
-
- * cfglayout.c (fixup_fallthru_exit_predecessor): Kill.
- (fixup_reorder_chain): properly handle edges to exit block.
-
-Wed May 8 11:10:31 CEST 2002 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
- Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (note_prediction_to_br_prob): declare.
- * c-semantics.c: Inlucde predit.h
- (expand_stmt): predict GOTO_STMT as not taken.
- * cfgcleanup.c: (delete_unreachable_blocks): Make global.
- (cleanup_cfg): Do not free tail_recursion_list.
- * cfgrtl.c (can_delete_note_p): Delete NOTE_INSN_PREDICTION.
- (flow_delete_block): Kill predictions past end of basic block.
- * output.h (delete_unreachable_blocks): Declare.
- * predict.c (predicted_by_p, process_note_predictions,
- process_note_prediction, last_block_p): New function.
- (estimate_probability): Bypass loop on PRED_CONTINUE;
- do not handle noreturn heuristics; kill PRED_RETURN; add
- PRED_EARLY_RETURN.
- * predict.def (PRED_CONTINUE, PRED_EARLY_RETURN, PRED_GOTO,
- PRED_CONST_RETURN, PRED_NEGATIVE_RETURN, PRED_NULL_RETURN): New.
- * predict.h (IS_TAKEN): New constant.
- * print-rtl.c (print_rtx): Pretty print NOTE_INSN_PREDICTION.
- * rtl.c (NOTE_INSN_PREDICTION): New.
- * rtl.h (NOTE_PREDICTION, NOTE_PREDICTION_ALG, NOTE_PREDICTION_FLAGS):
- New macro.
- (insn_note): add NOTE_INSN_PREDICTION.
- * sibcall.c (optimize_sibling_and_tail_recursive_call): Do not build
- CFG; free tail_recursion_label_list.
- * stmt.c: Include predict.h;
- (return_prediction): New.
- (expand_value_return): Use it.
- * toplev.c: Lower NOTE_INSN_PREDICTION before sibcall.
-
-2002-05-08 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips.md: Name the unspecs with define_constant.
- (*HILO_delay): Rename to 'hilo_delay' (no star).
- (reload_indi): Replace gen_rtx_UNSPEC with gen_hilo_delay.
- (reload_outdi, reload_outsi): Likewise.
-
-2002-05-07 Kazu Hirata <kazu@cs.umass.edu>
-
- * toplev.c: Fix formatting.
-
-2002-05-07 Janis Johnson <janis187@us.ibm.com>
-
- * config.in (ENABLE_RTL_FLAG_CHECKING): New.
- * configure.in (ac_rtlflag_checking): New.
- * doc/install.texi (--enable-checking): Document RTL flag checking.
-
-2002-05-07 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_common_init): Set options->unsigned_wchar.
- * cppinit.c (cpp_create_reader): Default unsigned_wchar,
- group target dependencies.
- (init_builtins, cpp_handle_option): Update.
- * cpplex.c (cpp_interpret_charconst): Update.
- * cpplib.h (struct cpp_options): Add unsigned_wchar, rename
- signed_char to unsigned_char, group target dependencies.
- * defaults.h (WCHAR_UNSIGNED): Remove.
- * system.h (WCHAR_UNSIGNED, MAX_CHAR_TYPE_SIZE): Poison.
-config:
- * freebsd.h, interix.h, alpha/freebsd.h, arm/freebsd.h,
- i386/386bsd.h, i386/beos-elf.h, i386/bsd386.h, i386/cygwin.h,
- i386/djgpp.h, i386/freebsd-aout.h, i386/i386-interix.h,
- i386/win32.h, ia64/freebsd.h, mips/netbsd.h, rs6000/freebsd.h,
- sh/elf.h, sh/sh.h, sparc/freebsd.h: Remove WCHAR_UNSIGNED.
-doc:
- * tm.texi: Remove MAX_CHAR_TYPE_SIZE.
-
-2002-05-07 Mark Mitchell <mark@codesourcery.com>
-
- * fixinc/inclhack.def (windiss_math1): New fix.
- (windiss_math2): Likewise.
- (windiss_valist): Likewise.
- * fixinc/fixincl.x: Regenerated.
-
-2002-05-07 Andreas Jaeger <aj@suse.de>
-
- * genautomata.c (output_internal_min_issue_delay_func): Add
- ATTRIBUTE_UNUSED to avoid warning with empty dfa.
- (output_internal_trans_func): Likewise.
-
-Tue May 7 10:06:22 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-07 Mark Mitchell <mark@codesourcery.com>
-
- * config/rs6000/sysv4.h (SUBTARGET_SWITCHES): Add -mwindiss.
- (LINK_START_SPEC): Handle it.
- (LINK_OS_SPEC): Likewise.
- (CPP_SPEC): Likewise.
- (STARTFILE_SPEC): Likewise.
- (LIB_SPEC): Likewise.
- (ENDFILE_SPEC): Likewise. Do not assume crtsavres.o is used on
- all platforms.
- (CRTSAVRES_DEFAULT_SPEC): New macro.
- (LIB_WINDISS_SPEC): New macro.
- (CPP_OS_WINDISS_SPEC): Likewise.
- (STARTFILE_WINDISS_SPEC): Likewise.
- (ENDFILE_WINDISS_SPEC): Likewise.
- (LINK_START_WINDISS_SPEC): Likewise.
- (LINK_OS_WINDISS_SPEC): Likewise.
- * config/rs6000/windiss.h: New file.
-
-2002-05-07 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (bdesc_2arg): Fix vmax typos.
-
-2002-05-06 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.md (shift insns): Do not mask off
- second operand, 'I' constraint and SHIFT_COUNT_TRUNCATED
- take care of it.
-
-2002-05-06 Richard Henderson <rth@redhat.com>
-
- PR c++/6212
- * expr.c (highest_pow2_factor_for_type): New.
- (expand_assignment): Use it.
-
-2002-05-06 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.md ("altivec_mtvscr"): Change to
- unspec_volatile.
- ("altivec_mfvscr"): Same.
-
-2002-05-06 Janis Johnson <janis187@us.ibm.com>
-
- * rtl.h (struct rtx_def): Update comments.
- (RTL_FLAG_CHECK[12345678]): New. (rtl_check_failed_flag): Declare.
- (RTL_FLAG): New. (CLEAR_RTX_FLAGS): New. (flag access macros): Use
- RTL_FLAG_CHECK macros with list of expected RTL codes.
- * rtl.c (copy_rtx, shallow_copy_rtx): Use RTX_FLAG macro.
- (rtl_check_failed_flag): New.
- * reload1.c (reload): Use REG macro before changing rtx to MEM.
- (reload_cse_noop_set_p): Check rtx code before using access macro.
- * config/ia64/ia64.c (process_for_unwind_directive): Check rtx code
- before using access macro.
-
-2002-05-06 Janis Johnson <janis187@us.ibm.com>
-
- * doc/rtl.texi (Flags): Update to reflect current usage.
-
-2002-05-06 Roger Sayle <roger@eyesopen.com>
-
- PR opt/3995
- * fold-const.c (sign_bit_p): New function.
- (fold) [EQ_EXPR]: Use this to convert (A & C) == 0 into A >= 0 and
- (A & C) != 0 into A < 0, when constant C is the sign bit of A's type.
- Reapply fold when converting (A & C) == C into (A & C) != 0.
- (fold_binary_op_with_conditional_arg): Fix typo in comment.
-
-2002-05-07 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (warn_multichar): New.
- (c_common_init): Set CPP's warn_multichar.
- * c-common.h (warn_multichar): New.
- * c-decl.c (warn_multichar): Remove.
- * c-lex.c (lex_charconst): Update.
- * c-tree.h (warn_multichar): Remove.
- * cppexp.c (eval_token): Sign-extend charconst value.
- * cppinit.c (cpp_create_reader): Set warn_multichar.
- * cpplex.c (cpp_interpret_charconst): Don't sign-extend
- each character. Update prototype. Sign-extend the result.
- * cpplib.h: Fix conditions.
- (struct cpp_options): Add new warning flag.
- (cpp_interpret_charconst): Update prototype.
-doc:
- * cpp.texi: Update documentation.
-
-2002-05-06 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (form_the_same_automaton_unit_lists_from_regexp):
- Fix typo in usage of allof instead of unit.
-
-2002-05-06 Richard Henderson <rth@redhat.com>
-
- * recog.c (if_test_bypass_p): Accept multiple set insns for OUT,
- and any jump or call for IN.
-
-2002-05-06 Bernd Schmidt <bernds@redhat.com>
-
- * config/i386/i386.h (CPP_CPUCOMMON_SPEC): Define __SSE2_BUILTINS__ if
- -msse2.
- * config/i386/xmmintrin.h: Use it to conditionalize SSE2 support.
-
-2002-05-06 Roger Sayle <roger@eyesopen.com>
-
- * fold-const.c (lshift-double): Cast the high word to an unsigned
- HOST_WIDE_INT when extracting sign bit to avoid compiler warning.
- (div_and_round_double): Cast carry to a signed HOST_WIDE_INT to
- avoid compiler warning. (fold): Remove redundant code from
- BIT_AND_EXPR as integer operands are canonicalized to be arg1.
-
-2002-05-06 Jeff Law <law@redhat.com>
-
- * pa-protos.h (hppa_fpstore_bypass_p): Declare.
- * pa.c (pa_adjust_cost): Remove all true dependency cost
- adjustments. Also remove support for non-DFA scheduling.
- * pa.md (700, 7100, 7100lc, 7200, 7300): Use bypass mechanism
- to adjust true dependency costs. Update various comments.
- (7100lc, 7200, 7300 scheduling): Simplify by combining the
- FP ALU & MPY units into a single unit.
-
-2002-05-06 Catherine Moore <clm@redhat.com>
-
- * config/v850/v850.c (compute_register_save_size): Make sure
- to count all of the registers that will be saved.
-
-Mon May 6 18:03:11 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (q_regs_operand): Use ANY_QI_REGS_P.
-
-2002-05-06 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.c (emit_soft_tfmode_libcall): Do not
- allow result to overlap input operands in memory.
-
-2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk>
-
-doc:
- * cpp.texi: Update multichar charconst docs.
-
-2002-05-06 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplex.c (cpp_interpret_charconst): Sign-extend each
- character. Don't ignore excess characters. Treat
- multicharacter character constants as signed.
- (cpp_parse_escape): Clarify diagnostic.
-
-2002-05-05 Jakub Jelinek <jakub@redhat.com>
-
- * config/sparc/sparc.md (ashlsi3): If shift count is const1_rtx,
- use add instead of shift.
- (ashldi3_sp64): Likewise.
- (ashlsi3_const1, ashldi3_const1): Remove.
- * config/sparc/sparc.h (PREDICATE_CODES): Add const1_operand.
- * config/sparc/sparc.c (const1_operand): New.
-
-2002-05-05 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (alpha*-*-netbsd*): Don't use crtstuff.
-
-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 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (alpha_adjust_cost): Remove everything but
- memory latency adjustments.
- (alpha_variable_issue): Remove.
- (alpha_use_dfa_pipeline_interface): New.
- (alpha_multipass_dfa_lookahead): New.
- * config/alpha/alpha.md: Remove define_function_unit scheduling;
- include new dfa scheduling.
- (attr type): Add none.
- (blockage): Use it.
- * config/alpha/ev4.md: New.
- * config/alpha/ev5.md: New.
- * config/alpha/ev6.md: New.
-
-2002-05-05 David S. Miller <davem@redhat.com>
-
- * recog.c (store_data_bypass_p): Handle CLOBBER inside PARALLEL.
-
-2002-05-05 Kazu Hirata <kazu@cs.umass.edu>
-
- * cse.c: Fix formatting.
- * emit-rtl.c: Likewise.
-
-2002-05-05 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (initiate_states): Add additional guard to
- initialize `units_array'.
-
-2002-05-05 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (form_the_same_automaton_unit_lists_from_regexp,
- process_unit_to_form_the_same_automaton_unit_lists,
- form_the_same_automaton_unit_lists
- check_unit_distributions_to_automata): New prototypes and
- functions.
- (check_automata): Rename it into `check_automata_insn_issues'.
- (unit_decl): New fields `the_same_automaton_unit' and
- `the_same_automaton_message_reported_p'.
- (unit_decl_t): New typedef.
- (the_same_automaton_lists): New gloval variable.
- (unit_regexp, unit_set_el, units_array, units_cmp,
- output_get_cpu_unit_code_func): Use the typedef.
- (evaluate_max_reserv_cycles): Increment
- `description->max_insn_reserv_cycles'.
- (initiate_states): Don't increment `max_cycles_num'.
- (transform_insn_regexps): Move code around transformation of
- regexps from `generate'.
- (generate): Remove call of `transform_insn_regexps'.
- (expand_automata): Call `transform_insn_regexps' and
- `check_unit_distributions_to_automata'. Check errors before
- `generate'.
-
- * config/sparc/ultra3.md (us3_a0, us3_a1): Move the units into
- automaton `ultrasparc3_1'.
-
-2002-05-05 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_common_init): Set up CPP arithmetic.
- * cppinit.c (cpp_create_reader): Default CPP arithmetic to
- something reasonable for the host.
- (sanity_checks): Add checks.
- (cpp_read_main_file): Call sanity_checks() from here...
- (cpp_post_options): ... not here.
- * cpplex.c (cpp_interpret_charconst): Get max_chars right.
- * cpplib.h (struct cpp_options): New member int_precision.
-
-2002-05-05 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * doc/install.texi (powerpc-*-linux-gnu*): Update build requirements.
-
-2002-05-04 David S. Miller <davem@redhat.com>
-
- * config/sparc/linux.h, config/sparc/linux64.h
- (HANDLE_PRAGMA_PACK_PUSH_POP): Don't define twice.
-
- * config/sparc/sparc.c (sparc_rtx_costs): Describe costs of
- more RTX codes.
- * config/sparc/sparc.h (RTX_COSTS_CASES): List those new codes.
-
- * recog.c (store_data_bypass_p): Handle out_insn being a PARALLEL
- of SETs.
-
-2002-05-05 Tim Josling <tej@melbpc.org.au>
-
- * treelang; New directory for new sample language treelang.
-
-2002-05-04 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (c-lex.o): Update.
- * c-lex.c: Include target.h.
- (cb_register_builtins): New.
- (init_c_lex): Set builtins callback.
- * c-lex.h (cpp_define, cpp_assert): New prototypes.
- * cppinit.c (init_builtins): Use callback, including for
- GXX_WEAK.
- * cpplib.h (struct cpp_callbacks): New member.
- * target-def.h (TARGET_REGISTER_CPP_BUILTINS): New.
- (TARGET_INITIALIZER): Update.
- * target.h (struct gcc_target): New hook.
- * tree.c (default_register_cpp_builtins): New.
- * tree.h (default_register_cpp_builtins): New.
-doc:
- * tm.texi (TARGET_REGISTER_CPP_BUILTINS): Document.
-
-2002-05-04 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppinit.c (MAX_WCHAR_TYPE_SIZE): Move to cpplib.h
- (cpp_post_options): Move sanity checks to...
- (sanity_checks): New.
- * cpplex.c (maybe_read_ucs): Fix prototype.
- (parse_string, cpp_parse_escape): Cast for %c format specifier.
- * cpplib.h (cppchar_t): Use unsigned long or unsigned long long
- if necessary.
-
-2002-05-04 Bernd Schmidt <bernds@redhat.com>
-
- * config/i386/i386.c (bdesc_2arg): Add a couple of missing SSE2
- builtins. Use V2DI patterns instead of TI for logical operations.
- (ix86_init_mmx_sse_builtins): Add a couple of missing SSE2 builtins.
- Correct definitions of psadbw, pmovmskb128, movntdq, cvtdq2ps.
- (ix86_expand_builtins): Change the pattern used for movntdq.
- * config/i386/i386.md (sse2_andv2di3, sse2_iorv2di3, sse2_xorv2di3,
- sse2_nandv2di3): New patterns.
- (sse2_anddf3, sse2_nanddf3, sse2_iordf3, sse2_xordf3): Correct modes
- on operands.
- (sse2_movntv2di): Renamed from sse2_movntti and modes adjusted.
- (cvtdq2pd): Correct mode on operand 1.
- (sse2_umulsidi3): Describe without unspec.
- (sse2_psadbw, mmx_psadbw): Describe with unspec; use more appropriate
- machine modes.
- (lshrv2di3): Renamed from sse2_lshrv2di3 and removed unspec.
- (ashlv2di3): Likewise, from sse2_ashlv2di3.
- (ashrv8hi3, ashrv4si3, lshrv8hi3, lshrv4si3, lshrv2di3, ashlv8hi3,
- ashlv4si3, ashlv2di3): Use SImode for shift count.
- (ashrv8hi3_ti, ashrv4si3_ti, lshrv8hi3_ti, lshrv4si3_ti, lshrv2di3_ti,
- lshrv4si3_ti, lshrv2di3_ti, ashlv8hi3_ti, ashlv4si3_ti, ashlv2di3_ti):
- New patterns.
- * config/i386/xmmintrin.h (__v2df, __v2di, __v4si, __v8hi, __v16qi):
- New typedefs.
- (__m128i, __m128d): New macros.
- (_mm_add_pd, _mm_add_sd, _mm_sub_pd, _mm_sub_sd, _mm_mul_pd,
- _mm_mul_sd, _mm_div_pd, _mm_div_sd, _mm_sqrt_pd, _mm_sqrt_sd,
- _mm_min_pd, _mm_min_sd, _mm_max_sd, _mm_max_pd, _mm_and_pd,
- _mm_andnot_pd, _mm_xor_pd, _mm_or_pd, _mm_cmpeq_pd, _mm_cmplt_pd,
- _mm_cmple_pd, _mm_cmpgt_pd, _mm_cmpge_pd, _mm_cmpneq_pd,
- _mm_cmpnlt_pd, _mm_cmpnle_pd, _mm_cmpngt_pd, _mm_cmpnge_pd,
- _mm_cmpord_pd, _mm_cmpunord_pd, _mm_cmpeq_sd, _mm_cmplt_sd,
- _mm_cmple_sd, _mm_cmpgt_sd, _mm_cmpge_sd, _mm_cmpneq_sd,
- _mm_cmpnlt_sd, _mm_cmpnle_sd, _mm_cmpngt_sd, _mm_cmpnge_sd,
- _mm_cmpord_sd, _mm_cmpunord_sd, _mm_comieq_sd, _mm_comilt_sd,
- _mm_comile_sd, _mm_comigt_sd, _mm_comige_sd, _mm_comineq_sd,
- _mm_ucomieq_sd, _mm_ucomieq_sd, _mm_ucomilt_sd, _mm_ucomile_sd,
- _mm_ucomigt_sd, _mm_ucomige_sd, _mm_ucomineq_sd, _mm_cvtepi32_pd,
- _mm_cvtepi32_ps, _mm_cvtpd_epi32, _mm_cvtpd_pi32, _mm_cvtpd_ps,
- _mm_cvttpd_epi32, _mm_cvttpd_pi32, _mm_cvtpi32_pd, _mm_cvtps_epi32,
- _mm_cvttps_epi32, _mm_cvtps_pd, _mm_cvtsd_si32, _mm_cvttsd_si32,
- _mm_cvtsd_ss, _mm_cvtsi32_sd, _mm_cvtss_sd, _mm_unpackhi_pd,
- _mm_unpacklo_pd, _mm_loadh_pd, _mm_storeh_pd, _mm_storel_pd,
- _mm_movemask_pd, _mm_packs_epi16, _mm_packs_epi32, _mm_packus_epi16,
- _mm_unpackhi_epi8, _mm_unpackhi_epi16, _mm_unpackhi_epi32,
- _mm_unpacklo_epi8, _mm_unpacklo_epi16, _mm_unpacklo_epi32,
- _mm_add_epi8, _mm_add_epi16, _mm_add_epi32, _mm_add_epi64,
- _mm_adds_epi8, _mm_adds_epi16, _mm_adds_epu8, _mm_adds_epu16,
- _mm_sub_epi8, _mm_sub_epi16, _mm_sub_epi32, _mm_sub_epi64,
- _mm_subs_epi8, _mm_subs_epi16, _mm_subs_epu8, _mm_subs_epu16,
- _mm_madd_epi16, _mm_mulhi_epi16, _mm_mullo_epi16, _mm_mul_pu16,
- _mm_mul_epu16, _mm_sll_epi16, _mm_sll_epi32, _mm_sll_epi64,
- _mm_sra_epi16, _mm_sra_epi32, _mm_srl_epi16, _mm_srl_epi32,
- _mm_srl_epi64, _mm_slli_epi16, _mm_slli_epi32, _mm_slli_epi64,
- _mm_srai_epi16, _mm_srai_epi32, _mm_srli_epi16, _mm_srli_epi32,
- _mm_srli_epi64, _mm_and_si128, _mm_andnot_si128, _mm_or_si128,
- _mm_xor_si128, _mm_cmpeq_epi8, _mm_cmpeq_epi16, _mm_cmpeq_epi32,
- _mm_cmpgt_epi8, _mm_cmpgt_epi16, _mm_cmpgt_epi32, _mm_max_epi16,
- _mm_max_epu8, _mm_min_epi16, _mm_min_epu8, _mm_movemask_epi8,
- _mm_mulhi_epu16, _mm_maskmoveu_si128, _mm_avg_epu8, _mm_avg_epu16,
- _mm_sad_epu8, _mm_stream_si32, _mm_stream_si128, _mm_stream_pd,
- _mm_movpi64_epi64, _mm_clflush, _mm_lfence, _mm_mfence): New
- functions.
- (_mm_shufflehi_epi16, _mm_shufflelo_epi16, _mm_shuffle_epi32,
- _mm_extract_epi16, _mm_insert_epi16, _mm_shuffle_pd): New macros.
-
-2002-05-04 Kazu Hirata <kazu@cs.umass.edu>
-
- * dwarf2out.c: Fix formatting.
- * varasm.c: Likewise.
-
-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.
-
-Sat May 4 13:20:54 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * expr.c (force_operand): Use expand_simple_* to handle more
- cases.
-
-2002-05-04 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-lex.c (lex_string): Let cpp_parse_escape handles truncation
- and sign-extension.
- (lex_charconst): Update for change in prototype of
- cpp_interpret_charconst. Extend from cppchar_t to HOST_WIDE_INT
- appropriately.
- * cpphash.h (BITS_PER_CPPCHAR_T): New.
- * cppinit.c (cpp_create_reader): Initialize them for no
- change in semantics.
- (cpp_post_options): Add sanity checks.
- * cpplex.c (cpp_parse_escape): Handle precision, sign-extension
- and truncation issues. Calculate in type cppchar_t.
- (MAX_CHAR_TYPE_SIZE, MAX_WCHAR_TYPE_SIZE): Remove.
- (cpp_interpret_charconst): Calculate in type cppchar_t. Handle
- run-time dependent precision correctly. Return whether the
- result is signed or not.
- * cpplib.c (dequote_string): Use cppchar_t; update.
- * cpplib.h (cppchar_signed_t): New.
- struct cpp_options): New precision members.
- (cpp_interpret_charconst, cpp_parse_escape): Update prototypes.
- * cppexp.c (eval_token): Update.
-
-2002-05-03 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc-protos.h (sparc_rtx_costs): New.
- * config/sparc/sparc.c (sparc_rtx_costs): New function
- implementing RTX_COSTS and CONST_COSTS.
- * config/sparc/sparc.h (CONST_COSTS): Delete.
- (RTX_COSTS_CASES): Define.
- (RTX_COSTS): Expand RTX_COSTS_CASES and use sparc_rtx_costs to do
- the work.
-
- * config/sparc/sparc.md (DFA schedulers): Split out...
- * config/sparc/cypress.md, config/sparc/hypersparc.md,
- config/sparc/sparclet.md, config/sparc/supersparc.md,
- config/sparc/ultra1_2.md, config/sparc/ultra3.md: ... into here.
-
- * config/sparc/sparc.c (LEAF_REGISTERS): Do not do ifdef
- checks on it, always defined for Sparc.
-
- * config/sparc/sparc.h (REG_ALLOC_ORDER, REG_LEAF_ALLOC_ORDER):
- Tweak, and add more detailed comments.
-
-2002-05-03 Zack Weinberg <zack@codesourcery.com>
-
- * Re-apply patch accidentally reverted with
- DFA scheduler merge: remove all rules and variables to slurp
- source files out of libiberty and rebuild them with HOST_CC.
- ($(HOST_PREFIX_1)varray.o): New rule.
- (genattrtab rule): Word wrap.
-
-2002-05-03 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/i386/netbsd64.h (CPP_LP64_SPEC): Define.
- (CPP_SUBTARGET_SPEC): Define.
- (SUBTARGET_EXTRA_SPECS): Redefine, adding cpp_lp64 and
- cpp_subtarget specs.
- (CPP_SPEC): Redefine to include %(cpp_subtarget).
-
-2002-05-03 David S. Miller <davem@redhat.com>
-
- * target-defs.h (TARGET_SCHED_CYCLE_DISPLAY): Delete.
- * target.h (struct gcc_target): Delete cycle_display member.
-
- * config/ia64/ia64.c (ia64_emit_insn_before): Put it back.
- (rtx_needs_barrier): Delete reference to cycle_display unspec.
- (ia64_sched_reorder2): Mention need for cycle display handling
- once such notes exist.
-
-2002-05-03 Richard Henderson <rth@redhat.com>
-
- * real.c (etoasc): Strip most trailing zeros for clarity.
- * sched-vis.c: Include real.h.
- (print_value): Use REAL_VALUE_TO_DECIMAL as needed.
- * Makefile.in (sched-vis.o): Add real.h.
-
-2002-05-03 David S. Miller <davem@redhat.com>
-
- * haifa-sched.c (rank_for_schedule): Revert 2002-05-02 change,
- no longer needed.
-
-2002-05-03 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (altivec_expand_binop_builtin): Error out
- when we get an out of range literal.
- (altivec_expand_ternop_builtin): Same.
- (altivec_expand_unop_builtin): Same.
- (altivec_expand_builtin): Same, for dss.
- (altivec_expand_builtin): Use trees instead of rtl when
- determining literal argument validity.
-
-2002-05-03 David S. Miller <davem@redhat.com>
-
- Delete cycle display scheduling hook.
- * config/ia64/ia64.c (ia64_cycle_display,
- TARGET_SCHED_CYCLE_DISPLAY, ia64_emit_insn_before): Delete.
- (ia64_sched_reorder2): Don't check for CODE_FOR_cycle_display
- and use emit_insn_before instead of ia64_emit_insn_before.
- * config/ia64/ia64.md (unspec usage): Delete cycle display.
- (cycle_display): Delete insn pattern.
- * config/sparc/sparc.md (unspec usage): Delete cycle display.
- (cycle_display): Delete insn pattern.
- * config/sparc/sparc.c (sparc_cycle_display,
- TARGET_SCHED_CYCLE_DISPLAY): Delete.
- * doc/md.texi (cycle_display): Don't mention.
- * doc/tm.texi (TARGET_SCHED_CYCLE_DISPLAY): Likewise.
-
-2002-05-03 Richard Henderson <rth@redhat.com>
-
- * recog.c (store_data_bypass_p, if_test_bypass_p): New.
- * recog.h: Declare them.
-
- * config/sparc/sparc.c (ultrasparc_store_bypass_p): Remove.
- * config/sparc/sparc.md: Use store_data_bypass_p instead.
- * config/sparc/sparc-protos.h: Update.
-
-2002-05-03 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/sparc/netbsd-elf.c (CPP_SUBTARGET_SPEC64): Remove
- -D__arch64__. Add -D_LP64.
- (CPP_ARCH32_SPEC): Redefine to match the non-bi-arch version
- from sparc.h.
- (CPP_ARCH64_SPEC): Likewise.
- (NO_BUILTIN_PTRDIFF_TYPE): Undef.
- (NO_BUILTIN_SIZE_TYPE): Undef.
-
-2002-05-03 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (min_issue_delay_pass_states): Change return type
- in the prototype.
- (min_issue_delay_pass_states): Change the algorithm.
- (min_issue_delay): Set up min_insn_issue_delay for the state.
- (output_min_issue_delay_table): Interchange the nested loops and
- and initiate min_insn_issue_delay for states.
-
-Fri May 3 22:59:15 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c (try_optimize_cfg): Call merge_block only when
- jump is simplejump.
-
-Fri May 3 22:53:37 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (expand_movstr, expand_clrstr): Fix inline-all-stringops
- sequence.
-
-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 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * c-format.c (check_format_info_main): Don't check for presence of
- parameter for * width until after operand number has been read,
- and only check for it if format parameters are available.
- Fixes PR c/6547.
-
-2002-05-03 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/alpha/netbsd.h (CPP_PREDEFINES): Add -D_LP64.
- (LINK_SPEC): Undef before defining.
-
-2002-05-03 Jakub Jelinek <jakub@redhat.com>
-
- PR preprocessor/6489
- * tradcpp.c (fixup_newlines): New.
- (main, finclude): Use it.
-
-2002-05-03 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/elf64.h (UNIQUE_SECTION): Use mips_unique_section.
- * config/mips/mips.c (mips_unique_section): Strip encoding from
- decl name.
-
-2002-05-03 Jakub Jelinek <jakub@redhat.com>
-
- * config/i386/i386.c (ix86_expand_int_movcc): Truncate to proper
- mode.
-
-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-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 Kazu Hirata <kazu@cs.umass.edu>
-
- * config/h8300/crti.asm: Remove trailing spaces.
- * config/h8300/h8300.c: Likewise.
- * config/h8300/lib1funcs.asm: Likewise.
-
-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-03 Kazu Hirata <kazu@cs.umass.edu>
-
- * regrename.c: Fix formatting.
- * tree.c: Likewise.
-
-Fri May 3 13:34:43 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (attribute memory): Handle compares properly.
-
-Fri May 3 10:51:38 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (sse_clrsf, sse_clrsi): Set memory attribute
- to none.
-
-2002-05-02 Kazu Hirata <kazu@cs.umass.edu>
-
- * function.c: Fix formatting.
-
-2002-05-02 Jan Hubicka <jh@suse.cz>
-
- * haifa-sched.c (schedule_insn): Print table of instructions and
- reservations.
- (sched_block): Do not print ready list at verbosity level 1.
- * sched-vis.c (print_insn): Make global.
- * sched-ebb.c (ebb_print_insn): Rename from...
- (print_insn): ... this one.
- * sched-int.h (print_insn): Declare
-
-2002-05-02 Richard Henderson <rth@redhat.com>
-
- * haifa-sched.c (rank_for_schedule): Skip past last_scheduled_insn
- emitted by cycle_display.
-
-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.
-
-2002-05-02 Vladimir Makarov <vmakarov@redhat.com>
-
- * genattrtab.c (write_function_unit_info): Add a dummy element
- when num_units == 0.
-
-2002-05-02 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
-
- * predict.c: (propagate_freq, estimate_bb_frequencies): Use
- TYPE_MODE (double_type_node) instead of DFmode.
-
-Thu May 2 19:50:04 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgrtl.c (try_redirect_by_replacing_jump): Do not kill computed
- jumps post reload.
- * toplev.c (rest_of_compilation): Revert Richard's patch.
-
-2001-05-02 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa/x-ada (ADA_CFLAGS): Rename to X_ADA_CFLAGS.
-
-2002-05-02 Catherine Moore <clm@redhat.com>
-
- * config/v850/v850.h (TRAMPOLINE_TEMPLATE): Change r5 to r20.
-
-2002-05-02 Kazu Hirata <kazu@hxi.com>
-
- * combine.c: Fix comment typos.
- * expr.c: Likewise.
- * genautomata.c: Likewise.
- * stmt.c: Likewise.
- * tree.h: Likewise.
-
-2002-05-02 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/install.texi: State GNAT version requirements.
-
-2002-05-02 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/fr30/fr30.h (GO_IF_LEGITIMATE_ADDRESS): Accept any form
- of the frame pointer or arg pointer register which strict register
- checking is not enabled.
-
-2002-05-02 Aldy Hernandez <aldyh@redhat.com>
-
- * gcc.dg/altivec-8.c: New.
-
- * config/rs6000/rs6000.c (rs6000_legitimate_address): Disallow
- PRE_INC and PRE_DEC for altivec modes.
-
-2002-05-01 Bruce Korb <bkorb@gnu.org>
-
- * fixinc/check.tpl(set-writable): make sure the function exists first
- * fixinc/inclhack.def(alpha_assert): fix test_text
- * fixinc/tests/base/assert.h: add in missing result
-
-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 Richard Henderson <rth@redhat.com>
-
- * cfgcleanup.c (merge_blocks_move_successor_nojumps): Emit dump
- info before expunging the block.
-
-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 Joel Sherrill <joel@OARcorp.com>
-
- * config/arm/rtems-elf.h: Add #undef TARGET_VERSION to prevent warning.
-
-2002-05-01 David Edelsohn <edelsohn@gnu.org>
-
- * rs6000.md (abssi2_nopower): Convert to define_insn_and_split.
- (nabs_nopower): Same.
- (floatdisf2): New pattern.
- (absdi2): Convert to define_insn_and_split.
- (nabsdi2): Same.
- (trunctfsf2): Same.
- (floatditf2): Same.
- (floatsitf2): Same.
- (fix_trunctfdi2): Same.
- (fix_trunctfsi2): Same.
-
-2002-05-01 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/install.texi: Update Texinfo version requirement
- documentation.
-
-2002-05-01 Jakub Jelinek <jakub@redhat.com>
-
- 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-01 Aldy Hernandez <aldyh@redhat.com>
-
- * gcc.dg/altivec-7.c: New.
-
- * config/rs6000/altivec.h: Cleanup.
-
-2002-04-30 Aldy Hernandez <aldyh@redhat.com>
-
- * doc/invoke.texi (Option Summary): Add -mvrsave=.
- (RS/6000 and PowerPC Options): Document -mvrsave=.
-
- * config/rs6000/rs6000.c (rs6000_altivec_vrsave): New global.
- (rs6000_altivec_vrsave_string): Same.
- (rs6000_override_options): Call rs6000_parse_vrsave_option.
- (rs6000_parse_vrsave_option): New.
- (rs6000_stack_info): Only generate vrsave instructions when
- TARGET_ALTIVEC_VRSAVE.
-
- * config/rs6000/rs6000.h (TARGET_OPTIONS): Add -mvrsave= option.
- (rs6000_altivec_vrsave_string): Define extern.
- (rs6000_altivec_vrsave): Same.
- (TARGET_ALTIVEC_VRSAVE): New.
-
-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 Tom Rix <trix@redhat.com>
-
- * regrename.c (build_def_use, copyprop_hardreg_forward_1): Sanity
- check which_alternative.
-
-2002-04-30 Kazu Hirata <kazu@hxi.com>
-
- * cpplex.c: Fix comment formatting.
- * function.c: Likewise.
- * integrate.c: Likewise.
- * regrename.c: Likewise.
- * sibcall.c: Likewise.
- * simplify-rtx.c: Likewise.
- * tree-inline.c: Likewise.
-
-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.
- * 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 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.h (MMIX_LAST_STACK_REGISTER_REGNUM): Renamed
- from MMIX_LAST_REGISTER_FILE_REGNUM.
- (NO_IMPLICIT_EXTERN_C): Remove cryptic obsolete comment.
- (struct machine_function): New member highest_saved_stack_register
- previously static variable in mmix.c.
- (MACHINE_DEPENDENT_REORG): Define.
- * config/mmix/mmix.c (highest_saved_stack_register): Deleted.
- (MMIX_OUTPUT_REGNO): New.
- (mmix_target_asm_function_prologue): Move calculation of last used
- saved-stack-register into...
- (mmix_machine_dependent_reorg): New function. Update to also handle
- !TARGET_ABI_GNU.
- (mmix_print_operand): Apply MMIX_OUTPUT_REGNO when emitting
- register names, simplify somewhat by new variable regno.
- <case 'p'>: Remove fixed FIXME. Always emit highest used saved
- register.
- (mmix_print_operand_address): Apply MMIX_OUTPUT_REGNO when
- emitting register names.
- (mmix_asm_output_reg_push, mmix_asm_output_reg_pop): Ditto.
- (mmix_dbx_register_number): Apply MMIX_OUTPUT_REGNO here too.
- Remove fixed FIXME.
- * config/mmix/mmix-protos.h (mmix_machine_dependent_reorg):
- Declare.
-
- * config/mmix/mmix.md ("divmoddi4"): Update head comment.
-
-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 Janis Johnson <janis187@us.ibm.com>
-
- * 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.
-
-Tue Apr 30 19:15:36 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (type): Add new SSE/MMX subtypes, remove usused fop1.
- (mode): Add vector modes
- (i387): Kill attribute.
- (unit): New attribute.
- (length_immediate): Grok new types.
- (prefix_data16, prefix_rep, prefix_0f): Fix for SSE/MMX.
- (modrm): Use "unit".
- (memory): Handle MMX/SSE properly.
- (scheduling descriptions): Kill uses of fop1.
- (sse, mmx, fp patterns): Set type and mode properly.
-
-Tue Apr 30 09:31:59 2002 Jeffrey A Law (law@redhat.com)
-
- * pa.c (override_options): Default to PA8000 scheduling.
- * doc/invoke.texi (HP-PA options): Mention newly added 7300
- scheduling parameter.
-
- * pa.md (7100lc, 7200, 7300 scheduling): Slightly refine
- handling of double precision multiplies.
-
- * pa.md (7100lc, 7200, 7300 scheduling): Refine handling of
- fpdiv and fpsqrt instructions.
- (7200 & 7300 scheduling): Fix typo in handling of
- store-load and store-store penalties.
-
-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 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.h (BRANCH_COST, PREFETCH_BLOCK,
- SIMULTANEOUS_PREFETCHES): Tune for UltraSPARC-III.
- * config/sparc/sparc.md (call + jmp 32-bit peepholes): Likewise.
- * config/sparc/sparc.c (sparc_initialize_trampoline): Likewise.
-
-2002-04-29 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * combine.c (find_split_point): Use gen_int_mode.
-
-2002-04-29 Vladimir Makarov <vmakarov@redhat.com>
-
- Merging code from dfa-branch:
-
- 2002-04-24 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (output_reserv_sets): Fix typo.
-
- 2002-04-23 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (output_reserv_sets): Remove
- next_cycle_output_flag.
-
- Thu Apr 18 08:57:06 2002 Jeffrey A Law (law@redhat.com)
-
- * sched-rgn.c (init_ready_list): Make the DFA code handle
- USE/CLOBBER insns in the same way as the traditional
- scheduler.
- (new_ready): Similarly..
-
- 2002-04-17 Vladimir Makarov <vmakarov@redhat.com>
-
- * haifa-sched.c (schedule_block): Change the DFA state only after
- issuing insn.
-
- Wed Apr 17 15:38:36 2002 Jeffrey A Law (law@redhat.com)
-
- * pa.c (hppa_use_dfa_pipeline_interface): New function.
- (TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE): Define.
- (override_options): Add PA7300 scheduling support.
- (pa_adjust_cost): Update various comments. Properly
- handle anti and output dependencies when using the
- DFA scheduler.
- (pa_issue_rate): Add PA7300 scheduling support.
- (pa_can_combine_p): Call extract_insn before calling
- constrain_operands (taken from mainline tree).
- * pa.h (enum processor_type): Add PROCESSOR_PA7300.
- * pa.md (cpu attr): Add 7300. Rewrite pipeline
- descriptions using DFA descriptions. Add PA7300
- scheduling support.
-
- 2002-03-30 David S. Miller <davem@redhat.com>
-
- Add UltraSPARC-III DFA scheduling support.
- * config/sparc/sparc.md (define_attr type): Add fpcrmove.
- Update FP conditional move on register insn patterns to use it, as
- appropriate.
- (define_attr cpu): Add ultrasparc3.
- (define_attr us3load_type): New, update integer load patterns to
- set it, as appropriate.
- (define_automaton): Add ultrasparc3_0 and ultrasparc3_1.
- (rest): Add UltraSPARC3 scheduling description.
- * config/sparc/sparc.h (TARGET_CPU_ultrasparc3): New.
- (PROCESSOR_ULTRASPARC3): New.
- ({ASM,CPP}_CPU64_DEFAULT_SPEC): Handle ultrasparc3.
- ({ASM,CPP}_CPU_SPEC): Likewise.
- (REGISTER_MOVE_COST): Likewise.
- (RTX_COSTS): Likewise.
- * config/sparc/sparc.c (sparc_override_options,
- sparc_initialize_trampoline, sparc64_initialize_trampoline,
- sparc_use_dfa_pipeline_interface, sparc_use_sched_lookahead,
- sparc_issue_rate): Likewise.
- * config/sparc/sol2.h: Likewise.
- * config/sparc/sol2-sld-64.h: Likewise.
- * config/sparc/linux64.h: Likewise.
-
- 2002-03-22 Vladimir Makarov <vmakarov@redhat.com>
-
- * doc/md.texi: Add comments about usage the latency time for the
- different dependencies and about case when two or more conditions
- in different define_insn_reservations returns TRUE for an insn.
-
- * doc/md.texi: Add reference for automaton based pipeline
- description.
-
- 2002-03-04 Vladimir Makarov <vmakarov@redhat.com>
-
- * doc/passes.texi: Add missed information about genattrtab.
-
- 2002-03-01 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (output_automata_list_transition_code): Check
- automata_list on NULL.
-
- 2002-02-28 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (output_insn_code_cases,
- output_automata_list_min_issue_delay_code,
- output_automata_list_transition_code,
- output_automata_list_state_alts_code): Comment the functions.
-
- 2002-02-22 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (automata_list_el_t): New typedef.
- (get_free_automata_list_el,free_automata_list_el,
- free_automata_list, automata_list_hash, automata_list_eq_p,
- initiate_automata_lists, automata_list_start, automata_list_add,
- automata_list_finish, finish_automata_lists,
- output_insn_code_cases, output_automata_list_min_issue_delay_code,
- output_automata_list_transition_code,
- output_automata_list_state_alts_code, add_automaton_state,
- form_important_insn_automata_lists): New functions and prototypes.
- (insn_reserv_decl): Add members important_automata_list and
- processed_p.
- (ainsn): Add members important_p.
- (automata_list_el): New structure.
- (first_free_automata_list_el, current_automata_list,
- automata_list_table): New global variables.
- (create_ainsns): Initiate member important_p.
- (output_internal_min_issue_delay_func): Generate the switch and
- call output_insn_code_cases.
- (output_internal_trans_func, output_internal_state_alts_func):
- Ditto.
- (generate): Call initiate_automata_lists.
- (automaton_states): New global variable.
- (expand_automata): Call form_important_insn_automata_lists.
- (write_automata): Call finish_automata_lists.
-
- 2002-02-21 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (add_excls, add_presence_absence): Check that
- cpu units in the sets belong the same automaton.
-
- * rtl.def (EXCLUSION_SET, PRESENCE_SET, ABSENCE_SET): Add comment
- about that cpu units in the sets belong the same automaton.
-
- * doc/md.texi: Ditto.
-
- 2001-12-20 Naveen Sharma <naveens@noida.hcltech.com>
- Nitin Gupta <niting@noida.hcltech.com>
-
- * config/sh/sh.c (sh_use_dfa_interface): New function.
-
- (sh_issue_rate): New Function.
- TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE: define.
- TARGET_SCHED_ISSUE_RATE: define.
-
- * config/sh/sh.md: Add DFA based pipeline description for SH4.
-
- (define_attr insn_class): New attribute used for DFA
- scheduling.
- (define_insn cmpgtsi_t): Set attribute insn_class mt_group.
- (cmpgesi_t,cmpgtusi_t,cmpgeusi_t,cmpeqsi_t,
- cmpeqdi_t): Likewise.
-
- (add,addc1,addsi3,subc,subc1,*subsi3_internal,
- negc,negsi2,ashldi3_k,lshrdi3_k,ashrdi3_k): Set insn_class
- ex_group.
- (iorsi3,rotlsi3_1,rotlsi3_31,rotlsi3_16): Likewise.
-
- 2001-10-03 Vladimir Makarov <vmakarov@toke.toronto.redhat.com>
-
- * haifa-sched.c (queue_to_ready): Remove unnecessary condition for
- break.
-
- 2001-10-03 Vladimir Makarov <vmakarov@toke.toronto.redhat.com>
-
- * genautomata.c (DFA_INSN_CODES_LENGTH_VARIABLE_NAME): New macro.
- (output_dfa_insn_code_func): Expand dfa_insn_codes if it is
- necessary.
- (output_dfa_start_func): Initiate new variable insn_codes_length,
- (write_automata): Output definition of the new variable.
-
- 2001-10-02 David S. Miller <davem@redhat.com>
-
- * haifa-sched.c (advance_one_cycle): New function.
- (schedule_block): Use it.
- (queue_to_ready): Use it, and also make sure to advance the DFA
- state on all stall cycles, not just those where insn_queue links
- are found.
-
- 2001-10-02 Richard Sandiford <rsandifo@redhat.com>
-
- * haifa-sched.c (max_issue): Remove last_p argument. Only return
- non-zero if the highest-priority instruction could be scheduled.
- (choose_ready): Remove last argument from max_issue call.
-
- 2001-09-28 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.c (sparc_use_sched_lookahead): Use 4 for
- ultrasparc and 3 for other multi-issue sparcs.
-
- 2001-09-27 David S. Miller <davem@redhat.com>
-
- * config/sparc/sparc.md (cycle_display): New pattern.
- * config/sparc/sparc.c (sparc_cycle_display): New.
- (TARGET_SCHED_CYCLE_DISPLAY): Set it.
-
- 2001-09-25 David S. Miller <davem@redhat.com>
-
- Convert all of Sparc scheduling to DFA
- * config/sparc/sparc.md: Kill all define_function_unit
- directives and replace with DFA equivalent.
- * config/sparc/sparc.c (ultrasparc_adjust_cost,
- mark_ultrasparc_pipeline_state, ultra_cmove_results_ready_p,
- ultra_fpmode_conflict_exists, ultra_find_type,
- ultra_build_types_avail, ultra_flush_pipeline,
- ultra_rescan_pipeline_state, ultrasparc_sched_reorder,
- ultrasparc_variable_issue, ultrasparc_sched_init,
- sparc_variable_issue, sparc_sched_reorder, ultra_code_from_mask,
- ultra_schedule_insn, ultra_code_names, ultra_pipe_hist,
- ultra_cur_hist, ultra_cycles_elapsed): Kill.
- (sparc_use_dfa_pipeline_interface, sparc_use_sched_lookahead,
- ultrasparc_store_bypass_p): New.
- * config/sparc/sparc-protos.h (ultrasparc_store_bypass_p):
- Declare.
-
- 2001-09-24 David S. Miller <davem@redhat.com>
-
- * haifa-sched.c (ready_remove): Fix thinko, we want to copy around
- ready->vec[foo] not ready[foo].
-
- 2001-09-07 Vladimir Makarov <vmakarov@redhat.com>
-
- * doc/md.texi: Correct examples for define_insn_reservations
- `mult' and `div'.
-
- 2001-09-07 Vladimir Makarov <vmakarov@redhat.com>
-
- * genautomata.c (create_automata): Print message about creation of
- each automaton.
- (generate): Remove printing meease about creation of
- automata.
-
- 2001-09-05 David S. Miller <davem@redhat.com>
-
- * config/sparc/linux.h: Set CPLUSPLUS_CPP_SPEC.
- * config/sparc/linux64.h: Likewise.
-
- 2001-08-31 Vladimir Makarov <vmakarov@redhat.com>
-
- * haifa-sched.c (insn_cost, schedule_insn, queue_to_ready,
- schedule_block, sched_init, sched_finish): Add missed calls of
- use_dfa_pipeline_interface.
-
- * sched-rgn.c (init_ready_list, new_ready, debug_dependencies):
- Ditto.
-
- * sched-vis.c (get_visual_tbl_length): Ditto.
-
- 2001-08-27 Richard Henderson <rth@redhat.com>
-
- * genattr.c (main): Emit state_t even when not doing scheduling.
-
- 2001-08-27 Richard Henderson <rth@redhat.com>
-
- * genautomata.c (expand_automata): Always create a description.
-
- 2001-08-27 Vladimir Makarov <vmakarov@touchme.toronto.redhat.com>
-
- * rtl.def (DEFINE_CPU_UNIT, DEFINE_QUERY_CPU_UNIT, EXCLUSION_SET,
- PRESENCE_SET, ABSENCE_SET, DEFINE_BYPASS, DEFINE_AUTOMATON,
- AUTOMATA_OPTION, DEFINE_RESERVATION, DEFINE_INSN_RESERVATION): New
- RTL constructions.
-
- * genattr.c (main): New variable num_insn_reservations. Increase
- it if there is DEFINE_INSN_RESERVATION. Output automaton based
- pipeline hazard recognizer interface.
-
- * genattrtab.h: New file.
-
- * genattrtab.c: Include genattrtab.h.
- (attr_printf, check_attr_test, make_internal_attr,
- make_numeric_value): Move protypes into genattrtab.h. Define them
- as external.
- (num_dfa_decls): New global variable.
- (main): Process DEFINE_CPU_UNIT, DEFINE_QUERY_CPU_UNIT,
- DEFINE_BYPASS, EXCLUSION_SET, PRESENCE_SET, ABSENCE_SET,
- DEFINE_AUTOMATON, AUTOMATA_OPTION, DEFINE_RESERVATION,
- DEFINE_INSN_RESERVATION. Call expand_automata and write_automata.
-
- * genautomata.c: New file.
-
- * rtl.h (LINK_COST_ZERO, LINK_COST_FREE): Remove them.
-
- * sched-int.h: (curr_state): Add the external definition for
- automaton pipeline interface.
- (haifa_insn_data): Add comments for members blockage and units.
-
- * target-def.h (TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE,
- TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN,
- TARGET_SCHED_DFA_PRE_CYCLE_INSN,
- TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN,
- TARGET_SCHED_DFA_POST_CYCLE_INSN,
- TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD,
- TARGET_SCHED_INIT_DFA_BUBBLES, TARGET_SCHED_DFA_BUBBLE): New
- macros.
- (TARGET_SCHED): Use the new macros.
-
- * target.h (use_dfa_pipeline_interface, init_dfa_pre_cycle_insn,
- dfa_pre_cycle_insn, init_dfa_post_cycle_insn, dfa_post_cycle_insn,
- first_cycle_multipass_dfa_lookahead, init_dfa_bubbles,
- dfa_bubble): New members in gcc_target.sched.
-
- * haifa-sched.c (insert_schedule_bubbles_p): New variable.
- (MAX_INSN_QUEUE_INDEX): New macro for automaton interface.
- (insn_queue): Redefine it as pointer to array.
- (NEXT_Q, NEXT_Q_AFTER): Use MAX_INSN_QUEUE_INDEX instead of
- INSN_QUEUE_SIZE.
- (max_insn_queue_index_macro_value): New variable.
- (curr_state, dfa_state_size, ready_try): New varaibles for
- automaton interface.
- (ready_element, ready_remove, max_issue): New function prototypes
- for automaton interface.
- (choose_ready): New function prototype.
- (insn_unit, blockage_range): Add comments.
- (unit_last_insn, unit_tick, unit_n_insns): Define them for case
- FUNCTION_UNITS_SIZE == 0.
- (insn_issue_delay, actual_hazard_this_instance, schedule_unit,
- actual_hazard, potential_hazard): Add comments.
- (insn_cost): Use cost -1 as undefined value. Remove
- LINK_COST_ZERO and LINK_COST_FREE. Add new code for automaton
- pipeline interface.
- (ready_element, ready_remove): New functions for automaton
- interface.
- (schedule_insn): Add new code for automaton pipeline interface.
- (queue_to_ready): Add new code for automaton pipeline interface.
- Use MAX_INSN_QUEUE_INDEX instead of INSN_QUEUE_SIZE.
- (debug_ready_list): Print newline when the queue is empty.
- (max_issue): New function for automaton pipeline interface.
- (choose_ready): New function.
- (schedule_block): Add new code for automaton pipeline interface.
- Print ready list before scheduling each insn.
- (sched_init): Add new code for automaton pipeline interface.
- Initiate insn cost by -1.
- (sched_finish): Free the current automaton state and finalize
- automaton pipeline interface.
-
- * sched-rgn.c: Include target.h.
- (init_ready_list, new_ready, debug_dependencies): Add new code for
- automaton pipeline interface.
-
- * sched-vis.c: Include target.h.
- (get_visual_tbl_length): Add code for automaton interface.
- (target_units, print_block_visualization): Add comments.
-
- * Makefile.in (GETRUNTIME, HASHTAB, HOST_GETRUNTIME, HOST_HASHTAB,
- USE_HOST_GETRUNTIME, USE_HOST_HASHTAB, HOST_VARRAY): New variables.
- (sched-rgn.o, sched-vis.o): Add new dependency file target.h.
- (getruntime.o, genautomata.o): New entries.
- (genattrtab.o): Add new dependency file genattrtab.h.
- (genattrtab): Add new dependencies. Link it with `libm.a'.
- (getruntime.o, hashtab.o): New entries for canadian cross.
-
- * doc/md.texi: Description of automaton based model.
-
- * doc/tm.texi (TARGET_SCHED_ISSUE_RATE, TARGET_SCHED_ADJUST_COST):
- Add comments.
- (TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE,
- TARGET_SCHED_DFA_PRE_CYCLE_INSN,
- TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN,
- TARGET_SCHED_DFA_POST_CYCLE_INSN,
- TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN,
- TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD,
- TARGET_SCHED_INIT_DFA_BUBBLES, TARGET_SCHED_DFA_BUBBLE): The new
- hook descriptions.
- (TRADITIONAL_PIPELINE_INTERFACE, DFA_PIPELINE_INTERFACE,
- MAX_DFA_ISSUE_RATE): New macro descriptions.
-
- * doc/contrib.texi: Add dfa based scheduler contribution.
-
- * doc/gcc.texi: Add more information about genattrtab.
-
-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 DJ Delorie <dj@redhat.com>
-
- * config/mips/mips.c (mips_parse_cpu): Warn if the CPU name is
- given in upper case.
-
-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 Nick Clifton <nickc@cambridge.redhat.com>
-
- * toplev.c (f_options): Add "profile" switch so that
- -fno-profile can be used to disable -p.
-
-2002-04-29 Bernd Schmidt <bernds@redhat.com>
-
- * c-common.c (type_for_mode): Add support for V2DFmode, V2DImode,
- UV2DImode.
- * tree.c (build_common_tree_nodes_2): Likewise.
- * tree.h (enum tree_index): Likewise.
- (V2DF_type_node, V2DI_type_node, unsigned_V2DI_type_node): Define.
-
- * config/i386/i386.c (bdesc_comi, bdesc_2arg, bdesc_1arg): Add SSE2
- entries.
- (init_mmx_sse_builtins): Initialize SSE2 builtins.
- (ix86_expand_builtin): Add support for SSE2 builtins.
- * config/i386/i386.h (VALID_SSE2_REG_MODE): New macro.
- (VALID_SSE_REG_MODE): Use it.
- (VECTOR_MODE_SUPPORTED_P): Allow SSE2 modes here as well.
- (enum ix86_builtins): Add SSE2 builtins.
- * config/i386/i386.md (movv2df_internal, movv2df, movv8hi_internal,
- movv8hi, movv16qi_internal, movv16qi, pushv2df, pushv8hi, pushv16qi,
- addv2df3, vmaddv2df3, subv2df3, vmsubv2df3, mulv2df3, vmmulv2df3,
- divv2df3, vmdivv2df3, smaxv2df3, vmsmaxv2df3, sminv2df3, vmsminv2df3,
- sse2_anddf3, sse2_nanddf3, sse2_iordf3, sse2_xordf3, sqrtv2df2,
- vmsqrtv2df2, maskcmpv2df3, maskncmpv2df3, vmmaskcmpv2df3,
- vmmaskncmpv2df3, sse2_comi, sse2_ucomi, sse2_movmskpd, sse2_pmovmskb,
- sse2_maskmovdqu, sse2_movntv2df, sse2_movntti, sse2_movntsi, cvtdq2ps,
- cvtps2dq, cvttps2dq, cvtdq2pd, cvtpd2dq, cvttpd2dq, cvtpd2pi,
- cvttpd2pi, cvtpi2pd, cvtsd2si, cvttsd2si, cvtsi2sd, cvtsd2ss,
- cvtss2sd, cvtpd2ps, cvtps2pd, addv16qi3, addv8hi3, addv4si3, addv2di3,
- ssaddv16qi3, ssaddv8hi3, usaddv16qi3, usaddv8hi3, subv16qi3, subv8hi3,
- subv4si3, subv2di3, sssubv16qi3, sssubv8hi3, ussubv16qi3, ussubv8hi3,
- mulv8hi3, smulv8hi3_highpart, umulv8hi3_highpart, sse2_umulsidi3,
- sse2_umulv2siv2di3, sse2_pmaddwd, sse2_clrti, sse2_uavgv16qi3,
- sse2_uavgv8hi3, sse2_psadbw, sse2_pinsrw, sse2_pextrw, sse2_pshufd,
- sse2_pshuflw, sse2_pshufhw, eqv16qi3, eqv8hi3, eqv4si3, gtv16qi3,
- gtv8hi3, gtv4si3, umaxv16qi3, smaxv8hi3, uminv16qi3, sminv8hi3,
- ashrv8hi3, ashrv4si3, lshrv8hi3, lshrv4si3, sse2_lshrv2di3,
- ashlv8hi3, ashlv4si3, sse2_ashlv2di3, sse2_ashlti3, sse2_lshrti3,
- sse2_unpckhpd, sse2_unpcklpd, sse2_packsswb, sse2_packssdw,
- sse2_packuswb, sse2_punpckhbw, sse2_punpckhwd, sse2_punpckhdq,
- sse2_punpcklbw, sse2_punpcklwd, sse2_punpckldq, sse2_movapd,
- sse2_movupd, sse2_movdqa, sse2_movdqu, sse2_movdq2q, sse2_movq2dq,
- sse2_movhpd, sse2_movlpd, sse2_loadsd, sse2_movsd, sse2_storesd,
- sse2_shufpd, sse2_clflush, sse2_mfence, mfence_insn, sse2_lfence,
- lfence_insn): New patterns.
- (sse2_andti3, sse2_nandti3, sse2_iorti3, sse2_xorti3): Renamed from
- sse_andti3_sse2, sse_nandti3_sse2, sse_iorti3_sse2, sse_xorti3_sse2.
-
-Mon Apr 29 17:03:24 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (sse_mov?fcc*): Revert patch of Mar 14th.
-
-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.
-
-Mon Apr 29 13:36:41 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (flag_if_conversion, flag_if_conversion2): New static
- variables.
- (lang_independent_options): Add -fif-conversion, -fif-conversion2
- (rest_of_compilation): Do if conversion only when asked for.
- (parse_options_and_default_flags): Set new variables to 1 for -O1
- * invoke.texi (-fif-conversion, -fif-conversion2): Document.
-
-Mon Apr 29 13:02:50 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (dbx64_register_map): Fix typo.
-
-Mon Apr 29 12:18:35 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * predict.c (real_zero, real_one, real_almost_one, real_br_prob_base,
- real_one_half, real_bb_freq_max): New static variables.
- (debug_profile_bbauxs): Kill.
- (process_note_predictions): Kill unused variable.
- (block_info_def, edge_info_def): Use REAL_VALUE_TYPE instead of
- volatile double.
- (propagate_freq): Use REAL_ARITHMETICS.
- (estimate_bb_frequencies): Likevise; init new static variables.
- * Makefile.in (predict.o): Add dependency on real.h
-
-2002-04-28 David S. Miller <davem@redhat.com>
-
- 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-29 Hans-Peter Nilsson <hp@bitrange.com>
-
- * varasm.c (output_constant_def): Correct test for not calling
- ENCODE_SECTION_INFO for INTEGER_CST.
-
-2002-04-29 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppexp.c (lex): Move some code to _cpp_parse_expr, but
- keep most cases as function eval_token.
- (eval_token): New function.
- (_cpp_parse_expr): Read token here for improved diagnostics.
- Don't use op_as_text. Detect bad ':' here.
- (reduce): Don't detect bad ':' here.
- (op_as_text): Remove.
- * cpphash.h (_cpp_test_assertion): Change prototype.
- * cpplib.c (_cpp_test_assertion): Change prototype.
-
-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 Jakub Jelinek <jakub@redhat.com>
-
- PR target/6496
- * config/sparc/sparc.md (call + jump 32-bit peepholes): Disable jump
- after call peepholes for UltraSPARC.
- (call + jump 64-bit peepholes): Remove.
-
-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 c++/6396
- * toplev.c (rest_of_compilation): Only run regrename and copy
- propagation if optimizing.
-
-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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppexp.c (lex): Update to use state.skip_eval.
- (struct op): Remove prio and flags members.
- (FLAG_BITS, FLAG_MASK, PRIO_SHIFT, EXTRACT_PRIO, EXTRACT_FLAGS,
- SHORT_CIRCUIT, RIGHT_ASSOC, ..._PRIO, op_to_prio): Remove.
- (LEFT_ASSOC): New macro.
- (optab): New table of operator priorities and flags.
- (SHIFT): Update.
- (_cpp_parse_expr): Clean up logic. Return bool. Use a
- malloc-ed parser stack.
- (reduce): New; reduce the operator stack.
- (_cpp_expand_op_stack): Expand the operator stack as necessary.
- * cpphash.h (struct op): Predeclare.
- (struct cpp_reader): New members op_stack, op_limit.
- (struct lexer_state): New member skip_eval.
- (_cpp_parse_expr): Update.
- (_cpp_expand_op_stack): New.
- * cpplib.c (do_if): Update.
- * cppinit.c (cpp_create_reader): Create op stack.
- (cpp_destroy): And destroy it.
- * cpplib.h (CPP_LAST_CPP_OP): Correct.
- (TTYPE_TABLE): Correct.
-
-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-27 Kurt Garloff <garloff@suse.de>
-
- * tree-inline.c (inlinable_function_p): Improve heuristics
- by using a smoother function to cut down allowable inlinable size.
- * param.def: Add parameters max-inline-insns-single,
- max-inline-slope, min-inline-insns that determine the exact
- shape of the above function.
- * param.h: Likewise.
-
-2002-04-26 Richard Henderson <rth@redhat.com>
-
- * c-parse.in (malloced_yyss, malloced_yyvs): New.
- (yyoverflow): Re-add. Set them.
- (free_parser_stacks): New.
- * c-common.h: Declare it.
- * c-lex.c (c_common_parse_file): Call it.
-
-2002-04-26 Richard Henderson <rth@redhat.com>
-
- * cfgrtl.c (tidy_fallthru_edge): Don't use next_real_insn
- for fallthru search.
-
-2002-04-26 Eric Christopher <echristo@redhat.com>
-
- PR optimization/3700
- * config/mips/mips.c (mips_issue_rate): Define. New function.
- (TARGET_SCHED_ISSUE_RATE): Use.
-
-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 Richard Henderson <rth@redhat.com>
-
- PR c/5225
- * c-typeck.c (build_unary_op) [CONVERT_EXPR]: Invoke non_lvalue.
-
-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 Alexandre Oliva <aoliva@redhat.com>
-
- * tree.c (tree_int_cst_lt): Compare constants whose types differ
- in unsigned-ness correctly.
-
-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 Richard Henderson <rth@redhat.com>
-
- * c-parse.in (yyoverflow): Revert.
-
-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 (fix_string_type): Split out of ...
- (combine_strings): ... here. Take a varray, not a tree list.
- (c_expand_builtin_printf): Use fix_string_type.
- * c-common.h: Update decls.
- * c-parse.in (string): Remove. Update all uses to use STRING
- instead, and not call combine_strings.
- (yylexstring): New.
- (_yylex): Use it.
- * c-typeck.c (simple_asm_stmt): Don't call combine_strings.
- (build_asm_stmt): Likewise.
- * objc/objc-act.c (my_build_string): Use fix_string_type.
- (build_objc_string_object): Build varray for combine_strings.
-
-2002-04-26 Bo Thorsen <bo@suse.co.uk>
-
- * config/i386/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Define for
- x86-64.
-
-2002-04-26 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppexp.c (CPP_UMINUS, CPP_UPLUS): New.
- (HAVE_NO_R_OPERAND): Remove.
- (HAVE_VALUE): Remove.
- (op_to_prio): Update.
- (UNARY): Don't alter flags.
- (_cpp_parse_expr): want_value used to indicate whether
- a number or unary operator is expected next. Distinguish
- unary and binary +/-.
- (op_as_text): Update for unary operators.
-
-2002-04-25 Richard Henderson <rth@redhat.com>
-
- PR c/2161
- * c-parse.in (yyoverflow): New.
-
-2002-04-25 Richard Henderson <rth@redhat.com>
-
- PR c/2098
- * c-common.c (shorten_compare): Simplfy conditions leading to
- the generation of a warning.
-
-2002-04-25 Richard Henderson <rth@redhat.com>
-
- PR c/2035
- * expmed.c (extract_bit_field): Fall through to generic code rather
- than aborting on subreg special case.
-
-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 Steve Christiansen <smc@us.ibm.com>
-
- * doc/md.texi (Machine Constraints): Add IA-64 constraints.
-
-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 Matt Hiller <hiller@redhat.com>
-
- * mips.c (mips_class_max_nregs, mips_register_move_cost): New
- functions.
- * mips.h (CLASS_MAX_NREGS, REGISTER_MOVE_COST): Redefine as calls
- of the corresponding functions.
- * mips-protos.h (mips_class_max_nregs, mips_register_move_cost):
- New prototypes.
-
-2002-04-25 Matt Hiller <hiller@redhat.com>
-
- * config/mips/mips.h (mips_sw_reg_names): Declare as extern.
-
- (ALL_COP_ADDITIONAL_REGISTER_NAMES): New macro.
- (FIRST_PSEUDO_REGISTER): Redefine considering coprocessor
- registers, adjust comment accordingly.
- (FIXED_REGISTERS, CALL_USED_REGISTERS, CALL_REALLY_USED_REGISTERS,
- reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS, REGISTER_NAMES,
- DEBUG_REGISTER_NAMES, REG_ALLOC_ORDER): Adjust to include entries
- for coprocessor registers.
- (ADDITIONAL_REGISTER_NAMES): Include
- ALL_COP_ADDITIONAL_REGISTER_NAMES.
-
- (COP0_REG_FIRST, COP0_REG_LAST, COP0_REG_NUM,
- COP2_REG_FIRST, COP2_REG_LAST, COP2_REG_NUM,
- COP3_REG_FIRST, COP3_REG_LAST, COP3_REG_NUM,
- COP0_REG_P, COP2_REG_P, COP3_REG_P, ALL_COP_REG_P,
- COPNUM_AS_CHAR_FROM_REGNUM, COP_REG_CLASS_P): New macros.
-
- (mips_char_to_class): Adjust comment to include coprocessor
- constraint letters.
-
- * config/mips/mips.c (coprocessor_operand, coprocessor2_operand):
- New functions.
- (mips_reg_names, mips_regno_to_class): Include coprocessor
- information.
- (mips_sw_reg_names): Ditto, make non-static.
- (mips_move_1word): Handle moves to and from coprocessor registers.
- (mips_move_2words): Handle moves to and from coprocessor
- registers.
- (mips_class_max_nregs, mips_register_move_cost): Handle
- coprocessor register classes.
- (override_options): Initialize mips_char_to_class and
- mips_hard_regno_mode_ok properly for coprocessor registers.
-
- * config/mips/mips.md (movdi_internal, movdi_internal2,
- movsi_internal1, movsi_internal2): Add constraint-sets for
- coprocessor registers.
- * testsuite/gcc.c-torture/mipscop-1.c: New testcase.
- * testsuite/gcc.c-torture/mipscop-1.x: Disable above if target
- isn't mips.
- * testsuite/gcc.c-torture/mipscop-2.c: New testcase.
- * testsuite/gcc.c-torture/mipscop-2.x: Disable above if target
- isn't mips.
- * testsuite/gcc.c-torture/mipscop-3.c: New testcase.
- * testsuite/gcc.c-torture/mipscop-3.x: Disable above if target
- isn't mips.
- * testsuite/gcc.c-torture/mipscop-4.c: New testcase.
- * testsuite/gcc.c-torture/mipscop-4.x: Disable above if target
- isn't mips.
-
- * doc/tm.texi: Document feature.
-
-2002-04-25 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * integrate.c (function_attribute_inlinable_p): Simplify.
- Check the table pointer is not NULL.
-
-2002-04-25 Steven Bosscher <S.Bosscher@student.tudelft.nl>
-
- * doc/c-tree.texi: Fix typo in introduction.
-
-2002-04-25 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.h (c_common_parse_file): Update.
- * c-lang.c (LANG_HOOKS_SET_YYDEBUG): Remove.
- * c-lex.c (YYDEBUG): Get from c-lex.h.
- (c_common_parse_file): Update.
- * c-lex.h (YYDEBUG, yydebug): New.
- * c-parse.in (YYDEBUG): Get from c-lex.h.
- (c_set_yydebug): Remove.
- * c-tree.h (c_set_yydebug): Remove.
- * langhooks-def.h (lhd_do_nothing_i): New.
- (lhd_set_yydebug, LANG_HOOKS_SET_YYDEBUG): Remove.
- (LANG_HOOKS_PARSE_FILE, LANG_HOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_do_nothing_i): New.
- (lhd_set_yydebug): Remove.
- * langhooks.h (struct lang_hooks): Update.
- * toplev.c (set_yydebug): New.
- (compile_file): Update call to parse_file hook.
- (decode_d_option): Update.
-objc:
- * objc-lang.c (LANG_HOOKS_SET_YYDEBUG): Remove.
-
-Wed Apr 24 23:45:37 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * loop.c (load_mems): Don't change the interface of called functions.
-
- * calls.c (expand_call): Take current_function_pretend_args_size
- into account when setting argblock for sibcalls.
-
-2002-04-24 Matt Hiller <hiller@redhat.com>
-
- * cpplex.c: Remove conditional #undef of MULTIBYTE_CHARS.
- * c-lex.c: Ditto.
-
- * cpplex.c (skip_line_comment): Process comment one multibyte
- character at a time rather than one char at a time, if
- appropriate.
- (parse_string): Process string one multibyte character at a time
- rather than one char at a time, if appropriate.
- * c-lex.c (lex_string): Lex and copy multibyte strings
- appropriately.
- * cpplib.h (cppchar_t): Change to unsigned.
-
-2002-04-24 Richard Henderson <rth@redhat.com>
-
- PR c/3467
- * c-decl.c (grokdeclarator): Don't pedwarn variable sized arrays
- for c99.
-
-Wed Apr 24 21:51:54 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.c (sh_va_arg): If argument was passed by reference,
- dereference the pointer.
-
- * sh.h (PIC_OFFSET_TABLE_REGNUM): Conditionalize on flag_pic.
-
- * sh.md (divsi3_i4_media): Use match_operand for input values
- rather than hard registers.
- (divsi3 - TARGET_SHMEDIA_FPU case): Don't ferry values
- unnecessarily through hard registers. Keep copies of pseudo
- registers outside of the libcall sequence.
-
- * sh.md (casesi_shift_media): Add modes.
-
- * sh.h (RETURN_IN_MEMORY): Return variable size BLKmode
- values in memory.
-
-2002-04-24 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * attribs.c (c_common_attribute_table): Move table and handlers
- to c-common.c.
- (format_attribute_table, lang_attribute_table,
- lang_attribute_common): Remove.
- (init_attributes): Replace NULL pointers with pointers to the
- empty table.
- (handle_packed_attribute, handle_nocommon_attribute,
- handle_common_attribute, handle_noreturn_attribute,
- handle_noinline_attribute, handle_always_inline_attribute,
- handle_used_attribute, handle_unused_attribute,
- handle_const_attribute, handle_transparent_union_attribute,
- handle_constructor_attribute, handle_destructor_attribute,
- handle_mode_attribute, handle_section_attribute,
- handle_aligned_attribute, handle_weak_attribute,
- handle_alias_attribute, handle_visibility_attribute,
- handle_no_instrument_function_attribute, handle_malloc_attribute,
- handle_no_limit_stack_attribute, handle_pure_attribute,
- handle_deprecated_attribute, handle_vector_size_attribute,
- vector_size_helper): Move to c-common.c.
- * c-common.c (c_common_attribute_table,
- handle_packed_attribute, handle_nocommon_attribute,
- handle_common_attribute, handle_noreturn_attribute,
- handle_noinline_attribute, handle_always_inline_attribute,
- handle_used_attribute, handle_unused_attribute,
- handle_const_attribute, handle_transparent_union_attribute,
- handle_constructor_attribute, handle_destructor_attribute,
- handle_mode_attribute, handle_section_attribute,
- handle_aligned_attribute, handle_weak_attribute,
- handle_alias_attribute, handle_visibility_attribute,
- handle_no_instrument_function_attribute, handle_malloc_attribute,
- handle_no_limit_stack_attribute, handle_pure_attribute,
- handle_deprecated_attribute, handle_vector_size_attribute,
- vector_size_helper): Move from attribs.c.
- * c-common.h (c_common_attribute_table,
- c_common_format_attribute_table): New.
- * c-lang.c (LANG_HOOKS_COMMON_ATTRIBUTE_TABLE,
- LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE): Redefine.
- * langhooks-def.h (LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE,
- LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, LANG_HOOKS_ATTRIBUTE_TABLE): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct lang_hooks): 3 new attribute hooks.
- * target-def.h (TARGET_ATTRIBUTE_TABLE): Default to NULL.
- * target.h: Update comment.
- * tree.c (default_target_attribute_table): Remove.
- * tree.h (default_target_attribute_table, format_attribute_table,
- lang_attribute_table, lang_attribute_common): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_COMMON_ATTRIBUTE_TABLE,
- LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE): Redefine.
-
-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 David S. Miller <davem@redhat.com>
-
- PR target/6420
- * config/sparc/sparc.h (FUNCTION_OK_FOR_SIBCALL): Return false if
- 32-bit Sparc and current_function_returns_struct is true.
-
-Wed Apr 24 13:48:25 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * loop.c (canonicalize_condition): Use gen_int_mode.
-
-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 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 Zack Weinberg <zack@codesourcery.com>
-
- * doc/install.texi: Clarify which versions of alpha*-dec-osf*
- are obsoleted.
-
-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>
-
- * 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 David O'Brien <obrien@FreeBSD.org>
-
- * config/freebsd.h(OBJECT_FORMAT_ELF): Define.
-
-Tue Apr 23 14:24:25 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (ix86_output_addr_diff_elt): Avoid x86_64 binutils bug
- workaround.
- (ix86_expand_int_movcc): Avoid x86_64 compilation chrash.
- (ix86_expand_clrstr): Fix typo.
- * loop.c (gen_load_of_final_value): New.
- (loop_givs_rescan, strength_reduce, check_dbra_loop):
- Use it.
-
-2002-04-23 Roger Sayle <roger@eyesopen.com>
-
- * builtins.c (builtin_memset_gen_str): New function.
- (expand_builtin_memset): Optimize the case of constant length, but
- unknown value.
-
-2002-04-23 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/altivec.h (vec_step): Remove extraneous
- parentheses.
- (vec_ctu): Cast return.
-
-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-22 Eric Christopher <echristo@redhat.com>
-
- * config/mips/mips.h (ASM_OUTPUT_ALIGNED_DECL_COMMON): Revert
- patch of 2002-04-09 due to binutils issues.
- (FUNCTION_ARG_REGNO_P): Ensure even numbered float register.
-
-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 Janis Johnson <janis187@us.ibm.com>
-
- * rtl.h (RTX_FLAG): New macro.
- * emit-rtl.c (copy_most_rtx): Use macros to access rtx flags.
- * final.c (alter_subreg): Use macro to access rtx flag.
- * integrate.c (copy_rtx_and_substitute): Use new access macro.
- * print-rtl.c (print_rtx): Use new access macro.
-
- * cse.c (insert): Check rtx code before accessing flag.
-
- * genattrtab.c (ATTR_IND_SIMPLIFIED_P, ATTR_CURR_SIMPLIFIED_P,
- ATTR_PERMANENT_P, ATTR_EQ_ATTR_P): New.
- (attr_hash_add_string, attr_rtx_1, attr_copy_rtx, check_attr_test,
- convert_const_symbol_ref, make_canonical, make_alternative_compare,
- evaluate_eq_attr, attr_rtx_cost, simplify_test_exp_in_temp,
- simplify_test_exp, optimize_attrs, simplify_by_exploding,
- find_and_mark_used_attributes, unmark_used_attributes,
- add_values_to_cover, simplify_with_current_value,
- simplify_with_current_value_aux, clear_struct_flag, walk_attr_value,
- copy_rtx_unchanging, main): Use new access macros.
-
-2002-04-22 Tom Rix <trix@redhat.com>
-
- * expmed.c (init_expmed): Generate shifted constant once.
-
-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 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 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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppfiles.c (_cpp_pop_file_buffer): Return void. Move
- file change and include code to _cpp_pop_buffer.
- * cpphash.h (struct pending_option): Predeclare.
- (struct cpp_reader): New member next_include_file.
- (_cpp_pop_file_buffer): Update.
- (_cpp_push_next_buffer): Update, rename.
- * cppinit.c (cpp_destroy): Free include chain and pending here.
- (cpp_finish_options): Simplify.
- (_cpp_push_next_buffer): Rename and clean up.
- * cpplib.c (cpp_pop_buffer): Move code from _cpp_pop_file_buffer.
- Clarify.
- * cppmacro.c (cpp_scan_nooutput): Set return_at_eof here.
-
-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>
-
- * cppexp.c (struct op, parse_number): Replace U_CHAR with uchar.
- * cppfiles.c (read_include_file): Similarly.
- * cpphash.h (DSC, U_CHAR, ustrcmp, ustrncmp, ustrlen,
- uxstrdup ustrchr, ufputs): Similarly.
- * cppinit.c (TRIGRAPH_MAP, cpp_destroy): Similarly.
- * cpplex.c (parse_slow, unescaped_terminator_p, save_comment,
- cpp_ideq, parse_identifier, parse_number): Similarly.
- * cpplib.c (struct directive, dequote_string, D, run_directive,
- cpp_push_buffer): Similarly.
- * cppmacro.c (new_string_token, builtin_macro, cpp_quote_string,
- _cpp_create_definition, check_trad_stringification,
- cpp_macro_definition): Similarly.
-
-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-20 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/lib1funcs.asm (___mulsi3): Remove unnecessary
- push and pop. Replace add.l with add.w.
-
-2002-04-20 Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com>
-
- * config/h8300/lib1funcs.asm (___mulsi3): Use hardware
- multiply instructions for H8/300H case.
-
-2002-04-20 Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com>
-
- * config/h8300/lib1funcs.asm (___cmpsi2, ___ucmpsi2):
- Bum three instructions from each routine.
-
-2002-04-20 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in: Update.
- * decl.c (push_c_function_context, pop_c_function_context,
- mark_c_function_context): Rename for consistency.
- * c-objc-common.c (c_objc_common_init): Langhooks set elsewhere.
- * c-tree.h (push_c_function_context, pop_c_function_context,
- mark_c_function_context): Rename for consistency.
- * c-lang.c (LANG_HOOKS_FUNCTION_ENTER_NESTED,
- LANG_HOOKS_FUNCTION_LEAVE_NESTED, LANG_HOOKS_FUNCTION_MARK): Redefine.
- * function.c (init_lang_status, save_lang_status,
- restore_lang_status, mark_lang_status, free_lang_status):
- Move to langhooks.h.
- (push_function_context_to, pop_function_context_from,
- free_after_parsing, prepare_function_start, ggc_mark_struct_function):
- Update.
- * function.h (init_lang_status, save_lang_status,
- restore_lang_status, mark_lang_status, free_lang_status):
- Move to langhooks.h.
- * langhooks-def.h (LANG_HOOKS_FUNCTION_INIT,
- LANG_HOOKS_FUNCTION_FREE, LANG_HOOKS_FUNCTION_ENTER_NESTED,
- LANG_HOOKS_FUNCTION_LEAVE_NESTED, LANG_HOOKS_FUNCTION_MARK,
- LANG_HOOKS_FUNCTION_INITIALIZER): New.
- (LANG_HOOKS_INITIALIZER): Update.
- (lhd_do_nothing_f): New.
- * langhooks.h (struct lang_hooks_for_functions): New.
- (struct lang_hooks): New hooks.
- * langhooks.c (lhd_do_nothing_f): New.
-objc:
- * objc-lang.c (LANG_HOOKS_FUNCTION_ENTER_NESTED,
- LANG_HOOKS_FUNCTION_LEAVE_NESTED, LANG_HOOKS_FUNCTION_MARK): Redefine.
-
-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.
-
-2002-04-19 Jakub Jelinek <jakub@redhat.com>
-
- PR optimization/3756
- * config/i386/i386.c (ix86_expand_int_movcc): Optimize
- x = ((int) y < 0) ? cst1 : cst2.
-
-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 Andreas Schwab <schwab@suse.de>
-
- * real.c: Allow sizeof (REAL_VALUE_TYPE) > 2*NE.
- (PUT_REAL): Restore old definition.
-
-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.
-
-Fri Apr 19 15:53:03 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (movsi_1, movhi_1): Force reload to use more flexible
- alternative.
-
-2002-04-19 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * builtins.c: Include langhooks.h.
- (lang_type_promotes_to): Remove.
- (expand_builtin_va_arg): Use new hook.
- * c-common.c (c_common_nodes_and_builtins): Don't set hook.
- (simple_type_promotes_to): Move to c-typeck.c.
- * c-common.h (simple_type_promotes_to): Remove.
- * c-decl.c (duplicate_decls, grokdeclarator): Update.
- * c-format.c: Include langhooks.h.
- (check_format_types): Update.
- * c-tree.h (c_type_promotes_to): New.
- * c-typeck.c (c_type_promotes_to): Move from c-common.c.
- (type_lists_compatible_p): Update.
- * langhooks-def.h (lhd_type_promotes_to): New.
- (LANG_HOOKS_TYPE_PROMOTES_TO): New.
- (LANG_HOOKS_FOR_TYPES_INITIALIZER): Update.
- * langhooks.c (lhd_type_promotes_to): New.
- * langhooks.h (struct lang_hooks_for_types): New hook.
- * tree.h (lang_type_promotes_to): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_TYPE_PROMOTES_TO): Redefine.
-
-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 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/lib2funcs.S (__xtensa_libgcc_window_spill,
- __xtensa_nonlocal_goto): Use a syscall instructions to flush
- the register windows.
-
-2002-04-18 Zack Weinberg <zack@codesourcery.com>
-
- * real.h: Define REAL_VALUE_TYPE_SIZE as 96 or 160, as
- appropriate. Document need for extended precision even when
- MAX_LONG_DOUBLE_TYPE_SIZE is smaller. Define REAL_WIDTH here,
- based on REAL_VALUE_TYPE_SIZE. Use REAL_WIDTH to size
- REAL_VALUE_TYPE. Define CONST_DOUBLE_FORMAT here. Use #error
- instead of relying on later syntax error when REAL_WIDTH > 5.
- * real.c: Define NE based only on whether or not we have a
- full 128-bit extended type (not INTEL_EXTENDED_IEEE_FORMAT).
- Require sizeof(REAL_VALUE_TYPE) == 2*NE. Unconditionally
- define GET_REAL and PUT_REAL as simple memcpy operations; no
- need to byteswap or round.
- Use #error instead of #ifdef-ing out the entire file, for
- prompt error detection.
-
- * rtl.c, gengenrtl.c: No need to calculate CONST_DOUBLE_FORMAT here.
-
-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 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>
-
- * 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 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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-lang.c (LANG_HOOKS_INCOMPLETE_TYPE_ERROR): Redefine.
- * c-tree.h (c_incomplete_type_error): New.
- * c-typeck.c (require_complete_type, build_component_ref): Update.
- (incomplete_type_error): Rename.
- * langhooks-def.h (lhd_incomplete_type_error): New.
- (LANG_HOOKS_INCOMPLETE_TYPE_ERROR): New.
- (LANG_HOOKS_FOR_TYPES_INITIALIZER): Update.
- * langhooks.c (lhd_incomplete_type_error): New.
- * langhooks.h (struct lang_hooks_for_types): New hook.
- * tree.c (size_in_bytes): Use new hook.
- * tree.h (incomplete_type_error): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_INCOMPLETE_TYPE_ERROR): Redefine.
-
-2002-04-18 Zack Weinberg <zack@codesourcery.com>
-
- * config/arc/arc.md: Remove #if HOST_FLOAT_FORMAT !=
- TARGET_FLOAT_FORMAT blocks.
-
-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 17:14:08 CEST 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.h (SSE_FLOAT_MODE_P): Fix bogus conflict resolution
- in last patch.
-
-2002-04-18 Jakub Jelinek <jakub@redhat.com>
-
- * fold-const.c (fold): Use (*lang_hooks.types.unsigned_type)
- instead of unsigned_type.
-
-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 Bernd Schmidt <bernds@redhat.com>
-
- * attribs.c (vector_type_node_list): New static variable.
- (handle_vector_size_attribute): Use it to avoid generating a
- new type node each time we are called.
-
- * combine.c (subst): Avoid trying to make a vector mode subreg of
- an integer constant.
- (gen_lowpart_for_combine): Likewise.
-
-2002-04-18 Roger Sayle <roger@eyesopen.com>
- Jakub Jelinek <jakub@redhat.com>
-
- * fold-const.c (fold) [NOP_EXPR]: Convert (T)(x&c) into ((T)x&(T)c)
- for integer constant c (if x has unsigned type or sign bit is not
- set in c). This folds the zero/sign extension into the bit-wise and
- operation.
-
-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-17 NIIBE Yutaka <gniibe@m17n.org>
-
- * config/sh/elf.h: Undefine ASM_OUTPUT_CASE_LABEL.
-
-2002-04-17 Nick Clifton <nickc@cambridge.redhat.com>
-
- * gcc.c (read_specs): Detect and fail if an attempt is made to
- rename a spec string to an already existing string.
-
-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 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 6202
- * config/mips/mips.md (can_delay): Split out of existing define_delays.
- (HILO_delay): Set can_delay false.
-
-2002-04-16 Dale Johannesen <dalej@apple.com>
-
- * config/rs6000/rs6000.c (rs6000_output_function_prologue): Compute
- instruction addresses.
- (rs6000_output_function_epilogue): Likewise.
-
-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 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.
-
-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 Richard Henderson <rth@redhat.com>
-
- * config/alpha/gnu.h (CPP_PREDEFINES): Underscores for gnu_hurd.
-
-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 Roland McGrath <roland@frob.com>
-
- * config.gcc (alpha*-*-gnu*): New target configuration.
- * config/alpha/gnu.h: New file for it.
- * config/gnu.h (TARGET_MEM_FUNCTIONS): #undef before #define.
-
-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-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-15 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
-
- * diagnostic.h (output_buffer_state): Redefine.
- (output_format_decoder): New macro.
- (output_prefixing_rule): Likewise.
- (output_line_cutoff): Likewise.
- (diagnostic_format_decoder): Adjust.
- (diagnostic_prefixing_rule): Likewise.
- (diagnostic_line_cutoff): Likewise.
- (diagnostic_state): Likewise.
- (diagnostic_kind_count): Likewise.
- (diagnostic_buffer): Now a macro.
-
- * diagnostic.c (diagnostic_buffer): Remove definition.
- (output_is_line_wrapping): Adjust.
- (set_real_maximum_length): Likewise.
- (output_set_maximum_length): Likewise.
- (init_output_buffer): Likewise.
- (lhd_print_error_function): Likewise.
- (output_do_verbatim): Likewise.
-
-2002-04-14 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpperror.c (print_location): Don't print include chain
- if line == 0.
- (cpp_begin_message): Update to use DL_ macros.
- (cpp_ice, cpp_fatal, cpp_error_from_errno, cpp_warning,
- cpp_warning_with_line, cpp_pedwarn, cpp_pedwarn_with_line,
- cpp_notice, cpp_notice_from_errno): Remove.
- (cpp_error, cpp_error_with_line): Update to take a diagnostic
- level.
- (cpp_errno): New.
- * cppexp.c (CPP_ICE): Remove.
- (SYNTAX_ERROR, SYNTAX_ERROR2, parse_number, parse_defined,
- lex, integer_overflow, _cpp_parse_expr): Update.
- * cppfiles.c (read_include_file, find_include_file,
- handle_missing_header, _cpp_read_file, remap_filename): Update.
- * cpphash.h (enum error_type): Remove.
- (_cpp_begin_message): Update.
- * cppinit.c (append_include_chain, remove_dup_dirs, output_deps,
- cpp_handle_option, cpp_post_options): Update.
- * cpplex.c (trigraph_p, skip_escaped_newlines, skip_block_comment,
- skip_whitespace, parse_identifier, parse_slow, parse_string,
- _cpp_lex_direct, cpp_spell_token, maybe_read_ucs, cpp_parse_escape,
- cpp_interpret_charconst): Update.
- * cpplib.c (check_eol, directive_diagnostics, _cpp_handle_directive,
- lex_macro_node, do_undef, glue_header_name, parse_include,
- do_include_common, read_flag, do_line, do_linemarker, do_ident,
- cpp_register_pragma, do_pragma_once, do_pragma_system_header,
- do_pragma_poison, do_pragma_dependency, _cpp_do__Pragma, do_else,
- do_elif, do_endif, parse_answer, parse_assertion, do_assert,
- _cpp_pop_buffer, do_diagnostic): Update.
- * cpplib.h (DL_WARNING, DL_WARNING_SYSHDR, DL_PEDWARN, DL_ERROR,
- DL_FATAL, DL_ICE, DL_EXTRACT, DL_WARNING_P): New.
- (cpp_ice, cpp_fatal, cpp_error_from_errno, cpp_warning,
- cpp_warning_with_line, cpp_pedwarn, cpp_pedwarn_with_line,
- cpp_notice, cpp_notice_from_errno): Remove.
- (cpp_error, cpp_error_with_line): Update to take a diagnostic
- level.
- (cpp_errno): New.
- * cppmacro.c (builtin_macro, stringify_arg, paste_all_tokens,
- collect_args, enter_macro_context, save_parameter, parse_params,
- _cpp_create_definition, check_trad_stringification,
- cpp_macro_definition): Update.
- * cppmain.c (cpp_preprocess_file): Update.
- * fix-header.c (read_scan_file): Update.
-
-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/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 Richard Sandiford <rsandifo@redhat.com>
-
- * stmt.c (check_unique_operand_names): Expect operand names to
- be strings rather than identifiers. Use simple_cst_equal to
- compare them.
- (resolve_operand_name_1): Make same identifier to string change here.
- * c-parse.in (asm_operand): Convert a named operand into a string.
- * cp/parse.y (asm_operand): 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-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>
-
- * 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 Jan Hubicka <jh@suse.cz>
- David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.c (call_operand): Allow LINK and COUNT
- registers.
- (symbol_ref_operand): New.
- * config/rs6000/rs6000.h (PREDICATE_CODES): Add symbol_ref_operand.
- * config/rs6000/rs6000.md (call_nonlocal_aix): Use symbol_ref_operand.
-
-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.
-
-Fri Apr 12 12:11:26 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.c (calc_live_regs, sh_pr_n_sets): Use of PR_MEDIA_REG / PR_REG
- depends on TARGET_SHMEDIA, not TARGET_SH5.
-
-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.
-
-Fri Apr 12 10:51:38 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * sh.c (broken_move): Constant 0. / 1. load is OK if there is
- no r0 clobber.
-
-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 (pa_output_function_prologue): Don't accumulate the total
- number of code bytes when using TARGET_64BIT, or gas, SOM and not
- the portable runtime.
- (output_deferred_plabels): Handle 64bit plabels.
- (output_cbranch): Use $PIC_pcrel$0 for pc relative relocations when
- generating pic code using the GAS assembler for object formats that
- are not SOM (ie., ELF32 and ELF64).
- (output_millicode_call): Check attribute type if attribute length is 28.
- Likewise use $PIC_pcrel$0. Only call get_attr_length and
- dbr_sequence_length once.
- (output_call): Likewise use $PIC_pcrel$0, and call get_attr_length and
- dbr_sequence_length once.
- * pa.h (TARGET_SOM): Define if not defined.
- * pa.md (pattern to load address of label): Likewise use $PIC_pcrel$0
- with GAS and not SOM.
- (jump, call_internal_reg, call_value_internal_reg): Likewise.
- * som.h (OBJ_SOM): Rename to TARGET_SOM. Undefine before defining.
-
-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 Henderson <rth@redhat.com>
-
- * config.gcc (alpha*-*-linux*ecoff): Detect and reject.
-
-2002-04-11 David O'Brien <obrien@FreeBSD.org>
-
- * config.gcc (alpha*-*-openbsd, alpha64-dec-*vms,alpha*-dec-*vms):
- Include {cpu}/{cpu}.h thru tm_file.
- (alpha*-*-linux*ecoff): Remove target.
- * config/alpha/elf.h (CPP_SUBTARGET_SPEC): Define __ELF__.
- (LINK_SPEC): Remove, is not OS independent.
- * config/alpha/freebsd.h (CPP_SPEC): Do not define __ELF__.
- (LINK_SPEC): Do not need to #undef any longer.
- * config/alpha/linux-ecoff.h (LINK_SPEC): Do not need to #undef
- any longer.
- * config/alpha/linux-elf.h (SUB_CPP_PREDEFINES): Do not define
- __ELF__.
- (LINK_SPEC): Moved here from alpha/elf.h.
- * config/alpha/linux.h (CPP_PREDEFINES): No longer consumer of
- SUB_CPP_PREDEFINES.
- * config/alpha/linux-ecoff.h: Remove.
- * config/alpha/netbsd.h (CPP_PREDEFINES): Do not define __ELF__.
- (CPP_SPEC): Define _POSIX_SOURCE as needed.
- (CPP_SUBTARGET_SPEC): Do not define.
- (LINK_SPEC): Do not need to #undef any longer.
- * config/alpha/openbsd.h: Do not directly include alpha/alpha.h.
- * config/alpha/vms.h: Likewise.
-
-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-10 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.
-
- * t-cris (TARGET_LIBGCC2_CFLAGS): Don't -Dinhibit_libc here.
-
-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 Toon Moene <toon@moene.indiv.nluug.nl>
-
- * c-decl.c (c_init_decl_processing): Move generation of
- decls for g77_integer_type_node and friends from here ...
- * c-common.c (c_common_nodes_and_builtins): ... to here.
-
-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 Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips.c (mips_va_arg): When using the struct version
- of the EABI va_list, allow arguments in the register save area to
- take up less room than a stack argument.
-
-2002-04-10 Richard Henderson <rth@redhat.com>
-
- * expr.c (expand_expr) [INTEGER_CST]: Don't force into registers
- if EXPAND_INITIALIZER.
-
-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-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 Eric Christopher <echristo@redhat.com>
-
- * config/mips/mips.h (ASM_OUTPUT_ALIGNED_DECL_COMMON): Add additional
- information to .comm directive.
-
-2002-04-09 Richard Henderson <rth@redhat.com>
-
- PR c/5078
- * expr.c (expand_expr) [INTEGER_CST]: Force overflows into registers.
-
-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-09 Richard Henderson <rth@redhat.com>
-
- * sbitmap.c (sbitmap_union_of_diff, sbitmap_a_and_b, sbitmap_a_xor_b,
- sbitmap_a_or_b, sbitmap_a_or_b_and_c, sbitmap_a_and_b_or_c):
- Do not return changed status.
- (sbitmap_union_of_diff_cg, sbitmap_a_and_b_cg, sbitmap_a_xor_b_cg,
- sbitmap_a_or_b_cg, sbitmap_a_or_b_and_c_cg, sbitmap_a_and_b_or_c_cg):
- New functions that do return changed status.
- * sbitmap.h: Update decls.
- * gcse.c, lcm.c: Use _cg functions as needed.
-
-Tue Apr 9 19:15:57 2002 J"orn Rennecke <joern.rennecke@superh.com>
-
- * config.gcc (sh-*-elf*): Use sh/embed-elf.h instead of sh/elf.h.
- (sh64-*-elf*, sh-*-rtemself*): Likewise.
- * config/sh/embed_bb.c: New file.
- * config/sh/embed-elf.h: New file.
- * sh.h (CPP_SPEC): Supply __SIZE_TYPE__ and __PTRDIFF_TYPE__
- if -m[12345]* option is given. Don't use subtarget_cpp_ptr_spec.
- (CPP_DEFAULT_CPU_SPEC): Add settings for __SIZE_TYPE__ and
- __PTRDIFF_TYPE__ .
- (SUBTARGET_CPP_PTR_SPEC): Don't define.
- (EXTRA_SPECS): Remove subtarget_cpp_ptr_spec.
- Add subtarget_asm_endian_spec.
- (ASM_SPEC): Use subtarget_asm_endian_spec.
- (SUBTARGET_ASM_ENDIAN_SPEC): Define.
- (RETURN_ADDR_RTX): Use PR_MEDIA_REG for TARGET_SH5.
- (WCHAR_UNSIGNED): Define.
- (SH_ELF_WCHAR_TYPE, SH_DBX_REGISTER_NUMBER): Define.
- (DBX_REGISTER_NUMBER): Use SH_DBX_REGISTER_NUMBER.
- (ALLOCATE_INITIAL_VALUE): Use PR_MEDIA_REG for TARGET_SH5.
- Fix value.
- * sh.c (calc_live_regs): Use PR_MEDIA_REG for TARGET_SH5.
- (sh_adjust_cost): Likewise.
- sh64.h (CPP_DEFAULT_CPU_SPEC): Add settings for __SIZE_TYPE__ and
- __PTRDIFF_TYPE__ .
- (SUBTARGET_CPP_PTR_SPEC, WCHAR_TYPE): Don't #undef/ #define.
- (WCHAR_TYPE_SIZE): Likewise.
- (ASM_SPEC): Use subtarget_asm_endian_spec.
- (SH_ELF_WCHAR_TYPE): #undef/ #define.
- (MAX_WCHAR_TYPE_SIZE): Don't #undef.
- * config/sh/elf.h (WCHAR_UNSIGNED): #undef .
- (MAX_WCHAR_TYPE_SIZE): Don't #define .
- (WCHAR_TYPE, WCHAR_TYPE_SIZE): #undef / #define .
- (USER_LABEL_PREFIX): Don't #undef /#define .
- (DBX_REGISTER_NUMBER): Use SH_DBX_REGISTER_NUMBER.
- * config/elf/linux.h (USER_LABEL_PREFIX): Don't #undef /#define .
- (SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE, WCHAR_TYPE_SIZE): Likewise.
- (ASM_SPEC): Likewise.
- (SUBTARGET_ASM_ENDIAN_SPEC): #undef / #define .
- (CC1_SPEC): don't supply -m3 for -m4*, -m5*.
- * t-sh: (LIB1ASMFUNCS): Use LIB1ASMFUNCS_CACHE.
- (LIB2FUNCS_EXTRA): Define.
- * t-sh64 (LIB2FUNCS_EXTRA): Define.
- * config/sh/t-linux (LIB1ASMFUNCS): Don't redefine.
- (LIB1ASMFUNCS_CACHE): Define.
- (LIB2FUNCS_EXTRA): Redefine empty.
-
-2002-04-08 Richard Henderson <rth@redhat.com>
-
- * reorg.c (get_branch_condition): Use reversed_comparison_code.
-
-2002-04-09 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-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 Andreas Jaeger <aj@suse.de>
-
- * stmt.c (expand_asm_operands): Revert last patch from Richard
- Henderson.
-
-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-08 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/contrib.texi (Contributors): Add David O'Brien.
-
-2002-04-08 Alan Modra <amodra@bigpond.net.au>
-
- * configure.in (auto-build.h): Use target_alias and build_alias
- when running configure.
- (gcc_cv_as, gcc_cv_ld): Search install paths when build != host too.
- (gcc_cv_nm, gcc_cv_objdump): Set for build != host too.
- * configure: Regenerate.
-
-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-06 Jason Thorpe <thorpej@wasabisystems.com>
-
- * cppinit.c (cpp_create_reader): Initialize
- discard_comments_in_macro_exp.
- (COMMAND_LINE_OPTIONS): Add "-CC" option.
- (cpp_handle_option): Handle "-CC" option.
- * cpplex.c (save_comment): If saving a C++ comment in
- a directive, convert it to a C comment.
- (_cpp_lex_direct): Pass second comment start character to
- save_comment to indicate comment type.
- * cpplib.c (_cpp_handle_directive): If processing
- a "#define" directive and discard_comments_in_macro_exp
- is false, re-enable saving of comments.
- (lex_macro_node): If discard_comments_in_macro_exp is false,
- discard any comments before the macro identifier.
- * cpplib.h (struct cpp_options): Add discard_comments_in_macro_exp
- member.
- * cppmacro.c (cpp_get_token): If expanding a macro while
- processing a directive, discard any comments we might encounter.
- (parse_params): If discard_comments_in_macro_exp is false,
- ignore comments in the macro parameter list.
- * gcc.c (cpp_unique_options): Add "-CC" option.
- (option_map): Map "--comments-in-macros" to "-CC".
- * doc/cppopts.texi: Document "-CC" option.
- * f/lang-specs.h: Add "-CC" option.
- * testsuite/gcc.dg/cpp/maccom1.c: New test.
- * testsuite/gcc.dg/cpp/maccom2.c: New test.
- * testsuite/gcc.dg/cpp/maccom3.c: New test.
- * testsuite/gcc.dg/cpp/maccom4.c: New test.
- * testsuite/gcc.dg/cpp/maccom5.c: New test.
- * testsuite/gcc.dg/cpp/maccom6.c: New test.
-
-2002-04-06 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- PR middle-end/6180
- * 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.
-
-2002-04-06 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-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 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 Richard Henderson <rth@redhat.com>
-
- * doc/rtl.texi (Regs and Memory): Document (mem:BLK (scratch)).
-
-2002-04-05 Jakub Jeilnek <jakub@redhat.com>
-
- * mklibgcc.in: Use $tmpmapfile, not tmp-$@.
-
-2002-04-05 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.h (ISA_HAS_BRANCHLIKELY, ISA_HAS_CONDMOVE,
- ISA_HAS_FP4, ISA_HAS_MADD_MSUB, ISA_HAS_NMADD_NMSUB,
- ISA_HAS_CLZ_CLO, ISA_HAS_DCLZ_DCLO): Disable if TARGET_MIPS16.
-
-2002-04-05 Andreas Schwab <schwab@suse.de>
-
- * c-convert.c: Include c-common.h.
- * Makefile.in (c-convert.o): Updated.
-
-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 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips.h (CUMULATIVE_ARGS): Rename fp_regs to num_fprs
- to avoid clash with Irix header file sys/ucontext.h. Rename gp_regs
- to num_gprs for symmetry.
- * config/mips/mips.c: Adjust accordingly.
-
-2002-04-04 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (truthvalue_conversion): Rename, update.
- * c-common.h (c_common_truthvalue_conversion): New.
- * c-convert.c (convert): Update.
- * c-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine.
- * c-parse.in (expr_no_commas, if_prefix, select_or_iter_stmt): Update.
- * c-typeck.c (build_binary_op, build_unary_op,
- build_conditional_expr): Update.
- * fold-const.c (constant_boolean_node, fold): Use langhook.
- * langhooks-def.h (LANGHOOK_INITIALIZER): Update.
- * langhooks.h (struct lang_hooks): New hook.
- * stmt.c (expand_decl_cleanup): Use langhook.
- * tree.h (truthvalue_conversion): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_TRUTHVALUE_CONVERSION): Redefine.
-
-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 Jim Blandy <jimb@redhat.com>
-
- * cppmacro.c (cpp_macro_definition): Do not emit spaces after
- macro formal parameter names.
-
-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 middle-end/5099
- * stmt.c (expand_asm_operands): Validate outputs vs asm_operand_ok.
- Support copies into and out of memory. Don't accept allows_reg
- and allows_mem as gospel.
-
-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-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-03 David S. Miller <davem@redhat.com>
-
- * config/sparc/crtfastmath.c (FPRS_NS): Delete bogus little-endian
- handling.
-
-2002-04-03 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa-linux.h (INCOMING_RETURN_ADDR_RTX): Move.
- (DWARF_FRAME_RETURN_COLUMN): Move.
- (ASM_PREFERRED_EH_DATA_FORMAT): Define.
- (ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX): Define.
- * pa.c (except.h, predict.h): Include.
- (FRP): Delete.
- (store_reg_modify, set_reg_plus_d): Revise prototypes.
- (output_ascii): Add cast.
- (store_reg_modify): Revise to add frame notes.
- (set_reg_plus_d): Likewise.
- (compute_frame_size): Include space for eh data registers in frame if
- the current function calls eh_return.
- (hppa_expand_prologue): Ensure register %r2 is saved if the current
- function calls eh_return. Save eh data registers if the current
- function calls eh_return. Fix code to add frame notes. Emit
- blockage to prevent insns with frame notes being scheduled in the
- delay slot of calls.
- (hppa_expand_epilogue): Restore eh data registers and do final stack
- adjustment if the current function calls eh_return. Don't add frame
- notes.
- (output_call): Revise for change in length of call insn. Don't do
- return pointer adjustment for an unconditional jump in the delay slot
- of a call when using frame notes.
- * pa.h (EH_RETURN_DATA_REGNO): Revise for TARGET_64BIT compatibility.
- (EH_RETURN_HANDLER_RTX): Use saved value on stack.
- (ARG_POINTER_CFA_OFFSET): Define.
- * pa.md (return_external_pic): New pattern.
- (prologue): Correct formatting. Use return_external_pic if current
- function calls eh_return.
- (call_internal_symref, call_value_internal_symref,
- sibcall_internal_symref, sibcall_value_internal_symref): Change default
- lengths of short, long non-pic, and long pic calls to 8, 68, and 84,
- respectively.
- (exception_receiver): Use hppa_pic_save_rtx () to restore pic register.
-
- * configure.in ("assembler dwarf2 debug_line support"): Add hppa*-*-* to
- list of targets to check using "nop" insn.
- * configure: Rebuilt.
-
-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>
-
- * except.c (struct eh_status): Remove protect_list.
- (begin_protect_partials, end_protect_partials): Remove.
- (add_partial_entry): Remove.
- * except.h: Remove prototypes.
-
- * expr.c (expand_expr) [WITH_CLEANUP_EXPR, TARGET_EXPR]: Use
- expand_decl_cleanup_eh.
-
- 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-04 Hans-Peter Nilsson <hp@axis.com>
-
- * 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-03 David S. Miller <davem@redhat.com>
-
- * config/sparc/crtfastmath.c (FPRS_NS): Get it right for
- little-endian.
- (set_fast_math): Correct 'fsr' type.
-
-2002-04-03 Richard Henderson <rth@redhat.com>
-
- PR opt/3569
- * langhooks.h (lang_hooks.decls.warn_unused_global): New.
- * toplev.c (check_global_declarations): Use it.
- * langhooks-def.h (lhd_warn_unused_global_decl): Declare.
- (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
- (LANG_HOOKS_DECLS): Add it.
- * langhooks.c (lhd_warn_unused_global_decl): New.
- * c-decl.c (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
- * c-objc-common.c (c_warn_unused_global_decl): New.
- * c-tree.h (c_warn_unused_global_decl): Declare.
- * objc/objc-lang.c (LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL): New.
-
-2002-04-03 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * langhooks-def.h (lhd_set_decl_assembler_name,
- LANG_HOOKS_SET_DECL_ASSEMBLER_NAME): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_set_decl_assembler_name): New, from tree.c
- * langhooks.h (struct lang_hooks): New hook.
- * tree.c (set_decl_assembler_name): Move to langhooks.c.
- (lang_set_decl_assembler_name): Remove.
- (init_obstacks): Don't set hook.
- (decl_assembler_name): New function.
- * tree.h (DECL_ASSEMBLER_NAME): Turn into a function call.
- (decl_assembler_name): New.
- (lang_set_decl_assembler_name): Remove.
-
-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 Zack Weinberg <zack@codesourcery.com>
-
- * config/sh/sh.md: Don't use union real_extract.
-
-2002-04-02 Richard Henderson <rth@redhat.com>
-
- * libgcc2.c (__bb_exit_func): Revert 03-31 change.
-
-2002-04-02 David O'Brien <obrien@FreeBSD.org>
-
- * config.gcc (i386-dg-dgux, i386-go32-msdos , i386-go32-rtems,
- i386-ibm-aix, i386-moss-msdos, i386-ncr-sysv4, i386-next-,
- i386-pc-msdosdjgpp, i386-sequent-bsd, i386-sequent-ptx1,
- i386-sequent-ptx2, i386-sequent-ptx4, i386-sun-sunos,
- i386-wrs-vxworks, i386-*-aout, i386-*-beoself, i386-*-bsd,
- i386-*-bsdi, i386-*-chorusos, i386-*-coff, i386-*-elf,
- i386-*-freebsd5, i386-*-freebsd-aout, i386-*-gnu, i386-*-interix,
- i386-*-interix3, i386-*-isc, i386-*-linux, i386-*-linuxaout,
- i386-*-linuxoldld, i386-*-lynxos, i386-*-mach, i386-*-mingw32,
- i386-*-netbsd, i386-*-netbsdelf, i386-*-netware, i386-*-openbsd,
- i386-*-osf1, i386-*-osfrose, i386-*-pe , i386-*-rtems,
- i386-*-rtemscoff, i386-*-sco3.2v5, i386-*-solaris2, i386-*-sysv,
- i386-*-sysv4, i386-*-sysv5, i386-*-udk, i386-*-uwin, i386-*-vsta,
- i386-*-win32, x86_64-*-freebsd5, x86_64-*-linux, x86_64-*-netbsd):
- Include as many configury headers via tm_file as possible. This
- includes among others i386/unix.h, i386/bsd.h, i386/gas.h.
- * config/openbsd-oldgas.h: New file.
- * config/i386/386bsd.h, config/i386/aix386ng.h, config/i386/att.h,
- config/i386/bsd.h, config/i386/djgpp.h, config/i386/freebsd-aout.h,
- config/i386/gas.h, config/i386/gstabs.h, config/i386/i386-aout.h,
- config/i386/i386-coff.h, config/i386/i386-interix.h,
- config/i386/iscdbx.h, config/i386/linux-aout.h,
- config/i386/linux-oldld.h, config/i386/lynx-ng.h, config/i386/lynx.h,
- config/i386/mach.h, config/i386/netbsd.h, config/i386/next.h,
- config/i386/openbsd.h, config/i386/osfelf.h, config/i386/osfrose.h,
- config/i386/sco5.h, config/i386/seq-gas.h, config/i386/seq-sysv3.h,
- config/i386/seq2-sysv3.h, config/i386/sequent.h, config/i386/sun.h,
- config/i386/sun386.h, config/i386/svr3dbx.h, config/i386/svr3gas.h,
- config/i386/sysv3.h, config/i386/uwin.h, config/i386/vsta.h,
- config/i386/vxi386.h: Do not directly include configury headers.
- * config/i386/cygwin.h, config/i386/djgpp.h, config/i386/win32.h:
- Directly include configury headers that are no longer automatically
- included by the above headers.
- * config/i386/att.h, config/i386/bsd.h (TARGET_VERSION): Do not define.
- * config/i386/386bsd.h, config/i386/aix386ng.h, config/i386/cygwin.h,
- config/i386/djgpp.h, config/i386/i386-aout.h, config/i386/i386-coff.h,
- config/i386/lynx-ng.h, config/i386/lynx.h, config/i386/mach.h,
- config/i386/netbsd.h, config/i386/openbsd.h, config/i386/rtems.h,
- config/i386/seq-sysv3.h, config/i386/sequent.h, config/i386/svr3gas.h,
- config/i386/sysv3.h, config/i386/vsta.h, config/i386/vxi386.h
- (TARGET_VERSION): Define.
- * config/i386/beos-elf.h, config/i386/freebsd.h,
- config/i386/i386-interix.h, config/i386/i386elf.h, config/i386/linux.h,
- config/i386/linux64.h, config/i386/netbsd-elf.h, config/i386/netbsd64.h,
- config/i386/osfelf.h, config/i386/osfrose.h, config/i386/ptx4-i.h,
- config/i386/sco5.h, config/i386/sysv4.h
- (TARGET_VERSION): Do not need to protect.
- * config/i386/freebsd64.h (TARGET_VERSION): Fix style.
- * config/i386/386bsd.h, config/i386/cygwin.h, config/i386/djgpp.h,
- config/i386/freebsd-aout.h, config/i386/i386-aout.h,
- config/i386/i386-interix.h, config/i386/linux-aout.h,
- config/i386/linux-oldld.h, config/i386/mach.h, config/i386/netbsd.h,
- config/i386/openbsd.h, config/i386/vsta.h, config/i386/win32.h
- (YES_UNDERSCORES): Do not define - not needed.
- * config/i386/bsd.h, config/i386/gas.h (LPREFIX,
- ASM_GENERATE_INTERNAL_LABEL, ASM_OUTPUT_INTERNAL_LABEL,
- USER_LABEL_PREFIX): Do not handle the "NO_UNDERSCORES" case.
- * config/i386/i386-coff.h, config/i386/lynx.h, config/i386/lynx-ng.h
- (LPREFIX, ASM_GENERATE_INTERNAL_LABEL, ASM_OUTPUT_INTERNAL_LABEL,
- USER_LABEL_PREFIX): Define. (handles the "NO_UNDERSCORES" case)
- * config/i386/isc.h: Preserve comment from config/i386/isccoff.h.
- * config/i386/isccoff.h, config/i386/v3gas.h: Remove.
-
-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 Steve Ellcey <sje@cup.hp.com>
-
- * builtins.c (expand_builtin_prefetch): Force op0 pointer to Pmode
- if POINTERS_EXTEND_UNSIGNED is defined.
-
-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 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-02 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * milli64.S ($$dyncall): New function.
- * t-linux (LIB1ASMFUNCS): Revise module list.
- (LIB1ASMSRC): Use pa/milli64.S.
-
-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/190
- * final.c (this_is_asm_operands): Export.
- * output.h (this_is_asm_operands): Declare.
- * config/i386/i386.c (print_operand): Error odd asm operands.
-
-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 Vladimir Makarov <vmakarov@redhat.com>
-
- * config/pa/pa-pro-end.h (ASM_OUTPUT_ALIGNED_COMMON,
- ASM_OUTPUT_ALIGNED_LOCAL): Redefine them.
-
-2002-04-01 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-decl.c (grokdeclarator): Update.
- * c-lang.c (LANG_HOOKS_MARK_ADDRESSABLE): Redefine.
- * c-tree.h (c_mark_addressable): New.
- * c-typeck.c (default_function_array_conversion, build_unary_op,
- build_array_ref, convert_for_assignment): Update.
- (mark_addressable): Rename.
- * calls.c (try_to_integrate, expand_call): Use langhook.
- * expr.c (expand_expr): Use langhook.
- * langhooks-def.h (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct lang_hooks): New hook.
- * stmt.c (expand_asm_operands): Use langhook.
- * tree.h (mark_addressable): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_MARK_ADDRESSABLE): Redefine.
-
-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-04-01 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (unsigned_conversion_warning, convert_and_check,
- unsigned_type, signed_type, shorten_compare,
- c_common_get_alias_set, c_common_nodes_and_builtins): Use new hooks.
- (unsigned_type, signed_type, signed_or_unsigned_type): Rename.
- * c-common.h (unsigned_type, signed_type, signed_or_unsigned_type):
- New.
- * c-decl.c (grokdeclarator): Update.
- * c-format.c (check_format_types): Update.
- * c-lang.c (LANG_HOOKS_SIGNED_TYPE, LANG_HOOKS_UNSIGNED_TYPE,
- LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE): New.
- * c-typeck.c (build_binary_op, convert_for_assignment): Update.
- * convert.c (convert_to_integer): Use new hooks.
- * expmed.c (make_tree): Use new hooks.
- * expr.c (store_expr): Use new hooks.
- * fold-const.c (operand_equal_for_comparison_p, build_range_check,
- all_ones_mask_p, unextend, fold): Use new hooks.
- * langhooks.h (struct lang_hooks_for_types): New hooks.
- * tree.h (signed_or_unsigned_type, signed_type,
- unsigned_type): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_SIGNED_TYPE, LANG_HOOKS_UNSIGNED_TYPE,
- LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE): New.
-
-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.
-
-2002-03-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * rtl.h (RTL_CHECK1, RTL_CHECK2, RTL_CHECKC1, RTL_CHECKC2,
- RTVEC_ELT): Const-ify.
- * varray.h (VARRAY_CHECK): Const-ify.
- * ggc.h (ggc_mark_rtx, ggc_mark_tree, ggc_mark_nonnull_tree,
- ggc_mark_rtvec, ggc_mark): Const-ify.
-
-2002-04-01 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * diagnostic.c: Include langhooks-def.h.
- * Makefile.in (diagnostic.o): Update.
-
-2002-03-31 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_unsafe_for_reeval): Rename.
- * c-common.h (c_unsafe_for_reeval): Rename.
- * c-decl.c (finish_incomplete_decl): Rename.
- (c_init_decl_processing): Don't set langhook.
- * c-lang.c (LANG_HOOKS_FINISH_INCOMPLETE_DECL,
- LANG_HOOKS_UNSAFE_FOR_REEVAL): Redefine.
- * c-objc-common.c (c_objc_common_init): Don't set langhook.
- * c-tree.h (finish_incomplete_decl): Rename.
- * langhooks-def.h (lhd_unsafe_for_reeval): New.
- (LANG_HOOKS_FINISH_INCOMPLETE_DECL, LANG_HOOKS_UNSAFE_FOR_REEVAL): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_unsafe_For_reeval): New.
- * langhooks.h (struct langhooks): New hooks.
- * toplev.c (incomplete_decl_finalize_hook): Remove.
- (wrapup_global_declarations): Update.
- * tree.c (lang_unsafe_for_reeval): Remove.
- (unsafe_for_reeval): Update.
- * tree.h (lang_unsafe_for_reeval, incomplete_decl_finalize_hook):
- Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_FINISH_INCOMPLETE_DECL,
- LANG_HOOKS_UNSAFE_FOR_REEVAL): Redefine.
-
-2002-03-31 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * diagnostic.c (print_error_function): Remove.
- (default_print_error_function): Rename.
- (report_error_function): Update.
- * diagnostic.h (print_error_function): Remove.
- (default_print_error_function): Remove.
- * langhooks-def.h (struct diagnostic_context): Predeclare.
- (lhd_print_error_function, LANG_HOOKS_PRINT_ERROR_FUNCTION): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct diagnostic context): Predeclare.
- (struct lang_hooks): New hook.
-
-2002-03-31 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.
-
-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 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.
-
-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 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/crti.asm (_init): Register _fini with atexit.
- * config/mmix/crtn.asm (_fini): Add omitted "POP 0,0".
-
-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 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-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-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.
-
-Sat Mar 30 23:48:41 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgbuild.c (find_basic_blocks_1): Clear aux for blocks.
-
-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.
-
-Sat Mar 30 14:08:55 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * local-alloc.c (local_alloc): Avoid call of update_equiv_regs
- when not optimizing.
-
- * toplev.c (rest_of_compilation): Cann mark_constant_function
- only when optimizing.
-
- * flow.c (calculate_global_regs_live): Ensure that all AUX fields
- are NULL.
-
- * cfgcleanup.c (bb_flags): Add BB_NONTHREADABLE_BLOCK.
- (thread_jump): Set BB_NONTHREADABLE_BLOCK, check it.
- (try_optimize_cfg): clear all AUX fields.
-
- * i386.c (aligned_operand): Be prepared for SUBREGed registers.
- (ix86_decompose_address): Use REG_P instead of GET_CODE (...) == REG.
- (ix86_address_cost): Be prepared for SUBREGed registers.
- (legitimate_address_p): Accept SUBREGed registers.
-
-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 Hans-Peter Nilsson <hp@bitrange.com>
-
- * cfg.c (dump_flow_info): Guard against NULL regno_reg_rtx[i].
-
-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 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 Dale Johannesen <dalej@apple.com>
-
- * loop.c (combine_movables): Do allow combination of pseudos.
-
-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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (convert.o, calls.o, expmed.o): Update.
- * attribs.c (handle_mode_attribute, handle_vector_size_attribute):
- Use new hooks.
- * builtin-types.def (BT_PTRMODE): Update.
- * c-common.c (type_for_size): Rename c_common_type_for_size.
- (type_for_mode): Similarly.
- (shorten_compare, pointer_int_sum, c_common_nodes_and_builtins):
- Use new hook.
- * c-bommon.h (c_common_type_for_size, c_common_type_for_mode): New.
- * c-decl.c (finish_enum, build_enumerator): Use new hooks.
- * c-lang.c (LANG_HOOKS_TYPE_FOR_MODE, LANG_HOOKS_TYPE_FOR_SIZE):
- Redefine.
- * c-typeck.c (common_type, comptypes, default_conversion):
- Use new hooks.
- * calls.c: Include langhooks.h.
- (emit_library_call_value_1): Use new hooks. Avoid redundant
- calls.
- * convert.c: Include langhooks.h
- (convert_to_pointer, convert_to_integer): Use new hooks.
- * except.c (init_eh): Similarly.
- * expmed.c: Include langhooks.h.
- (expand_mult_add): Use new hooks.
- * expr.c (store_expr, store_constructor, expand_expr, do_jump,
- try_casesi): Similarly.
- * fold-const.c (optimize_bit_field_compare, make_range,
- decode_field_reference, fold_truthop, fold): Similarly.
- * function.c (assign_stack_local_1, assign_stack_temp_for_type,
- put_var_into_stack): Similarly.
- * langhooks-def.h (LANG_HOOKS_TYPE_FOR_MODE,
- LANG_HOOKS_TYPE_FOR_SIZE): New.
- (LANG_HOOKS_TYPES_INITIALIZER): Update.
- * langhooks.h (lang_hooks_for_types): New hooks.
- * stmt.c (expand_decl_cleanup, emit_case_nodes): Use new hooks.
- * tree.c (get_unwidened, get_narrower): Similarly.
- * tree.h (type_for_mode, type_for_size): Remove.
- * varasm.c (force_const_mem): Use new hooks.
- * utils2.c (nonbinary_modular_operation): Update.
-objc:
- * objc-act.c (handle_impent): Update.
- * objc-lang.c (LANG_HOOKS_TYPE_FOR_MODE, LANG_HOOKS_TYPE_FOR_SIaZE):
- Redefine.
-
-2002-03-29 Steve Ellcey <sje@cup.hp.com>
-
- * config/ia64/ia64.md (*ptr_extend_plus_1, *ptr_extend_plus_2): New.
- * config/ia64/ia64.c (basereg_operand): New.
- * config/ia64/ia64-protos.h (basereg_operand): Declare.
- * config/ia64/ia64.h (PREDICATE_CODES): Add basereg_operand.
-
-2002-03-29 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.c (mmix_target_asm_function_prologue): Correct
- unwind information when frame_pointer_needed.
- (mmix_assemble_integer): Tweak wording in comment.
-
-2002-03-29 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (except.o): Update.
- * except.c: Include langhooks.h.
- (init_eh): Use langhook.
- * langhooks-def.h (LANG_HOOKS_MAKE_TYPE,
- LANG_HOOKS_FOR_TYPES_INITIALIZER): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (lang_hooks_for_types): New.
- (struct lang_hooks): Add it.
- * tree.c (make_lang_type_fn, make_lang_type): Remove.
- * tree.h (make_lang_type_fn, make_lang_type): Remove.
-config:
- * alpha/alpha.c: Include langhooks.h.
- (alpha_build_va_list): Use langhook.
- * d30v/d30v.c: Include langhooks.h.
- (d30v_build_va_list): Use langhook.
- * i386/i386.c: Include langhooks.h.
- (ix86_build_va_list): Use langhook.
- * rs6000/rs6000.c (rs6000_build_va_list): Use langhook.
- * s390/s390.c: Include langhooks.h.
- (s390_build_va_list): Use langhook.
- * stormy16/stormy16.c: Include langhooks.h.
- (stormy16_build_va_list): Use langhook.
-
-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.
-
-Thu Mar 28 16:35:31 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 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa-linux.h (LOCAL_LABEL_PREFIX): Define.
-
-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.
-
-Thu Mar 28 19:13:36 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * ifcvt.c (if_convert): Clear aux_for_blocks early enought.
-
-Thu Mar 28 13:21:53 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * rtlanal.c: Include flags.h
- (may_trap_p): Do not mark FP operations if trapping
- if !flag_trapping_math
- * Makefile.in (rtlanal.o): Add dependency on flag.h
- * ifcvt.c (noce_operand_ok): Avoid the lameness.
-
-2002-03-27 Zack Weinberg <zack@codesourcery.com>
-
- * mips.md: Use dconst1, not 1.0, as first argument of
- REAL_VALUE_LDEXP. Don't use union real_extract.
-
-2002-03-28 Alan Modra <amodra@bigpond.net.au>
-
- * configure.in (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): Heed program_prefix and program_transform_name.
- (gcc_cv_objdump): Likewise.
- * configure: Regenerate.
-
-2002-03-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (attribs.o): Update.
- * attribs.c: Include langhooks.h.
- (decl_attributes): Use langhook.
- * c-decl.c (insert_default_attributes): Rename.
- * c-tree.h (c_insert_default_attributes): New.
- * langhooks-def.h (LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES):New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct lang_hooks): New hook.
- * tree.h (insert_default_attributes): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES): Redefine.
-
-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 23:19:30 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * i960.md (ret): Set PC.
- (nonlocal_goto): Fix expander.
- * builtins.c (epxand_builin_longjmp): Check that we've emitted
- some jump or call.
-
-Wed Mar 27 23:11:35 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * optabs.c (emit_no_conflict_block, emit_libcall_block): Avoid nesting
- of libcall regions.
-
-Wed Mar 27 22:54:14 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:33:05 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.c (ix86_output_addr_diff_elt): Remove binutils bug workaround.
-
-2002-03-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.c (c_expand_expr): Fix prototype.
- * c-common.h (c_expand_expr): Always declare, update.
- * c-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
- * c-objc-common.c (c_objc_common_init): No global hook.
- * expr.c (expand_expr): Use langhook.
- * expr.h (enum expand_modifier): Conditionally declare.
- * langhooks-def.h (lhd_expand_expr, LANG_HOOKS_EXPAND_EXPR): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_expand_expr): New.
- * langhooks.h (struct lang_hooks): New hook.
- * toplev.c (lang_expand_expr_t, lang_expand_expr): Delete.
- (lang_independent_init): Don't default hook.
-objc:
- * objc-lang.c (LANG_HOOKS_EXPAND_EXPR): Redefine.
-
-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-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 Danny Smith <dannysmith@users.sourceforge.net>
-
- * config/i386/cygwin.h (TARGET_DLL, TARGET_WIN32,
- TARGET_CYGWIN, TARGET_WINDOWS): Remove unused switches.
- (MASK_DLL, MASK_WIN32, MASK_CYGWIN, MASK_WINDOWS):
- Remove unnecessary masks.
- (MASK_NOP_FUN_DLLIMPORT): Use an unused an bit.
- (SUBTARGET_SWITCHES): Use empty masks for -mwin32, -mcygwin,
- -mwindows, -mdll switches and their negations.
-
-2002-03-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * gcc-common.c (lang_mark_false_label_stack): Remove.
- * ggc.h (lang_mark_false_label_stack): Similarly.
-
-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 Phil Edwards <pme@gcc.gnu.org>
-
- * gcc.c (cpp_options): Preserve relative ordering of -pedantic
- and warning switches.
- (cc1_options): Likewise.
-
-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 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/aix51.h (WCHAR_TYPE): Define.
-
-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 Andrew Cagney <ac131313@redhat.com>
-
- * doc/invoke.texi (Option Summary): Mention -Wswitch-enum.
- (Warning Options): Document -Wswitch-enum.
- * toplev.c (W_options): Add -Wswitch-enum. Update comment on
- -Wswitch.
- (warn_switch_enum): Define variables.
- * flags.h (warn_switch_enum): Declare variables.
- * stmt.c (expand_end_case_type): When warn_switch_enum /
- -Wswitch-enum, perform switch checks.
- Fix PR c/5044.
-
-2002-03-26 Richard Earnshaw <rearnsha@arm.com>
-
- * arm.md (reload_mulsi3, reload_mulsi_compare0, reload_muladdsi)
- (reload_mulsi_compare0_scratch, reload_muladdsi_compare0)
- (reload_muladdsi_compare0_scratch): Delete.
-
-2002-03-26 Loren J. Rittle <ljrittle@acm.org>
-
- * doc/install.texi (*-*-freebsd*): Update.
-
-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-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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (ggc-common.o): Update.
- * c-decl.c (lang_mark_tree): Rename c_mark_tree.
- * c-lang.c (LANG_HOOKS_MARK_TREE): Redefine.
- * c-tree.h (c_mark_tree): New.
- * ggc-common.c: Include langhooks.h.
- (gcc_mark_trees): Use new langhook.
- * ggc-callbacks.c: Delete file.
- * ggc.h (lang_mark_tree): Remove.
- * langhooks-def.h (LANG_HOOKS_MARK_TREE): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct lang_hooks): New hook.
-objc:
- * objc-lang.c (LANG_HOOKS_MARK_TREE): Redefine.
-
-2002-03-25 Zack Weinberg <zack@codesourcery.com>
-
- * doc/cpp.texi: Exclude entire Top node from printed manual.
- Move option index after directive index. Insert page breaks
- before GFDL and concept index. Index environment variables
- with command line options.
- * doc/cppenv.texi: Use @vtable for environment variable list.
- Add paragraph explaining semantics of empty elements in path
- variables. Exclude a cross-reference to Fishkill from the
- manpage. Remove an unnecessary cross-reference of the entry
- right above the referer. Don't use @anchor in text that goes
- into manpage.
- * doc/cppopts.texi: Cross-reference the environment variables
- section, not the specific environment variable, for consistency.
-
-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-25 Danny Smith <dannysmith@sourceforge.users.net>
-
- * config/i386/mingw32.h (WINT_TYPE): Define as "short unsigned
- int".
-
-2002-03-25 Zack Weinberg <zack@codesourcery.com>
-
- * toplev.c: Don't include setjmp.h. Kill float_handler_set,
- float_handled, float_handler, float_signal, set_float_handler,
- and do_float_handler. Set handler for SIGFPE to crash_signal.
- * toplev.h: Don't prototype do_float_handler.
-
- * c-lex.c: Fold parse_float into lex_number. Make warning
- about portability of hex float constants more informative, and
- don't issue it on top of a syntax error.
- * fold-const.c: Fold const_binop_1 and fold_convert_1 into
- their callers.
- * real.h: Define REAL_VALUE_ABS here...
- * simplify-rtx.c: ... not here. Fold check_fold_consts,
- simplify_unary_real, simplify_binary_real, and
- simplify_binary_is2orm1 into their callers.
- * tree.c: Fold build_real_from_int_cst_1 into caller.
-
- * doc/tm.texi: Document REAL_VALUE_ABS and REAL_VALUE_NEGATIVE.
-
- * tsystem.h: Include float.h here...
- * libgcc2.c: ... not here.
-
-2002-03-25 Nick Clifton <nickc@cambridge.redhat.com>
-
- Fixes for: PR bootstrap/3591, target/5676
- * 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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-decl.c (maybe_build_cleanup): Remove.
- * expr.c (expand_expr): Use langhook.
- * langhooks-def.h (lhd_return_null_tree,
- LANG_HOOKS_MAYBE_BUILD_CLEANUP): New.
- (LANGHOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_return_null_tree): New.
- * langhooks.h (struct lang_hooks): New hook.
- * tree-inline.c (initialize_inlined_parameters): Use langhook.
- * tree.h (maybe_build_cleanup): Remove.
-
-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 Andrew Cagney <ac131313@redhat.com>
-
- * stmt.c (check_for_full_enumeration_handling): Remove tests of
- warn_switch. Update description.
- (expand_end_case_type): Call check_for_full_enumeration_handling
- when warn_switch.
-
-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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppinit.c (cpp_handle_option): Set warn_endif_labels if
- -pedantic here...
- (cpp_post_options): ... not here.
-
-2002-03-24 Neil Booth <neil@daikokuya.demon.co.uk>
- Aldy Hernandez <aldyh@redhat.com>
-
- Removal of separate preprocessor cpp0.
-
- * Makefile.in (GCC_PASSES, STAGESTUFF, LIBCPP_OBJS,
- cpp0, install-common): Update.
- * c-common.c (flag_preprocess_only): New.
- (c_common_init): Preprocess for -E.
- * c-common.h (flag_preprocess_only): New.
- * c-decl.c (c_decode_option): Handle -E and -std=c++98.
- * c-objc-common.c (c_init_decl_processing): Exit quickly
- for NULL return from c_common_init.
- * cpplib.h (cpp_preprocess_file): New.
- * cppmain.c (main, general_init, pfile, progname): Remove.
- (do_preprocessing): Rename cpp_preprocess_file, don't call
- cpp_finish. Don't close stdout here.
- (setup_callbacks): Update prototype.
- * gcc.c (trad_capable_cpp, cpp_unique_options, default_compilers):
- Update.
- * tradcpp.c (main): Ignore -quiet.
-objc:
- * lang-specs.h (default_compilers): Preprocess with cc1obj.
-
-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 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.h (RETURN_IN_MEMORY): Cast to HOST_WIDE_INT
- not HOST_WIDEST_INT.
- (RS6000_ARG_SIZE): Remove unsigned cast of int_size_in_bytes.
-
-2002-03-23 Richard Earnshaw <rearnsha@arm.com>
-
- PR java/5489
- * arm.md (return, sibcall_epilogue): Pass const_true_rtx as the
- operand argument to output_return_instruction.
- * arm.c (arm_print_operand, case 'd'): If the operand is
- const_true_rtx then just return.
- (arm_print_operand, case 'D'): If the operand is const_true_rtx
- then abort.
-
-2002-03-23 Andrew Cagney <ac131313@redhat.com>
-
- * doc/invoke.texi (Option Summary): Mention -Wswitch-default.
- (Warning Options): Document -Wswitch-default.
- * toplev.c (W_options): Add -Wswitch-default. Update comment on
- -Wswitch.
- (warn_switch_default): Define variable.
- (warn_switch): Update comment.
- * flags.h (warn_switch_default): Declare variable.
- (warn_switch): Update comment.
- * stmt.c (expand_end_case): Check for and, when
- warn_switch_no_default, warn of a missing default case.
-
-2002-03-23 Alan Modra <amodra@bigpond.net.au>
-
- * real.h (N): Special case 128 bit doubles.
-
- * 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 Zack Weinberg <zack@codesourcery.com>
-
- * real.h: Don't define REAL_INFINITY or REAL_IS_NOT_DOUBLE.
- Always make REAL_VALUE_TYPE a struct containing an array of
- HOST_WIDE_INT, not a double. Tidy up the code deciding how
- big it is. Don't declare or use union real_extract.
-
- * emit-rtl.c (init_emit_once), varasm.c (immed_real_const_1,
- decode_rtx_const, output_constant_pool), config/a29k/a29k.c
- (print_operand), config/arm/arm.c (output_move_double),
- config/arm/arm.md (consttable_4, consttable_8),
- config/romp/romp.c (output_fpops), config/s390/s390.h
- (ASM_OUTPUT_SPECIAL_POOL_ENTRY), config/xtensa/xtensa.c
- (xtensa_output_literal): Don't use union real_extract.
-
- * config/dsp16xx/dsp16xx.c (print_operand), config/i860/i860.c
- (sfmode_constant_to_ulong), config/ns32k/merlin.h
- (PRINT_OPERAND), config/ns32k/ns32k.c (print_operand),
- config/pdp11/pdp11.h (PRINT_OPERAND), config/we32k/we32k.h
- (PRINT_OPERAND): Don't use local version of union
- real_extract.
-
- * config/convex/convex.c (check_float_value), config/vax/vax.c
- (vax_float_literal), config/m88k/m88k.md (divdf3),
- config/dsp16xx/dsp16xx.md (fixuns_trunchfhi2),
- config/pdp11/pdp11.c (output_move_quad): Don't do host
- arithmetic on target floating point quantities.
-
- * config/a29k/a29k.md, config/dsp16xx/dsp16xx.c
- (output_dsp16xx_float_const): Don't test HOST_FLOAT_FORMAT.
-
- * fold-const.c (fold), simplify-rtx.c (simplify_binary_real):
- Use MODE_HAS_INFINITIES rather than #ifdef REAL_INFINITY.
-
- * real.c (earith): Test INFINITY rather than REAL_INFINITY;
- NANS implies INFINITY, so can drop #ifdef NANS inside #ifndef
- INFINITY.
- * print-rtl.c (print_rtx): Disable code which needs
- floating-point emulator.
- * libgcc2.c: Include float.h and use DBL_MANT_DIG,
- FLT_MANT_DIG, to define DF_SIZE and SF_SIZE, rather than
- depending on HOST_FLOAT_FORMAT to be defined properly.
-
- * config/1750a/1750a.c (get_double, float_label): Delete.
- (print_operand): Delete huge commented-out chunk. Use
- REAL_VALUE_TO_DECIMAL.
- * config/1750a/1750a-protos.h: Delete prototypes of deleted
- functions.
- * config/convex/convex.h: Always set TARGET_FLOAT_FORMAT to
- IEEE_FLOAT_FORMAT.
- * config/i370/i370.h (PRINT_OPERAND [TARGET_HLASM version]):
- Use REAL_VALUE_TO_DECIMAL as ELF version does.
- * config/m88k/m88k.c (real_power_of_2_operand,
- legitimize_operand): Take the REAL_VALUE_TYPE and/or union
- real_extract out of the union; run the input through
- REAL_VALUE_TO_TARGET_DOUBLE, then plug the pair of longwords
- from that into the union.
- * config/pdp11/pdp11.c (output_move_double): Rearrange
- parentheses to make automatic indenter happy.
-
- * doc/tm.texi (Cross-compilation): Rename node to "Floating
- Point" and rewrite to describe current situation. Also adjust
- documentation of REAL_VALUE_TO_TARGET_SINGLE and friends to
- match code.
- * doc/rtl.texi: Adjust cross reference.
-
-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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpphash.h (struct cpp_reader): Remove mls_line and mls_col.
- * cpplex.c (unterminated): Delete.
- (parse_string): No string literal may extend over multiple
- lines. Suppress the error when preprocessing assembly.
- * cppmain.c (scan_translation_unit): Strings are single-line.
-
- * doc/cpp.texi: Update to match.
-
-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>
-
- * config/mips/mips.h (MASK_RETURN_ADDR): Define.
- (TARGET_PTRMEMFUNC_VBIT_LOCATION): Define.
-
-2002-03-22 Phil Edwards <pme@gcc.gnu.org>
-
- * cpplib.h (struct cpp_options): New member, warn_endif_labels.
- * cppinit.c (cpp_create_reader): On by default.
- (cpp_handle_option): Handle -W[no-]endif-labels.
- (cpp_post_options): Also enable if -pedantic.
- * cpplib.c (do_else): Use it.
- (do_endif): Likewise.
- * doc/cppopts.texi: Document new option.
- * doc/invoke.texi: Document new option.
-
-2002-03-22 Lars Brinkhoff <lars@nocrew.org>
-
- * config/i386/i386.c, config/i386/i386.md: Change all occurences
- of GEN_INT (trunc_int_for_mode (...)) to gen_int_mode (...).
-
-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.
-
-2002-03-22 Andrew MacLeod <amacleod@redhat.com>
-
- * expr.c (expand_expr): A RESULT_DECL is part of a call.
-
-Fri Mar 22 16:30:42 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (flag_loop_optimize, flag_crossjumping):
- New static variables.
- (rest_of_compilation): Conditionalize crossjumping and
- loop optimizer.
- (parse_options_and_default_flags): Default loop_optimize and
- crossjumping.
- (lang_independent_options): Add -fcrossjumping and -floop-optimize
- * invoke.texi (crossjumping, loop-optimize): Document.
-
-2002-03-22 Richard Sandiford <rsandifo@redhat.com>
-
- * real.c (eiisneg): Move outside #ifdef NANS.
-
-Fri Mar 22 12:08:36 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.
-
- * flow.c (update_life_info_in_dirty_blocks): Fix uninitialized
- variable.
-
- * Makefile.in (cfgrtl): Add insn-config.h depenendency.
- * cfgrtl.c: Include insn-config.h
- (split_block) Dirtify block in presence of conditional execution
-
-2002-03-22 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/abi64.h (SETUP_INCOMING_VARARGS): Undefine.
- * config/mips/mips-protos.h (mips_setup_incoming_varargs): Declare.
- (function_arg): Constify CUMULATIVE_ARGS.
- (function_arg_partial_nregs, function_arg_pass_by_reference): Likewise.
- * config/mips/mips.h (UNITS_PER_FPVALUE): Zero when TARGET_SOFT_FLOAT.
- (UNITS_PER_DOUBLE): New macro.
- (SETUP_INCOMING_VARARGS): Define. Use mips_setup_incoming_varargs.
- (CUMULATIVE_ARGS): Reformat. Remove num_adjusts workaround and
- last_arg_fp field. Replace arg_words and fp_arg_words with gp_regs,
- fp_regs and stack_words.
- (EABI_FLOAT_VARARGS_P): New macro.
- * config/mips/mips.c (struct mips_arg_info): New.
- (mips_arg_info): New function.
- (function_arg_advance): Use it. Add adjustment instructions here
- rather than in function_arg.
- (function_arg): Constify CUMULATIVE_ARGS. Use mips_arg_info. Check
- for VOIDmode at the beginning of the function.
- (function_partial_nregs): Constify CUMULATIVE_ARGS. Use mips_arg_info.
- (function_arg_pass_by_reference): Likewise.
- (mips_setup_incoming_varags): New, largely based on old abi64.h code.
- (mips_build_va_list): Test EABI_FLOAT_VARARGS_P.
- (mips_va_start): Likewise. Use the new stack_words field of
- CUMULATIVE_ARGS to set up overflow area. Reformat.
- (mips_va_arg): Test EABI_FLOAT_VARARGS_P. Unify EABI handling of
- doubles and other types, aligning the overflow pointer for non-doubles
- too. Remove some code duplication. Replace hard-coded constants.
-
-2002-03-22 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips.h (FUNCTION_ARG_REGNO_P): Simplify.
- (CLASS_UNITS): Undefine.
- (CLASS_MAX_NREGS): Use FP_INC.
- * config/mips/mips.c (compute_frame_size): Likewise.
- (override_options): Use FP_INC and UNITS_PER_FPVALUE.
-
-2002-03-22 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplex.c (parse_identifier_slow): Rename parse_slow, adjust
- prototype, and handle lexing numbers and identifiers.
- (parse_identifier): Update to new form of parse_slow.
- (parse_number): Fast path only, use parse_slow otherwise.
- (_cpp_lex_direct): Update calls to parse_number.
-
-2002-03-21 DJ Delorie <dj@redhat.com>
-
- * bb-reorder.c (make_reorder_chain_1): Protect against
- when redundant edges are omitted.
- * predict.c (dump_prediction): 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): Initialize
- 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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (fold-const.o, stor-layout.o, stmt.o,
- sdbout.o, profile.o): Update.
- * c-common.c (c_common_nodes_and_builtins): Use pushdecl
- langhook.
- * c-common.h (gettags): Move here from tree.h.
- * c-tree.h (pushdecl, pushlevel, poplevel, set_block,
- insert_block, getdecls, kept_level_p, global_bindings_p): New.
- * dbxout.c (dbxout_init): Use getdecls langhook.
- * expr.c (expand_expr): Use insert_block langhook.
- * fold-const.c: Include langhooks.h.
- (fold_range_test, fold_binary_op_with_conditional_arg,
- fold): Use global_bindings_p langhook.
- * integrate.c (expand_inline_function): Use insert_block langhook.
- * langhooks-def.h (LANG_HOOKS_DECLS, LANG_HOOKS_PUSHLEVEL,
- LANG_HOOKS_POPLEVEL, LANG_HOOKS_GLOBAL_BINDINGS_P,
- LANG_HOOKS_INSERT_BLOCK, LANG_HOOKS_SET_BLOCK, LANG_HOOKS_PUSHDECL,
- LANG_HOOKS_GETDECLS): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_clear_binding_stack): Use global_bindings_p
- langhook.
- * langhooks.h (struct lang_hooks_for_decls): New.
- (struct lang_hooks): Update.
- * profile.c: Include langhooks.h.
- (output_func_start_profiler): Use new langhooks.
- * sdbout.c: Include langhooks.h.
- (sdbout_init, sdbout_finish): Use getdecls langhook.
- * stmt.c: Include langhooks.h.
- (expand_fixup, fixup_gotos): Use new langhooks.
- * stor-layout.c: Include langhooks.h.
- (variable_size): Use global_bindings_p langhook.
- * toplev.c (compile_file): Use getdecls langhook.
- * tree-inline.c (remap_block): Use insert_block langhook.
- * tree.h (pushdecl, pushlevel, poplevel, set_block, gettags,
- insert_block, getdecls, kept_level_p, global_bindings_p): Remove.
-
-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 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/contrib.texi (Contributors): Use GNU/Linux instead of Linux
- where appropriate.
-
-2002-03-21 Tom Tromey <tromey@redhat.com>
-
- * config/i386/sol2.h (ASM_QUAD): Undef. Fixes PR bootstrap/5948.
-
-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.
-
-Thu Mar 21 01:55:06 EST 2002 John Wehle (john@feith.com)
-
- * alias.c: (nonlocal_mentioned_p): Use for_each_rtx.
- (nonlocal_mentioned_p_1): New function.
- (nonlocal_referenced_p, nonlocal_referenced_p_1): Likewise.
- (nonlocal_set_p, nonlocal_set_p_1): Likewise.
- (mark_constant_function): Recognize pure functions.
- * rtl.h (global_reg_mentioned_p): New prototype.
- * rtlanal.c (global_reg_mentioned_p,
- global_reg_mentioned_p_1): New function.
-
-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 Michael Meissner <meissner@redhat.com>
-
- * doc/invoke.texi (Optimize Options): Document that -O2 sets
- -fstrict-aliasing.
-
-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 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.md: Remove unused type attributes.
- (adddi_carry, subddi_carry): Change type attribute to "multi".
-
-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-20 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in: Update.
- * c-common.c: Include langhooks.h.
- (inline_forbidden_p): Use new hook.
- * diagnostic.c: Include langhooks.h.
- (format_with_decl, announce_function,
- default_print_error_function): Use new hook.
- * dwarf2out.c (dwarf2_name): Use new hook.
- * function.c: Include langhooks.h.
- (init_function_start): Use new hook.
- * langhooks-def.h (lhd_decl_printable_name): New.
- (LANGHOOKS_DECL_PRINTABLE_NAME): New.
- (LANGHOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_decl_printable_name): New.
- * langhooks.h (struct lang_hooks): New hook.
- * toplev.c (decl_name, decl_printable_name): Remove.
- (open_dump_file): Use new hook.
- (process_options): Remove old hook.
- * tree.h (decl_printable_name): Remove.
-objc:
- * objc-act.c (objc_init): Remove old hook.
- (objc_printable_name): Export.
- * objc-act.h (objc_printable_name): New.
- * objc-lang.c (LANG_HOOKS_DECL_PRINTABLE_NAME): Redefine.
-
-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.
-
-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-19 Richard Henderson <rth@redhat.com>
-
- * varasm.c (output_constant_def): Fix stupid typo.
-
-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 Olivier Hainque <hainque@act-europe.fr>
-
- * varasm.c (output_constant_def): Don't call ENCODE_SECTION_INFO
- for INTEGER_CST.
-
-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 Jim Blandy <jimb@redhat.com>
-
- * 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 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 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.md (adddi3, adddi_carry, subdi3,
- subdi_carry): Define.
-
-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 David Edelsohn <edelsohn@gnu.org>
-
- * expr.c (expand_expr): Sign-extend CONST_INT generated from
- TREE_STRING_POINTER.
- * fold-const.c (fold): Delete #if 0 ARRAY_REF case.
-
-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 Lars Brinkhoff <lars@nocrew.org>
-
- * emit-rtl.c (gen_int_mode): New function.
- * rtl.h: Prototype for it.
- * combine.c (make_extraction, simplify_comparison), expmed.c
- (store_bit_field, expand_mult_highpart, expand_divmod), expr.c
- (convert_modes, store_field), optabs.c (expand_fix),
- simplify-rtx.c (neg_const_int, simplify_unary_real),
-
- * config/rs6000/rs6000.c, config/rs6000/rs6000.md:
- Use it instead of GEN_INT (trunc_int_for_mode (...)).
-
-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 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-15 Eric Christopher <echristo@redhat.com>
-
- * config/mips/mips.md (movdf_internal2): Add two new move constraints.
- Fix register preference on last change.
- * config/mips/mips.c (mips_return_in_memory): New function.
- * config/mips/mips.h (RETURN_IN_MEMORY): Use.
- * config/mips/mips-protos.h: Declare.
- * config/mips/abi64.h (RETURN_IN_MEMORY): Remove. Add to above.
- * config/mips/elf64.h: Add #ifndef/#endif brackets around defaults.
-
-2002-03-18 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.md (andsi3) [TARGET_MIPS16]: Force operand 1 to
- a register too.
- (anddi3, iorsi3): Likewise.
-
- * config/mips/mips.h (ENCODE_SECTION_INFO) [TARGET_MIPS16]: Don't
- use %gprel for symbols that are going to be placed in linkonce
- sections.
-
- * config/mips/mips.h (ELIMINABLE_REGS): Can't eliminate
- RETURN_ADDRESS_POINTER_REGNUM to $ra.
- (CAN_ELIMINATE): Only eliminate it to $sp if a frame pointer is
- not needed. Disregard leaf_function_p().
- (INITIAL_ELIMINATION_OFFSET): Adjust for elimination of rap to
- mips16 frame pointer.
- * config/mips/mips.md (store ra): Only to small SP offsets.
- 2001-08-22 Graham Stott <grahams@redhat.com>
- * config/mips/mips.h (RETURN_ADDR_RTX): For a leaf function
- return a REG rtx for the return address register.
-
-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".
- (GO_IF_LEGITIMATE_ADDRESS): Rename macro arguments.
-
-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-18 Bernd Schmidt <bernds@redhat.com>
-
- * config/arm/arm.c (arm_gen_movstrqi): Use gen_lowpart instead
- of gen_rtx_SUBREG.
- (arm_reload_out_hi): Use gen_lowpart instead of
- gen_rtx_SUBREG to access QImode components.
- * config/arm/arm.md: Disable zero_extend split for QImode
- subregs in BIG_ENDIAN mode.
- (storehi_bigend): Match use of least significant byte.
- (storeinthi): Remove extraneous SUBREG.
- Add missing construction of operands[2].
- (movhi): Use gen_lowpart in place of gen_rtx_SUBREG.
- (movqi): Use gen_lowpart in place of gen_rtx_SUBREG.
- Replace gen_rtx (SUBREG) with gen_rtx_SUBREG.
-
-2002-03-18 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.h (PREDICATE_CODES): Add PARALLEL to
- any_operand.
-
-2002-03-17 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (alpha_emit_set_const_1): Build add insns
- explicitly.
-
-2002-03-17 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)).
-
-2002-03-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * ifcvt.c (dead_or_predicable): Fix uninitialized variable.
-
- * predict.c (estimate_bb_frequencies): Delete unused variables.
-
-2002-03-17 Richard Henderson <rth@redhat.com>
-
- * config/ia64/ia64.c (ia64_attribute_table): Move before
- targetm definition. Make static.
-
-2002-03-17 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-common.h (yyparse, c_common_parse_file): New.
- * c-lang.c: Include c-common.h.
- (LANG_HOOKS_PARSE_FILE): Redefine.
- * c-lex.c: Include c-common.h.
- (yyparse): Rename c_common_parse_file. Call yyparse.
- * c-parse.in (yyparse): Remove macro.
- * c-tree.h (yyparse_1): Remove.
- * langhooks-def.h (LANG_HOOKS_PARSE_FILE): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct lang_hoooks): New hook parse_file.
- * toplev.c (compile_file): Use parse_file hook.
- * tree.h (yyparse): Remove.
- * objc/objc-lang.c (LANG_HOOKS_PARSE_FILE): Redefine.
-
-2002-03-17 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.md ("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-16 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.h (CAN_ELIMINATE): Don't eliminate rap to $fp
- (s8), but rather HARD_FRAME_POINTER_REGNUM. Add parentheses
- where appropriate. Make the second reference to
- leaf_function_p a function call, as intended. Reindented.
-
- * config/mips/mips.h (ISA_HAS_COND_TRAP): Not available on MIPS16.
- * config/mips/mips.md (trap) [TARGET_MIPS16]: Emit `break 0'.
-
- * config/mips/mips.md (addsi3, adddi3): Use scratch register to
- add register to non-constant into sp.
-
- * config/mips/mips-protos.h (embedded_pic_fnaddr_reg): New.
- * config/mips/mips.h (embedded_pic_fnaddr_rtx): Lose.
- (mips16_gp_pseudo_rtx): Lose.
- (INIT_EXPANDERS): Deleted.
- * config/mips/mips.c (mips_init_machine_status): New.
- (mips_free_machine_status): New.
- (mips_mark_machine_status): New.
- (override_options): Set them.
- (embedded_pic_fnaddr_rtx, mips16_gp_pseudo_rtx): Moved to...
- (struct machine_function): ... new. Replaced all references.
- (mips_add_gc_roots): Don't mark them.
- (embedded_pic_fnaddr_reg): New, extracted from...
- (embedded_pic_offset): ... here.
- * config/mips/mips.md (movdi): Call embedded_pic_fnaddr_reg.
- (movsi): Likewise.
-
-2002-03-16 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppinit.c: Revert -MD removal.
-
-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.
-
-Sat Mar 16 12:57:28 CET 2002 Jan HUbicka <jh@suse.cz>
-
- * cfgcleanup.c (cleanup_cfg): Fix updating of liveness.
-
-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.
- (COMMAND_LINE_OPTIONS): Remove OPT_MD, OPT_MMD.
- (cpp_handle_option): Update.
-
-2002-03-15 Chris Demetriou <cgd@broadcom.com>
-
- * config/mips/mips.h (SUBTARGET_CPP_SIZE_SPEC): Provide an
- MEABI case for each definition of SUBTARGET_CPP_SIZE_SPEC,
- and define it so that regardless of target CPU size,
- __SIZE_TYPE__ and __PTRDIFF_TYPE__ are defined in terms
- of "int" rather than "long."
-
-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 Mark Mitchell <mark@codesourcery.com>
-
- * 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 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 Jason Merrill <jason@redhat.com>
-
- * varasm.c (assemble_variable): Call resolve_unique_section before
- checking DECL_SECTION_NAME. Use zeros for a decl with DECL_INITIAL
- of error_mark_node.
-
-2002-03-15 Richard Earnshaw <rearnsha@arm.com>
-
- PR target/5170
- * arm.md (split pattern for thumb shiftable immediates): Add comment
- explaining non-obvious test.
-
-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>
-
- * 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-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 Michael Meissner <meissner@redhat.com>
-
- * params.def (PARAM_MAX_UNROLLED_INSNS): New macro, default to
- 100, allowing MAX_UNROLLED_INSNS to be overridden.
-
- * params.h (MAX_UNROLLED_INSNS): Define so it can be overridden by
- --param.
-
- * unroll.c (params.h): Include.
- (MAX_UNROLLED_INSNS): Delete, now in params.h.
-
- * doc/invoke.texi (--param max-unroll-insns): Document.
-
- * Makefile.in (unroll.o): Add $(PARAMS_H) dependency.
-
-2002-03-14 Richard Earnshaw <rearnsha@arm.com>
-
- * arm.md: Fix warnings about constraints in peepholes and splits.
-
-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.
-
-Thu Mar 14 19:04:29 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * emit-rtl.c (try_split): Use delete_insns.
- * recog.c (split_all_insns): Fix terminating condition.
-
-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-14 Richard Sandiford <rsandifo@redhat.com>
-
- * config/mips/mips.h (FP_INC, UNITS_PER_FPVALUE): New macros.
- * config/mips/mips.c (compute_frame_size): Retrofit them here.
- (save_restore_insns, mips_expand_epilogue): And here.
- (build_mips16_call_stub): And here.
- (mips_function_value): Use the new macros to decide whether a single
- or complex float can be returned in floating-point registers. Return
- a parallel rtx in the complex case.
-
-Thu Mar 14 11:03:12 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (rest_of_compilation): Add CLEANUP_UPDATE_LIFE to cfg_cleanup
- call after liveness analysis.
-
- * recog.c (split_insn): Use delete_insn_and_edges.
-
- * cfgrtl.c (verify_flow_info): Be permisive about non-any_condjump
- instructions to have branch prediction notes.
- * ia64reorg.c (ia64_reorg): Do not rebuild CFG.
-
-2002-03-14 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-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-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 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-13 Hans-Peter Nilsson <hp@axis.com>
-
- * config/cris/cris.c (cris_target_asm_function_prologue): Revert
- 2002-03-12 internal visibility change.
- (cris_encode_section_info): Consider MODULE_LOCAL_P when encoding
- visibility into SYMBOL_REF_FLAG.
-
-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-12 Jason Merrill <jason@redhat.com>
-
- * c-typeck.c (convert_for_assignment): Don't allow conversions
- between pointers and references. Only allow lvalues to convert to
- reference.
-
-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 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * c-common.c (c_tree_code_type, c_tree_code_length,
- c_tree_code_name, add_c_tree_codes): Delete.
- * c-common.h (add_c_tree_codes): Delete.
- * c-lang.c (tree_code_type, tree_code_length, tree_code_name):
- Define.
- * c-objc-common.c (c_objc_common_init): Don't call
- add_c_tree_codes, instead set lang_unsafe_for_reeval.
- * objc/objc-act.c (objc_tree_code_type, objc_tree_code_length,
- objc_tree_code_name, add_objc_tree_codes): Delete.
- (objc_init): Don't call add_objc_tree_codes.
- * objc/objc-lang.c (tree_code_type, tree_code_length,
- tree_code_name): Define.
- * toplev.c (lang_independent_init): Don't set
- tree_code_length[IDENTIFIER_NODE].
- * tree.c (tree_code_type, tree_code_length, tree_code_name):
- Delete definitions, moved to language front-ends.
- * tree.def (IDENTIFIER_NODE): Hardwire the length.
- * tree.h (tree_code_type, tree_code_length, tree_code_name):
- Const-ify.
- (tree_code_length): Change type to unsigned char.
-
-2002-03-12 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (ix86_expand_prologue): Revert 2002-03-03
- internal visibility change.
-
-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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-lex.h (position_after_whitespace): Remove.
-
-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 Tom Rix <trix@redhat.com>
-
- * collect2.c (resolve_lib_name): Move outside of
- OBJECT_FORMAT_COFF ifdef.
- (ignore_library): Same.
-
-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 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.h (PREDICATE_CODES): Add any_operand and
- zero_constant.
- * config/rs6000/rs6000.c (easy_fp_constant): Fix formatting.
-
-2002-03-12 Alan Modra <amodra@bigpond.net.au>
-
- * config/rs6000/rs6000.md (addsi3): Optimize sign extension.
- (adddi3): Likewise.
- (movdf): Likewise.
- (movdi): Likewise.
- (cmpsi splitter): Likewise.
- (modsi3): Fail if <= 0.
- * config/rs6000/rs6000.c (reg_or_add_cint64_operand): Remove
- redundant test when HOST_BITS_PER_WIDE_INT != 32.
- (reg_or_sub_cint64_operand): Likewise.
- (num_insns_constant_wide): Optimize sign extension.
- (rs6000_legitimize_address): Likewise.
-
-2002-03-12 Andrew MacLeod <amacleod@redhat.com>
-
- * config/sparc/linux.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.
- * config/sparc/linux64.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.
-
-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-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * Makefile.in (debug.o): Depend on debug.h.
- * dbxout.c (dbx_debug_hooks, xcoff_debug_hooks): Const-ify.
- * debug.c (do_nothing_debug_hooks): Likewise.
- * debug.h (debug_hooks, do_nothing_debug_hooks, dbx_debug_hooks,
- sdb_debug_hooks, xcoff_debug_hooks, dwarf_debug_hooks,
- dwarf2_debug_hooks, vmsdbg_debug_hooks): Likewise.
- * dwarf2out.c (dwarf2_debug_hooks): Likewise.
- * dwarfout.c (dwarf_debug_hooks): Likewise.
- * integrate.c (output_inline_function): Likewise.
- * objc/objc-act.c (synth_module_prologue): Likewise.
- * sdbout.c (sdb_debug_hooks): Likewise.
- * toplev.c (debug_hooks): Likewise.
- * vmsdbgout.c (vmsdbg_debug_hooks): Likewise.
-
-2002-03-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * 1750a.h, a29k.h, arc.h, arm.h, c4x.h, clipper.h, cris.h, d30v.h,
- dsp16xx.h, fr30.h, h8300.h, i370.h, i386.h, i860.h, i960.h,
- m32r.h, m68hc11.h, m68k.h, m88k.h, mcore.h, mmix.h, mn10300.h,
- ns32k.h, pa.h, pdp11.h, pj.h, romp.h, s390.h, stormy16.h,
- v850.h, vax.h, we32k.h, xtensa.h (POINTER_SIZE): Delete.
- * defaults.h (POINTER_SIZE): Define.
- * doc/tm.texi (POINTER_SIZE): Document default.
-
-2002-03-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * mn10200.h (PTRDIFF_TYPE): Change it to a signed type.
-
-2002-03-11 Richard Henderson <rth@redhat.com>
-
- * toplev.c (rest_of_compilation): Call purge_all_dead_edges
- if rebuild_label_notes_after_reload.
-
-2002-03-12 Hans-Peter Nilsson <hp@axis.com>
-
- * config/cris/cris.c (cris_target_asm_function_prologue): Do not
- emit pic register load if "internal" visibility.
- (cris_print_operand): Avoid traditional-warning for 0xffffffff.
- (cris_expand_builtin_va_arg): Do all computations on trees.
-
-2002-03-11 Richard Henderson <rth@redhat.com>
-
- * rtlanal.c: Include recog.h.
- (keep_with_call_p): Fix thinko.
- * Makefile.in (rtlanal.o): Update dependencies.
-
-2002-03-11 Chris Meyer <cmeyer@gatan.com>
-
- * genflags.c (gen_insn): Use IS_VSPACE.
- * genoutput.c (output_insn_data): Likewise.
- (process_template): Likewise.
-
-2002-03-11 Richard Henderson <rth@redhat.com>
-
- * toplev.c (rest_of_compilation): Don't compile if we've had errors.
-
-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.
- * doc/gcc.texi: Include cppopts.texi and cppenv.texi.
- * doc/cpp.texi: Include cppopts.texi and cppenv.texi.
-
-2002-03-11 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in: Give texi2pod its input file as a command line
- argument, not on stdin.
-
-2002-03-11 Dan Nicolaescu <dann@ics.uci.edu>
- Daniel Berlin <dan@dberlin.org>
-
- C++ alias analysis improvement.
- * alias.c (record_component_aliases): Record aliases for base
- classes too.
-
-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-11 Richard Sandiford <rsandifo@redhat.com>
-
- * defaults.h (LARGEST_EXPONENT_IS_NORMAL, ROUND_TOWARDS_ZERO): New.
- (MODE_HAS_NANS, MODE_HAS_INFINITIES): Evaluate to false if
- LARGEST_EXPONENT_IS_NORMAL for the given mode.
- (MODE_HAS_SIGN_DEPENDENT_ROUNDING): False when ROUND_TOWARDS_ZERO.
- * real.c (eadd1): Make rounding dependent on !ROUND_TOWARDS_ZERO.
- (ediv, emul, eldexp, esqrt): Likewise.
- (etoe113, etoe64, etoe53, etoe24, etodec, etoibm, etoc4x): Likewise.
- (e24toe): Only check NaNs & infinities if !LARGEST_EXPONENT_IS_NORMAL.
- (saturate): New function.
- (toe53, toe24): Saturate on overflow if LARGEST_EXPONENT_IS_NORMAL.
- (make_nan): Use a saturation value instead of a NaN if
- LARGEST_EXPONENT_IS_NORMAL. Warn when this happens.
- * fp-bit.c (pack_d): Saturate on NaN, infinite or overflowing
- inputs if LARGEST_EXPONENT_IS_NORMAL. Represent subnormals as
- zero if NO_DENORMALS. Only round to nearest if !ROUND_TOWARDS_ZERO.
- (unpack_d): No NaNs or infinities if LARGEST_EXPONENT_IS_NORMAL.
- (_fpmul_parts, _fpdiv_parts): Only round to nearest if
- !ROUND_TOWARDS_ZERO.
- * doc/tm.texi (LARGEST_EXPONENT_IS_NORMAL): Document.
- (ROUND_TOWARDS_ZERO): Document.
-
-2002-03-11 Andreas Jaeger <aj@suse.de>
-
- * cfg.c (dump_flow_info): Remove unused variable.
-
-2002-03-11 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.c (mmix_expand_builtin_va_arg): Do all
- computations on trees.
-
-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>
-
- * loop.c (strength_reduce): Compute number of iterations as
- unsigned HOST_WIDE_INT.
-
-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>
-
- * mbchar.c (JIS_state_table, JIS_action_table): Const-ify.
-
- * attribs.c (decl_attributes): Fix signed/unsigned warning.
-
-2002-03-10 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.
- * 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.
-
-2002-03-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * combine.c (make_extraction): Fix error in last change.
-
-2002-03-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * c4x.c (c4x_fp_reglist): Const-ify.
- * cris.c (cris_print_operand): Likewise.
- * i386.c (ix86_va_arg): Likewise.
- * ia64/unwind-ia64.c (unw_decode_table): Likewise.
- * m32r.c (m32r_hard_regno_mode_ok): Likewise.
- * m32r.h (m32r_hard_regno_mode_ok): Likewise.
- * mcore.c (regno_reg_class, mcore_unique_section): Likewise.
- * mcore.h (regno_reg_class): Likewise.
- * mips.c (gen_int_relational): Likewise.
- * ns32k.c (ns32k_reg_class_contents, regclass_map): Likewise.
- * ns32k.h (ns32k_reg_class_contents, regclass_map): Likewise.
- * pdp11.c (move_costs): Likewise.
- * pj.h (INITIALIZE_TRAMPOLINE): Likewise.
- * s390.c (s390_branch_condition_mnemonic, regclass_map):
- Likewise.
- * s390.h (regclass_map): Likewise.
- * sh.c (shift_amounts): Likewise.
- * sh.md (rotlsi3): Likewise.
-
-2002-03-09 Geoffrey Keating <geoffk@redhat.com>
-
- * config/rs6000/rs6000.md (ne0+4): Add extra CLOBBER.
- (ne0+5): Use new clobber to generate proper shift pattern.
- Patch by Michael Matz <matz@kde.org>.
-
-2002-03-09 Andreas Schwab <schwab@suse.de>
-
- * gcc.c (validate_all_switches): Also handle `%W{...}'.
-
-2002-03-09 Geoffrey Keating <geoffk@redhat.com>
-
- * config/rs6000/sysv4.h (BIGGEST_ALIGNMENT): Don't define.
-
-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-09 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.
-
- * config/mips/mips.c (mips_va_arg): Apply big-endianness address
- offset before loading address of argument passed by transparent
- reference.
-
-2002-03-08 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * t-pa64 (LIB1ASMFUNCS, LIB1ASMSRC): Delete.
-
-2002-03-09 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.c (mips_expand_prologue): Set regno of vararg
- marker such that registers after it are saved.
-
-2002-03-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * sparc.c (arith_4096_operand): Fix error in last change.
-
-2002-03-08 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.h (SUBTARGET_CPP_SIZE_SPEC): Remove duplicate
- defaults for MEABI.
-
-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.
-
-Fri Mar 8 21:27:49 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgrtl.c (purge_dead_edges): Set BB_DRITY flags if edge has been
- removed; fix return value.
- * combine.c (combine_instructions): Dirtify blocks where we failed to
- update liveness; purge dead edges; use update_life_info_in_dirty_blocks.
- * toplev.c (rest_of_compilation): Do not purge_dead_edges after combine.
-
-2002-03-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * gcse.c (insert_insn_end_bb): Fix typo in last change.
-
-Fri Mar 8 21:08:52 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * recog.c (peephole2_optimize): Re-distribute EH edges.
-
-2002-03-08 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * expr.c (expand_expr): Use unsave lang hook.
- * langhooks-def.h (LANG_HOOKS_UNSAVE): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.h (struct lang_hooks): New hook unsave.
- * tree.c (lang_unsave, lang_unsave_expr_now): Remove.
- (unsave_expr_1): Remove unused lang_unsave_expr_now.
- (unsave_expr_now_r): Rename lhd_unsave. Update. Return input.
- (unsave_expr_now): Remove.
- * tree.h (unsave_expr_now, lang_unsave,
- lang_unsave_expr_now): Remove.
- (lhd_unsave): New.
-
-2002-03-08 Andreas Jaeger <aj@suse.de>
-
- * flow.c (propagate_block_delete_insn): Remove unused variable.
-
-2002-03-08 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (h8300_adjust_insn_length): Tighten
- insn length for memory load/store.
-
-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 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.h (LONG_MAX_SPEC): Rewrite, along with
- SUBTARGET_CPP_SIZE_SPEC.
- * config/mips/abi64.h (LONG_MAX_SPEC): Delete.
-
- * config/mips/mips.h (SUBTARGET_CPP_SIZE_SPEC): Simplify.
-
-2002-03-07 Matt Hiller <hiller@redhat.com>
-
- * gensupport.c (first_dir_md_include): Renamed from include;
- change all references.
- (last_dir_md_include): Renamed from last_include; change all
- references.
- (init_md_reader): Unconditionally initialize base_dir whether or
- not filename is a relative path.
-
-2002-03-07 Alexandre Oliva <aoliva@redhat.com>
-
- * config/fp-bit.c (_unord_f2): Compile it in even if
- US_SOFTWARE_GOFAST is enabled.
-
- * config/gofast.h (GOFAST_RENAME_LIBCALLS): Set gt and ge as
- NULL_RTX. Set all HFmode operations as NULL_RTX.
- * optabs.c (prepare_float_lib_cmp) <GT, GE, LT, LE>: If libfunc is
- NULL_RTX, try reversing the comparison and the operands.
-
-2002-03-06 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.
-
-Thu Mar 7 16:54:10 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * reload1.c (reload_cse_delete_noop_set): Purge dead edges.
-
-Thu Mar 7 16:33:54 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (fixup_abnormal_edges): Declare.
- * reload1.c (fixup_abnormal_edges): New function.
- * reg-stack.c (convert_regs): Use it.
-
- * gcse.c (insert_insn_end_bb): Handle trapping insns.
-
- * gcse.c (hash_scan_set): Refuse instructions with EH edges.
-
-2002-03-07 Richard Sandiford <rsandifo@redhat.com>
-
- * defaults.h (MODE_HAS_NANS, MODE_HAS_INFINITIES): New.
- (MODE_HAS_SIGNED_ZEROS, MODE_HAS_SIGN_DEPENDENT_ROUNDING): New.
- * flags.h (HONOR_NANS, HONOR_INFINITIES, HONOR_SIGNED_ZEROS): New.
- (HONOR_SIGN_DEPENDENT_ROUNDING): New.
- * builtins.c (expand_builtin_mathfn): Use HONOR_NANS.
- * c-common.c (truthvalue_conversion): Reduce x - y != 0 to x != y
- unless x and y could be infinite.
- (expand_unordered_cmp): New, mostly split from expand_tree_builtin.
- Check that the common type of both arguments is a real, even for
- targets without unordered comparisons. Allow an integer argument
- to be compared against a real.
- (expand_tree_builtin): Use expand_unordered_cmp.
- * combine.c (combine_simplify_rtx): Use the new HONOR_... macros.
- * cse.c (fold_rtx): Likewise. Fix indentation.
- * fold-const.c (fold_real_zero_addition_p): New.
- (fold): Use it, and the new HONOR_... macros.
- * ifcvt.c (noce_try_minmax): Use the new HONOR_... macros.
- * jump.c (reversed_comparison_code_parts): After searching for
- the true comparison mode, use HONOR_NANS to decide whether it
- can be safely reversed.
- (reverse_condition_maybe_unordered): Remove IEEE check.
- * simplify-rtx.c (simplify_binary_operation): Use the new macros
- to decide which simplifications are valid. Allow the following
- simplifications for IEEE: (-a + b) to (b - a), (a + -b) to (a - b),
- and (a - -b) to (a + b).
- (simplify_relational_operation): Use HONOR_NANS.
- * doc/tm.texi: Document the MODE_HAS_... macros.
-
-2002-03-07 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 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 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>
-
- * reload1.c (reload): Unshare all rtl after reload is done.
-
- * 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.
-
-Wed Mar 6 20:32:09 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (rest_of_compilation): Do jump threading before SSA path;
- consistently call delete_trivially_dead_insns after CSE and GCSE;
- fix DFI_life dumping; do jump threading after liveness; do crossjumping
- after liveness2; update comment in last crossjumping.
- * cfgcleanup.c (try_crossjump_to_edge): Dirtify block.
-
-Wed Mar 6 12:27:10 2002 Jeffrey A Law (law@redhat.com)
-
- * ssa-ccp.c (ssa_fast_dce): Update the DF def-use chains
- after completing fast dead code elimination.
-
- * m68k.h (CONST_COSTS): Lower cost of 0.0 when used inside a
- COMPARE operator.
-
-2002-03-06 Phil Edwards <pme@gcc.gnu.org>
-
- * version.c: Fix misplaced leading blanks on first line.
-
-Wed Mar 6 19:08:03 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgrtl.c (verify_flow_info): Accept RESX as EH edge source.
-
-Wed Mar 6 18:14:43 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c (mentions_nonequal_regs): New function.
- (thread_jump): Use it.
- * toplev.c (rest_of_compilation): Run jump threading after
- liveness.
-
-2002-03-06 Jakub Jelinek <jakub@redhat.com>
-
- * ssa-ccp.c (ssa_ccp_substitute_constants): Backout 2002-03-05
- patch.
-
-Wed Mar 6 11:28:19 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * predict.c (estimate_bb_frequencies): Do not reload the
- frequencies from notes.
-
-Wed Mar 6 10:59:39 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgrtl.c (delete_insn_and_edges, delete_insn_chain_and_edges): New.
- * rtl.h (delete_insn_and_edges, delete_insn_chain_and_edges): Declare
-
- * basic-block.h (update_life_info, update_life_info_in_dirty_blocks,
- delete_noop_moves): Return indeger.
- * flow.c (ndead): New variable.
- (propagate_block_delete_insn): Use delete_insn_and_edges; remove
- BB argument; update callers.
- (propagate_block_delete_libcall): Use delete_insn_chain_and_edges.
- (life_analysis): Do not call purge_all_dead_edges.
- (update_life_info): Return number of deleted insns; print statistics.
- (update_life_info_in_dirty_blocks): likewise.
- (delete_noop_moves): Use delete_insn_and_edges; print statistics;
- return number of insns deleted.
-
- * cse.c: Include timevar.h
- (delete_trivially_dead_insns): Kill preserve_basic_blocks argument;
- iterate until stabilizes; print statistics; return number of killed
- insns.
- * Makefile.in: (cse.o): Add timevar.h dependency
- * rtl.h (delete_trivially_dead_insns): New.
- * timever.def: Add TV_DELETE_TRIVIALLY_DEAD timer.
- * toplev.c (rest_of_compilation): Update callers.
-
- * cfgcleanup.c (try_optimize_cfg): Kill blocks.
- (try_optimize_cfg): Do not update liveness.
- (cleanup-cfg): Loop until try_optimize_cfg and dead code
- removal stabilizes; use delete_trivially_dead_insns.
-
- * cfgrtl.c (verify_flow_info): Sanity check outgoing edges.
-
-2002-03-05 Zack Weinberg <zack@codesourcery.com>
-
- * cppmain.c (setup_callbacks): Disable #pragma and #ident
- callbacks when processing assembly language.
-
-2002-03-05 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 Danny Smith <dannysmith@users.sourceforge.net>
-
- * gthr-win32.h (__GTHREAD_MUTEX_INIT_DEFAULT): Define.
-
-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.
-
-Tue Mar 5 18:31:27 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfg.c (dump_flow_info): Warn about profile mismatches.
- * cfgrtl.c (verify_flow_info): Few aditional sanity checks.
- (purge_dead_edges): Remove REG_BR_PROB notes on simplejumps.
-
-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>
-
- * rs6000.h (TOTAL_ALTIVEC_REGS): Fix off-by-one error.
-
-2002-03-04 Geoffrey Keating <geoffk@redhat.com>
-
- * toplev.c (documented_lang_options): Document more
- language-specific options.
- * doc/invoke.texi (Warning Options): Correct documentation for
- -Wno-multichar, -Wno-div-by-zero, and -Wsystem-headers.
- * c-decl.c (c_decode_option): Use a table to handle warning options.
-
-2002-03-05 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.h (ENCODE_SECTION_INFO): Pass on new second
- parameter to mmix_encode_section_info.
- (LINK_SPEC): Don't defsym __.MMIX.start..text if linking
- relocatably. Always produce ELF, not mmo if linking relocatably.
- * config/mmix/mmix.c (mmix_encode_section_info): If new parameter
- first is non-zero, don't add symbol prefix.
- * config/mmix/mmix-protos.h (mmix_encode_section_info): Tweak
- prototype accordingly.
-
-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 Geoffrey Keating <geoffk@redhat.com>
-
- * .cvsignore: Remove *.info* and genrtl*; these files are generated
- elsewhere now.
-
-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.
-
-Mon Mar 4 15:33:54 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (rest_of_compilation): Cleanup CFG after dead jumptables
- removal
-
-2002-03-03 Aldy Hernandez <aldyh@redhat.com>
-
- * config.gcc (powerpc-*-eabialtivec*): Use t-ppcendian.
- (powerpc-*-eabisimaltivec*): Same.
-
- * config/rs6000/t-ppcendian: New.
-
-2002-03-04 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
-
- * c4x-protos.h, c4x.h, c4x.c, c4x.md: Add new functions
- nonimmediate_src_operand and nonimmediate_lsrc_operand to
- disallow ZERO_EXTEND with CONST_INT or CONST_DOUBLE.
-
-2002-03-03 Richard Henderson <rth@redhat.com>
-
- * toplev.c (rest_of_decl_compilation): Revert last two changes.
-
-2002-03-03 Zack Weinberg <zack@codesourcery.com>
-
- * emit-rtl.c, final.c, fold-const.c, gengenrtl.c, optabs.c,
- print-tree.c, real.c, real.h, recog.c, rtl.c, simplify-rtx.c,
- tree.c, config/m68k/m68k.c:
- Remove all #ifndef REAL_ARITHMETIC blocks, make all #ifdef
- REAL_ARITHMETIC blocks unconditional. Delete some further
- #ifdef blocks predicated on REAL_ARITHMETIC.
- * flags.h, toplev.c: Delete remaining references to
- flag_pretend_float.
-
- * doc/invoke.texi: Remove documentation of -fpretend-float.
- * doc/tm.texi: Describe the various REAL_* macros as provided by
- real.h, not by the target configuration files.
-
- * config/alpha/alpha.h, config/alpha/unicosmk.h, config/arm/arm.h,
- config/avr/avr.h, config/c4x/c4x.h, config/convex/convex.h,
- config/cris/cris.h, config/d30v/d30v.h, config/dsp16xx/dsp16xx.h,
- config/h8300/h8300.h, config/i370/i370.h, config/i386/i386.h,
- config/i386/osf1elf.h, config/i960/i960.h, config/ia64/ia64.h,
- config/m32r/m32r.h, config/m68hc11/m68hc11.h, config/m68k/dpx2.h,
- config/m68k/linux-aout.h, config/m68k/linux.h, config/m68k/m68k.h,
- config/m68k/sun3.h, config/m68k/vxm68k.h, config/mcore/mcore.h,
- config/mips/mips.h, config/mmix/mmix.h, config/mn10200/mn10200.h,
- config/mn10300/mn10300.h, config/pa/pa.h, config/pj/pj.h,
- config/rs6000/rs6000.h, config/s390/s390.h, config/sh/sh.h,
- config/sparc/freebsd.h, config/sparc/linux.h, config/sparc/linux64.h,
- config/sparc/sol2.h, config/sparc/sparc.h, config/sparc/vxsim.h,
- config/stormy16/stormy16.h, config/v850/v850.h, config/vax/vax.h,
- config/xtensa/xtensa.h:
- Do not define, undefine, or mention in comments any of
- REAL_ARITHMETIC, REAL_VALUE_ATOF, REAL_VALUE_HTOF,
- REAL_VALUE_ISNAN, REAL_VALUE_ISINF,
- REAL_VALUE_TO_TARGET_SINGLE, REAL_VALUE_TO_TARGET_DOUBLE,
- REAL_VALUE_TO_TARGET_LONG_DOUBLE, REAL_VALUE_TO_DECIMAL,
- REAL_VALUE_TYPE, REAL_VALUES_EQUAL, REAL_VALUES_LESS,
- REAL_VALUE_LDEXP, REAL_VALUE_FIX, REAL_VALUE_UNSIGNED_FIX,
- REAL_VALUE_RNDZINT, REAL_VALUE_UNSIGNED_RNDZINT,
- REAL_INFINITY, REAL_VALUE_NEGATE, REAL_VALUE_TRUNCATE,
- REAL_VALUE_TO_INT, or REAL_VALUE_FROM_INT.
-
-2002-03-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * 1750a.h, a29k.h, alpha.h, arc.h, arm.h, avr.h, c4x.h, clipper.h,
- convex.h, cris.h, d30v.h, dsp16xx.h, elxsi.h, fr30.h, h8300.h,
- i370.h, i386.h, i860.h, i960.h, ia64.h, m32r.h, m68hc11.h, m68k.h,
- m88k.h, mcore.h, mips.h, mmix.h, mn10200.h, mn10300.h, ns32k.h,
- pa.h, pdp11.h, pj.h, romp.h, rs6000.h, s390.h, sh.h, sparc.h,
- stormy16.h, v850.h, vax.h, we32k.h, xtensa.h (BITS_PER_WORD):
- Delete.
- * defaults.h (BITS_PER_WORD): Define.
- * doc/tm.texi (BITS_PER_WORD): Document default value.
-
- * 1750a.h, avr.h, convex.h, d30v.h, dsp16xx.h, fr30.h, ia64.h,
- m68hc11.h, m88k.h, mips.h, pdp11.h, rs6000.h, sparc.c,
- stormy16.h, xtensa.h, vmsdbgout.c (CHAR_TYPE_SIZE): Delete.
-
-2002-03-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * attribs.c (init_attributes, decl_attributes): Use ARRAY_SIZE in
- lieu of explicit sizeof/sizeof.
- * i386.c (override_options, ix86_init_mmx_sse_builtins,
- ix86_expand_builtin): Likewise.
- * mips.c (mips_add_gc_roots): Likewise.
- * mmix.c (mmix_output_condition): Likewise.
- * rs6000.c (rs6000_override_options, altivec_expand_builtin,
- altivec_init_builtins): Likewise.
- * sparc.c (mark_ultrasparc_pipeline_state): Likewise.
- * cppexp.c (Nsuff, parse_number): Likewise.
- * cppinit.c (builtin_array_end): Likewise.
- * gcc.c (n_default_compilers, process_command): Likewise.
- * genpreds.c (output_predicate_decls): Likewise.
- * ggc-page.c (NUM_EXTRA_ORDERS): Likewise.
- * lcm.c (N_ENTITIES): Likewise.
- * stor-layout.c (set_sizetype): Likewise.
-
-2002-03-03 Richard Henderson <rth@redhat.com>
-
- * toplev.c (rest_of_decl_compilation): Do not invoke make_decl_rtl
- for types or labels.
-
-2002-03-03 Richard Henderson <rth@redhat.com>
-
- * c-decl.c (start_decl): Initialized variables are not common.
-
-2002-03-02 Per Bothner <per@bothner.com>
-
- * gcc.c (option_map): Suport new --bootclasspath option.
- --CLASSPATH is now just an alias for --classpath.
-
-2002-03-02 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.h (ix86_expand_prologue): Do not emit pic register
- load if "internal" visibility.
- * doc/extend.texi: Document visibility meanings.
-
-2002-03-02 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.h (ENCODE_SECTION_INFO): MODULE_LOCAL_P applies
- to functions as well.
-
-2002-03-02 Richard Henderson <rth@redhat.com>
-
- * attribs.c (handle_alias_attribute): Don't call assemble_alias.
- (handle_visibility_attribute): Don't call assemble_visibility.
- * toplev.c (rest_of_decl_compilation): Invoke make_decl_rtl even
- without asmspec. Invoke assemble_alias when needed.
- * varasm.c (maybe_assemble_visibility): New.
- (assemble_start_function, assemble_variable, assemble_alias): Use it.
-
-2002-03-02 Richard Henderson <rth@redhat.com>
-
- * varasm.c (make_decl_rtl): Remove call to REDO_SECTION_INFO_P;
- invoke ENCODE_SECTION_INFO with first call flag.
-
- * config/darwin-protos.h, config/darwin.c, config/darwin.h,
- config/a29k/a29k.h, config/alpha/alpha-protos.h, config/alpha/alpha.c,
- config/alpha/alpha.h, config/arc/arc.h, config/arm/arm-protos.h,
- config/arm/arm.h, config/arm/pe.c, config/arm/pe.h,
- config/avr/avr-protos.h, config/avr/avr.c, config/avr/avr.h,
- config/c4x/c4x-protos.h, config/c4x/c4x.c, config/c4x/c4x.h,
- config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.h,
- config/d30v/d30v.h, config/h8300/h8300.h, config/i370/i370.h,
- config/i386/cygwin.h, config/i386/i386-interix.h, config/i386/i386.h,
- config/i386/osfrose.h, config/i386/win32.h, config/i386/winnt.c,
- config/ia64/ia64-protos.h, config/ia64/ia64.c, config/ia64/ia64.h,
- config/m32r/m32r-protos.h, config/m32r/m32r.c, config/m32r/m32r.h,
- config/m68hc11/m68hc11-protos.h, config/m68hc11/m68hc11.c,
- config/m68hc11/m68hc11.h, config/m88k/m88k.h,
- config/mcore/mcore-protos.h, config/mcore/mcore.c,
- config/mcore/mcore.h, config/mips/mips.h, config/ns32k/ns32k.h,
- config/pa/pa.h, config/romp/romp.h, config/rs6000/linux64.h,
- config/rs6000/rs6000-protos.h, config/rs6000/rs6000.c,
- config/rs6000/sysv4.h, config/rs6000/xcoff.h, config/s390/s390.h,
- config/sh/sh.h, config/sparc/sparc.h,
- config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c,
- config/stormy16/stormy16.h, config/v850/v850.h, config/vax/vms.h,
- config/xtensa/xtensa.h, doc/tm.texi: ENCODE_SECTION_INFO now takes
- FIRST argument. As needed, examine it and do nothing.
-
- * config/darwin.h, config/alpha/alpha.h, config/arm/pe.h,
- config/i386/cygwin.h, config/ia64/ia64.h, config/m68hc11/m68hc11.h,
- config/mcore/mcore.h: Remove REDO_SECTION_INFO_P.
-
- * config/arm/t-pe (pe.o): Add dependencies.
-
-2002-03-02 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * a29k.h, alpha.h, arc.h, arm.h, avr.h, clipper.h, convex.h,
- cris.h, d30v.h, elxsi.h, fr30.h, h8300.h, i370.h, i386.h, i860.h,
- i960.h, ia64.h, m32r.h, m68hc11.h, m68k.h, m88k.h, mcore.h,
- mips.h, mmix.h, mn10200.h, mn10300.h, ns32k.h, pa.h, pdp11.h,
- pj.h, romp.h, rs6000.h, s390.h, sh.h, sparc.h, stormy16.h, v850.h,
- vax.h, we32k.h, xtensa.h: (BITS_PER_UNIT): Delete.
- * defaults.h (BITS_PER_UNIT): Define.
- * doc/tm.texi (BITS_PER_UNIT): Document default value.
-
-2002-03-02 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Add a prototype for
- compute_a_shift_length.
- * config/h8300/h8300.c (h8300_asm_insn_count): New.
- (compute_a_shift_length): Likewise.
- (h8300_adjust_insn_length): Do not adjust insn length of shift
- insns.
- * config/h8300/h8300.md (anonymous shift patterns): Use
- compute_a_shift_length.
-
-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 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * Makefile.in (CRTSTUFF_CFLAGS): Add -fno-zero-initialized-in-bss.
- * doc/invoke.texi (-fno-zero-initialized-in-bss): Document.
- * flags.h (flag_zero_initialized_in_bss): Declare.
- * toplev.c (flag_zero_initialized_in_bss): New flag.
- (lang_independent_options): Add flag_zero_initialized_in_bss.
- * tree.c (initializer_zerop): New function.
- * tree.h (initializer_zerop): Declare.
- * varasm.c (assemble_variable): If we can emit bss, put zero
- initializers in the bss section.
-
-2002-03-02 Alan Modra <amodra@bigpond.net.au>
-
- * config/rs6000/rs6000.h (ASM_WEAKEN_DECL): AIX assembler doesn't
- like more than one symbol per .weak directive.
-
-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 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (h8300_adjust_insn_length): Clean up.
-
-Fri Mar 1 20:59:14 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (rest_of_compilation): Delete dead jumptables before
- loop.
- * flow.c (delete_dead_jumptables): Make global.
- * rtl.h (delete_dead_jumptables): Declare.
-
-2002-03-01 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.h (HANDLE_PRAGMA_PACK): Delete.
- * config/rs6000/darwin.h (HANDLE_SYSV_PRAGMA): Define.
- * config/rs6000/xcoff.h (COLLECT_EXPORT_LIST): Delete.
-
-2002-03-01 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Fix formatting.
- * config/h8300/h8300.c: Likewise.
- * config/h8300/h8300.h: Likewise.
-
-2002-03-01 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (print_operand): Support 16-bit
- constant addresses.
- * config/h8300/h8300.h (TINY_CONSTANT_ADDRESS_P): New.
-
-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-03-01 Alan Modra <amodra@bigpond.net.au>
- David Edelsohn <edelsohn@gnu.org>
-
- * doc/tm.texi (ASM_WEAKEN_DECL): Document.
- (ASM_WEAKEN_LABEL): Mention ASM_WEAKEN_DECL.
- (SUPPORTS_WEAK): Likewise.
- * output.h (add_weak): Add tree param.
- * varasm.c (add_weak): Likewise. Save decl.
- (struct weak_syms): Add decl field.
- (mark_weak_decls): New function.
- (init_varasm_once): ggc_add_root mark_weak_decls.
- (assemble_start_function): Use ASM_WEAKEN_DECL.
- (assemble_variable): Likewise.
- (assemble_alias): Likewise.
- (declare_weak): Pass decl to add_weak.
- (weak_finish): Use ASM_WEAKEN_DECL. Try to find decl.
- (remove_from_pending_weak_list): Declare and define for
- ASM_WEAKEN_DECL.
- * c-pragma.c (handle_pragma_weak): Adjust add_weak call.
- * c-pragma.h (HANDLE_PRAGMA_WEAK): Define if ASM_WEAKEN_DECL too.
- * defaults.h (SUPPORTS_WEAK): Likewise.
- * 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.
- * config/rs6000/xcoff.h (ASM_DECLARE_FUNCTION_NAME): Don't emit
- .weak for code sym.
- (HANDLE_PRAGMA_WEAK): Remove.
- (ASM_WEAKEN_LABEL): Remove.
- * config/rs6000/aix.h (HANDLE_SYSV_PRAGMA): Define.
-
-2002-03-01 Jason Merrill <jason@redhat.com>
-
- * tree.h (TARGET_EXPR_SLOT, TARGET_EXPR_INITIAL): New macros.
- (TARGET_EXPR_CLEANUP): New macro.
-
-2002-02-28 Steve Ellcey <sje@cup.hp.com>
-
- * doc/rtl.texi (SUBREG_PROMOTED_UNSIGNED_P): Change definition
- to take ptr_extend into account as third type of extension.
- (SUBREG_PROMOTED_UNSIGNED_SET): Definition of new macro to set bit
- fields used by SUBREG_PROMOTED_UNSIGNED_P.
- * rtl.h (SUBREG_PROMOTED_UNSIGNED_SET): New macro.
- (SUBREG_PROMOTED_UNSIGNED_P): Change to return -1 as well as 0 or 1.
- * calls.c (precompute_arguments): Use new macro.
- (expand_call): Ditto.
- * combine.c (nonzero_bits): Ditto.
- (record_promoted_value): Ditto.
- * expr.c (store_expr): Ditto.
- (expand_expr): Ditto.
- * function.c (assign_parms): Ditto.
-
-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 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 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 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * c-parse.in (STATIC): New terminal.
- (scspec): New non-terminal. Update productions accordingly.
- (program): Remove bogus ifc / end ifc.
- (array_declarator): Simplify production using STATIC.
-
-2002-02-28 Jim Meyering <meyering@lucent.com>
-
- * cpplex.c (cpp_parse_escape): Restore mistakenly-removed code:
- \a still means TARGET_BELL.
-
-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 Andrew MacLeod <amacleod@redhat.com>
-
- * config/sparc/sparc.c (sparc64_initialize_trampoline): Generate sign
- extended constants.
-
-2002-02-28 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c: Fix formatting.
- * config/h8300/h8300.h: Likewise.
-
-2002-02-28 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_hard_regno_mode_ok): Do not allow r29
- which may overwrite the high byte of the frame pointer.
-
-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.
-
-2002-02-28 Jason Merrill <jason@redhat.com>
-
- * c-decl.c (finish_function): Only warn about missing return
- statement with -Wreturn-type.
-
-Don Feb 28 11:24:30 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
-
-Don Feb 28 11:07:36 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (BB_REACHABLE): Renumber.
- (BB_DIRTY, BB_NEW): New flags.
- (clear_bb_flags): Declare.
- (update_life_info_in_dirty_blocks): Declare.
- * cfg.c (clear_bb_flags): New function.
- * cfgrtl.c (create_basic_block_structure): Set flags to BB_NEW.
- * emit-rtl.c (add_insn_after, add_insn_before, remove_insn,
- reorder_insns, emit_insn_after): Mark block as dirty.
- * flow.c (update_life_info): Fix clearing of PROP_LOG_LINKS.
- (update_life_info_in_dirty_blocks): New function.
- * recog.c (apply_change_group): Dirtify block.
-
- * cse.c (cse_insn): Reorder emitting of jump insn to keep
- cfg consistent.
- * gcse.c (delete_null_pointer_checks): Likewise.
-
- * toplev.c (dump_file_index): Move cse2 after bp,
- add DFI_null
- (dump_file_info): Similary.
- (rest_of_compilation): Avoid most of CFG rebuilds;
- do first if converision after null pointer checks, do cse2
- after branch prediction; avoid full liveness rebuild after
- initializing subregs.
- * invoke.texi (-d options): Document -du, renumber.
-
- * cfgcleanup.c (bb_flags): Remove BB_UPDATE_LIFE.
- (notice_new_block): Do not set BB_UPDATE_LIFE.
- (try_forward_edges, merge_blocks_move_predecessor_nojumps,
- merge_blocks_move_successor_nojumps, merge_blocks,
- try_crossjump_to_edge): Likewise.
- (try_optimize_cfg): Likewise; use update_life_info_in_dirty_blocks.
- * cfgrtl.c (merge_blocks_nomove): Copy b's flags to a.
- * ifcvt.c (SET_UPDATE_LIFE, UPDATE_LIFE): Kill.
- (merge_of_block): Do not use life_data_ok.
- (find_if_case_1): Do not use SET_UPDATE_LIFE.
- (if_convert): Use BB_DIRTY mechanizm to update life.
- * lcm.c (optimize_mode_switching): Update
- update_life_info_in_dirty_blocks
-
-2002-02-28 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * Makefile.in (integrate.o): Update.
- * c-decl.c (copy_lang_decl): Rename.
- * c-lang.c (LANG_HOOKS_DUP_LANG_SPECIFIC_DECL): Redefine.
- * integrate.c: Include langhooks.h.
- (copy_decl_for_inlining): Update to use langhook.
- * langhooks-def.h (lhd_do_nothing_t,
- LANG_HOOKS_DUP_LANG_SPECIFIC_DECL): New.
- (LANG_HOOKS_INITIALIZER): Update.
- * langhooks.c (lhd_do_nothing_t): New.
- * langhooks.h (struct lang_hooks): Add dup_lang_specific_decl.
- * tree.h (copy_lang_decl): Remove.
-objc:
- * objc-lang.c (LANG_HOOKS_DUP_LANG_SPECIFIC_DECL): Redefine.
-
-2002-02-27 Andrew MacLeod <amacleod@redhat.com>
-
- * dwarf2out.c (stack_adjust_offset): Add support for POST_INC,
- POST_DEC, and POST_MODIFY.
-
-2002-02-27 Zack Weinberg <zack@codesourcery.com>
-
- * c-typeck.c (digest_init): Remove unused parameter; all
- callers changed.
-
-2002-02-27 Geoffrey Keating <geoffk@redhat.com>
-
- * expmed.c (expand_shift): Correctly test for low part of a
- subreg.
-
-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 Zack Weinberg <zack@codesourcery.com>
-
- * c-common.c, c-common.h, c-decl.c, c-lex.c, c-parse.in,
- c-tree.h, c-typeck.c, cppexp.c, cpplex.c, cpplib.c, cpplib.h,
- cppmacro.c, objc/lang-specs.h, objc/objc-act.c,
- builtin-types.def, builtins.def, dwarf2out.c, dwarfout.c,
- gcc.c, toplev.c: Delete code implementing -traditional mode.
-
- * doc/bugreport.texi, doc/cpp.texi, doc/extend.texi,
- doc/invoke.texi, doc/standards.texi, doc/trouble.texi:
- Document removal of -traditional mode for compilation, and
- remove documentation only relevant to that mode.
-
- * config/nextstep.h, config/ptx4.h, config/svr4.h,
- config/convex/convex.h, config/d30v/d30v.h,
- config/i386/dgux.h, config/i386/osf1elf.h,
- config/i386/osfelf.h, config/i386/osfrose.h,
- config/i386/sco5.h, config/i386/sol2.h, config/m68k/a-ux.h,
- config/m68k/hp310.h, config/m88k/dgux.h,
- config/m88k/dguxbcs.h, config/m88k/luna.h, config/m88k/m88k.c,
- config/m88k/m88k.h, config/m88k/openbsd.h,
- config/mips/abi64.h, config/mips/osfrose.h,
- config/mips/svr4-5.h, config/mips/svr4-t.h,
- config/sparc/sol2-sld-64.h, config/sparc/sol2.h,
- config/stormy16/stormy16.h: Remove all references to
- -traditional from target specs. Delete all mention of the
- no-longer-necessary TRADITIONAL_RETURN_FLOAT macro. Also
- delete a couple of commented-out definitions of
- DOLLARS_IN_IDENTIFIERS, with (incorrect) commentary referring
- to -traditional.
-
- * system.h: Poison TRADITIONAL_RETURN_FLOAT.
- * doc/tm.texi: Remove mention of TRADITIONAL_RETURN_FLOAT macro.
-
-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 Graham Stott <grahams@redhat.com>
-
- * config/rs6000/rs6000.h (ASM_OUTPUT_DEF_FROM_DELC):
- 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.
-
-Wed Feb 27 10:45:19 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * linux64.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Remove.
- * x86-64.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Allways define.
-
-Wed Feb 27 10:39:20 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * linux64.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Define.
-
-2002-02-27 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpplex.c (_cpp_lex_token): Handle directives in macro
- arguments.
- * cpplib.c (_cpp_handle_directive): Save and restore state
- if parsing macro args when entering a directive.
- * cppmacro.c (collect_args): No need to handle directives
- in macro arguments.
- (enter_macro_context, replace_args): Use the original macro
- definition in case it was redefined whilst collecting arguments.
-doc:
- * cpp.texi: Update.
-
-2002-02-26 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/aix43.h (THREAD_MODEL_SPEC): Delete.
- * config/rs6000/aix51.h (THREAD_MODEL_SPEC): Delete.
- * config/rs6000/rs6000.c (rs6000_return_addr): Use efficient
- method on AIX.
- * config/rs6000/rs6000.md (movsi_low): Use gpc_reg_operand.
- (movsi_low_st, movdf_low, movdf_low_st, movsf_low, movsf_low_st): Same.
- (load_toc_v4_PIC_2): Same.
-
-2002-02-26 Alan Modra <amodra@bigpond.net.au>
-
- * config/rs6000/rs6000.md (load_toc_aix_di): Handle TARGET_RELOCATABLE.
-
-2002-02-26 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (ashldi_se): Re-enable.
-
-2002-02-26 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (alpha_encode_section_info): Examine
- MODULE_LOCAL_P; improve commentary.
-
-2002-02-26 Zack Weinberg <zack@codesourcery.com>
-
- * doc/cpp.texi: Clarify documentation of relationship between
- #line and #include.
-
-2002-02-26 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Update the prototype for
- compute_logical_op_length. Add the prototype for
- compute_logical_op_cc.
- * config/h8300/h8300.c (compute_logical_op_length): Figure out
- code from operands.
- (compute_logical_op_cc): New.
- * config/h8300/h8300.md: Combine all the logical op patterns
- in HImode and SImode. Use compute_logical_op_cc.
-
-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 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>
-
- * attribs.c (c_common_attribute_table): Add visibility.
- (handle_visibility_attribute): New function.
- * varasm.c (assemble_visibility): New function.
- * output.h (assemble_visibility): Add prototype.
- * tree.h (MODULE_LOCAL_P): Define.
- * crtstuff.c (__dso_handle): Use visibility attribute.
- * config/i386/i386.h (ENCODE_SECTION_INFO): Set SYMBOL_REF_FLAG
- for MODULE_LOCAL_P symbols too.
- * config/ia64/ia64.c (ia64_encode_section_info): Handle
- MODULE_LOCAL_P symbols the same way as local symbols.
- Add SDATA_NAME_FLAG_CHAR even if decl was explicitely forced
- into .sdata/.sbss by the user.
- * doc/extend.texi (Function Attributes): Document visibility
- attribute.
-
-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-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 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Add a prototype for
- compute_logical_op_length.
- * config/h8300/h8300.c (compute_logical_op_length): New.
- * config/h8300/h8300.md (anonymous logical patterns): Use
- compute_logical_op_length for length.
-
-2002-02-26 Aldy Hernandez <aldyh@redhat.com>
-
- * dwarf2out.c (modified_type_die): Do not call type_main_variant
- for vectors.
- (gen_type_die): Same.
-
- * attribs.c (handle_vector_size_attribute): Set debug information.
-
-2002-02-26 Daniel Egger <degger@fhm.edu>
-
- * config/rs6000/rs6000.md: Swap define_insn attributes to
- fix incorrect generation of merge high instructions instead
- of merge low.
-
-2002-02-26 Aldy Hernandez <aldyh@redhat.com>
-
- * c-typeck.c (really_start_incremental_init): Use
- bitsize_zero_node for vectors.
-
-2002-02-26 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.md (get_vrsave_internal): Fix typo.
- ("*set_vrsave_internal"): Same.
-
-2002-02-25 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-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>s
-
- * 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.
-
-2002-01-31 Jason Merrill <jason@redhat.com>
-
- * Makefile.in (c-parse.c): Handle .output file.
- * objc/Make-lang.in (objc-parse.c): Likewise.
-
-2002-02-01 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.h (ENDIAN_SPEC): Output the endianness flag if
- the -me[lb] option is given. Don't output the default flag
- twice.
-
-2002-01-31 Zack Weinberg <zack@codesourcery.com>
-
- * c-lex.c (yyparse): Call debug_hooks->start_source_file for
- the primary source file; this has not been done yet.
- * c-decl.c (c_expand_body): Reset input_filename from
- DECL_SOURCE_FILE (fndecl) before calling init_function_start.
-
-2002-01-31 Kazu Hirata <kazu@hxi.com>
-
- * rtlanal.c (subreg_regno_offset): Do not use
- SUBREG_REGNO_OFFSET.
- * system.h: Add SUBREG_REGNO_OFFSET to the GCC poison list.
- * doc/tm.texi (SUBREG_REGNO_OFFSET): Remove.
-
-2002-01-31 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * gccbug.in: Follow GNU Coding Standards for --version. Use GCC
- version rather than GNATS version in --version output.
-
-2002-01-31 Richard Sandiford <rsandifo@redhat.com>
-
- * ifcvt.c (noce_process_if_block): Make a copy of the destination
- when copying back from a temporary.
-
-2002-01-30 Richard Henderson <rth@redhat.com>
-
- * ifcvt.c (dead_or_predicable): Handling merging when other_bb
- and new_dest are the same.
-
-2002-01-30 Richard Henderson <rth@redhat.com>
-
- PR opt/5076
- * rtl.h (NOTE_INSN_LOOP_END_TOP_COND): New.
- * rtl.c (note_insn_name): Update.
- * emit-rtl.c (remove_unnecessary_notes): Kill it.
- * stmt.c (expand_end_loop): Kill jump opt code. Use LOOP_END_TOP_COND
- to perform loop rotation.
- (expand_exit_loop_top_cond): New.
- * tree.h (expand_exit_loop_top_cond): Declare it.
- * c-semantics.c (genrtl_while_stmt): Use it.
- (genrtl_for_stmt): Likewise.
-
-2002-01-30 Alexandre Oliva <aoliva@redhat.com>
-
- * config/mips/mips.h (PARM_BOUNDARY): Guarantee alignment of
- arguments to 64-bit boundaries on 64-bit ABIs.
-
-2002-01-30 Steve Ellcey <sje@cup.hp.com>
-
- * loop.c (loop_invariant_p): Special case pic_offset_table_rtx.
-
-2002-01-31 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * c-decl.c (grokdeclarator): Handle type being a typedef for an
- invalid type.
-
-2002-01-30 David O'Brien <obrien@FreeBSD.org>
-
- * config.gcc: Include sparc/biarch64.h rather than sparc/sparc_bi.h.
- * config/sparc/sparc_bi.h: Remove file.
- * config/sparc/biarch64.h: New file (rename of sparc_bi.h).
-
-2002-01-30 Richard Henderson <rth@redhat.com>
-
- * sched-deps.c (sched_analyze): Make a call read the frame pointer.
-
-2002-01-30 Zack Weinberg <zack@codesourcery.com>
-
- * expmed.c (emit_store_flag): Call protect_from_queue on op0 and op1.
-
-2002-01-30 Jason Merrill <jason@redhat.com>
-
- * dwarf2out.c (dwarf_cfi_name): Add other DWARF 3 codes.
- (output_cfi): Likewise. Disable DW_CFA_GNU_negative_offset_extended.
- (reg_save): Use DW_CFA_offset_extended_sf instead.
-
- * dwarf2out.c (dwarf2out_finish): Don't abort if there were errors.
-
-2002-01-29 Jakub Jelinek <jakub@redhat.com>
-
- * cselib.c (cselib_record_sets): Use IF_THEN_ELSE result
- in cselib_lookup.
-
-2002-01-29 Aldy Hernandez <aldyh@redhat.com>
-
- * rs6000.md ("*call_value_local32"): Remove constraints.
- ("*call_value_local64"): Same.
- ("*call_value_indirect_nonlocal_aix32"): Same.
- ("*call_value_nonlocal_aix32"): Same.
- ("*call_value_indirect_nonlocal_aix64"): Same.
- ("*call_value_nonlocal_aix64"): Same.
- ("*call_value_nonlocal_sysv"): Same.
-
-2002-01-29 Richard Henderson <rth@redhat.com>
-
- * config/alpha/elf.h (SDB_DEBUGGING_INFO): Undef.
-
-2002-01-29 Richard Henderson <rth@redhat.com>
-
- * expr.c (force_operand): Ignore flag_pic for detecting pic
- address loads.
- * regclass.c (init_reg_sets_1): Test fixed_regs not flag_pic
- for determining if PIC_OFFSET_TABLE_REGNUM is call-clobbered.
- * resource.c (mark_target_live_regs): Use regs_invalidated_by_call
- instead of open-coded loop.
- * doc/tm.texi (PIC_OFFSET_TABLE_REGNUM): Clarify that it must
- be fixed when in use.
-
-2002-01-29 Richard Henderson <rth@redhat.com>
-
- * sched-int.h (struct deps_reg): Add uses_length, clobbers_length.
- * sched-rgn.c (propagate_deps): Update them.
- * sched-deps.c (sched_analyze_insn): Update them. Flush the
- clobbers list when either gets too long.
-
-2002-01-29 Jakub Jelinek <jakub@redhat.com>
-
- * config/i386/i386.h (LIMIT_RELOAD_CLASS): Handle LEGACY_REGS
- and INDEX_REGS the same as GENERAL_REGS.
- (SECONDARY_OUTPUT_RELOAD_CLASS): Likewise.
-
-2002-01-29 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * tree.c (build_nonstandard_integer_type): Correct prototype.
-
-2002-01-29 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.md (movstrsico, movstrdix_64,
- movstrsix_31): Remove, replace by ...
- (movstrdi_short, movstrsi_short, movstrdi_long,
- movstrsi_long): ... these. New.
- (movstrdi, movstrsi): Adapt.
-
- (rotldi3, rotlsi3, ashldi3, *ashldi3_31, *ashldi3_64,
- ashlsi3, lshrdi3, *lshrdi3_31, *lshrdi3_64, lshrsi3):
- Remove unnecessary CC clobber.
- (*ashrdi3_cc_31, *ashrdi3_cconly_31, *ashrdi3_cc_64,
- *ashrdi3_cconly_64, *ashrsi3_cc, *ashrsi3_cconly): New.
-
- (divmoddi4): Don't partially initialize TImode register.
-
-2002-01-29 Geoffrey Keating <geoffk@redhat.com>
-
- * doc/sourcebuild.texi (C Tests): Document gcc.dg/debug directory.
-
-2002-01-29 Richard Henderson <rth@redhat.com>
-
- * flow.c (print_rtl_and_abort): Remove.
- (print_rtl_and_abort_fcn): Remove.
- (verify_local_live_at_start): Use dump_bb instead.
- (verify_wide_reg): Likewise. Take a basic_block, not rtl endpoints.
- (verify_wide_reg_1): Return 2 on mode test failure.
-
-2002-01-29 Neil Booth <neil@daikokuya.demon.co.uk>
-
- PR c/3325, c/3326, c/2511, c/3347
- * c-decl.c (enum_decl_context): Remove BITFIELD.
- (grokdeclarator): Take bitfield width as an input.
- Ensure bitfields are given the correct type. Perform
- bitfield width validation with build_bitfield_integer_type
- rather than waiting for finish_struct.
- (grok_typename, grok_typename_in_parm_context, start_decl,
- push_parmdecl, grokfield, start_function): Update calls to
- grokdeclarator.
- (build_bitfield_integer_type): New function.
- (finish_struct): Move bitfield validation to grokdeclarator
- and build_bitfield_integer_type.
- * tree.c (build_nonstandard_integer_type): New function.
- * tree.h (build_nonstandard_integer_type): New prototype.
-objc:
- * objc-act.c (objc_copy_list): Remove DECL_INITIAL kludge.
-
-2002-01-29 Jakub Jelinek <jakub@redhat.com>
-
- PR other/1502:
- * cppinit.c (cpp_handle_option): Add ignore argument, if it is zero,
- don't ignore unrecognized -W* options.
- (cpp_handle_options): Pass 1 as last argument to cpp_handle_option.
- * cpplib.h (cpp_handle_option): Adjust prototype.
- * c-decl.c (c_decode_options): Pass 0 as last argument to
- cpp_handle_option.
-
- PR c/2896:
- * gcc.c (cpp_unique_options): Split from cpp_options.
- (cpp_options): Source cpp_unique_options.
- (default_compilers): Use cpp_unique_options instead of cpp_options
- when used together with cc1_options.
- (static_specs): Add cpp_unique_options.
- * objc/lang-specs.h: Use cpp_unique_options instead of cpp_options
- when used together with cc1_options.
-
-2002-01-29 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Update the prototype of
- output_a_shift.
- * config/h8300/h8300.c (output_a_shift): Remove an unused
- argument 'insn'. Remove redundant code.
- * config/h8300/h8300.md: Adust to the new prototype of
- output_a_shift.
-
-2002-01-29 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Update the prototypes of
- emit_a_rotate and expand_a_rotate.
- * config/h8300/h8300.c (emit_a_rotate): Change the type of the
- first argument to 'enum rtx_code'.
- (expand_a_rotate): Likewise.
-
-2002-01-28 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Update the prototype of
- output_simode_bld.
- * config/h8300/h8300.c (output_simode_bld): Remove an argumen
- 'log2'.
- * config/h8300/h8300.md: Adjust to the new prototype.
-
-2002-01-28 Kazu Hirata <kazu@hxi.com>
-
- * conifg/h8300/h8300.c (h8300_adjust_insn_length): Remove
- redundant code.
-
-2002-01-28 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * emit-rtl.c (gen_rtx_REG): Check that the PIC_OFFSET_TABLE_REGNUM
- is a fixed register before returning pic_offset_table_rtx.
- * loop.c (scan_loop): Don't hoist insns that set pic_offset_table_rtx
- when PIC_OFFSET_TABLE_REG_CALL_CLOBBERED is defined.
-
-2002-01-28 Jason Merrill <jason@redhat.com>
-
- * dwarf2.h: Sync with src version.
-
-2002-01-28 Paul Koning <pkoning@equallogic.com>
-
- * builtin-types.def (BT_FN_VOID_CONST_PTR_VAR): Replace
- BT_FN_VOID_PTR_VAR.
- * builtins.def (BUILT_IN_PREFETCH): Change first argument to be const.
- * doc/extend.texi (__builtin_prefetch): Update documentation:
- first argument is now const void ptr.
-
-2002-01-28 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Remove an unused prototype.
-
-2002-01-28 Roman Zippel <zippel@linux-m68k.org>
-
- * toplev.c (lang_independent_init): Round up identifier size.
-
-2002-01-28 Richard Earnshaw <rearnsha@arm.com>
-
- * config.gcc: Revert previous change.
-
-2002-01-28 Andris Pavenis <pavenis@latnet.lv>
-
- * config/i386/djgpp.h: Use STRIP_NAME_ENCODING in macro UNIQUE_SECTION
-
-2002-01-28 Richard Earnshaw <rearnsha@arm.com>
-
- * config.gcc (*-*-netbsdelf*): Set up generic parameters.
- (*-*-netbsd*): Always use collect2. Remove collect2 settings from
- other non-elf netbsd config frags.
- * config/netbsd-aout.h (STARTFILE_SPEC): Don't pull in c++rt0 since
- collect2 will does that.
- * config/netbsd.h (LIBGCC_SPEC): Add white space before -lgcc, so that
- shared-lib frobbing will work.
-
-2002-01-28 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.h: Fix formatting.
- * config/h8300/h8300.md: Likewise.
-
-2002-01-28 Loren J. Rittle <ljrittle@acm.org>
-
- * fixinc/inclhack.def (strict_ansi_not): Add a bypass based on
- the old, removed AAA_standards fix.
- * fixinc/fixincl.x: Rebuilt.
-
-2002-01-28 Hans-Peter Nilsson <hp@axis.com>
-
- * config/cris/cris.h (CRT_CALL_STATIC_FUNCTION): Change to emit
- atexit call in crtbegin, hooked in after call to frame_dummy;
- register EH before registering __fini__start.
-
-2002-01-28 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/altivec.h: Remove spurious semicolons.
-
-2002-01-27 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Replace dead bit extraction patterns
- with ones that work.
-
-Sun Jan 27 13:23:40 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * emit-rtl.c (get_mem_attrs): Don't default alignment for non-BLKmode
- if not STRICT_ALIGNMENT.
- * rtl.h (MEM_ALIGN): Likewise.
-
-2002-01-27 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- * doc/invoke.texi (-fdump-translation-unit): Revert this
- patch: 2001-10-21 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
-2002-01-27 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md (define_constants): New.
- (anonymous patterns) Use defined constants appropriately.
-
-2002-01-27 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (function_arg): Remove redundant code.
-
-2002-01-26 Richard Henderson <rth@redhat.com>
-
- * sched-deps.c (reg_pending_uses_head): New.
- (reg_pending_barrier): Rename from reg_pending_sets_all.
- (find_insn_list): Don't mark inline.
- (find_insn_mem_list): Remove.
- (add_dependence_list, add_dependence_list_and_free): New.
- (flush_pending_lists): Replace only_write param with separate
- for_read and for_write parameters. Update all callers. Use
- add_dependence_list_and_free.
- (sched_analyze_1): Do not add reg dependencies here; just set
- the pending bits. Use add_dependence_list.
- (sched_analyze_2): Likewise.
- (sched_analyze_insn): Replace schedule_barrier_found with
- reg_pending_barrier. Add all dependencies for pending reg
- uses, sets, and clobbers.
- (sched_analyze): Don't add reg dependencies for calls, just
- set pending bits. Use regs_invalidated_by_call. Treat
- sched_before_next_call as a normal list, not a fake insn.
- (init_deps): No funny init for sched_before_next_call.
- (free_deps): Free pending mems lists. Don't zero reg_last.
- (init_deps_global): Init reg_pending_uses.
- (finish_deps_global): Free it.
- * sched-int.h (deps): Make in_post_call_group_p boolean. Update docs.
- (find_insn_mem_list): Remove.
- * sched-rgn.c (concat_INSN_LIST, concat_insn_mem_list): New.
- (propagate_deps): Use them. Zero temp mem lists.
-
-2002-01-26 Richard Henderson <rth@redhat.com>
-
- * Makefile.in (CRTSTUFF_CFLAGS): New.
- (crtbegin.o, crtend.o, crtbeginS.o, crtendS.o, crtbeginT.o): Use it.
- * config.gcc (alpha-linux, alpha-freebsd, alpha-netbsd): Use plain
- crtstuff.c instead of alpha assembly version.
- * crtstuff.c (CRT_CALL_STATIC_FUNCTION): Rewrite to assume the
- entire dummy function sequence. Use FORCE_CODE_SECTION_ALIGN
- not FORCE_{INIT,FINI}_SECTION_ALIGN.
- (__do_global_dtors_aux): Mark used.
- (frame_dummy, __do_global_ctors_aux): Mark used.
- (fini_dummy, init_dummy): Remove.
-
- * config/alpha/crtbegin.asm: Remove file.
- * config/alpha/crtend.asm: Remove file.
- * config/alpha/t-crtbe: Remove file.
- * config/alpha/elf.h (CRT_CALL_STATIC_FUNCTION): New.
- (LINK_EH_SPEC): New.
-
- * config/cris/cris.h (CRT_CALL_STATIC_FUNCTION): Rewrite old
- FORCE_INIT_SECTION_ALIGN hack. Register __fini_start before
- calling constructors.
- * config/cris/linux.h (CRT_CALL_STATIC_FUNCTION): Undef.
-
- * config/i386/i386.h (CRT_CALL_STATIC_FUNCTION): New.
- * config/i386/linux.h (CRT_CALL_STATIC_FUNCTION): Replace old
- CRT_END_INIT_DUMMY hack.
- * config/i386/sol2.h (FORCE_CODE_SECTION_ALIGN): Replace
- FORCE_{INIT,FINI}_SECTION_ALIGN.
-
- * config/mcore/mcore-elf.h (FORCE_CODE_SECTION_ALIGN): Replace
- FORCE_{INIT,FINI}_SECTION_ALIGN.
-
- * config/s390/s390.h (CRT_CALL_STATIC_FUNCTION): Update for new
- invocation sequence.
- * config/sh/sh.h (CRT_CALL_STATIC_FUNCTION): Likewise.
-
- * doc/tm.texi (CRT_CALL_STATIC_FUNCTION): Update.
- (FORCE_CODE_SECTION_ALIGN): New.
-
-2002-01-26 Richard Henderson <rth@redhat.com>
-
- * config/cris/cris.c (cris_print_operand): Handle 64-bit CONST_INT.
-
-2002-01-26 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (alpha_sa_mask): Mark RA for unicos here too.
- (alpha_sa_size): Use alpha_sa_mask to compute size of saved regs.
-
-2002-01-26 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Remove bit extraction patterns that
- cannot be triggered.
- Restrict each bit extraction pattern to a variant on which the
- pattern is tested.
-
-2002-01-26 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/include/texinfo.tex: Update to version 2002-01-04.07.
-
-2002-01-26 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Remove bit test patterns that cannot
- be triggered.
- Restrict each bit test pattern to a variant on which the
- pattern is tested.
-
-2002-01-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * builtins.c (expand_builtin_strncat): Remove redundant check for
- INTEGER_CST.
-
-2002-01-25 David O'Brien <obrien@FreeBSD.org>
-
- * config/i386/x86-64.h (DEFAULT_PCC_STRUCT_RETURN): Do not overide
- default setting.
- * config/i386/freebsd64.h (DEFAULT_PCC_STRUCT_RETURN): Do not override
- existing setting.
-
-2002-01-25 Geoffrey Keating <geoffk@redhat.com>
-
- * dbxout.c (dbxout_init): Use assemble_name rather than just
- stripping off the first character.
- (dbxout_source_file): Likewise.
-
-2002-01-25 DJ Delorie <dj@redhat.com>
-
- * config/sparc/sparc.c (sparc_emit_set_symbolic_const64): Compare
- using rtx_equal_p, not by comparing pointers.
-
-2002-01-25 Steve Ellcey <sje@cup.hp.com>
-
- * emit-rtl.c (gen_rtx_REG): Always return the same rtx
- for PIC_OFFSET_TABLE_REGNUM.
- (init_emit_once): Use gen_raw_REG to initialize pic_offset_table_rtx.
-
-2002-01-25 David O'Brien <obrien@FreeBSD.org>
-
- * config.gcc (x86_64-*-freebsd*): New target.
- (x86_64-*-netbsd*,x86_64-*-linux*): Use ${tm_file} rather than its
- value.
- (i[34567]86-*-freebsd*): Don't include svr4.h.
- * config/i386/freebsd64.h: New file.
-
-2002-01-25 Douglas B Rupp <rupp@gnat.com>
-
- * config/alpha/x-vms (version): Make static.
-
- * config/alpha/vms.h (MD_FALLBACK_FRAME_STATE_FOR): Fix error
- in previous checkin.
-
- * Makefile.in (install-headers-cp): New target.
- * config.gcc (alpha-dec-*vms*): Install headers with
- install-headers-cp
-
-Fri Jan 25 22:42:49 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * unroll.c (unroll_loop): Lower final_value to nonmemory operand;
- avoid it's copies.
-
-Fri Jan 25 08:26:19 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * builtins.c (expand_builtin_strncpy): Use integer_zerop instead
- of compare_tree_int.
- (expand_builtin_strncat): Likewise.
- * c-decl.c (finish_struct): Use tree_low_cst.
- * tree.h (compare_tree_int): Arg is unsigned HOST_WIDE_INT.
- * tree.c (compare_tree_int): Likewise.
-
-2002-01-25 Ulrich Weigand <uweigand@de.ibm.com>
-
- * reload1.c (eliminate_regs_in_insn): Recognize frame pointer
- adjustments even if they are implemented by more than two insns.
-
-Fri Jan 25 20:43:56 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * df.c (df_ref_create, df_ref_record_1, df_ref_record): Kill BB arg.
- * df.h (struct ref): Kill B.
- (DF_REF_BB, DF_REF_BBNO): Use BLOCK_FOR_INSN.
-
- * basic-block.h (PROP_EQUAL_NOTES): New flag.
- * flow.c (propagate_one_insn): Use it.
- (mark_used_regs): Handle NIL.
-
-2002-01-25 Geoffrey Keating <geoffk@redhat.com>
-
- * config/stormy16/stormy16.md (tablejump_pcrel): Use a MEM
- to help folding.
-
-2002-01-25 David Edelsohn <edelsohn@gnu.org>
-
- * rs6000.md (prefetch): Make address V4SI mode so that the address
- is restricted to legitimate form for instruction.
-
-2002-01-25 Bob Wilson <bob.wilson@acm.org>
-
- * doc/install.texi (xtensa-*-elf): New target.
- (xtensa-*-linux*): New target.
- * doc/contrib.texi: Add myself.
-
-2002-01-25 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c (arm_hard_regno_mode_ok): Allow any general
- purpose register to hold an SImode (or smaller) value.
-
-2002-01-25 Jakub Jelinek <jakub@redhat.com>
-
- * unwind-dw2-fde-glibc.c: If inhibit_libc, use __register_frame*
- registry only.
- * crtstuff.c: Likewise.
-
-2002-01-25 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md (negation patterns): Tighten
- predicates to register_operand.
-
-2002-01-24 Aldy Hernandez <aldyh@redhat.com>
-
- * loop.c (emit_prefetch_instructions): Use the prefetch insn's
- mode, not Pmode.
-
- * builtins.c (expand_builtin_prefetch): Same.
-
-2002-01-24 Alexandre Oliva <aoliva@redhat.com>
-
- * config/sh/sh.md (sym_label2reg): Make sure all CONSTs have
- modes.
-
-2002-01-24 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (print_operand): Remove support for
- operand character 'A'.
- * config/h8300/h8300.md (three anonymous patterns): Replace
- operand character 'A' with either 'T' or 'S'.
-
-2002-01-24 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (print_operand): Remove support for
- operand character 'U'.
-
-2002-01-24 Andris Pavenis <pavenis@latnet.lv>
-
- * config/i386/t-djgpp: Use NATIVE_SYSTEM_HEADER_DIR.
-
-2002-01-24 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c (arm_hard_regno_mode_ok): Allow SImode
- values to be assigned to the stack pointer.
-
-2002-01-14 Hartmut Penner <hpenner@de.ibm.com>
-
- * emit_rtl.c (gen_lowpart_common): Conversion from const_int
- to const_double needs to be done right for big-endian systems.
-
-2002-01-24 Jason Merrill <jason@redhat.com>
-
- PR c++/2432
- * config/sparc/sparc.md (call-jump peepholes): Pass the right insn
- to can_throw_internal.
-
-2002-01-23 Richard Henderson <rth@redhat.com>
-
- * fold-const.c (fold): Change UINT_MAX test to check vs precision
- rather than TYPE_MAX_VALUE. Fix indentation and a bogus negation.
-
-2002-01-24 Alexandre Oliva <aoliva@redhat.com>
-
- * config/sh/sh.md (symGOT_load, sym2GOT, sym2GOTOFF): New expands.
- (symGOT2reg): Use them, then set as GOT value as unchanging.
- (symGOTOFF2reg): Set REG_EQUAL note. Use a different pseudo
- as a temporary, if possible.
- (symPLT_label2reg): Enclose (pc) in UNSPEC_PIC. Emit
- sym@PLT-(.LPCS#+2-.) instead of sym@PLT+.-(.LPCS#+2).
-
-2002-01-23 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Fix xorqi and xorqi so that they will
- accept to accept 0x80 as operands[2].
-
-2002-01-24 Alexandre Oliva <aoliva@redhat.com>
-
- * config/sparc/sparc.md (fix_trunctfdi2): Correct typo in mode.
-
-2002-01-23 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (call_value_osf_1_er peepholes): Fix typo.
-
-2002-01-23 Aldy Hernandez <aldyh@redhat.com>
-
- * c-parse.in (parmlist_or_identifiers): Add maybe_attribute.
- (parmlist_or_identifiers_1): Verify that only a parmlist follows
- an attribute.
-
-2002-01-23 Richard Henderson <rth@redhat.com>
-
- * expr.c (move_by_pieces_1): Extend size before negation.
-
- * config/m68k/t-m68kbare (MULTILIB_OPTIONS): Add 68040 and 68060.
- (MULTILIB_MATCHES): Remove 68040 and 68060 aliases.
- (MULTILIB_EXCEPTIONS): Ignore 68881 and soft-float for 68040 and 68060.
- * config/m68k/t-m68kelf: Likewise.
-
-2002-01-23 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/elf.h: New file.
- * config/xtensa/lib1funcs.asm: New file.
- * config/xtensa/lib2funcs.S: New file.
- * config/xtensa/linux.h: New file.
- * config/xtensa/t-xtensa: New file.
- * config/xtensa/xtensa-config.h: New file.
- * config/xtensa/xtensa-protos.h: New file.
- * config/xtensa/xtensa.c: New file.
- * config/xtensa/xtensa.h: New file.
- * config/xtensa/xtensa.md: New file.
- * config.gcc (xtensa-*-elf*): New target.
- (xtensa-*-linux*): New target.
- * cse.c (canon_hash): Compare rtx pointers instead of register
- numbers. This is required for the Xtensa port.
- * integrate.c (copy_insn_list): Handle case where the static
- chain is in memory and the memory address has to be copied to
- a register.
- * doc/invoke.texi (Option Summary): Add Xtensa options.
- (Xtensa Options): New node.
- * doc/md.texi (Machine Constraints): Add Xtensa machine constraints.
-
-2002-01-23 Zack Weinberg <zack@codesourcery.com>
-
- * diagnostic.c (internal_error): Do ICE suppression only
- when ENABLE_CHECKING is not defined.
-
- * c-typeck.c (require_complete_type): Return error_mark_node
- if type is error_mark_node.
-
-2002-01-23 Janis Johnson <janis187@us.ibm.com>
-
- * toplev.c (process_options): Disable -fprefetch-loop-arrays with
- -Os and issue a warning.
-
-2002-01-23 Zack Weinberg <zack@codesourcery.com>
-
- * doc/fragments.texi, doc/hostconfig.texi: Update to reflect
- current (lack of) need for host configuration by hand.
-
- * doc/gccint.texi, doc/rtl.texi, doc/tm.texi: Adjust cross
- references. Documentation of some target macros moved from
- hostconfig.texi to tm.texi.
-
-2002-01-23 Will Cohen <wcohen@redhat.com>
-
- * config/arm/arm.h (THUMB_FUNCTION_PROFILER): Define if not currently
- defined.
-
-2002-01-23 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md (*andorhi3): Accept 0x8000 as an
- operand[3].
-
-2002-01-23 Jason Merrill <jason@redhat.com>
-
- * tree.c (build1): Don't set TREE_READONLY on INDIRECT_REF.
-
- * function.c (assign_parms): Don't put args of inline functions
- into registers when not optimizing.
-
-2002-01-23 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.md (UNSPEC_PROLOGUE_USE): New unspec constant.
- (prologue_use): New pattern.
- * config/arm/arm.c (expand_prologue): Use gen_prologue_use in
- preference to gen_rtx_USE.
- (thumb_expand_prologue): Use gen_prologue_use in preference to
- gen_rtx_USE.
- (thumb_expand_epilogue): Use gen_prologue_use in preference to
- gen_rtx_USE.
-
-2002-01-23 Hans-Peter Nilsson <hp@bitrange.com>
-
- * loop.c [!HAVE_prefetch] (CODE_FOR_prefetch): Define to 0.
-
-2002-01-23 Neil Booth <neil@daikokuya.demon.co.uk>
-
- PR c/3504
- * doc/extend.texi: Correct documentation of __alignof__.
-
-2002-01-22 Zack Weinberg <zack@codesourcery.com>
-
- * params.h: Rename arguments of DEFPARAM so that it will be
- recognized as a translation keyword.
-
-2002-01-22 Aldy Hernandez <aldyh@redhat.com>
-
- * extend.texi: Document altivec functions.
- Fix N-bit adjectives in X86 builtin documentation.
-
-2002-01-22 Alexandre Oliva <aoliva@redhat.com>
-
- * reload.c (reg_overlap_mentioned_for_reload_p): Handle PLUS and
- auto_inc_dec values.
-
-2002-01-22 Richard Earnshaw <rearnsha@arm.com>
-
- * config/netbsd-aout.h (SWITCH_TAKES_ARG): Remove bogus white space
- after backslash.
- (ASM_DECLARE_OBJECT_NAME): Add missing backslash before final line.
-
-2002-01-22 Alexandre Oliva <aoliva@redhat.com>
-
- * config/i386/freebsd-aout.h (ASM_QUAD): Undefine.
-
-2002-01-22 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (split_small_symbolic_mem_operand): Use
- copy_insn not copy_rtx.
-
-2002-01-23 Alan Modra <amodra@bigpond.net.au>
-
- * combine.c (simplify_and_const_int): Don't trunc_int_for_mode
- "nonzero" as that might add "1" bits. Ensure "constop" is
- properly sign extened.
- (force_to_mode): Tweak for sign extended constop.
-
-2002-01-22 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (some_small_symbolic_mem_operand) Use
- for_each_rtx instead of assuming we're already looking at the MEM.
- (split_small_symbolic_mem_operand): Likewise.
- * config/alpha/alpha.h (PREDICATE_CODES): Update.
- * config/alpha/alpha.md (small symbolic memory splitters): Update.
-
-2002-01-22 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (divmodsi_internal_er): Generate lituse
- sequence number for the literal.
- (divmoddi_internal_er): Likewise.
-
-2002-01-22 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- PR java/4972
- * aclocal.m4 (AM_ICONV): Put linking flags for libiconv
- in LIBICONV variable.
- * configure: Regenerated.
-
-2002-01-22 Krister Walfridsson <cato@df.lth.se>
-
- * dependence.c (build_def_use): Remove array_idx.
-
- * dwarfout.c (last_filename): Remove.
- (output_compile_unit_die): Remove last_filename.
-
-2002-01-22 Roger Sayle <roger@eyesopen.com>
- Richard Henderson <rth@redhat.com>
-
- PR opt/3640
- * fold-const.c (fold): Optimize unsigned comparisons against
- UINT_MAX (and similar unsigned constants).
-
-2002-01-22 Janis Johnson <janis187@us.ibm.com>
-
- * Makefile.in (loop.o): Depend on OPTABS_H.
- * loop.c (emit_prefetch_instructions): Check the prefetch operand
- against the predicate.
-
- PR target/5379
- * config/i386/i386.md (prefetch_sse): Specify "p" as a constraint
- for the address operand.
-
-2002-01-22 Richard Henderson <rth@redhat.com>
-
- * config/alpha/freebsd.h (FUNCTION_PROFILER): Remove.
-
-2002-01-22 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- PR other/5450
- * config/i386/sysv4.h (CPP_SPEC): Define, and add CPU
- preprocessor flags.
-
-2002-01-22 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config.gcc (x86_64-*-netbsd*): New target.
- * config/i386/netbsd64.h: New file.
-
-2002-01-22 Aldy Hernandez <aldyh@redhat.com>
-
- * regrename.c (kill_value): Fix typo.
-
-2002-01-22 Aldy Hernandez <aldyh@redhat.com>
-
- * doc/tm.texi: Remove STARTING_FRAME_PHASE.
-
- * config/rs6000/rs6000.h: Same.
-
- * function.c (instantiate_virtual_regs): Remove
- STARTING_FRAME_PHASE.
- (assign_stack_local_1): Same.
- Calculate frame phase.
-
-2002-01-22 Nick Clifton <nickc@redhat.com>
-
- * config/arm/arm.h (CONDITIONAL_REGISTER_USAGE): Move 'regno'
- variable declaration to outer scope in order to simplify
- future extensions.
- (HARD_REGNO_MODE_OK): Replace macro body with a with a call to
- arm_hard_regno_mode_ok.
- * config/arm/arm-protos.h: Add a prototype for
- arm_hard_regno_mode_ok.
- * config/arm/arm.c (soft_df_operand): Remove now redundant
- check for DImode values using IP_REGNUM.
- (nonimmediate_soft_df_operand): Remove now redundant check for
- DImode values using IP_REGNUM.
- (arm_hard_regno_mode_ok): New function. New check: make sure
- that DImode values are not stored in IP_REGNUM.
-
- * config/arm/arm.c (arm_expand_prologue): Replace REG_MAYBE_DEAD
- note with a USE.
- (thumb_expand_prologue): Replace REG_MAYBE_DEAD note with a USE.
-
-2002-01-22 Jason Merrill <jason@redhat.com>
-
- * c-semantics.c (genrtl_compound_stmt): Only check nesting
- consistency if this COMPOUND_STMT is scoped.
-
-2002-01-22 Kazu Hirata <kazu@hxi.com>
-
- * predict.c: Fix formatting.
- * print-tree.c: Likewise.
- * protoize.c: Likewise.
- * real.h: Likewise.
- * rtl.h: Likewise.
- * sbitmap.h: Likewise.
- * scan.c: Likewise.
- * sched-deps.c: Likewise.
- * sched-vis.c: Likewise.
- * sdbout.c: Likewise.
- * sibcall.c: Likewise.
- * ssa.c: Likewise.
- * ssa-ccp.c: Likewise.
- * ssa-dce.c: Likewise.
- * stmt.c: Likewise.
- * stor-layout.c: Likewise.
- * system.h: Likewise.
-
-Tue Jan 22 06:26:33 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * tree.c (int_fits_type_p): If bounds of a subtype are variable, see
- if fits in bounds of base type.
-
- * dwarf2out.c (equate_decl_number_to_die): Add "int" to decls.
- (loc_descriptor_from_tree, case CALL_EXPR, case ADDR_EXPR): New.
- (add_bound_info, default): If can't find a context, make a
- SAVE_EXPR.
- (dwarf2out_finish): Check for SAVE_EXPR in node->created_for.
-
-2002-01-22 Hans-Peter Nilsson <hp@axis.com>
-
- * c-typeck.c (parser_build_binary_op): If result from
- build_binary_op is ERROR_MARK just return error_mark_node without
- further processing.
-
-2002-01-21 Jason Thorpe <thorpej@wasabisystems.com>
-
- * config/netbsd.h (TARGET_HAS_F_SETLKW): define.
- Split a.out-specific bits into...
- * config/netbsd-aout.h: ...this.
- * config/netbsd-elf.h: New file.
- * config/alpha/netbsd-elf.h: Remove.
- * config/alpha/netbsd.h: Rewrite for a NetBSD/alpha ELF target.
- * config/i386/netbsd-elf.h (LIB_SPEC): Remove.
- (STARTFILE_SPEC): Remove redundant definition.
- (ENDFILE_SPEC): Likewise.
- (LINK_SPEC): Likewise.
- (CPP_SPEC): Likewise.
- (ASM_SPEC): Likewise.
- (LIB_SPEC): Likewise.
- (SWITCH_TAKES_ARG): Likewise.
- (TARGET_MEM_FUNCTIONS): Likewise.
- (CPP_PREDEFINES): Redefine.
- (ASM_FINAL_SPEC): Remove redefinition.
- (ASM_COMMENT_START): Redefine.
- (FUNCTION_PROFILER): Define.
- (TARGET_VERSION): Redefine.
- Comment and formatting cleanup.
- * config/i386/netbsd.h: Include <netbsd-aout.h>.
- * config/m68k/netbsd.h: Include <netbsd-aout.h>.
- * config/mips/netbsd.h: Rewrite for NetBSD/mips ELF target,
- big- or little-endian.
- * config/ns32k/netbsd.h: Include <netbsd-aout.h>.
- * config.gcc (*-*-netbsd*): Add definitions common to all
- NetBSD configs.
- (alpha*-*-netbsd*): Remove redundant xm_defines, gas, and
- gnu_ld definitions. Add netbsd-elf.h to and remove
- alpha/netbsd-elf.h from tm_file. Remove alpha/t-crtfm from
- tmake_file, and don't lose previous tmake_file contents.
- (arm*-*-netbsd*): Add netbsd-aout.h to tm_file.
- (i[34567]86-*-netbsdelf*): Remove redundant xm_defines, gas, and
- gnu_ld definitions. Add netbsd-elf.h to tm_file.
- (mips-dec-netbsd*): Remove as alias for mipsel-*-netbsd*.
- (mipsel-*-netbsd*): Rename this to...
- (mips*-*-netbsd*): ...this. Add elfos.h to tm_file. Add
- mips/little.h to tm_file for mips*el-*.
- (powerpc-*-netbsd*): Remove redundant xm_defines definition.
- (sparc-*-netbsd*): Add netbsd-aout.h to tm_file.
- (vax-*-netbsd*): Add netbsd-aout.h to tm_file.
-
-2002-01-21 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa-protos.h (reg_before_reload_operand): New function prototype.
- * pa.c (reg_before_reload_operand): New function implementation.
- * pa.md (decrement_and_branch_until_zero, movb): Use it. Change "!*m"
- contraints to "*m".
-
-2002-01-21 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * combine.c (simplify_and_const_int): Properly sign-extend CONSTOP.
-
-2002-01-21 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa64-hpux.h (MD_EXEC_PREFIX): Set to "/usr/ccs/bin".
- (MD_STARTFILE_PREFIX): Set to "/usr/ccs/lib/pa20_64/".
- (MD_STARTFILE_PREFIX_1): Set to "/opt/langtools/lib/pa20_64/".
- (EH_FRAME_IN_DATA_SECTION): Define and update comment on init sections.
- (ENDFILE_SPEC): Undefine.
- (STARTFILE_SPEC): Redefine for PA.
-
-2002-01-21 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * config/rs6000/t-ppccomm (CRTSTUFF_T_CFLAGS_S): Re-add -fPIC.
-
-2002-01-21 Daniel Jacobowitz <drow@mvista.com>
-
- * config.gcc: Add entries to supported PowerPC --with-cpu
- types.
-
-2002-01-21 Jakub Jelinek <jakub@redhat.com>
-
- * config/i386/i386.c (ix86_function_arg_regno_p): Never return
- true for 64-bit mode only SSE registers in 32-bit mode.
-
-2002-01-21 Kazu Hirata <kazu@hxi.com>
-
- * unwind-dw2.c: Fix formatting.
- * unwind-dw2-fde.c: Likewise.
- * unwind-dw2-fde.h: Likewise.
- * unwind-pe.h: Likewise.
- * varasm.c: Likewise.
- * varray.h: Likewise.
-
-2002-01-21 Hans-Peter Nilsson <hp@bitrange.com>
-
- Remove workaround for register stack overwrite bug in mmix.
- * config/mmix/mmix.c (mmix_target_asm_function_prologue): Remove
- support for TARGET_REG_STACK_FILL_BUG.
- * config/mmix/mmix.h: Remove member has_call_without_parameters.
- (TARGET_MASK_REG_STACK_FILL_BUG, TARGET_REG_STACK_FILL_BUG):
- Delete.
- (TARGET_DEFAULT): Remove TARGET_MASK_REG_STACK_FILL_BUG.
- (TARGET_SWITCHES): Remove -mreg-stack-fill-bug-workaround and
- -mno-reg-stack-fill-bug-workaround.
- * config/mmix/mmix.md ("call", "call_value"): Don't set struct
- machine member has_call_without_parameters.
- * doc/invoke.texi (Option Summary) <MMIX Options>: Remove
- -mreg-stack-fill-bug-workaround and
- -mno-reg-stack-fill-bug-workaround.
- (MMIX Options): Ditto.
-
-2002-01-21 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (function_arg): Replace 0 with NULL_RTX
- as appropriate.
- Remove redundant code.
-
-2002-01-21 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * config/alpha/alpha.h, config/arc/arc.h, config/avr/avr.h,
- config/c4x/c4x.h, config/d30v/d30v.h, config/dsp16xx/dsp16xx.h,
- config/fr30/fr30.h, config/ia64/ia64.h, config/m68hc11/m68hc11.h,
- config/mips/mips.h, config/rs6000/rs6000.h, config/sparc/sparc.h,
- config/stormy16/stormy16.h, config/v850/v850.h: Remove commented
- out target macro definitions and non-target-specific comments
- mostly taken from old versions of the manual.
-
-2002-01-20 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.h: Fix comment formatting.
- * config/ia64/aix.h: Likewise.
- * config/ia64/ia64-protos.h: Likewise.
- * config/ia64/ia64.c: Likewise.
- * config/ia64/ia64.h: Likewise.
- * config/ia64/ia64intrin.h: Likewise.
- * config/ia64/linux.h: Likewise.
- * config/ia64/unwind-aix.c: Likewise.
- * config/ia64/unwind-ia64.c: Likewise.
-
-2002-01-20 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c: Revise comments about shift code.
-
-2002-01-20 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (function_arg): Update a comment.
-
-2002-01-20 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Update the comments at the beginning
- of the file.
-
-2002-01-20 Kazu Hirata <kazu@hxi.com>
-
- * config/i370/i370.c: Fix comment formatting.
- * config/i370/i370.h: Likewise.
- * config/i370/i370.md: Likewise.
- * config/i370/linux.h: Likewise.
-
-Sun Jan 20 18:40:14 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * reg-stack.c (subst_stack_regs): Properly check for deleted insn.
-
- * dwarf2out.c (loc_descriptor_from_tree): Add TRUTH_*_EXPR cases.
- (gen_struct_or_union_type_die): Don't SIGSEGV if no TYPE_STUB_DECL
- in incomplete case.
-
-2002-01-20 Graham Stott <grahams@redhat.com>
-
- * cfgloop.c (flow_loop_preheader_scan): Fix typo.
-
-2002-01-19 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * config.gcc (hppa*64*-*-hpux11*): Fix tmake_file.
-
-2002-01-19 Tom Rix <trix@redhat.com>
-
- * config/rs6000/rs6000.md: Fix DF split for 64 bit hosts.
-
-2002-01-18 Aldy Hernandez <aldyh@redhat.com>
-
- * doc/tm.texi (STARTING_FRAME_PHASE): Document.
-
- * function.c (assign_stack_local_1): Adjust x_frame_offset with
- STARTING_FRAME_PHASE.
- (STARTING_FRAME_PHASE): New.
- (instantiate_virtual_regs): Check saneness of
- STARTING_FRAME_PHASE.
-
- * config/rs6000/rs6000.h (STARTING_FRAME_PHASE): New.
-
-2002-01-19 Alexandre Oliva <aoliva@redhat.com>
-
- * config/sh/sh.md (movdf_i4 split): Fix alter_subreg calls.
-
-2002-01-18 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- * doc/install.texi (hppa*-hp-hpux11): Clarify that GCC 2.95.x cannot
- be used for bootstrapping GCC 3.0.
-
-2002-01-18 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Fix an insn length.
-
-2002-01-18 Kazu Hirata <kazu@hxi.com>
-
- * bitmap.h: Fix comment formatting.
- * combine.c: Likewise.
- * cppfiles.c: Likewise.
- * c-pragma.h: Likewise.
- * c-typeck.c: Likewise.
- * df.c: Likewise.
- * dwarf2out.c: Likewise.
- * function.c: Likewise.
- * gcc.c: Likewise.
- * genattrtab.c: Likewise.
- * gthr-win32.h: Likewise.
- * haifa-sched.c: Likewise.
- * predict.c: Likewise.
- * rtlanal.c: Likewise.
- * rtl.h: Likewise.
- * unwind-dw2-fde.h: Likewise.
- * unwind-pe.h: Likewise.
- * vmsdbgout.c: Likewise.
-
-Thu Jan 17 15:28:26 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * attribs.c (decl_attributes): Clear ATTR_FLAG_TYPE_IN_PLACE
- if type_required and passed decl.
-
-2002-01-17 Aldy Hernandez <aldyh@redhat.com>
-
- * config.gcc (cpu_type): Include altivec.h in powerpc
- extra_headers.
- Same for darwin.
-
- * config/rs6000/altivec.h: New.
-
-2002-01-17 David Edelsohn <edelsohn@gnu.org>
-
- * doc/install.texi (*-ibm-aix*): Update assembler and exception
- handling information.
- * doc/trouble.texi (Interoperation): Add libstdc++ information
- for AIX.
- (Misunderstandings): Add template instantiation and static template
- member information for AIX.
-
-2002-01-17 Jason Merrill <jason@redhat.com>
-
- * dbxout.c (dbxout_type): Support const and volatile.
-
- * except.c (add_partial_entry): Remove backwards compatibility code.
- (end_protect_partials): Likewise.
-
-2002-01-17 Jakub Jelinek <jakub@redhat.com>
-
- * config/ia64/ia64.md (prologue_use): New.
- * config/ia64/ia64.c (ia64_expand_prologue): Use
- gen_prologue_use instead of gen_rtx_USE.
- (group_barrier_needed_p): Handle CODE_FOR_prologue_use the same way
- as CODE_FOR_pred_rel_mutex.
- (ia64_sched_reorder2): Likewise.
-
-2002-01-16 Eric Christopher <echristo@redhat.com>
-
- * config/mips/r3900.h: Reformat.
- (SUBTARGET_CPP_SIZE_SPEC): Remove.
- * config/mips/isa3264.h (SUBTARGET_CPP_SIZE_SPEC): Ditto.
- * config/mips/mips.h (ABI_GAS_ASM_SPEC): Default to "".
- (SUBTARGET_CPP_SIZE_SPEC): Rewrite.
- * config/mips/t-elf: Remove mips3 multilib.
-
-2002-01-16 H.J. Lu <hjl@gnu.org>
-
- * config/mips/linux.h: Include "mips/abi64.h".
-
-2002-01-16 H.J. Lu <hjl@gnu.org>
-
- * config/mips/t-linux: New.
-
- * config.gcc: Add mips/t-linux to tmake_file for mips*-*-linux*.
-
- * config/mips/linux.h: Don't include "gofast.h".
- (INIT_SUBTARGET_OPTABS): Removed.
-
-2002-01-16 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Replace emit_a_shift with
- output_a_shift.
- * config/h8300/h8300.c: Likewise.
- * config/h8300/h8300.md: Likewise.
-
-2002-01-16 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md (pushqi1_h8300): Use a tab instead of
- spaces after an opcode name.
- (pushqi1_h8300hs): Likewise.
- (pushhi1_h8300hs): Likewise.
-
-2002-01-16 Kazu Hirata <kazu@hxi.com>
-
- * doc/extend.texi: Replace "option" with "attribute"
- appropriately.
-
-2002-01-16 Jakub Jelinek <jakub@redhat.com>
-
- * config/alpha/alpha.c (some_small_symbolic_mem_operand): Look into
- (and:DI () (const_int -8)).
- (split_small_symbolic_mem_operand): Split
- (mem (and:DI () (const_int -8)).
-
-2002-01-16 Jakub Jelinek <jakub@redhat.com>
-
- PR target/5309:
- * config/sparc/sparc.c (ultrasparc_adjust_cost): Handle TYPE_IDIV the
- same way as TYPE_IMUL.
- (ultrasparc_sched_reorder): Likewise.
- * config/sparc/sparc.md (type): Add comment to update
- ultrasparc_sched_reorder when making changes.
-
-2002-01-16 Kazu Hirata <kazu@hxi.com>
-
- * doc/invoke.texi: Change the dump file name of block
- reordering pass from 28.bbro to 29.bbro.
- Mention -dk option.
-
-Wed Jan 16 17:54:22 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (minsf splitter): Fix pasto.
-
-2002-01-16 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c (arm_expand_prologue): Add REG_MAYBE_DEAD note
- to frame pointer initialisation instruction.
- (thumb_expand_prologue): Add REG_MAYBE_DEAD note to frame pointer
- initialisation instruction.
- (soft_df_operand): Do not accept the IP register.
- (nonimmediate_soft_df_operand): Do not accept the IP register.
-
-2002-01-16 Jakub Jelinek <jakub@redhat.com>
-
- PR target/5357:
- * config/sparc/sparc.c (sparc_override_options): Avoid MASK_V9 and
- MASK_V8 being both set.
-
-2002-01-16 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.c (s390_emit_prologue): Do not emit USE
- insn for GOT register; add REG_MAYBE_DEAD notes instead.
- config/s390/s390.md (call, call_value): Add GOT register to
- CALL_INSN_FUNCTION_USAGE where needed.
- (call_exp, call_value_exp): New.
-
-2002-01-16 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c: General formatting tidy up.
-
-2002-01-16 Graham Stott <grahams@redhat.com>
-
- * calls.c (try_to_integrate): Use "(size_t)" intermediate
- cast and when casting an integer literal to "rtx" pointer.
- (expand_call): Likewise.
- * flow.c (try_pre_increment): Likewise.
- (find_use_as_address): Likewise.
- * integrate.c (expand_iline_function): Likewise.
- * regmove.c (try_auto_increment): Likewise.
-
-2002-01-16 Graham Stott <grahams@redhat.com>
-
- * sched-rgn.c (passed): Use sbitmap_free.
- (header): Likewise.
- (inner): Likewise.
- (in_queue): Likewise.
- (in_stack): Likewise.
-
-2002-01-15 Eric Christopher <echristo@redhat.com>
-
- * flow.c (propagate_one_insn): Change to use fatal_insn.
-
-2002-01-15 Kazu Hirata <kazu@hxi.com>
-
- * expmed.c (extract_fixed_bit_field): Remove unused code.
- * system.h: Poison SLOW_ZERO_EXTEND.
- * doc/tm.texi: Remove.
- * config/1750a/1750a.h (SLOW_ZERO_EXTEND): Remove.
- * config/arm/arm.h: Likewise.
- * config/avr/avr.h: Likewise.
- * config/clipper/clipper.h: Likewise.
- * config/convex/convex.h: Likewise.
- * config/d30v/d30v.h: Likewise.
- * config/dsp16xx/dsp16xx.h: Likewise.
- * config/elxsi/elxsi.h: Likewise.
- * config/fr30/fr30.h: Likewise.
- * config/h8300/h8300.h: Likewise.
- * config/i370/i370.h: Likewise.
- * config/i386/i386.h: Likewise.
- * config/m68k/m68k.h: Likewise.
- * config/mips/mips.h: Likewise.
- * config/ns32k/ns32k.h: Likewise.
- * config/pdp11/pdp11.h: Likewise.
- * config/pj/pj.h: Likewise.
- * config/s390/s390.h: Likewise.
- * config/sh/sh.h: Likewise.
- * config/stormy16/stormy16.h: Likewise.
- * config/v850/v850.h: Likewise.
- * config/vax/vax.h: Likewise.
- * config/we32k/we32k.h: Likewise.
-
-2002-01-15 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.md (altivec_stvx): Add parallels to stvx.
- (altivec_lvsl): Change constraint to b.
- (altivec_lvsr): Same.
- (altivec_lvebx): Same.
- (altivec_lvehx): Same.
- (altivec_lvewx): Same.
- (altivec_lvxl): Same.
- (altivec_lvx): Same.
- (altivec_stvx): Add parallel.
- (altivec_stvxl): Same.
- (altivec_stvehx): Same.
- (altivec_stvebx): Same.
- (altivec_stvebx): Same.
-
-2002-01-15 Aldy Hernandez <aldyh@redhat.com>
-
- * config.gcc: Change altivec.h to altivec-defs.h.
-
- * config/rs6000/altivec.h: Delete.
-
- * config/rs6000/altivec-defs.h: Add.
-
-2002-01-15 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * vax.c (vax_rtx_cost): Return MAX_COST for unsupported MULT, UDIV
- and UMOD modes.
-
- * vax.h (INDEX_TERM_P): Restrict indexing to modes which have a size
- less than or equal to eight bytes.
-
- * vax.md (andsi3): Remove constraints and change SET destination
- operand type to nonimmediate_operand.
- (andhi3, andqi3): Likewise. Don't clear high order bits of operand 1
- when it is a CONST_INT.
-
-2002-01-15 Jason Merrill <jason@redhat.com>
-
- * c-common.def (FILE_STMT): New code.
- * c-common.c (statement_code_p): It's a statement.
- * c-common.h (stmt_tree_s): Add x_last_filename.
- (FILE_STMT_FILENAME_NODE, FILE_STMT_FILENAME): New macros.
- (last_expr_filename): New macro.
- * c-semantics.c (begin_stmt_tree): Initialize it.
- (add_stmt): If the filename changed, also insert a
- FILE_STMT.
- (expand_stmt): Handle seeing one.
-
-2002-01-15 Eric Christopher <echristo@redhat.com>
-
- * flow.c (propagate_one_insn): Add error message and print out
- insn for debugging.
-
-2002-01-15 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * system.h (ASM_IDENTIFY_GCC, STDC_VALUE, TRAMPOLINE_ALIGN,
- ASM_IDENTIFY_GCC_AFTER_SOURCE): Poison.
- * config/pdp11/pdp11.h (TRAMPOLINE_ALIGN): Rename to
- TRAMPOLINE_ALIGNMENT.
- * config/arm/arm.h, config/mcore/mcore.h: Likewise. Change value
- to be in bits.
- * config/i386/cygwin.h (PCC_BITFIELDS_TYPE_MATTERS): Rename to
- PCC_BITFIELD_TYPE_MATTERS.
- * config/interix.h (STDC_VALUE): Remove. Use
- STDC_0_IN_SYSTEM_HEADERS.
- * config/darwin.h (ASM_IDENTIFY_GCC), config/dsp16xx/dsp16xx.h
- (ASM_IDENTIFY_GCC), config/stormy16/stormy16.h (ASM_IDENTIFY_GCC,
- ASM_IDENTIFY_GCC_AFTER_SOURCE): Remove.
-
-2002-01-15 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- * doc/install.texi (hppa*-hp-hpux11): --enable-threads does
- not work on this platform currently.
-
-2002-01-15 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * c-typeck.c (build_unary_op): Don't wrap msgid argument of
- readonly_warning in _().
-
-2002-01-15 Douglas B Rupp <rupp@gnat.com>
-
- * gcc.c (delete_if_ordinary): Backout previous change.
-
-2002-01-15 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (print_operand): Remove support for
- unused operand characters.
-
- * read-rtl.c: Fix formatting.
- * real.c: Likewise.
- * recog.c: Likewise.
- * regclass.c: Likewise.
- * regmove.c: Likewise.
- * reg-stack.c: Likewise.
- * reload1.c: Likewise.
- * rtlanal.c: Likewise.
-
-2002-01-15 Kazu Hirata <kazu@hxi.com>
-
- * config/i386/i386.c: Fix formatting.
-
-2002-01-15 Jakub Jelinek <jakub@redhat.com>
-
- * c-typeck.c (process_init_element): Don't save_expr
- COMPOUND_LITERAL_EXPR if just its initializer will be used.
-
-2002-01-15 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.c (rs6000_output_function_epilogue): Do not
- emit optional traceback table if optimize_size or TARGET_ELF.
- * config/rs6000/rs6000.md (prefetch): New.
-
-2002-01-15 Andreas Jaeger <aj@suse.de>
-
- * config.gcc (x86_64-*-*): Install mmintrin.h and xmmintrin.h.
-
-2002-01-15 Kazu Hirata <kazu@hxi.com>
-
- * mips-tfile.c: Fix formatting.
-
-Tue Jan 15 00:56:11 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * unroll.c (final_reg_note_copy): Fix previous commit.
-
-2002-01-14 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300-protos.h: Remove the prototype for
- eq_operator.
- * config/h8300/h8300.c (eq_operator): Remove.
-
-2002-01-14 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.md (prefetch): Tidy.
- (prefetch_3dnow): Fix locality operand.
-
-2002-01-14 Richard Henderson <rth@redhat.com>
-
- * config/mips/mips.h (HI_AND_FP_REGS): New register class.
- (CLASS_CANNOT_CHANGE_MODE): Disallow HI in little-endian mode.
-
-2002-01-14 Hans-Peter Nilsson <hp@bitrange.com>
-
- * reload1.c (reload_combine): Pass reg_sum replacement through
- copy_rtx in loop performing multiple changes.
-
-2002-01-14 Jakub Jelinek <jakub@redhat.com>
-
- * except.c (remove_unreachable_regions): New.
- (free_eh_status): Clear exception_handler_labels.
- (convert_from_eh_region_ranges): Call remove_unreachable_regions.
- (find_exception_handler_labels): Don't add the same label more than
- once.
- (remove_exception_handler_label): Don't die if
- find_exception_handler_labels hasn't been called for the current
- function yet.
-
-Mon Jan 14 21:26:13 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * toplev.c (rest_of_compilation): Rebuild jump labels after
- gcse.
-
-2002-01-14 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/extend.texi: Move documentation of X86 built-in functions
- here.
- * doc/invoke.texi: From here.
- * doc/sourcebuild.texi: Document location of documentation for
- machine built-in functions.
-
-2002-01-13 Christopher Faylor <cgf@redhat.com>
-
- * cppfiles.c (TEST_THRESHOLD): New macro.
- (SHOULD_MMAP): Ditto.
- (read_include_file): Use SHOULD_MMAP macro to decide when mmap should
- be used.
-
-Mon Jan 14 20:23:34 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * unroll.c (final_reg_note_copy): Properly handle
- REG_LABEL
- (unroll_loops): Fix LOOP_CONDITION heuristics.
-
-2002-01-14 Geoffrey Keating <geoffk@redhat.com>
-
- * doc/invoke.texi (Xstormy16 Options): Add xstormy16 option.
- * doc/md.texi (Machine Constraints): Use @minus{} where appropriate.
-
-Mon Jan 14 20:18:19 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c (try_forward_edges): Avoid infinite loop at infinite
- threaded loop.
-
-2002-01-14 Tom Rix <trix@redhat.com>
-
- * config/rs6000/rs6000.md: Fix typo with sradi.
-
-2002-01-14 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.md (movstrdix_64, movstrsix_31, movstrdi_64,
- movstrsi_31, clrstrsi_64, clrstrsi_31): Improve RTL templates.
- (clrstrdi, clrstrsi): Adapt callers.
-
- (extendsidi2, zero_extendsidi2): Remove no-conflict blocks.
-
- (movti splitter): Never use register 0 as base register.
-
-2002-01-14 Hartmut Penner <hpenner@de.ibm.com>
-
- * combine.c (simplify_shift_const): Always generate new rtx
- for shift expression instead of reusing given expression.
-
-Mon Jan 14 07:08:55 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * config/alpha/alpha.c (alpha_expand_mov): Don't call
- alpha_legitimize_address unless mode is Pmode.
-
-2002-01-13 Geoffrey Keating <geoffk@redhat.com>
-
- * doc/md.texi (Modifiers): Document the '*' constraint for the
- user.
-
- * doc/md.texi (Machine Constraints): Add constraints for xstormy16.
- * doc/extend.texi (Function Attributes): 'interrupt' is valid
- for xstormy16 too.
-
-2002-01-13 Richard Henderson <rth@redhat.com>
-
- * reload.c (find_reloads): Use a hard reg destination as reload reg
- for an input reload of the source.
-
-2002-01-13 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/install.texi (Binaries): Make link to ftp.writtenword.com
- more generic.
-
-Sun Jan 13 07:23:01 2002 Douglas B Rupp <rupp@gnat.com>
-
- * Makefile.in (LIB2FUNCS): Split into LIB2FUNCS_1 and LIB2FUNCS_2.
- * mklibgcc.in (LIB2FUNCS): Split into LIB2FUNCS_1 and LIB2FUNCS_2.
-
- * config/alpha/x-vms (USE_COLLECT2): Set to empty.
-
-Sun Jan 13 06:55:31 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * dwarf2out.c (mem_loc_descriptor, case ADDRESSOF): New case.
-
-2002-01-12 Tom Rix <trix@redhat.com>
-
- * config/rs6000/rs6000.c (rs6000_emit_set_long_const): Use ior for
- TARGET_POWERPC64.
-
-2002-01-12 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (bdesc_2arg): Mark psadbw MASK_3DNOW_A.
-
- * doc/invoke.texi: Update Alpha options.
-
- * doc/invoke.texi: Update i386 built-in function lists.
-
-Sat Jan 12 17:38:11 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * unroll.c (final_reg_note_copy): Avoid crash on REG_LABEL note
- referencing outside.
-
-Sat Jan 12 08:54:51 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * diagnostic.c (warn_deprecated_use): Rework to lower indentation.
- * expr.c (emit_move_insn_1): Remove warning, use HOST_WIDE_INT for
- offsets, and change line folding.
- * optabs.c (expand_binop): Remove warnings.
- * sdbout.c (sdbout_record_type_name): Constify NAME to avoid warning.
-
-2002-01-12 Graham Stott <grahams@redhat.com>
-
- * attribs.c (handle_deprecated_attribute): constify WHAT.
- * diagnostic.c (warn_deprecated_use): Add braces, fixes
- dangling else warning and constify WHAT.
- * except.h (struct function, struct inline_remap): Move
- struct tag forward defs before all prototypes.
- (duplicate_eh_regions): Whitespace.
-
-2002-01-12 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.h (ARM_LEGITIMIZE_RELOAD_ADDRESS): Use
- MODE_BASE_REG_CLASS.
- (THUMB_LEGITIMIZE_RELOAD_ADDRESS): Use MODE_BASE_REG_CLASS.
-
-2002-01-12 Richard Henderson <rth@redhat.com>
-
- * config/i386/i386.c (override_options): If SSE, enable sse prefetch.
- (ix86_expand_vector_move): New.
- (bdesc_2arg): Remove andps, andnps, orps, xorps.
- (ix86_init_mmx_sse_builtins): Make static. Remove composite builtins.
- Remove old prefetch builtins. Special case the logicals removed above.
- (ix86_expand_builtin): Likewise.
- (safe_vector_operand): Use V4SFmode, not TImode.
- (ix86_expand_store_builtin): Remove shuffle arg. Update callers.
- (ix86_expand_timode_binop_builtin): New.
- * config/i386/i386-protos.h: Update.
- * config/i386/i386.h (enum ix86_builtins): Update.
- * config/i386/i386.md: Correct predicates on MMX/SSE patterns.
- Use ix86_expand_vector_move in vector move expanders.
- (movti_internal, movti_rex64): Add xorps alternative.
- (sse_clrv4sf): Rename and adjust from sse_clrti.
- (prefetch): Don't work so hard.
- (prefetch_sse, prefetch_3dnow): Use PREFETCH rtx, not UNSPEC.
- * config/i386/xmmintrin.h (__m128): Use V4SFmode.
- (_mm_getcsr, _mm_setcsr): Fix typo in builtin name.
-
-2002-01-11 Richard Henderson <rth@redhat.com>
-
- * config/i386/mmintrin.h: New file.
- * config/i386/xmmintrin.h: New file.
- * config.gcc (i?86-*-*): Add extra_headers.
- * simplify-rtx.c (simplify_unary_operation): Handle saturating
- truncation codes.
- (simplify_binary_operation): Handle saturating arithmetic codes.
- * config/i386/i386.c (ix86_expand_sse_comi): Return the full result,
- not the lowpart subreg.
- (ix86_expand_builtin): Return a TImode dummy register instead of 0
- on error.
- * config/i386/i386.md (mmx_clrdi): Override memory attribute.
-
-2002-01-12 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
-
- * conflict.c (conflict_graph_compute): Free regsets when finished.
- * ssa.c (compute_coalesced_reg_partition): Likewise.
-
-2002-01-12 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
-
- * global.c (find_reg): Check for HARD_REGNO_CALL_PART_CLOBBERED
- every where we allocate a register.
-
-2002-01-12 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
-
- * gcse.c (compute_pre_data, pre_gcse): Use sbitmap_free.
- * lcm.c (compute_earliest, compute_farthest): Likewise.
-
-2002-01-11 Janis Johnson <janis187@us.ibm.com>
-
- * expr.c (expand_assignment): Fix misuse of MEM_KEEP_ALIAS_SET.
-
-2002-01-11 Janis Johnson <janis187@us.ibm.com>
-
- * doc/rtl.texi (Insns): Fix 2 typos.
-
-2002-01-11 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/invoke.texi: Avoid overfull hboxes. Add summary of D30V
- options. Use @table @gcctabopt for MMIX options. Add index
- entries for MMIX options. Start new paragraph with first
- heading of the machine-dependent options.
-
-2002-01-11 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- PR other/5299
- * config/ns32k/ns32k.md: Fix spelling mistake of "than" in comments.
- * combine.c (force_to_mode): Same.
- * reload1.c (clear_reload_reg_in_use): Same.
-
-2002-01-11 Nick Clifton <nickc@cambridge.redhat.com>
-
- * config/arm/arm.c (arm_gen_constant): Correct test of 'remainder'
- and 'subtargets'.
-
-2002-01-11 Andreas Jaeger <aj@suse.de>,
- Brad Lucier <lucier@math.purdue.edu>
-
- * config/i386/i386.h (CPP_CPUCOMMON_SPEC): Remove wrong
- mcpu.
-
-Fri Jan 11 07:35:12 2002 Douglas B Rupp <rupp@gnat.com>
-
- * config/alpha/vms.h: (MD_FALLBACK_FRAME_STATE_FOR): Fix errors.
- Protect with IN_LIBGCC.
- (LINK_EH_SPEC): Add required trailing space.
-
-Fri Jan 11 09:25:05 2002 Nicola Pero <n.pero@mi.flashnet.it>
-
- * c-tree.h: Move function declarations so that they are listed
- under the filename which contains them.
- (check_identifier, finish_decl_top_level,
- lookup_name_current_level_global, shadow_record_fields): Remove.
-
-2002-01-11 Andreas Jaeger <aj@suse.de>
-
- * config/i386/i386.h (CPP_CPUCOMMON_SPEC): Remove duplicated
- march.
-
-2002-01-10 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (print_operand): Add 'J'.
- * config/alpha/alpha.md (call_osf_1_er, call_value_osf_1_er): Take a
- new operand with the sequence number for the lituse. When splitting
- the insns, use gen_movdi_er_high_g and generate a sequence number.
- (gen_movdi_er_high_g): Print the sequence number if non-zero.
-
-2002-01-10 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (altivec_init_builtins): Add support for
- lvebx, lvehx, lvewx, lvxl, lvx, stvx, stvebx, stvehx, stvewx,
- stvxl.
- (altivec_expand_builtin): Same.
- (altivec_expand_stv_builtin): New.
-
- * config/rs6000/rs6000.h (rs6000_builtins): Same.
-
- * config/rs6000/rs6000.md ("altivec_lvebx"): New.
- ("altivec_lvehx"): New.
- ("altivec_lvewx"): New.
- ("altivec_lvxl"): New.
- ("altivec_lvx"): New.
- ("altivec_stvx"): New.
- ("altivec_stvebx"): New.
- ("altivec_stvehx"): New.
- ("altivec_stvewx"): New.
- ("altivec_stvxl"): New.
-
-2002-01-10 Richard Henderson <rth@redhat.com>
-
- * cfgrtl.c (delete_insn): Assert insn hasn't been deleted yet.
- * reload1.c (delete_output_reload): Zap spill_reg_store. Take
- care not to delete instructions twice.
-
-2002-01-10 Zack Weinberg <zack@codesourcery.com>
-
- * toplev.c: Don't declare environ (it's not used anywhere).
- * configure.in: Don't check for declaration of environ.
- * config/i386/xm-mingw32.h: Don't #define environ.
- * config.in, configure: Regenerate.
-
-2002-01-10 Zack Weinberg <zack@codesourcery.com>
-
- * configure.in: Set stage1_cflags for powerpc-*-darwin*.
- * configure: Regenerate.
-
- * config/interix.h: Set DO_GLOBAL_CTORS_BODY and
- DO_GLOBAL_DTORS_BODY here, not in xm-interix.h.
- * config/alpha/vms.h: Set INCLUDE_DEFAULTS here, not in
- alpha/xm-vms.h.
- * config/m68k/t-next: Set OTHER_FIXINCLUDES_DIRS and
- LIMITS_H_TEST here, not in m68k/x-next.
- * config/rs6000/beos.h: Set STANDARD_INCLUDE_DIR and
- SYSTEM_INCLUDE_DIR here, not in rs6000/xm-beos.h.
-
- * config/x-interix: Don't set RANLIB, RANLIB_TEST, SHELL,
- LIBGCC2_INCLUDES, or SYSTEM_HEADER_DIR.
- * config/alpha/x-vms: Don't set USE_COLLECT2. Add comments.
-
- * config/i386/x-djgpp: Renamed i386/t-djgpp.
- * config/m88k/x-dolph: Renamed m88k/t-dolph.
- * config/m88k/x-texXD88: Renamed m88k/t-texXD88.
- * config/pa/x-pa-mpeix: Renamed pa/t-mpeix. Update for
- replacement of quadlib.asm with quadlib.c.
-
- * config/x-interix3, config/xm-interix.h, config/i386/x-beos,
- config/i386/xm-osf1elf.h, config/rs6000/x-darwin,
- config/rs6000/xm-beos.h: Delete file.
-
- * config.gcc: Update to match above changes.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.h: Fix comment typos.
- * config/h8300/h8300.md: Likewise.
- * config/h8300/lib1funcs.asm: Likewise.
-
-2002-01-10 Dale Johannesen <dalej@apple.com>
-
- PR optimization/5269
- * unroll.c (precondition_loop_p): Make *increment be the correct
- sign when n_iterations known, to avoid confusing caller.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * doc/extend.texi (deprecated): Fix a typo.
-
-Thu Jan 10 22:35:54 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * basic-block.h (update_br_prob_note): Declare.
- * cfgcleanup.c (try_simplify_condjump): Call update_br_prob_note.
- (try_forward_edges): Care negative frequencies and update note.
- (outgoing_edges_match): Tweek conditional merging heuristics.
- (try_crossjump_to_edge): use update_br_prob_note.
- * cfglayout.c (fixup_reorder_chain): Likewise.
- * cfrtl.c (update_br_prob_note): New.
- * ifcvt.c (dead_or_predicable): Call update_br_prob_note.
-
- * i386.c (ix86_decompose_address): Return -1 if address contains
- shift.
- (legitimate_address_p): Require ix86_decompose_address to return 1.
-
- * gcse.c (hash_scan_set): Use CONSTANT_INSN_P.
- (cprop_insn): Likewise.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * toplev.c: Fix formatting.
- * tree.c: Likewise.
- * tree-dump.c: Likewise.
- * unroll.c: Likewise.
- * unwind-dw2.c: Likewise.
- * unwind-dw2-fde.c: Likewise.
- * unwind-dw2-fde-glibc.c: Likewise.
- * unwind-sjlj.c: Likewise.
-
-2002-01-10 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/invoke.texi: Document PDP-11 options.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.h: Fix formatting.
-
-2002-01-10 Ira Ruben <ira@apple.com>
-
- Add __attribute__ ((deprecated)).
- * extend.texi: Document __attribute__ ((deprecated)).
- * invoke.texi: Document -Wno-deprecated-declarations.
- * testsuite/g++.dg/other/deprecated.C: New C++ test.
- * testsuite/gcc.dg/deprecated.c: New C test.
- * attribs.c (enum attrs): Declare handle_deprecated_attribute().
- (c_common_attribute_table): Add "deprecated" entry.
- (handle_deprecated_attribute): New function.
- * c-decl.c (deprecated_states): New enum.
- deprecated_state: State of "deprecated" handling.
- (start_decl): Set deprecated_state based on attributes.
- (grokdeclarator): Test for deprecated uses, propagate attribute.
- * c-typeck.c (build_component_ref): Test for deprecated fields.
- (build_external_ref): Test for deprecated primaries.
- * diagnostic.c (warn_deprecated_use) New function to issue
- warnings about __attribute__ ((depricated)) references.
- * flags.h (warn_deprecated_decl): Extern declared for
- -W[no-]deprecated-declarations option.
- * print-tree.c (print_node): Show deprecated flag status.
- * toplev.c (warn_deprecated_decl): Defined.
- (W_options): Added "deprecated-declaration".
- * toplev.h (warn_deprecated_use): Extern declared.
- * tree.h (struct tree_common): Define deprecated_flag.
- (TREE_DEPRECATED): New macro to access flag.
- * cp/call.c (build_call): Test for deprecated calls.
- * cp/class.c (add_implicitly_declared_members): Set global
- flag to tell grokdeclarator to not issue deprecated warnings.
- * cp/cp-tree.h: Add extern for adding_implicit_members.
- * cp/decl.c (deprecated_states): New enum.
- (start_decl): Set deprecated_state based on attributes.
- (grokdeclarator): Test for deprecated uses, propagate attribute.
- * cp/lex.c (do_identifier): Test for deprecated primaries.
- * cp/typeck.c (build_component_ref): Test for deprecated fields.
-
-2002-01-10 Ira Ruben <ira@apple.com>
-
- Fix to assign attributes to inline member functions.
- * cp/decl.c (start_method): Handle attrlist.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * combine.c (expand_field_assignment): Use subreg_lsb().
-
-2002-01-10 David Edelsohn <edelsohn@gnu.org>
-
- * alias.c (find_base_value): Add cases for HIGH, PRE_INC, PRE_DEC,
- POST_INC, POST_DEC, PRE_MODIFY, and POST_MODIFY.
- (find_base_term): Add cases for TRUNCATE, PRE_MODIFY, and POST_MODIFY.
- Recurse for any operand of AND as long as constant is non-zero.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md: Remove constraints from expanders.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * varasm.c: Fix formatting.
- * varray.c: Likewise.
- * vmsdbgout.c: Likewise.
- * xcoffout.c: Likewise.
-
-Thu Jan 10 17:19:12 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c (try_forward_edges): Properly initialize nthreaded_edges;
- update edge probabilities to match.
-
-2002-01-10 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * Makefile.in ($(docdir)/gccint.info, gccint.dvi): Add additional
- dependencies.
- * doc/languages.texi, doc/sourcebuild.texi: New files.
- * doc/configfiles.texi: Make a subsubsection. Update.
- * doc/configterms.texi: Add @node. Remove warning that this isn't
- instructions for building GCC.
- * doc/makefile.texi: Make a subsection.
- * doc/gccint.texi: Update.
-
-Thu Jan 10 16:39:58 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * i386.md (sse_mov?fcc_const0_?): Fix constraints.
-
-Thu Jan 10 12:45:50 2002 Nicola Pero <n.pero@mi.flashnet.it>
-
- * doc/cpp.texi: Document the __OBJC__ preprocessor macro.
-
-Thu Jan 10 11:19:18 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * optabs.c (expand_fix): Look for wider integer modes first.
-
- * i386.md (mov?f): Avoid the fake const double trick for medium
- memory model.
- (min?f*/max?f*): Prohibit memory operands for i387 variant.
- (fop_df_4): Disable for SSE compilation.
-
-2002-01-10 Graham Stott <grahams@redhat.com>
-
- * dwarf2out.c (indirect_string_alloc, output_indirect_string):
- Move prototype into DWARF2_DEBUGGING_INFO conditional block.
-
-2002-01-10 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (extendsidi2_fix): Penalize f/f alternative.
-
-2002-01-10 Richard Henderson <rth@redhat.com>
-
- * regrename.c (find_oldest_value_reg): Fix typo in mode change check.
- (copyprop_hardreg_forward_1): Likewise. Use mode_change_ok.
-
-2002-01-10 Kazu Hirata <kazu@hxi.com>
-
- * combine.c (can_combine_p): Fix a comment typo.
-
-2002-01-09 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (s-gencheck, s-options, s-specs): Handle an
- empty list correctly. Change loop index $t to $f for
- consistency with rest of Makefile.
-
-2002-01-08 Aldy Hernandez <aldyh@redhat.com>
-
- * testuite/gcc.dg/altivec-4.c: Add test for mtvscr, dssall,
- mfvscr, dss, lvsl, lvsr, dstt, dstst, dststt, dst.
-
- * config/rs6000/rs6000.c (altivec_expand_builtin): Add support for
- mtvscr, dssall, mfvscr, dss, lvsl, lvsr, dstt, dst, dstst, dststt.
- (altivec_init_builtins): Same.
- (altivec_expand_unop_builtin): Return NULL_RTX on error.
- (altivec_expand_binop_builtin): Same.
- (altivec_expand_ternop_builtin): Same.
- (bdesc_dst): New.
-
- * config/rs6000/rs6000.md ("altivec_mtvscr"): New.
- ("altivec_vctuxs"): Fix typo.
- ("altivec_vnmsubfp"): Same.
- ("altivec_dssall"): New.
- ("altivec_mfvscr"): New.
- ("altivec_dss"): New.
- ("altivec_lvsl"): New.
- ("altivec_lvsr"): New.
- ("altivec_dstt"): New.
- ("altivec_dstst"): New.
- ("altivec_dststt"): New.
- ("altivec_dst"): New.
-
- * config/rs6000/rs6000.h (rs6000_builtins): Add mtvscr, dssall,
- mfvscr, dss, lvsl, lvsr, dstt, dstst, dststt, dst.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.md (prologue_mcount): Remove lituse_jsr reloc.
-
-2002-01-10 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.c (mmix_asm_identify_gcc): Remove unused
- function.
- * config/mmix/mmix-protos.h (mmix_asm_identify_gcc): Don't
- prototype.
- * config/mmix/mmix.h (ASM_IDENTIFY_GCC): Remove unused macro.
-
-2002-01-09 Kazu Hirata <kazu@hxi.com>
-
- * read-rtl.c: Fix formatting.
- * real.c: Likewise.
- * regclass.c: Likewise.
- * regrename.c: Likewise.
- * reg-stack.c: Likewise.
- * reload1.c: Likewise.
- * reload.c: Likewise.
- * rtl.c: Likewise.
-
-2002-01-09 Kazu Hirata <kazu@hxi.com>
-
- * rtlanal.c (find_reg_fusage): Use XEXP instead of SET_DEST
- to extract items in the expr_list chain.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * config/vax/vax.c (vax_rtx_cost): Never abort.
-
- * config/vax/vax.h (REAL_ARITHMETIC): Define.
-
-2002-01-09 Jan Hubicka <jh@suse.cz>
-
- * gcse.c (cprop_jump): Delete insn if simplified jump is no-op.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * config/arm/arm.c (arm_gen_constant): Use trunc_int_for_mode.
- Unify code from various alternatives.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * regrename.c (copy_value): Ignore the copy if the source register
- is present in the value chain with a narrower mode.
-
-2002-01-09 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
-
- * real.c (c4xtoe, toc4x): Do some special conversion on long doubles
- for the c4x target. Also improve layout.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * config/m32r/m32r.c (move_src_operand): Fix 32-bit int test.
- * config/m32r/m32r.md (and ior xor splitters): Swap operands
- to match insn patterns.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * regrename.c (find_oldest_value_reg): Use gen_rtx_raw_REG.
- (copyprop_hardreg_forward_1): Likewise.
-
-2002-01-09 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.md (decrement_and_branch_until_zero): Change predicate for
- operand 0 from register_operand to reg_or_nonsymb_mem_operand.
-
-2002-01-09 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
-
- * ginclude/stddef.h: Define _BSD_WCHAR_T_DEFINED_ if _BSD_WCHAR_T_
- gets undefined. For Darwin.
-
-2002-01-09 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
-
- * config/c4x/c4x.h: Use PUSH_ARGS and PUSH_ROUNDING for stack passing.
-
-2002-01-09 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
-
- * config/c4x/c4x/md: Remove extraneous constraints from define_splits.
-
-2002-01-08 Richard Henderson <rth@redhat.com>
-
- * regrename.c (copy_value): Ignore overlapping copies.
-
-2002-01-08 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (alpha_split_conditional_move): Call copy_rtx
- as needed to avoid shared structure.
-
-2002-01-08 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (get_shift_alg): Fix 15-bit LSHIFTRT on
- H8/300H and H8/S.
-
-2002-01-08 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/tm.texi (EASY_DIV_EXPR, IMPLICIT_FIX_EXPR,
- LONGJMP_RESTORE_FROM_STACK, MAX_INT_TYPE_SIZE): Remove
- documentation of obsolete macros.
- * system.h: Poison these macros.
- * config/1750a/1750a.h, config/a29k/a29k.h, config/alpha/alpha.h,
- config/arc/arc.h, config/arm/arm.h, config/avr/avr.h,
- config/c4x/c4x.h, config/clipper/clipper.h,
- config/convex/convex.h, config/cris/cris.h, config/d30v/d30v.h,
- config/dsp16xx/dsp16xx.h, config/elxsi/elxsi.h,
- config/fr30/fr30.h, config/h8300/h8300.h, config/i370/i370.h,
- config/i386/i386.h, config/i860/i860.h, config/i960/i960.h,
- config/ia64/ia64.h, config/m32r/m32r.h, config/m68hc11/m68hc11.h,
- config/m68k/m68k.h, config/m88k/m88k.h, config/mcore/mcore.h,
- config/mips/mips.h, config/mmix/mmix.h, config/mn10200/mn10200.h,
- config/mn10300/mn10300.h, config/ns32k/ns32k.h, config/pa/pa.h,
- config/pdp11/pdp11.h, config/pj/pj.h, config/romp/romp.h,
- config/rs6000/rs6000.h, config/s390/s390.h, config/sh/sh.h,
- config/sparc/sparc.h, config/stormy16/stormy16.h,
- config/v850/v850.h, config/vax/vax.h, config/we32k/we32k.h: Remove
- definitions and commented out definitions of obsolete macros.
- * config/mips/iris5.h (MAX_WCHAR_TYPE_SIZE): Don't define in terms
- of MAX_INT_TYPE_SIZE.
-
-2002-01-08 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/s390.c (s390_preferred_reload_class): Never
- return ADDR_REGS if it isn't a subset of the given class.
- * config/s390/s390.h (REGISTER_MOVE_COST): Penalize not just
- FP_REGS, but all superclasses as well.
-
- * config/s390/s390.c (s390_function_profiler): Fix thinko.
-
- * config/s390/s390.md (cmpdi_ccu_mem, cmpsi_ccu_mem,
- cmphi_ccu_mem, cmpqi_ccu_mem): First operand of compare
- must not be a const_int.
-
-2002-01-08 Richard Henderson <rth@redhat.com>
-
- * Makefile.in (toplev.o): Depend on options.h.
- (gcc.o): Depend on specs.h.
-
-2002-01-08 Jakub Jelinek <jakub@redhat.com>
-
- * expr.c (store_expr): Convert VOIDmode constants back to target's
- mode.
-
-2002-01-08 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
-
- * doc/invoke.texi: Markup gcc as @command. Refer to
- http://gcc.gnu.org/onlinedocs/gcc/Contributors.html instead
- of http://gcc.gnu.org/thanks.html.
-
-2002-01-08 Dale Johannesen <dalej@apple.com>
-
- * config/rs6000/rs6000.md: Add missing int register
- target case to movdf_low.
-
-2002-01-08 Zack Weinberg <zack@codesourcery.com>
-
- * Makefile.in (cs-tconfig.h): Don't depend on $(CONFIG_H) or
- except.h. Remove commands to define USING_SJLJ_EXCEPTIONS.
- (cppinit.o): Depend on except.h.
- (gencheck.h, options.h, specs.h, s-gencheck, s-options,
- s-specs): New rules.
-
- * configure.in: Don't AC_DEFINE_UNQUOTED PACKAGE or VERSION.
- Don't create specs.h/options.h/gencheck.h here. Remove
- unnecessary variable settings from last argument of AC_OUTPUT.
- * config.in, configure: Regenerate.
- * intl.c: Hardcode package name as "gcc".
-
- * cppinit.c: Include except.h.
- (builtin_array): Define __USING_SJLJ_EXCEPTIONS__ when
- appropriate.
- * unwind-dw2.c, unwind-sjlj.c, config/ia64/unwind-ia64.c:
- Use #if(n)def __USING_SJLJ_EXCEPTIONS, not #if
- (!)USING_SJLJ_EXCEPTIONS.
- * doc/cpp.texi: Document __USING_SJLJ_EXCEPTIONS__.
-
-2002-01-08 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/tm.texi (ASM_OUTPUT_EH_REGION_BEG, ASM_OUTPUT_EH_REGION_END,
- ASM_OUTPUT_LABELREF_AS_INT, DOESNT_NEED_UNWINDER, EH_TABLE_LOOKUP,
- OBJC_SELECTORS_WITHOUT_LABELS, OMIT_EH_TABLE): Remove
- documentation of obsolete macros.
- * system.h: Poison these macros.
- * config/d30v/d30v.h, config/ns32k/encore.h,
- config/stormy16/stormy16.h: Remove definitions and commented out
- definitions of obsolete macros.
-
-Tue Jan 8 15:56:41 2002 Nicola Pero <nicola@brainstorm.co.uk>
-
- * objc/objc-act.c (handle_class_ref): Mark the declaration of
- %sobjc_class_ref_%s as used - to prevent unwanted compiler
- warnings.
-
-2002-01-08 Ulrich Weigand <uweigand@de.ibm.com>
-
- * config/s390/linux.h (ASM_OUTPUT_LABELREF): Remove.
- * config/s390/s390.c (s390_emit_epilog): Add REG_FRAME_RELATED_EXPR
- to insn adjusting stack/frame pointer.
- * config/s390/s390.md (reload_la_64, reload_la_31): Do not
- accept operands that cause the insn to be non-splittable.
-
-2002-01-08 Graham Stott <grahams@redhat.com>
-
- * c-tree.h (C_TYPE_FIELDS_READONLY): Uppercase macro parameter.
- (C_TYPE_FIELDS_VOLATILE): Likewise.
- (C_TYPE_BEING_DEFINED): Likewise.
- (C_IS_RESERVED_WORD): Likewise.
- (C_TYPE_VARIABLE_SIZE): Likewise.
- (C_DECL_VARIABLE_SIZE): Likewise.
- (C_MISSING_PROTOTYPE_WARNED): Likewise.
- (C_SET_EXP_ORIGINAL_CODE): Likewise.
- (C_TYPEDEF_EXPLICITLY_SIGNED): Uppercase macro parameter and remove
- parenthesis.
- (C_DECL_ANTICIPATED): Likewise.
- (c_build_type_variant): Add parenthesis.
-
-2002-01-08 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * gcc.c (option_map): Remove --version.
- (process_command): Handle -fversion following the GNU Coding
- Standards. Partially addresses PR other/704.
-
-2002-01-08 Graham Stott <grahams@redhat.com>
-
- * combine.c (combine_instructions): Fix typo.
-
-2002-01-08 Graham Stott <grahams@redhat.com>
-
- * debug.h: Use "tree" and "rtx" throughout.
-
- * debug.c: Likewise.
-
-2002-01-08 Nick Clifton <nickc@cambridge.redhat.com>
-
- * dbxout.c (dbxout_symbol_location): If a symbol ref is in the
- constant pool, use the pool's version of the symbol instead.
-
-2002-01-07 Richard Henderson <rth@redhat.com>
-
- * regrename.c (find_oldest_value_reg): Ignore the value chain if
- the original register was copied in a mode with a fewer number of
- hard registers than the desired mode.
- (copyprop_hardreg_forward_1): Likewise.
- (debug_value_data): Fix loop test.
- * toplev.c (parse_options_and_default_flags): Reenable
- -fcprop-registers at -O1.
-
-2002-01-07 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (bdesc_2arg): Add altivec predicates.
- (altivec_init_builtins): New node v4si_ftype_v16qi_v16qi.
-
- * config/rs6000/rs6000.h (rs6000_builtins): Add enums for altivec
- predicates.
-
- * config/rs6000/rs6000.md: Add altivec predicate patterns.
-
-2002-01-07 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * pa.c (FUNC_BEGIN_PROLOG_LABEL, current_function_number): Define.
- (pa_output_function_prologue): Output local label at the beginning of
- the prologue when profiling.
- (hppa_profile_hook): Use the local label rather than the function label.
- * pa.h (PROFILE_BEFORE_PROLOGUE): Define.
-
-2002-01-07 Aldy Hernandez <aldyh@redhat.com>
-
- * config/rs6000/rs6000.c (print_operand): Remove extra space.
- (altivec_expand_unop_builtin): Fix thinko.
- (altivec_expand_binop_builtin): Same.
- (altivec_expand_ternop_builtin): Same.
- (altivec_expand_builtin): Same.
-
-2002-01-07 Richard Henderson <rth@redhat.com>
-
- * config/rs6000/xcoff.h (ASM_FILE_START): Reverted to profile_flag.
-
-2002-01-07 Jason Merrill <jason@redhat.com>
-
- * unwind-dw2.c (execute_cfa_program): Use < again.
-
-2002-01-07 Jakub Jelinek <jakub@redhat.com>
-
- * predict.c (combine_predictions_for_insn): Avoid division by zero.
-
-2002-01-07 Jakub Jelinek <jakub@redhat.com>
-
- * simplify-rtx.c (simplify_plus_minus): Bump n_ops for NOT.
- Don't allow -1 - x -> ~x simplifications in the first pass.
-
-2002-01-07 Aldy Hernandez <aldyh@redhat.com>
-
- * rs6000.c (altivec_expand_ternop_builtin): Don't die on invalid
- arguments.
- (altivec_expand_binop_builtin): Same.
- (altivec_expand_unop_builtin): Same.
- (print_operand): Fix typo.
- (bdesc_1arg): Add vupk* variants.
-
- * rs6000.h (rs6000_builtins): Add vupk* enums.
-
- * rs6000.md: Add altivec_vupk* variants.
-
-2002-01-07 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * doc/gcc.texi, doc/gccint.texi, doc/cppinternals.texi,
- doc/install.texi, doc/invoke.texi, doc/rtl.texi: Update copyright
- and last update dates.
-
-2002-01-07 Janis Johnson <janis187@us.ibm.com>
-
- * doc/rtl.texi (Flags): Clean up documentation of RTL flags
-
-2002-01-07 Marek Michalkiewicz <marekm@amelek.gda.pl>
-
- * config/avr/avr.c (avr_mcu_types): Add new MCU types.
- * config/avr/avr.h (CPP_SPEC): Likewise.
- (LINK_SPEC): Likewise.
- (CRT_BINUTILS_SPECS): Likewise.
- * config/avr/t-avr (MULTILIB_MATCHES): Likewise.
- * doc/invoke.texi (AVR Options): Document them.
-
-Mon Jan 7 11:59:34 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * unroll.c (copy_loop_body): Always properly update JUMP_LABEL and
- LABEL_NUSES.
-
-2002-01-07 Graham Stott <grahams@redhat.com>
-
- * config/i386/i386.h: Update copyright date.
- (HALF_PIC_PTR): Add parenthesis.
- (OPTIMIZATION_OPTIONS): Whitespace, add parenthesis and wrap.
- (CONSTANT_ALIGNMENT): Add parenthesis.
- (DATA_ALIGNMENT): Likewise.
- (LOCAL_ALIGNMENT): Likewise.
- (FUNCTION_ARG_BOUNDARY): Whitespace, add parenthesis and wrap.
- (IS_STACK_MODE): Uppercase macro parameter, add parenthesis and wrap.
- (CONDITIONAL_REGISTER_USAGE): Wrap in do {...} while (0).
- (HARD_REGNO_NREGS): Add paranethesis.
- (VALID_SSE_REG_MODE): Whitespace.
- (VALID_MMX_REG_MODE): Whitespace.
- (VALID_FP_MODE_P): Uppercase macros parameter and whitespace.
- (ix86_hard_regno_mode_ok): Add parenthesis.
- (HARD_REGNO_CALLER_SAVE_MODE): Whitespace.
- (RETURN_IN_MEMORY): Whitespace.
- (N_REG_CLASSES): Add parenthesis.
- (INTEGER_CLASS_P): Add parenthesis and wrap.
- (FLOAT_CLASS_P): Likewise.
- (SSE_CLASS_P): Likewise.
- (MMX_CLASS_P): Likewise.
- (MAYBE_INTEGER_CLASS_P): Likewise.
- (MAYBE_FLOAT_CLASS_P): Likewise.
- (MAYBE_SSE_CLASS_P): Likewise.
- (MAYBE_MMX_CLASS_P): Likewise.
- (Q_CLASS_P): Likewise.
- (GENERAL_REGNO_P): Uppercase macro parameter.
- (REX_INT_REGNO_P): Uppercase macro parameter and wrap.
- (FP_REGNO_P): Likewise.
- (ANY_FP_REGNO_P): Uppercase macro parameter.
- (SSE_REGNO_P): Likewise.
- (SSE_REGNO): Likewise.
- (SSE_REG_P): Likewise.
- (SSE_FLOAT_MODE_P): Likewise.
- (MMX_REGNO_P): Likewise.
- (MMX_REG_P):Likewise.
- (STACK_REG_P): Likewise.
- (NON_STACK_REG_P): Likewise.
- (STACK_TOP_P): Likewise.
- (CONVERT_HARD_REGISTER_TO_SSA_P): Add parenthesis.
- (PREFERRED_RELOAD_CLASS): Add parenthesis and whitespace.
- (SECONDARY_MEMORY_NEEDED): Likewise.
- (SECONDARY_OUTPUT_RELOAD_CLASS): Whitespace.
- (MD_ASM_CLOBBERS): Whitespace and wrap.
- (MUST_PASS_IN_STACK): Whitespace and wrap.
- (RETURN_POPS_ARGS): Add parenthesis.
- (INIT_CUMULATIVE_ARGS): Likewise.
- (FUNCTION_ARG): Likewise.
- (FUNCTION_OK_FOR_SIBCALL): Add parenthesis and whitespace.
- (SETUP_INCOMING_VARARGS): Likewise.
- (BUILD_VA_LIST_TYPE): Add parenthesis.
- (EXPAND_BUILTIN_VA_START): Uppercase macro paremeters and add
- parenthsis.
- (EXPAND_BUILTIN_VA_ARG): Likewise.
- (FUNCTION_PROFILER): Wrap in do { ... } while (0) and add parenthesis.
- (INITIALIZE_TRAMPOLINE): Add parenthesis.
- (INITIAL_ELIMINATION_OFFSET): Likewise.
- (REGNO_OK_FOR_INDEX_P): Add parenthesis.
- (REGNO_OK_FOR_BASE_P): Likewise.
- (REGNO_OK_FOR_SIREG_P): Add parenthesis and wrap.
- (REGNO_OK_FOR_DIREG_P): Likewise.
- (REG_OK_FOR_INDEX_P): Whitespace.
- (REG_OK_FOR_BASE_P): Whitespace.
- (GO_IF_LEGITIMATE_ADDRESS): Wrap in do { ... } while (0) and add
- parenthesis.
- (FIND_BASE_TERM): Fix typo.
- (LEGITIMIZE_ADDRESS): Wrap in { .. } while (0) and add parenthesis.
- (REWRITE_ADDRESS): Uppercase macro parameter and whitespace.
- (SYMBOLIC_CONST; Whitespace.
- (GO_IF_MODE_DEPENDENT_ADDRESS):Wrap in { .. } while (0) and wrap.
- (ENCODE_SECTION_INFO): Whitespace.
- (FINALIZE_PIC): Remove do { ... } while (0).
- (PROMOTE_MODE): Wrap in do { ... } while (0).
- (CONST_COSTS): Whitespace.
- (RTX_COSTS): Add paramethesis, whitespace and wrap.
- (REGISTER_MOVE_COST): Add parenthesis.
- (MEMORY_MOVE_COST): Likewise.
- (EXTRA_CC_MODES): Whitespace.
- (SELECT_CC_MODE): Add parenthesis and whitespace.
- (DBX_REGISTER_NUMBER): Uppercase macro parameter and add parenthsis.
- (ASM_PREFERRED_EH_DATA_FORMAT): Add parenthesis and whitespace.
- (ASM_OUTPUT_LABEL): Add paramethesis.
- (ASM_OUTPUT_REG_PUSH): Add parenthesis and whitespace.
- (ASM_OUTPUT_REG_POP): Likewise.
- (ASM_OUTPUT_ADDR_VEC_ELT): Add parenthesis.
- (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
-
- * config/i386/i386.c: Update copyright.
- (CHECK_STACK_LIMIT): Add parenthesis.
- (AT_BP): Uppercase macro parameter.
- (x86_64_int_parameter_registers): Constify.
- (x86_64_int_return_registers): Likewise.
- (ix86_compare_op0): Use rtx.
- (construct_container): Constify INTREG parameter.
- (function_arg): Use rtx.
-
- * diagnostic.h: Update copyright date.
- (output_buffer_state): Add parenthesis.
- (output_buffer_format_args): Likewise.
-
- * combine.c (combine_instructions): Replace XEXP (links, 0)
- with link.
-
-2002-01-06 H.J. Lu <hjl@gnu.org>
-
- * cfgcleanup.c (thread_jump): Fix 2 typos.
-
-2002-01-06 Aldy Hernandez <aldyh@redhat.com>
-
- * config.gcc: Add support for --enable-altivec.
-
-2002-01-06 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- * emit-rtl.c (gen_highpart): Add check for NULL_RTX.
-
-2002-01-06 Jakub Jelinek <jakub@redhat.com>
-
- * objc/objc-act.c (handle_impent): Use assemble_variable to emit
- __objc_class_name_*.
-
-2002-01-06 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- * doc/install.texi (sparcv9-*-solaris2*): Add documentation.
-
-2002-01-06 Richard Henderson <rth@redhat.com>
-
- * reorg.c (emit_delay_sequence): Remove death notes, not merely
- nop them out. Increment label reference count for REG_LABEL.
- (fill_slots_from_thread): Frob label reference count around
- delete_related_insns.
-
-2002-01-05 Richard Henderson <rth@redhat.com>
-
- * cfgcleanup.c (try_forward_edges): Detect infinite loops while
- jump threading.
-
-2002-01-05 Richard Henderson <rth@redhat.com>
-
- * c-decl.c (c_expand_body): Don't call outlining_inline_function.
- * integrate.c (output_inline_function): Likewise.
- * toplev.c (rest_of_compilation): Do it here instead. Move call
- to remove_unnecessary_notes after emitting abstract instance.
- Force an emitted nested function to have its parent emited as well.
- * dwarf2out.c (loc_descriptor_from_tree): Read mode after checking
- for null.
- (rtl_for_decl_location): Do not look at reload data structures
- before reload has run.
-
-2002-01-05 Kazu Hirata <kazu@hxi.com>
-
- * cse.c: Fix formatting.
- * dwarf2asm.c: Likewise.
- * dwarf2out.c: Likewise.
- * explow.c: Likewise.
- * expmed.c: Likewise.
- * function.c: Likewise.
- * gcov.c: Likewise.
- * gencheck.c: Likewise.
- * genrecog.c: Likewise.
- * ggc-common.c: Likewise.
- * ggc-page.c: Likewise.
- * global.c: Likewise.
-
-2002-01-05 Kazu Hirata <kazu@hxi.com>
-
- * combine.c: Fix formatting.
-
-2002-01-05 Craig Rodrigues <crodrigu@bbn.com>
-
- PR middle-end/1557
- * config/ia64/ia64.h (RENAME_EXTENDED_BLOCKS): Remove.
-
-2002-01-05 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/rs6000.h (TARGET_POWERPC): For IN_LIBGCC2, define
- as 1 for __powerpc64__ as well.
-
- * config/rs6000/t-aix43 (T_ADAFLAGS): Define.
-
- * alias.c (find_base_value, PLUS/MINUS): If we found a base,
- return it.
-
-2002-01-05 Daniel Berlin <dan@dberlin.org>
-
- * lcm.c: Revert change, due to performance regression it causes on
- SPEC because it's slightly more conservative (sigh, I hate
- edge-based LCM).
-
-Sat Jan 5 11:52:05 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c (try_forward_edges): Allow multiple jump threading.
-
-2002-01-05 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * doc/cppinternals.texi: Update.
-
-2002-01-05 Hans-Peter Nilsson <hp@bitrange.com>
-
- * doc/invoke.texi (Option Summary) <MMIX Options>: Document
- -mbranch-predict, -mreg-stack-fill-bug-workaround and their
- negatives.
- (MMIX Options): Ditto. Fix item/itemx typo for -mno-zero-extend.
- * config/mmix/mmix.c (mmix_target_asm_function_prologue): Rework
- kludge for pre-october-14th mmix versions to handle new-found bug
- with PUSHJ/PUSHGO and the register stack.
- * config/mmix/mmix.h (struct machine_function): Rename member
- has_call_value_without_parameters to has_call_without_parameters.
- All referers changed.
- (TARGET_MASK_REG_STACK_FILL_BUG, TARGET_DEFAULT
- TARGET_MASK_BRANCH_PREDICT): New macros.
- (TARGET_SWITCHES): New options -mreg-stack-fill-bug-workaround,
- -mno-reg-stack-fill-bug-workaround.
- * config/mmix/mmix.md ("call"): Set struct machine member
- has_call_without_parameters.
-
-Sat Jan 5 02:20:22 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c (thread_jump): Fix handling of reversed branches.
-
-Sat Jan 5 01:35:29 CET 2002 Jan Hubicka <jh@suse.cz>
-
- * cfgcleanup.c: Include tm_p.h
- (mark_effect): Fix handling of hard register; fix handling of SET
-
-2002-01-04 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.md (anonymous patterns): Check that
- operands are registers before using REGNO on them.
-
-2002-01-03 Roland McGrath <roland@frob.com>
-
- * doc/invoke.texi (RS/6000 and PowerPC Options): Add -mcall-gnu.
-
-2002-01-04 Jakub Jelinek <jakub@redhat.com>
-
- * tree.h (expand_expr_stmt_value): Add maybe_last argument.
- * c-common.h (genrtl_expr_stmt_value): Likewise.
- * stmt.c (expand_expr_stmt): Pass 1 as maybe_last.
- (expand_expr_stmt_value): Add maybe_last argument.
- Don't warn about statement with no effect if it is the last statement
- in expression statement.
- * c-semantics.c (genrtl_expr_stmt): Pass 1 as maybe_last.
- (genrtl_expr_stmt_value): Add maybe_last argument, pass it down to
- expand_expr_stmt_value.
- (expand_stmt) [EXPR_STMT]: Pass 1 as maybe_last to
- genrtl_expr_stmt_value if t is the last EXPR_STMT in its scope.
- * expr.c (expand_expr) [LABELED_BLOCK_EXPR, LOOP_EXPR]: Pass 1
- as maybe_last to expand_expr_stmt_value.
-
-Fri Jan 4 11:45:05 2002 Jeffrey A Law (law@redhat.com)
-
- * c-common.c (c_expand_start_cond): Expect the IF_STMT node to
- be passed in, do not build it.
- (c_begin_if_stmt): New function.
- (c_begin_while_stmt, c_finish_while_stmt_cond): Likewise.
- * c-common.h (c_expand_start_cond): Update prototype.
- (c_begin_if_stmt): Prototype new function.
- (c_begin_while_stmt, c_finish_while_stmt_cond): Likewise.
- * c-parse.in (if_prefix): Use c_begin_if_stmt,
- c_begin_while_stmt and c_finish_while_stmt_cond.
-
-2002-01-04 William Cohen <wcohen@redhat.com>
-
- * config/pa/elf.h (ASM_FILE_START): Reverted to profile_flag.
- * config/pa/pa-linux.h (ASM_FILE_START): Likewise.
- * config/pa/pa64-hpux.h (ASM_FILE_START): Likewise.
- * config/pa/som.h (ASM_FILE_START): Likewise.
-
-2002-01-04 Daniel Berlin <dan@cgsoftware.com>
-
- * lcm.c: Include df.h.
- Add available_transfer_function prototype.
- (compute_available): Rework to use iterative dataflow framework.
- (struct bb_info): s/bb_info/lcm_bb_info/g to avoid conflict
- with bb_info in df.h
- (available_transfer_function): New function.
-
- * Makefile.in (lcm.o): add df.h to dependencies.
-
-2002-01-04 Richard Henderson <rth@redhat.com>
-
- * config/alpha/alpha.c (some_operand): Accept HIGH.
- (input_operand): Likewise; accept simple references to globals.
- (alpha_const_ok_for_letter_p): New, outlined from alpha.h.
- (alpha_const_double_ok_for_letter_p): Likewise.
- (alpha_extra_constraint): Likewise.
- (alpha_preferred_reload_class): Likewise. Do not force
- symbolic constants to memory.
- (alpha_legitimate_address_p): Accept simple references
- to small_symbolic_operand.
- (alpha_legitimize_address): New arg scratch. Be prepared to be
- called when no_new_pseudos. Emit simple symbolic references.
- Split integers into low, high, and rest.
- (alpha_expand_mov): Use alpha_legitimize_address.
- (some_small_symbolic_mem_operand): New.
- (split_small_symbolic_mem_operand): New.
- * config/alpha/alpha-protos.h: Update.
- * config/alpha/alpha.h (CONST_OK_FOR_LETTER_P): Out-line.
- (CONST_DOUBLE_OK_FOR_LETTER_P): Likewise.
- (EXTRA_CONSTRAINT): Likewise.
- (PREFERRED_RELOAD_CLASS): Likewise.
- (LEGITIMIZE_ADDRESS): Update for alpha_legitimize_address change.
- (PREDICATE_CODES): Update.
- * config/alpha/alpha.md: New post-reload splitters to convert
- simplfied symbolic operands to the form that references $29.
- (divide expanders): Use emit_move_insn, not gen_movdi_er_high_g.
- (movdi_er_nofix, movdi_er_fix): Accept any symbolic operand.
-
-2002-01-03 Richard Henderson <rth@redhat.com>
-
- * local-alloc.c (function_invariant_p): Update commentary.
-
-2002-01-04 H.J. Lu <hjl@gnu.org>
-
- * toplev.c (rest_of_compilation): Fix a typo when calling
- cleanup_cfg.
-
-2002-01-03 Kazu Hirata <kazu@hxi.com>
-
- * c-common.c: Fix formatting.
- * diagnostic.c: Likewise.
- * doloop.c: Likewise.
- * dwarf2out.c: Likewise.
-
-2002-01-03 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/h8300.c (output_logical_op): Use 'not.w' instead
- of 'neg.w' when xoring with 0x0000ffff or 0xffff0000.
-
-2002-01-03 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cpperror.c: Update comments and copyright.
- * cppexp.c, cppfiles.c, cpphash.c, cpphash.h, cppinit.c,
- cpplex.c, cpplib.c, cpplib.h, cppmacro.c, cppmain.c: Similarly.
-
-2002-01-03 John David Anglin <dave@hiauly1.hia.nrc.ca>
-
- * collect2.c (main): Use strcmp when testing for "-shared".
-
-2002-01-03 Neil Booth <neil@daikokuya.demon.co.uk>
-
- * cppmacro.c: Don't include intl.h. Update comments.
- (new_number_token): Allocate enough buffer for 64-bit unsigned
- integers; update prototype.
- * cppmain.c: Update comments.
-
-2002-01-03 William Cohen <wcohen@redhat.com>
-
- * function.h (struct function): Add profile.
- (current_function_profile): New.
- doc/extend.texi: Update documentation.
- * final.c (final_start_function): Use current_function_profile
- instead of profile_flag.
- (profile_after_prologue): Likewise.
- * function.c (expand_function_start): Likewise.
- (expand_function_start): Likewise.
- * config/alpha/alpha.c (direct_call_operand):
- (alpha_does_function_need_gp): Likewise.
- (alpha_expand_prologue): Likewise.
- * config/arm/arm.c (arm_expand_prologue): Likewise.
- thumb_expand_prologue: Likewise.
- * config/d30v/d30v.c (d30v_stack_info): Likewise.
- * config/fr30/fr30.c (MUST_SAVE_RETURN_POINTER): Likewise.
- (fr30_expand_prologue): Likewise.
- * config/i386/cygwin.h (SUBTARGET_PROLOGUE): Likewise.
- * config/i386/i386.c (ix86_osf_output_function_prologue): Likewise.
- * config/i386/i386.h (FINALIZE_PIC): Likewise.
- * config/i386/win32.h (SUBTARGET_PROLOGUE): Likewise.
- * config/i960/i960.c (i960_output_function_prologue): Likewise.
- * config/ia64/ia64.c (ia64_compute_frame_size): Likewise.
- * config/m32r/m32r.c (MUST_SAVE_RETURN_ADDR): Likewise.
- (m32r_expand_prologue): Likewise.
- * config/m88k/m88k.c (m88k_layout_frame): Likewise.
- (m88k_expand_prologue): Likewise.
- * config/m88k/m88k.h (ADJUST_INSN_LENGTH): Likewise.
- * config/mips/mips.c (compute_frame_size): Likewise.
- (mips_expand_prologue): Likewise.
- (mips_can_use_return_insn): Likewise.
- * config/pa/elf.h (ASM_FILE_START): Likewise.
- * config/pa/pa-linux.h (ASM_FILE_START): Likewise.
- * config/pa/pa64-hpux.h (ASM_FILE_START): Likewise.
- * config/pa/som.h (ASM_FILE_START): Likewise.
- * config/romp/romp.c (romp_using_r14): Likewise.
- * config/rs6000/rs6000.c (first_reg_to_save): Likewise.
- (rs6000_stack_info): Likewise.
- * config/rs6000/sysv4.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
- * config/rs6000/xcoff.h (ASM_FILE_START): Likewise.
- * config/v850/v850.c (compute_register_save_size): Likewise.
-
-2002-01-03 Jakub Jelinek <jakub@redhat.com>
-
- * simplify-rtx.c (simplify_binary_operation) [DIV]: If
- gen_lowpart_common fails, use gen_lowpart_SUBREG.
-
-2002-01-03 Turly O'Connor <turly@apple.com>
-
- * darwin.c (machopic_output_possible_stub_label): Don't generate
- stub routines for pseudo-stubs which we've just defined.
-
-2002-01-03 Kazu Hirata <kazu@hxi.com>
-
- * builtins.c: Fix formatting.
- * c-typeck.c: Likewise.
- * combine.c: Likewise.
- * expr.c: Likewise.
- * loop.c: Likewise.
-
-2002-01-03 Andreas Schwab <schwab@suse.de>
-
- * cppfiles.c (_cpp_pop_file_buffer): Change return type to bool
- and return true if _cpp_push_next_buffer pushed a new include
- file.
- * cpplib.c (_cpp_pop_buffer): Only call obstack_free if
- _cpp_pop_file_buffer did not push a new file.
- * cpphash.h (_cpp_pop_file_buffer): Update declaration.
-
-2002-01-02 Eric Christopher <echristo@redhat.com>
-
- * final.c (final_scan_insn): Change 0 -> NULL_RTX in
- FIND_REG_INC_NOTE call. Update copyright.
- * loop.c (canonicalize_condition): Ditto.
- * reorg.c (delete_scheduled_jump): Ditto.
-
-2002-01-03 Kazu Hirata <kazu@hxi.com>
-
- * gcse.c: Fix formatting.
-
-2002-01-03 Graham Stott <grahams@redhat.com>
-
- * mkconfig.sh: Output to config.h, hconfig.h and tconfig.h
- forward defs for struct tags rtx_def, union_tree, rtvec_def
- also output corresponding typedefs for rtx, tree, and rtvec.
-
- * system.h: Move forward defs for struct tags rtx_def, union_tree,
- rtvec_def along with corresponding typedefs for rtx, tree, and
- rtvec to config.h, hconfig.h, tconfig.h.
-
-2002-01-03 Graham Stott <grahams@redhat.com>
-
- * tree.h: Update copyright date.
- (IS_EXPR_CODE_CLASS): Add parenthesis.
- (TREE_SET_CODE): Add whitespace.
- (TREE_CHECK): Add parenthesis.
- (TREE_CLASS_CODE): Add parenthesis and wrap long line.
- (CST_OR_CONSTRUCTOR_CHECK):
- (EXPR_CHECK): Add parenthis, whitespace and wrap line.
- (TREE_SYMBOL_REFERENCED): Whitespace.
- (INT_CST_LT): Likewise.
- (INT_CST_LT_UNSIGNED): Likewise.
- (tree_real_cst): Unwrap comment.
- (tree_string): Likewise.
- (tree_complex): Likewise.
- (IDENTIFIER_POINTER): correct cast.
- (SAVE_EXPR_CONTEXT): Whitespace.
- (EXPR_WFL_FILENAME_NODE): Likewise.
- (EXPR_WFL_FILENAME): Remove parenthesis.
- (DECL_ORIGIN): Add parenthesis.
- (DECL_FROM_INLINE): Use NULL_TREE.
- (build_int_2): Whitespace.
- (build_type_variant): Add parenthesis.
-
- * gcc/jcf-parse.c: Update copyright date.
- (yyparse): Constify resource_filename.
-
-2002-01-03 Graham Stott <grahams@redhat.com>
-
- * rtl.h: Update copyright date.
- (RTL_CHECK1): Wrap long line.
- (RTL_CHECK2): Likewise.
- (RTL_CHECKC1): Wrap long line and whitespace.
- (RTL_CHECKC2): Likewise.
- (XWINT): Whitespace.
- (XINT): Likewise.
- (XSTR): Likewise.
- (XEXP): Likewise.
- (XVEC): Likewise.
- (XMODE): Likewise.
- (XBITMAP): Likewise.
- (XTREE): Likewise.
- (XBBDEF): Likewise.
- (XTMPL): Likewise.
- (X0WINT): Likewise.
- (X0INT):Likewise.
- (X0UINT): Likewise.
- (X0STR): Likewise.
- (X0EXP): Likewise.
- (X0VEC): Likewise.
- (X0MODE): Likewise.
- (X0BITMAP): Likewise.
- (X0TREE): Likewise.
- (X0BBDEF): Likewise.
- (X0ADVFLAGS): Likewise.
- (X0CSELIB): Likewise.
- (X0MEMATTR): Likewise.
- (XCWINT): Likewise.
- (XCINT): Likewise.
- (XCUINT): Likewise.
- (XCSTR): Likewise.
- (XCEXP): Likewise.
- (XCVEC): Likewise.
- (XCMODE): Likewise.
- (XCBITMAP): Likewise.
- (XCTREE): Likewise.
- (XCBBDEF): Likewise.
- (XCADVFLAGS): Likewise.
- (XCCSELIB): Likewise.
- (XC2EXP): Likewise.
- (INSN_UID): Likewise.
- (PREV_INSN): Likewise.
- (PATTERN): Likewise.
- (INSN_CODE): Likewise.
- (PUT_REG_NOTE_KIND): Likewise.
- (CODE_LABEL_NUMBER): Likewise.
- (NOTE_SOURCE_FILE): Likewise.
- (NOTE_BLOCK): Likewise.
- (NOTE_EH_HANDLER): Likewise.
- (NOTE_RANGE_INFO): Likewise.
- (NOTE_LIVE_INFO): Likewise.
- (NOTE_BASIC_BLOCK): Likewise.
- (NOTE_EXPECTED_VALUE): Likewise.
- (NOTE_LINE_NUMBER): Likewise.
- (LABEL_NAME): Likewise.
- (LABEL_NUSES): Likewise.
- (LABEL_ALTERNATE_NAME): Likewise.
- (ADDRESSOF_DECL): Likewise.
- (JUMP_LABEL): Likewise.
- (LABEL_NEXTREF): Likewise.
- (REGNO): Likewise.
- (ORIGINAL_REGNO: Likewise.
- (HARD_REGISTER_NUM_P): Add parenthesis.
- (SUBREG_REG): Whitespace.
- (SUBREG_BYTE): Likewise.
- (ASM_OPERANDS_TEMPLATE): Remove parenthesis.
- (ASM_OPERANDS_OUTPUT_CONSTRAINT): Likewise.
- (ASM_OPERANDS_OUTPUT_IDX): Likewise.
- (ASM_OPERANDS_INPUT_VEC): Likewise.
- (ASM_OPERANDS_INPUT_CONSTRAINT_VEC): Likewise.
- (ASM_OPERANDS_INPUT): Likewise.
- (ASM_OPERANDS_INPUT_LENGTH): Likewise.
- (ASM_OPERANDS_INPUT_CONSTRAINT_EXP): Likewise.
- (ASM_OPERANDS_INPUT_CONSTRAINT): Likewise.
- (ASM_OPERANDS_INPUT_MODE): Likewise.
- (ASM_OPERANDS_SOURCE_FILE): Likewise.
- (ASM_OPERANDS_SOURCE_LINE): Likewise.
- (MEM_SET_IN_STRUCT_P): Minor reformat.
- (TRAP_CONDITION): Whitespace.
- (TRAP_CODE): Likewise.
- (COND_EXEC_TEST): Likewise.
- (COND_EXEC_CODE): Likewise.
- (FIND_REG_INC_NOTE): Uppercase macro args and add parenthesis.
- (PHI_NODE_P): Add parenthesis.
- (plus_constant): Whitespace and add parenthesis.
-
-2002-01-03 Kazu Hirata <kazu@hxi.com>
-
- * config/avr/avr.c: Fix comment typos.
- * config/c4x/c4x.md: Likewise.
- * config/dsp16xx/dsp16xx.h: Likewise.
- * config/dsp16xx/dsp16xx.md: Likewise.
- * config/i386/i386.md: Likewise.
- * config/ia64/ia64.c: Likewise.
- * config/m32r/m32r.h: Likewise.
- * config/m68hc11/m68hc11.md: Likewise.
- * config/mmix/mmix.c: Likewise.
- * config/mn10200/mn10200.c: Likewise.
- * config/romp/romp.c: Likewise.
- * config/sh/sh.c: Likewise.
- * config/stormy16/stormy16.c: Likewise.
- * config/stormy16/stormy16.h: Likewise.
- * config/stormy16/stormy16.md: Likewise.
-
-2002-01-03 Graham Stott <grahams@redhat.com>
-
- * loop.h: Update copyright date.
- (LOOP_MOVABLES): Fix typo.
- (LOOP_REGS): Likewise.
- (LOOP_IVS): Likewise.
-
-2002-01-03 Graham Stott <grahams@redhat.com>
-
- * cppinit.c: Update copyright date.
- Don't include output.h
- * Makefile.in: Update copyright date.
- Update dependency.
-
-2002-01-02 Craig Rodrigues <rodrigc@gcc.gnu.org>
-
- PR c/5226
- * invoke.texi (-mthreads): Remove from documented RS/6000 options.
- (-pthread) Add to RS/6000 options.
-
-2002-01-02 Kazu Hirata <kazu@hxi.com>
-
- * except.c: Fix comment typos.
- * loop.c: Likewise.
- * varasm.c: Likewise.
- * doc/tm.texi: Fix a typo.
-
-2002-01-02 Jakub Jelinek <jakub@redhat.com>
-
- * c-typeck.c (output_init_element): Allow initializing static storage
- duration objects with compound literals.
-
-2002-01-02 Richard Henderson <rth@redhat.com>
-
- * objc/objc-act.c (hack_method_prototype): Clear current_function_decl
- after abusing it.
-
-2002-01-02 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
- * gcc.c (default_compilers): Const-ify.
- * mips-tdump.c (stab_names): Likewise.
- * mips-tfile.c (map_coff_types, map_coff_storage,
- map_coff_sym_type, map_coff_derived_type, stabs_symbol,
- pseudo_ops_t, pseudo_ops): Likewise.
- * protoize.c (default_include): Likewise
-
- * real.c (GET_REAL, PUT_REAL): Don't cast away const-ness.
- (ezero, ehalf, eone, etwo, e32, elog2, esqrt2, epi): Const-ify.
- Add array size in declaration.
- (endian, emov, eisneg, eisinf, eisnan, eiisnan, eiisneg, emovi,
- emovo, emovz, eiisinf, ecmpm, eaddm, esubm, m16m, edivm, emulm,
- esub, eadd, eadd1, ediv, emul, e53toe, e64toe, e113toe, e24toe,
- etoe113, etoe64, etoe53, etoe24, ecmp, eround, ltoe, ultoe,
- eifrac, euifrac, e24toasc, e53toasc, e64toasc, e113toasc, etoasc,
- efloor, efrexp, eldexp, eremain, dectoe, etodec, ibmtoe, etoibm,
- c4xtoe, etoc4x, uditoe, ditoe, etoudi, etodi, esqrt, etens,
- emtens, make_nan): Const-ify.
- (TFbignan, TFlittlenan, XFbignan, XFlittlenan, DFbignan,
- DFlittlenan, SFbignan, SFlittlenan): Make static and const-ify.
-
-2002-01-02 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * config.gcc (ia64-*-*): Set extra_headers.
- (alpha*-dec-osf*): Likewise. Don't use alpha/t-osf.
- * config/alpha/t-osf: Remove.
- * config/ia64/t-ia64 (EXTRA_HEADERS): Remove.
-
-2002-01-02 David Edelsohn <edelsohn@gnu.org>
-
- * config/rs6000/t-aix43: Revert previous change.
-
-2002-01-02 Jason Merrill <jason@redhat.com>
-
- * c-decl.c (c_expand_body): Call outlining_inline_function when
- emitting an inline function out of line.
-
-2002-01-02 Richard Henderson <rth@redhat.com>
-
- * dwarf2out.c (limbo_die_node): Add created_for member.
- (new_die): New argument created_for. Update all callers.
- (mark_limbo_die_list): New.
- (dwarf2out_init): Register limbo_die_list as a root.
- (dwarf2out_finish): Force insert limbo dies into their function
- context.
-
-2002-01-02 Nathan Sidwell <nathan@codesourcery.com>
-
- PR c++/5089
- * doc/invoke.texi (-Wold-style-cast): Only warn about non-void casts.
-
-2002-01-02 Kazu Hirata <kazu@hxi.com>
-
- * config/h8300/fixunssfsi.c: Update copyright.
- Fix comment typos.
- Fix formatting.
- * config/h8300/h8300.c: Update copyright.
- Eliminate warnings.
-
-2002-01-02 Kazu Hirata <kazu@hxi.com>
-
- * config/romp/romp.c: Fix comment formatting.
- * config/romp/romp.h: Likewise.
- * config/romp/romp.md: Likewise.
- * config/s390/s390.c: Likewise.
- * config/stormy16/stormy16.c: Likewise.
- * config/stormy16/stormy16.h: Likewise.
-
-2002-01-02 Alexandre Oliva <aoliva@redhat.com>
-
- * c-common.h (genrtl_expr_stmt_value): Declare.
- * c-semantics.c (genrtl_goto_stmt): Redirect to...
- (genrtl_goto_stmt_value): ... this new function. Pass new
- argument down to expand_expr_stmt_value, taking
- TREE_ADDRESSABLE into account.
- * c-common.c (c_expand_expr): Mark the last EXPR_STMT of a
- STMT_EXPR as addressable, i.e., one whose result we want.
- * expr.c (expand_expr): Don't save expression statement value
- of labeled_blocks or loop_exprs.
- * stmt.c (expand_expr_stmt): Redirect to...
- (expand_expr_stmt_value): ... this new function. Use new
- argument to tell whether to save expression value.
- (expand_end_stmt_expr): Reset last_expr_type and
- last_expr_value if we don't have either.
- * tree-inline.c (declare_return_variable): Mark its use
- statement as addressable.
- * tree.h: Document new use of TREE_ADDRESSABLE.
- (expand_expr_stmt_value): Declare.
-
-2002-01-01 Tom Rix <trix@redhat.com>
-
- * config/rs6000/rs6000.c (rs6000_emit_set_long_const): Fix for use by
- rs6000_emit_allocate_stack.
-
-2002-01-01 Joseph S. Myers <jsm28@cam.ac.uk>
-
- * configure.in: Prepend ${srcdir}/config/${cpu_type}/ instead of
- ${srcdir}/ginclude/ to every entry in extra_headers.
- * configure: Regenerate.
- * ginclude/math-3300.h: Rename to config/m68k/math-3300.h.
- * ginclude/math-68881.h: Rename to config/m68k/math-68881.h.
- * ginclude/ppc-asm.h: Rename to config/rs6000/ppc-asm.h.
- * ginclude/proto.h: Rename to config/convex/proto.h.
-
-Tue Jan 1 17:12:56 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * attribs.c (handle_vector_size_attribute): Use host_integerp
- and tree_int_cst; remove warnings.
- * caller-save.c (insert_restore): Add cast to get rid of warning.
- (insert_save): Likewise.
- * emit-rtl.c (adjust_address_1, offset_address): Likewise.
- * regmove.c (find_matches): Add temporary var to kill a warning.
-
-2002-01-01 Douglas B Rupp <rupp@gnat.com>
-
- * config/alpha/vms.h (DWARF2_UNWIND_INFO, EH_RETURN_HANDLER_RTX,
- LINK_EH_SPEC, MD_FALLBACK_FRAME_STATE_FOR): Define.
- * config/alpha/t-vms (EXTRA_PARTS): Add vms-dwarf2eh.o
- (vms-dwarf2eh.o): Add Makefile rule.
- * config/alpha/vms-ld.c (main): Handle vms-dwarf2eh.o.
- * config/alpha/vms-dwarf2eh.asm: New file.
-
- * gcc.c (delete_if_ordinary): Delete all versions.
-
-2002-01-01 Hans-Peter Nilsson <hp@bitrange.com>
-
- * config/mmix/mmix.md: Update FIXME to not mention
- define_constants.
- (MMIX_rJ_REGNUM): New define_constants constant.
- ("movqi", "movsi", "movdi", "*movdicc_real_foldable",
- "*movdicc_real"): Adjust contraints formatting.
- ("*bCC_foldable"): Add %+ for P in output format and delete FIXME
- for branch prediction.
- ("*bCC", "*bCC_inverted_foldable", "*bCC_inverted"): Add %+ in
- output template.
- ("*call_real", "*call_value_real", "nonlocal_goto_receiver",
- "*nonlocal_goto_receiver_expanded"): Use MMIX_rJ_REGNUM instead of
- number. Delete related FIXMEs.
- * config/mmix/mmix.h (MMIX_INCOMING_RETURN_ADDRESS_REGNUM): Change
- from number to MMIX_rJ_REGNUM.
- (TARGET_MASK_BRANCH_PREDICT): New.
- (TARGET_DEFAULT): Change to TARGET_MASK_BRANCH_PREDICT.
- (TARGET_SWITCHES): Update comment. Correct -mno-toplevel-symbols
- value. Add -mbranch-predict and -mno-branch-predict.
- (TARGET_VERSION): Drop date.
- (ADDITIONAL_REGISTER_NAMES): Use MMIX_rJ_REGNUM, not number.
- * config/mmix/mmix.c (mmix_encode_section_info): Correct condition
- for finding out global symbols.
- (mmix_asm_output_labelref): Revert condition for global symbol.
- (mmix_print_operand): <case '+'>: Emit P for a likely branch.
- (mmix_print_operand_punct_valid_p): A '+' is valid.
-
-See ChangeLog.6 for earlier changes.
+See ChangeLog.7 for earlier changes.
diff --git a/gcc/ChangeLog.0 b/gcc/ChangeLog.0
index 5cd3fdb47d9..4ed06520ca4 100644
--- a/gcc/ChangeLog.0
+++ b/gcc/ChangeLog.0
@@ -2670,7 +2670,7 @@ Thu Jun 4 01:26:57 1998 Craig Burley <burley@gnu.org>
Thu Jun 4 00:54:21 1998 Graham <grahams@rcp.co.uk>
- * loop.c (check_dbra_loop): Initialise final_value before
+ * loop.c (check_dbra_loop): Initialize final_value before
normalizing the loop.
Wed Jun 3 20:00:04 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
@@ -4435,7 +4435,7 @@ Sun May 3 23:57:25 1998 Robert Lipe <robertl@dgii.com>
Sun May 3 13:51:34 1998 Richard Henderson <rth@cygnus.com>
- Support for official Sparc V9 ABI:
+ Support for official SPARC V9 ABI:
* sparc.c (sparc_override_options): Force stack bias off for !arch64.
Care for flag_pcc_struct_return default.
(output_move_quad): Rewrite to move by halves on v9 and in the
@@ -6574,8 +6574,8 @@ Wed Mar 11 12:05:20 1998 Teemu Torma <tot@trema.com>
* gthr.h: Changed the comment about return values.
* gthr-solaris.h (__gthread_once): Do not use errno; return the
error number instead of -1.
- (__gthread_key_create): Any non-zero return value is an error.
- * libgcc2.c (eh_context_initialize): Check for non-zero return
+ (__gthread_key_create): Any nonzero return value is an error.
+ * libgcc2.c (eh_context_initialize): Check for nonzero return
value from __gthread_once.
Check that the value of get_eh_context was really changed.
@@ -10440,7 +10440,7 @@ Tue Nov 4 20:36:50 1997 Richard Henderson (rth@cygnus.com)
* alpha.c (alpha_handle_trap_shadows): Init sum.defd to zero.
- * alpha.md (attr trap): Make TRAP_YES non-zero for sanity's sake.
+ * alpha.md (attr trap): Make TRAP_YES nonzero for sanity's sake.
Tue Nov 4 18:49:42 1997 Jeffrey A Law (law@cygnus.com)
@@ -12000,7 +12000,7 @@ Wed Sep 10 11:49:20 1997 Jason Merrill <jason@yorick.cygnus.com>
EXCEPTION_SECTION, mark the start of the frame info with a
collectible tag.
* collect2.c (frame_tables): New list.
- (is_ctor_dtor): Recognise frame entries.
+ (is_ctor_dtor): Recognize frame entries.
(scan_prog_file): Likewise.
(main): Pass -fno-exceptions to sub-compile. Also do collection
if there are any frame entries.
diff --git a/gcc/ChangeLog.1 b/gcc/ChangeLog.1
index 05305362c0d..7391715b244 100644
--- a/gcc/ChangeLog.1
+++ b/gcc/ChangeLog.1
@@ -469,7 +469,7 @@ Sun May 2 15:16:42 1999 Joseph S. Myers <jsm28@cam.ac.uk>
(ASSEMBLER_DIALECT): Define.
(CONDITIONAL_REGISTER_USAGE): Rename floating point registers if
required for the UNIX assembler.
- (ASM_OUTPUT_INT): Remove. The compiler will synthesise it.
+ (ASM_OUTPUT_INT): Remove. The compiler will synthesize it.
(ASM_OUTPUT_ADDR_VEC_PROLOGUE): Remove.
(ASM_OPEN_PAREN, ASM_CLOSE_PAREN): Change to "[" and "]".
(TRAMPOLINE_TEMPLATE): Use ASM_OUTPUT_SHORT.
@@ -2152,7 +2152,7 @@ Fri Apr 2 12:58:26 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
Fri Apr 2 12:19:17 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.md (*db): Enable pattern if TARGET_LOOP_UNSIGNED
- is non-zero.
+ is nonzero.
(movstrqi_small, movstrqi_large, *cmpstrqi): Add + modifier to address
register constraints.
(*movhi_clobber+1): Modify splitter pattern to handle destination
@@ -4287,7 +4287,7 @@ Thu Feb 25 21:52:54 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
in registers.
* expr.h (PRETEND_OUTGOING_VARARGS_NAMED): Provide default definition.
- * function.c (assign_parms): Honour PRETEND_OUTGOING_VARARGS_NAMED.
+ * function.c (assign_parms): Honor PRETEND_OUTGOING_VARARGS_NAMED.
* calls.c (expand_call): Likewise.
* sh.c (sh_expand_prologue): For TARGET_HITACHI, don't push varargs /
@@ -4454,7 +4454,7 @@ Mon Feb 22 19:36:33 1999 Andrew Cagney <cagney@b1.cygnus.com>
StrongARM.
(arm_is_6_or_7): New variable: true iff the target processor is an
ARM6 or and ARM7.
- (arm_select): Fields reorganised.
+ (arm_select): Fields reorganized.
(struct processors): processor_type field removed.
(all_procs): Remove.
(all_cores): New array: Definitions of all known ARM cpu cores.
@@ -5184,10 +5184,10 @@ Mon Feb 8 21:31:06 1999 Richard Henderson <rth@cygnus.com>
(scan_loop): ... moved out of here. Always initialize.
Test loop_has_call instead of reg_single_usage not zero.
Free reg_single_usage after strength reduction.
- (count_loop_regs_set): Assume single_usage non-zero.
+ (count_loop_regs_set): Assume single_usage nonzero.
(combine_givs_used_by_other): Test reg_single_usage.
(load_mems_and_recount_loop_regs_set): Remove reg_single_usage
- as a parameter. Assume non-zero.
+ as a parameter. Assume nonzero.
1999-02-08 Zack Weinberg <zack@midnite.ec.rhno.columbia.edu>
@@ -7018,7 +7018,7 @@ Thu Jan 7 03:08:17 1999 Richard Henderson <rth@cygnus.com>
Thu Jan 7 03:03:42 1999 Stan Cox <scox@cygnus.com>
Richard Henderson <rth@cygnus.com>
- Support for Hypersparc and Sparclite86x:
+ Support for HyperSPARC and SPARClite86x:
* sparc.h (TARGET_CPU_hypersparc, TARGET_CPU_sparclite86x): New.
(CPP_CPU32_DEFAULT_SPEC): Fix up for the new targets.
(ASM_CPU32_DEFAULT_SPEC): Likewise.
@@ -10282,7 +10282,7 @@ Wed Oct 28 16:46:07 1998 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
Wed Oct 28 14:06:49 1998 Jim Wilson <wilson@cygnus.com>
* dwarfout.c (dwarfout_file_scope_decl): If DECL_CONTEXT, don't abort
- if pending_types is non-zero.
+ if pending_types is nonzero.
(dwarfout_finish): Verify pending_types is zero before finishing.
Wed Oct 28 10:29:09 1998 Nick Clifton <nickc@cygnus.com>
@@ -11967,7 +11967,7 @@ Fri Oct 9 14:26:44 1998 Jeffrey A Law (law@cygnus.com)
Fri Oct 9 11:44:47 1998 David Edelsohn <edelsohn@gnu.org>
- * loop.c (insert_bct): Ensure loop_iteration_var non-zero before use.
+ * loop.c (insert_bct): Ensure loop_iteration_var nonzero before use.
Thu Oct 8 21:59:47 1998 Dave Brolley <brolley@cygnus.com>
@@ -13059,7 +13059,7 @@ Sat Sep 19 12:05:09 1998 Richard Henderson <rth@cygnus.com>
Sat Sep 19 07:33:36 1998 Richard Earnshaw (rearnsha@arm.com)
* arm.c (add_constant): New parameter address_only, change caller.
- Set it non-zero if taking the address of an item in the pool.
+ Set it nonzero if taking the address of an item in the pool.
(arm_reorg): Handle cases where we need the address of an item in
the pool.
@@ -13371,7 +13371,7 @@ Sun Sep 13 08:13:39 1998 Ben Elliston <bje@cygnus.com>
runtime library will do this.
* objc/Make-lang.in: Do not build the runtime library or install
- the Objective C header files. The Makefile for the runtime
+ the Objective-C header files. The Makefile for the runtime
library will do this.
* objc/Makefile.in (all.indirect): Only build the front-end.
@@ -15068,7 +15068,7 @@ Mon Aug 10 19:02:55 1998 John Carr <jfc@mit.edu>
Mon Aug 10 04:28:13 1998 David S. Miller <davem@pierdol.cobaltmicro.com>
Richard Henderson <rth@cygnus.com>
- Rewrite Sparc backend for better code generation and
+ Rewrite SPARC backend for better code generation and
improved sparc64 support.
* config/sparc/sp64-elf.h: Set JUMP_TABLES_IN_TEXT_SECTION to
zero.
@@ -15155,7 +15155,7 @@ Mon Aug 10 04:28:13 1998 David S. Miller <davem@pierdol.cobaltmicro.com>
(define_function_unit ieu1): New, executes compare, call, and
uncond_branch type insns.
(define_function_units for type fdivs, fdivd, fsqrt): These
- execute in the fpu multiply unit not the adder on UltraSparc.
+ execute in the fpu multiply unit not the adder on UltraSPARC.
(define_expand cmpdi): Disallow TARGET_V8PLUS.
(define_insn cmpsi_insn): Rename to cmpsi_insn_sp32.
(define_insn cmpsi_insn_sp64): New, same as sp32 variant except it
@@ -15570,7 +15570,7 @@ Mon Jul 27 14:22:36 1998 Dave Brolley <brolley@cygnus.com>
Mon Jul 27 11:43:54 1998 Stan Cox <scox@cygnus.com>
- * longlong.h (count_leading_zeros): Sparclite scan instruction was
+ * longlong.h (count_leading_zeros): SPARClite scan instruction was
being invoked incorrectly.
* i386.c (ix86_prologue): Added SUBTARGET_PROLOGUE invocation.
diff --git a/gcc/ChangeLog.2 b/gcc/ChangeLog.2
index e49d764994a..a7cff363cd6 100644
--- a/gcc/ChangeLog.2
+++ b/gcc/ChangeLog.2
@@ -262,7 +262,7 @@ Fri Dec 24 12:34:26 1999 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
Thu Dec 23 23:15:22 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
- * reload1.c (emit_input_reload_insns): Restore old behaviour
+ * reload1.c (emit_input_reload_insns): Restore old behavior
wrt. 'special' reloads.
1999-12-23 Zack Weinberg <zack@wolery.cumb.org>
@@ -1531,7 +1531,7 @@ Thu Dec 2 18:59:48 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
1999-12-02 Nick Clifton <nickc@cygnus.com>
- * config/fp-bit.c: Initialise all fields of the NAN
+ * config/fp-bit.c: Initialize all fields of the NAN
constants.
* c-lex.c (check_newline): Pass pragma_getc and pragma_ungetc
@@ -2434,10 +2434,10 @@ Thu Nov 18 11:10:03 1999 Jan Hubicka <hubicka@freesoft.cz>
1999-11-18 Nick Clifton <nickc@cygnus.com>
- * toplev.c (main): Correctly detect an unrecognised option.
+ * toplev.c (main): Correctly detect an unrecognized option.
* cppinit.c (cpp_handle_option): Do not claim to have consumed
- a -f option if it has not been recognised.
+ a -f option if it has not been recognized.
Thu Nov 18 00:59:11 1999 Michael Gschwind <mikeg@alagoas.watson.ibm.com>
@@ -3184,13 +3184,13 @@ Wed Nov 3 15:11:27 1999 David S. Miller <davem@redhat.com>
* config/sparc/sparc.md: Remove insn type fpsqrt, add fpsqrts
and fpsqrtd. Use them and create fdiv function unit to more
- accurately represent fpu sqrt pipeline semantics on UltraSparc.
+ accurately represent fpu sqrt pipeline semantics on UltraSPARC.
* config/sparc/sparc.c: Account for fpsqrt{s,d} changes.
Wed Nov 3 15:11:27 1999 Matteo Frigo <athena@fftw.org>
* config/sparc/sparc.md: Adjust FADD/FMUL result latencies to
- 3 on UltraSparc.
+ 3 on UltraSPARC.
* config/sparc/sparc.c (ultra_schedule_insn): Insert launched
insn into ready list, do not use just a raw swap.
@@ -3567,7 +3567,7 @@ Sat Oct 30 14:31:48 1999 Richard Henderson <rth@cygnus.com>
(ggc_alloc_obj): Likewise. Use a different pattern than poison_pages.
(ggc_collect): Poison before sweeping.
* ggc-simple.c: Update pre-function commentary.
- (ggc_alloc_obj): Poison non-zeroed memory.
+ (ggc_alloc_obj): Poison nonzeroed memory.
Sat Oct 30 14:28:52 1999 Mark Mitchell <mark@codesourcery.com>
@@ -4002,7 +4002,7 @@ Mon Oct 18 21:16:06 1999 Fred Fish <fnf@be.com>
Thu Oct 28 10:00:48 1999 Nick Clifton <nickc@cygnus.com>
- * config/arm/arm.c: Initialise arm_structure_size_boundary to
+ * config/arm/arm.c: Initialize arm_structure_size_boundary to
DEFAULT_STRUCTURE_SIZE_BOUNDARY.
* config/arm/arm.h (DEFAULT_STRUCTURE_SIZE_BOUNDARY): Define
to the value 32 if it has not already been defined.
@@ -4782,7 +4782,7 @@ Tue Oct 19 15:26:11 1999 Richard Earnshaw (rearnsha@arm.com)
Tue Oct 19 14:01:34 1999 Nick Clifton <nickc@cygnus.com>
* toplev.c (main): Do not generate an error message if an
- unrecognised command line switch is recognisable by another
+ unrecognized command line switch is recognisable by another
language. If extra_warnings are enabled, then generate a
warning message instead.
@@ -4960,7 +4960,7 @@ Sat Oct 16 13:42:29 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
Sat Oct 16 13:37:46 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
- * config/c4x/c4x.md (movstrqi_small): Utilise parallel move
+ * config/c4x/c4x.md (movstrqi_small): Utilize parallel move
instructions.
Sat Oct 16 13:26:47 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
@@ -6509,15 +6509,15 @@ Sat Sep 25 09:03:17 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
Sat Sep 25 13:42:15 1999 Nick Clifton <nickc@cygnus.com>
* varasm.c (asm_emit_uninitialised): New function: Generate
- the assembler statements necessary to declare an uninitialised
+ the assembler statements necessary to declare an uninitialized
variable.
- (ASM_EMIT_LOCAL): New macro: Emit a local, uninitialised
+ (ASM_EMIT_LOCAL): New macro: Emit a local, uninitialized
variable.
(ASM_EMIT_BSS): New macro: Emit an entry in the bss section.
(ASM_EMIT_COMMON): New macro: Emit an entry in the common
section.
(assemble_variable): Use asm_emit_uninitialised to emit an
- uninitialised variable.
+ uninitialized variable.
Fri Sep 24 17:10:56 1999 Nick Clifton <nickc@cygnus.com>
@@ -8316,7 +8316,7 @@ Thu Sep 9 13:46:06 1999 Geoffrey Keating <geoffk@cygnus.com>
* cppexp.c (cpp_lex): Handle `defined (xxx)' for poisoned xxx.
Include cpphash.h.
* cpphash.c (special_symbol): Handle plain `xxx' for poisoned xxx.
- * cpplib.c (do_define): Generalise to handle poisoned definitions,
+ * cpplib.c (do_define): Generalize to handle poisoned definitions,
redefining poisoned identifiers, etc.
(do_undef): Don't allow poisoned identifiers to be undefined.
(do_pragma): Add #pragma poison.
@@ -8325,7 +8325,7 @@ Thu Sep 9 13:46:06 1999 Geoffrey Keating <geoffk@cygnus.com>
* cccp.c: Add T_POISON node type.
(special_symbol): Handle `defined(xxx)' and plain `xxx' for
poisoned xxx.
- (do_define): Generalise to handle poisoned definitions,
+ (do_define): Generalize to handle poisoned definitions,
redefining poisoned identifiers, etc.
(do_undef): Don't allow poisoned identifiers to be undefined.
(do_pragma): Add #pragma poison.
@@ -9759,7 +9759,7 @@ Sun Aug 29 04:30:52 1999 John Wehle (john@feith.com)
All uses updated.
(prescan_loop, strength_reduce): New argument loop_info. All callers
updated.
- (scan_loop): New variable loop_info, initialise to address of
+ (scan_loop): New variable loop_info, initialize to address of
this_loop_info.
(prescan_loop): Set loop_info->vtop if find NOTE_INSN_LOOP_VTOP.
Delete variable loop_has_multiple_exit targets and replace with
@@ -14093,7 +14093,7 @@ Wed Jun 2 12:25:55 1999 Richard Henderson <rth@cygnus.com>
Wed Jun 2 08:42:55 1999 Nick Clifton <nickc@cygnus.com>
- * config/arm/tcoff.h (USER_LABEL_PREFIX): Synchronise with
+ * config/arm/tcoff.h (USER_LABEL_PREFIX): Synchronize with
definition in config/arm/coff.h
* config/arm/coff.h: Add comment about USER_LABEL_PREFIX.
diff --git a/gcc/ChangeLog.3 b/gcc/ChangeLog.3
index c3a4461d4af..067d9adb68f 100644
--- a/gcc/ChangeLog.3
+++ b/gcc/ChangeLog.3
@@ -1353,7 +1353,7 @@ Wed Jun 7 20:34:33 2000 Denis Chertykov <denisc@overta.ru>
* c-common.h (c_language_kind): New type.
(c_language): New variab.e
* c-common.c (lang_get_alias_set): Don't put structures in
- non-zero alias sets in C++.
+ nonzero alias sets in C++.
* c-decl.c (c_language): Define it.
* c-lex.c (doing_objc_thang): Remove.
* c-tree.h (doing_objc_thang): Make it a macro.
@@ -1538,7 +1538,7 @@ Mon Jun 5 06:46:28 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2000-06-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
- * Makefile.in (intl.*): Honor non-zero exit codes in the intl
+ * Makefile.in (intl.*): Honor nonzero exit codes in the intl
subdir.
2000-06-03 Geoff Keating <geoffk@cygnus.com>
@@ -2036,7 +2036,7 @@ Sun May 28 18:37:07 2000 Clinton Popetz <cpopetz@cygnus.com>
Sun May 28 23:26:59 2000 Philippe De Muyter <phdm@macqel.be>
- * mklibgcc.in (all): Variable initialised to `libgcc'.
+ * mklibgcc.in (all): Variable initialized to `libgcc'.
2000-05-28 Gabriel Dos Reis <gdr@codesourcery.com>
@@ -2088,10 +2088,10 @@ Sun May 28 23:26:59 2000 Philippe De Muyter <phdm@macqel.be>
* regclass.c [CLASS_CANNOT_CHANGE_SIZE]
(class_can_change_size): New variable.
(reg_changes_size): New variable.
- (init_reg_sets_1): Initialise class_can_change_size.
+ (init_reg_sets_1): Initialize class_can_change_size.
(record_operand_costs): Remove subreg_changes_size.
Don't pass it around. Instead update reg_changes_size.
- (regclass): Initialise and free reg_changes_size. If a register
+ (regclass): Initialize and free reg_changes_size. If a register
changes size, don't preference it to a class that contains
registers that can't change size.
(record_reg_classes): Don't look at subreg_changes_size.
@@ -2161,7 +2161,7 @@ Sun May 28 23:26:59 2000 Philippe De Muyter <phdm@macqel.be>
* reload.c (get_secondary_mem): Don't widen floating-point modes.
- * combine.c (subst): Honour CLASS_CANNOT_CHANGE_SIZE when
+ * combine.c (subst): Honor CLASS_CANNOT_CHANGE_SIZE when
substituting the REG in a (subreg:X (reg:Y ...)).
2000-05-28 Neil Booth <NeilB@earthling.net>
@@ -2174,7 +2174,7 @@ Sun May 28 23:26:59 2000 Philippe De Muyter <phdm@macqel.be>
2000-05-28 Neil Booth <NeilB@earthling.net>
- * cpplex.c (_cpp_init_toklist): No comment space to initialise.
+ * cpplex.c (_cpp_init_toklist): No comment space to initialize.
(_cpp_free_toklist): No comment space to free.
(expand_comment_space): Remove.
(save_comment_space): Place the comment in the current token and
@@ -2340,7 +2340,7 @@ Sat May 27 11:01:27 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
boolean_operator for the boolean patterns without NOTs.
* config/rs6000/rs6000.c (reg_or_logical_cint_operand): Rename
- from reg_or_u_cint_operand. Change comment and behaviour.
+ from reg_or_u_cint_operand. Change comment and behavior.
(logical_operand): Clean up, add assertion.
(non_logical_cint_operand): Also check for
reg_or_logical_cint_operand.
@@ -3133,7 +3133,7 @@ Fri May 19 06:49:35 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2000-05-18 Nick Clifton <nickc@cygnus.com>
* config/arm/unknown-elf.h (UNIQUE_SECTION): Place constant,
- uninitialised data in .rodata not .bss, and do not interpret an
+ uninitialized data in .rodata not .bss, and do not interpret an
error in the initialisation value as meaning that the variable
should be placed in the .bss section.
@@ -3225,7 +3225,7 @@ Thu May 18 12:10:18 2000 Philippe De Muyter <phdm@macqel.be>
2000-05-18 Neil Booth <NeilB@earthling.net>
- * cppinit.c (cpp_reader_init): Initialise col_adjust and
+ * cppinit.c (cpp_reader_init): Initialize col_adjust and
default tab stop size.
(no_num, OPT_ftabstop): New.
(handle_option): Handle "ftabstop=" command-line option.
@@ -7957,7 +7957,7 @@ Wed Apr 5 18:03:31 2000 Toshiyasu Morita (toshi.morita@sega.com)
2000-04-05 Chris Demetriou <cgd@netbsd.org>
* mips.h (MASK_DEBUG_A, MASK_DEBUG_B, MASK_DEBUG_C): Zero the
- remaining non-zero debugging masks.
+ remaining nonzero debugging masks.
Wed Apr 5 09:44:07 2000 Jeffrey A Law (law@cygnus.com)
@@ -10256,7 +10256,7 @@ Thu Mar 16 02:14:16 2000 Hans-Peter Nilsson <hp@bitrange.com>
2000-02-03 Geoff Keating <geoffk@cygnus.com>
* rs6000.c (rs6000_sr_alias_set): New variable.
- (rs6000_override_options): Initialise rs6000_sr_alias_set.
+ (rs6000_override_options): Initialize rs6000_sr_alias_set.
(rs6000_emit_stack_tie): New function.
(rs6000_emit_allocate_stack): Specify RTX_FRAME_RELATED_P
in a way that dwarf2out can understand.
@@ -10804,8 +10804,8 @@ Wed Feb 23 13:00:06 CET 2000 Jan Hubicka <jh@suse.cz>
2000-03-14 Nick Clifton <nickc@cygnus.com>
* gcc.c (do_spec_1): Catch the case where %* is used in a
- substitution pattern, but it has not been initialised.
- Issue a meaningful error message if an unrecognised operator
+ substitution pattern, but it has not been initialized.
+ Issue a meaningful error message if an unrecognized operator
is encountered in a spec string.
2000-03-14 Richard Earnshaw <rearnsha@arm.com>
@@ -15005,7 +15005,7 @@ Mon Jan 24 16:50:08 MET 2000 Jan Hubicka <jh@suse.cz>
* basic-block.h (struct loops): New field `levels'.
* flow.c (flow_loops_level_compute): Traverse all outer loops.
- (flow_loop_level_compute): Initialise level to 1.
+ (flow_loop_level_compute): Initialize level to 1.
(flow_loops_find): Set loops->levels.
(flow_loops_dump): Print loops->levels.
@@ -15047,7 +15047,7 @@ Mon Jan 24 16:50:08 MET 2000 Jan Hubicka <jh@suse.cz>
2000-01-22 Alan Modra <alan@SPRI.Levels.UniSA.Edu.Au>
- * config/elfos.h (UNIQUE_SECTION): Restore uninitialised data
+ * config/elfos.h (UNIQUE_SECTION): Restore uninitialized data
section naming to that prior to 2000-01-07 patch.
* config/mips/elf.h (UNIQUE_SECTION): Ditto.
* config/mips/elf64.h (UNIQUE_SECTION): Ditto.
@@ -15242,7 +15242,7 @@ Wed Jan 19 19:12:36 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
* loop.c (current_loop_info): Renamed from loop_info_data
and changed to a pointer.
(loop_optimize): Allocate loop_info structure for each loop
- and initialise to zero.
+ and initialize to zero.
(scan_loop): Set current_loop_info.
* unroll.c (loop_iterations): Don't abort if REG_USERVAR_P set
@@ -15281,7 +15281,7 @@ Wed Jan 19 19:12:36 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
(expand_end_bindings): Likewise.
(expand_decl): Likewise. Consult optimize not obey_regdecls.
* toplev.c (obey_regdecls): Remove.
- (rest_of_compilation): Don't set it. Kill stupid in favour of
+ (rest_of_compilation): Don't set it. Kill stupid in favor of
flow1, local-alloc, and reload.
(main): Don't set obey_regdecls.
@@ -16500,25 +16500,25 @@ Thu Jan 6 13:44:59 CET 2000 Jan Hubicka <jh@suse.cz>
uninitialized data decls.
* config/i386/winnt.c (i386_pe_unique_section): Cope with
- being called for uninitialised data.
+ being called for uninitialized data.
* config/i386/interix.c (i386_pe_unique_section): Cope with
- being called for uninitialised data.
+ being called for uninitialized data.
* config/mips/elf.h (UNIQUE_SECTION): Cope with being called
- for uninitialised data.
+ for uninitialized data.
* config/mips/elf64.h (UNIQUE_SECTION): Cope with being called
- for uninitialised data.
+ for uninitialized data.
* config/mips/iri6gld.h (UNIQUE_SECTION): Cope with being called
- for uninitialised data.
+ for uninitialized data.
* config/arm/unknown-elf.h (IN_NAMED_SECTION): Define.
(UNIQUE_SECTION_P): Always generate a unique section if
flag_data_sections is true.
(UNIQUE_SECTION): Also generate unique sections for
- uninitialised data.
+ uninitialized data.
(ASM_OUTPUT_ALIGNED_BSS): Redefine to use named_section().
(ASM_OUTPUT_ALIGNED_DECL_LOCAL): Redefine to use
named_section().
@@ -16611,7 +16611,7 @@ Tue Jan 4 22:30:16 2000 Jeffrey A Law (law@cygnus.com)
2000-01-05 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
- * config/c4x/c4x.h (IS_XXX_REG, IS_XXX_REGNO): Swap behaviour of
+ * config/c4x/c4x.h (IS_XXX_REG, IS_XXX_REGNO): Swap behavior of
macros so that they're consistent with their names.
* config/c4x/c4x.c (IS_XXX_REG, IS_XXX_REGNO): Likewise.
* config/c4x/c4x.md (IS_XXX_REG, IS_XXX_REGNO): Likewise.
diff --git a/gcc/ChangeLog.4 b/gcc/ChangeLog.4
index 129c1f9f5c5..ac0f7e0ffd0 100644
--- a/gcc/ChangeLog.4
+++ b/gcc/ChangeLog.4
@@ -142,7 +142,7 @@
* c-parse.in (select_or_iter_stmt): Use truthvalue_conversion
on the condition of a FOR statement, so that it gets typechecked
- and optimised.
+ and optimized.
2000-12-29 Alexandre Oliva <aoliva@redhat.com>
@@ -300,7 +300,7 @@
scavenging it.
* dwarf2out_frame_debug_expr: Allow the (scratch) frame
- pointer to be initialised from the stack pointer plus a
+ pointer to be initialized from the stack pointer plus a
constant.
2000-12-22 Bernd Schmidt <bernds@redhat.com>
@@ -355,7 +355,7 @@
* reload.c (update_auto_inc_notes): New, broken out from ...
(find_reloads_address_1): ... use here, also correct possible
- use of uninitialised reloadnum.
+ use of uninitialized reloadnum.
2000-12-21 David O'Brien <obrien@FreeBSD.org>
@@ -1235,7 +1235,7 @@ Mon Dec 11 13:51:09 2000 Jeffrey A Law (law@cygnus.com)
arm_compute_save_reg_mask.
(arm_expand_prologue): Use arm_current_func_type and
arm_compute_save_reg_mask.
- (arm_init_machine_status): Initialise func_type field, if
+ (arm_init_machine_status): Initialize func_type field, if
necessary.
(thumb_expand_prologue): Use arm_current_func_type.
(output_thumb_prologue): Use arm_current_func_type.
@@ -2120,7 +2120,7 @@ Tue Dec 5 20:09:14 2000 Jeffrey A Law (law@cygnus.com)
(expand_builtin_strrchr): Use it.
(builtin_memset_read_str): New function.
(expand_builtin_memset): Use target_char_cast.
- Try to optimize memset with second argument non-zero using
+ Try to optimize memset with second argument nonzero using
store_by_pieces.
2000-11-30 Marek Michalkiewicz <marekm@linux.org.pl>
@@ -2923,9 +2923,9 @@ Sun Nov 26 10:02:37 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
(cxx_target_objs): Substitute in the makefile.
* configure: Regenerate.
- * Makefile.in (C_TARGET_OBJS): Define and initialise from
+ * Makefile.in (C_TARGET_OBJS): Define and initialize from
c_target_objs.
- (CXX_TARGET_OBJS): Define and initialise from
+ (CXX_TARGET_OBJS): Define and initialize from
cxx_target_objs.
(C_AND_OBJC_OBJS): Include C_TARGET_OBJS.
@@ -3046,7 +3046,7 @@ Fri Nov 24 19:48:09 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-23 Graham Stott <grahams@redhat.com>
- * cse.c (cse_insn): Initialise all regcost variables.
+ * cse.c (cse_insn): Initialize all regcost variables.
Fix a typo add missing '='.
Only compare costs if there is a replacement insn.
@@ -3247,7 +3247,7 @@ Wed Nov 22 00:52:55 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-21 Jakub Jelinek <jakub@redhat.com>
- * configure.in (HAVE_AS_DWARF2_DEBUG_LINE): Sparc has .file/.loc
+ * configure.in (HAVE_AS_DWARF2_DEBUG_LINE): SPARC has .file/.loc
support in as as well.
* configure: Regenerate.
@@ -3811,7 +3811,7 @@ Tue Nov 14 12:34:56 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2000-11-14 Jakub Jelinek <jakub@redhat.com>
- * reload1.c (emit_input_reload_insns): Honour forcing of constants
+ * reload1.c (emit_input_reload_insns): Honor forcing of constants
into memory by PREFERRED_RELOAD_CLASS NO_REGS.
2000-11-14 Michael Matz <matzmich@cs.tu-berlin.de>
@@ -5216,13 +5216,13 @@ Tue Oct 31 15:33:27 2000 J"orn Rennecke <amylaar@redhat.com>
hash table.
* cppinit.c (cpp_reader_init): Move cpp_init_completed test to top.
- Initialise various members of cpp_reader, memory pools, and the
+ Initialize various members of cpp_reader, memory pools, and the
special nodes.
(cpp_printer_init): Delete.
(cpp_cleanup): Update.
(struct builtin, builtin_array, initialize_builtins): Update for new
hashnode definition and builtin handling.
- (cpp_start_read, cpp_finish): Don't take or initialise a
+ (cpp_start_read, cpp_finish): Don't take or initialize a
printer. Update.
* cpplib.h (cpp_printer, cpp_toklist, CPP_DEFINED, BOL,
@@ -7147,7 +7147,7 @@ Fri Sep 29 13:20:42 MET DST 2000 Jan Hubicka <jh@suse.cz>
error" tests.
* cppinit.c (cpp_handle_option): Remove surplus \n.
* cpplex.c (ON_REST_ARG): Delete.
- (skip_block_comment): Initialise prevc.
+ (skip_block_comment): Initialize prevc.
(parse_args): Improve error messages.
(maybe_paste_with_next): Use CONTEXT_VARARGS rather
than ON_REST_ARG.
@@ -8018,14 +8018,14 @@ Mon 18-Sep-2000 19:21:35 BST Neil Booth <NeilB@earthling.net>
* cpplib.c (_cpp_check_directive, _cpp_check_linemarker):
New implementations.
(do_assert): Don't bother setting the answer's list's line.
- (cpp_push_buffer): Initialise new pfile and read_ahead members
+ (cpp_push_buffer): Initialize new pfile and read_ahead members
of struct cpp_buffer.
* cpplib.h (cppchar_t): New typedef.
(struct cpp_buffer): read_ahead, pfile and col_adjust are
new members.
(struct lexer_state): New structure that determines the state
- and behaviour of the lexer.
+ and behavior of the lexer.
(IN_DIRECTIVE, KNOWN_DIRECTIVE): New macros.
(struct cpp_reader): New member "state". Rename
multiline_string_line and multiline_string_column. Delete
@@ -8101,7 +8101,7 @@ Mon 18-Sep-2000 19:21:35 BST Neil Booth <NeilB@earthling.net>
2000-09-18 Joseph S. Myers <jsm28@cam.ac.uk>
- * c-common.c (check_format_types): Reorganise and clean up,
+ * c-common.c (check_format_types): Reorganize and clean up,
checking earlier for ERROR_MARKs and making cur_type into its
TYPE_MAIN_VARIANT where convenient.
@@ -8547,9 +8547,9 @@ Fri 15-Sep-2000 06:49:07 BST Neil Booth <NeilB@earthling.net>
* config/h8300.h (TARGET_MAC): New.
(TARGET_SWITCHES): Add -ms2600 and -mno-s2600.
(CONDITIONA_REGISTER_USAGE): Disable the mac register on any
- machine other than H8/S2600.
- * config/h8300.md: Accept mac instructions on the H8/S2600 instead
- of the H8/S2000.
+ machine other than H8S/2600.
+ * config/h8300.md: Accept mac instructions on the H8S/2600 instead
+ of the H8S/2000.
2000-09-14 Alexandre Oliva <aoliva@redhat.com>, Bernd Schmidt <bernds@redhat.co.uk>
@@ -9445,7 +9445,7 @@ Thu 07-Sep-2000 21:29:00 BST Neil Booth <NeilB@earthling.net>
yy_lim, or yy_get_token. Don't define get_directive_line if
USE_CPPLIB.
* c-common.h: Add multiple include guard. Define RID values
- for every keyword in C, C++, and Objective C. Put all the
+ for every keyword in C, C++, and Objective-C. Put all the
modifiers first.
(struct c_fileinfo, get_fileinfo, dump_time_statistics): New.
* c-decl.c (c_decode_option): Handle -lang-objc here.
@@ -11108,7 +11108,7 @@ Sun 20-Aug-2000 09:25:45 BST Neil Booth <NeilB@earthling.net>
instructions in it before checking for indirect jumps.
* ifcvt.c (find_if_block): Do not consider a THEN block that ends
- in a indirect jump as a potential for conditional execution.
+ in an indirect jump as a potential for conditional execution.
* d30v.h (d30v_init_expanders): Don't declare here.
* d30v-protos.h (d30v_init_expanders): Declare here with a valid
@@ -11556,7 +11556,7 @@ Mon Aug 14 18:51:44 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
rather than DECL_OFFSET_ALIGN.
(place_field): Likewise.
* expmed.c (store_bit_field): Abort on align==0 to avoid
- antisocial machine behaviour.
+ antisocial machine behavior.
2000-08-12 Richard Henderson <rth@cygnus.com>
@@ -12487,7 +12487,7 @@ Thu Aug 3 15:53:03 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
2000-08-03 Kazu Hirata <kazu@hxi.com>
* h8300.c: Fix a comment typo.
- * h8300.h (OK_FOR_U): Accept a 32-bit constant address on H8/S.
+ * h8300.h (OK_FOR_U): Accept a 32-bit constant address on H8S.
* jump.c: Fix formatting.
@@ -12911,7 +12911,7 @@ Mon Jul 31 20:35:50 2000 Denis Chertykov <denisc@overta.ru>
* h8300.h (MODES_TIEABLE_P): Accept a combination of QImode and
HImode on all architectures and a combination of HImode and SImode
- on H8/300H and H8/S.
+ on H8/300H and H8S.
* h8300.c (split_adds_subs): Rearrange code for conciseness.
@@ -13799,7 +13799,7 @@ Wed Jul 19 01:22:15 CEST 2000 Marc Espie <espie@cvs.openbsd.org>
2000-07-18 Jakub Jelinek <jakub@redhat.com>
- * calls.c (store_arg): Return non-zero if sibcall_failure is desired.
+ * calls.c (store_arg): Return nonzero if sibcall_failure is desired.
(expand_call): Adjust caller.
2000-07-17 Gabriel Dos Reis <gdr@codesourcery.com>
@@ -14169,7 +14169,7 @@ Fri Jul 14 10:25:53 2000 Clinton Popetz <cpopetz@cygnus.com>
* c-common.h (flag_digraphs): New.
* c-decl.c (c_decode_option): Set flag_digraphs as appropriate.
* c-lex.c (yylex): Use flag_digraphs to decide whether to
- honour digraphs.
+ honor digraphs.
2000-07-13 Zack Weinberg <zack@wolery.cumb.org>
@@ -14482,7 +14482,7 @@ Tue Jul 11 16:26:17 2000 Clinton Popetz <cpopetz@cygnus.com>
(handle_option): Set digraphs according to standard.
Merge OPT_lang_c89 handler with OPT_std_c89.
- * cpplex.c: (lex_line, can_paste): Honour digraphs in
+ * cpplex.c: (lex_line, can_paste): Honor digraphs in
accordance with the digraphs flag.
* cpplib.h: (struct cpp_options): New option digraphs.
diff --git a/gcc/ChangeLog.5 b/gcc/ChangeLog.5
index 40eccd1ef84..9bd21c1a544 100644
--- a/gcc/ChangeLog.5
+++ b/gcc/ChangeLog.5
@@ -24,7 +24,7 @@
* gcc.c (process_command): Append a DIR_SEPARATOR to a path
specified by the -B switch, if doing so would create a valid
directory name.
- * doc/invoke.texi: Document changed behaviour of -B.
+ * doc/invoke.texi: Document changed behavior of -B.
2001-06-29 DJ Delorie <dj@redhat.com>
@@ -77,7 +77,7 @@ Fri Jun 29 12:27:24 2001 Jeffrey A Law (law@cygnus.com)
* config/arc/arc-protos.h, config/arc/arc.c, config/arc/arc.h
(arc_comp_type_attributes, arc_set_default_type_attributes,
COMP_TYPE_ATTRIBUTES, SET_DEFAULT_TYPE_ATTRIBUTES): Remove
- functions and macros with default behaviour.
+ functions and macros with default behavior.
* config/m32r/m32r-protos.h, config/m32r/m32r.c,
config/m32r/m32r.h (m32r_comp_type_attributes,
m32r_set_default_type_attributes, COMP_TYPE_ATTRIBUTES,
@@ -1070,7 +1070,7 @@ Mon Jun 18 15:43:10 CEST 2001 Jan Hubicka <jh@suse.cz>
2001-06-18 Ben Elliston <bje@redhat.com>
- * except.c (resolve_fixup_regions): Initialise "cleanup".
+ * except.c (resolve_fixup_regions): Initialize "cleanup".
2001-06-17 Neil Booth <neil@daikokuya.demon.co.uk>
@@ -1131,7 +1131,7 @@ Fri Jun 15 18:05:22 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
Fri Jun 15 19:35:38 CEST 2001 Jan Hubicka <jh@suse.cz>
- * optabs.c (expand_twoval_binop): Avoid undefined behaviour.
+ * optabs.c (expand_twoval_binop): Avoid undefined behavior.
2001-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
@@ -2885,7 +2885,7 @@ Thu May 24 15:56:48 CEST 2001 Jan Hubicka <jh@suse.cz>
2001-05-22 Richard Henderson <rth@redhat.com>
- * unwind-dw2-fde.c (__deregister_frame_info): Stubbify in favour of...
+ * unwind-dw2-fde.c (__deregister_frame_info): Stubbify in favor of...
(__deregister_frame_info_bases): New.
* unwind-dw2-fde.h: Declare it.
* libgcc-std.ver: Export it.
@@ -2903,7 +2903,7 @@ Thu May 24 15:56:48 CEST 2001 Jan Hubicka <jh@suse.cz>
* config/ia64/ia64.md (nonlocal_goto): Reverse label and frame pointer
parameters to __ia64_nonlocal_goto. Flag as NO_RETURN.
* config/ia64/ia64.c (ia64_expand_epilogue): Make sure we are issuing
- "r2" to the assembly file. Only issue allocs with non-zero parameters.
+ "r2" to the assembly file. Only issue allocs with nonzero parameters.
2001-05-22 Loren J. Rittle <ljrittle@acm.org>
David O'Brien <obrien@freebsd.org>
@@ -4498,7 +4498,7 @@ Fri May 4 13:10:03 CEST 2001 Jan Hubicka <jh@suse.cz>
(ix86_align_loops): Delete.
(ix86_align_jumps): Delete.
(override_options): Mark -malign-* as obsolete. Emulate their
- behaviour with the -falign-* options. Default -falign-* from
+ behavior with the -falign-* options. Default -falign-* from
the processor table.
* i386.h (FUNCTION_BOUNDARY): Define to 16; revert Richard Kenner's
patch of Wed May 2 13:09:36 2001.
@@ -5194,7 +5194,7 @@ Wed Apr 25 17:09:50 2001 J"orn Rennecke <amylaar@redhat.com>
2001-04-25 Jakub Jelinek <jakub@redhat.com>
* emit-rtl.c (subreg_hard_regno): Only do HARD_REGNO_MODE_OK check
- if check_mode is non-zero.
+ if check_mode is nonzero.
2001-04-25 Jakub Jelinek <jakub@redhat.com>
@@ -10795,7 +10795,7 @@ Fri Feb 9 15:05:27 2001 Christopher Faylor <cgf@cygnus.com>
* config/i386/i386.c (ix86_frame_pointer_required): New.
(ix86_setup_frame_addresses): New.
- (struct machine_funciton): Add accesses_prev_frame.
+ (struct machine_function): Add accesses_prev_frame.
* config/i386/i386.h (FRAME_POINTER_REQUIRED): Call
ix86_frame_pointer_required.
(SUBTARGET_FRAME_POINTER_REQUIRED): New.
@@ -11536,7 +11536,7 @@ Mon Jan 29 20:38:19 2001 Christopher Faylor <cgf@cygnus.com>
2001-01-27 Michael Sokolov <msokolov@ivan.Harhan.ORG>
- * fixproto: Correctly install synthesised unistd.h and stdlib.h when
+ * fixproto: Correctly install synthesized unistd.h and stdlib.h when
they didn't need fixing.
2001-01-27 Janis Johnson <janis@us.ibm.com>
@@ -11558,7 +11558,7 @@ Mon Jan 29 20:38:19 2001 Christopher Faylor <cgf@cygnus.com>
(really_start_incremental_init): Clear it.
(push_init_level): Save constructor_range_stack and clear it if
pushing explicit braces.
- (pop_init_level): abort if constructor_range_stack is non-zero at
+ (pop_init_level): abort if constructor_range_stack is nonzero at
explicit closing brace. Restore saved constructor_range_stack if
not implicit.
@@ -11587,10 +11587,10 @@ Mon Jan 29 20:38:19 2001 Christopher Faylor <cgf@cygnus.com>
* loop.c (loop_giv_reduce_benefit): Copy mode size into
int variable.
- (check_ext_dependant_givs): Initialise u_start_val and
+ (check_ext_dependant_givs): Initialize u_start_val and
u_end_val.
(load_mems): Make last_max_reg unsigned.
- (try_swap_copy_prop): Use INSN_P and initialise set.
+ (try_swap_copy_prop): Use INSN_P and initialize set.
Fri Jan 26 23:22:58 2001 Denis Chertykov <denisc@overta.ru>
@@ -11700,7 +11700,7 @@ Wed Jan 24 23:51:55 2001 J"orn Rennecke <amylaar@redhat.com>
* cppinit.c (cpp_start_read): Remove deps_add_dep call.
* tradcpp.c (main): Add -imacros or -include'd dependencies
for -M*.
- * cpp.texi (-M, -MM): Document -M -include behaviour.
+ * cpp.texi (-M, -MM): Document -M -include behavior.
2001-01-24 Roger Collins <roger@ProProject.com>
@@ -11922,7 +11922,7 @@ Sun Jan 21 09:44:17 2001 Denis Chertykov <denisc@overta.ru>
* config/avr/avr.c (ret_cond_branch): New argument (reverse) added.
If REVERSE nonzero then condition code in X must be reversed.
- (encode_section_info): Optimise if/else.
+ (encode_section_info): Optimize if/else.
(avr_function_value): Fix formatting.
* config/avr/avr.md (branch): Call to ret_cond_branch changed.
@@ -12652,7 +12652,7 @@ Sat Jan 13 09:53:32 MET 2001 Jan Hubicka <jh@suse.cz>
(pending_init_member): Rename to...
(find_init_member): ...this function. Call set_nonincremental_init
if necessary. Compare values of purpose index trees, not the trees
- themselves. Return the actual value, not just non-zero if something
+ themselves. Return the actual value, not just nonzero if something
is found.
(output_init_element): Remove checks for duplicates.
If field has zero size, only check the initializer for correctness.
@@ -12892,7 +12892,7 @@ Fri Jan 12 00:04:00 MET 2001 Jan Hubicka <jh@suse.cz>
2001-01-10 Nick Clifton <nickc@redhat.com>
- * config/d30v/d30v.c (d30v_init_machine_status): Initialise
+ * config/d30v/d30v.c (d30v_init_machine_status): Initialize
machine_function structure to zero.
Add prototypes for machine_status functions.
@@ -13097,7 +13097,7 @@ Wed Jan 10 16:38:31 MET 2001 Jan Hubicka <jh@suse.cz>
* config/d30v/d30v.h (struct_machine): Move here.
Add eh_epilogue_sp_ofs field.
- *config/d30v/d30v.md (epilogue): Initialise eh_epilogue_sp_ofs
+ *config/d30v/d30v.md (epilogue): Initialize eh_epilogue_sp_ofs
field in cfun->machine structure.
Tue Jan 9 21:34:57 2001 John David Anglin <dave@hiauly1.hia.nrc.ca>
@@ -13179,7 +13179,7 @@ Tue Jan 9 21:25:19 2001 Jeffrey A Law (law@cygnus.com)
(emit_a_shift): Adopt to the new calling prototype of
get_shift_alg.
(function_prologue): Fix code for a monitor
- function. Support H8/S.
+ function. Support H8S.
(function_epilogue): Do not output pop for a monitor function.
2001-01-09 Nick Clifton <nickc@redhat.com>
@@ -13264,7 +13264,7 @@ Tue Jan 9 21:25:19 2001 Jeffrey A Law (law@cygnus.com)
20001-01-09 Graham Stott <grahams@redhat.com>
* cppfiles.c (_cpp_execute_include): Move `len` initialisation
- after `ptr` is initialised.
+ after `ptr` is initialized.
2001-01-09 Alexandre Oliva <aoliva@redhat.com>
@@ -13876,7 +13876,7 @@ Fri Jan 5 16:29:49 MET 2001 Jan Hubicka <jh@suse.cz>
2001-01-05 Neil Booth <neil@daikokuya.demon.co.uk>
- * cpp.texi: Update for -MP. Clarify behaviour of -MT.
+ * cpp.texi: Update for -MP. Clarify behavior of -MT.
* cppinit.c (initialize_dependency_output): Update.
(cpp_finish): Output dummy targets for -MP.
(OPT_MP): New.
diff --git a/gcc/ChangeLog.6 b/gcc/ChangeLog.6
index d0e9a233be5..5618eaa29e2 100644
--- a/gcc/ChangeLog.6
+++ b/gcc/ChangeLog.6
@@ -995,7 +995,7 @@ Mon Dec 17 18:27:52 CET 2001 Jan Hubicka <jh@suse.cz>
Mon Dec 17 17:57:05 CET 2001 Jan Hubicka <jh@suse.cz>
- * Makefile.in (cfgcleanup.o): Add cselib.h dependancy.
+ * Makefile.in (cfgcleanup.o): Add cselib.h dependency.
* basic-block.h (CLEANUP_THREADING): New constant.
* cfgcleanup.c: Include cselib.h
(thread_jump, mark_effect): New functions.
@@ -1020,10 +1020,10 @@ Mon Dec 17 17:57:05 CET 2001 Jan Hubicka <jh@suse.cz>
* target.h (asm_out.byte_op, asm_out.aligned_op, asm_out.unaligned_op,
asm_out.integer): New fields.
* target-def.h (TARGET_ASM_BYTE_OP, TARGET_ASM_ALIGNED_[HSDT]I_OP,
- TARGET_ASM_UNALIGNED_[HSDT]I_OP, TARGET_ASM_INTEGER): New initialisers.
+ TARGET_ASM_UNALIGNED_[HSDT]I_OP, TARGET_ASM_INTEGER): New initializers.
(TARGET_ASM_ALIGNED_INT_OP, TARGET_ASM_UNALIGNED_INT_OP): Collect
- the individual initialisers together.
- (TARGET_ASM_OUT): Add the new initialisers.
+ the individual initializers together.
+ (TARGET_ASM_OUT): Add the new initializers.
* output.h (assemble_integer): Return bool.
(integer_asm_op): Declare.
(default_assemble_integer): Declare.
@@ -5339,9 +5339,9 @@ Wed Nov 14 06:37:54 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-11-13 Kazu Hirata <kazu@hxi.com>
* config/h8300/h8300.c (shift_alg_si): Use special code for
- 25-bit shifts on H8/S.
+ 25-bit shifts on H8S.
(get_shift_alg): Generate special code for 25-bit shifts on
- H8/S.
+ H8S.
2001-11-13 Jakub Jelinek <jakub@redhat.com>
@@ -5449,10 +5449,10 @@ Tue Nov 13 05:45:40 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-11-12 Kazu Hirata <kazu@hxi.com>
* config/h8300/h8300.c (shift_alg_qi): Use rotations when
- doing 6-bit logical shifts on H8/S.
- (shift_alg_qi): Use special code for 21-bit shifts on H8/S.
+ doing 6-bit logical shifts on H8S.
+ (shift_alg_qi): Use special code for 21-bit shifts on H8S.
(get_shift_alg): Generate special code for 21-bit shifts on
- H8/S.
+ H8S.
2001-11-12 Kazu Hirata <kazu@hxi.com>
@@ -6891,7 +6891,7 @@ Sat Nov 3 10:37:56 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-11-01 David S. Miller <davem@redhat.com>
* doc/install.texi (Specific, sparc-sun-solaris2*): Bring
- 64-bit Sparc description more in line with reality.
+ 64-bit SPARC description more in line with reality.
2001-11-01 Joseph S. Myers <jsm28@cam.ac.uk>
@@ -9881,7 +9881,7 @@ Fri Sep 28 14:59:34 CEST 2001 Jan Hubicka <jh@suse.cz>
2001-09-27 Richard Henderson <rth@redhat.com>
* dwarf2out.c (dwarf2out_frame_finish): Never elide .debug_frame
- in favour of .eh_frame.
+ in favor of .eh_frame.
2001-09-27 Aldy Hernandez <aldyh@redhat.com>
@@ -10036,7 +10036,7 @@ Tue Sep 25 17:13:56 CEST 2001 Jan Hubicka <jh@suse.cz>
(builtin_decsription): Add new field mask which is used to determine
when to define the builtin via the macro def_builtin.
- (bdesc_comi): Initialise new mask fields.
+ (bdesc_comi): Initialize new mask fields.
(bdesc_2srg): Likewise.
(bdesc_1arg): Likewise.
@@ -12374,7 +12374,7 @@ Thu Aug 30 10:21:43 2001 J"orn Rennecke <amylaar@redhat.com>
(INIT_SECTION_ASM_OP): Define.
(FINI_SECTION_ASM_OP): Define.
(SUBTARGET_EXTRA_SECTIONS): Remove trailing comma.
- (RDATA_SECTION_FUNCITON): Provide prototype.
+ (RDATA_SECTION_FUNCTION): Provide prototype.
2001-08-29 Geoffrey Keating <geoffk@redhat.com>
@@ -16219,7 +16219,7 @@ Thu Jul 26 14:04:03 EDT 2001 John Wehle (john@feith.com)
* flow.c (update_life_info): Simplify the CFG and
recalculate the global regs which are alive when
removing dead code during a global update.
- (propagate_block): Return non-zero if an INSN is
+ (propagate_block): Return nonzero if an INSN is
deleted.
2001-07-26 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
@@ -16689,7 +16689,7 @@ Sun Jul 22 21:31:04 CEST 2001 Jan Hubicka <jh@suse.cz>
(xcoff_debug_hooks, dbx_debug_hooks): Use it.
* sdbout.c (sdbout_finish): New.
(sdbout_debug_hooks): Use it, add comments.
- (sdbout_global_decl): Defer initialised public vars to
+ (sdbout_global_decl): Defer initialized public vars to
sdbout_finish.
* varasm.c (assemble_variable): Don't output debug information
for file-scope variables.
@@ -16721,7 +16721,7 @@ Sun Jul 22 21:31:04 CEST 2001 Jan Hubicka <jh@suse.cz>
(xcoff_debug_hooks, dbx_debug_hooks): Use it.
* sdbout.c (sdbout_finish): New.
(sdbout_debug_hooks): Use it, add comments.
- (sdbout_global_decl): Defer initialised public vars to
+ (sdbout_global_decl): Defer initialized public vars to
sdbout_finish.
* varasm.c (assemble_variable): Don't output debug information
for file-scope variables.
@@ -16990,7 +16990,7 @@ Fri Jul 20 13:24:16 CEST 2001 Jan Hubicka <jh@suse.cz>
* Makefile.in (toplev.o, dwarfout.o, final.o): Don't depend on
dwarfout.h.
- * dbxout.c (dbxout_function): Rename dbxout_funciton_decl, move
+ * dbxout.c (dbxout_function): Rename dbxout_function_decl, move
to conditionally compiled block.
(dbx_debug_hooks, xcoff_debug_hooks): Update.
* dbxout.h (dbxout_function): Remove.
@@ -18418,7 +18418,7 @@ Mon Jul 9 06:41:07 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* config/ia64/ia64.c (ia64_output_end_prologue): Rename to
ia64_output_function_end_prologue. Use in target struct
and make static.
- (ia64_function_prologue, ia64_funciton_epilogue): Rename
+ (ia64_function_prologue, ia64_function_epilogue): Rename
mistyped prototypes.
* config/ia64/ia64.h (FUNCTION_END_PROLOGUE): Delete.
* config/m88k/m88k-protos.h (m88k_end_prologue, m88k_begin_epilogue):
@@ -19186,13 +19186,13 @@ Sun Jul 1 11:53:52 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* c-parse.in (OBJC_STRING): Kill.
(objc_string): Decompose to [objc_string] '@' STRING.
- (reswords): Take the leading '@' off all the Objective C keywords.
+ (reswords): Take the leading '@' off all the Objective-C keywords.
(objc_rid_sans_at): Kill.
(init_reswords): Don't initialize it.
(yylexname): Use OBJC_IS_AT_KEYWORD and OBJC_IS_PQ_KEYWORD.
(_yylex): Kill reconsider label. Look ahead one token after
an '@'; if we get an identifier, check whether it's an
- Objective C @-keyword. If so, return the keyword. Otherwise,
+ Objective-C @-keyword. If so, return the keyword. Otherwise,
put back the token and return the '@' as a terminal.
* cpplib.c (lex_macro_node): Remove unnecessary check for
diff --git a/gcc/FSFChangeLog.10 b/gcc/FSFChangeLog.10
index 0fea5530d8c..e7ae6c5af0a 100644
--- a/gcc/FSFChangeLog.10
+++ b/gcc/FSFChangeLog.10
@@ -5704,7 +5704,7 @@ Sun Aug 13 14:50:58 1995 Jim Wilson <wilson@chestnut.cygnus.com>
* 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.
+ JUMP_LABEL (insn) is nonzero.
Mon Jul 31 14:31:53 1995 Ian Lance Taylor <ian@cygnus.com>
@@ -6057,7 +6057,7 @@ Mon Jul 17 06:41:19 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
* xm-alpha.h (sbrk): Add declaration.
- * convert.c (convert_to_integer): If TYPE is a enumeral type or
+ * convert.c (convert_to_integer): If TYPE is an enumeral type or
if its precision is not the same as the size of its mode,
convert in two steps.
@@ -8538,7 +8538,7 @@ Tue Apr 25 18:52:43 1995 Stephen R. van den Berg (berg@pool.informatik.rwth-aa
(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
+ (get_true_reg): Eliminate FP subreg accesses in favor 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.
@@ -8552,7 +8552,7 @@ Tue Apr 25 18:52:43 1995 Stephen R. van den Berg (berg@pool.informatik.rwth-aa
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.
+ (move_for_stack_reg): Optimize 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
@@ -8841,7 +8841,7 @@ Sat Apr 15 13:26:34 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
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
+ make sure it's nonzero before we try to use it to restore the
frame pointer.
Fri Apr 14 19:45:05 1995 Jason Merrill <jason@phydeaux.cygnus.com>
diff --git a/gcc/FSFChangeLog.11 b/gcc/FSFChangeLog.11
index 38de90cfe2e..1e80eab580c 100644
--- a/gcc/FSFChangeLog.11
+++ b/gcc/FSFChangeLog.11
@@ -2636,7 +2636,7 @@ Wed Sep 10 11:49:20 1997 Jason Merrill <jason@yorick.cygnus.com>
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.
+ (is_ctor_dtor): Recognize frame entries.
(scan_prog_file): Likewise.
(main): Pass -fno-exceptions to sub-compile. Also do collection
if there are any frame entries.
@@ -3114,7 +3114,7 @@ Wed Aug 27 20:15:53 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
(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.
+ (from_compare): Can't compare nonzero 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 ','.
@@ -3935,7 +3935,7 @@ Mon Aug 4 08:06:48 1997 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
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.
+ nonzero constants are handled properly. Return 1 for FP divisions.
Mon Aug 4 06:52:20 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
@@ -3948,7 +3948,7 @@ Sun Aug 3 21:57:31 1997 Jim Meyering <meyering@eng.ascend.com>
Sun Aug 3 21:54:51 1997 Nick Burrett <n.a.burrett@btinternet.com>
- * cpplib.c (cpp_start_read): Recognise suffixes 'cp' and 'c++'.
+ * cpplib.c (cpp_start_read): Recognize suffixes 'cp' and 'c++'.
Sun Aug 3 19:18:27 1997 Ralf Baechle <ralf@uni-koblenz.de>
@@ -5105,7 +5105,7 @@ Thu Jun 19 21:18:20 1997 Jim Wilson <wilson@cygnus.com>
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.
+ * toplev.c (xmalloc): Only give the fatal msg if SIZE is nonzero.
Sun Apr 27 23:19:13 1997 Ulrich Drepper <drepper@cygnus.com>
@@ -9711,7 +9711,7 @@ Sun Oct 20 20:01:09 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
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.
+ if the bit 15 of rs6000_fpmem_offset is nonzero.
Thu Oct 17 23:22:03 1996 Jason Merrill <jason@yorick.cygnus.com>
@@ -9814,7 +9814,7 @@ Tue Oct 15 16:52:33 1996 Ian Lance Taylor <ian@cygnus.com>
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.
+ * mips.h (CPP_SPEC): Restore -D_LANGUAGE_C for Objective-C.
Mon Oct 14 18:03:35 1996 Jason Merrill <jason@yorick.cygnus.com>
@@ -9864,7 +9864,7 @@ Fri Oct 11 12:19:21 1996 Ian Lance Taylor <ian@cygnus.com>
(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.
+ 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.
@@ -11676,7 +11676,7 @@ Thu Jul 11 17:29:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
Thu Jul 11 10:12:50 1996 Jeffrey A Law (law@cygnus.com)
- * h8300.h (OK_FOR_U): If generating H8/S code, accept
+ * h8300.h (OK_FOR_U): If generating H8S code, accept
SYMBOL_REF and SYMBOL_REF + CONST_INT.
* h8300.c ({shift,rotate}_one): Emit tabs between opcode and
@@ -11684,7 +11684,7 @@ Thu Jul 11 10:12:50 1996 Jeffrey A Law (law@cygnus.com)
(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.
+ to generate more efficient code on the H8/300, H8/300H, and H8S.
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
@@ -11755,31 +11755,31 @@ Mon Jul 8 18:00:33 1996 Jim Wilson <wilson@cygnus.com>
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
+ * First cut at support for the H8S.
+ * h8300.c (h8300_init_once): Handle the H8S (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.
+ on the H8S. 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.
+ (asm_file_start): Emit ".h8300s" when compiling for the H8S.
+ * h8300/h8300.h (CPP_SPEC): Handle the H8S.
(TARGET_H8300S): New target.
(TARGET_SWITCHES): Add "-ms" and "-mno-s".
- (BITS_PER_WORD): Handle the H8/S (treat it like the H8/300H).
+ (BITS_PER_WORD): Handle the H8S (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
+ * h8300.md: Handle H8S 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.
+ (MULTILIB_DIRNAMES): Put H8S 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.
+ h8300s object files. Otherwise treat the H8S just like the H8/300H.
+ * ginclude/stdarg.h: Handle the H8S.
* ginclude/varargs.h: Likewise.
Mon Jul 8 14:50:58 1996 Doug Evans <dje@cygnus.com>
@@ -14430,7 +14430,7 @@ Thu Apr 4 11:40:55 1996 Michael Meissner <meissner@tiktok.cygnus.com>
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.
+ * expr.c (emit_push_insn): Clobber register only if it is nonzero.
Wed Apr 3 11:31:55 1996 Jeffrey A. Law <law@cygnus.com>
diff --git a/gcc/LANGUAGES b/gcc/LANGUAGES
index 8bc51568eee..d1e07198e64 100644
--- a/gcc/LANGUAGES
+++ b/gcc/LANGUAGES
@@ -18,7 +18,7 @@ Aug 31, 1998:
from the input stream, and to push them back into the input stream respectively.
The third argument is a pointer to a null terminate string which is the first
word after #pragma. The expression supplied by HANDLE_PRAGMA should return
- non-zero if it parsed and implemented the pragma. Otherwise it should return
+ nonzero if it parsed and implemented the pragma. Otherwise it should return
zero, and leave the input stream as it was before the expression was evaluated.
A new back-end definable macro has been added: INSERT_ATTRIBUTES. This macro
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index dfdc49fa54d..0655f6073bf 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -47,7 +47,7 @@ SUBDIRS =@subdirs@
# Selection of languages to be made.
# This is overridden by configure.
CONFIG_LANGUAGES = @all_languages@
-LANGUAGES = c gcov$(exeext) $(CONFIG_LANGUAGES)
+LANGUAGES = c gcov$(exeext) gcov-dump$(exeext) $(CONFIG_LANGUAGES)
# Selection of languages to be made during stage1 build.
# This is overridden by configure.
@@ -74,7 +74,7 @@ BOOT_CFLAGS = -g -O2
# without optimization. The -dumpbase $@ makes sure that the auxilary
# files end up near the object files.
COVERAGE_FLAGS = @coverage_flags@
-coverageexts = .{da,bb,bbg}
+coverageexts = .{da,bbg}
# The warning flags are separate from BOOT_CFLAGS because people tend to
# override optimization flags and we'd like them to still have warnings
@@ -171,10 +171,13 @@ INSTALL_HEADERS_DIR = @build_install_headers_dir@
# Header files that are made available under the same name
# to programs compiled with GCC.
-USER_H = $(srcdir)/ginclude/stdarg.h $(srcdir)/ginclude/stddef.h \
- $(srcdir)/ginclude/varargs.h \
- $(srcdir)/ginclude/stdbool.h $(srcdir)/ginclude/iso646.h \
- $(EXTRA_HEADERS)
+USER_H = $(srcdir)/ginclude/float.h \
+ $(srcdir)/ginclude/iso646.h \
+ $(srcdir)/ginclude/stdarg.h \
+ $(srcdir)/ginclude/stdbool.h \
+ $(srcdir)/ginclude/stddef.h \
+ $(srcdir)/ginclude/varargs.h \
+ $(EXTRA_HEADERS)
# The GCC to use for compiling libgcc.a and crt*.o.
# Usually the one we just built.
@@ -251,7 +254,7 @@ FIBHEAP_H = $(srcdir)/../include/fibheap.h
# Default native SYSTEM_HEADER_DIR, to be overridden by targets.
NATIVE_SYSTEM_HEADER_DIR = /usr/include
# Default cross SYSTEM_HEADER_DIR, to be overridden by targets.
-CROSS_SYSTEM_HEADER_DIR = $(build_tooldir)/sys-include
+CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
# autoconf sets SYSTEM_HEADER_DIR to one of the above.
SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
@@ -263,6 +266,10 @@ STMP_FIXINC = @STMP_FIXINC@
# Test to see whether <limits.h> exists in the system header files.
LIMITS_H_TEST = [ -f $(SYSTEM_HEADER_DIR)/limits.h ]
+# Directory for prefix to system directories, for
+# each of $(system_prefix)/usr/include, $(system_prefix)/usr/lib, etc.
+TARGET_SYSTEM_ROOT = @TARGET_SYSTEM_ROOT@
+
target=@target@
target_alias=@target_alias@
xmake_file=@dep_host_xmake_file@
@@ -390,7 +397,7 @@ CRTSTUFF_CFLAGS = -O2 $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
-finhibit-size-directive -fno-inline-functions -fno-exceptions \
-fno-zero-initialized-in-bss
-# Additional sources to handle exceptions; overridden on ia64.
+# Additional sources to handle exceptions; overridden by targets as needed.
LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \
$(srcdir)/unwind-sjlj.c
LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h
@@ -434,10 +441,6 @@ LIB2FUNCS_EXTRA =
# Assembler files should have names ending in `.asm'.
LIB2FUNCS_STATIC_EXTRA =
-# We do not try to build float.h anymore. Let configure select the
-# appropriate pre-built float.h file for the target.
-FLOAT_H=@float_h_file@
-
# Program to convert libraries.
LIBCONVERT =
@@ -637,7 +640,7 @@ HOST_RTL = $(BUILD_PREFIX)rtl.o read-rtl.o $(BUILD_PREFIX)bitmap.o \
HOST_SUPPORT = gensupport.o insn-conditions.o
HOST_EARLY_SUPPORT = gensupport.o dummy-conditions.o
-HOST_PRINT = $(BUILD_PREFIX)print-rtl.o
+HOST_PRINT = print-rtl1.o
HOST_ERRORS = $(BUILD_PREFIX)errors.o
HOST_VARRAY = $(BUILD_PREFIX)varray.o
@@ -736,7 +739,7 @@ C_OBJS = c-parse.o c-lang.o c-pretty-print.o $(C_AND_OBJC_OBJS)
OBJS = alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o \
cfg.o cfganal.o cfgbuild.o cfgcleanup.o cfglayout.o cfgloop.o \
cfgrtl.o combine.o conflict.o convert.o cse.o cselib.o dbxout.o \
- debug.o dependence.o df.o diagnostic.o doloop.o dominance.o \
+ debug.o df.o diagnostic.o doloop.o dominance.o \
dwarf2asm.o dwarf2out.o dwarfout.o emit-rtl.o except.o explow.o \
expmed.o expr.o final.o flow.o fold-const.o function.o gcse.o \
genrtl.o ggc-common.o global.o graph.o gtype-desc.o \
@@ -760,7 +763,7 @@ STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
insn-attr.h insn-attrtab.c insn-opinit.c insn-constants.h tm-preds.h \
tree-check.h insn-conditions.c \
- s-flags s-config s-codes s-mlib s-under s-genrtl s-gtype gtyp-gen.h \
+ s-flags s-config s-codes s-mlib s-genrtl s-gtype gtyp-gen.h \
s-output s-recog s-emit s-extract s-peep s-check s-conditions \
s-attr s-attrtab s-opinit s-preds s-constants s-crt0 \
genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \
@@ -773,8 +776,9 @@ STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
xgcc$(exeext) cpp$(exeext) cc1$(exeext) $(EXTRA_PASSES) \
$(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) cc1obj$(exeext) \
protoize$(exeext) unprotoize$(exeext) \
- specs collect2$(exeext) $(USE_COLLECT2) underscore.c \
- gcov$(exeext) *.[0-9][0-9].* *.[si] libcpp.a libbackend.a libgcc.mk \
+ specs collect2$(exeext) $(USE_COLLECT2) \
+ gcov-iov$(build_exeext) gcov$(exeext) gcov-dump$(exeext) \
+ *.[0-9][0-9].* *.[si] libcpp.a libbackend.a libgcc.mk \
$(LANG_STAGESTUFF)
# Library members defined in libgcc2.c.
@@ -788,7 +792,7 @@ LIB2FUNCS_2 = _floatdixf _fixunsxfsi _fixtfdi _fixunstfdi _floatditf \
_addvdi3 _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 _negvsi2 _negvdi2 _ctors
# Defined in libgcc2.c, included only in the static library.
-LIB2FUNCS_ST = _eprintf _bb __gcc_bcmp
+LIB2FUNCS_ST = _eprintf _gcov __gcc_bcmp
FPBIT_FUNCS = _pack_sf _unpack_sf _addsub_sf _mul_sf _div_sf \
_fpcmp_parts_sf _compare_sf _eq_sf _ne_sf _gt_sf _ge_sf \
@@ -1028,7 +1032,7 @@ libgcc.mk: config.status Makefile mklibgcc $(LIB2ADD) $(LIB2ADD_ST) xgcc$(exeext
SHLIB_MKMAP_OPTS='$(SHLIB_MKMAP_OPTS)' \
SHLIB_MAPFILES='$(SHLIB_MAPFILES)' \
SHLIB_NM_FLAGS='$(SHLIB_NM_FLAGS)' \
- SHLIB_SLIBDIR_SUFFIXES='$(SHLIB_SLIBDIR_SUFFIXES)' \
+ MULTILIB_OSDIRNAMES='$(MULTILIB_OSDIRNAMES)' \
mkinstalldirs='$(SHELL) $(srcdir)/mkinstalldirs' \
$(SHELL) mklibgcc > tmp-libgcc.mk
mv tmp-libgcc.mk libgcc.mk
@@ -1062,7 +1066,8 @@ libgcc.a: $(LIBGCC_DEPS)
# switches.
multilib.h: s-mlib; @true
s-mlib: $(srcdir)/genmultilib Makefile
- if test @enable_multilib@ = yes; then \
+ if test @enable_multilib@ = yes \
+ || test -n "$(MULTILIB_OSDIRNAMES)"; then \
$(SHELL) $(srcdir)/genmultilib \
"$(MULTILIB_OPTIONS)" \
"$(MULTILIB_DIRNAMES)" \
@@ -1070,9 +1075,12 @@ s-mlib: $(srcdir)/genmultilib Makefile
"$(MULTILIB_EXCEPTIONS)" \
"$(MULTILIB_EXTRA_OPTS)" \
"$(MULTILIB_EXCLUSIONS)" \
+ "$(MULTILIB_OSDIRNAMES)" \
+ "@enable_multilib@" \
> tmp-mlib.h; \
else \
- $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' > tmp-mlib.h; \
+ $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' no \
+ > tmp-mlib.h; \
fi
$(SHELL) $(srcdir)/move-if-change tmp-mlib.h multilib.h
$(STAMP) s-mlib
@@ -1190,7 +1198,7 @@ c-lex.o : c-lex.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) \
c-objc-common.o : c-objc-common.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(C_TREE_H) $(RTL_H) insn-config.h integrate.h $(EXPR_H) $(C_TREE_H) \
flags.h toplev.h tree-inline.h diagnostic.h integrate.h $(VARRAY_H) \
- langhooks.h $(GGC_H) gt-c-objc-common.h
+ langhooks.h $(GGC_H) gt-c-objc-common.h $(TARGET_H)
c-aux-info.o : c-aux-info.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) \
flags.h toplev.h
c-convert.o : c-convert.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) flags.h toplev.h \
@@ -1203,7 +1211,7 @@ graph.o: graph.c $(CONFIG_H) $(SYSTEM_H) toplev.h flags.h output.h $(RTL_H) \
sbitmap.o: sbitmap.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h hard-reg-set.h \
$(BASIC_BLOCK_H)
-COLLECT2_OBJS = collect2.o tlink.o intl.o underscore.o version.o
+COLLECT2_OBJS = collect2.o tlink.o intl.o version.o
COLLECT2_LIBS = @COLLECT2_LIBS@
collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS)
# Don't try modifying collect2 (aka ld) in place--it might be linking this.
@@ -1220,21 +1228,6 @@ collect2.o : collect2.c $(CONFIG_H) $(SYSTEM_H) gstab.h intl.h \
tlink.o: tlink.c $(DEMANGLE_H) $(HASHTAB_H) $(CONFIG_H) $(SYSTEM_H) \
$(OBSTACK_H) collect2.h intl.h
-underscore.c: s-under ; @true
-
-s-under: $(GCC_PASSES)
- echo "int xxy_us_dummy;" >tmp-dum.c
- $(GCC_FOR_TARGET) -S tmp-dum.c
- echo '/*WARNING: This file is automatically generated!*/' >tmp-under.c
- if grep _xxy_us_dummy tmp-dum.s > /dev/null ; then \
- echo "int prepends_underscore = 1;" >>tmp-under.c; \
- else \
- echo "int prepends_underscore = 0;" >>tmp-under.c; \
- fi
- $(SHELL) $(srcdir)/move-if-change tmp-under.c underscore.c
- -rm -f tmp-dum.c tmp-dum.s
- $(STAMP) s-under
-
# A file used by all variants of C.
c-common.o : c-common.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(OBSTACK_H) \
@@ -1272,6 +1265,7 @@ DRIVER_DEFINES = \
-DDEFAULT_TARGET_MACHINE=\"$(target_alias)\" \
-DSTANDARD_BINDIR_PREFIX=\"$(bindir)/\" \
-DTOOLDIR_BASE_PREFIX=\"$(unlibsubdir)/../\" \
+ @TARGET_SYSTEM_ROOT_DEFINE@ \
`test "X$${SHLIB_LINK}" = "X" || test "@enable_shared@" != "yes" || echo "-DENABLE_SHARED_LIBGCC"` \
`test "X$${SHLIB_MULTILIB}" = "X" || echo "-DNO_SHARED_LIBGCC_MULTILIB"`
@@ -1396,7 +1390,7 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) function.h \
dwarf2out.h sdbout.h dbxout.h $(EXPR_H) hard-reg-set.h $(BASIC_BLOCK_H) \
graph.h $(LOOP_H) except.h $(REGS_H) $(TIMEVAR_H) $(lang_options_files) \
ssa.h $(PARAMS_H) $(TM_P_H) reload.h dwarf2asm.h $(TARGET_H) \
- langhooks.h insn-flags.h options.h cfglayout.h
+ langhooks.h insn-flags.h options.h cfglayout.h real.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-DTARGET_NAME=\"$(target_alias)\" \
-c $(srcdir)/toplev.c $(OUTPUT_OPTION)
@@ -1408,10 +1402,8 @@ rtl-error.o: rtl-error.c system.h $(RTL_H) $(INSN_ATTR_H) insn-config.h \
rtl.o : rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) real.h $(GGC_H) errors.h
$(CC) -c $(ALL_CFLAGS) -DGENERATOR_FILE $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
-print-rtl.o : print-rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) \
- hard-reg-set.h $(BASIC_BLOCK_H)
- $(CC) -c $(ALL_CFLAGS) -DGENERATOR_FILE $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
-
+print-rtl.o : print-rtl.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) \
+ hard-reg-set.h $(BASIC_BLOCK_H) real.h
rtlanal.o : rtlanal.c $(CONFIG_H) $(SYSTEM_H) toplev.h $(RTL_H) \
hard-reg-set.h $(TM_P_H) insn-config.h $(RECOG_H) real.h flags.h
@@ -1421,7 +1413,7 @@ errors.o : errors.c $(GCONFIG_H) $(SYSTEM_H) errors.h
varasm.o : varasm.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
function.h $(EXPR_H) hard-reg-set.h $(REGS_H) \
output.h c-pragma.h toplev.h xcoffout.h debug.h $(GGC_H) $(TM_P_H) \
- $(HASHTAB_H) $(TARGET_H) langhooks.h gt-varasm.h
+ $(HASHTAB_H) $(TARGET_H) langhooks.h gt-varasm.h real.h
function.o : function.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
function.h $(EXPR_H) libfuncs.h $(REGS_H) hard-reg-set.h \
insn-config.h $(RECOG_H) output.h toplev.h except.h $(HASHTAB_H) $(GGC_H) \
@@ -1461,7 +1453,7 @@ dbxout.o : dbxout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
debug.o : debug.c debug.h $(CONFIG_H) $(SYSTEM_H)
sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
function.h $(EXPR_H) output.h hard-reg-set.h $(REGS_H) real.h \
- insn-config.h xcoffout.h c-pragma.h ggc.h \
+ insn-config.h xcoffout.h c-pragma.h ggc.h $(TARGET_H) \
sdbout.h toplev.h $(TM_P_H) except.h debug.h langhooks.h gt-sdbout.h
dwarfout.o : dwarfout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf.h \
flags.h insn-config.h reload.h output.h toplev.h $(TM_P_H) \
@@ -1473,7 +1465,7 @@ dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf2.h \
dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) flags.h $(RTL_H) $(TREE_H) \
output.h dwarf2asm.h $(TM_P_H) $(GGC_H)
vmsdbgout.o : vmsdbgout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) flags.h \
- output.h vmsdbg.h debug.h langhooks.h function.h
+ output.h vmsdbg.h debug.h langhooks.h function.h $(TARGET_H)
xcoffout.o : xcoffout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) xcoffout.h \
flags.h toplev.h output.h dbxout.h $(GGC_H) $(TARGET_H)
emit-rtl.o : emit-rtl.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
@@ -1491,7 +1483,7 @@ jump.o : jump.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h hard-reg-set.h $(REGS_H
simplify-rtx.o : simplify-rtx.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(REGS_H) \
hard-reg-set.h flags.h real.h insn-config.h $(RECOG_H) $(EXPR_H) toplev.h \
- output.h function.h $(GGC_H) $(OBSTACK_H) $(TM_P_H)
+ output.h function.h $(GGC_H) $(OBSTACK_H) $(TM_P_H) $(TREE_H)
cselib.o : cselib.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(REGS_H) \
hard-reg-set.h flags.h real.h insn-config.h $(RECOG_H) $(EXPR_H) toplev.h \
output.h function.h cselib.h $(GGC_H) $(TM_P_H) gt-cselib.h
@@ -1524,8 +1516,8 @@ conflict.o : conflict.c $(CONFIG_H) $(SYSTEM_H) $(OBSTACK_H) $(HASHTAB_H) \
$(RTL_H) hard-reg-set.h $(BASIC_BLOCK_H)
profile.o : profile.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h \
insn-config.h output.h $(REGS_H) $(EXPR_H) function.h \
- gcov-io.h toplev.h $(GGC_H) hard-reg-set.h $(BASIC_BLOCK_H) $(TARGET_H) \
- langhooks.h profile.h libfuncs.h gt-profile.h
+ gcov-io.h gcov-iov.h toplev.h $(GGC_H) hard-reg-set.h $(BASIC_BLOCK_H) \
+ $(TARGET_H) langhooks.h profile.h libfuncs.h gt-profile.h
loop.o : loop.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h $(LOOP_H) \
insn-config.h $(REGS_H) hard-reg-set.h $(RECOG_H) $(EXPR_H) \
real.h $(PREDICT_H) $(BASIC_BLOCK_H) function.h \
@@ -1624,8 +1616,9 @@ sched-vis.o : sched-vis.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) sched-int.h \
$(TARGET_H) real.h
final.o : final.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h intl.h \
$(REGS_H) $(RECOG_H) conditions.h insn-config.h $(INSN_ATTR_H) function.h \
- real.h output.h hard-reg-set.h except.h debug.h xcoffout.h profile.h \
- toplev.h reload.h dwarf2out.h $(BASIC_BLOCK_H) $(TM_P_H) $(TARGET_H) $(EXPR_H)
+ real.h output.h hard-reg-set.h except.h debug.h xcoffout.h \
+ toplev.h reload.h dwarf2out.h $(BASIC_BLOCK_H) $(TM_P_H) $(TARGET_H) \
+ $(EXPR_H)
recog.o : recog.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) function.h $(BASIC_BLOCK_H) \
$(REGS_H) $(RECOG_H) $(EXPR_H) hard-reg-set.h flags.h insn-config.h \
$(INSN_ATTR_H) real.h toplev.h output.h reload.h $(TM_P_H)
@@ -1651,9 +1644,7 @@ regrename.o : regrename.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) insn-config.h \
resource.h $(OBSTACK_H) flags.h $(TM_P_H)
ifcvt.o : ifcvt.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(REGS_H) toplev.h \
flags.h insn-config.h function.h $(RECOG_H) $(BASIC_BLOCK_H) $(EXPR_H) \
- output.h except.h $(TM_P_H)
-dependence.o : dependence.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) \
- $(C_COMMON_H) flags.h varray.h $(EXPR_H) $(GGC_H) gt-dependence.h
+ output.h except.h $(TM_P_H) real.h
params.o : params.c $(CONFIG_H) $(SYSTEM_H) $(PARAMS_H) toplev.h
hooks.o: hooks.c $(CONFIG_H) $(SYSTEM_H) $(HOOKS_H)
@@ -1820,7 +1811,7 @@ s-attrtab : $(md_file) genattrtab$(build_exeext) $(srcdir)/move-if-change
insn-output.o : insn-output.c $(CONFIG_H) $(RTL_H) $(GGC_H) $(REGS_H) real.h \
conditions.h hard-reg-set.h insn-config.h $(INSN_ATTR_H) $(EXPR_H) \
output.h $(RECOG_H) function.h $(SYSTEM_H) toplev.h flags.h \
- insn-codes.h $(TM_P_H)
+ insn-codes.h $(TM_P_H) $(TARGET_H)
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-output.c \
$(OUTPUT_OPTION)
@@ -1856,7 +1847,7 @@ GTFILES = $(GCONFIG_H) $(srcdir)/location.h \
$(srcdir)/c-common.h $(srcdir)/c-tree.h \
$(srcdir)/basic-block.h \
$(srcdir)/alias.c $(srcdir)/bitmap.c $(srcdir)/cselib.c \
- $(srcdir)/dependence.c $(srcdir)/dwarf2out.c $(srcdir)/emit-rtl.c \
+ $(srcdir)/dwarf2out.c $(srcdir)/emit-rtl.c \
$(srcdir)/except.c $(srcdir)/explow.c $(srcdir)/expr.c \
$(srcdir)/fold-const.c $(srcdir)/function.c \
$(srcdir)/gcse.c $(srcdir)/integrate.c $(srcdir)/lists.c $(srcdir)/optabs.c \
@@ -1877,7 +1868,7 @@ gt-integrate.h gt-stmt.h gt-tree.h gt-varasm.h gt-emit-rtl.h : s-gtype; @true
gt-explow.h gt-stor-layout.h gt-regclass.h gt-lists.h : s-gtype; @true
gt-alias.h gt-cselib.h gt-fold-const.h gt-gcse.h gt-profile.h : s-gtype; @true
gt-expr.h gt-sdbout.h gt-optabs.h gt-bitmap.h gt-dwarf2out.h : s-gtype ; @true
-gt-ra-build.h gt-reg-stack.h gt-dependence.h : s-gtype ; @true
+gt-ra-build.h gt-reg-stack.h : s-gtype ; @true
gt-c-common.h gt-c-decl.h gt-c-parse.h gt-c-pragma.h : s-gtype; @true
gt-c-objc-common.h gtype-c.h gt-location.h : s-gtype ; @true
@@ -2071,7 +2062,8 @@ gengtype$(build_exeext) : gengtype.o gengtype-lex.o gengtype-yacc.o \
$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
gengtype.o gengtype-lex.o gengtype-yacc.o $(HOST_LIBS)
-gengtype.o : gengtype.c gengtype.h $(HCONFIG_H) $(SYSTEM_H) real.h gtyp-gen.h
+gengtype.o : gengtype.c gengtype.h $(HCONFIG_H) $(SYSTEM_H) real.h rtl.def \
+ gtyp-gen.h
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
$(srcdir)/gengtype.c $(OUTPUT_OPTION)
@@ -2122,11 +2114,11 @@ $(BUILD_PREFIX_1)rtl.o: $(srcdir)/rtl.c $(HCONFIG_H) $(SYSTEM_H) $(RTL_H) \
sed -e 's/config[.]h/hconfig.h/' $(srcdir)/rtl.c > $(BUILD_PREFIX)rtl.c
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(BUILD_PREFIX)rtl.c $(OUTPUT_OPTION)
-$(BUILD_PREFIX_1)print-rtl.o: $(srcdir)/print-rtl.c $(HCONFIG_H) \
+print-rtl1.o: $(srcdir)/print-rtl.c $(HCONFIG_H) \
$(RTL_H) $(TREE_H) hard-reg-set.h $(BASIC_BLOCK_H)
- rm -f $(BUILD_PREFIX)print-rtl.c
- sed -e 's/config[.]h/hconfig.h/' $(srcdir)/print-rtl.c > $(BUILD_PREFIX)print-rtl.c
- $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(BUILD_PREFIX)print-rtl.c $(OUTPUT_OPTION)
+ rm -f print-rtl1.c
+ sed -e 's/config[.]h/hconfig.h/' $(srcdir)/print-rtl.c > print-rtl1.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) print-rtl1.c $(OUTPUT_OPTION)
$(BUILD_PREFIX_1)bitmap.o: $(srcdir)/bitmap.c $(HCONFIG_H) $(SYSTEM_H) \
$(RTL_H) flags.h $(BASIC_BLOCK_H) $(REGS_H) $(GGC_H)
@@ -2187,7 +2179,7 @@ PREPROCESSOR_DEFINES = \
-DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_alias)\" \
-DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \
-DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \
- -DCROSS_INCLUDE_DIR=\"$(gcc_tooldir)/sys-include\" \
+ -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \
-DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\"
LIBCPP_OBJS = cpplib.o cpplex.o cppmacro.o cppexp.o cppfiles.o cpptrad.o \
@@ -2293,19 +2285,31 @@ test-protoize-simple: ./protoize ./unprotoize $(GCC_PASSES)
diff $(srcdir)/protoize.c tmp-proto.c | cat
-rm -f tmp-proto.[cs] tmp-proto$(objext)
-gcov.o: gcov.c gcov-io.h intl.h $(SYSTEM_H) $(CONFIG_H)
+# gcov-iov.c is run on the build machine to generate gcov-iov.h from version.c
+gcov-iov.o: gcov-iov.c version.c $(HCONFIG_H) $(SYSTEM_H)
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gcov-iov.c $(OUTPUT_OPTION)
+gcov-iov$(build_exeext): gcov-iov.o
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) gcov-iov.o -o $@
+gcov-iov.h: gcov-iov$(build_exeext)
+ ./$< > $@
+
+gcov.o: gcov.c gcov-io.h gcov-iov.h intl.h $(SYSTEM_H) $(CONFIG_H)
+gcov-dump.o: gcov-dump.c gcov-io.h gcov-iov.h $(SYSTEM_H) $(CONFIG_H)
# Only one of 'gcov' or 'gcov.exe' is actually built, depending
# upon whether $(exeext) is empty or not.
GCOV_OBJS = gcov.o intl.o version.o
gcov$(exeext): $(GCOV_OBJS) $(LIBDEPS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_OBJS) $(LIBS) -o $@
+GCOV_DUMP_OBJS = gcov-dump.o version.o
+gcov-dump$(exeext): $(GCOV_DUMP_OBJS) $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_DUMP_OBJS) $(LIBS) -o $@
#
# Build the include directory. The stamp files are stmp-* rather than
# s-* so that mostlyclean does not force the include directory to
# be rebuilt.
-# Build the include directory including float.h
+# Build the include directory
stmp-int-hdrs: $(STMP_FIXINC) $(USER_H) xlimits.h
# Copy in the headers provided with gcc.
# The sed command gets just the last file name component;
@@ -2325,11 +2329,6 @@ stmp-int-hdrs: $(STMP_FIXINC) $(USER_H) xlimits.h
rm -f include/limits.h
cp xlimits.h include/limits.h
chmod a+r include/limits.h
- rm -f include/float.h
- if [ x$(FLOAT_H) != xMakefile.in ]; then \
- cp $(srcdir)/config/$(FLOAT_H) include/float.h && \
- chmod a+r include/float.h; \
- else :; fi
# Install the README
rm -f include/README
cp $(srcdir)/README-fixinc include/README
@@ -2357,8 +2356,18 @@ fixinc.sh: $(FIXINCSRCDIR)/mkfixinc.sh $(FIXINCSRCDIR)/fixincl.c \
export MAKE srcdir CC CFLAGS LDFLAGS WARN_CFLAGS; cd ./fixinc && \
$(SHELL) $${srcdir}/mkfixinc.sh $(build_canonical) $(target))
+.PHONY: install-gcc-tooldir
+install-gcc-tooldir:
+ $(SHELL) ${srcdir}/mkinstalldirs $(gcc_tooldir)
+
# Build fixed copies of system files.
stmp-fixinc: fixinc.sh gsyslimits.h
+ @if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ echo The directory that should contain system headers does not exist: >&2 ; \
+ echo " ${SYSTEM_HEADER_DIR}" >&2 ; \
+ if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
+ then sleep 1; else exit 1; fi; \
+ fi
rm -rf include; mkdir include
-chmod a+rx include
(TARGET_MACHINE='$(target)'; srcdir=`cd $(srcdir); ${PWD}`; \
@@ -2372,20 +2381,6 @@ stmp-fixinc: fixinc.sh gsyslimits.h
cp $(srcdir)/gsyslimits.h include/syslimits.h; \
fi; \
chmod a+r include/syslimits.h)
-# If $(SYSTEM_HEADER_DIR) is $(build_tooldir)/sys-include, and
-# that directory exists, then make sure that $(libsubdir) exists.
-# This is because cpp is compiled to find $(gcc_tooldir)/include via
-# $(libsubdir)/$(unlibsubdir), which will only work if $(libsubdir)
-# exists.
-# ??? Better would be to use -isystem $(build_tooldir)/sys-include,
-# but fixincludes does not take such arguments.
- if [ "$(SYSTEM_HEADER_DIR)" = "$(build_tooldir)/sys-include" ] \
- && [ -d $(build_tooldir)/sys-include ]; then \
- if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; fi; \
- if [ -d $(libdir)/gcc-lib ] ; then true ; else mkdir $(libdir)/gcc-lib; fi; \
- if [ -d $(libdir)/gcc-lib/$(target_alias) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target_alias) ; fi; \
- if [ -d $(libdir)/gcc-lib/$(target_alias)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target_alias)/$(version) ; fi; \
- else true; fi
$(STAMP) stmp-fixinc
# Files related to the fixproto script.
@@ -2394,7 +2389,7 @@ stmp-fixinc: fixinc.sh gsyslimits.h
# libiberty.a.
deduced.h: $(GCC_PASSES) $(srcdir)/scan-types.sh stmp-int-hdrs
- if [ -d $(SYSTEM_HEADER_DIR) ]; \
+ if [ -d "$(SYSTEM_HEADER_DIR)" ]; \
then \
CC="$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) -I. -I$(srcdir) -isystem include -isystem ${SYSTEM_HEADER_DIR}"; \
export CC; \
@@ -2460,7 +2455,7 @@ stmp-fixproto: fixhdr.ready fixproto stmp-int-hdrs
FIXPROTO_DEFINES="$(FIXPROTO_DEFINES)"; export FIXPROTO_DEFINES; \
mkinstalldirs="$(SHELL) $(srcdir)/mkinstalldirs"; \
export mkinstalldirs; \
- if [ -d $(SYSTEM_HEADER_DIR) ] ; then \
+ if [ -d "$(SYSTEM_HEADER_DIR)" ]; then \
$(SHELL) ${srcdir}/fixproto include include $(SYSTEM_HEADER_DIR); \
if [ $$? -eq 0 ] ; then true ; else exit 1 ; fi ; \
else true; fi; \
@@ -2483,7 +2478,7 @@ TEXI_GCC_FILES = $(docdir)/gcc.texi $(docdir)/include/gcc-common.texi \
$(docdir)/invoke.texi $(docdir)/extend.texi $(docdir)/md.texi \
$(docdir)/objc.texi $(docdir)/gcov.texi $(docdir)/trouble.texi \
$(docdir)/bugreport.texi $(docdir)/service.texi \
- $(docdir)/contribute.texi $(docdir)/vms.texi \
+ $(docdir)/contribute.texi $(docdir)/vms.texi $(docdir)/compat.texi \
$(docdir)/include/funding.texi $(docdir)/gnu.texi \
$(docdir)/include/gpl.texi $(docdir)/include/fdl.texi \
$(docdir)/contrib.texi $(docdir)/cppenv.texi $(docdir)/cppopts.texi
@@ -2623,7 +2618,7 @@ mostlyclean: $(INTL_MOSTLYCLEAN) lang.mostlyclean
# Delete the temp files made in the course of building libgcc.a.
-rm -f xlimits.h
# Delete other built files.
- -rm -f t-float.h-cross xsys-protos.hT
+ -rm -f xsys-protos.hT
-rm -f specs.h options.h gencheck.h
# Delete the stamp and temporary files.
-rm -f s-* tmp-* stamp-* stmp-*
@@ -2631,7 +2626,7 @@ mostlyclean: $(INTL_MOSTLYCLEAN) lang.mostlyclean
# Delete debugging dump files.
-rm -f *.[0-9][0-9].* */*.[0-9][0-9].*
# Delete some files made during installation.
- -rm -f specs float.h-* SYSCALLS.c.X SYSCALLS.c
+ -rm -f specs SYSCALLS.c.X SYSCALLS.c
-rm -f collect collect2 mips-tfile mips-tdump
# Delete files generated for fixproto
-rm -rf fix-header$(build_exeext) xsys-protos.h deduced.h tmp-deduced.h \
@@ -2690,11 +2685,10 @@ distclean: clean $(INTL_DISTCLEAN) lang.distclean
-rm -f */stage1 */stage2 */stage3 */stage4 */include
-rm -f c-parse.output
-rm -f *.asm
- -rm -f float.h
-rm -f site.exp site.bak testsuite/site.exp testsuite/site.bak
-rm -f testsuite/*.log testsuite/*.sum
-cd testsuite && rm -f x *.x *.x? *.exe *.rpo *.o *.s *.S *.c
- -cd testsuite && rm -f *.out *.gcov *.bb *.bbg
+ -cd testsuite && rm -f *.out *.gcov *$(coverageexts)
-rm -rf ${QMTEST_DIR} stamp-qmtest
-rm -f intl/libintl.h libintl.h
-rm -f cxxmain.c
@@ -3029,10 +3023,6 @@ install-mkheaders: stmp-int-hdrs $(STMP_FIXPROTO) install-include-dir \
$(INSTALL_DATA) $$file \
$(itoolsdir)/include/$$realfile ; \
done
- if [ x$(FLOAT_H) != xMakefile.in ]; then \
- $(INSTALL_DATA) $(srcdir)/config/$(FLOAT_H) \
- $(itoolsdir)/include/float.h ; \
- else :; fi
$(INSTALL_DATA) xlimits.h $(itoolsdir)/include/limits.h
if [ x$(STMP_FIXINC) != x ] ; then \
$(INSTALL_DATA) $(srcdir)/README-fixinc \
@@ -3049,7 +3039,7 @@ install-mkheaders: stmp-int-hdrs $(STMP_FIXPROTO) install-include-dir \
$(itoolsdir)/fix-header$(build_exeext) ; \
else :; fi
$(INSTALL_PROGRAM) mkheaders $(itoolsdir)/mkheaders
- echo 'SYSTEM_HEADER_DIR="$(SYSTEM_HEADER_DIR)"' \
+ echo 'SYSTEM_HEADER_DIR="'"$(SYSTEM_HEADER_DIR)"'"' \
> $(itoolsdir)/mkheaders.conf
echo 'OTHER_FIXINCLUDES_DIRS="$(OTHER_FIXINCLUDES_DIRS)"' \
>> $(itoolsdir)/mkheaders.conf
@@ -3136,6 +3126,14 @@ site.exp: ./config.status Makefile
fi
echo "set tmpdir $(objdir)/testsuite" >> ./tmp0
@echo "set srcdir \"\$${srcdir}/testsuite\"" >> ./tmp0
+ @if [ "X$(ALT_CXX_UNDER_TEST)" != "X" ] ; then \
+ echo "set ALT_CXX_UNDER_TEST $(ALT_CXX_UNDER_TEST)" >> ./tmp0; \
+ else true; \
+ fi
+ @if [ "X$(COMPAT_OPTIONS)" != "X" ] ; then \
+ echo "set COMPAT_OPTIONS $(COMPAT_OPTIONS)" >> ./tmp0; \
+ else true; \
+ fi
@echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0
@cat ./tmp0 > site.exp
@cat site.bak | sed \
@@ -3271,7 +3269,7 @@ ${QMTEST_DIR}/context: stamp-qmtest
# Run the G++ testsuite using QMTest.
qmtest-g++: ${QMTEST_DIR}/context ${QMTEST_DIR}/gpp-expected.qmr
cd ${QMTEST_DIR} && ${QMTEST} run ${QMTESTRUNFLAGS} -C context \
- -o gpp.qmr -O ${QMTEST_DIR}/gpp-expected.qmr \
+ -o gpp.qmr -O gpp-expected.qmr \
${QMTEST_GPP_TESTS}
# Use the QMTest GUI.
@@ -3288,6 +3286,15 @@ ${QMTEST_DIR}/gpp-expected.qmr: ${QMTEST_DIR}/context
.PHONY: qmtest-g++
+# Run Paranoia on real.c.
+
+paranoia.o: $(srcdir)/../contrib/paranoia.cc $(CONFIG_H) $(SYSTEM_H) \
+ real.h $(TREE_H)
+ g++ -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
+
+paranoia: paranoia.o real.o $(LIBIBERTY)
+ g++ -o $@ paranoia.o real.o $(LIBIBERTY)
+
# These exist for maintenance purposes.
# Update the tags table.
@@ -3553,6 +3560,10 @@ stage1-start:
else true; \
fi; done
stage1: force stage1-start lang.stage1
+ -for dir in . $(SUBDIRS) ; \
+ do \
+ rm -f $$dir/*$(coverageexts) ; \
+ done
stage2-start:
-if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 5cefb6e53cb..64cb2ccfc10 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,32 @@
+2002-09-23 Zack Weinberg <zack@codesourcery.com>
+
+ * Make-lang.in (EXTRA_GNATBIND_OBJS): Add version.o.
+ * Makefile.in (TOOLS_LIBS): Add ../../version.o.
+ * gnatvsn.ads: Gnat_Version_String is now a function.
+ * gnatvsn.adb: New file. When asked for Gnat_Version_String,
+ copy the C version_string into a String and return it.
+ * gnatcmd.adb, gnatkr.adb, gnatlbr.adb, gnatlink.adb,
+ gnatls.adb,gnatmake.adb, gnatprep.adb, gnatpsta.adb:
+ Remove pragma Ident (Gnat_Version_String). If this was the
+ sole use of package Gnatvsn, remove the with statement too.
+ * gnat1drv.adb: Tweak -gnatv output.
+
+2002-09-17 Richard Henderson <rth@redhat.com>
+
+ * trans.c (tree_transform): Use real_ldexp not REAL_VALUE_LDEXP.
+ * config/dsp16xx/dsp16xx.md (fixuns_trunchfhi2): Use real_2expN.
+ * config/mips/mips.md (fixuns_truncdfsi2): Likewise.
+ (fixuns_truncdfdi2, fixuns_truncsfsi2, fixuns_truncsfdi2): Likewise.
+ * config/m68k/m68k.c (floating_exact_log2): Use real_exponent
+ and real_2expN instead of a loop.
+ * doc/tm.texi (REAL_VALUE_LDEXP): Remove.
+ (REAL_VALUE_RNDZINT, REAL_VALUE_UNSIGNED_RNDZINT): Remove.
+
+2002-08-25 Andre Leis <a.leis@gmx.net>
+ David Billinghurst (David.Billinghurst@riotinto.com>
+
+ * sysdep.c (__gnat_ttyname): include <termios.h> on cygwin
+
2002-08-13 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* Make-lang.in (gnatbind$(exeext)): Link with $(SYSLIBS).
@@ -249,7 +278,7 @@
2002-04-21 Florian Weimer <fw@deneb.enyo.de>
- * gnat_ug.texi: New file.
+ * gnat_ug.texi: New file.
* gnat_rm.texi: Do not include texiplus.texi. Include fdl.texi
instead of gfdl.texi
@@ -257,7 +286,7 @@
* xgnatug.adb, ug_words: New files.
* Makefile.in (doc, dvi): New targets. Build gnat_ug_*,
- gnat_rm and gnat-style manuals.
+ gnat_rm and gnat-style manuals.
2002-04-18 Neil Booth <neil@daikokuya.demon.co.uk>
@@ -417,7 +446,7 @@
2002-03-23 Florian Weimer <fw@deneb.enyo.de>
* gnat_rm.texi: Sync with ACT version.
- (From Ben Brosgol <brosgol@gnat.com>)
+ (From Ben Brosgol <brosgol@gnat.com>)
2002-03-20 Neil Booth <neil@daikokuya.demon.co.uk>
@@ -1725,7 +1754,7 @@
2001-12-03 Robert Dewar <dewar@gnat.com>
* sinfo.ads: Minor reformatting. N_Freeze_Entity node does not
- have Associated_Node.
+ have Associated_Node.
2001-12-03 Robert Dewar <dewar@gnat.com>
@@ -2098,7 +2127,7 @@ Thu Nov 15 18:16:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-26 Vincent Celier <celier@gnat.com>
* g-os_lib.adb (Normalize_Pathname): Preserve the double slash
- ("//") that precede the drive letter on Interix.
+ ("//") that precede the drive letter on Interix.
2001-10-26 Geert Bosch <bosch@gnat.com>
@@ -2107,7 +2136,7 @@ Thu Nov 15 18:16:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-25 Robert Dewar <dewar@gnat.com>
* sem_ch8.adb (Analyze_Package_Renaming): Skip analysis if Name
- is Error. Similar change for other renaming cases.
+ is Error. Similar change for other renaming cases.
2001-10-25 Robert Dewar <dewar@gnat.com>
@@ -2117,22 +2146,22 @@ Thu Nov 15 18:16:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-25 Ed Schonberg <schonber@gnat.com>
* par-ch3.adb (P_Subtype_Mark_Resync): for an anonymous array
- return Error rather than Empty so that analysis can proceed.
+ return Error rather than Empty so that analysis can proceed.
2001-10-25 Ed Schonberg <schonber@gnat.com>
* sem_util.adb (Enter_Name): better handling of cascaded error
- messages when a unit appears in its own context.
+ messages when a unit appears in its own context.
2001-10-25 Ed Schonberg <schonber@gnat.com>
* sem_util.adb (Defining_Entity): in case of error, attach created
- entity to specification, so that semantic analysis can proceed.
+ entity to specification, so that semantic analysis can proceed.
2001-10-25 Robert Dewar <dewar@gnat.com>
* sem_util.adb
- (Defining_Entity): Deal with Error.
+ (Defining_Entity): Deal with Error.
(Process_End_Label): Deal with bad end label for.
2001-10-25 Ed Schonberg <schonber@gnat.com>
@@ -2152,20 +2181,20 @@ Thu Nov 15 18:16:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-25 Ed Schonberg <schonber@gnat.com>
* sem_res.adb (Resolve_Call): if the call is actually an indexing
- operation on the result of a parameterless call, perform elaboration
- check after the node has been properly rewritten.
+ operation on the result of a parameterless call, perform elaboration
+ check after the node has been properly rewritten.
* sem_ch12.adb (Copy_Generic_Node): after the proper body has been
- inlined within the generic tree, the defining identifier is not a
- compilation_unit.
+ inlined within the generic tree, the defining identifier is not a
+ compilation_unit.
2001-10-25 Ed Schonberg <schonber@gnat.com>
* sem_res.adb (Resolve): special-case resolution of Null in an
- instance or an inlined body to avoid view conflicts.
+ instance or an inlined body to avoid view conflicts.
* sem_ch12.adb (Copy_Generic_Node): for allocators, check for view
- compatibility by retrieving the access type of the generic copy.
+ compatibility by retrieving the access type of the generic copy.
2001-10-25 Robert Dewar <dewar@gnat.com>
@@ -2184,10 +2213,10 @@ Thu Nov 15 18:16:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-25 Pascal Obry <obry@gnat.com>
* gnatmem.adb (Read_Next): fix Curs2 value to properly handle quiet
- mode case for ALLOC case.
+ mode case for ALLOC case.
* gnatmem.adb (Read_Next): correctly fix parsing in Quiet mode on
- all platforms. Improvement of last change.
+ all platforms. Improvement of last change.
2001-10-25 Robert Dewar <dewar@gnat.com>
@@ -2200,25 +2229,25 @@ Thu Nov 15 18:16:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-25 Pascal Obry <obry@gnat.com>
* osint.adb (Read_Default_Search_Dirs): correctly detect relative
- pathnames in UNIX and DOS style with drive letter.
+ pathnames in UNIX and DOS style with drive letter.
(Is_Relative): new routine.
* osint.adb: Minor reformatting
* osint.adb (Is_Relative): implementation using
- GNAT.OS_Lib.Is_Absolute_Path. Better fix.
+ GNAT.OS_Lib.Is_Absolute_Path. Better fix.
2001-10-25 Pascal Obry <obry@gnat.com>
* g-dirope.adb (Basename): correctly compute offset between the
- original Path and the translated one.
+ original Path and the translated one.
* g-dirope.adb: (Base_Name): add some comments.
2001-10-25 Robert Dewar <dewar@gnat.com>
* exp_imgv.adb (Expand_Image_Attribute): Defend against bad use
- in HIE mode, avoids compilation abandoned message
+ in HIE mode, avoids compilation abandoned message
* exp_imgv.adb: Correct typo in previous change
diff --git a/gcc/ada/Make-lang.in b/gcc/ada/Make-lang.in
index f84e02cc71e..8dd4c8fcd39 100644
--- a/gcc/ada/Make-lang.in
+++ b/gcc/ada/Make-lang.in
@@ -181,7 +181,7 @@ GNATBIND_OBJS = \
# List of extra object files linked in with various programs.
EXTRA_GNAT1_OBJS = prefix.o
-EXTRA_GNATBIND_OBJS = prefix.o
+EXTRA_GNATBIND_OBJS = prefix.o version.o
# FIXME: handle with configure substitutions
#ifeq ($(strip $(filter-out alpha% dec vms% openvms% alphavms%,$(host))),)
diff --git a/gcc/ada/Makefile.in b/gcc/ada/Makefile.in
index 72a72dd8698..e4e6bb2e508 100644
--- a/gcc/ada/Makefile.in
+++ b/gcc/ada/Makefile.in
@@ -248,8 +248,8 @@ LIBIBERTY = ../../libiberty/libiberty.a
# and the system's installed libraries.
LIBS = $(INTLLIBS) $(LIBIBERTY) $(SYSLIBS)
LIBDEPS = $(INTLDEPS) $(LIBIBERTY)
-TOOLS_LIBS = ../../prefix.o $(LIBGNAT) ../../../libiberty/libiberty.a \
- $(SYSLIBS)
+TOOLS_LIBS = ../../prefix.o ../../version.o $(LIBGNAT) \
+ ../../../libiberty/libiberty.a $(SYSLIBS)
# Specify the directories to be searched for header files.
# Both . and srcdir are used, in that order,
diff --git a/gcc/ada/gnat1drv.adb b/gcc/ada/gnat1drv.adb
index 7acd9a77164..0c7a996b84a 100644
--- a/gcc/ada/gnat1drv.adb
+++ b/gcc/ada/gnat1drv.adb
@@ -130,7 +130,8 @@ begin
end if;
Write_Str (Gnat_Version_String);
- Write_Str (" Copyright 1992-2002 Free Software Foundation, Inc.");
+ Write_Eol;
+ Write_Str ("Copyright 1992-2002 Free Software Foundation, Inc.");
Write_Eol;
end if;
diff --git a/gcc/ada/gnatcmd.adb b/gcc/ada/gnatcmd.adb
index 2a8372c8dc3..0048ed88e28 100644
--- a/gcc/ada/gnatcmd.adb
+++ b/gcc/ada/gnatcmd.adb
@@ -57,7 +57,6 @@ with GNAT.OS_Lib; use GNAT.OS_Lib;
with Table;
procedure GNATCmd is
- pragma Ident (Gnatvsn.Gnat_Version_String);
Ada_Include_Path : constant String := "ADA_INCLUDE_PATH";
Ada_Objects_Path : constant String := "ADA_OBJECTS_PATH";
diff --git a/gcc/ada/gnatkr.adb b/gcc/ada/gnatkr.adb
index 01ab98bd414..84f019bdd69 100644
--- a/gcc/ada/gnatkr.adb
+++ b/gcc/ada/gnatkr.adb
@@ -27,12 +27,10 @@
with Ada.Characters.Handling; use Ada.Characters.Handling;
with Ada.Command_Line; use Ada.Command_Line;
-with Gnatvsn;
with Krunch;
with System.IO; use System.IO;
procedure Gnatkr is
- pragma Ident (Gnatvsn.Gnat_Version_String);
Count : Natural;
Maxlen : Integer;
diff --git a/gcc/ada/gnatlbr.adb b/gcc/ada/gnatlbr.adb
index 7bf0a806e76..75d1e37d0e0 100644
--- a/gcc/ada/gnatlbr.adb
+++ b/gcc/ada/gnatlbr.adb
@@ -45,14 +45,12 @@
with Ada.Command_Line; use Ada.Command_Line;
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.OS_Lib; use GNAT.OS_Lib;
-with Gnatvsn; use Gnatvsn;
with Interfaces.C_Streams; use Interfaces.C_Streams;
with Osint; use Osint;
with Sdefault; use Sdefault;
with System;
procedure GnatLbr is
- pragma Ident (Gnat_Version_String);
type Lib_Mode is (None, Create, Set, Delete);
Next_Arg : Integer;
diff --git a/gcc/ada/gnatlink.adb b/gcc/ada/gnatlink.adb
index 87ba0598f1f..cb48bee383e 100644
--- a/gcc/ada/gnatlink.adb
+++ b/gcc/ada/gnatlink.adb
@@ -45,8 +45,6 @@ with Interfaces.C_Streams; use Interfaces.C_Streams;
procedure Gnatlink is
- pragma Ident (Gnat_Version_String);
-
package Gcc_Linker_Options is new Table.Table (
Table_Component_Type => String_Access,
Table_Index_Type => Integer,
diff --git a/gcc/ada/gnatls.adb b/gcc/ada/gnatls.adb
index ce6218ddb90..1208c1d1f8d 100644
--- a/gcc/ada/gnatls.adb
+++ b/gcc/ada/gnatls.adb
@@ -41,7 +41,6 @@ with Targparm; use Targparm;
with Types; use Types;
procedure Gnatls is
- pragma Ident (Gnat_Version_String);
Max_Column : constant := 80;
diff --git a/gcc/ada/gnatmake.adb b/gcc/ada/gnatmake.adb
index 1ce76674a27..1c481065cec 100644
--- a/gcc/ada/gnatmake.adb
+++ b/gcc/ada/gnatmake.adb
@@ -27,12 +27,9 @@
-- Gnatmake usage: please consult the gnat documentation
-with Gnatvsn;
with Make;
procedure Gnatmake is
- pragma Ident (Gnatvsn.Gnat_Version_String);
-
begin
-- The real work is done in Package Make. Gnatmake used to be a standalone
-- routine. Now Gnatmake's facilities have been placed in a package
diff --git a/gcc/ada/gnatprep.adb b/gcc/ada/gnatprep.adb
index 8fc5b33aabc..8c1bfced06d 100644
--- a/gcc/ada/gnatprep.adb
+++ b/gcc/ada/gnatprep.adb
@@ -36,7 +36,6 @@ with GNAT.Command_Line;
with Gnatvsn;
procedure GNATprep is
- pragma Ident (Gnatvsn.Gnat_Version_String);
type Strptr is access String;
diff --git a/gcc/ada/gnatpsta.adb b/gcc/ada/gnatpsta.adb
index 6a3d582e1c7..b525cb49c1e 100644
--- a/gcc/ada/gnatpsta.adb
+++ b/gcc/ada/gnatpsta.adb
@@ -34,13 +34,11 @@
-- integer and floating point sizes.
with Ada.Text_IO; use Ada.Text_IO;
-with Gnatvsn;
with Ttypef; use Ttypef;
with Ttypes; use Ttypes;
with Types; use Types;
procedure GnatPsta is
- pragma Ident (Gnatvsn.Gnat_Version_String);
procedure P (Item : String) renames Ada.Text_IO.Put_Line;
diff --git a/gcc/ada/gnatvsn.adb b/gcc/ada/gnatvsn.adb
new file mode 100644
index 00000000000..2555f7a570c
--- /dev/null
+++ b/gcc/ada/gnatvsn.adb
@@ -0,0 +1,82 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT COMPILER COMPONENTS --
+-- --
+-- G N A T V S N --
+-- --
+-- B o d y --
+-- --
+-- --
+-- Copyright (C) 2002 Free Software Foundation, Inc. --
+-- --
+-- GNAT is free software; you can redistribute it and/or modify it under --
+-- terms of the GNU General Public License as published by the Free Soft- --
+-- ware Foundation; either version 2, or (at your option) any later ver- --
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT 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 distributed with GNAT; see 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 other files instantiate generics from this --
+-- unit, or you link this unit with other files to produce an executable, --
+-- this unit 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 Public License. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
+-- --
+------------------------------------------------------------------------------
+
+package body Gnatvsn is
+
+ -- Import the string constant defined in the (language-independent)
+ -- source file version.c.
+
+ -- The size is a lie; we have no way of writing the truth (the size
+ -- is variable and depends on the actual text of the constant).
+
+ -- FIXME: It should be possible to declare this to be a constant, but
+ -- that is rejected by the compiler ("invalid context for deferred
+ -- constant declaration"). Per Ada95 this constraint only applies to
+ -- deferred constants completed by a full constant declaration, not
+ -- deferred constants completed by a pragma Import.
+
+ Version_String : array (0 .. Ver_Len_Max) of aliased Character;
+ pragma Import (C, Version_String, "version_string");
+
+ -- Convert that string constant to an Ada String and return it.
+ -- This is essentially the same as the To_Ada routine in
+ -- Interfaces.C; that package is not linked into gnat1 so
+ -- we cannot use it.
+
+ function Gnat_Version_String return String
+ is
+ Count : Natural := 0;
+
+ begin
+ loop
+ if Version_String (Count) = Character'First then
+ exit;
+ else
+ Count := Count + 1;
+ end if;
+ end loop;
+
+ declare
+ R : String (1 .. Count);
+
+ begin
+ for J in R'Range loop
+ R (J) := Version_String (J - 1);
+ end loop;
+
+ return R;
+ end;
+ end Gnat_Version_String;
+
+end Gnatvsn;
diff --git a/gcc/ada/gnatvsn.ads b/gcc/ada/gnatvsn.ads
index 7c3c3f06ef6..90e41a78343 100644
--- a/gcc/ada/gnatvsn.ads
+++ b/gcc/ada/gnatvsn.ads
@@ -32,20 +32,16 @@
-- --
------------------------------------------------------------------------------
--- This package spec holds version information for GNAT, GNATBIND and
--- GNATMAKE. It is updated whenever the release number is changed.
+-- This package spec exports version information for GNAT, GNATBIND and
+-- GNATMAKE.
package Gnatvsn is
- Gnat_Version_String : constant String := "3.3 20020822 (experimental)";
+ function Gnat_Version_String
+ return String;
-- Version output when GNAT (compiler), or its related tools, including
-- GNATBIND, GNATCHOP, GNATFIND, GNATLINK, GNATMAKE, GNATXREF, are run
-- (with appropriate verbose option switch set).
- --
- -- WARNING: some scripts rely on the format of this string. Any change
- -- must be coordinated with a script maintainer. Furthermore, no
- -- other variable in this package may have a name starting with
- -- Gnat_Version_String.
Gnat_Version_Type : constant String := "FSF ";
-- This string is set to one of three values:
diff --git a/gcc/ada/lang-specs.h b/gcc/ada/lang-specs.h
index d5244e971e0..8c290c13619 100644
--- a/gcc/ada/lang-specs.h
+++ b/gcc/ada/lang-specs.h
@@ -31,12 +31,13 @@
{".ads", "@ada", 0},
{".adb", "@ada", 0},
{"@ada",
- "gnat1 %{^I*} %{k8:-gnatk8} %{w:-gnatws} %1 %{!Q:-quiet} %{nostdinc*}\
+ "\
+ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
+ %{!gnatc:%{!gnatz:%{!gnats:%{!S:%{!c:\
+ %eone of -c, -S, -gnatc, -gnatz, or -gnats is required for Ada}}}}}\
+ gnat1 %{I*} %{k8:-gnatk8} %{w:-gnatws} %1 %{!Q:-quiet} %{nostdinc*}\
-dumpbase %{.adb:%b.adb}%{.ads:%b.ads}%{!.adb:%{!.ads:%b.ada}}\
%{g*} %{O*} %{W*} %{w} %{p} %{pg:-p} %{m*} %{a} %{f*} %{d*}\
%{!S:%{o*:%w%*-gnatO}} \
- %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
- %i %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
- %{!S:%{!gnatc:%{!gnatz:%{!gnats:as %a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}\
- %{!c:%e-c or -S required for Ada}\
- %{!pipe:%g.s} %A\n}}}} ", 0},
+ %i %{S:%W{o*}%{!o*:-o %b.s}} \
+ %{!gnatc:%{!gnatz:%{!gnats:%(invoke_as)}}}", 0},
diff --git a/gcc/ada/misc.c b/gcc/ada/misc.c
index 60babc41d65..f4055d5df47 100644
--- a/gcc/ada/misc.c
+++ b/gcc/ada/misc.c
@@ -206,8 +206,8 @@ gnat_parse_file (set_yydebug)
/* Decode all the language specific options that cannot be decoded by GCC.
The option decoding phase of GCC calls this routine on the flags that
- it cannot decode. This routine returns 1 if it is successful, otherwise
- it returns 0. */
+ it cannot decode. This routine returns the number of consecutive arguments
+ from ARGV that it successfully decoded; 0 indicates failure. */
int
gnat_decode_option (argc, argv)
@@ -219,10 +219,28 @@ gnat_decode_option (argc, argv)
if (!strncmp (p, "-I", 2))
{
- /* Pass the -I switches as-is. */
- gnat_argv[gnat_argc] = p;
- gnat_argc ++;
- return 1;
+ /* We might get -I foo or -Ifoo. Canonicalize to the latter. */
+ if (p[2] == '\0')
+ {
+ char *q;
+
+ if (argv[1] == 0)
+ return 0;
+
+ q = xmalloc (sizeof("-I") + strlen (argv[1]));
+ strcpy (q, "-I");
+ strcat (q, argv[1]);
+
+ gnat_argv[gnat_argc] = q;
+ gnat_argc ++;
+ return 2; /* consumed argument */
+ }
+ else
+ {
+ gnat_argv[gnat_argc] = p;
+ gnat_argc ++;
+ return 1;
+ }
}
else if (!strncmp (p, "-gant", 5))
diff --git a/gcc/ada/sysdep.c b/gcc/ada/sysdep.c
index 13103ef2e6a..ab32fa8282c 100644
--- a/gcc/ada/sysdep.c
+++ b/gcc/ada/sysdep.c
@@ -294,7 +294,8 @@ __gnat_ttyname (filedes)
#if defined (linux) || defined (sun) || defined (sgi) || defined (__EMX__) \
|| (defined (__osf__) && ! defined (__alpha_vxworks)) || defined (WINNT) \
|| defined (__MACHTEN__) || defined (hpux) || defined (_AIX) \
- || (defined (__svr4__) && defined (i386)) || defined (__Lynx__)
+ || (defined (__svr4__) && defined (i386)) || defined (__Lynx__) \
+ || defined (__CYGWIN__)
#include <termios.h>
#else
@@ -349,7 +350,7 @@ getc_immediate_common (stream, ch, end_of_file, avail, waiting)
{
#if defined (linux) || defined (sun) || defined (sgi) || defined (__EMX__) \
|| (defined (__osf__) && ! defined (__alpha_vxworks)) \
- || defined (__CYGWIN32__) || defined (__MACHTEN__) || defined (hpux) \
+ || defined (__CYGWIN__) || defined (__MACHTEN__) || defined (hpux) \
|| defined (_AIX) || (defined (__svr4__) && defined (i386)) \
|| defined (__Lynx__)
char c;
diff --git a/gcc/ada/trans.c b/gcc/ada/trans.c
index 2fafd48de8e..92b7ceb45f4 100644
--- a/gcc/ada/trans.c
+++ b/gcc/ada/trans.c
@@ -576,11 +576,13 @@ tree_transform (gnat_node)
gigi_abort (336);
else
- gnu_result
- = build_real (gnu_result_type,
- REAL_VALUE_LDEXP
- (TREE_REAL_CST (gnu_result),
- - UI_To_Int (Denominator (ur_realval))));
+ {
+ REAL_VALUE_TYPE tmp;
+
+ real_ldexp (&tmp, &TREE_REAL_CST (gnu_result),
+ - UI_To_Int (Denominator (ur_realval)));
+ gnu_result = build_real (gnu_result_type, tmp);
+ }
}
/* Now see if we need to negate the result. Do it this way to
diff --git a/gcc/alias.c b/gcc/alias.c
index 68a827224fa..ca560b69e8c 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -1,5 +1,5 @@
/* Alias analysis for GNU C
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by John Carr (jfc@mit.edu).
This file is part of GCC.
@@ -332,8 +332,8 @@ objects_must_conflict_p (t1, t2)
then they may not conflict. */
if ((t1 != 0 && readonly_fields_p (t1))
|| (t2 != 0 && readonly_fields_p (t2))
- || (t1 != 0 && TYPE_READONLY (t1))
- || (t2 != 0 && TYPE_READONLY (t2)))
+ || (t1 != 0 && lang_hooks.honor_readonly && TYPE_READONLY (t1))
+ || (t2 != 0 && lang_hooks.honor_readonly && TYPE_READONLY (t2)))
return 0;
/* If they are the same type, they must conflict. */
@@ -2199,8 +2199,8 @@ canon_true_dependence (mem, mem_mode, mem_addr, x, varies)
varies);
}
-/* Returns non-zero if a write to X might alias a previous read from
- (or, if WRITEP is non-zero, a write to) MEM. */
+/* Returns nonzero if a write to X might alias a previous read from
+ (or, if WRITEP is nonzero, a write to) MEM. */
static int
write_dependence_p (mem, x, writep)
@@ -2389,7 +2389,7 @@ nonlocal_mentioned_p_1 (loc, data)
return 0;
}
-/* Returns non-zero if X might mention something which is not
+/* Returns nonzero if X might mention something which is not
local to the function and is not constant. */
static int
@@ -2487,7 +2487,7 @@ nonlocal_referenced_p_1 (loc, data)
return 0;
}
-/* Returns non-zero if X might reference something which is not
+/* Returns nonzero if X might reference something which is not
local to the function and is not constant. */
static int
@@ -2567,7 +2567,7 @@ nonlocal_set_p_1 (loc, data)
return 0;
}
-/* Returns non-zero if X might set something which is not
+/* Returns nonzero if X might set something which is not
local to the function and is not constant. */
static int
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 507fac04313..a72b9b9dc3c 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -112,7 +112,11 @@ do { \
be done, other than zero the statistics on the first allocation. */
#define MAX_REGNO_REG_SET(NUM_REGS, NEW_P, RENUMBER_P)
-/* Type we use to hold basic block counters. Should be at least 64bit. */
+/* Type we use to hold basic block counters. Should be at least
+ 64bit. Although a counter cannot be negative, we use a signed
+ type, because erroneous negative counts can be generated when the
+ flow graph is manipulated by various optimizations. A signed type
+ makes those easy to detect. */
typedef HOST_WIDEST_INT gcov_type;
/* Control flow edge information. */
@@ -144,7 +148,7 @@ typedef struct edge_def {
#define EDGE_FAKE 16 /* Not a real edge (profile.c) */
#define EDGE_DFS_BACK 32 /* A backwards edge */
#define EDGE_CAN_FALLTHRU 64 /* Candidate for straight line
- flow. */
+ flow. */
#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
@@ -435,7 +439,7 @@ struct loop
/* Link to the next (sibling) loop. */
struct loop *next;
- /* Non-zero if the loop is invalid (e.g., contains setjmp.). */
+ /* Nonzero if the loop is invalid (e.g., contains setjmp.). */
int invalid;
/* Auxiliary info specific to a pass. */
@@ -444,16 +448,13 @@ struct loop
/* The following are currently used by loop.c but they are likely to
disappear as loop.c is converted to use the CFG. */
- /* Non-zero if the loop has a NOTE_INSN_LOOP_VTOP. */
+ /* Nonzero if the loop has a NOTE_INSN_LOOP_VTOP. */
rtx vtop;
- /* Non-zero if the loop has a NOTE_INSN_LOOP_CONT.
+ /* Nonzero if the loop has a NOTE_INSN_LOOP_CONT.
A continue statement will generate a branch to NEXT_INSN (cont). */
rtx cont;
- /* The dominator of cont. */
- rtx cont_dominator;
-
/* The NOTE_INSN_LOOP_BEG. */
rtx start;
@@ -773,7 +774,7 @@ typedef struct conflict_graph_def *conflict_graph;
/* Callback function when enumerating conflicts. The arguments are
the smaller and larger regno in the conflict. Returns zero if
- enumeration is to continue, non-zero to halt enumeration. */
+ enumeration is to continue, nonzero to halt enumeration. */
typedef int (*conflict_graph_enum_fn) PARAMS ((int, int, void *));
diff --git a/gcc/bitmap.c b/gcc/bitmap.c
index e22a524ce17..21378b5c677 100644
--- a/gcc/bitmap.c
+++ b/gcc/bitmap.c
@@ -706,7 +706,7 @@ bitmap_equal_p (a, b)
bitmap_head c;
int ret;
- c.first = c.current = 0;
+ memset (&c, 0, sizeof (c));
ret = ! bitmap_operation (&c, a, b, BITMAP_XOR);
bitmap_clear (&c);
diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
index 7a33ffd7894..be52392b49b 100644
--- a/gcc/builtin-types.def
+++ b/gcc/builtin-types.def
@@ -84,6 +84,9 @@ DEF_PRIMITIVE_TYPE (BT_VALIST_ARG, va_list_arg_type_node)
DEF_FUNCTION_TYPE_0 (BT_FN_VOID, BT_VOID)
DEF_FUNCTION_TYPE_0 (BT_FN_PTR, BT_PTR)
DEF_FUNCTION_TYPE_0 (BT_FN_UNSIGNED, BT_UNSIGNED)
+DEF_FUNCTION_TYPE_0 (BT_FN_FLOAT, BT_FLOAT)
+DEF_FUNCTION_TYPE_0 (BT_FN_DOUBLE, BT_DOUBLE)
+DEF_FUNCTION_TYPE_0 (BT_FN_LONG_DOUBLE, BT_LONG_DOUBLE)
DEF_FUNCTION_TYPE_1 (BT_FN_LONG_LONG, BT_LONG, BT_LONG)
DEF_FUNCTION_TYPE_1 (BT_FN_LONGLONG_LONGLONG, BT_LONGLONG, BT_LONGLONG)
@@ -114,6 +117,10 @@ DEF_FUNCTION_TYPE_1 (BT_FN_INT_CONST_STRING, BT_INT, BT_CONST_STRING)
DEF_FUNCTION_TYPE_1 (BT_FN_PTR_PTR, BT_PTR, BT_PTR)
DEF_FUNCTION_TYPE_1 (BT_FN_VOID_VALIST_REF, BT_VOID, BT_VALIST_REF)
DEF_FUNCTION_TYPE_1 (BT_FN_VOID_INT, BT_VOID, BT_INT)
+DEF_FUNCTION_TYPE_1 (BT_FN_FLOAT_CONST_STRING, BT_FLOAT, BT_CONST_STRING)
+DEF_FUNCTION_TYPE_1 (BT_FN_DOUBLE_CONST_STRING, BT_DOUBLE, BT_CONST_STRING)
+DEF_FUNCTION_TYPE_1 (BT_FN_LONG_DOUBLE_CONST_STRING,
+ BT_LONG_DOUBLE, BT_CONST_STRING)
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_INT, BT_VOID, BT_PTR, BT_INT)
DEF_FUNCTION_TYPE_2 (BT_FN_STRING_STRING_CONST_STRING,
diff --git a/gcc/builtins.c b/gcc/builtins.c
index a295a9aab34..2d30163a7a9 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -148,7 +148,8 @@ static tree stabilize_va_list PARAMS ((tree, int));
static rtx expand_builtin_expect PARAMS ((tree, rtx));
static tree fold_builtin_constant_p PARAMS ((tree));
static tree fold_builtin_classify_type PARAMS ((tree));
-static tree build_function_call_expr PARAMS ((tree, tree));
+static tree fold_builtin_inf PARAMS ((tree, int));
+static tree fold_builtin_nan PARAMS ((tree, tree, int));
static int validate_arglist PARAMS ((tree, ...));
/* Return the alignment in bits of EXP, a pointer valued expression.
@@ -1225,7 +1226,7 @@ expand_builtin_apply (function, arguments, argsize)
set_mem_align (dest, PARM_BOUNDARY);
src = gen_rtx_MEM (BLKmode, incoming_args);
set_mem_align (src, PARM_BOUNDARY);
- emit_block_move (dest, src, argsize);
+ emit_block_move (dest, src, argsize, BLOCK_OP_NORMAL);
/* Refer to the argument block. */
apply_args_size ();
@@ -2000,7 +2001,8 @@ expand_builtin_memcpy (arglist, target, mode)
set_mem_align (src_mem, src_align);
/* Copy word part most expediently. */
- dest_addr = emit_block_move (dest_mem, src_mem, len_rtx);
+ dest_addr = emit_block_move (dest_mem, src_mem, len_rtx,
+ BLOCK_OP_NORMAL);
if (dest_addr == 0)
{
@@ -3298,7 +3300,7 @@ expand_builtin_va_copy (arglist)
set_mem_align (srcb, TYPE_ALIGN (va_list_type_node));
/* Copy. */
- emit_block_move (dstb, srcb, size);
+ emit_block_move (dstb, srcb, size, BLOCK_OP_NORMAL);
}
return const0_rtx;
@@ -4077,6 +4079,37 @@ expand_builtin (exp, target, subtarget, mode, ignore)
return expand_call (exp, target, ignore);
}
+/* Determine whether a tree node represents a call to a built-in
+ math function. If the tree T is a call to a built-in function
+ taking a single real argument, then the return value is the
+ DECL_FUNCTION_CODE of the call, e.g. BUILT_IN_SQRT. Otherwise
+ the return value is END_BUILTINS. */
+
+enum built_in_function
+builtin_mathfn_code (t)
+ tree t;
+{
+ tree fndecl, arglist;
+
+ if (TREE_CODE (t) != CALL_EXPR
+ || TREE_CODE (TREE_OPERAND (t, 0)) != ADDR_EXPR)
+ return END_BUILTINS;
+
+ fndecl = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
+ if (TREE_CODE (fndecl) != FUNCTION_DECL
+ || ! DECL_BUILT_IN (fndecl)
+ || DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
+ return END_BUILTINS;
+
+ arglist = TREE_OPERAND (t, 1);
+ if (! arglist
+ || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != REAL_TYPE
+ || TREE_CHAIN (arglist))
+ return END_BUILTINS;
+
+ return DECL_FUNCTION_CODE (fndecl);
+}
+
/* Fold a call to __builtin_constant_p, if we know it will evaluate to a
constant. ARGLIST is the argument list of the call. */
@@ -4131,6 +4164,44 @@ fold_builtin_classify_type (arglist)
return build_int_2 (type_to_class (TREE_TYPE (TREE_VALUE (arglist))), 0);
}
+/* Fold a call to __builtin_inf or __builtin_huge_val. */
+
+static tree
+fold_builtin_inf (type, warn)
+ tree type;
+ int warn;
+{
+ REAL_VALUE_TYPE real;
+
+ if (!MODE_HAS_INFINITIES (TYPE_MODE (type)) && warn)
+ warning ("target format does not support infinity");
+
+ real_inf (&real);
+ return build_real (type, real);
+}
+
+/* Fold a call to __builtin_nan or __builtin_nans. */
+
+static tree
+fold_builtin_nan (arglist, type, quiet)
+ tree arglist, type;
+ int quiet;
+{
+ REAL_VALUE_TYPE real;
+ const char *str;
+
+ if (!validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
+ return 0;
+ str = c_getstr (TREE_VALUE (arglist));
+ if (!str)
+ return 0;
+
+ if (!real_nan (&real, str, quiet, TYPE_MODE (type)))
+ return 0;
+
+ return build_real (type, real);
+}
+
/* Used by constant folding to eliminate some builtin calls early. EXP is
the CALL_EXPR of a call to a builtin function. */
@@ -4162,6 +4233,111 @@ fold_builtin (exp)
}
break;
+ case BUILT_IN_SQRT:
+ case BUILT_IN_SQRTF:
+ case BUILT_IN_SQRTL:
+ if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
+ {
+ enum built_in_function fcode;
+ tree arg = TREE_VALUE (arglist);
+
+ /* Optimize sqrt(0.0) = 0.0 and sqrt(1.0) = 1.0. */
+ if (real_zerop (arg) || real_onep (arg))
+ return arg;
+
+ /* Optimize sqrt(exp(x)) = exp(x/2.0). */
+ fcode = builtin_mathfn_code (arg);
+ if (flag_unsafe_math_optimizations
+ && (fcode == BUILT_IN_EXP
+ || fcode == BUILT_IN_EXPF
+ || fcode == BUILT_IN_EXPL))
+ {
+ tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
+ arg = build (RDIV_EXPR, TREE_TYPE (arg),
+ TREE_VALUE (TREE_OPERAND (arg, 1)),
+ build_real (TREE_TYPE (arg), dconst2));
+ arglist = build_tree_list (NULL_TREE, arg);
+ return build_function_call_expr (expfn, arglist);
+ }
+ }
+ break;
+
+ case BUILT_IN_EXP:
+ case BUILT_IN_EXPF:
+ case BUILT_IN_EXPL:
+ if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
+ {
+ enum built_in_function fcode;
+ tree arg = TREE_VALUE (arglist);
+
+ /* Optimize exp(0.0) = 1.0. */
+ if (real_zerop (arg))
+ return build_real (TREE_TYPE (arg), dconst1);
+
+ /* Optimize exp(log(x)) = x. */
+ fcode = builtin_mathfn_code (arg);
+ if (flag_unsafe_math_optimizations
+ && (fcode == BUILT_IN_LOG
+ || fcode == BUILT_IN_LOGF
+ || fcode == BUILT_IN_LOGL))
+ return TREE_VALUE (TREE_OPERAND (arg, 1));
+ }
+ break;
+
+ case BUILT_IN_LOG:
+ case BUILT_IN_LOGF:
+ case BUILT_IN_LOGL:
+ if (validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
+ {
+ enum built_in_function fcode;
+ tree arg = TREE_VALUE (arglist);
+
+ /* Optimize log(1.0) = 0.0. */
+ if (real_onep (arg))
+ return build_real (TREE_TYPE (arg), dconst0);
+
+ /* Optimize log(exp(x)) = x. */
+ fcode = builtin_mathfn_code (arg);
+ if (flag_unsafe_math_optimizations
+ && (fcode == BUILT_IN_EXP
+ || fcode == BUILT_IN_EXPF
+ || fcode == BUILT_IN_EXPL))
+ return TREE_VALUE (TREE_OPERAND (arg, 1));
+
+ /* Optimize log(sqrt(x)) = log(x)/2.0. */
+ if (flag_unsafe_math_optimizations
+ && (fcode == BUILT_IN_SQRT
+ || fcode == BUILT_IN_SQRTF
+ || fcode == BUILT_IN_SQRTL))
+ {
+ tree logfn = build_function_call_expr (fndecl,
+ TREE_OPERAND (arg, 1));
+ return fold (build (RDIV_EXPR, TREE_TYPE (arg), logfn,
+ build_real (TREE_TYPE (arg), dconst2)));
+ }
+ }
+ break;
+
+ case BUILT_IN_INF:
+ case BUILT_IN_INFF:
+ case BUILT_IN_INFL:
+ return fold_builtin_inf (TREE_TYPE (TREE_TYPE (fndecl)), true);
+
+ case BUILT_IN_HUGE_VAL:
+ case BUILT_IN_HUGE_VALF:
+ case BUILT_IN_HUGE_VALL:
+ return fold_builtin_inf (TREE_TYPE (TREE_TYPE (fndecl)), false);
+
+ case BUILT_IN_NAN:
+ case BUILT_IN_NANF:
+ case BUILT_IN_NANL:
+ return fold_builtin_nan (arglist, TREE_TYPE (TREE_TYPE (fndecl)), true);
+
+ case BUILT_IN_NANS:
+ case BUILT_IN_NANSF:
+ case BUILT_IN_NANSL:
+ return fold_builtin_nan (arglist, TREE_TYPE (TREE_TYPE (fndecl)), false);
+
default:
break;
}
@@ -4169,7 +4345,9 @@ fold_builtin (exp)
return 0;
}
-static tree
+/* Conveniently construct a function call expression. */
+
+tree
build_function_call_expr (fn, arglist)
tree fn, arglist;
{
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 978b4a70d55..8c6a68e1ce0 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -87,7 +87,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
`__builtin' version, we will create an ordinary version (e.g,
`strchr') as well. If we cannot compute the answer using the
builtin function, we will fall back to the standard library
- version. */
+ version. */
#undef DEF_LIB_BUILTIN
#define DEF_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
@@ -401,8 +401,57 @@ DEF_LIB_BUILTIN(BUILT_IN_LOGL,
? ATTR_CONST_NOTHROW_LIST
: ATTR_PURE_NOTHROW_LIST))
-DEF_UNUSED_BUILTIN(BUILT_IN_GETEXP)
-DEF_UNUSED_BUILTIN(BUILT_IN_GETMAN)
+DEF_GCC_BUILTIN(BUILT_IN_INF,
+ "__builtin_inf",
+ BT_FN_DOUBLE,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_GCC_BUILTIN(BUILT_IN_INFF,
+ "__builtin_inff",
+ BT_FN_FLOAT,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_GCC_BUILTIN(BUILT_IN_INFL,
+ "__builtin_infl",
+ BT_FN_LONG_DOUBLE,
+ ATTR_CONST_NOTHROW_LIST)
+
+DEF_GCC_BUILTIN(BUILT_IN_HUGE_VAL,
+ "__builtin_huge_val",
+ BT_FN_DOUBLE,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_GCC_BUILTIN(BUILT_IN_HUGE_VALF,
+ "__builtin_huge_valf",
+ BT_FN_FLOAT,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_GCC_BUILTIN(BUILT_IN_HUGE_VALL,
+ "__builtin_huge_vall",
+ BT_FN_LONG_DOUBLE,
+ ATTR_CONST_NOTHROW_LIST)
+
+DEF_LIB_BUILTIN(BUILT_IN_NAN,
+ "__builtin_nan",
+ BT_FN_DOUBLE_CONST_STRING,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_LIB_BUILTIN(BUILT_IN_NANF,
+ "__builtin_nanf",
+ BT_FN_FLOAT_CONST_STRING,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_LIB_BUILTIN(BUILT_IN_NANL,
+ "__builtin_nanl",
+ BT_FN_LONG_DOUBLE_CONST_STRING,
+ ATTR_CONST_NOTHROW_LIST)
+
+DEF_LIB_BUILTIN(BUILT_IN_NANS,
+ "__builtin_nans",
+ BT_FN_DOUBLE_CONST_STRING,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_LIB_BUILTIN(BUILT_IN_NANSF,
+ "__builtin_nansf",
+ BT_FN_FLOAT_CONST_STRING,
+ ATTR_CONST_NOTHROW_LIST)
+DEF_LIB_BUILTIN(BUILT_IN_NANSL,
+ "__builtin_nansl",
+ BT_FN_LONG_DOUBLE_CONST_STRING,
+ ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN(BUILT_IN_SAVEREGS,
"__builtin_saveregs",
diff --git a/gcc/c-aux-info.c b/gcc/c-aux-info.c
index 67ecae6cea1..761fa848606 100644
--- a/gcc/c-aux-info.c
+++ b/gcc/c-aux-info.c
@@ -188,7 +188,7 @@ gen_formal_list_for_type (fntype, style)
/* For the generation of an ANSI prototype for a function definition, we have
to look at the formal parameter list of the function's own "type" to
determine if the function's formal parameter list should end with an
- ellipsis. Given a tree node, the following function will return non-zero
+ ellipsis. Given a tree node, the following function will return nonzero
if the "function type" parameter list should end with an ellipsis. */
static int
@@ -471,7 +471,7 @@ gen_type (ret_val, t, style)
The given entity may be either a variable or a function.
- If the "is_func_definition" parameter is non-zero, assume that the thing
+ If the "is_func_definition" parameter is nonzero, assume that the thing
we are generating a declaration for is a FUNCTION_DECL node which is
associated with a function definition. In this case, we can assume that
an attached list of DECL nodes for function formal arguments is present. */
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 74224afd55c..8ceb7ff4201 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -38,6 +38,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "target.h"
#include "langhooks.h"
#include "except.h" /* For USING_SJLJ_EXCEPTIONS. */
+#include "tree-inline.h"
cpp_reader *parse_in; /* Declared in c-pragma.h. */
@@ -290,7 +291,7 @@ int warn_write_strings;
int warn_redundant_decls;
-/* Warn about testing equality of floating point numbers. */
+/* Warn about testing equality of floating point numbers. */
int warn_float_equal;
@@ -302,7 +303,7 @@ int warn_char_subscripts;
int warn_conversion;
-/* Warn about #pragma directives that are not recognised. */
+/* Warn about #pragma directives that are not recognized. */
int warn_unknown_pragmas; /* Tri state variable. */
@@ -438,10 +439,18 @@ int print_struct_values;
const char *constant_string_class_name;
/* Warn if multiple methods are seen for the same selector, but with
- different argument types. */
+ different argument types. Performs the check on the whole selector
+ table at the end of compilation. */
int warn_selector;
+/* Warn if a @selector() is found, and no method with that selector
+ has been previously declared. The check is done on each
+ @selector() as soon as it is found - so it warns about forward
+ declarations. */
+
+int warn_undeclared_selector;
+
/* Warn if methods required by a protocol are not implemented in the
class adopting it. When turned off, methods inherited to that
class are also considered implemented. */
@@ -558,6 +567,26 @@ int flag_permissive;
int flag_enforce_eh_specs = 1;
+/* The version of the C++ ABI in use. The following values are
+ allowed:
+
+ 0: The version of the ABI believed most conformant with the
+ C++ ABI specification. This ABI may change as bugs are
+ discovered and fixed. Therefore, 0 will not necessarily
+ indicate the same ABI in different versions of G++.
+
+ 1: The version of the ABI first used in G++ 3.2.
+
+ Additional positive integers will be assigned as new versions of
+ the ABI become the default version of the ABI. */
+
+int flag_abi_version = 1;
+
+/* Nonzero means warn about things that will change when compiling
+ with an ABI-compliant compiler. */
+
+int warn_abi = 0;
+
/* Nonzero means warn about implicit declarations. */
int warn_implicit = 1;
@@ -567,26 +596,26 @@ int warn_implicit = 1;
int warn_ctor_dtor_privacy = 1;
-/* Non-zero means warn in function declared in derived class has the
+/* Nonzero means warn in function declared in derived class has the
same name as a virtual in the base class, but fails to match the
type signature of any virtual function in the base class. */
int warn_overloaded_virtual;
-/* Non-zero means warn when declaring a class that has a non virtual
+/* Nonzero means warn when declaring a class that has a non virtual
destructor, when it really ought to have a virtual one. */
int warn_nonvdtor;
-/* Non-zero means warn when the compiler will reorder code. */
+/* Nonzero means warn when the compiler will reorder code. */
int warn_reorder;
-/* Non-zero means warn when synthesis behavior differs from Cfront's. */
+/* Nonzero means warn when synthesis behavior differs from Cfront's. */
int warn_synth;
-/* Non-zero means warn when we convert a pointer to member function
+/* Nonzero means warn when we convert a pointer to member function
into a pointer to (void or function). */
int warn_pmf2ptr = 1;
@@ -720,6 +749,8 @@ static tree handle_alias_attribute PARAMS ((tree *, tree, tree, int,
bool *));
static tree handle_visibility_attribute PARAMS ((tree *, tree, tree, int,
bool *));
+static tree handle_tls_model_attribute PARAMS ((tree *, tree, tree, int,
+ bool *));
static tree handle_no_instrument_function_attribute PARAMS ((tree *, tree,
tree, int,
bool *));
@@ -747,8 +778,16 @@ static bool get_nonnull_operand PARAMS ((tree,
unsigned HOST_WIDE_INT *));
void builtin_define_std PARAMS ((const char *));
static void builtin_define_with_value PARAMS ((const char *, const char *,
- int));
+ int));
+static void builtin_define_with_int_value PARAMS ((const char *,
+ HOST_WIDE_INT));
+static void builtin_define_with_hex_fp_value PARAMS ((const char *, tree,
+ int, const char *,
+ const char *));
static void builtin_define_type_max PARAMS ((const char *, tree, int));
+static void builtin_define_type_precision PARAMS ((const char *, tree));
+static void builtin_define_float_constants PARAMS ((const char *,
+ const char *, tree));
/* Table of machine-independent attributes common to all C-like languages. */
const struct attribute_spec c_common_attribute_table[] =
@@ -810,6 +849,8 @@ const struct attribute_spec c_common_attribute_table[] =
handle_vector_size_attribute },
{ "visibility", 1, 1, true, false, false,
handle_visibility_attribute },
+ { "tls_model", 1, 1, true, false, false,
+ handle_tls_model_attribute },
{ "nonnull", 0, -1, false, true, true,
handle_nonnull_attribute },
{ "nothrow", 0, 0, true, false, false,
@@ -1098,7 +1139,7 @@ fname_decl (rid, id)
the current statement. Later this tree will be moved to the
beginning of the function and this line number will be wrong.
To avoid this problem set the lineno to 0 here; that prevents
- it from appearing in the RTL. */
+ it from appearing in the RTL. */
int saved_lineno = lineno;
lineno = 0;
@@ -1803,7 +1844,7 @@ verify_tree (x, pbefore_sp, pno_sp, writer)
}
}
-/* Try to warn for undefined behaviour in EXPR due to missing sequence
+/* Try to warn for undefined behavior in EXPR due to missing sequence
points. */
static void
@@ -2002,10 +2043,14 @@ c_common_type_for_mode (mode, unsignedp)
return unsignedp ? unsigned_V2DI_type_node : V2DI_type_node;
case V2SImode:
return unsignedp ? unsigned_V2SI_type_node : V2SI_type_node;
+ case V2HImode:
+ return unsignedp ? unsigned_V2HI_type_node : V2HI_type_node;
case V4HImode:
return unsignedp ? unsigned_V4HI_type_node : V4HI_type_node;
case V8QImode:
return unsignedp ? unsigned_V8QI_type_node : V8QI_type_node;
+ case V1DImode:
+ return unsignedp ? unsigned_V1DI_type_node : V1DI_type_node;
case V16SFmode:
return V16SF_type_node;
case V4SFmode:
@@ -2755,12 +2800,12 @@ c_common_truthvalue_conversion (expr)
case ABS_EXPR:
case FLOAT_EXPR:
case FFS_EXPR:
- /* These don't change whether an object is non-zero or zero. */
+ /* These don't change whether an object is nonzero or zero. */
return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0));
case LROTATE_EXPR:
case RROTATE_EXPR:
- /* These don't change whether an object is zero or non-zero, but
+ /* These don't change whether an object is zero or nonzero, but
we can't ignore them if their second arg has side-effects. */
if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
return build (COMPOUND_EXPR, boolean_type_node, TREE_OPERAND (expr, 1),
@@ -3843,7 +3888,7 @@ expand_tree_builtin (function, params, coerced_params)
return NULL_TREE;
}
-/* Returns non-zero if CODE is the code for a statement. */
+/* Returns nonzero if CODE is the code for a statement. */
int
statement_code_p (code)
@@ -4661,6 +4706,179 @@ boolean_increment (code, arg)
return val;
}
+/* Define NAME with value TYPE precision. */
+static void
+builtin_define_type_precision (name, type)
+ const char *name;
+ tree type;
+{
+ builtin_define_with_int_value (name, TYPE_PRECISION (type));
+}
+
+/* Define the float.h constants for TYPE using NAME_PREFIX and FP_SUFFIX. */
+static void
+builtin_define_float_constants (name_prefix, fp_suffix, type)
+ const char *name_prefix;
+ const char *fp_suffix;
+ tree type;
+{
+ /* Used to convert radix-based values to base 10 values in several cases.
+
+ In the max_exp -> max_10_exp conversion for 128-bit IEEE, we need at
+ least 6 significant digits for correct results. Using the fraction
+ formed by (log(2)*1e6)/(log(10)*1e6) overflows a 32-bit integer as an
+ intermediate; perhaps someone can find a better approximation, in the
+ mean time, I suspect using doubles won't harm the bootstrap here. */
+
+ const double log10_2 = .30102999566398119521;
+ double log10_b;
+ const struct real_format *fmt;
+
+ char name[64], buf[128];
+ int dig, min_10_exp, max_10_exp;
+ int decimal_dig;
+
+ fmt = real_format_for_mode[TYPE_MODE (type) - QFmode];
+
+ /* The radix of the exponent representation. */
+ if (type == float_type_node)
+ builtin_define_with_int_value ("__FLT_RADIX__", fmt->b);
+ log10_b = log10_2 * fmt->log2_b;
+
+ /* The number of radix digits, p, in the floating-point significand. */
+ sprintf (name, "__%s_MANT_DIG__", name_prefix);
+ builtin_define_with_int_value (name, fmt->p);
+
+ /* The number of decimal digits, q, such that any floating-point number
+ with q decimal digits can be rounded into a floating-point number with
+ p radix b digits and back again without change to the q decimal digits,
+
+ p log10 b if b is a power of 10
+ floor((p - 1) log10 b) otherwise
+ */
+ dig = (fmt->p - 1) * log10_b;
+ sprintf (name, "__%s_DIG__", name_prefix);
+ builtin_define_with_int_value (name, dig);
+
+ /* The minimum negative int x such that b**(x-1) is a normalized float. */
+ sprintf (name, "__%s_MIN_EXP__", name_prefix);
+ sprintf (buf, "(%d)", fmt->emin);
+ builtin_define_with_value (name, buf, 0);
+
+ /* The minimum negative int x such that 10**x is a normalized float,
+
+ ceil (log10 (b ** (emin - 1)))
+ = ceil (log10 (b) * (emin - 1))
+
+ Recall that emin is negative, so the integer truncation calculates
+ the ceiling, not the floor, in this case. */
+ min_10_exp = (fmt->emin - 1) * log10_b;
+ sprintf (name, "__%s_MIN_10_EXP__", name_prefix);
+ sprintf (buf, "(%d)", min_10_exp);
+ builtin_define_with_value (name, buf, 0);
+
+ /* The maximum int x such that b**(x-1) is a representable float. */
+ sprintf (name, "__%s_MAX_EXP__", name_prefix);
+ builtin_define_with_int_value (name, fmt->emax);
+
+ /* The maximum int x such that 10**x is in the range of representable
+ finite floating-point numbers,
+
+ floor (log10((1 - b**-p) * b**emax))
+ = floor (log10(1 - b**-p) + log10(b**emax))
+ = floor (log10(1 - b**-p) + log10(b)*emax)
+
+ The safest thing to do here is to just compute this number. But since
+ we don't link cc1 with libm, we cannot. We could implement log10 here
+ a series expansion, but that seems too much effort because:
+
+ Note that the first term, for all extant p, is a number exceedingly close
+ to zero, but slightly negative. Note that the second term is an integer
+ scaling an irrational number, and that because of the floor we are only
+ interested in its integral portion.
+
+ In order for the first term to have any effect on the integral portion
+ of the second term, the second term has to be exceedingly close to an
+ integer itself (e.g. 123.000000000001 or something). Getting a result
+ that close to an integer requires that the irrational multiplicand have
+ a long series of zeros in its expansion, which doesn't occur in the
+ first 20 digits or so of log10(b).
+
+ Hand-waving aside, crunching all of the sets of constants above by hand
+ does not yield a case for which the first term is significant, which
+ in the end is all that matters. */
+ max_10_exp = fmt->emax * log10_b;
+ sprintf (name, "__%s_MAX_10_EXP__", name_prefix);
+ builtin_define_with_int_value (name, max_10_exp);
+
+ /* The number of decimal digits, n, such that any floating-point number
+ can be rounded to n decimal digits and back again without change to
+ the value.
+
+ p * log10(b) if b is a power of 10
+ ceil(1 + p * log10(b)) otherwise
+
+ The only macro we care about is this number for the widest supported
+ floating type, but we want this value for rendering constants below. */
+ {
+ double d_decimal_dig = 1 + fmt->p * log10_b;
+ decimal_dig = d_decimal_dig;
+ if (decimal_dig < d_decimal_dig)
+ decimal_dig++;
+ }
+ if (type == long_double_type_node)
+ builtin_define_with_int_value ("__DECIMAL_DIG__", decimal_dig);
+
+ /* Since, for the supported formats, B is always a power of 2, we
+ construct the following numbers directly as a hexadecimal
+ constants. */
+
+ /* The maximum representable finite floating-point number,
+ (1 - b**-p) * b**emax */
+ {
+ int i, n;
+ char *p;
+
+ strcpy (buf, "0x0.");
+ n = fmt->p * fmt->log2_b;
+ for (i = 0, p = buf + 4; i + 3 < n; i += 4)
+ *p++ = 'f';
+ if (i < n)
+ *p++ = "08ce"[n - i];
+ sprintf (p, "p%d", fmt->emax * fmt->log2_b);
+ }
+ sprintf (name, "__%s_MAX__", name_prefix);
+ builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix);
+
+ /* The minimum normalized positive floating-point number,
+ b**(emin-1). */
+ sprintf (name, "__%s_MIN__", name_prefix);
+ sprintf (buf, "0x1p%d", (fmt->emin - 1) * fmt->log2_b);
+ builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix);
+
+ /* The difference between 1 and the least value greater than 1 that is
+ representable in the given floating point type, b**(1-p). */
+ sprintf (name, "__%s_EPSILON__", name_prefix);
+ sprintf (buf, "0x1p%d", (1 - fmt->p) * fmt->log2_b);
+ builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix);
+
+ /* For C++ std::numeric_limits<T>::denorm_min. The minimum denormalized
+ positive floating-point number, b**(emin-p). Zero for formats that
+ don't support denormals. */
+ sprintf (name, "__%s_DENORM_MIN__", name_prefix);
+ if (fmt->has_denorm)
+ {
+ sprintf (buf, "0x1p%d", (fmt->emin - fmt->p) * fmt->log2_b);
+ builtin_define_with_hex_fp_value (name, type, decimal_dig,
+ buf, fp_suffix);
+ }
+ else
+ {
+ sprintf (buf, "0.0%s", fp_suffix);
+ builtin_define_with_value (name, buf, 0);
+ }
+}
+
/* Hook that registers front end and target-specific built-ins. */
void
cb_register_builtins (pfile)
@@ -4702,12 +4920,18 @@ cb_register_builtins (pfile)
builtin_define_type_max ("__INT_MAX__", integer_type_node, 0);
builtin_define_type_max ("__LONG_MAX__", long_integer_type_node, 1);
builtin_define_type_max ("__LONG_LONG_MAX__", long_long_integer_type_node, 2);
+ builtin_define_type_max ("__WCHAR_MAX__", wchar_type_node, 0);
- {
- char buf[8];
- sprintf (buf, "%d", (int) TYPE_PRECISION (signed_char_type_node));
- builtin_define_with_value ("__CHAR_BIT__", buf, 0);
- }
+ builtin_define_type_precision ("__CHAR_BIT__", char_type_node);
+
+ /* float.h needs to know these. */
+
+ builtin_define_with_int_value ("__FLT_EVAL_METHOD__",
+ TARGET_FLT_EVAL_METHOD);
+
+ builtin_define_float_constants ("FLT", "F", float_type_node);
+ builtin_define_float_constants ("DBL", "", double_type_node);
+ builtin_define_float_constants ("LDBL", "L", long_double_type_node);
/* For use in assembly language. */
builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
@@ -4730,7 +4954,7 @@ cb_register_builtins (pfile)
if (fast_math_flags_set_p ())
cpp_define (pfile, "__FAST_MATH__");
- if (flag_no_inline)
+ if (flag_really_no_inline)
cpp_define (pfile, "__NO_INLINE__");
if (flag_signaling_nans)
cpp_define (pfile, "__SUPPORT_SNAN__");
@@ -4745,6 +4969,9 @@ cb_register_builtins (pfile)
if (!flag_signed_char)
cpp_define (pfile, "__CHAR_UNSIGNED__");
+ if (c_language == clk_cplusplus && TREE_UNSIGNED (wchar_type_node))
+ cpp_define (pfile, "__WCHAR_UNSIGNED__");
+
/* Make the choice of ObjC runtime visible to source code. */
if (flag_objc && flag_next_runtime)
cpp_define (pfile, "__NEXT_RUNTIME__");
@@ -4752,6 +4979,7 @@ cb_register_builtins (pfile)
/* A straightforward target hook doesn't work, because of problems
linking that hook's body when part of non-C front ends. */
# define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
+# define preprocessing_trad_p() (cpp_get_options (pfile)->traditional)
# define builtin_define(TXT) cpp_define (pfile, TXT)
# define builtin_assert(TXT) cpp_assert (pfile, TXT)
TARGET_CPU_CPP_BUILTINS ();
@@ -4830,6 +5058,54 @@ builtin_define_with_value (macro, expansion, is_str)
cpp_define (parse_in, buf);
}
+/* Pass an object-like macro and an integer value to define it to. */
+static void
+builtin_define_with_int_value (macro, value)
+ const char *macro;
+ HOST_WIDE_INT value;
+{
+ char *buf;
+ size_t mlen = strlen (macro);
+ size_t vlen = 18;
+ size_t extra = 2; /* space for = and NUL. */
+
+ buf = alloca (mlen + vlen + extra);
+ memcpy (buf, macro, mlen);
+ buf[mlen] = '=';
+ sprintf (buf + mlen + 1, HOST_WIDE_INT_PRINT_DEC, value);
+
+ cpp_define (parse_in, buf);
+}
+
+/* Pass an object-like macro a hexadecimal floating-point value. */
+static void
+builtin_define_with_hex_fp_value (macro, type, digits, hex_str, fp_suffix)
+ const char *macro;
+ tree type ATTRIBUTE_UNUSED;
+ int digits;
+ const char *hex_str;
+ const char *fp_suffix;
+{
+ REAL_VALUE_TYPE real;
+ char dec_str[64], buf[256];
+
+ /* Hex values are really cool and convenient, except that they're
+ not supported in strict ISO C90 mode. First, the "p-" sequence
+ is not valid as part of a preprocessor number. Second, we get a
+ pedwarn from the preprocessor, which has no context, so we can't
+ suppress the warning with __extension__.
+
+ So instead what we do is construct the number in hex (because
+ it's easy to get the exact correct value), parse it as a real,
+ then print it back out as decimal. */
+
+ real_from_string (&real, hex_str);
+ real_to_decimal (dec_str, &real, sizeof (dec_str), digits, 0);
+
+ sprintf (buf, "%s=%s%s", macro, dec_str, fp_suffix);
+ cpp_define (parse_in, buf);
+}
+
/* Define MAX for TYPE based on the precision of the type, which is assumed
to be signed. IS_LONG is 1 for type "long" and 2 for "long long". */
@@ -5328,6 +5604,7 @@ handle_mode_attribute (node, name, args, flags, no_add_attrs)
int len = strlen (p);
enum machine_mode mode = VOIDmode;
tree typefm;
+ tree ptr_type;
if (len > 4 && p[0] == '_' && p[1] == '_'
&& p[len - 1] == '_' && p[len - 2] == '_')
@@ -5357,6 +5634,10 @@ handle_mode_attribute (node, name, args, flags, no_add_attrs)
else if (0 == (typefm = (*lang_hooks.types.type_for_mode)
(mode, TREE_UNSIGNED (type))))
error ("no data type for mode `%s'", p);
+ else if ((TREE_CODE (type) == POINTER_TYPE
+ || TREE_CODE (type) == REFERENCE_TYPE)
+ && !(*targetm.valid_pointer_mode) (mode))
+ error ("invalid pointer mode `%s'", p);
else
{
/* If this is a vector, make sure we either have hardware
@@ -5369,6 +5650,19 @@ handle_mode_attribute (node, name, args, flags, no_add_attrs)
return NULL_TREE;
}
+ if (TREE_CODE (type) == POINTER_TYPE)
+ {
+ ptr_type = build_pointer_type_for_mode (TREE_TYPE (type),
+ mode);
+ *node = ptr_type;
+ }
+ else if (TREE_CODE (type) == REFERENCE_TYPE)
+ {
+ ptr_type = build_reference_type_for_mode (TREE_TYPE (type),
+ mode);
+ *node = ptr_type;
+ }
+ else
*node = typefm;
/* No need to layout the type here. The caller should do this. */
}
@@ -5626,6 +5920,49 @@ handle_visibility_attribute (node, name, args, flags, no_add_attrs)
return NULL_TREE;
}
+/* Handle an "tls_model" attribute; arguments as in
+ struct attribute_spec.handler. */
+
+static tree
+handle_tls_model_attribute (node, name, args, flags, no_add_attrs)
+ tree *node;
+ tree name;
+ tree args;
+ int flags ATTRIBUTE_UNUSED;
+ bool *no_add_attrs;
+{
+ tree decl = *node;
+
+ if (! DECL_THREAD_LOCAL (decl))
+ {
+ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
+ *no_add_attrs = true;
+ }
+ else
+ {
+ tree id;
+
+ id = TREE_VALUE (args);
+ if (TREE_CODE (id) != STRING_CST)
+ {
+ error ("tls_model arg not a string");
+ *no_add_attrs = true;
+ return NULL_TREE;
+ }
+ if (strcmp (TREE_STRING_POINTER (id), "local-exec")
+ && strcmp (TREE_STRING_POINTER (id), "initial-exec")
+ && strcmp (TREE_STRING_POINTER (id), "local-dynamic")
+ && strcmp (TREE_STRING_POINTER (id), "global-dynamic"))
+ {
+ error ("tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"");
+ *no_add_attrs = true;
+ return NULL_TREE;
+ }
+ }
+
+ return NULL_TREE;
+}
+
/* Handle a "no_instrument_function" attribute; arguments as in
struct attribute_spec.handler. */
diff --git a/gcc/c-common.def b/gcc/c-common.def
index 7ad9e385229..802238a65a2 100644
--- a/gcc/c-common.def
+++ b/gcc/c-common.def
@@ -23,7 +23,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
/* Tree nodes relevant to both C and C++. These were originally in
-cp-tree.def in the cp subdir. */
+cp-tree.def in the cp subdir. */
/* A node to remember a source position. */
DEFTREECODE (SRCLOC, "srcloc", 'x', 2)
@@ -33,55 +33,55 @@ DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)
/* Used to represent an expression statement. Use `EXPR_STMT_EXPR' to
- obtain the expression. */
+ obtain the expression. */
DEFTREECODE (EXPR_STMT, "expr_stmt", 'e', 1)
/* Used to represent a brace-enclosed block. The operand is
- COMPOUND_BODY. */
+ COMPOUND_BODY. */
DEFTREECODE (COMPOUND_STMT, "compound_stmt", 'e', 1)
/* Used to represent a local declaration. The operand is
- DECL_STMT_DECL. */
+ DECL_STMT_DECL. */
DEFTREECODE (DECL_STMT, "decl_stmt", 'e', 1)
/* Represents an 'if' statement. The operands are IF_COND,
- THEN_CLAUSE, and ELSE_CLAUSE, respectively. */
+ THEN_CLAUSE, and ELSE_CLAUSE, respectively. */
DEFTREECODE (IF_STMT, "if_stmt", 'e', 3)
/* Used to represent a `for' statement. The operands are
- FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively. */
+ FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively. */
DEFTREECODE (FOR_STMT, "for_stmt", 'e', 4)
/* Used to represent a 'while' statement. The operands are WHILE_COND
- and WHILE_BODY, respectively. */
+ and WHILE_BODY, respectively. */
DEFTREECODE (WHILE_STMT, "while_stmt", 'e', 2)
/* Used to represent a 'do' statement. The operands are DO_BODY and
- DO_COND, respectively. */
+ DO_COND, respectively. */
DEFTREECODE (DO_STMT, "do_stmt", 'e', 2)
/* Used to represent a 'return' statement. The operand is
- RETURN_EXPR. */
+ RETURN_STMT_EXPR. */
DEFTREECODE (RETURN_STMT, "return_stmt", 'e', 1)
-/* Used to represent a 'break' statement. */
+/* Used to represent a 'break' statement. */
DEFTREECODE (BREAK_STMT, "break_stmt", 'e', 0)
-/* Used to represent a 'continue' statement. */
+/* Used to represent a 'continue' statement. */
DEFTREECODE (CONTINUE_STMT, "continue_stmt", 'e', 0)
/* Used to represent a 'switch' statement. The operands are
- SWITCH_COND, SWITCH_BODY and SWITCH_TYPE, respectively. */
+ 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. */
+/* Used to represent a 'goto' statement. The operand is GOTO_DESTINATION. */
DEFTREECODE (GOTO_STMT, "goto_stmt", 'e', 1)
/* Used to represent a 'label' statement. The operand is a LABEL_DECL
- and can be obtained through the macro LABEL_STMT_LABEL. */
+ and can be obtained through the macro LABEL_STMT_LABEL. */
DEFTREECODE (LABEL_STMT, "label_stmt", 'e', 1)
-/* Used to represent an inline assembly statement. */
+/* Used to represent an inline assembly statement. */
DEFTREECODE (ASM_STMT, "asm_stmt", 'e', 5)
/* A SCOPE_STMT marks the beginning or end of a scope. If
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 6968d70dac9..ef04ca8b2e7 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -43,7 +43,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
*/
/* Reserved identifiers. This is the union of all the keywords for C,
- C++, and Objective C. All the type modifiers have to be in one
+ C++, and Objective-C. All the type modifiers have to be in one
block at the beginning, because they are used as mask bits. There
are 27 type modifiers; if we add many more we will have to redesign
the mask mechanism. */
@@ -93,7 +93,7 @@ enum rid
/* casts */
RID_CONSTCAST, RID_DYNCAST, RID_REINTCAST, RID_STATCAST,
- /* Objective C */
+ /* Objective-C */
RID_ID, RID_AT_ENCODE, RID_AT_END,
RID_AT_CLASS, RID_AT_ALIAS, RID_AT_DEFS,
RID_AT_PRIVATE, RID_AT_PROTECTED, RID_AT_PUBLIC,
@@ -253,12 +253,12 @@ struct stmt_tree_s GTY(()) {
tree x_last_expr_type;
/* The last filename we recorded. */
const char *x_last_expr_filename;
- /* In C++, Non-zero if we should treat statements as full
+ /* In C++, Nonzero if we should treat statements as full
expressions. In particular, this variable is no-zero if at the
end of a statement we should destroy any temporaries created
during that statement. Similarly, if, at the end of a block, we
should destroy any local variables in this block. Normally, this
- variable is non-zero, since those are the normal semantics of
+ variable is nonzero, since those are the normal semantics of
C++.
However, in order to represent aggregate initialization code as
@@ -465,7 +465,7 @@ extern int warn_write_strings;
extern int warn_redundant_decls;
-/* Warn about testing equality of floating point numbers. */
+/* Warn about testing equality of floating point numbers. */
extern int warn_float_equal;
@@ -477,7 +477,7 @@ extern int warn_char_subscripts;
extern int warn_conversion;
-/* Warn about #pragma directives that are not recognised. */
+/* Warn about #pragma directives that are not recognized. */
extern int warn_unknown_pragmas; /* Tri state variable. */
@@ -609,10 +609,18 @@ extern int print_struct_values;
extern const char *constant_string_class_name;
/* Warn if multiple methods are seen for the same selector, but with
- different argument types. */
+ different argument types. Performs the check on the whole selector
+ table at the end of compilation. */
extern int warn_selector;
+/* Warn if a @selector() is found, and no method with that selector
+ has been previously declared. The check is done on each
+ @selector() as soon as it is found - so it warns about forward
+ declarations. */
+
+extern int warn_undeclared_selector;
+
/* Warn if methods required by a protocol are not implemented in the
class adopting it. When turned off, methods inherited to that
class are also considered implemented. */
@@ -729,6 +737,26 @@ extern int flag_permissive;
extern int flag_enforce_eh_specs;
+/* The version of the C++ ABI in use. The following values are
+ allowed:
+
+ 0: The version of the ABI believed most conformant with the
+ C++ ABI specification. This ABI may change as bugs are
+ discovered and fixed. Therefore, 0 will not necessarily
+ indicate the same ABI in different versions of G++.
+
+ 1: The version of the ABI first used in G++ 3.2.
+
+ Additional positive integers will be assigned as new versions of
+ the ABI become the default version of the ABI. */
+
+extern int flag_abi_version;
+
+/* Nonzero means warn about things that will change when compiling
+ with an ABI-compliant compiler. */
+
+extern int warn_abi;
+
/* Nonzero means warn about implicit declarations. */
extern int warn_implicit;
@@ -738,26 +766,26 @@ extern int warn_implicit;
extern int warn_ctor_dtor_privacy;
-/* Non-zero means warn in function declared in derived class has the
+/* Nonzero means warn in function declared in derived class has the
same name as a virtual in the base class, but fails to match the
type signature of any virtual function in the base class. */
extern int warn_overloaded_virtual;
-/* Non-zero means warn when declaring a class that has a non virtual
+/* Nonzero means warn when declaring a class that has a non virtual
destructor, when it really ought to have a virtual one. */
extern int warn_nonvdtor;
-/* Non-zero means warn when the compiler will reorder code. */
+/* Nonzero means warn when the compiler will reorder code. */
extern int warn_reorder;
-/* Non-zero means warn when synthesis behavior differs from Cfront's. */
+/* Nonzero means warn when synthesis behavior differs from Cfront's. */
extern int warn_synth;
-/* Non-zero means warn when we convert a pointer to member function
+/* Nonzero means warn when we convert a pointer to member function
into a pointer to (void or function). */
extern int warn_pmf2ptr;
@@ -945,7 +973,7 @@ extern tree strip_array_types PARAMS ((tree));
/* RETURN_STMT accessors. These give the expression associated with a
return statement, and whether it should be ignored when expanding
(as opposed to inlining). */
-#define RETURN_EXPR(NODE) TREE_OPERAND (RETURN_STMT_CHECK (NODE), 0)
+#define RETURN_STMT_EXPR(NODE) TREE_OPERAND (RETURN_STMT_CHECK (NODE), 0)
/* EXPR_STMT accessor. This gives the expression associated with an
expression statement. */
@@ -1075,7 +1103,7 @@ extern tree strip_array_types PARAMS ((tree));
#define STMT_LINENO(NODE) \
(TREE_COMPLEXITY ((NODE)))
-/* If non-zero, the STMT_LINENO for NODE is the line at which the
+/* If nonzero, the STMT_LINENO for NODE is the line at which the
function ended. */
#define STMT_LINENO_FOR_FN_P(NODE) \
(TREE_LANG_FLAG_2 ((NODE)))
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index bbf1544bd88..e5a43fe0f25 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -2691,8 +2691,8 @@ shadow_tag_warned (declspecs, warned)
/* Construct an array declarator. EXPR is the expression inside [], or
NULL_TREE. QUALS are the type qualifiers inside the [] (to be applied
to the pointer to which a parameter array is converted). STATIC_P is
- non-zero if "static" is inside the [], zero otherwise. VLA_UNSPEC_P
- is non-zero is the array is [*], a VLA of unspecified length which is
+ nonzero if "static" is inside the [], zero otherwise. VLA_UNSPEC_P
+ is nonzero is the array is [*], a VLA of unspecified length which is
nevertheless a complete type (not currently implemented by GCC),
zero otherwise. The declarator is constructed as an ARRAY_REF
(to be decoded by grokdeclarator), whose operand 0 is what's on the
@@ -2725,7 +2725,7 @@ build_array_declarator (expr, quals, static_p, vla_unspec_p)
/* Set the type of an array declarator. DECL is the declarator, as
constructed by build_array_declarator; TYPE is what appears on the left
- of the [] and goes in operand 0. ABSTRACT_P is non-zero if it is an
+ of the [] and goes in operand 0. ABSTRACT_P is nonzero if it is an
abstract declarator, zero otherwise; this is used to reject static and
type qualifiers in abstract declarators, where they are not in the
C99 grammar. */
@@ -2821,15 +2821,9 @@ start_decl (declarator, declspecs, initialized, attributes)
switch (TREE_CODE (decl))
{
case TYPE_DECL:
- /* typedef foo = bar means give foo the same type as bar.
- We haven't parsed bar yet, so `finish_decl' will fix that up.
- Any other case of an initialization in a TYPE_DECL is an error. */
- if (pedantic || list_length (declspecs) > 1)
- {
- error ("typedef `%s' is initialized",
- IDENTIFIER_POINTER (DECL_NAME (decl)));
- initialized = 0;
- }
+ error ("typedef `%s' is initialized (use __typeof__ instead)",
+ IDENTIFIER_POINTER (DECL_NAME (decl)));
+ initialized = 0;
break;
case FUNCTION_DECL:
@@ -2988,16 +2982,7 @@ finish_decl (decl, init, asmspec_tree)
init = 0;
if (init)
- {
- if (TREE_CODE (decl) != TYPE_DECL)
- store_init_value (decl, init);
- else
- {
- /* typedef foo = bar; store the type of bar as the type of foo. */
- TREE_TYPE (decl) = TREE_TYPE (init);
- DECL_INITIAL (decl) = init = 0;
- }
- }
+ store_init_value (decl, init);
/* Deduce size of array from initialization, if not already known */
if (TREE_CODE (type) == ARRAY_TYPE
@@ -6426,7 +6411,7 @@ c_expand_deferred_function (fndecl)
}
}
-/* Generate the RTL for the body of FNDECL. If NESTED_P is non-zero,
+/* Generate the RTL for the body of FNDECL. If NESTED_P is nonzero,
then we are already in the process of generating RTL for another
function. If can_defer_p is zero, we won't attempt to defer the
generation of RTL. */
@@ -6769,7 +6754,7 @@ c_dup_lang_specific_decl (decl)
functions are not called from anywhere in the C front end, but as
these changes continue, that will change. */
-/* Returns non-zero if the current statement is a full expression,
+/* Returns nonzero if the current statement is a full expression,
i.e. temporaries created during that statement should be destroyed
at the end of the statement. */
diff --git a/gcc/c-dump.c b/gcc/c-dump.c
index 6ca07664fbe..65407a507d5 100644
--- a/gcc/c-dump.c
+++ b/gcc/c-dump.c
@@ -153,7 +153,7 @@ c_dump_tree (dump_info, t)
case RETURN_STMT:
dump_stmt (di, t);
- dump_child ("expr", RETURN_EXPR (t));
+ dump_child ("expr", RETURN_STMT_EXPR (t));
dump_next_stmt (di, t);
break;
diff --git a/gcc/c-format.c b/gcc/c-format.c
index 959022fc84b..a8066df5235 100644
--- a/gcc/c-format.c
+++ b/gcc/c-format.c
@@ -286,7 +286,7 @@ decode_format_attr (args, info, validated_p)
/* Check a call to a format function against a parameter list. */
-/* The meaningfully distinct length modifiers for format checking recognised
+/* The meaningfully distinct length modifiers for format checking recognized
by GCC. */
enum format_lengths
{
@@ -439,7 +439,7 @@ typedef struct
/* The flag character in question (0 for end of array). */
const int flag_char;
/* Zero if this entry describes the flag character in general, or a
- non-zero character that may be found in flags2 if it describes the
+ nonzero character that may be found in flags2 if it describes the
flag when used with certain formats only. If the latter, only
the first such entry found that applies to the current conversion
specifier is used; the values of `name' and `long_name' it supplies
@@ -469,11 +469,11 @@ typedef struct
const int flag_char1;
/* The second flag character. */
const int flag_char2;
- /* Non-zero if the message should say that the first flag is ignored with
+ /* Nonzero if the message should say that the first flag is ignored with
the second, zero if the combination should simply be objected to. */
const int ignored;
/* Zero if this entry applies whenever this flag combination occurs,
- a non-zero character from flags2 if it only applies in some
+ a nonzero character from flags2 if it only applies in some
circumstances (e.g. 'i' for printf formats ignoring 0 with precision). */
const int predicate;
} format_flag_pair;
diff --git a/gcc/c-lang.c b/gcc/c-lang.c
index b6f8a7c99fc..8614e2500e5 100644
--- a/gcc/c-lang.c
+++ b/gcc/c-lang.c
@@ -174,6 +174,13 @@ is_class_name (arg)
return 0;
}
+tree
+objc_is_id (arg)
+ tree arg ATTRIBUTE_UNUSED;
+{
+ return 0;
+}
+
void
objc_check_decl (decl)
tree decl ATTRIBUTE_UNUSED;
@@ -195,12 +202,6 @@ objc_message_selector ()
return 0;
}
-int
-recognize_objc_keyword ()
-{
- return 0;
-}
-
/* Used by c-typeck.c (build_external_ref), but only for objc. */
tree
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index 1805ccbed03..7564cf5f242 100644
--- a/gcc/c-lex.c
+++ b/gcc/c-lex.c
@@ -233,7 +233,7 @@ cb_ident (pfile, line, str)
if (! flag_no_ident)
{
/* Convert escapes in the string. */
- tree value = lex_string (str->text, str->len, 0);
+ tree value ATTRIBUTE_UNUSED = lex_string (str->text, str->len, 0);
ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value));
}
#endif
@@ -835,7 +835,7 @@ interpret_integer (token, flags)
{
/* In C99, decimal constants are always signed.
In C89, decimal constants that don't fit in long have
- undefined behaviour; we try to make them unsigned long.
+ undefined behavior; we try to make them unsigned long.
In GCC's extended C89, that last is true of decimal
constants that don't fit in long long, too. */
@@ -925,13 +925,8 @@ interpret_float (token, flags)
memcpy (copy, token->val.str.text, copylen);
copy[copylen] = '\0';
- /* The second argument, machine_mode, of REAL_VALUE_ATOF tells the
- desired precision of the binary result of decimal-to-binary
- conversion. */
- if (flags & CPP_N_HEX)
- real = REAL_VALUE_HTOF (copy, TYPE_MODE (type));
- else
- real = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
+ real_from_string (&real, copy);
+ real_convert (&real, TYPE_MODE (type), &real);
/* A diagnostic is required for "soft" overflow by some ISO C
testsuites. This is not pedwarn, because some people don't want
@@ -1016,7 +1011,7 @@ lex_string (str, len, wide)
#ifdef MULTIBYTE_CHARS
else if (char_len > 1)
{
- /* We're dealing with a multibyte character. */
+ /* We're dealing with a multibyte character. */
for ( ; char_len >0; --char_len)
{
*q++ = *(p - char_len);
diff --git a/gcc/c-objc-common.c b/gcc/c-objc-common.c
index 939c5345a78..e279911acc0 100644
--- a/gcc/c-objc-common.c
+++ b/gcc/c-objc-common.c
@@ -34,6 +34,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "varray.h"
#include "ggc.h"
#include "langhooks.h"
+#include "target.h"
static bool c_tree_printer PARAMS ((output_buffer *, text_info *));
static tree inline_forbidden_p PARAMS ((tree *, int *, void *));
@@ -120,7 +121,7 @@ inline_forbidden_p (nodep, walk_subtrees, fn)
/* We will not inline a function which uses computed goto. The
addresses of its local labels, which may be tucked into
global storage, are of course not constant across
- instantiations, which causes unexpected behaviour. */
+ instantiations, which causes unexpected behavior. */
if (TREE_CODE (t) != LABEL_DECL)
return node;
@@ -150,11 +151,13 @@ c_cannot_inline_tree_fn (fnp)
&& lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL)
return 1;
+ /* Don't auto-inline anything that might not be bound within
+ this unit of translation. */
+ if (!DECL_DECLARED_INLINE_P (fn) && !(*targetm.binds_local_p) (fn))
+ goto cannot_inline;
+
if (! function_attribute_inlinable_p (fn))
- {
- DECL_UNINLINABLE (fn) = 1;
- return 1;
- }
+ goto cannot_inline;
/* If a function has pending sizes, we must not defer its
compilation, and we can't inline it as a tree. */
@@ -164,10 +167,7 @@ c_cannot_inline_tree_fn (fnp)
put_pending_sizes (t);
if (t)
- {
- DECL_UNINLINABLE (fn) = 1;
- return 1;
- }
+ goto cannot_inline;
}
if (DECL_CONTEXT (fn))
@@ -175,10 +175,7 @@ c_cannot_inline_tree_fn (fnp)
/* If a nested function has pending sizes, we may have already
saved them. */
if (DECL_LANG_SPECIFIC (fn)->pending_sizes)
- {
- DECL_UNINLINABLE (fn) = 1;
- return 1;
- }
+ goto cannot_inline;
}
else
{
@@ -201,12 +198,13 @@ c_cannot_inline_tree_fn (fnp)
}
if (walk_tree (&DECL_SAVED_TREE (fn), inline_forbidden_p, fn, NULL))
- {
- DECL_UNINLINABLE (fn) = 1;
- return 1;
- }
+ goto cannot_inline;
return 0;
+
+ cannot_inline:
+ DECL_UNINLINABLE (fn) = 1;
+ return 1;
}
/* Called from check_global_declarations. */
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 36f11f02288..2de8faad4ef 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -124,6 +124,7 @@ static void sanitize_cpp_opts PARAMS ((void));
OPT("MQ", CL_ALL | CL_ARG, OPT_MQ) \
OPT("MT", CL_ALL | CL_ARG, OPT_MT) \
OPT("P", CL_ALL, OPT_P) \
+ OPT("Wabi", CL_CXX, OPT_Wabi) \
OPT("Wall", CL_ALL, OPT_Wall) \
OPT("Wbad-function-cast", CL_C, OPT_Wbad_function_cast) \
OPT("Wcast-qual", CL_ALL, OPT_Wcast_qual) \
@@ -180,12 +181,14 @@ static void sanitize_cpp_opts PARAMS ((void));
OPT("Wsystem-headers", CL_ALL, OPT_Wsystem_headers) \
OPT("Wtraditional", CL_C, OPT_Wtraditional) \
OPT("Wtrigraphs", CL_ALL, OPT_Wtrigraphs) \
+ OPT("Wundeclared-selector", CL_OBJC, OPT_Wundeclared_selector) \
OPT("Wundef", CL_ALL, OPT_Wundef) \
OPT("Wunknown-pragmas", CL_ALL, OPT_Wunknown_pragmas) \
OPT("Wunused-macros", CL_ALL, OPT_Wunused_macros) \
OPT("Wwrite-strings", CL_ALL, OPT_Wwrite_strings) \
OPT("ansi", CL_ALL, OPT_ansi) \
OPT("d", CL_ALL | CL_JOINED, OPT_d) \
+ OPT("fabi-version=", CL_CXX | CL_JOINED, OPT_fabi_version) \
OPT("faccess-control", CL_CXX, OPT_faccess_control) \
OPT("fall-virtual", CL_CXX, OPT_fall_virtual) \
OPT("falt-external-templates",CL_CXX, OPT_falt_external_templates) \
@@ -340,6 +343,7 @@ missing_arg (opt_index)
{
case OPT_Wformat_eq:
case OPT_d:
+ case OPT_fabi_version:
case OPT_fbuiltin_:
case OPT_fdump:
case OPT_fname_mangling:
@@ -374,7 +378,10 @@ missing_arg (opt_index)
Complications arise since some options can be suffixed with an
argument, and multiple complete matches can occur, e.g. -pedantic
and -pedantic-errors. Also, some options are only accepted by some
- languages. */
+ languages. If a switch matches for a different language and
+ doesn't match any alternatives for the true front end, the index of
+ the matched switch is returned anyway. The caller should check for
+ this case. */
static size_t
find_opt (input, lang_flag)
const char *input;
@@ -382,7 +389,7 @@ find_opt (input, lang_flag)
{
size_t md, mn, mx;
size_t opt_len;
- size_t wrong_lang = N_OPTS;
+ size_t result = N_OPTS;
int comp;
mn = 0;
@@ -393,7 +400,7 @@ find_opt (input, lang_flag)
md = (mn + mx) / 2;
opt_len = cl_options[md].opt_len;
- comp = memcmp (input, cl_options[md].opt_text, opt_len);
+ comp = strncmp (input, cl_options[md].opt_text, opt_len);
if (comp < 0)
mx = md;
@@ -403,13 +410,7 @@ find_opt (input, lang_flag)
{
/* The switch matches. It it an exact match? */
if (input[opt_len] == '\0')
- {
- exact_match:
- if (cl_options[md].flags & lang_flag)
- return md;
- wrong_lang = md;
- break;
- }
+ return md;
else
{
mn = md + 1;
@@ -423,9 +424,10 @@ find_opt (input, lang_flag)
/* Is this switch valid for this front end? */
if (!(cl_options[md].flags & lang_flag))
{
- /* If subsequently we don't find a good match,
- report this as a bad match. */
- wrong_lang = md;
+ /* If subsequently we don't find a better match,
+ return this and let the caller report it as a bad
+ match. */
+ result = md;
continue;
}
@@ -441,10 +443,10 @@ find_opt (input, lang_flag)
for (md = md + 1; md < (size_t) N_OPTS; md++)
{
opt_len = cl_options[md].opt_len;
- if (memcmp (input, cl_options[md].opt_text, opt_len))
+ if (strncmp (input, cl_options[md].opt_text, opt_len))
break;
if (input[opt_len] == '\0')
- goto exact_match;
+ return md;
if (cl_options[md].flags & lang_flag
&& cl_options[md].flags & CL_JOINED)
mx = md;
@@ -455,10 +457,7 @@ find_opt (input, lang_flag)
}
}
- if (wrong_lang != N_OPTS)
- complain_wrong_lang (wrong_lang);
-
- return N_OPTS;
+ return result;
}
/* Defer option CODE with argument ARG. */
@@ -516,9 +515,6 @@ c_common_init_options (lang)
warn_pointer_arith = (lang == clk_cplusplus);
if (lang == clk_c)
warn_sign_compare = -1;
-
- /* Mark as "unspecified" (see c_common_post_options). */
- flag_bounds_check = -1;
}
/* Handle one command-line option in (argc, argv).
@@ -534,7 +530,7 @@ c_common_decode_option (argc, argv)
const char *opt, *arg = 0;
char *dup = 0;
bool on = true;
- int result;
+ int result, lang_flag;
const struct cl_option *option;
enum opt_code code;
@@ -574,7 +570,8 @@ c_common_decode_option (argc, argv)
result = cpp_handle_option (parse_in, argc, argv);
/* Skip over '-'. */
- opt_index = find_opt (opt + 1, lang_flags[(c_language << 1) + flag_objc]);
+ lang_flag = lang_flags[(c_language << 1) + flag_objc];
+ opt_index = find_opt (opt + 1, lang_flag);
if (opt_index == N_OPTS)
goto done;
@@ -610,6 +607,15 @@ c_common_decode_option (argc, argv)
}
}
+ /* Complain about the wrong language after we've swallowed any
+ necessary extra argument. Eventually make this a hard error
+ after the call to find_opt, and return argc. */
+ if (!(cl_options[opt_index].flags & lang_flag))
+ {
+ complain_wrong_lang (opt_index);
+ goto done;
+ }
+
switch (code = option->opt_code)
{
case N_OPTS: /* Shut GCC up. */
@@ -678,6 +684,10 @@ c_common_decode_option (argc, argv)
cpp_opts->no_line_commands = 1;
break;
+ case OPT_Wabi:
+ warn_abi = on;
+ break;
+
case OPT_Wall:
set_Wunused (on);
set_Wformat (on);
@@ -689,7 +699,8 @@ c_common_decode_option (argc, argv)
warn_sequence_point = on; /* Was C only. */
warn_sign_compare = on; /* Was C++ only. */
warn_switch = on;
-
+ warn_strict_aliasing = on;
+
/* Only warn about unknown pragmas that are not in system
headers. */
warn_unknown_pragmas = on;
@@ -942,6 +953,10 @@ c_common_decode_option (argc, argv)
cpp_opts->warn_trigraphs = on;
break;
+ case OPT_Wundeclared_selector:
+ warn_undeclared_selector = on;
+ break;
+
case OPT_Wundef:
cpp_opts->warn_undef = on;
break;
@@ -999,6 +1014,10 @@ c_common_decode_option (argc, argv)
warning ("switch \"%s\" is no longer supported", argv[0]);
break;
+ case OPT_fabi_version:
+ flag_abi_version = read_integral_parameter (arg, argv[0], 1);
+ break;
+
case OPT_faccess_control:
flag_access_control = on;
break;
@@ -1184,7 +1203,7 @@ c_common_decode_option (argc, argv)
break;
case OPT_ftabstop:
- /* Don't recognise -fno-tabstop=. */
+ /* Don't recognize -fno-tabstop=. */
if (!on)
return 0;
@@ -1352,10 +1371,6 @@ c_common_post_options ()
}
}
- /* If still "unspecified", make it match -fbounded-pointers. */
- if (flag_bounds_check == -1)
- flag_bounds_check = flag_bounded_pointers;
-
/* Special format checking options don't work without -Wformat; warn if
they are used. */
if (warn_format_y2k && !warn_format)
@@ -1625,7 +1640,7 @@ set_Wimplicit (on)
}
/* Args to -d specify what to dump. Silently ignore
- unrecognised options; they may be aimed at toplev.c. */
+ unrecognized options; they may be aimed at toplev.c. */
static void
handle_OPT_d (arg)
const char *arg;
diff --git a/gcc/c-pretty-print.c b/gcc/c-pretty-print.c
index a04b92fddd0..377018ed21e 100644
--- a/gcc/c-pretty-print.c
+++ b/gcc/c-pretty-print.c
@@ -463,14 +463,14 @@ pp_c_integer_literal (ppi, i)
}
}
-/* Print out a REAL value. */
+/* Print out a REAL value. */
static inline void
pp_c_real_literal (ppi, r)
c_pretty_printer ppi;
tree r;
{
- REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
- pp_buffer (ppi)->digit_buffer);
+ real_to_decimal (pp_buffer (ppi)->digit_buffer, &TREE_REAL_CST (r),
+ sizeof (pp_buffer (ppi)->digit_buffer), 0, 1);
pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
}
@@ -557,7 +557,7 @@ pp_c_primary_expression (ppi, e)
break;
default:
- /* Make sure this call won't cause any infinite loop. */
+ /* Make sure this call won't cause any infinite loop. */
pp_c_left_paren (ppi);
pp_c_expression (ppi, e);
pp_c_right_paren (ppi);
@@ -1384,7 +1384,7 @@ pp_c_statement (ppi, stmt)
case GOTO_STMT:
{
tree e = code == RETURN_STMT
- ? RETURN_EXPR (stmt)
+ ? RETURN_STMT_EXPR (stmt)
: GOTO_DESTINATION (stmt);
pp_newline (ppi);
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c
index 90b3cc141ac..580122fb152 100644
--- a/gcc/c-semantics.c
+++ b/gcc/c-semantics.c
@@ -335,7 +335,7 @@ genrtl_expr_stmt (expr)
whether to (1) save the value of the expression, (0) discard it or
(-1) use expr_stmts_for_value to tell. The use of -1 is
deprecated, and retained only for backward compatibility.
- MAYBE_LAST is non-zero if this EXPR_STMT might be the last statement
+ MAYBE_LAST is nonzero if this EXPR_STMT might be the last statement
in expression statement. */
void
@@ -447,13 +447,25 @@ genrtl_do_stmt (t)
/* Recognize the common special-case of do { ... } while (0) and do
not emit the loop widgetry in this case. In particular this
avoids cluttering the rtl with dummy loop notes, which can affect
- alignment of adjacent labels. */
- if (integer_zerop (cond))
+ alignment of adjacent labels. COND can be NULL due to parse
+ errors. */
+ if (!cond || integer_zerop (cond))
{
expand_start_null_loop ();
expand_stmt (DO_BODY (t));
expand_end_null_loop ();
}
+ else if (integer_nonzerop (cond))
+ {
+ emit_nop ();
+ emit_line_note (input_filename, lineno);
+ expand_start_loop (1);
+
+ expand_stmt (DO_BODY (t));
+
+ emit_line_note (input_filename, lineno);
+ expand_end_loop ();
+ }
else
{
emit_nop ();
@@ -487,7 +499,7 @@ genrtl_return_stmt (stmt)
{
tree expr;
- expr = RETURN_EXPR (stmt);
+ expr = RETURN_STMT_EXPR (stmt);
emit_line_note (input_filename, lineno);
if (!expr)
@@ -518,7 +530,10 @@ genrtl_for_stmt (t)
/* Expand the initialization. */
emit_nop ();
emit_line_note (input_filename, lineno);
- expand_start_loop_continue_elsewhere (1);
+ if (FOR_EXPR (t))
+ expand_start_loop_continue_elsewhere (1);
+ else
+ expand_start_loop (1);
genrtl_do_pushlevel ();
cond = expand_cond (FOR_COND (t));
@@ -540,9 +555,11 @@ genrtl_for_stmt (t)
input_filename = saved_filename;
lineno = saved_lineno;
emit_line_note (input_filename, lineno);
- expand_loop_continue_here ();
if (FOR_EXPR (t))
- genrtl_expr_stmt (FOR_EXPR (t));
+ {
+ expand_loop_continue_here ();
+ genrtl_expr_stmt (FOR_EXPR (t));
+ }
expand_end_loop ();
}
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 0d6829fc6e9..159c235224e 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -48,7 +48,8 @@ struct lang_identifier GTY(())
/* The resulting tree type. */
union lang_tree_node
- GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE")))
+ GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
+ chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
{
union tree_node GTY ((tag ("0"),
desc ("tree_node_structure (&%h)")))
@@ -165,11 +166,11 @@ struct lang_type GTY(())
/* in c-lang.c and objc-act.c */
extern tree lookup_interface PARAMS ((tree));
extern tree is_class_name PARAMS ((tree));
+extern tree objc_is_id PARAMS ((tree));
extern void objc_check_decl PARAMS ((tree));
extern void finish_file PARAMS ((void));
extern int objc_comptypes PARAMS ((tree, tree, int));
extern tree objc_message_selector PARAMS ((void));
-extern int recognize_objc_keyword PARAMS ((void));
extern tree lookup_objc_ivar PARAMS ((tree));
@@ -268,6 +269,7 @@ extern tree build_array_ref PARAMS ((tree, tree));
extern tree build_external_ref PARAMS ((tree, int));
extern tree parser_build_binary_op PARAMS ((enum tree_code,
tree, tree));
+extern int c_tree_expr_nonnegative_p PARAMS ((tree));
extern void readonly_warning PARAMS ((tree, const char *));
extern tree build_conditional_expr PARAMS ((tree, tree, tree));
extern tree build_compound_expr PARAMS ((tree));
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index bfc44848ad7..929541b7017 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -51,7 +51,7 @@ static int missing_braces_mentioned;
static int undeclared_variable_notice;
static tree qualify_type PARAMS ((tree, tree));
-static int comp_target_types PARAMS ((tree, tree));
+static int comp_target_types PARAMS ((tree, tree, int));
static int function_types_compatible_p PARAMS ((tree, tree));
static int type_lists_compatible_p PARAMS ((tree, tree));
static tree decl_constant_value_for_broken_optimization PARAMS ((tree));
@@ -579,16 +579,21 @@ comptypes (type1, type2)
}
/* Return 1 if TTL and TTR are pointers to types that are equivalent,
- ignoring their qualifiers. */
+ ignoring their qualifiers. REFLEXIVE is only used by ObjC - set it
+ to 1 or 0 depending if the check of the pointer types is meant to
+ be reflexive or not (typically, assignments are not reflexive,
+ while comparisons are reflexive).
+*/
static int
-comp_target_types (ttl, ttr)
+comp_target_types (ttl, ttr, reflexive)
tree ttl, ttr;
+ int reflexive;
{
int val;
- /* Give maybe_objc_comptypes a crack at letting these types through. */
- if ((val = objc_comptypes (ttl, ttr, 1)) >= 0)
+ /* Give objc_comptypes a crack at letting these types through. */
+ if ((val = objc_comptypes (ttl, ttr, reflexive)) >= 0)
return val;
val = comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (ttl)),
@@ -1465,7 +1470,7 @@ build_function_call (function, params)
{
tree fntype, fundecl = 0;
tree coerced_params;
- tree name = NULL_TREE, assembler_name = NULL_TREE, result;
+ tree name = NULL_TREE, result;
/* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */
STRIP_TYPE_NOPS (function);
@@ -1474,7 +1479,6 @@ build_function_call (function, params)
if (TREE_CODE (function) == FUNCTION_DECL)
{
name = DECL_NAME (function);
- assembler_name = DECL_ASSEMBLER_NAME (function);
/* Differs from default_conversion by not setting TREE_ADDRESSABLE
(because calling an inline function does not mean the function
@@ -1958,7 +1962,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
/* Subtraction of two similar pointers.
We must subtract them as integers, then divide by object size. */
if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
- && comp_target_types (type0, type1))
+ && comp_target_types (type0, type1, 1))
return pointer_diff (op0, op1);
/* Handle pointer minus int. Just like pointer plus int. */
else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
@@ -2148,7 +2152,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
/* Anything compares with void *. void * compares with anything.
Otherwise, the targets must be compatible
and both must be object or both incomplete. */
- if (comp_target_types (type0, type1))
+ if (comp_target_types (type0, type1, 1))
result_type = common_type (type0, type1);
else if (VOID_TYPE_P (tt0))
{
@@ -2195,7 +2199,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
shorten = 1;
else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
{
- if (comp_target_types (type0, type1))
+ if (comp_target_types (type0, type1, 1))
{
result_type = common_type (type0, type1);
if (pedantic
@@ -2220,7 +2224,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
short_compare = 1;
else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
{
- if (comp_target_types (type0, type1))
+ if (comp_target_types (type0, type1, 1))
{
result_type = common_type (type0, type1);
if (!COMPLETE_TYPE_P (TREE_TYPE (type0))
@@ -2463,7 +2467,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
constant expression involving such literals or a
conditional expression involving such literals)
and it is non-negative. */
- if (tree_expr_nonnegative_p (sop))
+ if (c_tree_expr_nonnegative_p (sop))
/* OK */;
/* Do not warn if the comparison is an equality operation,
the unsigned quantity is an integral constant, and it
@@ -2579,6 +2583,27 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
}
}
+
+/* Return true if `t' is known to be non-negative. */
+
+int
+c_tree_expr_nonnegative_p (t)
+ tree t;
+{
+ if (TREE_CODE (t) == STMT_EXPR)
+ {
+ t=COMPOUND_BODY (STMT_EXPR_STMT (t));
+
+ /* Find the last statement in the chain, ignoring the final
+ * scope statement */
+ while (TREE_CHAIN (t) != NULL_TREE
+ && TREE_CODE (TREE_CHAIN (t)) != SCOPE_STMT)
+ t=TREE_CHAIN (t);
+ return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
+ }
+ return tree_expr_nonnegative_p (t);
+}
+
/* Return a tree for the difference of pointers OP0 and OP1.
The resulting tree has type int. */
@@ -3406,8 +3431,8 @@ build_conditional_expr (ifexp, op1, op2)
/* Do not warn if the signed quantity is an unsuffixed
integer literal (or some static constant expression
involving such literals) and it is non-negative. */
- else if ((unsigned_op2 && tree_expr_nonnegative_p (op1))
- || (unsigned_op1 && tree_expr_nonnegative_p (op2)))
+ else if ((unsigned_op2 && c_tree_expr_nonnegative_p (op1))
+ || (unsigned_op1 && c_tree_expr_nonnegative_p (op2)))
/* OK */;
else
warning ("signed and unsigned type in conditional expression");
@@ -3422,7 +3447,7 @@ build_conditional_expr (ifexp, op1, op2)
}
else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE)
{
- if (comp_target_types (type1, type2))
+ if (comp_target_types (type1, type2, 1))
result_type = common_type (type1, type2);
else if (integer_zerop (op1) && TREE_TYPE (type1) == void_type_node
&& TREE_CODE (orig_op1) != NOP_EXPR)
@@ -3577,7 +3602,12 @@ build_c_cast (type, expr)
if (type == error_mark_node || expr == error_mark_node)
return error_mark_node;
- type = TYPE_MAIN_VARIANT (type);
+
+ /* The ObjC front-end uses TYPE_MAIN_VARIANT to tie together types differing
+ only in <protocol> qualifications. But when constructing cast expressions,
+ the protocols do matter and must be kept around. */
+ if (!flag_objc || !objc_is_id (type))
+ type = TYPE_MAIN_VARIANT (type);
#if 0
/* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
@@ -3618,20 +3648,10 @@ build_c_cast (type, expr)
if (field)
{
- const char *name;
tree t;
if (pedantic)
pedwarn ("ISO C forbids casts to union type");
- if (TYPE_NAME (type) != 0)
- {
- if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
- name = IDENTIFIER_POINTER (TYPE_NAME (type));
- else
- name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
- }
- else
- name = "";
t = digest_init (type, build (CONSTRUCTOR, type, NULL_TREE,
build_tree_list (field, value)), 0);
TREE_CONSTANT (t) = TREE_CONSTANT (value);
@@ -3728,6 +3748,23 @@ build_c_cast (type, expr)
&& !TREE_CONSTANT (value))
warning ("cast to pointer from integer of different size");
+ if (TREE_CODE (type) == POINTER_TYPE
+ && TREE_CODE (otype) == POINTER_TYPE
+ && TREE_CODE (expr) == ADDR_EXPR
+ && DECL_P (TREE_OPERAND (expr, 0))
+ && flag_strict_aliasing && warn_strict_aliasing
+ && !VOID_TYPE_P (TREE_TYPE (type)))
+ {
+ /* Casting the address of a decl to non void pointer. Warn
+ if the cast breaks type based aliasing. */
+ if (!COMPLETE_TYPE_P (TREE_TYPE (type)))
+ warning ("type-punning to incomplete type might break strict-aliasing rules");
+ else if (!alias_sets_conflict_p
+ (get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))),
+ get_alias_set (TREE_TYPE (type))))
+ warning ("dereferencing type-punned pointer will break strict-aliasing rules");
+ }
+
ovalue = value;
value = convert (type, value);
@@ -3984,8 +4021,9 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
{
overflow_warning (rhs);
- /* Check for Objective-C protocols. This will issue a warning if
- there are protocol violations. No need to use the return value. */
+ /* Check for Objective-C protocols. This will automatically
+ issue a warning if there are protocol violations. No need to
+ use the return value. */
if (flag_objc)
objc_comptypes (type, rhstype, 0);
return rhs;
@@ -4060,7 +4098,7 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
Meanwhile, the lhs target must have all the qualifiers of
the rhs. */
if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
- || comp_target_types (memb_type, rhstype))
+ || comp_target_types (memb_type, rhstype, 0))
{
/* If this type won't generate any warnings, use it. */
if (TYPE_QUALS (ttl) == TYPE_QUALS (ttr)
@@ -4135,7 +4173,7 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
and vice versa; otherwise, targets must be the same.
Meanwhile, the lhs target must have all the qualifiers of the rhs. */
if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
- || comp_target_types (type, rhstype)
+ || comp_target_types (type, rhstype, 0)
|| (c_common_unsigned_type (TYPE_MAIN_VARIANT (ttl))
== c_common_unsigned_type (TYPE_MAIN_VARIANT (ttr))))
{
@@ -4160,7 +4198,7 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
/* If this is not a case of ignoring a mismatch in signedness,
no warning. */
else if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
- || comp_target_types (type, rhstype))
+ || comp_target_types (type, rhstype, 0))
;
/* If there is a mismatch, do warn. */
else if (pedantic)
@@ -5523,7 +5561,7 @@ pop_init_level (implicit)
}
/* Common handling for both array range and field name designators.
- ARRAY argument is non-zero for array ranges. Returns zero for success. */
+ ARRAY argument is nonzero for array ranges. Returns zero for success. */
static int
set_designator (array)
diff --git a/gcc/calls.c b/gcc/calls.c
index 5979747a68b..0cbdccfc916 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -36,10 +36,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "langhooks.h"
#include "target.h"
-#if !defined FUNCTION_OK_FOR_SIBCALL
-#define FUNCTION_OK_FOR_SIBCALL(DECL) 1
-#endif
-
/* Decide whether a function's arguments should be processed
from first to last or from last to first.
@@ -91,7 +87,7 @@ struct arg_data
/* Number of registers to use. 0 means put the whole arg in registers.
Also 0 if not passed in registers. */
int partial;
- /* Non-zero if argument must be passed on stack.
+ /* Nonzero if argument must be passed on stack.
Note that some arguments may be passed on the stack
even though pass_on_stack is zero, just because FUNCTION_ARG says so.
pass_on_stack identifies arguments that *cannot* go in registers. */
@@ -126,7 +122,7 @@ struct arg_data
struct args_size alignment_pad;
};
-/* A vector of one char per byte of stack space. A byte if non-zero if
+/* A vector of one char per byte of stack space. A byte if nonzero if
the corresponding stack location has been used.
This vector is used to prevent a function call within an argument from
clobbering any stack already set up. */
@@ -152,35 +148,6 @@ int stack_arg_under_construction;
static int calls_function PARAMS ((tree, int));
static int calls_function_1 PARAMS ((tree, int));
-/* Nonzero if this is a call to a `const' function. */
-#define ECF_CONST 1
-/* Nonzero if this is a call to a `volatile' function. */
-#define ECF_NORETURN 2
-/* Nonzero if this is a call to malloc or a related function. */
-#define ECF_MALLOC 4
-/* Nonzero if it is plausible that this is a call to alloca. */
-#define ECF_MAY_BE_ALLOCA 8
-/* Nonzero if this is a call to a function that won't throw an exception. */
-#define ECF_NOTHROW 16
-/* Nonzero if this is a call to setjmp or a related function. */
-#define ECF_RETURNS_TWICE 32
-/* Nonzero if this is a call to `longjmp'. */
-#define ECF_LONGJMP 64
-/* Nonzero if this is a syscall that makes a new process in the image of
- the current one. */
-#define ECF_FORK_OR_EXEC 128
-#define ECF_SIBCALL 256
-/* Nonzero if this is a call to "pure" function (like const function,
- but may read memory. */
-#define ECF_PURE 512
-/* Nonzero if this is a call to a function that returns with the stack
- pointer depressed. */
-#define ECF_SP_DEPRESSED 1024
-/* Nonzero if this call is known to always return. */
-#define ECF_ALWAYS_RETURN 2048
-/* Create libcall block around the call. */
-#define ECF_LIBCALL_BLOCK 4096
-
static void emit_call_1 PARAMS ((rtx, tree, tree, HOST_WIDE_INT,
HOST_WIDE_INT, HOST_WIDE_INT, rtx,
rtx, int, rtx, int,
@@ -217,7 +184,6 @@ static rtx emit_library_call_value_1 PARAMS ((int, rtx, rtx,
enum machine_mode,
int, va_list));
static int special_function_p PARAMS ((tree, int));
-static int flags_from_decl_or_type PARAMS ((tree));
static rtx try_to_integrate PARAMS ((tree, tree, rtx,
int, tree, rtx));
static int check_sibcall_argument_overlap_1 PARAMS ((rtx));
@@ -801,7 +767,7 @@ setjmp_call_p (fndecl)
/* Detect flags (function attributes) from the function decl or type node. */
-static int
+int
flags_from_decl_or_type (exp)
tree exp;
{
@@ -876,6 +842,12 @@ precompute_register_parameters (num_actuals, args, reg_parm_seen)
emit_queue ();
}
+ /* If the value is a non-legitimate constant, force it into a
+ pseudo now. TLS symbols sometimes need a call to resolve. */
+ if (CONSTANT_P (args[i].value)
+ && !LEGITIMATE_CONSTANT_P (args[i].value))
+ args[i].value = force_reg (args[i].mode, args[i].value);
+
/* If we are to promote the function arg to a wider mode,
do it now. */
@@ -967,11 +939,8 @@ save_fixed_argument_area (reg_parm_stack_space, argblock,
if (save_mode == BLKmode)
{
save_area = assign_stack_temp (BLKmode, num_to_save, 0);
- /* Cannot use emit_block_move here because it can be done by a
- library call which in turn gets into this place again and deadly
- infinite recursion happens. */
- move_by_pieces (validize_mem (save_area), stack_area, num_to_save,
- PARM_BOUNDARY);
+ emit_block_move (validize_mem (save_area), stack_area,
+ GEN_INT (num_to_save), BLOCK_OP_CALL_PARM);
}
else
{
@@ -1008,11 +977,9 @@ restore_fixed_argument_area (save_area, argblock, high_to_save, low_to_save)
if (save_mode != BLKmode)
emit_move_insn (stack_area, save_area);
else
- /* Cannot use emit_block_move here because it can be done by a library
- call which in turn gets into this place again and deadly infinite
- recursion happens. */
- move_by_pieces (stack_area, validize_mem (save_area),
- high_to_save - low_to_save + 1, PARM_BOUNDARY);
+ emit_block_move (stack_area, validize_mem (save_area),
+ GEN_INT (high_to_save - low_to_save + 1),
+ BLOCK_OP_CALL_PARM);
}
#endif /* REG_PARM_STACK_SPACE */
@@ -1700,10 +1667,8 @@ rtx_for_function_call (fndecl, exp)
else
/* Generate an rtx (probably a pseudo-register) for the address. */
{
- rtx funaddr;
push_temp_slots ();
- funaddr = funexp
- = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
+ funexp = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
pop_temp_slots (); /* FUNEXP can't be BLKmode. */
emit_queue ();
}
@@ -1970,7 +1935,7 @@ combine_pending_stack_adjustment_and_call (unadjusted_args_size,
/* Scan X expression if it does not dereference any argument slots
we already clobbered by tail call arguments (as noted in stored_args_map
bitmap).
- Return non-zero if X expression dereferences such argument slots,
+ Return nonzero if X expression dereferences such argument slots,
zero otherwise. */
static int
@@ -2033,7 +1998,7 @@ check_sibcall_argument_overlap_1 (x)
/* Scan sequence after INSN if it does not dereference any argument slots
we already clobbered by tail call arguments (as noted in stored_args_map
bitmap). Add stack slots for ARG to stored_args_map bitmap afterwards.
- Return non-zero if sequence after INSN dereferences such argument slots,
+ Return nonzero if sequence after INSN dereferences such argument slots,
zero otherwise. */
static int
@@ -2450,17 +2415,13 @@ expand_call (exp, target, ignore)
It does not seem worth the effort since few optimizable
sibling calls will return a structure. */
|| structure_value_addr != NULL_RTX
- /* If the register holding the address is a callee saved
- register, then we lose. We have no way to prevent that,
- so we only allow calls to named functions. */
- /* ??? This could be done by having the insn constraints
- use a register class that is all call-clobbered. Any
- reload insns generated to fix things up would appear
- before the sibcall_epilogue. */
- || fndecl == NULL_TREE
- || (flags & (ECF_RETURNS_TWICE | ECF_LONGJMP))
- || TREE_THIS_VOLATILE (fndecl)
- || !FUNCTION_OK_FOR_SIBCALL (fndecl)
+ /* Check whether the target is able to optimize the call
+ into a sibcall. */
+ || !(*targetm.function_ok_for_sibcall) (fndecl, exp)
+ /* Functions that do not return exactly once may not be sibcall
+ optimized. */
+ || (flags & (ECF_RETURNS_TWICE | ECF_LONGJMP | ECF_NORETURN))
+ || TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))))
/* If this function requires more stack slots than the current
function, we cannot change it into a sibling call. */
|| args_size.constant > current_function_args_size
@@ -2592,7 +2553,7 @@ expand_call (exp, target, ignore)
is subject to race conditions, just as with multithreaded
programs. */
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__bb_fork_func"),
+ emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__gcov_flush"),
LCT_ALWAYS_RETURN,
VOIDmode, 0);
}
@@ -3317,9 +3278,9 @@ expand_call (exp, target, ignore)
if (save_mode != BLKmode)
emit_move_insn (stack_area, args[i].save_area);
else
- emit_block_move (stack_area,
- validize_mem (args[i].save_area),
- GEN_INT (args[i].size.constant));
+ emit_block_move (stack_area, args[i].save_area,
+ GEN_INT (args[i].size.constant),
+ BLOCK_OP_CALL_PARM);
}
highest_outgoing_arg_in_use = initial_highest_arg_in_use;
@@ -3689,6 +3650,14 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
}
flags &= ~(ECF_CONST | ECF_PURE | ECF_LIBCALL_BLOCK);
+ /* If this was a CONST function, it is now PURE since
+ it now reads memory. */
+ if (flags & ECF_CONST)
+ {
+ flags &= ~ECF_CONST;
+ flags |= ECF_PURE;
+ }
+
if (GET_MODE (val) == MEM && ! must_copy)
slot = val;
else if (must_copy)
@@ -3909,8 +3878,8 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
{
save_area = assign_stack_temp (BLKmode, num_to_save, 0);
set_mem_align (save_area, PARM_BOUNDARY);
- emit_block_move (validize_mem (save_area), stack_area,
- GEN_INT (num_to_save));
+ emit_block_move (save_area, stack_area, GEN_INT (num_to_save),
+ BLOCK_OP_CALL_PARM);
}
else
{
@@ -3978,8 +3947,9 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
}
}
- emit_push_insn (val, mode, NULL_TREE, NULL_RTX, 0, partial, reg, 0,
- argblock, GEN_INT (argvec[argnum].offset.constant),
+ emit_push_insn (val, mode, NULL_TREE, NULL_RTX, PARM_BOUNDARY,
+ partial, reg, 0, argblock,
+ GEN_INT (argvec[argnum].offset.constant),
reg_parm_stack_space, ARGS_SIZE_RTX (alignment_pad));
/* Now mark the segment we just used. */
@@ -4152,9 +4122,9 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
emit_move_insn (value, mem_value);
}
else if (value != 0)
- emit_move_insn (value, hard_libcall_value (outmode));
+ emit_move_insn (value, valreg);
else
- value = hard_libcall_value (outmode);
+ value = valreg;
}
if (ACCUMULATE_OUTGOING_ARGS)
@@ -4180,8 +4150,9 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
if (save_mode != BLKmode)
emit_move_insn (stack_area, save_area);
else
- emit_block_move (stack_area, validize_mem (save_area),
- GEN_INT (high_to_save - low_to_save + 1));
+ emit_block_move (stack_area, save_area,
+ GEN_INT (high_to_save - low_to_save + 1),
+ BLOCK_OP_CALL_PARM);
}
#endif
@@ -4283,7 +4254,7 @@ emit_library_call_value VPARAMS((rtx orgfun, rtx value,
FNDECL is the declaration of the function we are calling.
- Return non-zero if this arg should cause sibcall failure,
+ Return nonzero if this arg should cause sibcall failure,
zero otherwise. */
static int
@@ -4358,7 +4329,8 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
arg->save_area = assign_temp (nt, 0, 1, 1);
preserve_temp_slots (arg->save_area);
emit_block_move (validize_mem (arg->save_area), stack_area,
- expr_size (arg->tree_value));
+ expr_size (arg->tree_value),
+ BLOCK_OP_CALL_PARM);
}
else
{
@@ -4479,8 +4451,8 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
/* This isn't already where we want it on the stack, so put it there.
This can either be done with push or copy insns. */
- emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX, 0,
- partial, reg, used - size, argblock,
+ emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX,
+ PARM_BOUNDARY, partial, reg, used - size, argblock,
ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space,
ARGS_SIZE_RTX (arg->alignment_pad));
@@ -4493,6 +4465,7 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
{
/* BLKmode, at least partly to be pushed. */
+ unsigned int parm_align;
int excess;
rtx size_rtx;
@@ -4514,7 +4487,25 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
emit_push_insn for BLKmode is careful to avoid it. */
excess = (arg->size.constant - int_size_in_bytes (TREE_TYPE (pval))
+ partial * UNITS_PER_WORD);
- size_rtx = expr_size (pval);
+ size_rtx = expand_expr (size_in_bytes (TREE_TYPE (pval)),
+ NULL_RTX, TYPE_MODE (sizetype), 0);
+ }
+
+ /* Some types will require stricter alignment, which will be
+ provided for elsewhere in argument layout. */
+ parm_align = MAX (PARM_BOUNDARY, TYPE_ALIGN (TREE_TYPE (pval)));
+
+ /* When an argument is padded down, the block is aligned to
+ PARM_BOUNDARY, but the actual argument isn't. */
+ if (FUNCTION_ARG_PADDING (arg->mode, TREE_TYPE (pval)) == downward)
+ {
+ if (arg->size.var)
+ parm_align = BITS_PER_UNIT;
+ else if (excess)
+ {
+ int excess_align = (excess & -excess) * BITS_PER_UNIT;
+ parm_align = MIN (parm_align, excess_align);
+ }
}
if ((flags & ECF_SIBCALL) && GET_CODE (arg->value) == MEM)
@@ -4574,18 +4565,16 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
{
rtx size_rtx1 = GEN_INT (reg_parm_stack_space - arg->offset.constant);
emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx1,
- TYPE_ALIGN (TREE_TYPE (pval)), partial, reg,
- excess, argblock, ARGS_SIZE_RTX (arg->offset),
- reg_parm_stack_space,
+ parm_align, partial, reg, excess, argblock,
+ ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space,
ARGS_SIZE_RTX (arg->alignment_pad));
}
}
emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx,
- TYPE_ALIGN (TREE_TYPE (pval)), partial, reg, excess,
- argblock, ARGS_SIZE_RTX (arg->offset),
- reg_parm_stack_space,
+ parm_align, partial, reg, excess, 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
diff --git a/gcc/cfganal.c b/gcc/cfganal.c
index 35ce07d53fc..7aeef93accd 100644
--- a/gcc/cfganal.c
+++ b/gcc/cfganal.c
@@ -54,7 +54,31 @@ 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 flow_active_insn_p PARAMS ((rtx));
+/* Like active_insn_p, except keep the return value clobber around
+ even after reload. */
+
+static bool
+flow_active_insn_p (insn)
+ rtx insn;
+{
+ if (active_insn_p (insn))
+ return true;
+
+ /* A clobber of the function return value exists for buggy
+ programs that fail to return a value. Its effect is to
+ keep the return value from being live across the entire
+ function. If we allow it to be skipped, we introduce the
+ possibility for register livetime aborts. */
+ if (GET_CODE (PATTERN (insn)) == CLOBBER
+ && GET_CODE (XEXP (PATTERN (insn), 0)) == REG
+ && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
+ return true;
+
+ return false;
+}
+
/* Return true if the block has no effect and only forwards control flow to
its single destination. */
@@ -69,12 +93,12 @@ forwarder_block_p (bb)
return false;
for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
- if (INSN_P (insn) && active_insn_p (insn))
+ if (INSN_P (insn) && flow_active_insn_p (insn))
return false;
return (!INSN_P (insn)
|| (GET_CODE (insn) == JUMP_INSN && simplejump_p (insn))
- || !active_insn_p (insn));
+ || !flow_active_insn_p (insn));
}
/* Return nonzero if we can reach target from src by falling through. */
@@ -97,7 +121,7 @@ can_fallthru (src, target)
}
/* Mark the back edges in DFS traversal.
- Return non-zero if a loop (natural or otherwise) is present.
+ Return nonzero if a loop (natural or otherwise) is present.
Inspired by Depth_First_Search_PP described in:
Advanced Compiler Design and Implementation
@@ -370,7 +394,7 @@ flow_call_edges_add (blocks)
}
/* Find unreachable blocks. An unreachable block will have 0 in
- the reachable bit in block->flags. A non-zero value indicates the
+ the reachable bit in block->flags. A nonzero value indicates the
block is reachable. */
void
@@ -781,8 +805,8 @@ flow_reverse_top_sort_order_compute (rts_order)
}
/* Compute the depth first search order and store in the array
- DFS_ORDER if non-zero, marking the nodes visited in VISITED. If
- RC_ORDER is non-zero, return the reverse completion number for each
+ DFS_ORDER if nonzero, marking the nodes visited in VISITED. If
+ RC_ORDER is nonzero, return the reverse completion number for each
node. Returns the number of nodes visited. A depth first search
tries to get as far away from the starting point as quickly as
possible. */
@@ -1027,7 +1051,7 @@ flow_preorder_transversal_compute (pot_order)
/* Initialize the data structures used for depth-first search on the
reverse graph. If INITIALIZE_STACK is nonzero, the exit block is
added to the basic block stack. DATA is the current depth-first
- search context. If INITIALIZE_STACK is non-zero, there is an
+ search context. If INITIALIZE_STACK is nonzero, there is an
element on the stack. */
static void
@@ -1110,7 +1134,7 @@ int
dfs_enumerate_from (bb, reverse, predicate, rslt, rslt_max, data)
basic_block bb;
int reverse;
- bool (*predicate) (basic_block, void *);
+ bool (*predicate) PARAMS ((basic_block, void *));
basic_block *rslt;
int rslt_max;
void *data;
diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c
index 97552f9afd9..9ac758b2809 100644
--- a/gcc/cfgbuild.c
+++ b/gcc/cfgbuild.c
@@ -292,7 +292,7 @@ make_edges (label_value_list, min, max, update_p)
/* Heavy use of computed goto in machine-generated code can lead to
nearly fully-connected CFGs. In that case we spend a significant
amount of time searching the edge lists for duplicates. */
- if (forced_labels || label_value_list)
+ if (forced_labels || label_value_list || cfun->max_jumptable_ents > 100)
{
edge_cache = sbitmap_vector_alloc (last_basic_block, last_basic_block);
sbitmap_vector_zero (edge_cache, last_basic_block);
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 1d662cee9b2..594eb5cebd7 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -515,6 +515,15 @@ try_forward_edges (mode, b)
if (GET_CODE (insn) == NOTE)
break;
+
+ /* Do not clean up branches to just past the end of a loop
+ at this time; it can mess up the loop optimizer's
+ recognition of some patterns. */
+
+ insn = PREV_INSN (target->head);
+ if (insn && GET_CODE (insn) == NOTE
+ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
+ break;
}
counter++;
@@ -902,8 +911,9 @@ insns_match_p (mode, i1, i2)
equal, they were constructed identically. */
if (GET_CODE (i1) == CALL_INSN
- && !rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
- CALL_INSN_FUNCTION_USAGE (i2)))
+ && (!rtx_equal_p (CALL_INSN_FUNCTION_USAGE (i1),
+ CALL_INSN_FUNCTION_USAGE (i2))
+ || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2)))
return false;
#ifdef STACK_REGS
@@ -1308,11 +1318,9 @@ try_crossjump_to_edge (mode, e1, e2)
{
int nmatch;
basic_block src1 = e1->src, src2 = e2->src;
- basic_block redirect_to;
+ basic_block redirect_to, redirect_from, to_remove;
rtx newpos1, newpos2;
edge s;
- rtx last;
- rtx label;
/* Search backward through forwarder blocks. We don't need to worry
about multiple entry or chained forwarders, as they will be optimized
@@ -1440,28 +1448,14 @@ try_crossjump_to_edge (mode, e1, e2)
if (GET_CODE (newpos1) == NOTE)
newpos1 = NEXT_INSN (newpos1);
- last = src1->end;
-
- /* Emit the jump insn. */
- label = block_label (redirect_to);
- emit_jump_insn_after (gen_jump (label), src1->end);
- JUMP_LABEL (src1->end) = label;
- LABEL_NUSES (label)++;
-
- /* Delete the now unreachable instructions. */
- delete_insn_chain (newpos1, last);
- /* Make sure there is a barrier after the new jump. */
- last = next_nonnote_insn (src1->end);
- if (!last || GET_CODE (last) != BARRIER)
- emit_barrier_after (src1->end);
+ redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
+ to_remove = redirect_from->succ->dest;
- /* Update CFG. */
- while (src1->succ)
- remove_edge (src1->succ);
- make_single_succ_edge (src1, redirect_to, 0);
+ redirect_edge_and_branch_force (redirect_from->succ, redirect_to);
+ flow_delete_block (to_remove);
- update_forwarder_flag (src1);
+ update_forwarder_flag (redirect_from);
return true;
}
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index 70b7b17a7a1..49e192c6bf9 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -342,7 +342,7 @@ scope_to_insns_finalize ()
this_block = INSN_SCOPE (insn);
/* For sequences compute scope resulting from merging all scopes
- of instructions nested inside. */
+ of instructions nested inside. */
if (GET_CODE (PATTERN (insn)) == SEQUENCE)
{
int i;
@@ -740,7 +740,6 @@ duplicate_insn_chain (from, to)
be reordered later. */
for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
{
- rtx new;
switch (GET_CODE (insn))
{
case INSN:
@@ -752,7 +751,7 @@ duplicate_insn_chain (from, to)
if (GET_CODE (PATTERN (insn)) == ADDR_VEC
|| GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
break;
- new = emit_copy_of_insn_after (insn, get_last_insn ());
+ emit_copy_of_insn_after (insn, get_last_insn ());
break;
case CODE_LABEL:
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index 09a1fb24a1e..b77023fbaf6 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -90,7 +90,7 @@ flow_loops_cfg_dump (loops, file)
}
}
-/* Return non-zero if the nodes of LOOP are a subset of OUTER. */
+/* Return nonzero if the nodes of LOOP are a subset of OUTER. */
bool
flow_loop_nested_p (outer, loop)
@@ -331,11 +331,9 @@ flow_loop_nodes_find (header, loop)
basic_block *stack;
int sp;
int num_nodes = 1;
- int findex, lindex;
header->loop_father = loop;
header->loop_depth = loop->depth;
- findex = lindex = header->index;
if (loop->latch->loop_father != loop)
{
@@ -617,7 +615,7 @@ make_forwarder_block (bb, redirect_latch, redirect_nonlatch, except,
HEADER_BLOCK (dummy) = 0;
HEADER_BLOCK (bb) = 1;
- /* Redirect back edges we want to keep. */
+ /* Redirect back edges we want to keep. */
for (e = dummy->pred; e; e = next_e)
{
next_e = e->pred_next;
@@ -949,7 +947,7 @@ flow_loops_update (loops, flags)
return flow_loops_find (loops, flags);
}
-/* Return non-zero if basic block BB belongs to LOOP. */
+/* Return nonzero if basic block BB belongs to LOOP. */
bool
flow_bb_inside_loop_p (loop, bb)
const struct loop *loop;
@@ -964,7 +962,7 @@ flow_bb_inside_loop_p (loop, bb)
return loop == source_loop || flow_loop_nested_p (loop, source_loop);
}
-/* Return non-zero if edge E enters header of LOOP from outside of LOOP. */
+/* Return nonzero if edge E enters header of LOOP from outside of LOOP. */
bool
flow_loop_outside_edge_p (loop, e)
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 25a5c9f78b5..59e2ede5680 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -360,13 +360,15 @@ flow_delete_block_noexpunge (b)
and remove the associated NOTE_INSN_EH_REGION_BEG and
NOTE_INSN_EH_REGION_END notes. */
- /* Get rid of all NOTE_INSN_PREDICTIONs hanging before the block. */
+ /* Get rid of all NOTE_INSN_PREDICTIONs and NOTE_INSN_LOOP_CONTs
+ hanging before the block. */
for (insn = PREV_INSN (b->head); insn; insn = PREV_INSN (insn))
{
if (GET_CODE (insn) != NOTE)
break;
- if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION)
+ if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION
+ || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT)
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
}
@@ -1203,7 +1205,6 @@ split_edge (edge_in)
edge edge_in;
{
basic_block bb;
- edge edge_out;
rtx before;
/* Abnormal edges cannot be split. */
@@ -1269,7 +1270,7 @@ split_edge (edge_in)
edge_in->dest->global_live_at_start);
}
- edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
+ make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
/* For non-fallthry edges, we must adjust the predecessor's
jump instruction to target our new block. */
diff --git a/gcc/collect2.c b/gcc/collect2.c
index c9b8865e627..bbad85a9d75 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -236,9 +236,6 @@ char * temporary_firstobj;
/* Holds the return value of pexecute. */
int pexecute_pid;
-/* Defined in the automatically-generated underscore.c. */
-extern int prepends_underscore;
-
/* Structure to hold all the directories in which to search for files to
execute. */
@@ -303,7 +300,6 @@ static int is_in_list PARAMS ((const char *, struct id *));
#endif
static void write_aix_file PARAMS ((FILE *, struct id *));
static char *resolve_lib_name PARAMS ((const char *));
-static int ignore_library PARAMS ((const char *));
#endif
static char *extract_string PARAMS ((const char **));
@@ -515,8 +511,8 @@ dump_file (name)
if (*word == '.')
++word, putc ('.', stderr);
p = word;
- if (*p == '_' && prepends_underscore)
- ++p;
+ if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
+ p += strlen (USER_LABEL_PREFIX);
if (no_demangle)
result = 0;
@@ -1494,7 +1490,7 @@ main (argc, argv)
}
-/* Wait for a process to finish, and exit if a non-zero status is found. */
+/* Wait for a process to finish, and exit if a nonzero status is found. */
int
collect_wait (prog)
@@ -2687,6 +2683,41 @@ scan_libraries (prog_name)
#endif
+#ifdef COLLECT_EXPORT_LIST
+/* Array of standard AIX libraries which should not
+ be scanned for ctors/dtors. */
+static const char *const aix_std_libs[] = {
+ "/unix",
+ "/lib/libc.a",
+ "/lib/libm.a",
+ "/lib/libc_r.a",
+ "/lib/libm_r.a",
+ "/usr/lib/libc.a",
+ "/usr/lib/libm.a",
+ "/usr/lib/libc_r.a",
+ "/usr/lib/libm_r.a",
+ "/usr/lib/threads/libc.a",
+ "/usr/ccs/lib/libc.a",
+ "/usr/ccs/lib/libm.a",
+ "/usr/ccs/lib/libc_r.a",
+ "/usr/ccs/lib/libm_r.a",
+ NULL
+};
+
+/* This function checks the filename and returns 1
+ if this name matches the location of a standard AIX library. */
+static int ignore_library PARAMS ((const char *));
+static int
+ignore_library (name)
+ const char *name;
+{
+ const char *const *p = &aix_std_libs[0];
+ while (*p++ != NULL)
+ if (! strcmp (name, *p)) return 1;
+ return 0;
+}
+#endif /* COLLECT_EXPORT_LIST */
+
extern char *ldgetname ();
/* COFF version to scan the name list of the loaded program for
@@ -2906,38 +2937,6 @@ if (debug) fprintf (stderr, "found: %s\n", lib_buf);
fatal ("library lib%s not found", name);
return (NULL);
}
-
-/* Array of standard AIX libraries which should not
- be scanned for ctors/dtors. */
-static const char *const aix_std_libs[] = {
- "/unix",
- "/lib/libc.a",
- "/lib/libm.a",
- "/lib/libc_r.a",
- "/lib/libm_r.a",
- "/usr/lib/libc.a",
- "/usr/lib/libm.a",
- "/usr/lib/libc_r.a",
- "/usr/lib/libm_r.a",
- "/usr/lib/threads/libc.a",
- "/usr/ccs/lib/libc.a",
- "/usr/ccs/lib/libm.a",
- "/usr/ccs/lib/libc_r.a",
- "/usr/ccs/lib/libm_r.a",
- NULL
-};
-
-/* This function checks the filename and returns 1
- if this name matches the location of a standard AIX library. */
-static int
-ignore_library (name)
- const char *name;
-{
- const char *const *p = &aix_std_libs[0];
- while (*p++ != NULL)
- if (! strcmp (name, *p)) return 1;
- return 0;
-}
#endif /* COLLECT_EXPORT_LIST */
diff --git a/gcc/combine.c b/gcc/combine.c
index 4a2ae3c9743..9880faa0454 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -167,11 +167,6 @@ static int last_call_cuid;
static rtx subst_insn;
-/* This is an insn that belongs before subst_insn, but is not currently
- on the insn chain. */
-
-static rtx subst_prev_insn;
-
/* This is the lowest CUID that `subst' is currently dealing with.
get_last_value will not return a value if the register was set at or
after this CUID. If not for this mechanism, we could get confused if
@@ -199,7 +194,6 @@ static basic_block this_basic_block;
After combine, we'll need to re-do global life analysis with
those blocks as starting points. */
static sbitmap refresh_blocks;
-static int need_refresh;
/* The next group of arrays allows the recording of the last value assigned
to (hard or pseudo) register n. We use this information to see if a
@@ -221,7 +215,7 @@ static int need_refresh;
register was assigned
reg_last_set_table_tick records the value of label_tick when a
value using the register is assigned
- reg_last_set_invalid set to non-zero when it is not valid
+ reg_last_set_invalid set to nonzero when it is not valid
to use the value of this register in some
register's value
@@ -230,7 +224,7 @@ static int need_refresh;
and the register being validly contained in some other expression in the
table.
- Entry I in reg_last_set_value is valid if it is non-zero, and either
+ Entry I in reg_last_set_value is valid if it is nonzero, and either
reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick.
Register I may validly appear in any expression returned for the value
@@ -242,7 +236,7 @@ static int need_refresh;
not validly appear in an expression, the register is replaced by
something that won't match, (clobber (const_int 0)).
- reg_last_set_invalid[i] is set non-zero when register I is being assigned
+ reg_last_set_invalid[i] is set nonzero when register I is being assigned
to and reg_last_set_table_tick[i] == label_tick. */
/* Record last value assigned to (hard or pseudo) register n. */
@@ -259,7 +253,7 @@ static int *reg_last_set_label;
static int *reg_last_set_table_tick;
-/* Set non-zero if references to register n in expressions should not be
+/* Set nonzero if references to register n in expressions should not be
used. */
static char *reg_last_set_invalid;
@@ -497,7 +491,7 @@ do_SUBST_INT (into, newval)
/* Main entry point for combiner. F is the first insn of the function.
NREGS is the first unused pseudo-reg number.
- Return non-zero if the combiner has turned an indirect jump
+ Return nonzero if the combiner has turned an indirect jump
instruction into a direct jump. */
int
combine_instructions (f, nregs)
@@ -571,15 +565,10 @@ combine_instructions (f, nregs)
label_tick = 1;
- /* We need to initialize it here, because record_dead_and_set_regs may call
- get_last_value. */
- subst_prev_insn = NULL_RTX;
-
setup_incoming_promotions ();
refresh_blocks = sbitmap_alloc (last_basic_block);
sbitmap_zero (refresh_blocks);
- need_refresh = 0;
for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
{
@@ -1285,13 +1274,13 @@ sets_function_arg_p (pat)
case, we would be getting the wrong value of I2DEST into I3, so we
must reject the combination. This case occurs when I2 and I1 both
feed into I3, rather than when I1 feeds into I2, which feeds into I3.
- If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source
+ If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
of a SET must prevent combination from occurring.
Before doing the above check, we first try to expand a field assignment
into a set of logical operations.
- If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which
+ If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
we place a register that is both set and used within I3. If more than one
such register is detected, we fail.
@@ -1497,7 +1486,7 @@ cant_combine_insn_p (insn)
If we did the combination, return the insn at which combine should
resume scanning.
- Set NEW_DIRECT_JUMP_P to a non-zero value if try_combine creates a
+ Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
new direct jump instruction. */
static rtx
@@ -1752,11 +1741,10 @@ try_combine (i3, i2, i1, new_direct_jump_p)
never appear in the insn stream so giving it the same INSN_UID
as I2 will not cause a problem. */
- subst_prev_insn = i1
- = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
- BLOCK_FOR_INSN (i2), INSN_SCOPE (i2),
- XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
- NULL_RTX);
+ i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
+ BLOCK_FOR_INSN (i2), INSN_SCOPE (i2),
+ XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
+ NULL_RTX);
SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
@@ -2316,6 +2304,10 @@ try_combine (i3, i2, i1, new_direct_jump_p)
copy. This saves at least one insn, more if register allocation can
eliminate the copy.
+ We cannot do this if the destination of the first assignment is a
+ condition code register or cc0. We eliminate this case by making sure
+ the SET_DEST and SET_SRC have the same mode.
+
We cannot do this if the destination of the second assignment is
a register that we have already assumed is zero-extended. Similarly
for a SUBREG of such a register. */
@@ -2325,6 +2317,8 @@ try_combine (i3, i2, i1, new_direct_jump_p)
&& XVECLEN (newpat, 0) == 2
&& GET_CODE (XVECEXP (newpat, 0, 0)) == SET
&& GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
+ && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
+ == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
&& GET_CODE (XVECEXP (newpat, 0, 1)) == SET
&& rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
@@ -2823,7 +2817,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)
BARRIER following it since it may have initially been a
conditional jump. It may also be the last nonnote insn. */
- if (GET_CODE (newpat) == RETURN || any_uncondjump_p (i3))
+ if (returnjump_p (i3) || any_uncondjump_p (i3))
{
*new_direct_jump_p = 1;
@@ -2831,6 +2825,18 @@ try_combine (i3, i2, i1, new_direct_jump_p)
|| GET_CODE (temp) != BARRIER)
emit_barrier_after (i3);
}
+
+ if (undobuf.other_insn != NULL_RTX
+ && (returnjump_p (undobuf.other_insn)
+ || any_uncondjump_p (undobuf.other_insn)))
+ {
+ *new_direct_jump_p = 1;
+
+ if ((temp = next_nonnote_insn (undobuf.other_insn)) == NULL_RTX
+ || GET_CODE (temp) != BARRIER)
+ emit_barrier_after (undobuf.other_insn);
+ }
+
/* An NOOP jump does not need barrier, but it does need cleaning up
of CFG. */
if (GET_CODE (newpat) == SET
@@ -2842,10 +2848,6 @@ try_combine (i3, i2, i1, new_direct_jump_p)
combine_successes++;
undo_commit ();
- /* Clear this here, so that subsequent get_last_value calls are not
- affected. */
- subst_prev_insn = NULL_RTX;
-
if (added_links_insn
&& (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
&& INSN_CUID (added_links_insn) < INSN_CUID (i3))
@@ -2874,10 +2876,6 @@ undo_all ()
}
undobuf.undos = 0;
-
- /* Clear this here, so that subsequent get_last_value calls are not
- affected. */
- subst_prev_insn = NULL_RTX;
}
/* We've committed to accepting the changes we made. Move all
@@ -3089,7 +3087,7 @@ find_split_point (loc, insn)
case AND:
/* If we are AND'ing with a large constant that is only a single
bit and the result is only being used in a context where we
- need to know if it is zero or non-zero, replace it with a bit
+ need to know if it is zero or nonzero, replace it with a bit
extraction. This will avoid the large constant, which might
have taken more than one insn to make. If the constant were
not a valid argument to the AND but took only one insn to make,
@@ -3317,10 +3315,10 @@ find_split_point (loc, insn)
`n_occurrences' is incremented each time FROM is replaced.
- IN_DEST is non-zero if we are processing the SET_DEST of a SET.
+ IN_DEST is nonzero if we are processing the SET_DEST of a SET.
- UNIQUE_COPY is non-zero if each substitution must be unique. We do this
- by copying if `n_occurrences' is non-zero. */
+ UNIQUE_COPY is nonzero if each substitution must be unique. We do this
+ by copying if `n_occurrences' is nonzero. */
static rtx
subst (x, from, to, in_dest, unique_copy)
@@ -4993,7 +4991,8 @@ simplify_set (x)
simplify the expression for the object knowing that we only need the
low-order bits. */
- if (GET_MODE_CLASS (mode) == MODE_INT)
+ if (GET_MODE_CLASS (mode) == MODE_INT
+ && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
{
src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
SUBST (SET_SRC (x), src);
@@ -5002,11 +5001,9 @@ simplify_set (x)
/* If we are setting CC0 or if the source is a COMPARE, look for the use of
the comparison result and try to simplify it unless we already have used
undobuf.other_insn. */
- if ((GET_CODE (src) == COMPARE
-#ifdef HAVE_cc0
- || dest == cc0_rtx
-#endif
- )
+ if ((GET_MODE_CLASS (mode) == MODE_CC
+ || GET_CODE (src) == COMPARE
+ || CC0_P (dest))
&& (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
&& (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
&& GET_RTX_CLASS (GET_CODE (*cc_use)) == '<'
@@ -5014,15 +5011,44 @@ simplify_set (x)
{
enum rtx_code old_code = GET_CODE (*cc_use);
enum rtx_code new_code;
- rtx op0, op1;
+ rtx op0, op1, tmp;
int other_changed = 0;
enum machine_mode compare_mode = GET_MODE (dest);
+ enum machine_mode tmp_mode;
if (GET_CODE (src) == COMPARE)
op0 = XEXP (src, 0), op1 = XEXP (src, 1);
else
op0 = src, op1 = const0_rtx;
+ /* Check whether the comparison is known at compile time. */
+ if (GET_MODE (op0) != VOIDmode)
+ tmp_mode = GET_MODE (op0);
+ else if (GET_MODE (op1) != VOIDmode)
+ tmp_mode = GET_MODE (op1);
+ else
+ tmp_mode = compare_mode;
+ tmp = simplify_relational_operation (old_code, tmp_mode, op0, op1);
+ if (tmp != NULL_RTX)
+ {
+ rtx pat = PATTERN (other_insn);
+ undobuf.other_insn = other_insn;
+ SUBST (*cc_use, tmp);
+
+ /* Attempt to simplify CC user. */
+ if (GET_CODE (pat) == SET)
+ {
+ rtx new = simplify_rtx (SET_SRC (pat));
+ if (new != NULL_RTX)
+ SUBST (SET_SRC (pat), new);
+ }
+
+ /* Convert X into a no-op move. */
+ SUBST (SET_DEST (x), pc_rtx);
+ SUBST (SET_SRC (x), pc_rtx);
+ return x;
+ }
+
/* Simplify our comparison, if possible. */
new_code = simplify_comparison (old_code, &op0, &op1);
@@ -5188,7 +5214,7 @@ simplify_set (x)
if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (inner, inner_mode)
< ((unsigned HOST_WIDE_INT) 1
- << (GET_MODE_BITSIZE (inner_mode) - 1))))
+ << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
{
SUBST (SET_SRC (x), inner);
src = SET_SRC (x);
@@ -5933,15 +5959,15 @@ expand_field_assignment (x)
code that understands the USE is this routine. If it is not removed,
it will cause the resulting insn not to match.
- UNSIGNEDP is non-zero for an unsigned reference and zero for a
+ UNSIGNEDP is nonzero for an unsigned reference and zero for a
signed reference.
- IN_DEST is non-zero if this is a reference in the destination of a
- SET. This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If non-zero,
+ IN_DEST is nonzero if this is a reference in the destination of a
+ SET. This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If nonzero,
a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
be used.
- IN_COMPARE is non-zero if we are in a COMPARE. This means that a
+ IN_COMPARE is nonzero if we are in a COMPARE. This means that a
ZERO_EXTRACT should be built even for bits starting at bit 0.
MODE is the desired mode of the result (if IN_DEST == 0).
@@ -6083,6 +6109,11 @@ make_extraction (mode, inner, pos, pos_rtx, len,
final_word += (GET_MODE_SIZE (inner_mode)
- GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
+ /* Avoid creating invalid subregs, for example when
+ simplifying (x>>32)&255. */
+ if (final_word >= GET_MODE_SIZE (inner_mode))
+ return NULL_RTX;
+
new = gen_rtx_SUBREG (tmode, inner, final_word);
}
else
@@ -6424,7 +6455,7 @@ make_compound_operation (x, in_code)
: in_code == COMPARE ? SET : in_code);
/* Process depending on the code of this operation. If NEW is set
- non-zero, it will be returned. */
+ nonzero, it will be returned. */
switch (code)
{
@@ -6629,7 +6660,11 @@ make_compound_operation (x, in_code)
if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
|| (GET_MODE_SIZE (mode) >
GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
- tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
+ {
+ if (! INTEGRAL_MODE_P (mode))
+ break;
+ tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
+ }
else
tem = gen_lowpart_for_combine (mode, XEXP (tem, 0));
return tem;
@@ -6697,7 +6732,7 @@ get_pos_from_mask (m, plen)
Return a possibly simplified expression, but always convert X to
MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
- Also, if REG is non-zero and X is a register equal in value to REG,
+ Also, if REG is nonzero and X is a register equal in value to REG,
replace X with REG.
If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
@@ -6760,12 +6795,20 @@ force_to_mode (x, mode, mask, reg, just_select)
/* If none of the bits in X are needed, return a zero. */
if (! just_select && (nonzero & mask) == 0)
- return const0_rtx;
+ x = const0_rtx;
/* If X is a CONST_INT, return a new one. Do this here since the
test below will fail. */
if (GET_CODE (x) == CONST_INT)
- return gen_int_mode (INTVAL (x) & mask, mode);
+ {
+ if (SCALAR_INT_MODE_P (mode))
+ return gen_int_mode (INTVAL (x) & mask, mode);
+ else
+ {
+ x = GEN_INT (INTVAL (x) & mask);
+ return gen_lowpart_common (mode, x);
+ }
+ }
/* If X is narrower than MODE and we want all the bits in X's mode, just
get X in the proper mode. */
@@ -7307,7 +7350,7 @@ if_then_else_cond (x, ptrue, pfalse)
}
/* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
- operands is zero when the other is non-zero, and vice-versa,
+ operands is zero when the other is nonzero, and vice-versa,
and STORE_FLAG_VALUE is 1 or -1. */
if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
@@ -8011,7 +8054,7 @@ simplify_and_const_int (x, mode, varop, constop)
this. This macro avoids accidental uses of num_sign_bit_copies. */
#define num_sign_bit_copies()
-/* Given an expression, X, compute which bits in X can be non-zero.
+/* Given an expression, X, compute which bits in X can be nonzero.
We don't care about bits outside of those defined in MODE.
For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
@@ -8227,7 +8270,7 @@ nonzero_bits (x, mode)
case SIGN_EXTEND:
/* If the sign bit is known clear, this is the same as ZERO_EXTEND.
Otherwise, show all the bits in the outer mode but not the inner
- may be non-zero. */
+ may be nonzero. */
inner_nz = nonzero_bits (XEXP (x, 0), mode);
if (GET_MODE (XEXP (x, 0)) != VOIDmode)
{
@@ -8265,7 +8308,7 @@ nonzero_bits (x, mode)
case MOD: case UMOD:
/* We can apply the rules of arithmetic to compute the number of
high- and low-order zero bits of these operations. We start by
- computing the width (position of the highest-order non-zero bit)
+ computing the width (position of the highest-order nonzero bit)
and the number of low-order zero bits for each value. */
{
unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode);
@@ -8975,7 +9018,7 @@ merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p)
}
/* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
- The result of the shift is RESULT_MODE. X, if non-zero, is an expression
+ The result of the shift is RESULT_MODE. X, if nonzero, is an expression
that we started with.
The shift is normally computed in the widest mode we find in VAROP, as
@@ -9042,7 +9085,14 @@ simplify_shift_const (x, code, result_mode, varop, orig_count)
/* Convert ROTATERT to ROTATE. */
if (code == ROTATERT)
- code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count;
+ {
+ unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
+ code = ROTATE;
+ if (VECTOR_MODE_P (result_mode))
+ count = bitsize / GET_MODE_NUNITS (result_mode) - count;
+ else
+ count = bitsize - count;
+ }
/* We need to determine what mode we will do the shift in. If the
shift is a right shift or a ROTATE, we must always do it in the mode
@@ -10718,7 +10768,7 @@ simplify_comparison (code, pop0, pop1)
break;
case IOR:
- /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero
+ /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
iff X <= 0. */
if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
&& XEXP (XEXP (op0, 0), 1) == constm1_rtx
@@ -11519,7 +11569,7 @@ check_promoted_subreg (insn, x)
mentioned in *LOC are valid when *LOC was part of a value set when
label_tick == TICK. Return 0 if some are not.
- If REPLACE is non-zero, replace the invalid reference with
+ If REPLACE is nonzero, replace the invalid reference with
(clobber (const_int 0)) and return 1. This replacement is useful because
we often can get useful information about the form of a value (e.g., if
it was produced by a shift that always produces -1 or 0) even though
@@ -11732,7 +11782,7 @@ reg_dead_at_p_1 (dest, x, data)
reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
}
-/* Return non-zero if REG is known to be dead at INSN.
+/* Return nonzero if REG is known to be dead at INSN.
We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
referencing REG, it is dead. If we hit a SET referencing REG, it is
@@ -12406,7 +12456,7 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
case REG_DEAD:
/* If the register is used as an input in I3, it dies there.
- Similarly for I2, if it is non-zero and adjacent to I3.
+ Similarly for I2, if it is nonzero and adjacent to I3.
If the register is not used as an input in either I3 or I2
and it is not one of the registers we were supposed to eliminate,
@@ -12578,10 +12628,7 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
&& REGNO_REG_SET_P (bb->global_live_at_start,
REGNO (XEXP (note, 0))))
- {
- SET_BIT (refresh_blocks, this_basic_block->index);
- need_refresh = 1;
- }
+ SET_BIT (refresh_blocks, this_basic_block->index);
}
/* If the register is set or already dead at PLACE, we needn't do
@@ -12598,10 +12645,7 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
the note is a noop, we'll need do a global live update
after we remove them in delete_noop_moves. */
if (noop_move_p (place))
- {
- SET_BIT (refresh_blocks, this_basic_block->index);
- need_refresh = 1;
- }
+ SET_BIT (refresh_blocks, this_basic_block->index);
if (dead_or_set_p (place, XEXP (note, 0))
|| reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
@@ -12673,7 +12717,6 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
{
SET_BIT (refresh_blocks,
this_basic_block->index);
- need_refresh = 1;
break;
}
continue;
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 8432cf56d40..1202fd56782 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -75,12 +75,6 @@
# machine modes, if necessary and different from
# "$cpu_type/$cpu_type-modes.def".
#
-# float_format Set to the symbolic name for the floating-point
-# formats used for this machine, if different from
-# "i64". Used to derive a header file name to
-# include, like "vax" for "float-vax.h". If no such
-# file is wanted, set to "none".
-#
# extra_objs List of extra objects that should be linked into
# the compiler proper (cc1, cc1obj, cc1plus)
# depending on target.
@@ -194,7 +188,6 @@ c_target_objs=
cxx_target_objs=
tm_defines=
xm_defines=
-float_format=
# Set this to force installation and use of collect2.
use_collect2=
# Set this to override the default target model.
@@ -226,7 +219,6 @@ case $machine in
| mn10200-*-* \
| ns32k-*-openbsd* \
| romp-*-openbsd* \
- | vax-*-vms* \
)
if test "x$enable_obsolete" != xyes; then
echo "*** Configuration $machine is obsolete." >&2
@@ -371,6 +363,11 @@ case $machine in
xm_defines=POSIX
gas=yes
gnu_ld=yes
+ case x${enable_threads} in
+ xyes | xposix)
+ thread_file='posix'
+ ;;
+ esac
;;
*-*-freebsd[12] | *-*-freebsd[12].* | *-*-freebsd*aout*)
# This is the place-holder for the generic a.out configuration
@@ -542,7 +539,6 @@ alpha*-dec-osf[45]*)
*-*-osf5*)
tm_file="${tm_file} alpha/osf5.h"
target_cpu_default=MASK_SUPPORT_ARCH
- float_format=i128
;;
esac
;;
@@ -687,7 +683,6 @@ c4x-*-rtems*)
cxx_target_objs="c4x-c.o"
;;
c4x-*)
- float_format=c4x
tmake_file=c4x/t-c4x
c_target_objs="c4x-c.o"
cxx_target_objs="c4x-c.o"
@@ -708,7 +703,6 @@ cris-*-linux*)
;;
d30v-*)
tm_file="dbxelf.h elfos.h svr4.h ${tm_file}"
- float_format=i64
;;
dsp16xx-*)
;;
@@ -728,15 +722,12 @@ h8300-*-rtems*)
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
- float_format=i32
;;
h8300-*-elf*)
tmake_file="h8300/t-h8300 h8300/t-elf"
tm_file="h8300/h8300.h h8300/elf.h"
- float_format=i32
;;
h8300-*-*)
- float_format=i32
;;
hppa*64*-*-linux* | parisc*64*-*-linux*)
target_cpu_default="(MASK_PA_11 | MASK_PA_20)"
@@ -842,7 +833,6 @@ hppa1.0-*-hpux8*)
hppa1.1-*-hpux10* | hppa2*-*-hpux10*)
target_cpu_default="MASK_PA_11"
tm_file="${tm_file} pa/pa32-regs.h pa/long_double.h pa/som.h pa/pa-hpux.h pa/pa-hpux10.h"
- float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
xmake_file="pa/x-ada"
@@ -859,7 +849,6 @@ hppa1.1-*-hpux10* | hppa2*-*-hpux10*)
;;
hppa1.0-*-hpux10*)
tm_file="${tm_file} pa/pa32-regs.h pa/long_double.h pa/som.h pa/pa-hpux.h pa/pa-hpux10.h"
- float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
xmake_file="pa/x-ada"
@@ -877,11 +866,14 @@ hppa1.0-*-hpux10*)
hppa*64*-*-hpux11*)
xm_defines=POSIX
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 test x$gnu_ld = xyes
+ then
+ target_cpu_default="${target_cpu_default}|MASK_GNU_LD"
+ fi
# if [ x$enable_threads = x ]; then
# enable_threads=$have_pthread_h
# fi
@@ -895,7 +887,6 @@ hppa*64*-*-hpux11*)
hppa1.1-*-hpux11* | hppa2*-*-hpux11*)
target_cpu_default="MASK_PA_11"
tm_file="${tm_file} pa/pa32-regs.h pa/long_double.h pa/som.h pa/pa-hpux.h pa/pa-hpux11.h"
- float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
xmake_file="pa/x-ada"
@@ -911,7 +902,6 @@ hppa1.1-*-hpux11* | hppa2*-*-hpux11*)
;;
hppa1.0-*-hpux11*)
tm_file="${tm_file} pa/pa32-regs.h pa/long_double.h pa/som.h pa/pa-hpux.h pa/pa-hpux11.h"
- float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
xmake_file="pa/x-ada"
@@ -998,9 +988,9 @@ i[34567]86-*-darwin*)
target_gtfiles="\$(srcdir)/config/darwin.c"
c_target_objs="darwin-c.o"
cxx_target_objs="darwin-c.o"
+ extra_parts="crtbegin.o crtend.o"
# Darwin linker does collect2 functionality
use_collect2=no
- float_format=i386
;;
i[34567]86-*-elf*)
xm_defines=POSIX
@@ -1062,7 +1052,6 @@ x86_64-*-freebsd*)
;;
i[34567]86-*-netbsdelf*)
tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/netbsd-elf.h"
- float_format=i386
;;
i[34567]86-*-netbsd*)
tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/gstabs.h netbsd.h netbsd-aout.h i386/netbsd.h"
@@ -1071,7 +1060,6 @@ i[34567]86-*-netbsd*)
;;
x86_64-*-netbsd*)
tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h netbsd.h netbsd-elf.h i386/x86-64.h i386/netbsd64.h"
- float_format=i386
;;
i[34567]86-*-openbsd*)
tm_file="${cpu_type}/${cpu_type}.h i386/unix.h i386/bsd.h i386/gas.h i386/gstabs.h openbsd-oldgas.h openbsd.h ${tm_file}"
@@ -1092,7 +1080,6 @@ i[34567]86-*-linux*aout*) # Intel 80386's running GNU/Linux
tmake_file="t-linux-aout i386/t-crtstuff"
tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h i386/gstabs.h linux-aout.h i386/linux-aout.h"
gnu_ld=yes
- float_format=i386
;;
i[34567]86-*-linux*libc1) # Intel 80386's running GNU/Linux
# with ELF format using the
@@ -1101,7 +1088,6 @@ i[34567]86-*-linux*libc1) # Intel 80386's running GNU/Linux
tmake_file="t-slibgcc-elf-ver t-linux t-linux-gnulibc1 i386/t-crtstuff"
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
gnu_ld=yes
- float_format=i386
if test x$enable_threads = xyes; then
thread_file='single'
fi
@@ -1111,16 +1097,13 @@ i[34567]86-*-linux*) # Intel 80386's running GNU/Linux
# aka GNU/Linux C library 6
tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h"
tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff"
- float_format=i386
;;
x86_64-*-linux*)
tm_file="${tm_file} i386/unix.h 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 i386/t-linux64"
- float_format=i386
;;
i[34567]86-*-gnu*)
- float_format=i386
;;
i[34567]86-go32-msdos | i[34567]86-*-go32*)
echo "GO32/DJGPP V1.X is no longer supported. Use *-pc-msdosdjgpp for DJGPP V2.X instead."
@@ -1133,7 +1116,6 @@ i[34567]86-pc-msdosdjgpp*)
gnu_ld=yes
gas=yes
exeext=.exe
- float_format=none
case $host in *pc-msdosdjgpp*)
target_alias=djgpp
;;
@@ -1267,7 +1249,6 @@ i386-*-vsta) # Intel 80386's running VSTa kernel
i[34567]86-*-win32)
xm_defines=POSIX
xm_file=i386/xm-cygwin.h
- float_format=i386
tmake_file=i386/t-cygwin
tm_file="${tm_file} i386/win32.h"
extra_objs=winnt.o
@@ -1279,7 +1260,6 @@ i[34567]86-*-win32)
i[34567]86-*-pe | i[34567]86-*-cygwin*)
xm_defines=POSIX
xm_file=i386/xm-cygwin.h
- float_format=i386
tmake_file=i386/t-cygwin
tm_file=i386/cygwin.h
extra_objs=winnt.o
@@ -1290,7 +1270,6 @@ i[34567]86-*-pe | i[34567]86-*-cygwin*)
;;
i[34567]86-*-mingw32*)
tm_file=i386/mingw32.h
- float_format=i386
xm_defines=POSIX
xm_file=i386/xm-mingw32.h
tmake_file="i386/t-cygwin i386/t-mingw32"
@@ -1393,6 +1372,7 @@ ia64*-*-aix*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h ia64/sysv4.h ia64/aix.h"
tmake_file="ia64/t-ia64 ia64/t-aix"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
+ extra_parts="crti.o crtn.o crtbegin.o crtend.o crtbeginS.o crtendS.o"
;;
ia64*-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h ia64/sysv4.h ia64/elf.h"
@@ -1406,19 +1386,22 @@ ia64*-*-elf*)
then
target_cpu_default="${target_cpu_default}|MASK_GNU_LD"
fi
- float_format=i386
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
;;
ia64*-*-freebsd*)
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
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
;;
ia64*-*-linux*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h ia64/sysv4.h ia64/linux.h"
tmake_file="t-slibgcc-elf-ver t-linux ia64/t-ia64 ia64/t-glibc"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
- float_format=i386
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
+ if test x"$use_libunwind_exceptions" = xyes; then
+ tmake_file="$tmake_file t-libunwind"
+ fi
;;
ia64*-*-hpux*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h ia64/sysv4.h ia64/hpux.h ia64/hpux_longdouble.h"
@@ -1428,7 +1411,8 @@ ia64*-*-hpux*)
thread_file='posix'
fi
use_collect2=no
- float_format=i128
+ c_target_objs="ia64-c.o"
+ cxx_target_objs="ia64-c.o"
;;
ip2k-*-elf)
;;
@@ -1490,7 +1474,6 @@ m68k-atari-sysv4*) # Atari variant of V.4.
xm_defines=POSIX
tmake_file=t-svr4
extra_parts="crtbegin.o crtend.o"
- float_format=m68k
;;
m68k-apollo-sysv* | m68k-bull-sysv*)
# can otherwise be caught by m68k-*-sysv4*
@@ -1520,7 +1503,6 @@ m68k-motorola-sysv*)
fi
gdb_needs_out_file_path=yes
extra_parts="crt0.o mcrt0.o"
- float_format=m68k
;;
m68k-ncr-sysv*) # NCR Tower 32 SVR3
tm_file=m68k/tower-as.h
@@ -1546,22 +1528,18 @@ m68k-cbm-sysv4*) # Commodore variant of V.4.
xm_defines=POSIX
tmake_file=t-svr4
extra_parts="crtbegin.o crtend.o"
- float_format=m68k
;;
m68k-ccur-rtu)
tm_file=m68k/ccur-GAS.h
use_collect2=yes
- float_format=m68k
;;
m68k-hp-bsd4.4*) # HP 9000/3xx running 4.4bsd
tm_file=m68k/hp3bsd44.h
use_collect2=yes
- float_format=m68k
;;
m68k-hp-bsd*) # HP 9000/3xx running Berkeley Unix
tm_file=m68k/hp3bsd.h
use_collect2=yes
- float_format=m68k
;;
m68k-hp-hpux7*) # HP 9000 series 300 running HPUX version 7.
xm_defines=POSIX
@@ -1575,7 +1553,6 @@ m68k-hp-hpux7*) # HP 9000 series 300 running HPUX version 7.
fi
install_headers_dir=install-headers-cpio
use_collect2=yes
- float_format=m68k
;;
m68k-hp-hpux*) # HP 9000 series 300
xm_defines=POSIX
@@ -1589,12 +1566,10 @@ m68k-hp-hpux*) # HP 9000 series 300
fi
install_headers_dir=install-headers-cpio
use_collect2=yes
- float_format=m68k
;;
m68k-sun-mach*)
tm_file=m68k/sun3mach.h
use_collect2=yes
- float_format=m68k
;;
m68k-sun-sunos3*)
if test x$with_fp = xno
@@ -1602,7 +1577,6 @@ m68k-sun-sunos3*)
tm_file=m68k/sun3n3.h
else
tm_file=m68k/sun3o3.h
- float_format=m68k
fi
use_collect2=yes
;;
@@ -1612,7 +1586,6 @@ m68k-sun-sunos*) # For SunOS 4 (the default).
tm_file=m68k/sun3n.h
else
tm_file=m68k/sun3.h
- float_format=m68k
fi
use_collect2=yes
;;
@@ -1620,17 +1593,14 @@ m68k-wrs-vxworks*)
tm_file=m68k/vxm68k.h
tmake_file=m68k/t-vxworks68
thread_file='vxworks'
- float_format=m68k
;;
m68k-*-aout*)
tmake_file=m68k/t-m68kbare
tm_file="m68k/m68k-aout.h libgloss.h"
- float_format=m68k
;;
m68k-*-coff*)
tmake_file=m68k/t-m68kbare
tm_file="m68k/m68k-coff.h dbx.h"
- float_format=m68k
;;
m68020-*-elf* | m68k-*-elf*)
tm_file="m68k/m68k-none.h m68k/m68kelf.h dbxelf.h elfos.h m68k/m68kemb.h m68k/m68020-elf.h"
@@ -1648,18 +1618,15 @@ m68010-*-netbsdelf* | m68k*-*-netbsdelf*)
target_cpu_default="MASK_68020|MASK_68881|MASK_BITFIELD"
;;
esac
- float_format=m68k
;;
m68k*-*-netbsd*)
tm_file=m68k/netbsd.h
tmake_file=t-netbsd
- float_format=m68k
use_collect2=yes
;;
m68k*-*-openbsd*)
# needed to unconfuse gdb
tmake_file="t-libc-ok t-openbsd m68k/t-openbsd"
- float_format=m68k
# we need collect2 until our bug is fixed...
use_collect2=yes
;;
@@ -1668,13 +1635,11 @@ m68k-*-sysv4*) # Motorola m68k's running system V.4
xm_defines=POSIX
tmake_file=t-svr4
extra_parts="crtbegin.o crtend.o"
- float_format=m68k
;;
m68k-*-linux*aout*) # Motorola m68k's running GNU/Linux
# with a.out format
tm_file=m68k/linux-aout.h
tmake_file="t-linux-aout m68k/t-linux-aout"
- float_format=m68k
gnu_ld=yes
;;
m68k-*-linux*libc1) # Motorola m68k's running GNU/Linux
@@ -1683,7 +1648,6 @@ m68k-*-linux*libc1) # Motorola m68k's running GNU/Linux
tm_file=m68k/linux.h
tmake_file="t-slibgcc-elf-ver t-linux t-linux-gnulibc1 m68k/t-linux"
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
- float_format=m68k
gnu_ld=yes
;;
m68k-*-linux*) # Motorola m68k's running GNU/Linux
@@ -1692,13 +1656,11 @@ m68k-*-linux*) # Motorola m68k's running GNU/Linux
tm_file=m68k/linux.h
tmake_file="t-slibgcc-elf-ver t-linux m68k/t-linux"
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
- float_format=m68k
gnu_ld=yes
;;
m68k-*-psos*)
tmake_file=m68k/t-m68kbare
tm_file=m68k/m68k-psos.h
- float_format=m68k
;;
m68k-*-rtemscoff*) # would otherwise be caught by m68k-*-rtems*
echo "*** Configuration $machine not supported" 1>&2
@@ -1708,7 +1670,6 @@ m68k-*-rtems*)
xm_defines=POSIX
tmake_file="m68k/t-m68kbare t-rtems m68k/t-crtstuff"
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
thread_file='rtems'
@@ -1838,6 +1799,7 @@ mips-sgi-*) # would otherwise be caught by mips-*-elf*
exit 1
;;
mips*-*-netbsd*) # NetBSD/mips, either endian.
+ target_cpu_default="MASK_GAS|MASK_ABICALLS"
tm_file="elfos.h ${tm_file} mips/netbsd.h"
tmake_file="${tmake_file} mips/t-netbsd"
;;
@@ -1935,7 +1897,6 @@ mipstx39-*-elf* | mipstx39el-*-elf*)
mmix-knuth-mmixware)
;;
mn10200-*-*)
- float_format=i32
tm_file="dbxelf.h elfos.h svr4.h ${tm_file}"
if test x$stabs = xyes
then
@@ -2001,6 +1962,7 @@ powerpc-*-darwin*)
target_gtfiles="\$(srcdir)/config/darwin.c"
c_target_objs="darwin-c.o"
cxx_target_objs="darwin-c.o"
+ extra_parts="crtbegin.o crtend.o"
# Darwin linker does collect2 functionality
use_collect2=no
extra_headers=altivec.h
@@ -2148,14 +2110,12 @@ powerpcle-*-eabi*)
rs6000-ibm-aix3.[01]*)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/aix31.h rs6000/xcoff.h"
- float_format=none
use_collect2=yes
;;
rs6000-ibm-aix3.2.[456789]* | powerpc-ibm-aix3.2.[456789]*)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/aix3newas.h rs6000/xcoff.h"
tmake_file=rs6000/t-newas
- float_format=none
use_collect2=yes
extra_headers=
;;
@@ -2163,7 +2123,6 @@ rs6000-ibm-aix4.[12]* | powerpc-ibm-aix4.[12]*)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/aix41.h rs6000/xcoff.h"
tmake_file=rs6000/t-newas
- float_format=none
use_collect2=yes
extra_headers=
;;
@@ -2171,16 +2130,22 @@ rs6000-ibm-aix4.[3456789]* | powerpc-ibm-aix4.[3456789]*)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/aix43.h rs6000/xcoff.h"
tmake_file=rs6000/t-aix43
- float_format=none
use_collect2=yes
thread_file='aix'
extra_headers=
;;
-rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
+rs6000-ibm-aix5.1.* | powerpc-ibm-aix5.1.*)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/aix51.h rs6000/xcoff.h"
tmake_file=rs6000/t-aix43
- float_format=none
+ use_collect2=yes
+ thread_file='aix'
+ extra_headers=
+ ;;
+rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
+ xm_defines=POSIX
+ tm_file="${tm_file} rs6000/aix.h rs6000/aix52.h rs6000/xcoff.h"
+ tmake_file=rs6000/t-aix52
use_collect2=yes
thread_file='aix'
extra_headers=
@@ -2188,13 +2153,11 @@ rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
rs6000-ibm-aix*)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/xcoff.h"
- float_format=none
use_collect2=yes
;;
rs6000-bull-bosx)
xm_defines=POSIX
tm_file="${tm_file} rs6000/aix.h rs6000/xcoff.h"
- float_format=none
use_collect2=yes
;;
rs6000-*-mach*)
@@ -2228,7 +2191,6 @@ sh-*-elf* | sh[2346l]*-*-elf*)
;;
esac
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/embed-elf.h"
- float_format=sh
case $machine in
sh64*)
tmake_file="${tmake_file} sh/t-sh64"
@@ -2249,7 +2211,6 @@ sh-*-rtemself*)
xm_defines=POSIX
tmake_file="sh/t-sh sh/t-elf t-rtems"
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/embed-elf.h sh/rtemself.h rtems.h"
- float_format=sh
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@@ -2258,7 +2219,6 @@ sh-*-rtems*)
xm_defines=POSIX
tmake_file="sh/t-sh t-rtems"
tm_file="${tm_file} sh/coff.h sh/rtems.h rtems.h"
- float_format=sh
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@@ -2274,7 +2234,6 @@ sh-*-linux* | sh[2346lbe]*-*-linux*)
esac
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h"
gas=yes gnu_ld=yes
- float_format=sh
case $machine in
sh64*)
tmake_file="${tmake_file} sh/t-sh64"
@@ -2323,11 +2282,9 @@ sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
tmake_file="${tmake_file} sh/t-netbsd"
;;
esac
- float_format=sh
;;
sh-*-*)
tm_file="${tm_file} sh/coff.h"
- float_format=sh
;;
sparc-tti-*)
tm_file="${tm_file} sparc/pbd.h"
@@ -2368,7 +2325,6 @@ sparc64-*-openbsd*)
xm_file=sparc/xm-sp64.h
gas=yes gnu_ld=yes
with_cpu=ultrasparc
- float_format=i128
;;
sparc-*-bsd*)
tm_file="${tm_file} sparc/bsd.h"
@@ -2377,7 +2333,6 @@ sparc-*-chorusos*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/elf.h chorus.h"
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
xyes | xpthreads | xposix)
thread_file='posix'
@@ -2388,24 +2343,20 @@ sparc-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/elf.h"
tmake_file="sparc/t-elf sparc/t-crtfm"
extra_parts="crti.o crtn.o crtbegin.o crtend.o"
- #float_format=i128
- float_format=i64
;;
-sparc-*-linux*aout*) # Sparc's running GNU/Linux, a.out
+sparc-*-linux*aout*) # SPARC's running GNU/Linux, a.out
tm_file="aoutos.h sparc/sparc.h sparc/aout.h sparc/linux-aout.h"
gnu_ld=yes
;;
-sparc-*-linux*libc1*) # Sparc's running GNU/Linux, libc5
+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 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
+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 sparc/t-crtfm"
- float_format=sparc
;;
sparc-*-lynxos*)
if test x$gas = xyes
@@ -2425,8 +2376,6 @@ sparc-*-rtems*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/elf.h sparc/rtemself.h rtems.h"
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
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@@ -2447,7 +2396,6 @@ sparc64-*-solaris2* | sparcv9-*-solaris2*)
tmake_file="$tmake_file t-slibgcc-sld"
fi
extra_parts="crt1.o crti.o crtn.o gcrt1.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
@@ -2473,7 +2421,6 @@ sparc-hal-solaris2*)
tmake_file="$tmake_file t-slibgcc-sld"
fi
extra_parts="crt1.o crti.o crtn.o gmon.o crtbegin.o crtend.o"
- float_format=i128
thread_file='solaris'
;;
sparc-*-solaris2*)
@@ -2506,7 +2453,6 @@ sparc-*-solaris2*)
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
@@ -2592,16 +2538,14 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd*)
*) echo "$with_cpu not supported for freebsd target"; exit 1 ;;
esac
;;
-sparc64-*-linux*) # 64-bit Sparc's running GNU/Linux
+sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux
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"
- 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"
@@ -2643,6 +2587,21 @@ v850-*-rtems*)
c_target_objs="v850-c.o"
cxx_target_objs="v850-c.o"
;;
+v850e-*-*)
+ target_cpu_default="TARGET_CPU_v850e"
+ tm_file="dbxelf.h elfos.h svr4.h v850/v850.h"
+ tm_p_file=v850/v850-protos.h
+ tmake_file=v850/t-v850
+ md_file=v850/v850.md
+ out_file=v850/v850.c
+ if test x$stabs = xyes
+ then
+ tm_file="${tm_file} dbx.h"
+ fi
+ use_collect2=no
+ c_target_objs="v850-c.o"
+ cxx_target_objs="v850-c.o"
+ ;;
v850-*-*)
target_cpu_default="TARGET_CPU_generic"
tm_file="dbxelf.h elfos.h svr4.h ${tm_file}"
@@ -2658,38 +2617,32 @@ v850-*-*)
vax-*-bsd*) # VAXen running BSD
tm_file="${tm_file} vax/bsd.h"
use_collect2=yes
- float_format=vax
;;
vax-*-sysv*) # VAXen running system V
tm_file="${tm_file} vax/vaxv.h"
xm_defines=POSIX
- float_format=vax
;;
vax-*-netbsdelf*)
- echo "GCC does not yet support the ${machine} target"; exit 1
+ tm_file="${tm_file} elfos.h netbsd.h netbsd-elf.h vax/elf.h vax/netbsd-elf.h"
+ float_format=vax
;;
vax-*-netbsd*)
tm_file="${tm_file} netbsd.h netbsd-aout.h vax/netbsd.h"
tmake_file=t-netbsd
- float_format=vax
use_collect2=yes
;;
vax-*-openbsd*)
tm_file="vax/vax.h vax/openbsd1.h openbsd.h ${tm_file}"
- float_format=vax
use_collect2=yes
;;
vax-*-ultrix*) # VAXen running ultrix
tm_file="${tm_file} vax/ultrix.h"
- float_format=vax
;;
vax-*-vms*) # VAXen running VMS
- xm_file=vax/xm-vms.h
- tm_file=vax/vms.h
- float_format=vax
+ echo "Configuration $machine no longer supported" 1>&2
+ exit 1
;;
vax-*-*) # VAX default entry
- float_format=vax
;;
xscale-*-elf)
tm_file="arm/xscale-elf.h dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h"
@@ -2756,7 +2709,7 @@ i586-*-*)
k6-*)
target_cpu_default2=TARGET_CPU_DEFAULT_k6
;;
- pentium_mmx-*)
+ pentium_mmx-*|winchip_c6-*|winchip2-*|c3-*)
target_cpu_default2=TARGET_CPU_DEFAULT_pentium_mmx
;;
*)
@@ -2889,6 +2842,11 @@ mips*-*-*)
tm_defines="TARGET_ENDIAN_DEFAULT=0 $tm_defines"
;;
esac
+ case $tm_file in
+ *mips/elf.h* | *mips/elf64.h*)
+ tm_defines="OBJECT_FORMAT_ELF $tm_defines"
+ ;;
+ esac
if test "x$enable_gofast" = xyes
then
tm_defines="INIT_SUBTARGET_OPTABS=INIT_GOFAST_OPTABS $tm_defines"
@@ -2952,6 +2910,22 @@ sparc*-*-*)
;;
esac
;;
+v850*-*-*)
+ case "x$with_cpu" in
+ x)
+ ;;
+ xv850e)
+ target_cpu_default2="TARGET_CPU_$with_cpu"
+ ;;
+ *)
+ if test x$pass2done = xyes
+ then
+ echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2
+ exit 1
+ fi
+ ;;
+ esac
+ ;;
esac
if test "$target_cpu_default2" != ""
diff --git a/gcc/config/alpha/alpha-protos.h b/gcc/config/alpha/alpha-protos.h
index e52e4f461bc..71079eff7e8 100644
--- a/gcc/config/alpha/alpha-protos.h
+++ b/gcc/config/alpha/alpha-protos.h
@@ -141,8 +141,6 @@ extern rtx function_arg PARAMS ((CUMULATIVE_ARGS, enum machine_mode,
tree, int));
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));
#ifdef REAL_VALUE_TYPE
extern int check_float_value PARAMS ((enum machine_mode,
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 800476d4e8f..ed1c834fd70 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -88,7 +88,7 @@ const char *alpha_tls_size_string; /* -mtls-size=[16|32|64] */
struct alpha_compare alpha_compare;
-/* Non-zero if inside of a function, because the Alpha asm can't
+/* Nonzero if inside of a function, because the Alpha asm can't
handle .files inside of functions. */
static int inside_function = FALSE;
@@ -118,6 +118,8 @@ int alpha_this_literal_sequence_number;
int alpha_this_gpdisp_sequence_number;
/* Declarations of static functions. */
+static bool alpha_function_ok_for_sibcall
+ PARAMS ((tree, tree));
static int tls_symbolic_operand_1
PARAMS ((rtx, enum machine_mode, int, int));
static enum tls_model tls_symbolic_operand_type
@@ -195,6 +197,11 @@ static void alpha_write_linkage
PARAMS ((FILE *, const char *, tree));
#endif
+#if TARGET_ABI_OSF
+static void alpha_output_mi_thunk_osf
+ PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
+#endif
+
static struct machine_function * alpha_init_machine_status
PARAMS ((void));
@@ -292,6 +299,14 @@ static void unicosmk_unique_section PARAMS ((tree, int));
#undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN alpha_expand_builtin
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL alpha_function_ok_for_sibcall
+
+#if TARGET_ABI_OSF
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK alpha_output_mi_thunk_osf
+#endif
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Parse target option strings. */
@@ -567,6 +582,14 @@ override_options ()
/* Set up function hooks. */
init_machine_status = alpha_init_machine_status;
+
+ /* Tell the compiler when we're using VAX floating point. */
+ if (TARGET_FLOAT_VAX)
+ {
+ real_format_for_mode[SFmode - QFmode] = &vax_f_format;
+ real_format_for_mode[DFmode - QFmode] = &vax_g_format;
+ real_format_for_mode[TFmode - QFmode] = NULL;
+ }
}
/* Returns 1 if VALUE is a mask that contains full bytes of zero or ones. */
@@ -1872,22 +1895,7 @@ alpha_encode_section_info (decl, first)
/* Care for TLS variables. */
if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
{
- enum tls_model kind;
- if (!flag_pic)
- {
- if (is_local)
- kind = TLS_MODEL_LOCAL_EXEC;
- else
- kind = TLS_MODEL_INITIAL_EXEC;
- }
- else if (is_local)
- kind = TLS_MODEL_LOCAL_DYNAMIC;
- else
- kind = TLS_MODEL_GLOBAL_DYNAMIC;
- if (kind < flag_tls_default)
- kind = flag_tls_default;
-
- switch (kind)
+ switch (decl_tls_model (decl))
{
case TLS_MODEL_GLOBAL_DYNAMIC:
encoding = 'G';
@@ -2269,6 +2277,19 @@ alpha_legitimize_address (x, scratch, mode)
}
}
+/* We do not allow indirect calls to be optimized into sibling calls, nor
+ can we allow a call to a function in a different compilation unit to
+ be optimized into a sibcall. */
+static bool
+alpha_function_ok_for_sibcall (decl, exp)
+ tree decl;
+ tree exp ATTRIBUTE_UNUSED;
+{
+ return (decl
+ && (! TREE_PUBLIC (decl)
+ || (TREE_ASM_WRITTEN (decl) && (*targetm.binds_local_p) (decl))));
+}
+
/* For TARGET_EXPLICIT_RELOCS, we don't obfuscate a SYMBOL_REF to a
small symbolic operand until after reload. At which point we need
to replace (mem (symbol_ref)) with (mem (lo_sum $29 symbol_ref))
@@ -3478,7 +3499,7 @@ alpha_emit_setcc (code)
/* Rewrite a comparison against zero CMP of the form
(CODE (cc0) (const_int 0)) so it can be written validly in
a conditional move (if_then_else CMP ...).
- If both of the operands that set cc0 are non-zero we must emit
+ If both of the operands that set cc0 are nonzero we must emit
an insn to perform the compare (it can't be done within
the conditional move). */
rtx
@@ -3510,7 +3531,7 @@ alpha_emit_conditional_move (cmp, mode)
/* If we have fp<->int register move instructions, do a cmov by
performing the comparison in fp registers, and move the
- zero/non-zero value to integer registers, where we can then
+ zero/nonzero value to integer registers, where we can then
use a normal cmov, or vice-versa. */
switch (code)
@@ -4042,7 +4063,7 @@ alpha_split_tfmode_frobsign (operands, operation)
alpha_split_tfmode_pair (operands);
- /* Detect three flavours of operand overlap. */
+ /* Detect three flavors of operand overlap. */
move = 1;
if (rtx_equal_p (operands[0], operands[2]))
move = 0;
@@ -6047,7 +6068,7 @@ alpha_initialize_trampoline (tramp, fnaddr, cxt, fnofs, cxtofs, jmpofs)
#ifdef TRANSFER_FROM_TRAMPOLINE
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
- 0, VOIDmode, 1, addr, Pmode);
+ 0, VOIDmode, 1, tramp, Pmode);
#endif
if (jmpofs >= 0)
@@ -6707,10 +6728,11 @@ alpha_sa_mask (imaskP, fmaskP)
unsigned int i;
/* Irritatingly, there are two kinds of thunks -- those created with
- ASM_OUTPUT_MI_THUNK and those with DECL_THUNK_P that go through
- the regular part of the compiler. In the ASM_OUTPUT_MI_THUNK case
- we don't have valid register life info, but assemble_start_function
- wants to output .frame and .mask directives. */
+ TARGET_ASM_OUTPUT_MI_THUNK and those with DECL_THUNK_P that go
+ through the regular part of the compiler. In the
+ TARGET_ASM_OUTPUT_MI_THUNK case we don't have valid register life
+ info, but assemble_start_function wants to output .frame and
+ .mask directives. */
if (current_function_is_thunk && !no_new_pseudos)
{
*imaskP = 0;
@@ -7845,7 +7867,8 @@ alpha_end_function (file, fnname, decl)
}
}
-/* Emit a tail call to FUNCTION after adjusting THIS by DELTA.
+#if TARGET_ABI_OSF
+/* Emit a tail call to FUNCTION after adjusting THIS by DELTA.
In order to avoid the hordes of differences between generated code
with and without TARGET_EXPLICIT_RELOCS, and to avoid duplicating
@@ -7854,7 +7877,7 @@ alpha_end_function (file, fnname, decl)
Not sure why this idea hasn't been explored before... */
-void
+static void
alpha_output_mi_thunk_osf (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl ATTRIBUTE_UNUSED;
@@ -7914,6 +7937,7 @@ alpha_output_mi_thunk_osf (file, thunk_fndecl, delta, function)
final (insn, file, 1, 0);
final_end_function ();
}
+#endif /* TARGET_ABI_OSF */
/* Debugging support. */
@@ -8376,6 +8400,7 @@ alphaev4_insn_pipe (insn)
case TYPE_MISC:
case TYPE_IBR:
case TYPE_JSR:
+ case TYPE_CALLPAL:
case TYPE_FCPYS:
case TYPE_FCMOV:
case TYPE_FADD:
@@ -8418,6 +8443,7 @@ alphaev5_insn_pipe (insn)
case TYPE_IBR:
case TYPE_JSR:
+ case TYPE_CALLPAL:
return EV5_E1;
case TYPE_FCPYS:
@@ -8878,83 +8904,6 @@ alpha_reorg (insns)
}
}
-/* Check a floating-point value for validity for a particular machine mode. */
-
-static const char * const float_strings[] =
-{
- /* These are for FLOAT_VAX. */
- "1.70141173319264430e+38", /* 2^127 (2^24 - 1) / 2^24 */
- "-1.70141173319264430e+38",
- "2.93873587705571877e-39", /* 2^-128 */
- "-2.93873587705571877e-39",
- /* These are for the default broken IEEE mode, which traps
- on infinity or denormal numbers. */
- "3.402823466385288598117e+38", /* 2^128 (1 - 2^-24) */
- "-3.402823466385288598117e+38",
- "1.1754943508222875079687e-38", /* 2^-126 */
- "-1.1754943508222875079687e-38",
-};
-
-static REAL_VALUE_TYPE float_values[8];
-static int inited_float_values = 0;
-
-int
-check_float_value (mode, d, overflow)
- enum machine_mode mode;
- REAL_VALUE_TYPE *d;
- int overflow ATTRIBUTE_UNUSED;
-{
-
- if (TARGET_IEEE || TARGET_IEEE_CONFORMANT || TARGET_IEEE_WITH_INEXACT)
- return 0;
-
- if (inited_float_values == 0)
- {
- int i;
- for (i = 0; i < 8; i++)
- float_values[i] = REAL_VALUE_ATOF (float_strings[i], DFmode);
-
- inited_float_values = 1;
- }
-
- if (mode == SFmode)
- {
- REAL_VALUE_TYPE r;
- REAL_VALUE_TYPE *fvptr;
-
- if (TARGET_FLOAT_VAX)
- fvptr = &float_values[0];
- else
- fvptr = &float_values[4];
-
- memcpy (&r, d, sizeof (REAL_VALUE_TYPE));
- if (REAL_VALUES_LESS (fvptr[0], r))
- {
- memcpy (d, &fvptr[0], sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- else if (REAL_VALUES_LESS (r, fvptr[1]))
- {
- memcpy (d, &fvptr[1], sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- else if (REAL_VALUES_LESS (dconst0, r)
- && REAL_VALUES_LESS (r, fvptr[2]))
- {
- memcpy (d, &dconst0, sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- else if (REAL_VALUES_LESS (r, dconst0)
- && REAL_VALUES_LESS (fvptr[3], r))
- {
- memcpy (d, &dconst0, sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- }
-
- return 0;
-}
-
#ifdef OBJECT_FORMAT_ELF
/* Switch to the section to which we should output X. The only thing
@@ -9708,7 +9657,7 @@ unicosmk_output_addr_vec (file, vec)
int vlen = XVECLEN (body, 0);
int idx;
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (lab));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (lab));
for (idx = 0; idx < vlen; idx++)
{
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h
index d90d47618a7..36668b07ae8 100644
--- a/gcc/config/alpha/alpha.h
+++ b/gcc/config/alpha/alpha.h
@@ -69,22 +69,31 @@ Boston, MA 02111-1307, USA. */
builtin_define ("_IEEE_FP_INEXACT"); \
\
/* Macros dependent on the C dialect. */ \
- if (preprocessing_asm_p ()) \
- builtin_define_std ("LANGUAGE_ASSEMBLY"); \
- else if (c_language == clk_c) \
- builtin_define_std ("LANGUAGE_C"); \
- else if (c_language == clk_cplusplus) \
- { \
- builtin_define ("__LANGUAGE_C_PLUS_PLUS"); \
- builtin_define ("__LANGUAGE_C_PLUS_PLUS__");\
- } \
- if (flag_objc) \
- { \
- builtin_define ("__LANGUAGE_OBJECTIVE_C"); \
- builtin_define ("__LANGUAGE_OBJECTIVE_C__");\
- } \
+ SUBTARGET_LANGUAGE_CPP_BUILTINS(); \
} while (0)
+#ifndef SUBTARGET_LANGUAGE_CPP_BUILTINS
+#define SUBTARGET_LANGUAGE_CPP_BUILTINS() \
+ do \
+ { \
+ if (preprocessing_asm_p ()) \
+ builtin_define_std ("LANGUAGE_ASSEMBLY"); \
+ else if (c_language == clk_c) \
+ builtin_define_std ("LANGUAGE_C"); \
+ else if (c_language == clk_cplusplus) \
+ { \
+ builtin_define ("__LANGUAGE_C_PLUS_PLUS"); \
+ builtin_define ("__LANGUAGE_C_PLUS_PLUS__"); \
+ } \
+ if (flag_objc) \
+ { \
+ builtin_define ("__LANGUAGE_OBJECTIVE_C"); \
+ builtin_define ("__LANGUAGE_OBJECTIVE_C__"); \
+ } \
+ } \
+ while (0)
+#endif
+
#define CPP_SPEC "%(cpp_subtarget)"
#ifndef CPP_SUBTARGET_SPEC
@@ -402,6 +411,10 @@ extern const char *alpha_tls_size_string; /* For -mtls-size= */
/* Define the size of `long long'. The default is the twice the word size. */
#define LONG_LONG_TYPE_SIZE 64
+/* We're IEEE unless someone says to use VAX. */
+#define TARGET_FLOAT_FORMAT \
+ (TARGET_FLOAT_VAX ? VAX_FLOAT_FORMAT : IEEE_FLOAT_FORMAT)
+
/* The two floating-point formats we support are S-floating, which is
4 bytes, and T-floating, which is 8 bytes. `float' is S and `double'
and `long double' are T. */
@@ -480,7 +493,7 @@ extern const char *alpha_tls_size_string; /* For -mtls-size= */
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* No data type wants to be aligned rounder than this. */
@@ -499,14 +512,14 @@ extern const char *alpha_tls_size_string; /* For -mtls-size= */
#define DATA_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)
#endif
-/* Set this non-zero if move instructions will actually fail to work
+/* Set this nonzero if move instructions will actually fail to work
when given unaligned data.
Since we get an error message when we do one, call them invalid. */
#define STRICT_ALIGNMENT 1
-/* Set this non-zero if unaligned move instructions are extremely slow.
+/* Set this nonzero if unaligned move instructions are extremely slow.
On the Alpha, they trap. */
@@ -1156,14 +1169,6 @@ extern int alpha_memory_latency;
} \
}
-/* We do not allow indirect calls to be optimized into sibling calls, nor
- can we allow a call to a function in a different compilation unit to
- be optimized into a sibcall. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) \
- (DECL \
- && (! TREE_PUBLIC (DECL) \
- || (TREE_ASM_WRITTEN (DECL) && (*targetm.binds_local_p) (DECL))))
-
/* Try to output insns to set TARGET equal to the constant C if it can be
done in less than N insns. Do all computations in MODE. Returns the place
where the output has been placed if it can be done and the insns have been
@@ -1277,12 +1282,6 @@ do { \
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Macros to check register numbers against specific register classes. */
/* These assume that REGNO is a hard or pseudo reg number.
@@ -1459,7 +1458,7 @@ do { \
#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TImode)
/* Nonzero if access to memory by bytes is no faster than for words.
- Also non-zero if doing byte operations (specifically shifts) in registers
+ Also nonzero if doing byte operations (specifically shifts) in registers
is undesirable.
On the Alpha, we want to not use the byte operation and instead use
@@ -1749,18 +1748,12 @@ do { \
#define USER_LABEL_PREFIX ""
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "$%s%d:\n", PREFIX, NUM)
-
/* This is how to output a label for a jump table. Arguments are the same as
- for ASM_OUTPUT_INTERNAL_LABEL, except the insn for the jump table is
+ for (*targetm.asm_out.internal_label), except the insn for the jump table is
passed. */
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
-{ ASM_OUTPUT_ALIGN (FILE, 2); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
+{ ASM_OUTPUT_ALIGN (FILE, 2); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); }
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
@@ -1770,11 +1763,6 @@ do { \
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf ((LABEL), "*$%s%ld", (PREFIX), (long)(NUM))
-/* Check a floating-point value for validity for a particular machine mode. */
-
-#define CHECK_FLOAT_VALUE(MODE, D, OVERFLOW) \
- ((OVERFLOW) = check_float_value (MODE, &D, OVERFLOW))
-
/* We use the default ASCII-output routine, except that we don't write more
than 50 characters since the assembler doesn't support very long lines. */
@@ -1874,14 +1862,6 @@ do { \
( fputs ("\t.lcomm ", (FILE)), \
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%d\n", (SIZE)))
-
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
/* Print operand X (an rtx) in assembler syntax to file FILE.
@@ -1990,9 +1970,9 @@ do { \
/* Definitions for debugging. */
-#define SDB_DEBUGGING_INFO /* generate info for mips-tfile */
-#define DBX_DEBUGGING_INFO /* generate embedded stabs */
-#define MIPS_DEBUGGING_INFO /* MIPS specific debugging info */
+#define SDB_DEBUGGING_INFO 1 /* generate info for mips-tfile */
+#define DBX_DEBUGGING_INFO 1 /* generate embedded stabs */
+#define MIPS_DEBUGGING_INFO 1 /* MIPS specific debugging info */
#ifndef PREFERRED_DEBUGGING_TYPE /* assume SDB_DEBUGGING_INFO */
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
@@ -2130,8 +2110,3 @@ 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/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md
index 7e3b3754c09..2f0d3a06aa5 100644
--- a/gcc/config/alpha/alpha.md
+++ b/gcc/config/alpha/alpha.md
@@ -97,7 +97,7 @@
;; separately.
(define_attr "type"
- "ild,fld,ldsym,ist,fst,ibr,fbr,jsr,iadd,ilog,shift,icmov,fcmov,icmp,imul,\
+ "ild,fld,ldsym,ist,fst,ibr,callpal,fbr,jsr,iadd,ilog,shift,icmov,fcmov,icmp,imul,\
fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
(const_string "iadd"))
@@ -171,7 +171,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
(match_operand:SI 1 "nonimmediate_operand" "r,m,*f,m")))]
"! TARGET_FIX"
"@
- addl %1,$31,%0
+ addl $31,%1,%0
ldl %0,%1
cvtlq %1,%0
lds %0,%1\;cvtlq %0,%0"
@@ -184,7 +184,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
(match_operand:SI 1 "nonimmediate_operand" "r,m,*f,*f,m")))]
"TARGET_FIX"
"@
- addl %1,$31,%0
+ addl $31,%1,%0
ldl %0,%1
ftois %1,%0
cvtlq %1,%0
@@ -1733,7 +1733,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
"ext%M2l %r1,%3,%0"
[(set_attr "type" "shift")])
-;; Combine has some strange notion of preserving existing undefined behaviour
+;; Combine has some strange notion of preserving existing undefined behavior
;; in shifts larger than a word size. So capture these patterns that it
;; should have turned into zero_extracts.
@@ -2134,7 +2134,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
(define_expand "abstf2"
[(parallel [(set (match_operand:TF 0 "register_operand" "")
- (neg:TF (match_operand:TF 1 "reg_or_0_operand" "")))
+ (abs:TF (match_operand:TF 1 "reg_or_0_operand" "")))
(use (match_dup 2))])]
"TARGET_HAS_XFLOATING_LIBS"
{
@@ -3222,7 +3222,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
(match_operand:HI 2 "reg_or_8bit_operand" "rI")))]
"TARGET_MAX"
"maxuw4 %r1,%2,%0"
- [(set_attr "type" "shift")])
+ [(set_attr "type" "mvi")])
(define_expand "smaxdi3"
[(set (match_dup 3)
@@ -4866,7 +4866,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
[(unspec_volatile [(const_int 0)] UNSPECV_IMB)]
""
"call_pal 0x86"
- [(set_attr "type" "ibr")])
+ [(set_attr "type" "callpal")])
;; BUGCHK is documented common to OSF/1 and VMS PALcode.
;; NT does not document anything at 0x81 -- presumably it would generate
@@ -4876,7 +4876,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
[(trap_if (const_int 1) (const_int 0))]
"!TARGET_ABI_WINDOWS_NT"
"call_pal 0x81"
- [(set_attr "type" "ibr")])
+ [(set_attr "type" "callpal")])
;; For userland, we load the thread pointer from the TCB.
;; For the kernel, we load the per-cpu private value.
@@ -4891,7 +4891,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
else
return "call_pal 0x9e";
}
- [(set_attr "type" "ibr")])
+ [(set_attr "type" "callpal")])
;; For completeness, and possibly a __builtin function, here's how to
;; set the thread pointer. Since we don't describe enough of this
@@ -4913,7 +4913,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
else
return "call_pal 0x9f";
}
- [(set_attr "type" "ibr")])
+ [(set_attr "type" "callpal")])
;; 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
@@ -6571,7 +6571,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
""
{
operands[2] = gen_label_rtx ();
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (operands[2]));
return "stq $31,-8192(%1)\;subq %0,1,%0\;lda %1,-8192(%1)\;bne %0,%l2";
@@ -6934,12 +6934,12 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
and leave the LRU eviction counter pointing to that block. */
static const char * const alt[2][2] = {
{
- "lds $f31,%a0", /* read, evict next */
+ "ldq $31,%a0", /* read, evict next */
"ldl $31,%a0", /* read, evict last */
},
{
"ldt $f31,%a0", /* write, evict next */
- "ldq $31,%a0", /* write, evict last */
+ "lds $f31,%a0", /* write, evict last */
}
};
@@ -7596,9 +7596,9 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
})
(define_insn "*pkwb"
- [(set (match_operand:V8QI 0 "register_operand" "")
+ [(set (match_operand:V8QI 0 "register_operand" "=r")
(vec_concat:V8QI
- (truncate:V4QI (match_operand:V4HI 1 "register_operand" ""))
+ (truncate:V4QI (match_operand:V4HI 1 "register_operand" "r"))
(match_operand:V4QI 2 "const0_operand" "")))]
"TARGET_MAX"
"pkwb %r1,%0"
diff --git a/gcc/config/alpha/elf.h b/gcc/config/alpha/elf.h
index 806d95f4420..e159a02398a 100644
--- a/gcc/config/alpha/elf.h
+++ b/gcc/config/alpha/elf.h
@@ -27,8 +27,8 @@ Boston, MA 02111-1307, USA. */
/* ??? Move all SDB stuff from alpha.h to osf.h. */
#undef SDB_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
@@ -103,7 +103,7 @@ do { \
#define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \
do { \
ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \
} while (0)
/* The standard SVR4 assembler seems to require that certain builtin
diff --git a/gcc/config/alpha/ev4.md b/gcc/config/alpha/ev4.md
index 6816e44640b..41e1efd4cd7 100644
--- a/gcc/config/alpha/ev4.md
+++ b/gcc/config/alpha/ev4.md
@@ -59,6 +59,11 @@
(eq_attr "type" "ibr,jsr"))
"ev4_ib1+ev4_bbox,ev4_bbox")
+(define_insn_reservation "ev4_callpal" 2
+ (and (eq_attr "cpu" "ev4")
+ (eq_attr "type" "callpal"))
+ "ev4_ib1+ev4_bbox,ev4_bbox")
+
(define_insn_reservation "ev4_fbr" 2
(and (eq_attr "cpu" "ev4")
(eq_attr "type" "fbr"))
diff --git a/gcc/config/alpha/ev5.md b/gcc/config/alpha/ev5.md
index 69aa4a817aa..832cf6be8f3 100644
--- a/gcc/config/alpha/ev5.md
+++ b/gcc/config/alpha/ev5.md
@@ -59,6 +59,11 @@
(eq_attr "type" "ibr"))
"ev5_e1")
+(define_insn_reservation "ev5_callpal" 1
+ (and (eq_attr "cpu" "ev5")
+ (eq_attr "type" "callpal"))
+ "ev5_e1")
+
(define_insn_reservation "ev5_jsr" 1
(and (eq_attr "cpu" "ev5")
(eq_attr "type" "jsr"))
diff --git a/gcc/config/alpha/ev6.md b/gcc/config/alpha/ev6.md
index 78bb51f23f2..12204b69d6a 100644
--- a/gcc/config/alpha/ev6.md
+++ b/gcc/config/alpha/ev6.md
@@ -113,7 +113,7 @@
; Integer branches issue to upper units
(define_insn_reservation "ev6_ibr" 1
(and (eq_attr "cpu" "ev6")
- (eq_attr "type" "ibr"))
+ (eq_attr "type" "ibr,callpal"))
"ev6_u")
; Calls only issue to L0.
diff --git a/gcc/config/alpha/netbsd.h b/gcc/config/alpha/netbsd.h
index 60e7f1fc7af..4dc713ba537 100644
--- a/gcc/config/alpha/netbsd.h
+++ b/gcc/config/alpha/netbsd.h
@@ -28,6 +28,12 @@ Boston, MA 02111-1307, USA. */
NETBSD_OS_CPP_BUILTINS_LP64(); \
} while (0)
+
+/* NetBSD doesn't use the LANGUAGE* built-ins. */
+#undef SUBTARGET_LANGUAGE_CPP_BUILTINS
+#define SUBTARGET_LANGUAGE_CPP_BUILTINS() /* nothing */
+
+
/* Show that we need a GP when profiling. */
#undef TARGET_PROFILING_NEEDS_GP
#define TARGET_PROFILING_NEEDS_GP 1
@@ -69,5 +75,10 @@ Boston, MA 02111-1307, USA. */
%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
+/* Attempt to enable execute permissions on the stack. */
+
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
+
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (NetBSD/alpha ELF)");
diff --git a/gcc/config/alpha/osf5.h b/gcc/config/alpha/osf5.h
index 59b3ae11793..e483124691e 100644
--- a/gcc/config/alpha/osf5.h
+++ b/gcc/config/alpha/osf5.h
@@ -18,8 +18,12 @@
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+/* Tru64 5.1 uses IEEE QUAD format. */
+/* ??? However, since there is no support for VAX H_floating, we must
+ drop back to a 64-bit long double to avoid a crash looking for the
+ format associated with TFmode. */
#undef LONG_DOUBLE_TYPE_SIZE
-#define LONG_DOUBLE_TYPE_SIZE 128
+#define LONG_DOUBLE_TYPE_SIZE (TARGET_FLOAT_VAX ? 64 : 128)
/* In Tru64 UNIX V5.1, Compaq introduced a new assembler
(/usr/lib/cmplrs/cc/adu) which currently (versions between 3.04.29 and
diff --git a/gcc/config/alpha/unicosmk.h b/gcc/config/alpha/unicosmk.h
index 8f7b53db071..b8f9512f522 100644
--- a/gcc/config/alpha/unicosmk.h
+++ b/gcc/config/alpha/unicosmk.h
@@ -350,12 +350,12 @@ ssib_section () \
#undef ASM_OUTPUT_SOURCE_FILENAME
/* This is how to output a label for a jump table. Arguments are the same as
- for ASM_OUTPUT_INTERNAL_LABEL, except the insn for the jump table is
+ for (*targetm.asm_out.internal_label), except the insn for the jump table is
passed. */
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM)
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM)
/* CAM has some restrictions with respect to string literals. It won't
accept lines with more that 256 characters which means that we have
diff --git a/gcc/config/alpha/vms.h b/gcc/config/alpha/vms.h
index b0da28a3cdf..57d8e697c46 100644
--- a/gcc/config/alpha/vms.h
+++ b/gcc/config/alpha/vms.h
@@ -306,7 +306,7 @@ extern void literals_section PARAMS ((void));
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
-{ ASM_OUTPUT_ALIGN (FILE, 3); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
+{ ASM_OUTPUT_ALIGN (FILE, 3); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); }
/* This says how to output assembler code to declare an
uninitialized external linkage data object. */
@@ -364,8 +364,8 @@ do { \
#undef MIPS_DEBUGGING_INFO
#undef DBX_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
-#define VMS_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
+#define VMS_DEBUGGING_INFO 1
#define DWARF2_UNWIND_INFO 1
@@ -448,13 +448,10 @@ do { \
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
/* ??? VMS uses different linkage. */
-#undef ASM_OUTPUT_MI_THUNK
+#undef TARGET_ASM_OUTPUT_MI_THUNK
#undef ASM_SPEC
#undef ASM_FINAL_SPEC
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 426cc89d8f0..58bbaafa03e 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -93,6 +93,7 @@ static bool arc_assemble_integer PARAMS ((rtx, unsigned int, int));
static void arc_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
static void arc_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static void arc_encode_section_info PARAMS ((tree, int));
+static void arc_internal_label PARAMS ((FILE *, const char *, unsigned long));
/* Initialize the GCC target structure. */
#undef TARGET_ASM_ALIGNED_HI_OP
@@ -110,6 +111,8 @@ static void arc_encode_section_info PARAMS ((tree, int));
#define TARGET_ATTRIBUTE_TABLE arc_attribute_table
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO arc_encode_section_info
+#undef TARGET_ASM_INTERNAL_LABEL
+#define TARGET_ASM_INTERNAL_LABEL arc_internal_label
struct gcc_target targetm = TARGET_INITIALIZER;
@@ -1741,14 +1744,13 @@ arc_print_operand (file, x, code)
return;
case 'A' :
{
- REAL_VALUE_TYPE d;
char str[30];
if (GET_CODE (x) != CONST_DOUBLE
|| GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
abort ();
- REAL_VALUE_FROM_CONST_DOUBLE (d, x);
- REAL_VALUE_TO_DECIMAL (d, "%.20e", str);
+
+ real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
fprintf (file, "%s", str);
return;
}
@@ -1923,7 +1925,7 @@ record_cc_ref (insn)
0 -> 2 final_prescan_insn, if the `target' is an unconditional branch
1 -> 3 branch patterns, after having not output the conditional branch
2 -> 4 branch patterns, after having not output the conditional branch
- 3 -> 0 ASM_OUTPUT_INTERNAL_LABEL, if the `target' label is reached
+ 3 -> 0 (*targetm.asm_out.internal_label), if the `target' label is reached
(the target label has CODE_LABEL_NUMBER equal to
arc_ccfsm_target_label).
4 -> 0 final_prescan_insn, if `target' unconditional branch is reached
@@ -2219,7 +2221,7 @@ arc_final_prescan_insn (insn, opvec, noperands)
/* Record that we are currently outputting label NUM with prefix PREFIX.
It it's the label we're looking for, reset the ccfsm machinery.
- Called from ASM_OUTPUT_INTERNAL_LABEL. */
+ Called from (*targetm.asm_out.internal_label). */
void
arc_ccfsm_at_label (prefix, num)
@@ -2359,3 +2361,16 @@ arc_encode_section_info (decl, first)
if (TREE_CODE (decl) == FUNCTION_DECL)
SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
}
+
+/* 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. */
+
+static void
+arc_internal_label (stream, prefix, labelno)
+ FILE *stream;
+ const char *prefix;
+ unsigned long labelno;
+{
+ arc_ccfsm_at_label (prefix, labelno);
+ default_internal_label (stream, prefix, labelno);
+}
diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
index d1cfabc520c..7739fa4cdad 100644
--- a/gcc/config/arc/arc.h
+++ b/gcc/config/arc/arc.h
@@ -131,7 +131,7 @@ extern int target_flags;
/* Instruction set characteristics.
These are internal macros, set by the appropriate -mcpu= option. */
-/* Non-zero means the cpu has a barrel shifter. */
+/* Nonzero means the cpu has a barrel shifter. */
#define TARGET_SHIFTER 0
extern const char *arc_cpu_string;
@@ -149,7 +149,7 @@ extern const char *arc_text_string,*arc_data_string,*arc_rodata_string;
extern int arc_cpu_type;
/* Check if CPU is an extension and set `arc_cpu_type' and `arc_mangle_cpu'
- appropriately. The result should be non-zero if the cpu is recognized,
+ appropriately. The result should be nonzero if the cpu is recognized,
otherwise zero. This is intended to be redefined in a cover file.
This is used by arc_init. */
#define ARC_EXTENSION_CPU(cpu) 0
@@ -231,7 +231,7 @@ if (GET_MODE_CLASS (MODE) == MODE_INT \
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* No data type wants to be aligned rounder than this. */
@@ -989,7 +989,7 @@ do { \
#define SELECT_CC_MODE(OP, X, Y) \
arc_select_cc_mode (OP, X, Y)
-/* Return non-zero if SELECT_CC_MODE will never return MODE for a
+/* Return nonzero if SELECT_CC_MODE will never return MODE for a
floating point inequality comparison. */
#define REVERSIBLE_CC_MODE(MODE) 1 /*???*/
@@ -1202,7 +1202,7 @@ do { \
compiled for different cpus. */
/* We work around a dwarfout.c deficiency by watching for labels from it and
not adding the '_' prefix nor the cpu suffix. There is a comment in
- dwarfout.c that says it should be using ASM_OUTPUT_INTERNAL_LABEL. */
+ dwarfout.c that says it should be using (*targetm.asm_out.internal_label). */
extern const char *arc_mangle_cpu;
#define ASM_OUTPUT_LABELREF(FILE, NAME) \
do { \
@@ -1217,22 +1217,6 @@ do { \
} \
} while (0)
-/* 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) \
-do { \
- arc_ccfsm_at_label (PREFIX, NUM); \
- fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
-} while (0)
-
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* Assembler pseudo-op to equate one value with another. */
/* ??? This is needed because dwarfout.c provides a default definition too
late for defaults.h (which contains the default definition of ASM_OUTPUT_DEF
@@ -1311,12 +1295,8 @@ do { if ((LOG) != 0) fprintf (FILE, "\t.align %d\n", 1 << (LOG)); } while (0)
/* Debugging information. */
/* Generate DBX and DWARF debugging information. */
-#ifndef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
-#endif
-#ifndef DWARF_DEBUGGING_INFO
-#define DWARF_DEBUGGING_INFO
-#endif
+#define DBX_DEBUGGING_INFO 1
+#define DWARF_DEBUGGING_INFO 1
/* Prefer STABS (for now). */
#undef PREFERRED_DEBUGGING_TYPE
diff --git a/gcc/config/arm/README-interworking b/gcc/config/arm/README-interworking
index 46b76c99242..de8b27841b2 100644
--- a/gcc/config/arm/README-interworking
+++ b/gcc/config/arm/README-interworking
@@ -235,7 +235,7 @@ processing is enabled.
When the -mthumb-interwork command line switch is specified, gcc
arranges for all functions to return to their caller by using the BX
instruction. Thus provided that the return address has the bottom bit
-correctly initialised to indicate the instruction set of the caller,
+correctly initialized to indicate the instruction set of the caller,
correct operation will ensue.
When a function is called explicitly (rather than via a function
diff --git a/gcc/config/arm/aof.h b/gcc/config/arm/aof.h
index 965337cf700..73b62b5bb58 100644
--- a/gcc/config/arm/aof.h
+++ b/gcc/config/arm/aof.h
@@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */
#define LINK_LIBGCC_SPECIAL 1
#define LINK_SPEC "%{aof} %{bin} %{aif} %{ihf} %{shl,*} %{reent*} %{split} \
- %{ov*,*} %{reloc*} -nodebug"
+ %{ov*} %{reloc*} -nodebug"
#define STARTFILE_SPEC "crtbegin.o%s"
@@ -267,10 +267,6 @@ do { \
#define ASM_GENERATE_INTERNAL_LABEL(STRING,PREFIX,NUM) \
sprintf ((STRING), "*|%s..%ld|", (PREFIX), (long)(NUM))
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR,NAME,NUMBER) \
- ((OUTVAR) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)))
-
/* How initialization functions are handled */
#define CTORS_SECTION_ASM_OP "\tAREA\t|C$$gnu_ctorsvec|, DATA, READONLY"
diff --git a/gcc/config/arm/aout.h b/gcc/config/arm/aout.h
index 3f29b395e03..a142ae11944 100644
--- a/gcc/config/arm/aout.h
+++ b/gcc/config/arm/aout.h
@@ -111,9 +111,7 @@ Boston, MA 02111-1307, USA. */
/* Generate DBX debugging information. riscix.h will undefine this because
the native assembler does not support stabs. */
-#ifndef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO 1
-#endif
+#define DBX_DEBUGGING_INFO 1
/* Acorn dbx moans about continuation chars, so don't use any. */
#ifndef DBX_CONTIN_LENGTH
@@ -129,7 +127,7 @@ Boston, MA 02111-1307, USA. */
output_quoted_string (STREAM, NAME); \
fprintf (STREAM, ",%d,0,315,%s\n", N_SO, &ltext_label_name[1]); \
text_section (); \
- ASM_OUTPUT_INTERNAL_LABEL (STREAM, "Ltext", 0); \
+ (*targetm.asm_out.internal_label) (STREAM, "Ltext", 0); \
} \
while (0)
@@ -153,11 +151,6 @@ Boston, MA 02111-1307, USA. */
sprintf (STRING, "*%s%s%u", LOCAL_LABEL_PREFIX, PREFIX, (unsigned int)(NUM))
#endif
-/* Construct a private name. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \
- ((OUTVAR) = (char *) alloca (strlen (NAME) + 10), \
- sprintf (OUTVAR, "%s.%d", NAME, NUMBER))
-
/* Output an element of a dispatch table. */
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
asm_fprintf (STREAM, "\t.word\t%LL%d\n", VALUE)
diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
index 036ea44fed5..a1bd85c9f0e 100644
--- a/gcc/config/arm/arm-protos.h
+++ b/gcc/config/arm/arm-protos.h
@@ -1,5 +1,5 @@
/* Prototypes for exported functions defined in arm.c and pe.c
- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Richard Earnshaw (rearnsha@arm.com)
Minor hacks by Nick Clifton (nickc@cygnus.com)
@@ -34,13 +34,13 @@ extern void arm_expand_prologue PARAMS ((void));
/* Used in arm.md, but defined in output.c. */
extern void assemble_align PARAMS ((int));
extern const char * arm_strip_name_encoding PARAMS ((const char *));
+extern void arm_asm_output_labelref PARAMS ((FILE *, const char *));
extern unsigned long arm_current_func_type PARAMS ((void));
extern unsigned int arm_compute_initial_elimination_offset PARAMS ((unsigned int, unsigned int));
#ifdef TREE_CODE
extern int arm_return_in_memory PARAMS ((tree));
extern void arm_encode_call_attribute PARAMS ((tree, int));
-extern int arm_function_ok_for_sibcall PARAMS ((tree));
#endif
#ifdef RTX_CODE
extern int arm_hard_regno_mode_ok PARAMS ((unsigned int, enum machine_mode));
@@ -106,6 +106,7 @@ extern int arm_gen_movstrqi PARAMS ((rtx *));
extern rtx arm_gen_rotated_half_load PARAMS ((rtx));
extern enum machine_mode arm_select_cc_mode PARAMS ((RTX_CODE, rtx, rtx));
extern rtx arm_gen_compare_reg PARAMS ((RTX_CODE, rtx, rtx));
+extern rtx arm_gen_return_addr_mask PARAMS ((void));
extern void arm_reload_in_hi PARAMS ((rtx *));
extern void arm_reload_out_hi PARAMS ((rtx *));
extern void arm_reorg PARAMS ((rtx));
@@ -152,6 +153,8 @@ extern void common_section PARAMS ((void));
#endif /* RTX_CODE */
+extern int arm_float_words_big_endian PARAMS ((void));
+
/* Thumb functions. */
extern void arm_init_expanders PARAMS ((void));
extern int thumb_far_jump_used_p PARAMS ((int));
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 56c7e276efc..42c2781b2c1 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -117,6 +117,7 @@ static void arm_set_default_type_attributes PARAMS ((tree));
static int arm_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int count_insns_for_constant PARAMS ((HOST_WIDE_INT, int));
static int arm_get_strip_length PARAMS ((int));
+static bool arm_function_ok_for_sibcall PARAMS ((tree, tree));
#ifdef OBJECT_FORMAT_ELF
static void arm_elf_asm_named_section PARAMS ((const char *, unsigned int));
#endif
@@ -126,6 +127,9 @@ static void arm_encode_section_info PARAMS ((tree, int));
#ifdef AOF_ASSEMBLER
static void aof_globalize_label PARAMS ((FILE *, const char *));
#endif
+static void arm_internal_label PARAMS ((FILE *, const char *, unsigned long));
+static void arm_output_mi_thunk PARAMS ((FILE *, tree,
+ HOST_WIDE_INT, tree));
#undef Hint
#undef Mmode
@@ -188,6 +192,15 @@ static void aof_globalize_label PARAMS ((FILE *, const char *));
#undef TARGET_STRIP_NAME_ENCODING
#define TARGET_STRIP_NAME_ENCODING arm_strip_name_encoding
+#undef TARGET_ASM_INTERNAL_LABEL
+#define TARGET_ASM_INTERNAL_LABEL arm_internal_label
+
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL arm_function_ok_for_sibcall
+
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK arm_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Obstack for minipool constant handling. */
@@ -672,7 +685,7 @@ arm_override_options ()
if (TARGET_APCS_FLOAT)
warning ("passing floating point arguments in fp regs not yet supported");
- /* Initialise boolean versions of the flags, for use in the arm.md file. */
+ /* Initialize boolean versions of the flags, for use in the arm.md file. */
arm_fast_multiply = (insn_flags & FL_FAST_MULT) != 0;
arm_arch4 = (insn_flags & FL_ARCH4) != 0;
arm_arch5 = (insn_flags & FL_ARCH5) != 0;
@@ -831,7 +844,7 @@ arm_isr_value (argument)
if (streq (arg, ptr->arg))
return ptr->return_value;
- /* An unrecognised interrupt type. */
+ /* An unrecognized interrupt type. */
return ARM_FT_UNKNOWN;
}
@@ -1034,7 +1047,7 @@ arm_split_constant (code, mode, val, target, source, subtargets)
&& REGNO (target) != REGNO (source)))
{
/* After arm_reorg has been called, we can't fix up expensive
- constants by pushing them into memory so we must synthesise
+ constants by pushing them into memory so we must synthesize
them in-line, regardless of the cost. This is only likely to
be more costly on chips that have load delay slots and we are
compiling without running the scheduler (so no splitting
@@ -1756,9 +1769,20 @@ int
arm_return_in_memory (type)
tree type;
{
+ HOST_WIDE_INT size;
+
if (!AGGREGATE_TYPE_P (type))
/* All simple types are returned in registers. */
return 0;
+
+ size = int_size_in_bytes (type);
+
+ if (TARGET_ATPCS)
+ {
+ /* ATPCS returns aggregate types in memory only if they are
+ larger than a word (or are variable size). */
+ return (size < 0 || size > UNITS_PER_WORD);
+ }
/* For the arm-wince targets we choose to be compitable with Microsoft's
ARM and Thumb compilers, which always return aggregates in memory. */
@@ -1767,7 +1791,7 @@ arm_return_in_memory (type)
Also catch the case where int_size_in_bytes returns -1. In this case
the aggregate is either huge or of varaible size, and in either case
we will want to return it via memory and not in a register. */
- if (((unsigned int) int_size_in_bytes (type)) > UNITS_PER_WORD)
+ if (size < 0 || size > UNITS_PER_WORD)
return 1;
if (TREE_CODE (type) == RECORD_TYPE)
@@ -1845,6 +1869,27 @@ arm_return_in_memory (type)
return 1;
}
+/* Indicate whether or not words of a double are in big-endian order. */
+
+int
+arm_float_words_big_endian ()
+{
+
+ /* For FPA, float words are always big-endian. For VFP, floats words
+ follow the memory system mode. */
+
+ if (TARGET_HARD_FLOAT)
+ {
+ /* FIXME: TARGET_HARD_FLOAT currently implies FPA. */
+ return 1;
+ }
+
+ if (TARGET_VFP)
+ return (TARGET_BIG_END ? 1 : 0);
+
+ return 1;
+}
+
/* Initialize a variable CUM of type CUMULATIVE_ARGS
for a call to a function whose data type is FNTYPE.
For a library call, FNTYPE is NULL. */
@@ -2175,7 +2220,7 @@ current_file_function_operand (sym_ref)
return 0;
}
-/* Return non-zero if a 32 bit "long_call" should be generated for
+/* Return nonzero if a 32 bit "long_call" should be generated for
this call. We generate a long_call if the function:
a. has an __attribute__((long call))
@@ -2228,18 +2273,19 @@ arm_is_longcall_p (sym_ref, call_cookie, call_symbol)
|| TARGET_LONG_CALLS;
}
-/* Return non-zero if it is ok to make a tail-call to DECL. */
+/* Return nonzero if it is ok to make a tail-call to DECL. */
-int
-arm_function_ok_for_sibcall (decl)
+static bool
+arm_function_ok_for_sibcall (decl, exp)
tree decl;
+ tree exp ATTRIBUTE_UNUSED;
{
int call_type = TARGET_LONG_CALLS ? CALL_LONG : CALL_NORMAL;
/* Never tailcall something for which we have no decl, or if we
are in Thumb mode. */
if (decl == NULL || TARGET_THUMB)
- return 0;
+ return false;
/* Get the calling method. */
if (lookup_attribute ("short_call", TYPE_ATTRIBUTES (TREE_TYPE (decl))))
@@ -2251,20 +2297,20 @@ arm_function_ok_for_sibcall (decl)
a branch instruction. However, if not compiling PIC, we know
we can reach the symbol if it is in this compilation unit. */
if (call_type == CALL_LONG && (flag_pic || !TREE_ASM_WRITTEN (decl)))
- return 0;
+ return false;
/* If we are interworking and the function is not declared static
then we can't tail-call it unless we know that it exists in this
compilation unit (since it might be a Thumb routine). */
if (TARGET_INTERWORK && TREE_PUBLIC (decl) && !TREE_ASM_WRITTEN (decl))
- return 0;
+ return false;
/* Never tailcall from an ISR routine - it needs a special exit sequence. */
if (IS_INTERRUPT (arm_current_func_type ()))
- return 0;
+ return false;
/* Everything else is ok. */
- return 1;
+ return true;
}
@@ -4882,6 +4928,19 @@ arm_gen_compare_reg (code, x, y)
return cc_reg;
}
+/* Generate a sequence of insns that will generate the correct return
+ address mask depending on the physical architecture that the program
+ is running on. */
+
+rtx
+arm_gen_return_addr_mask ()
+{
+ rtx reg = gen_reg_rtx (Pmode);
+
+ emit_insn (gen_return_addr_mask (reg));
+ return reg;
+}
+
void
arm_reload_in_hi (operands)
rtx * operands;
@@ -7280,6 +7339,8 @@ output_return_instruction (operand, really_return, reverse)
/* Generate the load multiple instruction to restore the registers. */
if (frame_pointer_needed)
sprintf (instr, "ldm%sea\t%%|fp, {", conditional);
+ else if (live_regs_mask & (1 << SP_REGNUM))
+ sprintf (instr, "ldm%sfd\t%%|sp, {", conditional);
else
sprintf (instr, "ldm%sfd\t%%|sp!, {", conditional);
@@ -7691,7 +7752,16 @@ arm_output_epilogue (really_return)
asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM);
}
else if (saved_regs_mask)
- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
+ {
+ if (saved_regs_mask & (1 << SP_REGNUM))
+ /* Note - write back to the stack register is not enabled
+ (ie "ldmfd sp!..."). We know that the stack pointer is
+ in the list of registers and if we add writeback the
+ instruction becomes UNPREDICTABLE. */
+ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
+ else
+ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
+ }
if (current_function_pretend_args_size)
{
@@ -7814,7 +7884,7 @@ emit_multi_reg_push (mask)
num_dwarf_regs--;
/* For the body of the insn we are going to generate an UNSPEC in
- parallel with several USEs. This allows the insn to be recognised
+ parallel with several USEs. This allows the insn to be recognized
by the push_multi pattern in the arm.md file. The insn looks
something like this:
@@ -7999,11 +8069,11 @@ emit_sfm (base_reg, count)
current stack pointer -> | | /
--
- For a given funciton some or all of these stack compomnents
+ For a given function some or all of these stack components
may not be needed, giving rise to the possibility of
eliminating some of the registers.
- The values returned by this function must reflect the behaviour
+ The values returned by this function must reflect the behavior
of arm_expand_prologue() and arm_compute_save_reg_mask().
The sign of the number returned reflects the direction of stack
@@ -8675,7 +8745,7 @@ arm_assemble_integer (x, size, aligned_p)
0 -> 2 final_prescan_insn if the `target' is an unconditional branch
1 -> 3 ASM_OUTPUT_OPCODE after not having output the conditional branch
2 -> 4 ASM_OUTPUT_OPCODE after not having output the conditional branch
- 3 -> 0 ASM_OUTPUT_INTERNAL_LABEL if the `target' label is reached
+ 3 -> 0 (*targetm.asm_out.internal_label) if the `target' label is reached
(the target label has CODE_LABEL_NUMBER equal to arm_target_label).
4 -> 0 final_prescan_insn if the `target' unconditional branch is reached
(the target insn is arm_target_insn).
@@ -9250,7 +9320,7 @@ arm_debugger_arg_offset (value, addr)
held in the register into an offset from the frame pointer.
We do this by searching through the insns for the function
looking to see where this register gets its value. If the
- register is initialised from the frame pointer plus an offset
+ register is initialized from the frame pointer plus an offset
then we are in luck and we can continue, otherwise we give up.
This code is exercised by producing debugging information
@@ -9816,7 +9886,7 @@ thumb_shiftable_const (val)
return 0;
}
-/* Returns non-zero if the current function contains,
+/* Returns nonzero if the current function contains,
or might contain a far jump. */
int
@@ -9886,7 +9956,7 @@ thumb_far_jump_used_p (in_prologue)
return 0;
}
-/* Return non-zero if FUNC must be entered in ARM mode. */
+/* Return nonzero if FUNC must be entered in ARM mode. */
int
is_called_in_ARM_mode (func)
@@ -9921,6 +9991,9 @@ thumb_unexpanded_epilogue ()
if (return_used_this_function)
return "";
+ if (IS_NAKED (arm_current_func_type ()))
+ return "";
+
for (regno = 0; regno <= LAST_LO_REGNUM; regno++)
if (THUMB_REG_PUSHED_P (regno))
live_regs_mask |= 1 << regno;
@@ -10799,6 +10872,30 @@ arm_strip_name_encoding (name)
return name;
}
+/* If there is a '*' anywhere in the name's prefix, then
+ emit the stripped name verbatim, otherwise prepend an
+ underscore if leading underscores are being used. */
+
+void
+arm_asm_output_labelref (stream, name)
+ FILE * stream;
+ const char * name;
+{
+ int skip;
+ int verbatim = 0;
+
+ while ((skip = arm_get_strip_length (* name)))
+ {
+ verbatim |= (*name == '*');
+ name += skip;
+ }
+
+ if (verbatim)
+ fputs (name, stream);
+ else
+ asm_fprintf (stream, "%U%s", name);
+}
+
rtx aof_pic_label;
#ifdef AOF_ASSEMBLER
@@ -11047,3 +11144,55 @@ arm_encode_section_info (decl, first)
}
}
#endif /* !ARM_PE */
+
+static void
+arm_internal_label (stream, prefix, labelno)
+ FILE *stream;
+ const char *prefix;
+ unsigned long labelno;
+{
+ if (arm_ccfsm_state == 3 && (unsigned) arm_target_label == labelno
+ && !strcmp (prefix, "L"))
+ {
+ arm_ccfsm_state = 0;
+ arm_target_insn = NULL;
+ }
+ default_internal_label (stream, prefix, labelno);
+}
+
+/* Output code to add DELTA to the first argument, and then jump
+ to FUNCTION. Used for C++ multiple inheritance. */
+
+static void
+arm_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ int mi_delta = delta;
+ const char *const mi_op = mi_delta < 0 ? "sub" : "add";
+ int shift = 0;
+ int this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)))
+ ? 1 : 0);
+ if (mi_delta < 0)
+ mi_delta = - mi_delta;
+ while (mi_delta != 0)
+ {
+ if ((mi_delta & (3 << shift)) == 0)
+ shift += 2;
+ else
+ {
+ asm_fprintf (file, "\t%s\t%r, %r, #%d\n",
+ mi_op, this_regno, this_regno,
+ mi_delta & (0xff << shift));
+ mi_delta &= ~(0xff << shift);
+ shift += 8;
+ }
+ }
+ fputs ("\tb\t", file);
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ if (NEED_PLT_RELOC)
+ fputs ("(PLT)", file);
+ fputc ('\n', file);
+}
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 64e71873148..c852454cc86 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -58,6 +58,11 @@ Boston, MA 02111-1307, USA. */
if (TARGET_SOFT_FLOAT) \
builtin_define ("__SOFTFP__"); \
\
+ /* FIXME: TARGET_HARD_FLOAT currently implies \
+ FPA. */ \
+ if (TARGET_VFP && !TARGET_HARD_FLOAT) \
+ builtin_define ("__VFP_FP__"); \
+ \
/* Add a define for interworking. \
Needed when building libgcc.a. */ \
if (TARGET_INTERWORK) \
@@ -365,6 +370,12 @@ Unrecognized value in TARGET_CPU_DEFAULT.
destination is non-Thumb aware. */
#define THUMB_FLAG_CALLER_SUPER_INTERWORKING (1 << 20)
+/* Nonzero means target uses VFP FP. */
+#define ARM_FLAG_VFP (1 << 21)
+
+/* Nonzero means to use ARM/Thumb Procedure Call Standard conventions. */
+#define ARM_FLAG_ATPCS (1 << 22)
+
#define TARGET_APCS_FRAME (target_flags & ARM_FLAG_APCS_FRAME)
#define TARGET_POKE_FUNCTION_NAME (target_flags & ARM_FLAG_POKE)
#define TARGET_FPE (target_flags & ARM_FLAG_FPE)
@@ -372,9 +383,11 @@ Unrecognized value in TARGET_CPU_DEFAULT.
#define TARGET_APCS_STACK (target_flags & ARM_FLAG_APCS_STACK)
#define TARGET_APCS_FLOAT (target_flags & ARM_FLAG_APCS_FLOAT)
#define TARGET_APCS_REENT (target_flags & ARM_FLAG_APCS_REENT)
+#define TARGET_ATPCS (target_flags & ARM_FLAG_ATPCS)
#define TARGET_MMU_TRAPS (target_flags & ARM_FLAG_MMU_TRAPS)
#define TARGET_SOFT_FLOAT (target_flags & ARM_FLAG_SOFT_FLOAT)
#define TARGET_HARD_FLOAT (! TARGET_SOFT_FLOAT)
+#define TARGET_VFP (target_flags & ARM_FLAG_VFP)
#define TARGET_BIG_END (target_flags & ARM_FLAG_BIG_END)
#define TARGET_INTERWORK (target_flags & ARM_FLAG_INTERWORK)
#define TARGET_LITTLE_WORDS (target_flags & ARM_FLAG_LITTLE_WORDS)
@@ -666,8 +679,9 @@ extern int arm_is_6_or_7;
#endif
/* Define this if most significant word of doubles is the lowest numbered.
- This is always true, even when in little-endian mode. */
-#define FLOAT_WORDS_BIG_ENDIAN 1
+ The rules are different based on whether or not we use FPA-format or
+ VFP-format doubles. */
+#define FLOAT_WORDS_BIG_ENDIAN (arm_float_words_big_endian ())
#define UNITS_PER_WORD 4
@@ -703,7 +717,7 @@ extern int arm_is_6_or_7;
#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
extern int arm_structure_size_boundary;
-/* This is the value used to initialise arm_structure_size_boundary. If a
+/* This is the value used to initialize arm_structure_size_boundary. If a
particular arm target wants to change the default value it should change
the definition of this macro, not STRUCTRUE_SIZE_BOUNDARY. See netbsd.h
for an example of this. */
@@ -714,12 +728,9 @@ extern int arm_structure_size_boundary;
/* Used when parsing command line option -mstructure_size_boundary. */
extern const char * structure_size_string;
-/* Non-zero if move instructions will actually fail to work
+/* Nonzero if move instructions will actually fail to work
when given unaligned data. */
#define STRICT_ALIGNMENT 1
-
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
/* Standard register usage. */
@@ -1059,14 +1070,16 @@ enum reg_class
/* The class value for index registers, and the one for base regs. */
#define INDEX_REG_CLASS (TARGET_THUMB ? LO_REGS : GENERAL_REGS)
-#define BASE_REG_CLASS (TARGET_THUMB ? BASE_REGS : GENERAL_REGS)
+#define BASE_REG_CLASS (TARGET_THUMB ? LO_REGS : GENERAL_REGS)
-/* For the Thumb the high registers cannot be used as base
- registers when addressing quanitities in QI or HI mode. */
+/* For the Thumb the high registers cannot be used as base registers
+ when addressing quanitities in QI or HI mode; if we don't know the
+ mode, then we must be conservative. After reload we must also be
+ conservative, since we can't support SP+reg addressing, and we
+ can't fix up any bad substitutions. */
#define MODE_BASE_REG_CLASS(MODE) \
- (TARGET_ARM ? BASE_REGS : \
- (((MODE) == QImode || (MODE) == HImode || (MODE) == VOIDmode) \
- ? LO_REGS : BASE_REGS))
+ (TARGET_ARM ? GENERAL_REGS : \
+ (((MODE) == SImode && !reload_completed) ? BASE_REGS : LO_REGS))
/* When SMALL_REGISTER_CLASSES is nonzero, the compiler allows
registers explicitly used in the rtl to be used as spill registers
@@ -1384,7 +1397,7 @@ enum reg_class
Note value 7 is currently unassigned. Also note that the interrupt
function types all have bit 2 set, so that they can be tested for easily.
Note that 0 is deliberately chosen for ARM_FT_UNKNOWN so that when the
- machine_function structure is initialised (to zero) func_type will
+ machine_function structure is initialized (to zero) func_type will
default to unknown. This will force the first use of arm_current_func_type
to call arm_compute_func_type. */
#define ARM_FT_UNKNOWN 0 /* Type has not yet been determined. */
@@ -1488,12 +1501,6 @@ typedef struct
#define FUNCTION_ARG_REGNO_P(REGNO) (IN_RANGE ((REGNO), 0, 3))
-/* Tail calling. */
-
-/* A C expression that evaluates to true if it is ok to perform a sibling
- call to DECL. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) arm_function_ok_for_sibcall ((DECL))
-
/* Perform any actions needed for a function that is receiving a variable
number of arguments. CUM is as above. MODE and TYPE are the mode and type
of the current parameter. PRETEND_SIZE is a variable that should be set to
@@ -1536,7 +1543,10 @@ typedef struct
will output the .text section.
The ``mov ip,lr'' seems like a good idea to stick with cc convention.
- ``prof'' doesn't seem to mind about this! */
+ ``prof'' doesn't seem to mind about this!
+
+ Note - this version of the code is designed to work in both ARM and
+ Thumb modes. */
#ifndef ARM_FUNCTION_PROFILER
#define ARM_FUNCTION_PROFILER(STREAM, LABELNO) \
{ \
@@ -1553,20 +1563,16 @@ typedef struct
}
#endif
-#ifndef THUMB_FUNCTION_PROFILER
-#define THUMB_FUNCTION_PROFILER(STREAM, LABELNO) \
-{ \
- fprintf (STREAM, "\tmov\tip, lr\n"); \
- fprintf (STREAM, "\tbl\tmcount\n"); \
- fprintf (STREAM, "\t.word\tLP%d\n", LABELNO); \
-}
-#endif
-
+#ifdef THUMB_FUNCTION_PROFILER
#define FUNCTION_PROFILER(STREAM, LABELNO) \
if (TARGET_ARM) \
ARM_FUNCTION_PROFILER (STREAM, LABELNO) \
else \
THUMB_FUNCTION_PROFILER (STREAM, LABELNO)
+#else
+#define FUNCTION_PROFILER(STREAM, LABELNO) \
+ ARM_FUNCTION_PROFILER (STREAM, LABELNO)
+#endif
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
the stack pointer does not matter. The value is tested only in
@@ -1858,7 +1864,7 @@ typedef struct
`assemble_name' uses this. */
#undef ASM_OUTPUT_LABELREF
#define ASM_OUTPUT_LABELREF(FILE, NAME) \
- asm_fprintf (FILE, "%U%s", arm_strip_name_encoding (NAME))
+ arm_asm_output_labelref (FILE, NAME)
#define ARM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL) \
arm_encode_call_attribute (DECL, SHORT_CALL_FLAG_CHAR)
@@ -2458,25 +2464,6 @@ extern int making_const_table;
#undef ASM_APP_OFF
#define ASM_APP_OFF (TARGET_THUMB ? "\t.code\t16\n" : "")
-/* Output an internal label definition. */
-#ifndef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) \
- do \
- { \
- char * s = (char *) alloca (40 + strlen (PREFIX)); \
- \
- if (arm_ccfsm_state == 3 && arm_target_label == (NUM) \
- && !strcmp (PREFIX, "L")) \
- { \
- arm_ccfsm_state = 0; \
- arm_target_insn = NULL; \
- } \
- ASM_GENERATE_INTERNAL_LABEL (s, (PREFIX), (NUM)); \
- ASM_OUTPUT_LABEL (STREAM, s); \
- } \
- while (0)
-#endif
-
/* Output a push or a pop instruction (only used when profiling). */
#define ASM_OUTPUT_REG_PUSH(STREAM, REGNO) \
if (TARGET_ARM) \
@@ -2501,7 +2488,7 @@ extern int making_const_table;
{ \
if (TARGET_THUMB) \
ASM_OUTPUT_ALIGN (FILE, 2); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \
} \
while (0)
@@ -2683,39 +2670,6 @@ extern int making_const_table;
else \
THUMB_PRINT_OPERAND_ADDRESS (STREAM, X)
-/* 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) \
- do \
- { \
- int mi_delta = (DELTA); \
- const char *const mi_op = mi_delta < 0 ? "sub" : "add"; \
- int shift = 0; \
- int this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION))) \
- ? 1 : 0); \
- if (mi_delta < 0) \
- mi_delta = - mi_delta; \
- while (mi_delta != 0) \
- { \
- if ((mi_delta & (3 << shift)) == 0) \
- shift += 2; \
- else \
- { \
- asm_fprintf (FILE, "\t%s\t%r, %r, #%d\n", \
- mi_op, this_regno, this_regno, \
- mi_delta & (0xff << shift)); \
- mi_delta &= ~(0xff << shift); \
- shift += 8; \
- } \
- } \
- fputs ("\tb\t", FILE); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- if (NEED_PLT_RELOC) \
- fputs ("(PLT)", FILE); \
- fputc ('\n', FILE); \
- } \
- while (0)
-
/* A C expression whose value is RTL representing the value of the return
address for the frame COUNT steps up from the current frame. */
@@ -2739,8 +2693,10 @@ extern int making_const_table;
in 26 bit mode, the condition codes must be masked out of the \
return address. This does not apply to ARM6 and later processors \
when running in 32 bit mode. */ \
- ((!TARGET_APCS_32) ? (GEN_INT (RETURN_ADDR_MASK26)) \
- : (GEN_INT ((unsigned long)0xffffffff)))
+ ((!TARGET_APCS_32) ? (gen_int_mode (RETURN_ADDR_MASK26, Pmode)) \
+ : (arm_arch4 || TARGET_THUMB) ? \
+ (gen_int_mode ((unsigned long)0xffffffff, Pmode)) \
+ : arm_gen_return_addr_mask ())
/* Define the codes that are matched by predicates in arm.c */
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 9dee56538e4..3480d959b05 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -69,6 +69,7 @@
; instructions setting registers for EH handling
; and stack frame generation. Operand 0 is the
; register to "use".
+ (UNSPEC_CHECK_ARCH 7); Set CCs to indicate 26-bit or 32-bit mode.
]
)
@@ -179,7 +180,7 @@
(const_string "normal"))
; Load scheduling, set from the arm_ld_sched variable
-; initialised by arm_override_options()
+; initialized by arm_override_options()
(define_attr "ldsched" "no,yes" (const (symbol_ref "arm_ld_sched")))
; condition codes: this one is used by final_prescan_insn to speed up
@@ -1837,7 +1838,8 @@
(match_operand:SI 1 "s_register_operand" "r")
(match_operand:SI 2 "const_int_operand" "n")
(match_operand:SI 3 "const_int_operand" "n"))
- (const_int 0)))]
+ (const_int 0)))
+ (clobber (reg:CC CC_REGNUM))]
"TARGET_ARM
&& (INTVAL (operands[3]) >= 0 && INTVAL (operands[3]) < 32
&& INTVAL (operands[2]) > 0
@@ -1856,9 +1858,9 @@
;;; ??? This pattern is bogus. If operand3 has bits outside the range
;;; represented by the bitfield, then this will produce incorrect results.
;;; Somewhere, the value needs to be truncated. On targets like the m68k,
-;;; which have a real bitfield insert instruction, the truncation happens
-;;; in the bitfield insert instruction itself. Since arm does not have a
-;;; bitfield insert instruction, we would have to emit code here to truncate
+;;; which have a real bit-field insert instruction, the truncation happens
+;;; in the bit-field insert instruction itself. Since arm does not have a
+;;; bit-field insert instruction, we would have to emit code here to truncate
;;; the value before we insert. This loses some of the advantage of having
;;; this insv pattern, so this pattern needs to be reevalutated.
@@ -1866,7 +1868,7 @@
[(set (zero_extract:SI (match_operand:SI 0 "s_register_operand" "")
(match_operand:SI 1 "general_operand" "")
(match_operand:SI 2 "general_operand" ""))
- (match_operand:SI 3 "nonmemory_operand" ""))]
+ (match_operand:SI 3 "reg_or_int_operand" ""))]
"TARGET_ARM"
"
{
@@ -3912,7 +3914,7 @@
;; DONE;
;;}")
-;; Recognise garbage generated above.
+;; Recognize garbage generated above.
;;(define_insn ""
;; [(set (match_operand:TI 0 "general_operand" "=r,r,r,<,>,m")
@@ -4204,7 +4206,7 @@
(use (label_ref (match_operand 1 "" "")))]
"TARGET_THUMB && flag_pic"
"*
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (operands[1]));
return \"add\\t%0, %|pc\";
"
@@ -4217,7 +4219,7 @@
(use (label_ref (match_operand 1 "" "")))]
"TARGET_ARM && flag_pic"
"*
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (operands[1]));
return \"add%?\\t%0, %|pc, %0\";
"
@@ -4681,7 +4683,7 @@
"
)
-;; Pattern to recognise insn generated default case above
+;; Pattern to recognize insn generated default case above
(define_insn "*movhi_insn_arch4"
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r")
(match_operand:HI 1 "general_operand" "rI,K,r,m"))]
@@ -6797,6 +6799,33 @@
(set_attr "type" "load")]
)
+;; Generate a sequence of instructions to determine if the processor is
+;; in 26-bit or 32-bit mode, and return the appropriate return address
+;; mask.
+
+(define_expand "return_addr_mask"
+ [(set (match_dup 1)
+ (compare:CC_NOOV (unspec [(const_int 0)] UNSPEC_CHECK_ARCH)
+ (const_int 0)))
+ (set (match_operand:SI 0 "s_register_operand" "")
+ (if_then_else:SI (eq (match_dup 1) (const_int 0))
+ (const_int -1)
+ (const_int 67108860)))] ; 0x03fffffc
+ "TARGET_ARM"
+ "
+ operands[1] = gen_rtx_REG (CC_NOOVmode, 24);
+ ")
+
+(define_insn "*check_arch2"
+ [(set (match_operand:CC_NOOV 0 "cc_register" "")
+ (compare:CC_NOOV (unspec [(const_int 0)] UNSPEC_CHECK_ARCH)
+ (const_int 0)))]
+ "TARGET_ARM"
+ "teq\\t%|r0, %|r0\;teq\\t%|pc, %|pc"
+ [(set_attr "length" "8")
+ (set_attr "conds" "set")]
+)
+
;; Call subroutine returning any type.
(define_expand "untyped_call"
@@ -8399,7 +8428,7 @@
; We must watch to see that the source/destination register isn't also the
; same as the base address register, and that if the index is a register,
; that it is not the same as the base address register. In such cases the
-; instruction that we would generate would have UNPREDICTABLE behaviour so
+; instruction that we would generate would have UNPREDICTABLE behavior so
; we cannot use it.
(define_peephole
@@ -8840,7 +8869,8 @@
[(set (match_operand:SI 0 "s_register_operand" "=r")
(sign_extract:SI (match_operand:SI 1 "s_register_operand" "r")
(const_int 1)
- (match_operand:SI 2 "const_int_operand" "n")))]
+ (match_operand:SI 2 "const_int_operand" "n")))
+ (clobber (reg:CC CC_REGNUM))]
"TARGET_ARM"
"*
operands[2] = GEN_INT (1 << INTVAL (operands[2]));
@@ -8856,7 +8886,8 @@
(not:SI
(sign_extract:SI (match_operand:SI 1 "s_register_operand" "r")
(const_int 1)
- (match_operand:SI 2 "const_int_operand" "n"))))]
+ (match_operand:SI 2 "const_int_operand" "n"))))
+ (clobber (reg:CC CC_REGNUM))]
"TARGET_ARM"
"*
operands[2] = GEN_INT (1 << INTVAL (operands[2]));
diff --git a/gcc/config/arm/coff.h b/gcc/config/arm/coff.h
index 263e115311f..0a78268949e 100644
--- a/gcc/config/arm/coff.h
+++ b/gcc/config/arm/coff.h
@@ -40,7 +40,7 @@ Boston, MA 02111-1307, USA. */
#endif
/* This is COFF, but prefer stabs. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
diff --git a/gcc/config/arm/crti.asm b/gcc/config/arm/crti.asm
index f3741db2bed..ac58e44838d 100644
--- a/gcc/config/arm/crti.asm
+++ b/gcc/config/arm/crti.asm
@@ -35,7 +35,7 @@
# .init sections. Users may put any desired instructions in those
# sections.
- # Note - this macro is complimented by the FUNC_END macro
+ # Note - this macro is complemented by the FUNC_END macro
# in crtn.asm. If you change this macro you must also change
# that macro match.
.macro FUNC_START
diff --git a/gcc/config/arm/crtn.asm b/gcc/config/arm/crtn.asm
index a7f0e9e2c71..2f4b5422eb2 100644
--- a/gcc/config/arm/crtn.asm
+++ b/gcc/config/arm/crtn.asm
@@ -35,7 +35,7 @@
# fact return. Users may put any desired instructions in those sections.
# This file is the last thing linked into any executable.
- # Note - this macro is complimented by the FUNC_START macro
+ # Note - this macro is complemented by the FUNC_START macro
# in crti.asm. If you change this macro you must also change
# that macro match.
#
diff --git a/gcc/config/arm/elf.h b/gcc/config/arm/elf.h
index df58eed4255..f24387383f2 100644
--- a/gcc/config/arm/elf.h
+++ b/gcc/config/arm/elf.h
@@ -122,26 +122,6 @@ Boston, MA 02111-1307, USA. */
} \
while (0)
#endif
-
-/* Output an internal label definition. */
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) \
- do \
- { \
- char * s = (char *) alloca (40 + strlen (PREFIX)); \
- extern int arm_target_label, arm_ccfsm_state; \
- extern rtx arm_target_insn; \
- \
- if (arm_ccfsm_state == 3 && arm_target_label == (NUM) \
- && !strcmp (PREFIX, "L")) \
- { \
- arm_ccfsm_state = 0; \
- arm_target_insn = NULL; \
- } \
- ASM_GENERATE_INTERNAL_LABEL (s, (PREFIX), (NUM)); \
- ASM_OUTPUT_LABEL (STREAM, s); \
- } \
- while (0)
#undef TARGET_ASM_NAMED_SECTION
#define TARGET_ASM_NAMED_SECTION arm_elf_asm_named_section
diff --git a/gcc/config/arm/linux-gas.h b/gcc/config/arm/linux-gas.h
index b4e346dd9ef..5e8ddf91ca2 100644
--- a/gcc/config/arm/linux-gas.h
+++ b/gcc/config/arm/linux-gas.h
@@ -45,7 +45,7 @@ Boston, MA 02111-1307, USA. */
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE BITS_PER_WORD
-/* Emit code to set up a trampoline and synchronise the caches. */
+/* Emit code to set up a trampoline and synchronize the caches. */
#undef INITIALIZE_TRAMPOLINE
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
{ \
diff --git a/gcc/config/arm/netbsd.h b/gcc/config/arm/netbsd.h
index 5a080d392fe..765bfb50663 100644
--- a/gcc/config/arm/netbsd.h
+++ b/gcc/config/arm/netbsd.h
@@ -54,7 +54,8 @@ Boston, MA 02111-1307, USA. */
#undef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS \
- { "netbsd_cpp_spec", NETBSD_CPP_SPEC },
+ { "netbsd_cpp_spec", NETBSD_CPP_SPEC }, \
+ { "netbsd_link_spec", NETBSD_LINK_SPEC_AOUT },
#undef CPP_SPEC
#define CPP_SPEC "\
@@ -71,10 +72,7 @@ Boston, MA 02111-1307, USA. */
/* Pass -X to the linker so that it will strip symbols starting with 'L' */
#undef LINK_SPEC
-#define LINK_SPEC "\
--X %{!shared:%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} \
-%{static:-Bstatic}} %{shared} %{assert*} \
-"
+#define LINK_SPEC "-X %(netbsd_link_spec)"
#undef SIZE_TYPE
#define SIZE_TYPE "unsigned int"
@@ -147,3 +145,30 @@ Boston, MA 02111-1307, USA. */
requirements. */
#undef DEFAULT_STRUCTURE_SIZE_BOUNDARY
#define DEFAULT_STRUCTURE_SIZE_BOUNDARY 8
+
+/* Emit code to set up a trampoline and synchronize the caches. */
+#undef INITIALIZE_TRAMPOLINE
+#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
+{ \
+ emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 8)), \
+ (CXT)); \
+ emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 12)), \
+ (FNADDR)); \
+ emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"), \
+ 0, VOIDmode, 2, TRAMP, Pmode, \
+ plus_constant (TRAMP, TRAMPOLINE_SIZE), Pmode); \
+}
+
+/* Clear the instruction cache from `BEG' to `END'. This makes a
+ call to the ARM32_SYNC_ICACHE architecture specific syscall. */
+#define CLEAR_INSN_CACHE(BEG, END) \
+{ \
+ extern int sysarch(int number, void *args); \
+ struct { \
+ unsigned int addr; \
+ int len; \
+ } s; \
+ s.addr = (unsigned int)(BEG); \
+ s.len = (END) - (BEG); \
+ (void)sysarch(0, &s); \
+}
diff --git a/gcc/config/arm/pe.c b/gcc/config/arm/pe.c
index 848d1986fe8..ee3da8fd411 100644
--- a/gcc/config/arm/pe.c
+++ b/gcc/config/arm/pe.c
@@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */
extern int current_function_anonymous_args;
-/* Return non-zero if DECL is a dllexport'd object. */
+/* Return nonzero if DECL is a dllexport'd object. */
tree current_class_type; /* FIXME */
@@ -52,7 +52,7 @@ arm_dllexport_p (decl)
return 0;
}
-/* Return non-zero if DECL is a dllimport'd object. */
+/* Return nonzero if DECL is a dllimport'd object. */
int
arm_dllimport_p (decl)
@@ -74,7 +74,7 @@ arm_dllimport_p (decl)
return 0;
}
-/* Return non-zero if SYMBOL is marked as being dllexport'd. */
+/* Return nonzero if SYMBOL is marked as being dllexport'd. */
int
arm_dllexport_name_p (symbol)
@@ -83,7 +83,7 @@ arm_dllexport_name_p (symbol)
return symbol[0] == ARM_PE_FLAG_CHAR && symbol[1] == 'e' && symbol[2] == '.';
}
-/* Return non-zero if SYMBOL is marked as being dllimport'd. */
+/* Return nonzero if SYMBOL is marked as being dllimport'd. */
int
arm_dllimport_name_p (symbol)
diff --git a/gcc/config/arm/unknown-elf.h b/gcc/config/arm/unknown-elf.h
index bf2eee2bb69..7f9211b18c0 100644
--- a/gcc/config/arm/unknown-elf.h
+++ b/gcc/config/arm/unknown-elf.h
@@ -47,7 +47,7 @@ Boston, MA 02111-1307, USA. */
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
-/* Return a non-zero value if DECL has a section attribute. */
+/* Return a nonzero value if DECL has a section attribute. */
#define IN_NAMED_SECTION(DECL) \
((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
&& DECL_SECTION_NAME (DECL) != NULL_TREE)
@@ -82,7 +82,7 @@ Boston, MA 02111-1307, USA. */
\
ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT)); \
ASM_OUTPUT_LABEL (FILE, NAME); \
- fprintf (FILE, "\t.space\t%d\n", SIZE); \
+ fprintf (FILE, "\t.space\t%d\n", SIZE ? SIZE : 1); \
} \
while (0)
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index e3686b0b73c..1a06ed12ef9 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -27,11 +27,11 @@
#include "real.h"
#include "insn-config.h"
#include "conditions.h"
-#include "output.h"
#include "insn-attr.h"
#include "flags.h"
#include "reload.h"
#include "tree.h"
+#include "output.h"
#include "expr.h"
#include "toplev.h"
#include "obstack.h"
@@ -338,7 +338,7 @@ avr_reg_class_from_letter (c)
return NO_REGS;
}
-/* Return non-zero if FUNC is a naked function. */
+/* Return nonzero if FUNC is a naked function. */
static int
avr_naked_function_p (func)
@@ -1313,60 +1313,60 @@ ret_cond_branch (x, len, reverse)
{
case GT:
if (cc_prev_status.flags & CC_OVERFLOW_UNUSABLE)
- return (len == 1 ? (AS1 (breq,_PC_+2) CR_TAB
+ return (len == 1 ? (AS1 (breq,.+2) CR_TAB
AS1 (brpl,%0)) :
- len == 2 ? (AS1 (breq,_PC_+4) CR_TAB
- AS1 (brmi,_PC_+2) CR_TAB
+ len == 2 ? (AS1 (breq,.+4) CR_TAB
+ AS1 (brmi,.+2) CR_TAB
AS1 (rjmp,%0)) :
- (AS1 (breq,_PC_+6) CR_TAB
- AS1 (brmi,_PC_+4) CR_TAB
+ (AS1 (breq,.+6) CR_TAB
+ AS1 (brmi,.+4) CR_TAB
AS1 (jmp,%0)));
else
- return (len == 1 ? (AS1 (breq,_PC_+2) CR_TAB
+ return (len == 1 ? (AS1 (breq,.+2) CR_TAB
AS1 (brge,%0)) :
- len == 2 ? (AS1 (breq,_PC_+4) CR_TAB
- AS1 (brlt,_PC_+2) CR_TAB
+ len == 2 ? (AS1 (breq,.+4) CR_TAB
+ AS1 (brlt,.+2) CR_TAB
AS1 (rjmp,%0)) :
- (AS1 (breq,_PC_+6) CR_TAB
- AS1 (brlt,_PC_+4) CR_TAB
+ (AS1 (breq,.+6) CR_TAB
+ AS1 (brlt,.+4) CR_TAB
AS1 (jmp,%0)));
case GTU:
- return (len == 1 ? (AS1 (breq,_PC_+2) CR_TAB
+ return (len == 1 ? (AS1 (breq,.+2) CR_TAB
AS1 (brsh,%0)) :
- len == 2 ? (AS1 (breq,_PC_+4) CR_TAB
- AS1 (brlo,_PC_+2) CR_TAB
+ len == 2 ? (AS1 (breq,.+4) CR_TAB
+ AS1 (brlo,.+2) CR_TAB
AS1 (rjmp,%0)) :
- (AS1 (breq,_PC_+6) CR_TAB
- AS1 (brlo,_PC_+4) CR_TAB
+ (AS1 (breq,.+6) CR_TAB
+ AS1 (brlo,.+4) CR_TAB
AS1 (jmp,%0)));
case LE:
if (cc_prev_status.flags & CC_OVERFLOW_UNUSABLE)
return (len == 1 ? (AS1 (breq,%0) CR_TAB
AS1 (brmi,%0)) :
- len == 2 ? (AS1 (breq,_PC_+2) CR_TAB
- AS1 (brpl,_PC_+2) CR_TAB
+ len == 2 ? (AS1 (breq,.+2) CR_TAB
+ AS1 (brpl,.+2) CR_TAB
AS1 (rjmp,%0)) :
- (AS1 (breq,_PC_+2) CR_TAB
- AS1 (brpl,_PC_+4) CR_TAB
+ (AS1 (breq,.+2) CR_TAB
+ AS1 (brpl,.+4) CR_TAB
AS1 (jmp,%0)));
else
return (len == 1 ? (AS1 (breq,%0) CR_TAB
AS1 (brlt,%0)) :
- len == 2 ? (AS1 (breq,_PC_+2) CR_TAB
- AS1 (brge,_PC_+2) CR_TAB
+ len == 2 ? (AS1 (breq,.+2) CR_TAB
+ AS1 (brge,.+2) CR_TAB
AS1 (rjmp,%0)) :
- (AS1 (breq,_PC_+2) CR_TAB
- AS1 (brge,_PC_+4) CR_TAB
+ (AS1 (breq,.+2) CR_TAB
+ AS1 (brge,.+4) CR_TAB
AS1 (jmp,%0)));
case LEU:
return (len == 1 ? (AS1 (breq,%0) CR_TAB
AS1 (brlo,%0)) :
- len == 2 ? (AS1 (breq,_PC_+2) CR_TAB
- AS1 (brsh,_PC_+2) CR_TAB
+ len == 2 ? (AS1 (breq,.+2) CR_TAB
+ AS1 (brsh,.+2) CR_TAB
AS1 (rjmp,%0)) :
- (AS1 (breq,_PC_+2) CR_TAB
- AS1 (brsh,_PC_+4) CR_TAB
+ (AS1 (breq,.+2) CR_TAB
+ AS1 (brsh,.+4) CR_TAB
AS1 (jmp,%0)));
default:
if (reverse)
@@ -1376,10 +1376,10 @@ ret_cond_branch (x, len, reverse)
case 1:
return AS1 (br%k1,%0);
case 2:
- return (AS1 (br%j1,_PC_+2) CR_TAB
+ return (AS1 (br%j1,.+2) CR_TAB
AS1 (rjmp,%0));
default:
- return (AS1 (br%j1,_PC_+4) CR_TAB
+ return (AS1 (br%j1,.+4) CR_TAB
AS1 (jmp,%0));
}
}
@@ -1390,10 +1390,10 @@ ret_cond_branch (x, len, reverse)
case 1:
return AS1 (br%j1,%0);
case 2:
- return (AS1 (br%k1,_PC_+2) CR_TAB
+ return (AS1 (br%k1,.+2) CR_TAB
AS1 (rjmp,%0));
default:
- return (AS1 (br%k1,_PC_+4) CR_TAB
+ return (AS1 (br%k1,.+4) CR_TAB
AS1 (jmp,%0));
}
}
@@ -4433,7 +4433,7 @@ adjust_insn_length (insn, len)
return len;
}
-/* Return non-zero if register REG dead after INSN */
+/* Return nonzero if register REG dead after INSN */
int
reg_unused_after (insn, reg)
@@ -4444,7 +4444,7 @@ reg_unused_after (insn, reg)
|| (REG_P(reg) && _reg_unused_after (insn, reg)));
}
-/* Return non-zero if REG is not used after INSN.
+/* Return nonzero if REG is not used after INSN.
We assume REG is a reload reg, and therefore does
not live past labels. It may live past calls or jumps though. */
@@ -4887,8 +4887,7 @@ asm_file_start (file)
"__SP_L__ = 0x3d\n", file);
fputs ("__tmp_reg__ = 0\n"
- "__zero_reg__ = 1\n"
- "_PC_ = 2\n", file);
+ "__zero_reg__ = 1\n", file);
/* FIXME: output these only if there is anything in the .data / .bss
sections - some code size could be saved by not linking in the
@@ -5250,7 +5249,7 @@ avr_function_value (type, func)
return gen_rtx (REG, BLKmode, RET_REGISTER + 2 - offs);
}
-/* Returns non-zero if the number MASK has only one bit set. */
+/* Returns nonzero if the number MASK has only one bit set. */
int
mask_one_bit_p (mask)
@@ -5596,7 +5595,7 @@ avr_out_sbxx_branch (insn, operands)
}
if (long_jump)
- return (AS1 (rjmp,_PC_+4) CR_TAB
+ return (AS1 (rjmp,.+4) CR_TAB
AS1 (jmp,%3));
if (!reverse)
return AS1 (rjmp,%3);
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index cf62b8b71d2..4dcef89b91e 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -675,7 +675,7 @@ enum reg_class {
machines allow copying all registers to and from memory, but
require a scratch register for stores to some memory locations
(e.g., those with symbolic address on the RT, and those with
- certain symbolic address on the Sparc when compiling PIC). In
+ certain symbolic address on the SPARC when compiling PIC). In
some cases, both an intermediate and a scratch register are
required.
@@ -731,7 +731,7 @@ enum reg_class {
/* `SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)'
Certain machines have the property that some registers cannot be
copied to some other registers without using memory. Define this
- macro on those machines to be a C expression that is non-zero if
+ macro on those machines to be a C expression that is nonzero if
objects of mode M in registers of CLASS1 can only be copied to
registers of class CLASS2 by storing a register of CLASS1 into
memory and loading that memory location into a register of CLASS2.
@@ -755,16 +755,16 @@ enum reg_class {
classes that there would not be enough registers to use as spill
registers if this were done.
- Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero
- value on these machines. When this macro has a non-zero value, the
+ Define `SMALL_REGISTER_CLASSES' to be an expression with a nonzero
+ value on these machines. When this macro has a nonzero value, the
compiler allows registers explicitly used in the rtl to be used as
spill registers but avoids extending the lifetime of these
registers.
- It is always safe to define this macro with a non-zero value, but
+ It is always safe to define this macro with a nonzero value, but
if you unnecessarily define it, you will reduce the amount of
optimizations that can be performed in some cases. If you do not
- define this macro with a non-zero value when it is required, the
+ define this macro with a nonzero value when it is required, the
compiler will run out of spill registers and print a fatal error
message. For most machines, you should not define this macro at
all. */
@@ -999,7 +999,7 @@ enum reg_class {
|| (FROM) == FRAME_POINTER_REGNUM+1) \
&& ! FRAME_POINTER_REQUIRED \
))
-/* A C expression that returns non-zero if the compiler is allowed to
+/* A C expression that returns nonzero if the compiler is allowed to
try to replace register number FROM-REG with register number
TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is
defined, and will usually be the constant 1, since most of the
@@ -1115,7 +1115,7 @@ enum reg_class {
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the
definition of this macro to determine if this argument is of a
type that must be passed in the stack. If `REG_PARM_STACK_SPACE'
- is not defined and `FUNCTION_ARG' returns non-zero for such an
+ is not defined and `FUNCTION_ARG' returns nonzero for such an
argument, the compiler will abort. If `REG_PARM_STACK_SPACE' is
defined, the argument will be computed in the stack and then
loaded into a register. */
@@ -1307,8 +1307,6 @@ extern int avr_reg_order[];
addressing. */
#define HAVE_PRE_DECREMENT 1
-/* #define HAVE_PRE_INCREMENT
- #define HAVE_POST_DECREMENT */
/* Similar for other kinds of addressing. */
#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)
@@ -1679,10 +1677,10 @@ do { \
cost many times greater than aligned accesses, for example if they
are emulated in a trap handler.
- When this macro is non-zero, the compiler will act as if
- `STRICT_ALIGNMENT' were non-zero when generating code for block
+ When this macro is nonzero, the compiler will act as if
+ `STRICT_ALIGNMENT' were nonzero when generating code for block
moves. This can cause significantly more instructions to be
- produced. Therefore, do not set this macro non-zero if unaligned
+ produced. Therefore, do not set this macro nonzero if unaligned
accesses only add a cycle or two to the time for a memory access.
If the value of this macro is always zero, it need not be defined.
@@ -1845,9 +1843,9 @@ progmem_section () \
#define OBJC_PROLOGUE {}
/* A C statement to output any assembler statements which are
- required to precede any Objective C object definitions or message
+ required to precede any Objective-C object definitions or message
sending. The statement is executed only when compiling an
- Objective C program. */
+ Objective-C program. */
#define ASM_OUTPUT_ASCII(FILE, P, SIZE) gas_output_ascii (FILE,P,SIZE)
@@ -2103,32 +2101,13 @@ do { \
setting the `DECL_ONE_ONLY' flag is enough to mark a declaration to
be emitted as one-only. */
-#define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) \
-fprintf(STREAM, ".%s%d:\n", PREFIX, NUM)
-/* A C statement to output to the stdio stream STREAM a label whose
- name is made from the string PREFIX and the number NUM.
-
- It is absolutely essential that these labels be distinct from the
- labels used for user-level functions and variables. Otherwise,
- certain programs will have name conflicts with internal labels.
-
- It is desirable to exclude internal labels from the symbol table
- of the object file. Most assemblers have a naming convention for
- labels that should be excluded; on many systems, the letter `L' at
- the beginning of a label has this effect. You should find out what
- convention your system uses, and follow it.
-
- The usual definition of this macro is as follows:
-
- fprintf (STREAM, "L%s%d:\n", PREFIX, NUM) */
-
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
sprintf (STRING, "*.%s%d", PREFIX, NUM)
/* A C statement to store into the string STRING a label whose name
is made from the string PREFIX and the number NUM.
This string, when output subsequently by `assemble_name', should
- produce the output that `ASM_OUTPUT_INTERNAL_LABEL' would produce
+ produce the output that `(*targetm.asm_out.internal_label)' would produce
with the same PREFIX and NUM.
If the string begins with `*', then `assemble_name' will output
@@ -2139,27 +2118,6 @@ sprintf (STRING, "*.%s%d", PREFIX, NUM)
`ASM_OUTPUT_LABELREF' is also part of your machine description, so
you should know what it does on your machine.) */
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
-/* A C expression to assign to OUTVAR (which is a variable of type
- `char *') a newly allocated string made from the string NAME and
- the number NUMBER, with some suitable punctuation added. Use
- `alloca' to get space for the string.
-
- The string will be used as an argument to `ASM_OUTPUT_LABELREF' to
- produce an assembler label for an internal static variable whose
- name is NAME. Therefore, the string must be such as to result in
- valid assembler code. The argument NUMBER is different each time
- this macro is executed; it prevents conflicts between
- similarly-named internal static variables in different scopes.
-
- Ideally this string should not be a valid C identifier, to prevent
- any conflict with the user's own symbols. Most assemblers allow
- periods or percent signs in assembler symbols; putting at least
- one of these between the name and the number will suffice. */
-
/* `ASM_OUTPUT_WEAK_ALIAS (STREAM, NAME, VALUE)'
A C statement to output to the stdio stream STREAM assembler code
which defines (equates) the weak symbol NAME to have the value
@@ -2304,18 +2262,18 @@ sprintf (STRING, "*.%s%d", PREFIX, NUM)
The definition should be a C statement to output to the stdio
stream STREAM an assembler pseudo-instruction to generate a
reference to a label. VALUE is the number of an internal label
- whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'. For
+ whose definition is output using `(*targetm.asm_out.internal_label)'. For
example,
fprintf (STREAM, "\t.word L%d\n", VALUE) */
#define ASM_OUTPUT_CASE_LABEL(STREAM, PREFIX, NUM, TABLE) \
- progmem_section (), ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM)
+ progmem_section (), (*targetm.asm_out.internal_label) (STREAM, PREFIX, NUM)
/* `ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE)'
Define this if the label before a jump-table needs to be output
specially. The first three arguments are the same as for
- `ASM_OUTPUT_INTERNAL_LABEL'; the fourth argument is the jump-table
+ `(*targetm.asm_out.internal_label)'; the fourth argument is the jump-table
which follows (a `jump_insn' containing an `addr_vec' or
`addr_diff_vec').
@@ -2323,7 +2281,7 @@ sprintf (STRING, "*.%s%d", PREFIX, NUM)
the table.
If this macro is not defined, these labels are output with
- `ASM_OUTPUT_INTERNAL_LABEL'. */
+ `(*targetm.asm_out.internal_label)'. */
/* `ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE)'
Define this if something special must be output at the end of a
@@ -2523,15 +2481,13 @@ extern int avr_case_values_threshold;
Do not define this macro if it does not need to do anything. */
-#define ASM_SPEC "%{mmcu=*:-mmcu=%*}"
-/* A C string constant that tells the GNU CC driver program options to
- pass to the assembler. It can also specify how to translate
- options you give to GNU CC into options for GNU CC to pass to the
- assembler. See the file `sun3.h' for an example of this.
+#define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
+ %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
+ %{!fexceptions:-fno-exceptions}"
+/* A C string constant that tells the GNU CC drvier program options to
+ pass to `cc1plus'. */
- Do not define this macro if it does not need to do anything. */
-
-#define ASM_FINAL_SPEC ""
+#define ASM_SPEC "%{mmcu=*:-mmcu=%*}"
/* A C string constant that tells the GNU CC driver program how to
run any programs which cleanup after the normal assembler.
Normally, this is not needed. See the file `mips.h' for an
@@ -2684,8 +2640,6 @@ extern struct rtx_def *tmp_reg_rtx;
extern struct rtx_def *zero_reg_rtx;
extern struct rtx_def *ldi_reg_rtx;
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
/* Get the standard ELF stabs definitions. */
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index a285fef4f4a..dd51f0e7240 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -356,13 +356,15 @@
"{
rtx addr0, addr1;
int cnt8;
+ enum machine_mode mode;
if (GET_CODE (operands[2]) != CONST_INT)
FAIL;
cnt8 = byte_immediate_operand (operands[2], GET_MODE (operands[2]));
- operands[2] = copy_to_mode_reg (cnt8 ? QImode : HImode, operands[2]);
+ mode = cnt8 ? QImode : HImode;
+ operands[2] = copy_to_mode_reg (mode,
+ gen_int_mode (INTVAL (operands[2]), mode));
operands[4] = operands[2];
-
addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
@@ -385,7 +387,7 @@
"ld __tmp_reg__,%a1+
st %a0+,__tmp_reg__
dec %2
- brne _PC_-8"
+ brne .-8"
[(set_attr "length" "4")
(set_attr "cc" "clobber")])
@@ -403,13 +405,13 @@
return (AS2 (ld,__tmp_reg__,%a1+) CR_TAB
AS2 (st,%a0+,__tmp_reg__) CR_TAB
AS2 (sbiw,%A2,1) CR_TAB
- AS1 (brne,_PC_-8));
+ AS1 (brne,.-8));
else
return (AS2 (ld,__tmp_reg__,%a1+) CR_TAB
AS2 (st,%a0+,__tmp_reg__) CR_TAB
AS2 (subi,%A2,1) CR_TAB
AS2 (sbci,%B2,0) CR_TAB
- AS1 (brne,_PC_-10));
+ AS1 (brne,.-10));
}"
[(set_attr "length" "4,5")
(set_attr "cc" "clobber,clobber")])
@@ -428,12 +430,15 @@
"{
rtx addr0;
int cnt8;
+ enum machine_mode mode;
if (GET_CODE (operands[1]) != CONST_INT)
FAIL;
cnt8 = byte_immediate_operand (operands[1], GET_MODE (operands[1]));
- operands[1] = copy_to_mode_reg (cnt8 ? QImode : HImode, operands[1]);
+ mode = cnt8 ? QImode : HImode;
+ operands[1] = copy_to_mode_reg (mode,
+ gen_int_mode (INTVAL (operands[1]), mode));
operands[3] = operands[1];
addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
@@ -452,7 +457,7 @@
""
"st %a0+,__zero_reg__
dec %1
- brne _PC_-6"
+ brne .-6"
[(set_attr "length" "3")
(set_attr "cc" "clobber")])
@@ -468,12 +473,12 @@
if (which_alternative==0)
return (AS2 (st,%a0+,__zero_reg__) CR_TAB
AS2 (sbiw,%A1,1) CR_TAB
- AS1 (brne,_PC_-6));
+ AS1 (brne,.-6));
else
return (AS2 (st,%a0+,__zero_reg__) CR_TAB
AS2 (subi,%A1,1) CR_TAB
AS2 (sbci,%B1,0) CR_TAB
- AS1 (brne,_PC_-8));
+ AS1 (brne,.-8));
}"
[(set_attr "length" "3,4")
(set_attr "cc" "clobber,clobber")])
@@ -507,7 +512,7 @@
""
"ld __tmp_reg__,%a0+
tst __tmp_reg__
- brne _PC_-6"
+ brne .-6"
[(set_attr "length" "3")
(set_attr "cc" "clobber")])
@@ -2418,10 +2423,10 @@
case 1:
return AS1 (brcc,%2);
case 2:
- return (AS1 (brcs,_PC_+2) CR_TAB
+ return (AS1 (brcs,.+2) CR_TAB
AS1 (rjmp,%2));
}
- return (AS1 (brcs,_PC_+4) CR_TAB
+ return (AS1 (brcs,.+4) CR_TAB
AS1 (jmp,%2));
}")
@@ -2453,10 +2458,10 @@
case 1:
return AS1 (brcc,%2);
case 2:
- return (AS1 (brcs,_PC_+2) CR_TAB
+ return (AS1 (brcs,.+2) CR_TAB
AS1 (rjmp,%2));
}
- return (AS1 (brcs,_PC_+4) CR_TAB
+ return (AS1 (brcs,.+4) CR_TAB
AS1 (jmp,%2));
}")
@@ -2483,10 +2488,10 @@
case 1:
return AS1 (brcc,%1);
case 2:
- return (AS1 (brcs,_PC_+2) CR_TAB
+ return (AS1 (brcs,.+2) CR_TAB
AS1 (rjmp,%1));
}
- return (AS1 (brcs,_PC_+4) CR_TAB
+ return (AS1 (brcs,.+4) CR_TAB
AS1 (jmp,%1));
}")
diff --git a/gcc/config/c4x/c4x-c.c b/gcc/config/c4x/c4x-c.c
index 5a680f554d9..36d78fb8505 100644
--- a/gcc/config/c4x/c4x-c.c
+++ b/gcc/config/c4x/c4x-c.c
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
#include "toplev.h"
#include "cpplib.h"
#include "c-pragma.h"
-#include "c4x-protos.h"
+#include "tm_p.h"
static int c4x_parse_pragma PARAMS ((const char *, tree *, tree *));
diff --git a/gcc/config/c4x/c4x.c b/gcc/config/c4x/c4x.c
index 2ed42bee362..354ac76d1fa 100644
--- a/gcc/config/c4x/c4x.c
+++ b/gcc/config/c4x/c4x.c
@@ -46,7 +46,7 @@ Boston, MA 02111-1307, USA. */
#include "ggc.h"
#include "cpplib.h"
#include "toplev.h"
-#include "c4x-protos.h"
+#include "tm_p.h"
#include "target.h"
#include "target-def.h"
@@ -294,6 +294,11 @@ c4x_override_options ()
This provides compatibility with the old -mno-aliases option. */
if (! TARGET_ALIASES && ! flag_argument_noalias)
flag_argument_noalias = 1;
+
+ /* We're C4X floating point, not IEEE floating point. */
+ memset (real_format_for_mode, 0, sizeof real_format_for_mode);
+ real_format_for_mode[QFmode - QFmode] = &c4x_single_format;
+ real_format_for_mode[HFmode - QFmode] = &c4x_extended_format;
}
@@ -436,7 +441,7 @@ c4x_hard_regno_mode_ok (regno, mode)
return 0;
}
-/* Return non-zero if REGNO1 can be renamed to REGNO2. */
+/* Return nonzero if REGNO1 can be renamed to REGNO2. */
int
c4x_hard_regno_rename_ok (regno1, regno2)
unsigned int regno1;
@@ -1469,7 +1474,7 @@ c4x_check_legit_addr (mode, addr, strict)
switch (code)
{
/* Register indirect with auto increment/decrement. We don't
- allow SP here---push_operand should recognise an operand
+ allow SP here---push_operand should recognize an operand
being pushed on the stack. */
case PRE_DEC:
@@ -1954,11 +1959,10 @@ c4x_print_operand (file, op, letter)
case CONST_DOUBLE:
{
- char str[30];
- REAL_VALUE_TYPE r;
+ char str[64];
- REAL_VALUE_FROM_CONST_DOUBLE (r, op);
- REAL_VALUE_TO_DECIMAL (r, "%20f", str);
+ real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (op),
+ sizeof (str), 0, 1);
fprintf (file, "%s", str);
}
break;
@@ -3366,10 +3370,10 @@ src_operand (op, mode)
|| GET_CODE (op) == CONST)
return 0;
- /* If TARGET_LOAD_DIRECT_MEMS is non-zero, disallow direct memory
+ /* If TARGET_LOAD_DIRECT_MEMS is nonzero, disallow direct memory
access to symbolic addresses. These operands will get forced
into a register and the movqi expander will generate a
- HIGH/LO_SUM pair if TARGET_EXPOSE_LDP is non-zero. */
+ HIGH/LO_SUM pair if TARGET_EXPOSE_LDP is nonzero. */
if (GET_CODE (op) == MEM
&& ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (op, 0)) == LABEL_REF
diff --git a/gcc/config/c4x/c4x.h b/gcc/config/c4x/c4x.h
index 80722cc32c6..5b91b398480 100644
--- a/gcc/config/c4x/c4x.h
+++ b/gcc/config/c4x/c4x.h
@@ -1470,7 +1470,7 @@ CUMULATIVE_ARGS;
Note that we return, rather than break so that rtx_cost doesn't
include CONST_COSTS otherwise expand_mult will think that it is
- cheaper to synthesise a multiply rather than to use a multiply
+ cheaper to synthesize a multiply rather than to use a multiply
instruction. I think this is because the algorithm synth_mult
doesn't take into account the loading of the operands, whereas the
calculation of mult_cost does.
@@ -1724,12 +1724,6 @@ c4x_file_end (FILE)
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
- fprintf (FILE, "%s%d:\n", 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.
@@ -1738,14 +1732,6 @@ c4x_file_end (FILE)
#define ASM_GENERATE_INTERNAL_LABEL(BUFFER, PREFIX, NUM) \
sprintf (BUFFER, "*%s%d", PREFIX, NUM)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s$%d", (NAME), (LABELNO)))
-
/* A C statement to output to the stdio stream STREAM assembler code which
defines (equates) the symbol NAME to have the value VALUE. */
@@ -1892,7 +1878,7 @@ do { \
to avoid conflict with TI's use of .def). */
#define SDB_DELIM "\n"
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* Don't use octal since this can confuse gas for the c4x. */
#define PUT_SDB_TYPE(a) fprintf(asm_out_file, "\t.type\t0x%x%s", a, SDB_DELIM)
diff --git a/gcc/config/c4x/c4x.md b/gcc/config/c4x/c4x.md
index b9ac85cffe8..2d52082da35 100644
--- a/gcc/config/c4x/c4x.md
+++ b/gcc/config/c4x/c4x.md
@@ -29,7 +29,7 @@
; for QImode and Pmode, whether Pmode was QImode or PQImode.
; For addresses we wouldn't have to have a clobber of the CC
; associated with each insn and we could use MPYI in address
-; calculations without having to synthesise a proper 32 bit multiply.
+; calculations without having to synthesize a proper 32 bit multiply.
; Additional C30/C40 instructions not coded:
; CALLcond, IACK, IDLE, LDE, LDFI, LDII, LDM, NORM, RETIcond
@@ -1360,7 +1360,7 @@
; If one of the operands is not a register, then we should
; emit two insns, using a scratch register. This will produce
; better code in loops if the source operand is invariant, since
-; the source reload can be optimised out. During reload we cannot
+; the source reload can be optimized out. During reload we cannot
; use change_address or force_reg which will allocate new pseudo regs.
; Unlike most other insns, the move insns can't be split with
@@ -2076,7 +2076,7 @@
{
if (GET_CODE (operands[2]) == CONST_INT)
{
- /* Let GCC try to synthesise the multiplication using shifts
+ /* Let GCC try to synthesize the multiplication using shifts
and adds. In most cases this will be more profitable than
using the C3x MPYI. */
FAIL;
@@ -3410,7 +3410,7 @@
; If one of the operands is not a register, then we should
; emit two insns, using a scratch register. This will produce
; better code in loops if the source operand is invariant, since
-; the source reload can be optimised out. During reload we cannot
+; the source reload can be optimized out. During reload we cannot
; use change_address or force_reg.
(define_expand "movqf"
[(set (match_operand:QF 0 "src_operand" "")
@@ -5317,7 +5317,7 @@
; Note we have to emit a dbu instruction if there are no delay slots
; to fill.
; Also note that GCC will try to reverse a loop to see if it can
-; utilise this instruction. However, if there are more than one
+; utilize this instruction. However, if there are more than one
; memory reference in the loop, it cannot guarantee that reversing
; the loop will work :( (see check_dbra_loop() in loop.c)
; Note that the C3x only decrements the 24 LSBs of the address register
@@ -5629,7 +5629,7 @@
; The current low overhead looping code is naff and is not failsafe
; If you want RTPB instructions to be generated, apply the patches
-; from www.elec.canterbury.ac.nz/c4x. This will utilise the
+; from www.elec.canterbury.ac.nz/c4x. This will utilize the
; doloop_begin and doloop_end patterns in this MD.
(define_expand "decrement_and_branch_on_count"
[(parallel [(set (pc)
@@ -7315,7 +7315,7 @@
; The following two peepholes remove an unecessary load
; often found at the end of a function. These peepholes
-; could be generalised to other binary operators. They shouldn't
+; could be generalized to other binary operators. They shouldn't
; be required if we run a post reload mop-up pass.
(define_peephole
[(parallel [(set (match_operand:QF 0 "ext_reg_operand" "")
diff --git a/gcc/config/c4x/libgcc.S b/gcc/config/c4x/libgcc.S
index 96b27d862ca..0335a0e217e 100644
--- a/gcc/config/c4x/libgcc.S
+++ b/gcc/config/c4x/libgcc.S
@@ -48,7 +48,7 @@ Boston, MA 02111-1307, USA. */
;
; r[i + 1] = r[i] * (2.0 - v * r[i])
;
-; The normalised error e[i] at the ith iteration is
+; The normalized error e[i] at the ith iteration is
;
; e[i] = (r - r[i]) / r = (1 / v - r[i]) * v = (1 - v * r[i])
;
diff --git a/gcc/config/c4x/t-c4x b/gcc/config/c4x/t-c4x
index aee0a7bb339..d1a83fb4231 100644
--- a/gcc/config/c4x/t-c4x
+++ b/gcc/config/c4x/t-c4x
@@ -7,8 +7,8 @@ LIB1ASMFUNCS = _divsf3 _divsi3 _udivsi3 _umodsi3 _modsi3 _mulsi3 \
TARGET_LIBGCC2_CFLAGS = -Dexit=unused_exit
-c4x-c.o: $(srcdir)/config/c4x/c4x-c.c $(srcdir)/config/c4x/c4x-protos.h \
- $(CONFIG_H) $(SYSTEM_H) cpplib.h $(TREE_H) c-pragma.h toplev.h
+c4x-c.o: $(srcdir)/config/c4x/c4x-c.c $(CONFIG_H) $(SYSTEM_H) cpplib.h \
+ $(TREE_H) c-pragma.h toplev.h $(TM_P_H)
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
MULTILIB_OPTIONS = m30 msmall mmemparm
diff --git a/gcc/config/chorus.h b/gcc/config/chorus.h
index 3e6bcca39cc..ae22334d867 100644
--- a/gcc/config/chorus.h
+++ b/gcc/config/chorus.h
@@ -19,8 +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. */
-#undef DWARF2_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
diff --git a/gcc/config/cris/cris-protos.h b/gcc/config/cris/cris-protos.h
index 4db5a2a54b4..7da668eeefa 100644
--- a/gcc/config/cris/cris-protos.h
+++ b/gcc/config/cris/cris-protos.h
@@ -52,12 +52,6 @@ extern rtx cris_expand_builtin_va_arg PARAMS ((tree, tree));
# endif
#endif /* RTX_CODE */
-#ifdef STDIO_INCLUDED
-# ifdef TREE_CODE
-extern void cris_asm_output_mi_thunk PARAMS ((FILE *, tree, int, tree));
-# endif
-#endif
-
#ifdef GCC_C_PRAGMA_H
extern void cris_pragma_expand_mul PARAMS ((cpp_reader *));
#endif
diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c
index a84933f6a1f..3d33a724594 100644
--- a/gcc/config/cris/cris.c
+++ b/gcc/config/cris/cris.c
@@ -101,6 +101,10 @@ static void cris_target_asm_function_epilogue
static void cris_encode_section_info PARAMS ((tree, int));
static void cris_operand_lossage PARAMS ((const char *, rtx));
+static void cris_asm_output_mi_thunk
+ PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
+
+
/* The function cris_target_asm_function_epilogue puts the last insn to
output here. It always fits; there won't be a symbol operand. Used in
delay_slots_for_epilogue and function_epilogue. */
@@ -153,6 +157,9 @@ int cris_cpu_version = CRIS_DEFAULT_CPU_VERSION;
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO cris_encode_section_info
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK cris_asm_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Predicate functions. */
@@ -2315,7 +2322,7 @@ cris_legitimate_pic_operand (x)
return ! cris_symbol (x) || cris_got_symbol (x);
}
-/* Return non-zero if there's a SYMBOL_REF or LABEL_REF hiding inside this
+/* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
CONSTANT_P. */
int
@@ -2352,7 +2359,7 @@ cris_symbol (x)
return 1;
}
-/* Return non-zero if there's a SYMBOL_REF or LABEL_REF hiding inside this
+/* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
CONSTANT_P, and the symbol does not need a GOT entry. Also set
current_function_uses_pic_offset_table if we're generating PIC and ever
see something that would need one. */
@@ -2410,7 +2417,7 @@ cris_gotless_symbol (x)
return 1;
}
-/* Return non-zero if there's a SYMBOL_REF or LABEL_REF hiding inside this
+/* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
CONSTANT_P, and the symbol needs a GOT entry. */
int
@@ -2570,23 +2577,27 @@ cris_override_options ()
init_machine_status = cris_init_machine_status;
}
-/* The ASM_OUTPUT_MI_THUNK worker. */
+/* The TARGET_ASM_OUTPUT_MI_THUNK worker. */
-void
+static void
cris_asm_output_mi_thunk (stream, thunkdecl, delta, funcdecl)
FILE *stream;
tree thunkdecl ATTRIBUTE_UNUSED;
- int delta;
+ HOST_WIDE_INT delta;
tree funcdecl;
{
if (delta > 0)
- fprintf (stream, "\tadd%s %d,$%s\n",
- ADDITIVE_SIZE_MODIFIER (delta), delta,
- reg_names[CRIS_FIRST_ARG_REG]);
+ {
+ fprintf (stream, "\tadd%s ", ADDITIVE_SIZE_MODIFIER (delta));
+ fprintf (stream, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (stream, ",$%s\n", reg_names[CRIS_FIRST_ARG_REG]);
+ }
else if (delta < 0)
- fprintf (stream, "\tsub%s %d,$%s\n",
- ADDITIVE_SIZE_MODIFIER (-delta), -delta,
- reg_names[CRIS_FIRST_ARG_REG]);
+ {
+ fprintf (stream, "\tsub%s ", ADDITIVE_SIZE_MODIFIER (-delta));
+ fprintf (stream, HOST_WIDE_INT_PRINT_DEC, -delta);
+ fprintf (stream, ",$%s\n", reg_names[CRIS_FIRST_ARG_REG]);
+ }
if (flag_pic)
{
diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h
index 94cb979e9fc..bd044f3a51a 100644
--- a/gcc/config/cris/cris.h
+++ b/gcc/config/cris/cris.h
@@ -122,7 +122,7 @@ extern const char *cris_elinux_stacksize_str;
someone will fight for us. This year in the mountains.
Note that for -melinux and -mlinux, command-line -isystem options are
emitted both before and after the synthesized one. We can't remove all
- of them: a %{<isystem} will only remove the first one and %{<isystem*}
+ of them: a %<isystem will only remove the first one and %<isystem*
will not do TRT. Those extra occurrences are harmless anyway. */
#define CPP_SPEC \
"-$ -D__CRIS_ABI_version=2\
@@ -1013,10 +1013,6 @@ struct cum_args {int regs;};
#define ELIGIBLE_FOR_EPILOGUE_DELAY(INSN, N) \
cris_eligible_for_epilogue_delay (INSN)
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
- cris_asm_output_mi_thunk(FILE, THUNK_FNDECL, DELTA, FUNCTION)
-
-
/* Node: Profiling */
#define FUNCTION_PROFILER(FILE, LABELNO) \
@@ -1030,7 +1026,7 @@ struct cum_args {int regs;};
/* We save the register number of the first anonymous argument in
first_vararg_reg, and take care of this in the function prologue.
- This behaviour is used by at least one more port (the ARM?), but
+ This behavior is used by at least one more port (the ARM?), but
may be unsafe when compiling nested functions. (With varargs? Hairy.)
Note that nested-functions is a GNU C extension.
@@ -1242,7 +1238,7 @@ struct cum_args {int regs;};
/* For now, don't do anything. GCC does a good job most often.
- Maybe we could do something about gcc:s misbehaviour when it
+ Maybe we could do something about gcc:s misbehavior when it
recalculates frame offsets for local variables, from fp+offs to
sp+offs. The resulting address expression gets screwed up
sometimes, but I'm not sure that it may be fixed here, since it is
@@ -1584,28 +1580,11 @@ call_ ## FUNC (void) \
handle (to #undef or ignore it) in a.out. */
#define HAVE_GAS_HIDDEN 1
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
- do \
- { \
- asm_fprintf (FILE, "%L%s%d:\n", PREFIX, NUM); \
- } \
- while (0)
-
/* Remove any previous definition (elfos.h). */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf (LABEL, "*%s%s%ld", LOCAL_LABEL_PREFIX, PREFIX, (long) NUM)
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- do \
- { \
- (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10); \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)); \
- } \
- while (0)
-
-
/* Node: Initialization */
/* (no definitions) */
diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md
index c92ec7fd2a4..1683192189c 100644
--- a/gcc/config/cris/cris.md
+++ b/gcc/config/cris/cris.md
@@ -4689,7 +4689,7 @@
;; Please also add a self-contained test-case.
;; We have trouble with and:s and shifts. Maybe something is broken in
-;; gcc? Or it could just be that bitfield insn expansion is a bit
+;; gcc? Or it could just be that bit-field insn expansion is a bit
;; suboptimal when not having extzv insns.
(define_peephole
diff --git a/gcc/config/d30v/d30v.c b/gcc/config/d30v/d30v.c
index 7aef4145882..8169d8ebd4f 100644
--- a/gcc/config/d30v/d30v.c
+++ b/gcc/config/d30v/d30v.c
@@ -1867,7 +1867,7 @@ debug_stack_info (info)
}
-/* Return non-zero if this function is known to have a null or 1 instruction epilogue. */
+/* Return nonzero if this function is known to have a null or 1 instruction epilogue. */
int
direct_return ()
@@ -1985,7 +1985,7 @@ d30v_function_arg_boundary (mode, type)
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
this macro to determine if this argument is of a type that must be passed in
the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
- returns non-zero for such an argument, the compiler will abort. If
+ returns nonzero for such an argument, the compiler will abort. If
`REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
stack and then loaded into a register. */
diff --git a/gcc/config/d30v/d30v.h b/gcc/config/d30v/d30v.h
index 763ed90687d..4ce9e9577b6 100644
--- a/gcc/config/d30v/d30v.h
+++ b/gcc/config/d30v/d30v.h
@@ -201,9 +201,6 @@ do { \
/* Defined in svr4.h. */
#define PCC_BITFIELD_TYPE_MATTERS 1
-
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
/* Layout of Source Language Data Types */
@@ -823,7 +820,7 @@ extern enum reg_class reg_class_from_letter[256];
registers, but not memory. Some machines allow copying all registers to and
from memory, but require a scratch register for stores to some memory
locations (e.g., those with symbolic address on the RT, and those with
- certain symbolic address on the Sparc when compiling PIC). In some cases,
+ certain symbolic address on the SPARC when compiling PIC). In some cases,
both an intermediate and a scratch register are required.
You should define these macros to indicate to the reload phase that it may
@@ -880,7 +877,7 @@ extern enum reg_class reg_class_from_letter[256];
/* Certain machines have the property that some registers cannot be copied to
some other registers without using memory. Define this macro on those
- machines to be a C expression that is non-zero if objects of mode M in
+ machines to be a C expression that is nonzero if objects of mode M in
registers of CLASS1 can only be copied to registers of class CLASS2 by
storing a register of CLASS1 into memory and loading that memory location
into a register of CLASS2.
@@ -923,15 +920,15 @@ extern enum reg_class reg_class_from_letter[256];
few registers of certain classes that there would not be enough registers to
use as spill registers if this were done.
- Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero value on
- these machines. When this macro has a non-zero value, the compiler allows
+ Define `SMALL_REGISTER_CLASSES' to be an expression with a nonzero value on
+ these machines. When this macro has a nonzero value, the compiler allows
registers explicitly used in the rtl to be used as spill registers but
avoids extending the lifetime of these registers.
- It is always safe to define this macro with a non-zero value, but if you
+ It is always safe to define this macro with a nonzero value, but if you
unnecessarily define it, you will reduce the amount of optimizations that
can be performed in some cases. If you do not define this macro with a
- non-zero value when it is required, the compiler will run out of spill
+ nonzero value when it is required, the compiler will run out of spill
registers and print a fatal error message. For most machines, you should
not define this macro at all. */
/* #define SMALL_REGISTER_CLASSES */
@@ -1109,7 +1106,7 @@ typedef struct d30v_stack {
/* If defined, a C expression that produces the machine-specific code to setup
the stack so that arbitrary frames can be accessed. For example, on the
- Sparc, we must flush all of the register windows to the stack before we can
+ SPARC, we must flush all of the register windows to the stack before we can
access arbitrary stack frames. This macro will seldom need to be defined. */
/* #define SETUP_FRAME_ADDRESSES() */
@@ -1355,7 +1352,7 @@ typedef struct d30v_stack {
{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM } \
}
-/* A C expression that returns non-zero if the compiler is allowed to try to
+/* A C expression that returns nonzero if the compiler is allowed to try to
replace register number FROM-REG with register number TO-REG. This macro
need only be defined if `ELIMINABLE_REGS' is defined, and will usually be
the constant 1, since most of the cases preventing register elimination are
@@ -1535,7 +1532,7 @@ typedef struct d30v_stack {
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
this macro to determine if this argument is of a type that must be passed in
the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
- returns non-zero for such an argument, the compiler will abort. If
+ returns nonzero for such an argument, the compiler will abort. If
`REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
stack and then loaded into a register. */
@@ -1882,37 +1879,6 @@ typedef struct d30v_stack {
`DELAY_SLOTS_FOR_EPILOGUE'. */
/* #define ELIGIBLE_FOR_EPILOGUE_DELAY(INSN, N) */
-/* A C compound statement that outputs the assembler code for a thunk function,
- used to implement C++ virtual function calls with multiple inheritance. The
- thunk acts as a wrapper around a virtual function, adjusting the implicit
- object parameter before handing control off to the real function.
-
- First, emit code to add the integer DELTA to the location that contains the
- incoming first argument. Assume that this argument contains a pointer, and
- is the one used to pass the `this' pointer in C++. This is the incoming
- argument *before* the function prologue, e.g. `%o0' on a sparc. The
- addition must preserve the values of all other incoming arguments.
-
- After the addition, emit code to jump to FUNCTION, which is a
- `FUNCTION_DECL'. This is a direct pure jump, not a call, and does not touch
- the return address. Hence returning from FUNCTION will return to whoever
- called the current `thunk'.
-
- The effect must be as if FUNCTION had been called directly with the
- adjusted first argument. This macro is responsible for emitting
- all of the code for a thunk function; output_function_prologue()
- and output_function_epilogue() are not invoked.
-
- The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already been
- extracted from it.) It might possibly be useful on some targets, but
- probably not.
-
- If you do not define this macro, the target-independent code in the C++
- frontend will generate a less efficient heavyweight thunk that calls
- FUNCTION instead of jumping to it. The generic approach does not support
- varargs. */
-/* #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) */
-
/* A C structure for machine-specific, per-function data.
This is added to the cfun structure. */
typedef struct machine_function GTY(())
@@ -2007,7 +1973,7 @@ typedef struct machine_function GTY(())
(VALIST) = d30v_build_va_list ()
-/* Implement the stdarg/varargs va_start macro. STDARG_P is non-zero if this
+/* Implement the stdarg/varargs va_start macro. STDARG_P is nonzero if this
is stdarg.h instead of varargs.h. VALIST is the tree of the va_list
variable to initialize. NEXTARG is the machine independent notion of the
'next' argument after the variable arguments. If not defined, a standard
@@ -2225,7 +2191,7 @@ typedef struct machine_function GTY(())
Defined in svr4.h. */
/* #define TARGET_MEM_FUNCTIONS */
-/* Define this macro to generate code for Objective C message sending using the
+/* Define this macro to generate code for Objective-C message sending using the
calling convention of the NeXT system. This calling convention involves
passing the object, the selector and the method arguments all at once to the
method-lookup library function.
@@ -2241,9 +2207,7 @@ typedef struct machine_function GTY(())
#define HAVE_POST_INCREMENT 1
/* Similar for other kinds of addressing. */
-/* #define HAVE_PRE_INCREMENT 0 */
#define HAVE_POST_DECREMENT 1
-/* #define HAVE_PRE_DECREMENT 0 */
/* A C expression that is 1 if the RTX X is a constant which is a valid
address. On most machines, this can be defined as `CONSTANT_P (X)', but a
@@ -2415,7 +2379,7 @@ do { \
/* #define EXTRA_CC_MODES */
/* Returns a mode from class `MODE_CC' to be used when comparison operation
- code OP is applied to rtx X and Y. For example, on the Sparc,
+ code OP is applied to rtx X and Y. For example, on the SPARC,
`SELECT_CC_MODE' is defined as (see *note Jump Patterns::. for a
description of the reason for this definition)
@@ -2453,7 +2417,7 @@ do { \
You need not define this macro if it would always returns zero or if the
floating-point format is anything other than `IEEE_FLOAT_FORMAT'. For
- example, here is the definition used on the Sparc, where floating-point
+ example, here is the definition used on the SPARC, where floating-point
inequality comparisons are always given `CCFPEmode':
#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode) */
@@ -2610,10 +2574,10 @@ extern const char *d30v_branch_cost_string;
times greater than aligned accesses, for example if they are emulated in a
trap handler.
- When this macro is non-zero, the compiler will act as if `STRICT_ALIGNMENT'
- were non-zero when generating code for block moves. This can cause
+ When this macro is nonzero, the compiler will act as if `STRICT_ALIGNMENT'
+ were nonzero when generating code for block moves. This can cause
significantly more instructions to be produced. Therefore, do not set this
- macro non-zero if unaligned accesses only add a cycle or two to the time for
+ macro nonzero if unaligned accesses only add a cycle or two to the time for
a memory access.
If the value of this macro is always zero, it need not be defined. */
@@ -2803,8 +2767,8 @@ extern const char *d30v_branch_cost_string;
/* #define ASM_OUTPUT_IDENT(STREAM, STRING) */
/* A C statement to output any assembler statements which are required to
- precede any Objective C object definitions or message sending. The
- statement is executed only when compiling an Objective C program. */
+ precede any Objective-C object definitions or message sending. The
+ statement is executed only when compiling an Objective-C program. */
/* #define OBJC_PROLOGUE */
@@ -2821,7 +2785,7 @@ extern const char *d30v_branch_cost_string;
/* #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) */
/* You may define this macro as a C expression. You should define the
- expression to have a non-zero value if GNU CC should output the
+ expression to have a nonzero value if GNU CC should output the
constant pool for a function before the code for the function, or
a zero value if GNU CC should output the constant pool after the
function. If you do not define this macro, the usual case, GNU CC
@@ -2853,7 +2817,7 @@ extern const char *d30v_branch_cost_string;
outputting the label definition at the proper place. Here is how to do
this:
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LC", LABELNO);
+ (*targetm.asm_out.internal_label) (FILE, "LC", LABELNO);
When you output a pool entry specially, you should end with a `goto' to the
label JUMPTO. This will prevent the same pool entry from being output a
@@ -3109,31 +3073,11 @@ extern const char *d30v_branch_cost_string;
is in most Berkeley Unix systems. This macro is used in `assemble_name'. */
/* #define ASM_OUTPUT_LABELREF(STREAM, NAME) */
-/* A C statement to output to the stdio stream STREAM a label whose name is
- made from the string PREFIX and the number NUM.
-
- It is absolutely essential that these labels be distinct from the labels
- used for user-level functions and variables. Otherwise, certain programs
- will have name conflicts with internal labels.
-
- It is desirable to exclude internal labels from the symbol table of the
- object file. Most assemblers have a naming convention for labels that
- should be excluded; on many systems, the letter `L' at the beginning of a
- label has this effect. You should find out what convention your system
- uses, and follow it.
-
- The usual definition of this macro is as follows:
-
- fprintf (STREAM, "L%s%d:\n", PREFIX, NUM)
-
- Defined in svr4.h. */
-/* #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) */
-
/* A C statement to store into the string STRING a label whose name is made
from the string PREFIX and the number NUM.
This string, when output subsequently by `assemble_name', should produce the
- output that `ASM_OUTPUT_INTERNAL_LABEL' would produce with the same PREFIX
+ output that `(*targetm.asm_out.internal_label)' would produce with the same PREFIX
and NUM.
If the string begins with `*', then `assemble_name' will output the rest of
@@ -3152,28 +3096,6 @@ do { \
} while (0)
*/
-/* A C expression to assign to OUTVAR (which is a variable of type `char *') a
- newly allocated string made from the string NAME and the number NUMBER, with
- some suitable punctuation added. Use `alloca' to get space for the string.
-
- The string will be used as an argument to `ASM_OUTPUT_LABELREF' to produce
- an assembler label for an internal static variable whose name is NAME.
- Therefore, the string must be such as to result in valid assembler code.
- The argument NUMBER is different each time this macro is executed; it
- prevents conflicts between similarly-named internal static variables in
- different scopes.
-
- Ideally this string should not be a valid C identifier, to prevent any
- conflict with the user's own symbols. Most assemblers allow periods or
- percent signs in assembler symbols; putting at least one of these between
- the name and the number will suffice. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \
-do { \
- (OUTVAR) = (char *) alloca (strlen ((NAME)) + 12); \
- sprintf ((OUTVAR), "%s.%ld", (NAME), (long)(NUMBER)); \
-} while (0)
-
/* A C statement to output to the stdio stream STREAM assembler code which
defines (equates) the symbol NAME to have the value VALUE.
@@ -3529,7 +3451,7 @@ do { \
The definition should be a C statement to output to the stdio stream STREAM
an assembler pseudo-instruction to generate a difference between two labels.
VALUE and REL are the numbers of two internal labels. The definitions of
- these labels are output using `ASM_OUTPUT_INTERNAL_LABEL', and they must be
+ these labels are output using `(*targetm.asm_out.internal_label)', and they must be
printed in the same way here. For example,
fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL) */
@@ -3543,7 +3465,7 @@ fprintf (STREAM, "\t.word .L%d-.L%d\n", VALUE, REL)
The definition should be a C statement to output to the stdio stream STREAM
an assembler pseudo-instruction to generate a reference to a label. VALUE
is the number of an internal label whose definition is output using
- `ASM_OUTPUT_INTERNAL_LABEL'. For example,
+ `(*targetm.asm_out.internal_label)'. For example,
fprintf (STREAM, "\t.word L%d\n", VALUE) */
@@ -3551,7 +3473,7 @@ fprintf (STREAM, "\t.word .L%d-.L%d\n", VALUE, REL)
fprintf (STREAM, "\t.word .L%d\n", VALUE)
/* Define this if the label before a jump-table needs to be output specially.
- The first three arguments are the same as for `ASM_OUTPUT_INTERNAL_LABEL';
+ The first three arguments are the same as for `(*targetm.asm_out.internal_label)';
the fourth argument is the jump-table which follows (a `jump_insn'
containing an `addr_vec' or `addr_diff_vec').
@@ -3559,7 +3481,7 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
table.
If this macro is not defined, these labels are output with
- `ASM_OUTPUT_INTERNAL_LABEL'.
+ `(*targetm.asm_out.internal_label)'.
Defined in svr4.h. */
/* #define ASM_OUTPUT_CASE_LABEL(STREAM, PREFIX, NUM, TABLE) */
@@ -4123,7 +4045,7 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
/* A C expression that is nonzero if on this machine the number of bits
actually used for the count of a shift operation is equal to the number of
bits needed to represent the size of the object being shifted. When this
- macro is non-zero, the compiler will assume that it is safe to omit a
+ macro is nonzero, the compiler will assume that it is safe to omit a
sign-extend, zero-extend, and certain bitwise `and' instructions that
truncates the count of a shift operation. On machines that have
instructions that act on bitfields at variable positions, which may include
@@ -4132,7 +4054,7 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
instructions.
If both types of instructions truncate the count (for shifts) and position
- (for bitfield operations), or if no variable-position bitfield instructions
+ (for bit-field operations), or if no variable-position bit-field instructions
exist, you should define this macro.
However, on some machines, such as the 80386 and the 680x0, truncation only
@@ -4234,7 +4156,7 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
instructions. */
/* #define STORE_FLAG_VALUE */
-/* A C expression that gives a non-zero floating point value that is returned
+/* A C expression that gives a nonzero floating point value that is returned
when comparison operators with floating-point results are true. Define this
macro on machine that have comparison operations that return floating-point
values. If there are no such operations, do not define this macro. */
diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h
index efce90af00c..5fea152eeb9 100644
--- a/gcc/config/darwin-protos.h
+++ b/gcc/config/darwin-protos.h
@@ -112,6 +112,8 @@ extern void machopic_lazy_symbol_ptr_section PARAMS ((void));
extern void machopic_nl_symbol_ptr_section PARAMS ((void));
extern void machopic_symbol_stub_section PARAMS ((void));
extern void machopic_picsymbol_stub_section PARAMS ((void));
+extern void machopic_output_stub PARAMS ((FILE *, const char *, const char *));
extern void darwin_exception_section PARAMS ((void));
extern void darwin_eh_frame_section PARAMS ((void));
extern void darwin_globalize_label PARAMS ((FILE *, const char *));
+extern void darwin_asm_output_dwarf_delta PARAMS ((FILE *, int, const char *, const char *));
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index fc162d07fff..3722950f634 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -38,9 +38,7 @@ Boston, MA 02111-1307, USA. */
#include "function.h"
#include "ggc.h"
#include "langhooks.h"
-#include "darwin-protos.h"
-
-extern void machopic_output_stub PARAMS ((FILE *, const char *, const char *));
+#include "tm_p.h"
static int machopic_data_defined_p PARAMS ((const char *));
static void update_non_lazy_ptrs PARAMS ((const char *));
@@ -219,7 +217,7 @@ machopic_define_name (name)
}
/* This is a static to make inline functions work. The rtx
- representing the PIC base symbol always points to here. */
+ representing the PIC base symbol always points to here. */
static char function_base[32];
@@ -859,18 +857,11 @@ machopic_finish (asm_out_file)
{
const char *const sym_name = IDENTIFIER_POINTER (TREE_VALUE (temp));
const char *const lazy_name = IDENTIFIER_POINTER (TREE_PURPOSE (temp));
-#if 0
- tree decl = lookup_name_darwin (TREE_VALUE (temp));
-#endif
if (! TREE_USED (temp))
continue;
- if (machopic_ident_defined_p (TREE_VALUE (temp))
-#if 0 /* add back when we have private externs */
- || (decl && DECL_PRIVATE_EXTERN (decl))
-#endif
- )
+ if (machopic_ident_defined_p (TREE_VALUE (temp)))
{
data_section ();
assemble_align (GET_MODE_ALIGNMENT (Pmode));
@@ -920,18 +911,6 @@ machopic_operand_p (op)
&& machopic_name_defined_p (XSTR (XEXP (op, 1), 0)))
return 1;
-#if 0 /*def TARGET_TOC*/ /* i.e., PowerPC */
- /* Without this statement, the compiler crashes while compiling enquire.c
- when targetting PowerPC. It is not known why this code is not needed
- when targetting other processors. */
- else if (GET_CODE (op) == SYMBOL_REF
- && (machopic_classify_name (XSTR (op, 0))
- == MACHOPIC_DEFINED_FUNCTION))
- {
- return 1;
- }
-#endif
-
return 0;
}
@@ -1044,7 +1023,7 @@ update_non_lazy_ptrs (name)
/* Function NAME is being defined, and its label has just been output.
If there's already a reference to a stub for this function, we can
- just emit the stub label now and we don't bother emitting the stub later. */
+ just emit the stub label now and we don't bother emitting the stub later. */
void
machopic_output_possible_stub_label (file, name)
@@ -1235,7 +1214,7 @@ machopic_select_section (exp, reloc, align)
}
/* This can be called with address expressions as "rtx".
- They must go in "const". */
+ They must go in "const". */
void
machopic_select_rtx_section (mode, x, align)
@@ -1294,5 +1273,34 @@ darwin_globalize_label (stream, name)
default_globalize_label (stream, name);
}
+/* Output a difference of two labels that will be an assembly time
+ constant if the two labels are local. (.long lab1-lab2 will be
+ very different if lab1 is at the boundary between two sections; it
+ will be relocated according to the second section, not the first,
+ so one ends up with a difference between labels in different
+ sections, which is bad in the dwarf2 eh context for instance.) */
+
+static int darwin_dwarf_label_counter;
+
+void
+darwin_asm_output_dwarf_delta (file, size, lab1, lab2)
+ FILE *file;
+ int size ATTRIBUTE_UNUSED;
+ const char *lab1, *lab2;
+{
+ const char *p = lab1 + (lab1[0] == '*');
+ int islocaldiff = (p[0] == 'L');
+
+ if (islocaldiff)
+ fprintf (file, "\t.set L$set$%d,", darwin_dwarf_label_counter);
+ else
+ fprintf (file, "\t%s\t", ".long");
+ assemble_name (file, lab1);
+ fprintf (file, "-");
+ assemble_name (file, lab2);
+ if (islocaldiff)
+ fprintf (file, "\n\t.long L$set$%d", darwin_dwarf_label_counter++);
+}
+
#include "gt-darwin.h"
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index f6ed2946a39..17504cb848c 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -35,6 +35,12 @@ Boston, MA 02111-1307, USA. */
leave it undefined and expect system builders to set configure args
correctly. */
+/* One of Darwin's NeXT legacies is the Mach-O format, which is partly
+ like a.out and partly like COFF, with additional features like
+ multi-architecture binary support. */
+
+#define OBJECT_FORMAT_MACHO
+
/* Suppress g++ attempt to link in the math library automatically.
(Some Darwin versions have a libm, but they seem to cause problems
for C++ executables.) */
@@ -78,11 +84,6 @@ Boston, MA 02111-1307, USA. */
#undef DEFAULT_PCC_STRUCT_RETURN
#define DEFAULT_PCC_STRUCT_RETURN 0
-/* Don't warn about MacOS-style 'APPL' four-char-constants. */
-
-#undef WARN_FOUR_CHAR_CONSTANTS
-#define WARN_FOUR_CHAR_CONSTANTS 0
-
/* Machine dependent cpp options. */
#undef CPP_SPEC
@@ -93,25 +94,23 @@ Boston, MA 02111-1307, USA. */
#undef LIB_SPEC
#define LIB_SPEC "%{!static:-lSystem}"
-/* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
+/* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
#undef STARTFILE_SPEC
#define STARTFILE_SPEC \
- "%{pg:%{static:-lgcrt0.o}%{!static:-lgcrt1.o}} \
- %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.o}}"
+ "%{pg:%{static:-lgcrt0.o}%{!static:-lgcrt1.o -lcrtbegin.o}} \
+ %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.o -lcrtbegin.o}}"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "-lcrtend.o"
#undef DOLLARS_IN_IDENTIFIERS
#define DOLLARS_IN_IDENTIFIERS 2
/* We use Dbx symbol format. */
-#define DBX_DEBUGGING_INFO
-
-/* Also enable Dwarf 2 as an option. */
-
-#define DWARF2_DEBUGGING_INFO
-
-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+#define DBX_DEBUGGING_INFO 1
/* When generating stabs debugging, use N_BINCL entries. */
@@ -121,7 +120,7 @@ Boston, MA 02111-1307, USA. */
#define DBX_CONTIN_LENGTH 0
-/* gdb needs a null N_SO at the end of each file for scattered loading. */
+/* gdb needs a null N_SO at the end of each file for scattered loading. */
#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
@@ -142,6 +141,9 @@ do { text_section (); \
#define TARGET_ASM_CONSTRUCTOR machopic_asm_out_constructor
#define TARGET_ASM_DESTRUCTOR machopic_asm_out_destructor
+/* Always prefix with an underscore. */
+
+#define USER_LABEL_PREFIX "_"
/* Don't output a .file directive. That is only used by the assembler for
error reporting. */
@@ -164,7 +166,7 @@ do { text_section (); \
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
fprintf (FILE, "\t.space %d\n", SIZE)
-/* Give ObjC methods pretty symbol names. */
+/* Give ObjC methods pretty symbol names. */
#undef OBJC_GEN_METHOD_LABEL
#define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
@@ -282,18 +284,13 @@ do { text_section (); \
machopic_define_name (NAME); \
} while (0)
-/* Output nothing for #ident. */
-
-#undef ASM_OUTPUT_IDENT
-#define ASM_OUTPUT_IDENT(FILE, NAME)
-
/* The maximum alignment which the object file format can support.
For Mach-O, this is 2^15. */
#undef MAX_OFILE_ALIGNMENT
#define MAX_OFILE_ALIGNMENT 0x8000
-/* Create new Mach-O sections. */
+/* Create new Mach-O sections. */
#undef SECTION_FUNCTION
#define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC) \
@@ -441,7 +438,7 @@ SECTION_FUNCTION (machopic_picsymbol_stub_section, \
".picsymbol_stub", 0) \
SECTION_FUNCTION (darwin_exception_section, \
in_darwin_exception, \
- ".section __TEXT,__gcc_except_tab", 0) \
+ ".section __DATA,__gcc_except_tab", 0) \
SECTION_FUNCTION (darwin_eh_frame_section, \
in_darwin_eh_frame, \
".section __TEXT,__eh_frame", 0) \
@@ -516,13 +513,6 @@ objc_section_init () \
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
-/* This is how to output 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, "%s%d:\n", PREFIX, NUM)
-
/* Since we have a separate readonly data section, define this so that
jump tables end up in text rather than data. */
@@ -613,7 +603,14 @@ enum machopic_addr_class {
#undef ASM_PREFERRED_EH_DATA_FORMAT
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
- (((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
+ (((CODE) == 2 && (GLOBAL) == 1) \
+ ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \
+ ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
+
+#define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \
+ darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
+
+#define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
#define DARWIN_REGISTER_TARGET_PRAGMAS(PFILE) \
do { \
diff --git a/gcc/config/dbx.h b/gcc/config/dbx.h
index c5cd3b5f2d0..a9fededbc39 100644
--- a/gcc/config/dbx.h
+++ b/gcc/config/dbx.h
@@ -22,9 +22,7 @@ Boston, MA 02111-1307, USA. */
information. The configure script will add a #include of this file
to tm.h when --with-stabs is used for certain targets. */
-#ifndef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
-#endif
+#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
diff --git a/gcc/config/dbxcoff.h b/gcc/config/dbxcoff.h
index 1d5b448879f..1d54ecf3604 100644
--- a/gcc/config/dbxcoff.h
+++ b/gcc/config/dbxcoff.h
@@ -24,10 +24,9 @@ Boston, MA 02111-1307, USA. */
/* Output DBX (stabs) debugging information if doing -gstabs. */
-#undef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
-/* Generate SDB debugging information by default. */
+/* Generate SDB debugging information by default. */
#ifndef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
@@ -71,7 +70,7 @@ Boston, MA 02111-1307, USA. */
assemble_name (FILE, \
XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
putc ('\n', FILE); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LM", sym_lineno); \
+ (*targetm.asm_out.internal_label) (FILE, "LM", sym_lineno); \
sym_lineno++; \
} }
diff --git a/gcc/config/dbxelf.h b/gcc/config/dbxelf.h
index c1490aeb713..dbc8f347eb3 100644
--- a/gcc/config/dbxelf.h
+++ b/gcc/config/dbxelf.h
@@ -27,8 +27,7 @@ Boston, MA 02111-1307, USA. */
/* Output DBX (stabs) debugging information if doing -gstabs. */
-#undef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Make LBRAC and RBRAC addresses relative to the start of the
function. The native Solaris stabs debugging format works this
@@ -70,7 +69,7 @@ do \
assemble_name (FILE, \
XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
putc ('\n', FILE); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LM", sym_lineno); \
+ (*targetm.asm_out.internal_label) (FILE, "LM", sym_lineno); \
sym_lineno += 1; \
} \
while (0)
diff --git a/gcc/config/dsp16xx/dsp16xx-protos.h b/gcc/config/dsp16xx/dsp16xx-protos.h
index a2f68afbc3e..c2a2584682d 100644
--- a/gcc/config/dsp16xx/dsp16xx-protos.h
+++ b/gcc/config/dsp16xx/dsp16xx-protos.h
@@ -81,7 +81,7 @@ extern void asm_output_float PARAMS ((FILE *, double));
extern void dsp16xx_file_start PARAMS ((void));
extern void coff_dsp16xx_file_start PARAMS ((FILE *));
extern void luxworks_dsp16xx_file_start PARAMS ((FILE *));
-extern struct rtx_def *(*dsp16xx_compare_gen) PARAMS (());
+extern bool dsp16xx_compare_gen;
extern int hard_regno_mode_ok PARAMS ((int, enum machine_mode));
extern enum reg_class dsp16xx_reg_class_from_letter PARAMS ((int));
extern int regno_reg_class PARAMS ((int));
diff --git a/gcc/config/dsp16xx/dsp16xx.c b/gcc/config/dsp16xx/dsp16xx.c
index b031aa2bdcb..fc1998fa62b 100644
--- a/gcc/config/dsp16xx/dsp16xx.c
+++ b/gcc/config/dsp16xx/dsp16xx.c
@@ -58,7 +58,7 @@ const char *save_chip_name;
rtx dsp16xx_compare_op0;
rtx dsp16xx_compare_op1;
-rtx (*dsp16xx_compare_gen) PARAMS (());
+bool dsp16xx_compare_gen;
static const char *fp;
static const char *sp;
diff --git a/gcc/config/dsp16xx/dsp16xx.h b/gcc/config/dsp16xx/dsp16xx.h
index 345629ad70b..fbbf50efec3 100644
--- a/gcc/config/dsp16xx/dsp16xx.h
+++ b/gcc/config/dsp16xx/dsp16xx.h
@@ -1288,9 +1288,6 @@ extern struct dsp16xx_frame_info current_frame_info;
#define HAVE_POST_INCREMENT 1
#define HAVE_POST_DECREMENT 1
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Recognize any constant value that is a valid address. */
#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)
@@ -1619,7 +1616,7 @@ extern struct dsp16xx_frame_info current_frame_info;
fprintf (asm_out_file, "%d", c); \
/* After an octal-escape, if a digit follows, \
terminate one string constant and start another. \
- The Vax assembler fails to stop reading the escape \
+ The VAX assembler fails to stop reading the escape \
after three digits, so this is the only way we \
can get it to parse the data properly. \
if (i < thissize - 1 && ISDIGIT (p[i + 1])) \
@@ -1642,22 +1639,7 @@ extern struct dsp16xx_frame_info current_frame_info;
} \
while (0)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable or function
- named NAME. LABELNO is an integer which is different for
- each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- do { \
- int len = strlen (NAME); \
- char *temp = (char *) alloca (len + 3); \
- temp[0] = 'L'; \
- strcpy (&temp[1], (NAME)); \
- temp[len + 1] = '_'; \
- temp[len + 2] = 0; \
- (OUTPUT) = (char *) alloca (strlen (NAME) + 11); \
- ASM_GENERATE_INTERNAL_LABEL (OUTPUT, temp, LABELNO); \
- } while (0)
+#define ASM_PN_FORMAT "*L%s_%lu"
/* OUTPUT OF UNINITIALIZED VARIABLES */
@@ -1702,11 +1684,6 @@ extern struct dsp16xx_frame_info current_frame_info;
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", 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.
diff --git a/gcc/config/dsp16xx/dsp16xx.md b/gcc/config/dsp16xx/dsp16xx.md
index f39f183ec71..fdb71de10a9 100644
--- a/gcc/config/dsp16xx/dsp16xx.md
+++ b/gcc/config/dsp16xx/dsp16xx.md
@@ -70,7 +70,7 @@
""
"
{
- dsp16xx_compare_gen = gen_tst_reg;
+ dsp16xx_compare_gen = false;
dsp16xx_compare_op0 = operands[0];
dsp16xx_compare_op1 = const0_rtx;
DONE;
@@ -89,7 +89,7 @@
""
"
{
- dsp16xx_compare_gen = gen_tst_reg;
+ dsp16xx_compare_gen = false;
dsp16xx_compare_op0 = operands[0];
dsp16xx_compare_op1 = const0_rtx;
DONE;
@@ -181,7 +181,7 @@
if (GET_CODE (operands[1]) == CONST_INT)
operands[1] = force_reg (HImode, operands[1]);
- dsp16xx_compare_gen = gen_compare_reg;
+ dsp16xx_compare_gen = true;
dsp16xx_compare_op0 = operands[0];
dsp16xx_compare_op1 = operands[1];
DONE;
@@ -266,7 +266,7 @@
{
if (operands[0]) /* Avoid unused code warning */
{
- dsp16xx_compare_gen = gen_compare_reg;
+ dsp16xx_compare_gen = true;
dsp16xx_compare_op0 = operands[0];
dsp16xx_compare_op1 = operands[1];
DONE;
@@ -433,7 +433,7 @@
if (!dsp16xx_cmphf3_libcall)
dsp16xx_cmphf3_libcall = gen_rtx_SYMBOL_REF (Pmode, CMPHF3_LIBCALL);
- dsp16xx_compare_gen = gen_compare_reg;
+ dsp16xx_compare_gen = true;
dsp16xx_compare_op0 = operands[0];
dsp16xx_compare_op1 = operands[1];
emit_library_call (dsp16xx_cmphf3_libcall, 1, HImode, 2,
@@ -1937,7 +1937,7 @@
rtx label2 = gen_label_rtx ();
REAL_VALUE_TYPE offset;
- offset = REAL_VALUE_LDEXP (dconst1, 31);
+ real_2expN (&offset, 31);
if (reg1) /* turn off complaints about unreached code */
{
@@ -2397,10 +2397,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(EQ, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (EQ, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
(define_expand "sne"
@@ -2409,10 +2409,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(NE, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (NE, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2422,10 +2422,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GT, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GT, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2435,10 +2435,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LT, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LT, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
(define_expand "sge"
@@ -2447,10 +2447,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GE, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GE, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2460,10 +2460,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LE, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LE, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2473,10 +2473,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2486,10 +2486,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2499,10 +2499,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2512,10 +2512,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2539,10 +2539,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(EQ, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (EQ, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
(define_expand "bne"
@@ -2554,10 +2554,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(NE, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (NE, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2570,10 +2570,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GT, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GT, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2586,10 +2586,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GE, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GE, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2602,10 +2602,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LT, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LT, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2618,10 +2618,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LE, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LE, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2634,10 +2634,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2650,10 +2650,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(GEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (GEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2666,10 +2666,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LTU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
@@ -2682,10 +2682,10 @@
""
"
{
- if (dsp16xx_compare_gen == gen_compare_reg)
- operands[1] = (*dsp16xx_compare_gen)(LEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
+ if (dsp16xx_compare_gen)
+ operands[1] = gen_compare_reg (LEU, dsp16xx_compare_op0, dsp16xx_compare_op1);
else
- operands[1] = (*dsp16xx_compare_gen)(dsp16xx_compare_op0);
+ operands[1] = gen_tst_reg (dsp16xx_compare_op0);
}")
diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index 8135ab70a6f..a8889dcaee2 100644
--- a/gcc/config/elfos.h
+++ b/gcc/config/elfos.h
@@ -46,9 +46,11 @@ Boston, MA 02111-1307, USA. */
#define NO_DOLLAR_IN_LABEL
-/* Writing `int' for a bitfield forces int alignment for the structure. */
+/* Writing `int' for a bit-field forces int alignment for the structure. */
+#ifndef PCC_BITFIELD_TYPE_MATTERS
#define PCC_BITFIELD_TYPE_MATTERS 1
+#endif
/* Implicit library calls should use memcpy, not bcopy, etc. */
@@ -60,15 +62,11 @@ Boston, MA 02111-1307, USA. */
/* System V Release 4 uses DWARF debugging info. */
-#ifndef DWARF_DEBUGGING_INFO
#define DWARF_DEBUGGING_INFO 1
-#endif
/* All ELF targets can support DWARF-2. */
-#ifndef DWARF2_DEBUGGING_INFO
#define DWARF2_DEBUGGING_INFO 1
-#endif
/* The GNU tools operate better with dwarf2, and it is required by some
psABI's. Since we don't have any native tools to be compatible with,
@@ -112,20 +110,6 @@ Boston, MA 02111-1307, USA. */
#define ASM_OUTPUT_SKIP(FILE, SIZE) \
fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE))
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class.
-
- For most svr4 systems, the convention is that any symbol which begins
- with a period is not put into the linker symbol table by the assembler. */
-
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
- do \
- { \
- fprintf (FILE, ".%s%u:\n", PREFIX, (unsigned) (NUM)); \
- } \
- while (0)
-
/* 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.
@@ -163,7 +147,7 @@ Boston, MA 02111-1307, USA. */
do \
{ \
ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \
} \
while (0)
@@ -404,7 +388,7 @@ Boston, MA 02111-1307, USA. */
generated assembly code more compact (and thus faster to assemble)
as well as more readable, especially for targets like the i386
(where the only alternative is to output character sequences as
- comma separated lists of numbers). */
+ comma separated lists of numbers). */
#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \
do \
diff --git a/gcc/config/float-c4x.h b/gcc/config/float-c4x.h
deleted file mode 100644
index ba621766a69..00000000000
--- a/gcc/config/float-c4x.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* float.h for target with TMS320C3x/C4x floating point format */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-126)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 5.8774718E-39F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-39)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.4028235e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 24
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 6
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 1.1920929e-07
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-126)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 5.8774718E-39
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP -39
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 128
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 3.4028235E+38
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 32
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 8
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.19209287e-07L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-126)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 5.8774717535e-39L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-39)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 128
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX .4028236688e+38L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 38
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-i128.h b/gcc/config/float-i128.h
deleted file mode 100644
index c61c82f18ac..00000000000
--- a/gcc/config/float-i128.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/* float.h for target with IEEE 32, 64 and 128 bit floating point formats */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 113
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 33
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.925929944387235853055977942584927319E-34L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-16381)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 3.362103143112093506262677817321752603E-4932L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-4931)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 16384
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.189731495357231765085759326628007016E+4932L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 4932
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD 0
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# define DECIMAL_DIG 36
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-i32.h b/gcc/config/float-i32.h
deleted file mode 100644
index 3e633d8f38d..00000000000
--- a/gcc/config/float-i32.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/* float.h for target with only IEEE 32 bit floating point format */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 24
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 6
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-125)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 128
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 24
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 6
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-125)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 128
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 38
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD 0
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# define DECIMAL_DIG 9
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-i386.h b/gcc/config/float-i386.h
deleted file mode 100644
index 6abb4f2b7b2..00000000000
--- a/gcc/config/float-i386.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* float.h for target with IEEE 32/64 bit and Intel 386 style 80 bit
- floating point formats */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 64
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 18
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.08420217248550443401e-19L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-16381)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 3.36210314311209350626e-4932L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-4931)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 16384
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.18973149535723176502e+4932L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 4932
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD 2
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# define DECIMAL_DIG 21
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H___ */
diff --git a/gcc/config/float-i64.h b/gcc/config/float-i64.h
deleted file mode 100644
index 735f7423635..00000000000
--- a/gcc/config/float-i64.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/* float.h for target with IEEE 32 bit and 64 bit floating point formats */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 53
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 15
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 2.2204460492503131e-16L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-1021)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 2.2250738585072014e-308L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 1024
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.7976931348623157e+308L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 308
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD 0
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# define DECIMAL_DIG 17
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-m68k.h b/gcc/config/float-m68k.h
deleted file mode 100644
index 837126b7de5..00000000000
--- a/gcc/config/float-m68k.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* float.h for target with IEEE 32 bit and 64 bit and Motorola style 96 bit
- floating point formats */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 64
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 18
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.08420217248550443401e-19L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-16382)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 1.68105157155604675313e-4932L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-4931)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 16384
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.18973149535723176502e+4932L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 4932
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-
-/* ??? FLT_EVAL_METHOD depends on TARGET_68040_ONLY. We do not currently
- have a preprocessor token that we can use to tell that this is on. */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD -1
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# define DECIMAL_DIG 21
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-sh.h b/gcc/config/float-sh.h
deleted file mode 100644
index 598994b5376..00000000000
--- a/gcc/config/float-sh.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/* float.h for target sh3e with optional IEEE 32 bit double format */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
-#if defined (__SH3E__) || defined (__SH4_SINGLE_ONLY__)
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 24
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 6
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-125)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 128
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 38
-
-#else
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
-#endif
-
-/* Because -m3e and -m4-single-only have 32-bit doubles, we append L
- to the doubles below, so that they're not truncated. */
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 53
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 15
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 2.2204460492503131e-16L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-1021)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 2.2250738585072014e-308L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 1024
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.7976931348623157e+308L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 308
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD 0
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# define DECIMAL_DIG 17
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-sparc.h b/gcc/config/float-sparc.h
deleted file mode 100644
index 84250e520a6..00000000000
--- a/gcc/config/float-sparc.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* float.h for target with IEEE 32, 64 and 128 bit SPARC floating point formats
- (on sparc-linux long double is 64 bit, while on sparc64-linux 128 bit) */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
-#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
-#define LDBL_MANT_DIG 113
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 33
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.925929944387235853055977942584927319E-34L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-16381)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 3.362103143112093506262677817321752603E-4932L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-4931)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 16384
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.189731495357231765085759326628007016E+4932L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 4932
-
-#else /* sparc32 */
-
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG DBL_MANT_DIG
-#undef LDBL_DIG
-#define LDBL_DIG DBL_DIG
-#undef LDBL_EPSILON
-#define LDBL_EPSILON DBL_EPSILON
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP DBL_MIN_EXP
-#undef LDBL_MIN
-#define LDBL_MIN DBL_MIN
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP DBL_MAX_EXP
-#undef LDBL_MAX
-#define LDBL_MAX DBL_MAX
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
-
-#endif /* sparc32 */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
- /* The floating-point expression evaluation method.
- -1 indeterminate
- 0 evaluate all operations and constants just to the range and
- precision of the type
- 1 evaluate operations and constants of type float and double
- to the range and precision of the double type, evaluate
- long double operations and constants to the range and
- precision of the long double type
- 2 evaluate all operations and constants to the range and
- precision of the long double type
- */
-# undef FLT_EVAL_METHOD
-# define FLT_EVAL_METHOD 0
-
- /* Number of decimal digits to enable rounding to the given number of
- decimal digits without loss of precision.
- if FLT_RADIX == 10^n: #mantissa * log10 (FLT_RADIX)
- else : ceil (1 + #mantissa * log10 (FLT_RADIX))
- where #mantissa is the number of bits in the mantissa of the widest
- supported floating-point type.
- */
-# undef DECIMAL_DIG
-# if LDBL_MANT_DIG == 53
-# define DECIMAL_DIG 17
-# else
-# define DECIMAL_DIG 36
-# endif
-
-#endif /* C99 */
-
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/float-vax.h b/gcc/config/float-vax.h
deleted file mode 100644
index fff577f4fd8..00000000000
--- a/gcc/config/float-vax.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* float.h for target with VAX floating point formats */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
- /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
- /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
- /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
- /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-127)
- /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 2.93873588e-39F
- /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-38)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 127
- /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 1.70141173e+38F
- /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
-#ifdef __GFLOAT
-
- /* The GFLOAT numbers may be problematic since gcc uses DFLOAT */
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-016
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1023)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 5.5626846462680035e-309
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-308)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1023
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 8.9884656743115775e+307
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 307
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 53
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 15
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 2.2204460492503131e-016L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-1023)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 5.5626846462680035e-309L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-308)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 1023
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 8.9884656743115775e+307L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 307
-
-#else /* !__GFLOAT */
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 56
- /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 16
- /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.77555756156289135e-17
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-127)
- /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.93873587705571877e-39
- /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-38)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 127
- /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.70141183460469227e+38
- /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 38
-
- /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 56
- /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 16
- /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 2.77555756156289135e-17L
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-127)
- /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 2.93873587705571877e-39L
- /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-38)
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 127
- /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.70141183460469227e+38L
- /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 38
-
-#endif /* __GFLOAT */
-#endif /* _FLOAT_H_ */
diff --git a/gcc/config/fp-bit.c b/gcc/config/fp-bit.c
index 4253577acdf..7ec20ecf9f2 100644
--- a/gcc/config/fp-bit.c
+++ b/gcc/config/fp-bit.c
@@ -46,7 +46,7 @@ Boston, MA 02111-1307, USA. */
#include "tconfig.h"
#include "fp-bit.h"
-/* The following macros can be defined to change the behaviour of this file:
+/* The following macros can be defined to change the behavior of this file:
FLOAT: Implement a `float', aka SFmode, fp library. If this is not
defined, then this file implements a `double', aka DFmode, fp library.
FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
@@ -79,38 +79,42 @@ Boston, MA 02111-1307, USA. */
#endif
#ifdef EXTENDED_FLOAT_STUBS
-__truncxfsf2 (){ abort(); }
-__extendsfxf2 (){ abort(); }
-__addxf3 (){ abort(); }
-__divxf3 (){ abort(); }
-__eqxf2 (){ abort(); }
-__extenddfxf2 (){ abort(); }
-__gtxf2 (){ abort(); }
-__lexf2 (){ abort(); }
-__ltxf2 (){ abort(); }
-__mulxf3 (){ abort(); }
-__negxf2 (){ abort(); }
-__nexf2 (){ abort(); }
-__subxf3 (){ abort(); }
-__truncxfdf2 (){ abort(); }
-
-__trunctfsf2 (){ abort(); }
-__extendsftf2 (){ abort(); }
-__addtf3 (){ abort(); }
-__divtf3 (){ abort(); }
-__eqtf2 (){ abort(); }
-__extenddftf2 (){ abort(); }
-__gttf2 (){ abort(); }
-__letf2 (){ abort(); }
-__lttf2 (){ abort(); }
-__multf3 (){ abort(); }
-__negtf2 (){ abort(); }
-__netf2 (){ abort(); }
-__subtf3 (){ abort(); }
-__trunctfdf2 (){ abort(); }
-__gexf2 (){ abort(); }
-__fixxfsi (){ abort(); }
-__floatsixf (){ abort(); }
+extern void abort (void);
+void __extendsfxf2 (void) { abort(); }
+void __extenddfxf2 (void) { abort(); }
+void __truncxfdf2 (void) { abort(); }
+void __truncxfsf2 (void) { abort(); }
+void __fixxfsi (void) { abort(); }
+void __floatsixf (void) { abort(); }
+void __addxf3 (void) { abort(); }
+void __subxf3 (void) { abort(); }
+void __mulxf3 (void) { abort(); }
+void __divxf3 (void) { abort(); }
+void __negxf2 (void) { abort(); }
+void __eqxf2 (void) { abort(); }
+void __nexf2 (void) { abort(); }
+void __gtxf2 (void) { abort(); }
+void __gexf2 (void) { abort(); }
+void __lexf2 (void) { abort(); }
+void __ltxf2 (void) { abort(); }
+
+void __extendsftf2 (void) { abort(); }
+void __extenddftf2 (void) { abort(); }
+void __trunctfdf2 (void) { abort(); }
+void __trunctfsf2 (void) { abort(); }
+void __fixtfsi (void) { abort(); }
+void __floatsitf (void) { abort(); }
+void __addtf3 (void) { abort(); }
+void __subtf3 (void) { abort(); }
+void __multf3 (void) { abort(); }
+void __divtf3 (void) { abort(); }
+void __negtf2 (void) { abort(); }
+void __eqtf2 (void) { abort(); }
+void __netf2 (void) { abort(); }
+void __gttf2 (void) { abort(); }
+void __getf2 (void) { abort(); }
+void __letf2 (void) { abort(); }
+void __lttf2 (void) { abort(); }
#else /* !EXTENDED_FLOAT_STUBS, rest of file */
/* IEEE "special" number predicates */
@@ -136,7 +140,7 @@ INLINE
static fp_number_type *
nan (void)
{
- /* Discard the const qualifier... */
+ /* Discard the const qualifier... */
#ifdef FLOAT
return (fp_number_type *) (& __thenan_sf);
#else
@@ -373,7 +377,7 @@ unpack_d (FLO_union_type * src, fp_number_type * dst)
}
else
{
- /* Zero exponent with non zero fraction - it's denormalized,
+ /* Zero exponent with nonzero fraction - it's denormalized,
so there isn't a leading implicit one - we'll shift it so
it gets one. */
dst->normal_exp = exp - EXPBIAS + 1;
@@ -400,7 +404,7 @@ unpack_d (FLO_union_type * src, fp_number_type * dst)
}
else
{
- /* Non zero fraction, means nan */
+ /* Nonzero fraction, means nan */
if (fraction & QUIET_NAN)
{
dst->class = CLASS_QNAN;
@@ -745,14 +749,14 @@ _fpmul_parts ( fp_number_type * a,
high |= 1;
low <<= 1;
}
- /* rounding is tricky. if we only round if it won't make us round later. */
+ /* rounding is tricky. if we only round if it won't make us round later. */
#if 0
if (low & FRACHIGH2)
{
if (((high & GARDMASK) != GARDMSB)
&& (((high + 1) & GARDMASK) == GARDMSB))
{
- /* don't round, it gets done again later. */
+ /* don't round, it gets done again later. */
}
else
{
@@ -920,7 +924,7 @@ int
__fpcmp_parts (fp_number_type * a, fp_number_type * b)
{
#if 0
- /* either nan -> unordered. Must be checked outside of this routine. */
+ /* either nan -> unordered. Must be checked outside of this routine. */
if (isnan (a) && isnan (b))
{
return 1; /* still unordered! */
@@ -940,11 +944,11 @@ __fpcmp_parts (fp_number_type * a, fp_number_type * b)
-------+--------+--------
-inf(1)| a>b(1) | a==b(0)
-------+--------+--------
- So since unordered must be non zero, just line up the columns...
+ So since unordered must be nonzero, just line up the columns...
*/
return b->sign - a->sign;
}
- /* but not both... */
+ /* but not both... */
if (isinf (a))
{
return a->sign ? -1 : 1;
@@ -965,7 +969,7 @@ __fpcmp_parts (fp_number_type * a, fp_number_type * b)
{
return a->sign ? -1 : 1;
}
- /* now both are "normal". */
+ /* now both are "normal". */
if (a->sign != b->sign)
{
/* opposite signs */
@@ -980,7 +984,7 @@ __fpcmp_parts (fp_number_type * a, fp_number_type * b)
{
return a->sign ? 1 : -1;
}
- /* same exponents; check size. */
+ /* same exponents; check size. */
if (a->fraction.ll > b->fraction.ll)
{
return a->sign ? -1 : 1;
@@ -989,7 +993,7 @@ __fpcmp_parts (fp_number_type * a, fp_number_type * b)
{
return a->sign ? 1 : -1;
}
- /* after all that, they're equal. */
+ /* after all that, they're equal. */
return 0;
}
#endif
@@ -1246,7 +1250,7 @@ float_to_si (FLO_type arg_a)
return 0;
if (isnan (&a))
return 0;
- /* get reasonable MAX_SI_INT... */
+ /* get reasonable MAX_SI_INT... */
if (isinf (&a))
return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
/* it is a number, but a small one */
@@ -1283,7 +1287,7 @@ float_to_usi (FLO_type arg_a)
/* it is a negative number */
if (a.sign)
return 0;
- /* get reasonable MAX_USI_INT... */
+ /* get reasonable MAX_USI_INT... */
if (isinf (&a))
return MAX_USI_INT;
/* it is a number, but a small one */
diff --git a/gcc/config/fr30/fr30.c b/gcc/config/fr30/fr30.c
index f217534a308..e163f926614 100644
--- a/gcc/config/fr30/fr30.c
+++ b/gcc/config/fr30/fr30.c
@@ -2,24 +2,23 @@
Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
-This file is part of GNU CC.
+ 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 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.
+ 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. */
+ 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. */
-/*}}}*/
/*{{{ Includes */
#include "config.h"
@@ -30,11 +29,11 @@ Boston, MA 02111-1307, USA. */
#include "real.h"
#include "insn-config.h"
#include "conditions.h"
-#include "output.h"
#include "insn-attr.h"
#include "flags.h"
#include "recog.h"
#include "tree.h"
+#include "output.h"
#include "expr.h"
#include "obstack.h"
#include "except.h"
@@ -90,7 +89,7 @@ struct rtx_def * fr30_compare_op1;
SP ->| | /
+-----------------------+
- Note, AP is a fake hard register. It will be eliminated in favour of
+ Note, AP is a fake hard register. It will be eliminated in favor of
SP or FP as appropriate.
Note, Some or all of the stack sections above may be omitted if they
@@ -554,10 +553,11 @@ fr30_print_operand (file, x, code)
output_operand_lossage ("fr30_print_operand: invalid %%F code");
else
{
- REAL_VALUE_TYPE d;
+ char str[30];
- REAL_VALUE_FROM_CONST_DOUBLE (d, x);
- fprintf (file, "%.8f", d);
+ real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x),
+ sizeof (str), 0, 1);
+ fputs (str, file);
}
return;
@@ -1098,3 +1098,7 @@ fr30_move_double (operands)
return val;
}
+/*}}}*/
+/* Local Variables: */
+/* folded-file: t */
+/* End: */
diff --git a/gcc/config/fr30/fr30.h b/gcc/config/fr30/fr30.h
index a2950c8ec37..57b24960679 100644
--- a/gcc/config/fr30/fr30.h
+++ b/gcc/config/fr30/fr30.h
@@ -122,8 +122,6 @@ extern int target_flags;
/* Defined in svr4.h. */
#define PCC_BITFIELD_TYPE_MATTERS 1
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
/*}}}*/
/*{{{ Layout of Source Language Data Types. */
@@ -586,7 +584,7 @@ enum reg_class
{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM} \
}
-/* A C expression that returns non-zero if the compiler is allowed to try to
+/* A C expression that returns nonzero if the compiler is allowed to try to
replace register number FROM with register number TO. This macro
need only be defined if `ELIMINABLE_REGS' is defined, and will usually be
the constant 1, since most of the cases preventing register elimination are
@@ -695,7 +693,7 @@ enum reg_class
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
this macro to determine if this argument is of a type that must be passed in
the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
- returns non-zero for such an argument, the compiler will abort. If
+ returns nonzero for such an argument, the compiler will abort. If
`REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
stack and then loaded into a register. */
@@ -992,7 +990,7 @@ do \
* indexed addressing using small signed offsets from the frame pointer
- * register plus register addresing using R13 as the base register.
+ * register plus register addressing using R13 as the base register.
At the moment we only support the first two of these special cases. */
@@ -1168,29 +1166,6 @@ do \
/* Globalizing directive for a label. */
#define GLOBAL_ASM_OP "\t.globl "
-/* A C expression to assign to OUTVAR (which is a variable of type `char *') a
- newly allocated string made from the string NAME and the number NUMBER, with
- some suitable punctuation added. Use `alloca' to get space for the string.
-
- The string will be used as an argument to `ASM_OUTPUT_LABELREF' to produce
- an assembler label for an internal static variable whose name is NAME.
- Therefore, the string must be such as to result in valid assembler code.
- The argument NUMBER is different each time this macro is executed; it
- prevents conflicts between similarly-named internal static variables in
- different scopes.
-
- Ideally this string should not be a valid C identifier, to prevent any
- conflict with the user's own symbols. Most assemblers allow periods or
- percent signs in assembler symbols; putting at least one of these between
- the name and the number will suffice. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \
- do \
- { \
- (OUTVAR) = (char *) alloca (strlen ((NAME)) + 12); \
- sprintf ((OUTVAR), "%s.%ld", (NAME), (long)(NUMBER)); \
- } \
- while (0)
-
/*}}}*/
/*{{{ Output of Assembler Instructions. */
@@ -1245,7 +1220,7 @@ do \
The definition should be a C statement to output to the stdio stream STREAM
an assembler pseudo-instruction to generate a difference between two labels.
VALUE and REL are the numbers of two internal labels. The definitions of
- these labels are output using `ASM_OUTPUT_INTERNAL_LABEL', and they must be
+ these labels are output using `(*targetm.asm_out.internal_label)', and they must be
printed in the same way here. For example,
fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL) */
@@ -1258,7 +1233,7 @@ fprintf (STREAM, "\t.word .L%d-.L%d\n", VALUE, REL)
The definition should be a C statement to output to the stdio stream STREAM
an assembler pseudo-instruction to generate a reference to a label. VALUE
is the number of an internal label whose definition is output using
- `ASM_OUTPUT_INTERNAL_LABEL'. For example,
+ `(*targetm.asm_out.internal_label)'. For example,
fprintf (STREAM, "\t.word L%d\n", VALUE) */
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
diff --git a/gcc/config/fr30/fr30.md b/gcc/config/fr30/fr30.md
index 8557ce898d2..b78e99d96a1 100644
--- a/gcc/config/fr30/fr30.md
+++ b/gcc/config/fr30/fr30.md
@@ -521,7 +521,7 @@
;;{{{ Floating Point Moves
;; Note - Patterns for SF mode moves are compulsory, but
-;; patterns for DF are optional, as GCC can synthesise them.
+;; patterns for DF are optional, as GCC can synthesize them.
(define_expand "movsf"
[(set (match_operand:SF 0 "general_operand" "")
@@ -676,7 +676,7 @@
)
;; Do not allow an eliminable register in the source register. It
-;; might be eliminated in favour of the stack pointer, probably
+;; might be eliminated in favor of the stack pointer, probably
;; increasing the offset, and so rendering the instruction illegal.
(define_insn "addsi_small_int"
[(set (match_operand:SI 0 "register_operand" "=r,r")
diff --git a/gcc/config/freebsd-spec.h b/gcc/config/freebsd-spec.h
index 8b01536273b..3fc4dcc7a41 100644
--- a/gcc/config/freebsd-spec.h
+++ b/gcc/config/freebsd-spec.h
@@ -84,7 +84,7 @@ Boston, MA 02111-1307, USA. */
/* Provide a STARTFILE_SPEC appropriate for FreeBSD. Here we add
the magical crtbegin.o file (see crtstuff.c) which provides part
of the support for getting C++ file-scope static object constructed
- before entering `main'. */
+ before entering `main'. */
#define FBSD_STARTFILE_SPEC \
"%{!shared: \
diff --git a/gcc/config/frv/frv-protos.h b/gcc/config/frv/frv-protos.h
index d00a9b8eaa5..4f5a422cbae 100644
--- a/gcc/config/frv/frv-protos.h
+++ b/gcc/config/frv/frv-protos.h
@@ -69,9 +69,6 @@ extern rtx frv_legitimize_address PARAMS ((rtx, rtx,
enum machine_mode));
#ifdef TREE_CODE
-extern void frv_init_builtins PARAMS ((void));
-extern rtx frv_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
-
extern void frv_init_cumulative_args PARAMS ((CUMULATIVE_ARGS *, tree,
rtx, int, int));
@@ -116,12 +113,6 @@ extern rtx frv_return_addr_rtx PARAMS ((int, rtx));
extern rtx frv_index_memory PARAMS ((rtx,
enum machine_mode,
int));
-
-#ifdef TREE_CODE
-extern void frv_asm_output_mi_thunk PARAMS ((FILE *, tree, long,
- tree));
-#endif /* TREE_CODE */
-
extern const char *frv_asm_output_opcode
PARAMS ((FILE *, const char *));
extern void frv_final_prescan_insn PARAMS ((rtx, rtx *, int));
@@ -174,16 +165,6 @@ extern int frv_register_move_cost PARAMS ((enum reg_class, enum reg_class));
#ifdef TREE_CODE
extern int frv_adjust_field_align PARAMS ((tree, int));
-extern void frv_select_section PARAMS ((tree, int));
-#endif
-
-#ifdef RTX_CODE
-extern void frv_select_rtx_section PARAMS ((enum machine_mode, rtx));
-#endif
-
-#ifdef TREE_CODE
-extern void frv_encode_section_info PARAMS ((tree));
-extern void frv_unique_section PARAMS ((tree, int));
#endif
extern void fixup_section PARAMS ((void));
diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c
index 11b3674fee8..7ef2e1adbfb 100644
--- a/gcc/config/frv/frv.c
+++ b/gcc/config/frv/frv.c
@@ -274,6 +274,12 @@ static void frv_pack_insns PARAMS ((void));
static void frv_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
static void frv_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static bool frv_assemble_integer PARAMS ((rtx, unsigned, int));
+static const char * frv_strip_name_encoding PARAMS ((const char *));
+static void frv_encode_section_info PARAMS ((tree, int));
+static void frv_init_builtins PARAMS ((void));
+static rtx frv_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
+static bool frv_in_small_data_p PARAMS ((tree));
+static void frv_asm_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
/* Initialize the GCC target structure. */
#undef TARGET_ASM_FUNCTION_PROLOGUE
@@ -282,6 +288,19 @@ static bool frv_assemble_integer PARAMS ((rtx, unsigned, int));
#define TARGET_ASM_FUNCTION_EPILOGUE frv_function_epilogue
#undef TARGET_ASM_INTEGER
#define TARGET_ASM_INTEGER frv_assemble_integer
+#undef TARGET_STRIP_NAME_ENCODING
+#define TARGET_STRIP_NAME_ENCODING frv_strip_name_encoding
+#undef TARGET_ENCODE_SECTION_INFO
+#define TARGET_ENCODE_SECTION_INFO frv_encode_section_info
+#undef TARGET_INIT_BUILTINS
+#define TARGET_INIT_BUILTINS frv_init_builtins
+#undef TARGET_EXPAND_BUILTIN
+#define TARGET_EXPAND_BUILTIN frv_expand_builtin
+#undef TARGET_IN_SMALL_DATA_P
+#define TARGET_IN_SMALL_DATA_P frv_in_small_data_p
+
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK frv_asm_output_mi_thunk
struct gcc_target targetm = TARGET_INITIALIZER;
@@ -580,7 +599,7 @@ frv_override_options ()
LEVEL is the optimization level specified; 2 if `-O2' is specified, 1 if
`-O' is specified, and 0 if neither is specified.
- SIZE is non-zero if `-Os' is specified, 0 otherwise.
+ SIZE is nonzero if `-Os' is specified, 0 otherwise.
You should not use this macro to change options that are not
machine-specific. These should uniformly selected by the same optimization
@@ -609,86 +628,6 @@ frv_optimization_options (level, size)
}
-/* A C statement or statements to switch to the appropriate section for output
- of EXP. You can assume that EXP is either a `VAR_DECL' node or a constant
- of some sort. RELOC indicates whether the initial value of EXP requires
- link-time relocations. Select the section by calling `text_section' or one
- of the alternatives for other sections.
-
- Do not define this macro if you put all read-only variables and constants in
- the read-only data section (usually the text section).
-
- Defined in svr4.h. */
-
-void
-frv_select_section (decl, reloc)
- tree decl;
- int reloc;
-{
- int size = int_size_in_bytes (TREE_TYPE (decl));
-
- if (TREE_CODE (decl) == STRING_CST)
- {
- if (! flag_writable_strings)
- readonly_data_section ();
- else
- data_section ();
- }
- else if (TREE_CODE (decl) == VAR_DECL)
- {
- if ((flag_pic && reloc)
- || !TREE_READONLY (decl)
- || TREE_SIDE_EFFECTS (decl)
- || !DECL_INITIAL (decl)
- || (DECL_INITIAL (decl) != error_mark_node
- && !TREE_CONSTANT (DECL_INITIAL (decl))))
- {
- if (SDATA_NAME_P (XSTR (XEXP (DECL_RTL (decl), 0), 0))
- && size > 0
- && size <= g_switch_value)
- sdata_section ();
- else
- data_section ();
- }
- else
- {
- if (SDATA_NAME_P (XSTR (XEXP (DECL_RTL (decl), 0), 0))
- && size > 0
- && size <= g_switch_value)
- sdata_section ();
- else
- readonly_data_section ();
- }
- }
- else
- readonly_data_section ();
-}
-
-
-/* A C statement or statements to switch to the appropriate section for output
- of RTX in mode MODE. You can assume that OP is some kind of constant in
- RTL. The argument MODE is redundant except in the case of a `const_int'
- rtx. Select the section by calling `text_section' or one of the
- alternatives for other sections.
-
- Do not define this macro if you put all constants in the read-only data
- section.
-
- Defined in svr4.h. */
-
-void
-frv_select_rtx_section (mode, op)
- enum machine_mode mode;
- rtx op ATTRIBUTE_UNUSED;
-{
- int size = (int) GET_MODE_SIZE (mode);
- if (size > 0 && size <= g_switch_value)
- sdata_section ();
- else
- readonly_data_section ();
-}
-
-
/* Return true if NAME (a STRING_CST node) begins with PREFIX. */
static int
@@ -713,10 +652,13 @@ frv_string_begins_with (name, prefix)
*/
-void
-frv_encode_section_info (decl)
+static void
+frv_encode_section_info (decl, first)
tree decl;
+ int first;
{
+ if (! first)
+ return;
if (TREE_CODE (decl) == VAR_DECL)
{
int size = int_size_in_bytes (TREE_TYPE (decl));
@@ -757,43 +699,6 @@ frv_encode_section_info (decl)
}
}
-void
-frv_unique_section (decl, reloc)
- tree decl;
- int reloc;
-{
- int len;
- int sec;
- const char *name;
- char *string;
- const char *prefix;
- static const char *prefixes[4][2] =
- {
- { ".text.", ".gnu.linkonce.t." },
- { ".rodata.", ".gnu.linkonce.r." },
- { ".data.", ".gnu.linkonce.d." },
- { ".sdata.", ".gnu.linkonce.s." }
- };
-
- if (TREE_CODE (decl) == FUNCTION_DECL)
- sec = 0;
- else if (DECL_READONLY_SECTION (decl, reloc))
- sec = 1;
- else if (SDATA_NAME_P (XSTR (XEXP (DECL_RTL (decl), 0), 0)))
- sec = 3;
- else
- sec = 2;
-
- name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
- STRIP_NAME_ENCODING (name, name);
- prefix = prefixes[sec][DECL_ONE_ONLY (decl)];
- len = strlen (name) + strlen (prefix);
- string = alloca (len + 1);
-
- sprintf (string, "%s%s", prefix, name);
-
- DECL_SECTION_NAME (decl) = build_string (len, string);
-}
/* Zero or more C statements that may conditionally modify two variables
`fixed_regs' and `call_used_regs' (both of type `char []') after they have
@@ -1852,7 +1757,7 @@ frv_function_epilogue (file, size)
/* Called after register allocation to add any instructions needed for the
- epilogue. Using a epilogue insn is favored compared to putting all of the
+ epilogue. Using an epilogue insn is favored compared to putting all of the
instructions in the FUNCTION_PROLOGUE macro, since it allows the scheduler
to intermix instructions with the saves of the caller saved registers. In
some cases, it might be necessary to emit a barrier instruction as the last
@@ -1965,11 +1870,11 @@ frv_expand_epilogue (sibcall_p)
FUNCTION instead of jumping to it. The generic approach does not support
varargs. */
-void
+static void
frv_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl ATTRIBUTE_UNUSED;
- long delta;
+ HOST_WIDE_INT delta;
tree function;
{
const char *name_func = XSTR (XEXP (DECL_RTL (function), 0), 0);
@@ -1979,12 +1884,16 @@ frv_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
/* Do the add using an addi if possible */
if (IN_RANGE_P (delta, -2048, 2047))
- fprintf (file, "\taddi %s,#%ld,%s\n", name_arg0, delta, name_arg0);
+ fprintf (file, "\taddi %s,#%d,%s\n", name_arg0, (int) delta, name_arg0);
else
{
const char *name_add = reg_names[TEMP_REGNO];
- fprintf (file, "\tsethi%s #hi(%ld),%s\n", parallel, delta, name_add);
- fprintf (file, "\tsetlo #lo(%ld),%s\n", delta, name_add);
+ fprintf (file, "\tsethi%s #hi(", parallel);
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, "),%s\n", name_add);
+ fprintf (file, "\tsetlo #lo(");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ fprintf (file, "),%s\n", name_add);
fprintf (file, "\tadd %s,%s,%s\n", name_add, name_arg0, name_arg0);
}
@@ -2800,7 +2709,7 @@ frv_print_operand_jump_hint (insn)
}
-/* Print an operand to a assembler instruction.
+/* Print an operand to an assembler instruction.
`%' followed by a letter and a digit says to output an operand in an
alternate fashion. Four letters have standard, built-in meanings described
@@ -3227,7 +3136,7 @@ frv_function_arg_boundary (mode, type)
register in which to pass the argument, or zero to pass the argument on the
stack.
- For machines like the Vax and 68000, where normally all arguments are
+ For machines like the VAX and 68000, where normally all arguments are
pushed, zero suffices as a definition.
The usual way to make the ANSI library `stdarg.h' work on a machine where
@@ -3238,7 +3147,7 @@ frv_function_arg_boundary (mode, type)
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
this macro to determine if this argument is of a type that must be passed in
the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
- returns non-zero for such an argument, the compiler will abort. If
+ returns nonzero for such an argument, the compiler will abort. If
`REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
stack and then loaded into a register. */
@@ -3480,7 +3389,7 @@ frv_regno_ok_for_base_p (regno, strict_p)
with suitable punctuation to prevent any ambiguity. Allocate the new name
in `saveable_obstack'. You will have to modify `ASM_OUTPUT_LABELREF' to
remove and decode the added text and output the name accordingly, and define
- `STRIP_NAME_ENCODING' to access the original name string.
+ `(* targetm.strip_name_encoding)' to access the original name string.
You can check the information stored here into the `symbol_ref' in the
definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and
@@ -3651,7 +3560,7 @@ frv_legitimize_address (x, oldx, mode)
{
rtx ret = NULL_RTX;
- /* Don't try to legitimize addreses if we are not optimizing, since the
+ /* Don't try to legitimize addresses if we are not optimizing, since the
address we generate is not a general operand, and will horribly mess
things up when force_reg is called to try and put it in a register because
we aren't optimizing. */
@@ -6516,7 +6425,7 @@ frv_split_minmax (operands)
cc_reg,
const0_rtx)));
- /* If are taking the min/max of a non-zero constant, load that first, and
+ /* If are taking the min/max of a nonzero constant, load that first, and
then do a conditional move of the other value. */
if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
{
@@ -7728,7 +7637,7 @@ frv_initialize_trampoline (addr, fnaddr, static_chain)
registers, but not memory. Some machines allow copying all registers to and
from memory, but require a scratch register for stores to some memory
locations (e.g., those with symbolic address on the RT, and those with
- certain symbolic address on the Sparc when compiling PIC). In some cases,
+ certain symbolic address on the SPARC when compiling PIC). In some cases,
both an intermediate and a scratch register are required.
You should define these macros to indicate to the reload phase that it may
@@ -7771,7 +7680,7 @@ frv_initialize_trampoline (addr, fnaddr, static_chain)
registers can only be copied to memory and not to another class of
registers. In that case, secondary reload registers are not needed and
would not be helpful. Instead, a stack location must be used to perform the
- copy and the `movM' pattern should use memory as a intermediate storage.
+ copy and the `movM' pattern should use memory as an intermediate storage.
This case often occurs between floating-point and general registers. */
enum reg_class
@@ -7804,7 +7713,7 @@ frv_secondary_reload_class (class, mode, x, in_p)
}
break;
- /* Non-zero constants should be loaded into an FPR through a GPR. */
+ /* Nonzero constants should be loaded into an FPR through a GPR. */
case QUAD_FPR_REGS:
case FEVEN_REGS:
case FPR_REGS:
@@ -7957,7 +7866,7 @@ frv_adjust_field_align (field, computed)
/* If this isn't a :0 field and if the previous element is a bitfield
also, see if the type is different, if so, we will need to align the
- bitfield to the next boundary */
+ bit-field to the next boundary */
if (prev
&& ! DECL_PACKED (field)
&& ! integer_zerop (DECL_SIZE (field))
@@ -8309,7 +8218,7 @@ frv_assemble_integer (value, size, aligned_p)
const char *p;
ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", label_num++);
- STRIP_NAME_ENCODING (p, buf);
+ p = (* targetm.strip_name_encoding) (buf);
fprintf (asm_out_file, "%s:\n", p);
fprintf (asm_out_file, "%s\n", FIXUP_SECTION_ASM_OP);
@@ -9087,7 +8996,7 @@ static struct builtin_description bdesc_voidacc[] =
/* Initialize media builtins. */
-void
+static void
frv_init_builtins ()
{
tree endlink = void_list_node;
@@ -9706,7 +9615,7 @@ frv_expand_mwtacc_builtin (icode, arglist)
/* Expand builtins. */
-rtx
+static rtx
frv_expand_builtin (exp, target, subtarget, mode, ignore)
tree exp;
rtx target;
@@ -9854,3 +9763,22 @@ frv_expand_builtin (exp, target, subtarget, mode, ignore)
}
return 0;
}
+
+static const char *
+frv_strip_name_encoding (str)
+ const char *str;
+{
+ while (*str == '*' || *str == SDATA_FLAG_CHAR)
+ str++;
+ return str;
+}
+
+static bool
+frv_in_small_data_p (decl)
+ tree decl;
+{
+ HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
+
+ return symbol_ref_small_data_p (XEXP (DECL_RTL (decl), 0))
+ && size > 0 && size <= g_switch_value;
+}
diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h
index 0bd7b4decb3..fe2c865ee51 100644
--- a/gcc/config/frv/frv.h
+++ b/gcc/config/frv/frv.h
@@ -530,7 +530,7 @@ extern int target_flags;
LEVEL is the optimization level specified; 2 if `-O2' is specified, 1 if
`-O' is specified, and 0 if neither is specified.
- SIZE is non-zero if `-Os' is specified, 0 otherwise.
+ SIZE is nonzero if `-Os' is specified, 0 otherwise.
You should not use this macro to change options that are not
machine-specific. These should uniformly selected by the same optimization
@@ -688,13 +688,13 @@ extern int g_switch_set; /* whether -G xx was passed. */
/* Define this if you wish to imitate the way many other C compilers handle
alignment of bitfields and the structures that contain them.
- The behavior is that the type written for a bitfield (`int', `short', or
+ The behavior is that the type written for a bit-field (`int', `short', or
other integer type) imposes an alignment for the entire structure, as if the
structure really did contain an ordinary field of that type. In addition,
- the bitfield is placed within the structure so that it would fit within such
+ the bit-field is placed within the structure so that it would fit within such
a field, not crossing a boundary for it.
- Thus, on most machines, a bitfield whose type is written as `int' would not
+ Thus, on most machines, a bit-field whose type is written as `int' would not
cross a four-byte boundary, and would force four-byte alignment for the
whole structure. (The alignment used may not be four bytes; it is
controlled by the other alignment parameters.)
@@ -711,7 +711,7 @@ extern int g_switch_set; /* whether -G xx was passed. */
`STRUCTURE_SIZE_BOUNDARY' as large as `BIGGEST_ALIGNMENT'. Then every
structure can be accessed with fullwords.
- Unless the machine has bitfield instructions or you define
+ Unless the machine has bit-field instructions or you define
`STRUCTURE_SIZE_BOUNDARY' that way, you must define
`PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value.
@@ -748,41 +748,6 @@ extern int g_switch_set; /* whether -G xx was passed. */
Defined in svr4.h. */
#define PCC_BITFIELD_TYPE_MATTERS 1
-/* A code distinguishing the floating point format of the target machine.
- There are three defined values:
-
- IEEE_FLOAT_FORMAT'
- This code indicates IEEE floating point. It is the default;
- there is no need to define this macro when the format is IEEE.
-
- VAX_FLOAT_FORMAT'
- This code indicates the peculiar format used on the Vax.
-
- UNKNOWN_FLOAT_FORMAT'
- This code indicates any other format.
-
- The value of this macro is compared with `HOST_FLOAT_FORMAT'
- to determine whether the target machine has the same format as
- the host machine. If any other formats are actually in use on supported
- machines, new codes should be defined for them.
-
- The ordering of the component words of floating point values stored in
- memory is controlled by `FLOAT_WORDS_BIG_ENDIAN' for the target machine and
- `HOST_FLOAT_WORDS_BIG_ENDIAN' for the host. */
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
-/* GNU CC supports two ways of implementing C++ vtables: traditional or with
- so-called "thunks". The flag `-fvtable-thunk' chooses between them. Define
- this macro to be a C expression for the default value of that flag. If
- `DEFAULT_VTABLE_THUNKS' is 0, GNU CC uses the traditional implementation by
- default. The "thunk" implementation is more efficient (especially if you
- have provided an implementation of `ASM_OUTPUT_MI_THUNK', but is not binary
- compatible with code compiled using the traditional implementation. If you
- are writing a new ports, define `DEFAULT_VTABLE_THUNKS' to 1.
-
- If you do not define this macro, the default for `-fvtable-thunk' is 0. */
-#define DEFAULT_VTABLE_THUNKS 1
-
/* Layout of Source Language Data Types. */
@@ -1776,7 +1741,7 @@ struct machine_function GTY(())
{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM} \
}
-/* A C expression that returns non-zero if the compiler is allowed to try to
+/* A C expression that returns nonzero if the compiler is allowed to try to
replace register number FROM with register number TO. This macro need only
be defined if `ELIMINABLE_REGS' is defined, and will usually be the constant
1, since most of the cases preventing register elimination are things that
@@ -1832,7 +1797,7 @@ struct machine_function GTY(())
variable number of bytes is passed, it is zero, and argument popping will
always be the responsibility of the calling function.
- On the Vax, all functions always pop their arguments, so the definition of
+ On the VAX, all functions always pop their arguments, so the definition of
this macro is STACK-SIZE. On the 68000, using the standard calling
convention, no functions pop their arguments, so the value of the macro is
always 0 in this case. But an alternative calling convention is available
@@ -1881,7 +1846,7 @@ struct machine_function GTY(())
register in which to pass the argument, or zero to pass the argument on the
stack.
- For machines like the Vax and 68000, where normally all arguments are
+ For machines like the VAX and 68000, where normally all arguments are
pushed, zero suffices as a definition.
The usual way to make the ANSI library `stdarg.h' work on a machine where
@@ -1892,7 +1857,7 @@ struct machine_function GTY(())
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
this macro to determine if this argument is of a type that must be passed in
the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
- returns non-zero for such an argument, the compiler will abort. If
+ returns nonzero for such an argument, the compiler will abort. If
`REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
stack and then loaded into a register. */
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
@@ -2103,39 +2068,6 @@ struct machine_function GTY(())
adjustment in a function that has no frame pointer, and the compiler knows
this regardless of `EXIT_IGNORE_STACK'. */
#define EXIT_IGNORE_STACK 1
-
-/* A C compound statement that outputs the assembler code for a thunk function,
- used to implement C++ virtual function calls with multiple inheritance. The
- thunk acts as a wrapper around a virtual function, adjusting the implicit
- object parameter before handing control off to the real function.
-
- First, emit code to add the integer DELTA to the location that contains the
- incoming first argument. Assume that this argument contains a pointer, and
- is the one used to pass the `this' pointer in C++. This is the incoming
- argument *before* the function prologue, e.g. `%o0' on a sparc. The
- addition must preserve the values of all other incoming arguments.
-
- After the addition, emit code to jump to FUNCTION, which is a
- `FUNCTION_DECL'. This is a direct pure jump, not a call, and does not touch
- the return address. Hence returning from FUNCTION will return to whoever
- called the current `thunk'.
-
- The effect must be as if FUNCTION had been called directly with the adjusted
- first argument. This macro is responsible for emitting all of the code for
- a thunk function; `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE' are not
- invoked.
-
- The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already been
- extracted from it.) It might possibly be useful on some targets, but
- probably not.
-
- If you do not define this macro, the target-independent code in the C++
- frontend will generate a less efficient heavyweight thunk that calls
- FUNCTION instead of jumping to it. The generic approach does not support
- varargs. */
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
-frv_asm_output_mi_thunk (FILE, THUNK_FNDECL, (long)DELTA, FUNCTION)
-
/* Generating Code for Profiling. */
@@ -2202,7 +2134,7 @@ frv_asm_output_mi_thunk (FILE, THUNK_FNDECL, (long)DELTA, FUNCTION)
frv_setup_incoming_varargs (& ARGS_SO_FAR, (int) MODE, TYPE, \
& PRETEND_ARGS_SIZE, SECOND_TIME)
-/* Implement the stdarg/varargs va_start macro. STDARG_P is non-zero if this
+/* Implement the stdarg/varargs va_start macro. STDARG_P is nonzero if this
is stdarg.h instead of varargs.h. VALIST is the tree of the va_list
variable to initialize. NEXTARG is the machine independent notion of the
'next' argument after the variable arguments. If not defined, a standard
@@ -2464,7 +2396,7 @@ __asm__("\n" \
with suitable punctuation to prevent any ambiguity. Allocate the new name
in `saveable_obstack'. You will have to modify `ASM_OUTPUT_LABELREF' to
remove and decode the added text and output the name accordingly, and define
- `STRIP_NAME_ENCODING' to access the original name string.
+ `(* targetm.strip_name_encoding)' to access the original name string.
You can check the information stored here into the `symbol_ref' in the
definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and
@@ -2568,7 +2500,7 @@ __asm__("\n" \
/* Returns a mode from class `MODE_CC' to be used when comparison operation
- code OP is applied to rtx X and Y. For example, on the Sparc,
+ code OP is applied to rtx X and Y. For example, on the SPARC,
`SELECT_CC_MODE' is defined as (see *note Jump Patterns::. for a
description of the reason for this definition)
@@ -2594,7 +2526,7 @@ __asm__("\n" \
You need not define this macro if it would always returns zero or if the
floating-point format is anything other than `IEEE_FLOAT_FORMAT'. For
- example, here is the definition used on the Sparc, where floating-point
+ example, here is the definition used on the SPARC, where floating-point
inequality comparisons are always given `CCFPEmode':
#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode) */
@@ -2722,17 +2654,6 @@ __asm__("\n" \
same word of the structure, but to different bytes. */
#define SLOW_BYTE_ACCESS 1
-/* Define this macro if zero-extension (of a `char' or `short' to an `int') can
- be done faster if the destination is a register that is known to be zero.
-
- If you define this macro, you must have instruction patterns that recognize
- RTL structures like this:
-
- (set (strict_low_part (subreg:QI (reg:SI ...) 0)) ...)
-
- and likewise for `HImode'. */
-#define SLOW_ZERO_EXTEND 0
-
/* Define this macro if it is as good or better to call a constant function
address than to call an address kept in a register. */
#define NO_FUNCTION_CSE
@@ -2837,59 +2758,9 @@ fixup_section () \
} \
} \
-/* A C statement or statements to switch to the appropriate section for output
- of EXP. You can assume that EXP is either a `VAR_DECL' node or a constant
- of some sort. RELOC indicates whether the initial value of EXP requires
- link-time relocations. Select the section by calling `text_section' or one
- of the alternatives for other sections.
-
- Do not define this macro if you put all read-only variables and constants in
- the read-only data section (usually the text section).
-
- Defined in svr4.h. */
-#undef SELECT_SECTION
-#define SELECT_SECTION(EXP, RELOC, ALIGN) frv_select_section ((EXP), (RELOC))
-
-/* A C statement or statements to switch to the appropriate section for output
- of RTX in mode MODE. You can assume that RTX is some kind of constant in
- RTL. The argument MODE is redundant except in the case of a `const_int'
- rtx. Select the section by calling `text_section' or one of the
- alternatives for other sections.
-
- Do not define this macro if you put all constants in the read-only data
- section.
-
- Defined in svr4.h. */
-#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) frv_select_rtx_section (MODE, RTX)
-
#define SDATA_FLAG_CHAR '@'
#define SDATA_NAME_P(NAME) (*(NAME) == SDATA_FLAG_CHAR)
-
-#define ENCODE_SECTION_INFO(DECL, FIRST) \
- do \
- { \
- if (FIRST) \
- frv_encode_section_info (DECL); \
- } \
- while (0)
-
-/* Decode SYM_NAME and store the real name part in VAR, sans
- the characters that encode section info. Define this macro if
- ENCODE_SECTION_INFO alters the symbol's name string. */
-
-#define STRIP_NAME_ENCODING(VAR, SYMBOL_NAME) \
- do \
- { \
- const char * _name = (SYMBOL_NAME); \
- \
- while (* _name == '*' || * _name == SDATA_FLAG_CHAR) \
- _name ++; \
- (VAR) = _name; \
- } \
- while (0)
-
/* Position Independent Code. */
@@ -3017,7 +2888,7 @@ do { \
from the string PREFIX and the number NUM.
This string, when output subsequently by `assemble_name', should produce the
- output that `ASM_OUTPUT_INTERNAL_LABEL' would produce with the same PREFIX
+ output that `(*targetm.asm_out.internal_label)' would produce with the same PREFIX
and NUM.
If the string begins with `*', then `assemble_name' will output the rest of
@@ -3034,27 +2905,6 @@ do { \
sprintf (LABEL, "*.%s%ld", PREFIX, (long)NUM); \
} while (0)
-/* A C expression to assign to OUTVAR (which is a variable of type `char *') a
- newly allocated string made from the string NAME and the number NUMBER, with
- some suitable punctuation added. Use `alloca' to get space for the string.
-
- The string will be used as an argument to `ASM_OUTPUT_LABELREF' to produce
- an assembler label for an internal static variable whose name is NAME.
- Therefore, the string must be such as to result in valid assembler code.
- The argument NUMBER is different each time this macro is executed; it
- prevents conflicts between similarly-named internal static variables in
- different scopes.
-
- Ideally this string should not be a valid C identifier, to prevent any
- conflict with the user's own symbols. Most assemblers allow periods or
- percent signs in assembler symbols; putting at least one of these between
- the name and the number will suffice. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \
-do { \
- (OUTVAR) = (char *) alloca (strlen ((NAME)) + 12); \
- sprintf ((OUTVAR), "%s.%ld", (NAME), (long)(NUMBER)); \
-} while (0)
-
/* Macros Controlling Initialization Routines. */
@@ -3244,7 +3094,7 @@ do { \
The definition should be a C statement to output to the stdio stream STREAM
an assembler pseudo-instruction to generate a difference between two labels.
VALUE and REL are the numbers of two internal labels. The definitions of
- these labels are output using `ASM_OUTPUT_INTERNAL_LABEL', and they must be
+ these labels are output using `(*targetm.asm_out.internal_label)', and they must be
printed in the same way here. For example,
fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL) */
@@ -3257,14 +3107,14 @@ fprintf (STREAM, "\t.word .L%d-.L%d\n", VALUE, REL)
The definition should be a C statement to output to the stdio stream STREAM
an assembler pseudo-instruction to generate a reference to a label. VALUE
is the number of an internal label whose definition is output using
- `ASM_OUTPUT_INTERNAL_LABEL'. For example,
+ `(*targetm.asm_out.internal_label)'. For example,
fprintf (STREAM, "\t.word L%d\n", VALUE) */
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
fprintf (STREAM, "\t.word .L%d\n", VALUE)
/* Define this if the label before a jump-table needs to be output specially.
- The first three arguments are the same as for `ASM_OUTPUT_INTERNAL_LABEL';
+ The first three arguments are the same as for `(*targetm.asm_out.internal_label)';
the fourth argument is the jump-table which follows (a `jump_insn'
containing an `addr_vec' or `addr_diff_vec').
@@ -3272,7 +3122,7 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
table.
If this macro is not defined, these labels are output with
- `ASM_OUTPUT_INTERNAL_LABEL'.
+ `(*targetm.asm_out.internal_label)'.
Defined in svr4.h. */
/* When generating embedded PIC or mips16 code we want to put the jump
@@ -3287,7 +3137,7 @@ fprintf (STREAM, "\t.word .L%d\n", VALUE)
do { \
if (flag_pic) \
function_section (current_function_decl); \
- ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) (STREAM, PREFIX, NUM); \
} while (0)
/* Define this to determine whether case statement labels are relative to
@@ -3366,12 +3216,6 @@ do { \
Defined in svr4.h. */
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
-
-/* This version of UNIQUE_SECTION overrides the one in elfos.h. We
- need to check whether DECL is destined for the .sdata section. */
-
-#undef UNIQUE_SECTION
-#define UNIQUE_SECTION(DECL,RELOC) frv_unique_section (DECL, RELOC)
/* Miscellaneous Parameters. */
@@ -3494,14 +3338,6 @@ do { \
/* Define if loading short immediate values into registers sign extends. */
#define SHORT_IMMEDIATES_SIGN_EXTEND
-/* An alias for a tree code that is the easiest kind of division to compile
- code for in the general case. It may be `TRUNC_DIV_EXPR', `FLOOR_DIV_EXPR',
- `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'. These four division operators differ
- in how they round the result to an integer. `EASY_DIV_EXPR' is used when it
- is permissible to use any of those kinds of division and the choice should
- be made on the basis of efficiency. */
-#define EASY_DIV_EXPR TRUNC_DIV_EXPR
-
/* The maximum number of bytes that a single instruction can move quickly from
memory to memory. */
#define MOVE_MAX 8
@@ -3617,12 +3453,12 @@ frv_ifcvt_modify_multiple_tests (CE_INFO, BB, &TRUE_EXPR, &FALSE_EXPR)
#define PACKING_FLAG_USED_P() \
(optimize && flag_schedule_insns_after_reload && ISSUE_RATE > 1)
-/* If the following macro is defined and non zero and deterministic
+/* If the following macro is defined and nonzero and deterministic
finite state automata are used for pipeline hazard recognition, the
code making resource-constrained software pipelining is on. */
#define RCSP_SOFTWARE_PIPELINING 1
-/* If the following macro is defined and non zero and deterministic
+/* If the following macro is defined and nonzero and deterministic
finite state automata are used for pipeline hazard recognition, we
will try to exchange insns in queue ready to improve the schedule.
The more macro value, the more tries will be made. */
@@ -3635,9 +3471,6 @@ frv_ifcvt_modify_multiple_tests (CE_INFO, BB, &TRUE_EXPR, &FALSE_EXPR)
scheduling. */
#define FIRST_CYCLE_MULTIPASS_SCHEDULING_LOOKAHEAD frv_sched_lookahead
-/* Return true if a function is ok to be called as a sibcall. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) 0
-
enum frv_builtins
{
FRV_BUILTIN_MAND,
@@ -3726,13 +3559,6 @@ enum frv_builtins
FRV_BUILTIN_MHDSETH
};
-#define MD_INIT_BUILTINS do { \
- frv_init_builtins (); \
- } while (0)
-
-#define MD_EXPAND_BUILTIN(EXP, TARGET, SUBTARGET, MODE, IGNORE) \
- frv_expand_builtin ((EXP), (TARGET), (SUBTARGET), (MODE), (IGNORE))
-
/* Enable prototypes on the call rtl functions. */
#define MD_CALL_PROTOTYPES 1
diff --git a/gcc/config/frv/frv.md b/gcc/config/frv/frv.md
index f1668045242..a5e82ee65a9 100644
--- a/gcc/config/frv/frv.md
+++ b/gcc/config/frv/frv.md
@@ -1607,7 +1607,7 @@
;; Floating Point Moves
;;
;; Note - Patterns for SF mode moves are compulsory, but
-;; patterns for DF are optional, as GCC can synthesise them.
+;; patterns for DF are optional, as GCC can synthesize them.
(define_expand "movsf"
[(set (match_operand:SF 0 "general_operand" "")
@@ -2258,7 +2258,7 @@
;; Signed conversions from a smaller integer to a larger integer
;;
;; These operations are optional. If they are not
-;; present GCC will synthesise them for itself
+;; present GCC will synthesize them for itself
;; Even though frv does not provide these instructions, we define them
;; to allow load + sign extend to be collapsed together
(define_insn "extendqihi2"
@@ -5524,7 +5524,7 @@
}")
;; Called after register allocation to add any instructions needed for the
-;; epilogue. Using a epilogue insn is favored compared to putting all of the
+;; epilogue. Using an epilogue insn is favored compared to putting all of the
;; instructions in the FUNCTION_EPILOGUE macro, since it allows the scheduler
;; to intermix instructions with the restires of the caller saved registers.
;; In some cases, it might be necessary to emit a barrier instruction as the
diff --git a/gcc/config/h8300/fixunssfsi.c b/gcc/config/h8300/fixunssfsi.c
index 80339f2599d..87c28829297 100644
--- a/gcc/config/h8300/fixunssfsi.c
+++ b/gcc/config/h8300/fixunssfsi.c
@@ -30,7 +30,7 @@ Boston, MA 02111-1307, USA. */
/* The libgcc2.c implementation gets confused by our type setup and creates
a directly recursive call, so we do our own implementation. For
- the H8/300, that's in lib1funcs.asm, for H8/300H and H8/S, it's here. */
+ the H8/300, that's in lib1funcs.asm, for H8/300H and H8S, it's here. */
#ifndef __H8300__
long
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 841c8b7a641..0f276dee0af 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -125,6 +125,166 @@ const char *h8_push_op, *h8_pop_op, *h8_mov_op;
struct gcc_target targetm = TARGET_INITIALIZER;
+/* See below where shifts are handled for explanation of this enum. */
+
+enum shift_alg
+{
+ SHIFT_INLINE,
+ SHIFT_ROT_AND,
+ SHIFT_SPECIAL,
+ SHIFT_LOOP
+};
+
+/* Symbols of the various shifts which can be used as indices. */
+
+enum shift_type
+{
+ SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
+};
+
+/* Macros to keep the shift algorithm tables small. */
+#define INL SHIFT_INLINE
+#define ROT SHIFT_ROT_AND
+#define LOP SHIFT_LOOP
+#define SPC SHIFT_SPECIAL
+
+/* The shift algorithms for each machine, mode, shift type, and shift
+ count are defined below. The three tables below correspond to
+ QImode, HImode, and SImode, respectively. Each table is organized
+ by, in the order of indecies, machine, shift type, and shift count. */
+
+static enum shift_alg shift_alg_qi[3][3][8] = {
+ {
+ /* TARGET_H8300 */
+ /* 0 1 2 3 4 5 6 7 */
+ { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
+ },
+ {
+ /* TARGET_H8300H */
+ /* 0 1 2 3 4 5 6 7 */
+ { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
+ },
+ {
+ /* TARGET_H8300S */
+ /* 0 1 2 3 4 5 6 7 */
+ { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, INL, INL, SPC } /* SHIFT_ASHIFTRT */
+ }
+};
+
+static enum shift_alg shift_alg_hi[3][3][16] = {
+ {
+ /* TARGET_H8300 */
+ /* 0 1 2 3 4 5 6 7 */
+ /* 8 9 10 11 12 13 14 15 */
+ { INL, INL, INL, INL, INL, INL, INL, SPC,
+ SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, LOP, LOP, SPC,
+ SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, LOP, LOP, SPC,
+ SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
+ },
+ {
+ /* TARGET_H8300H */
+ /* 0 1 2 3 4 5 6 7 */
+ /* 8 9 10 11 12 13 14 15 */
+ { INL, INL, INL, INL, INL, INL, INL, SPC,
+ SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, INL, INL, SPC,
+ SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, INL, INL, SPC,
+ SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
+ },
+ {
+ /* TARGET_H8300S */
+ /* 0 1 2 3 4 5 6 7 */
+ /* 8 9 10 11 12 13 14 15 */
+ { INL, INL, INL, INL, INL, INL, INL, INL,
+ SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, INL, INL, INL,
+ SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, INL, INL, INL,
+ SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
+ }
+};
+
+static enum shift_alg shift_alg_si[3][3][32] = {
+ {
+ /* TARGET_H8300 */
+ /* 0 1 2 3 4 5 6 7 */
+ /* 8 9 10 11 12 13 14 15 */
+ /* 16 17 18 19 20 21 22 23 */
+ /* 24 25 26 27 28 29 30 31 */
+ { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
+ SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
+ SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+ SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
+ SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
+ SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
+ SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
+ SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+ },
+ {
+ /* TARGET_H8300H */
+ /* 0 1 2 3 4 5 6 7 */
+ /* 8 9 10 11 12 13 14 15 */
+ /* 16 17 18 19 20 21 22 23 */
+ /* 24 25 26 27 28 29 30 31 */
+ { INL, INL, INL, INL, INL, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
+ SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
+ SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
+ SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
+ SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+ },
+ {
+ /* TARGET_H8300S */
+ /* 0 1 2 3 4 5 6 7 */
+ /* 8 9 10 11 12 13 14 15 */
+ /* 16 17 18 19 20 21 22 23 */
+ /* 24 25 26 27 28 29 30 31 */
+ { INL, INL, INL, INL, INL, INL, INL, INL,
+ INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
+ SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
+ SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT */
+ { INL, INL, INL, INL, INL, INL, INL, INL,
+ INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
+ SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
+ SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+ { INL, INL, INL, INL, INL, INL, INL, INL,
+ INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
+ SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
+ SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+ }
+};
+
+#undef INL
+#undef ROT
+#undef LOP
+#undef SPC
+
+enum h8_cpu
+{
+ H8_300,
+ H8_300H,
+ H8_S
+};
+
/* Initialize various cpu specific globals at start up. */
void
@@ -141,7 +301,7 @@ h8300_init_once ()
}
else
{
- /* For this we treat the H8/300H and H8/S the same. */
+ /* For this we treat the H8/300H and H8S the same. */
cpu_type = (int) CPU_H8300H;
h8_reg_names = names_extended;
}
@@ -154,6 +314,41 @@ h8300_init_once ()
error ("-ms2600 is used without -ms");
target_flags |= 1;
}
+
+ /* Some of the shifts are optimized for speed by default.
+ See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
+ If optimizing for size, change shift_alg for those shift to
+ SHIFT_LOOP. */
+ if (optimize_size)
+ {
+ /* H8/300 */
+ shift_alg_hi[H8_300][SHIFT_ASHIFT][5] = SHIFT_LOOP;
+ shift_alg_hi[H8_300][SHIFT_ASHIFT][6] = SHIFT_LOOP;
+ shift_alg_hi[H8_300][SHIFT_ASHIFT][13] = SHIFT_LOOP;
+ shift_alg_hi[H8_300][SHIFT_ASHIFT][14] = SHIFT_LOOP;
+
+ shift_alg_hi[H8_300][SHIFT_LSHIFTRT][13] = SHIFT_LOOP;
+ shift_alg_hi[H8_300][SHIFT_LSHIFTRT][14] = SHIFT_LOOP;
+
+ shift_alg_hi[H8_300][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
+ shift_alg_hi[H8_300][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
+
+ /* H8/300H */
+ shift_alg_hi[H8_300H][SHIFT_ASHIFT][5] = SHIFT_LOOP;
+ shift_alg_hi[H8_300H][SHIFT_ASHIFT][6] = SHIFT_LOOP;
+
+ shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][5] = SHIFT_LOOP;
+ shift_alg_hi[H8_300H][SHIFT_LSHIFTRT][6] = SHIFT_LOOP;
+
+ shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][5] = SHIFT_LOOP;
+ shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][6] = SHIFT_LOOP;
+ shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
+ shift_alg_hi[H8_300H][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
+
+ /* H8S */
+ shift_alg_hi[H8_S][SHIFT_ASHIFTRT][13] = SHIFT_LOOP;
+ shift_alg_hi[H8_S][SHIFT_ASHIFTRT][14] = SHIFT_LOOP;
+ }
}
static const char *
@@ -197,7 +392,7 @@ dosize (file, op, size)
const char *op;
unsigned int size;
{
- /* On the H8/300H and H8/S, for sizes <= 8 bytes, it is as good or
+ /* On the H8/300H and H8S, for sizes <= 8 bytes, it is as good or
better to use adds/subs insns rather than add.l/sub.l with an
immediate value.
@@ -249,7 +444,7 @@ compute_saved_regs ()
int regno;
/* Construct a bit vector of registers to be pushed/popped. */
- for (regno = 0; regno <= 6; regno++)
+ for (regno = 0; regno <= FRAME_POINTER_REGNUM; regno++)
{
if (WORD_REG_USED (regno))
saved_regs |= 1 << regno;
@@ -289,7 +484,7 @@ pop (file, rn)
PC
FP <- fp
<locals>
- <saved registers> <- sp
+ <saved registers> <- sp
This is what the stack looks like after the prolog of
a function which doesn't have a frame:
@@ -297,7 +492,7 @@ pop (file, rn)
<args>
PC
<locals>
- <saved registers> <- sp
+ <saved registers> <- sp
*/
/* Output assembly language code for the function prologue. */
@@ -505,7 +700,10 @@ asm_file_start (file)
{
fprintf (file, ";\tGCC For the Hitachi H8/300\n");
fprintf (file, ";\tBy Hitachi America Ltd and Cygnus Support\n");
- if (optimize)
+
+ if (optimize_size)
+ fprintf (file, "; -Os\n");
+ else if (optimize)
fprintf (file, "; -O%d\n", optimize);
if (TARGET_H8300H)
fprintf (file, "\n\t.h8300h\n");
@@ -743,7 +941,7 @@ jump_address_operand (op, mode)
return 0;
}
-/* Recognize valid operands for bitfield instructions. */
+/* Recognize valid operands for bit-field instructions. */
extern int rtx_equal_function_value_matters;
@@ -1838,7 +2036,7 @@ compute_logical_op_cc (mode, operands)
We devote a fair bit of code to getting efficient shifts since we
can only shift one bit at a time on the H8/300 and H8/300H and only
- one or two bits at a time on the H8/S.
+ one or two bits at a time on the H8S.
All shift code falls into one of the following ways of
implementation:
@@ -1857,7 +2055,7 @@ compute_logical_op_cc (mode, operands)
16. This case also includes other oddballs that are not worth
explaning here.
- o SHIFT_LOOP: Emit a loop using one (or two on H8/S) bit shifts.
+ o SHIFT_LOOP: Emit a loop using one (or two on H8S) bit shifts.
Here are some thoughts on what the absolutely positively best code
is. "Best" here means some rational trade-off between code size
@@ -1922,15 +2120,15 @@ compute_logical_op_cc (mode, operands)
do 24 bit shift, inline rest
31 - shll, subx byte 0, sign extend byte 0, sign extend word 0
- H8/S QImode shifts
+ H8S QImode shifts
7 - ASHIFTRT: shll, subx (propagate carry bit to all bits)
- H8/S HImode shifts
+ H8S HImode shifts
8 - move byte, zero (ASHIFT | LSHIFTRT) or sign extend other (ASHIFTRT)
9-12 - do shift by 8, inline remaining shifts
15 - ASHIFTRT: shll, subx, set other byte
- H8/S SImode shifts
+ H8S SImode shifts
(These are complicated by the fact that we don't have byte level access to
the top word.)
A word is: bytes 3,2,1,0 (msb -> lsb), word 1,0 (msw -> lsw)
@@ -1994,23 +2192,6 @@ expand_a_shift (mode, code, operands)
return 1;
}
-/* See above for explanation of this enum. */
-
-enum shift_alg
-{
- SHIFT_INLINE,
- SHIFT_ROT_AND,
- SHIFT_SPECIAL,
- SHIFT_LOOP
-};
-
-/* Symbols of the various shifts which can be used as indices. */
-
-enum shift_type
-{
- SHIFT_ASHIFT, SHIFT_LSHIFTRT, SHIFT_ASHIFTRT
-};
-
/* Symbols of the various modes which can be used as indices. */
enum shift_mode
@@ -2173,142 +2354,6 @@ static const char *const rotate_two[3][3] =
}
};
-/* Macros to keep the shift algorithm tables small. */
-#define INL SHIFT_INLINE
-#define ROT SHIFT_ROT_AND
-#define LOP SHIFT_LOOP
-#define SPC SHIFT_SPECIAL
-
-/* The shift algorithms for each machine, mode, shift type, and shift
- count are defined below. The three tables below correspond to
- QImode, HImode, and SImode, respectively. Each table is organized
- by, in the order of indecies, machine, shift type, and shift count. */
-
-static const enum shift_alg shift_alg_qi[3][3][8] = {
- {
- /* TARGET_H8300 */
- /* 0 1 2 3 4 5 6 7 */
- { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
- },
- {
- /* TARGET_H8300H */
- /* 0 1 2 3 4 5 6 7 */
- { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC } /* SHIFT_ASHIFTRT */
- },
- {
- /* TARGET_H8300S */
- /* 0 1 2 3 4 5 6 7 */
- { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, INL, ROT, ROT }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, INL, INL, SPC } /* SHIFT_ASHIFTRT */
- }
-};
-
-static const enum shift_alg shift_alg_hi[3][3][16] = {
- {
- /* TARGET_H8300 */
- /* 0 1 2 3 4 5 6 7 */
- /* 8 9 10 11 12 13 14 15 */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
- },
- {
- /* TARGET_H8300H */
- /* 0 1 2 3 4 5 6 7 */
- /* 8 9 10 11 12 13 14 15 */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
- },
- {
- /* TARGET_H8300S */
- /* 0 1 2 3 4 5 6 7 */
- /* 8 9 10 11 12 13 14 15 */
- { INL, INL, INL, INL, INL, INL, INL, INL,
- SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, INL, INL, INL,
- SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, INL, INL, INL,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
- }
-};
-
-static const enum shift_alg shift_alg_si[3][3][32] = {
- {
- /* TARGET_H8300 */
- /* 0 1 2 3 4 5 6 7 */
- /* 8 9 10 11 12 13 14 15 */
- /* 16 17 18 19 20 21 22 23 */
- /* 24 25 26 27 28 29 30 31 */
- { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, LOP,
- SPC, SPC, SPC, SPC, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFT */
- { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
- SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC,
- SPC, SPC, SPC, LOP, LOP, LOP, LOP, LOP,
- SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
- SPC, SPC, LOP, LOP, LOP, LOP, LOP, LOP,
- SPC, SPC, SPC, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
- },
- {
- /* TARGET_H8300H */
- /* 0 1 2 3 4 5 6 7 */
- /* 8 9 10 11 12 13 14 15 */
- /* 16 17 18 19 20 21 22 23 */
- /* 24 25 26 27 28 29 30 31 */
- { INL, INL, INL, INL, INL, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
- SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
- SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
- },
- {
- /* TARGET_H8300S */
- /* 0 1 2 3 4 5 6 7 */
- /* 8 9 10 11 12 13 14 15 */
- /* 16 17 18 19 20 21 22 23 */
- /* 24 25 26 27 28 29 30 31 */
- { INL, INL, INL, INL, INL, INL, INL, INL,
- INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
- SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT */
- { INL, INL, INL, INL, INL, INL, INL, INL,
- INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
- SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
- SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
- { INL, INL, INL, INL, INL, INL, INL, INL,
- INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
- SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
- SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
- }
-};
-
-#undef INL
-#undef ROT
-#undef LOP
-#undef SPC
-
struct shift_info {
/* Shift algorithm. */
enum shift_alg alg;
@@ -2321,11 +2366,11 @@ struct shift_info {
const char *special;
/* Insn for a one-bit shift. Valid when ALG is either SHIFT_INLINE
- or SHIFT_SPECIAL, and REMAINDER is non-zero. */
+ or SHIFT_SPECIAL, and REMAINDER is nonzero. */
const char *shift1;
/* Insn for a two-bit shift. Valid when ALG is either SHIFT_INLINE
- or SHIFT_SPECIAL, and REMAINDER is non-zero. */
+ or SHIFT_SPECIAL, and REMAINDER is nonzero. */
const char *shift2;
/* Valid CC flags. */
@@ -2356,37 +2401,32 @@ get_shift_alg (shift_type, shift_mode, count, info)
unsigned int count;
struct shift_info *info;
{
- int cpu;
+ enum h8_cpu cpu;
/* Find the target CPU. */
if (TARGET_H8300)
- cpu = 0;
+ cpu = H8_300;
else if (TARGET_H8300H)
- cpu = 1;
+ cpu = H8_300H;
else
- cpu = 2;
+ cpu = H8_S;
/* Find the shift algorithm. */
+ info->alg = SHIFT_LOOP;
switch (shift_mode)
{
case QIshift:
- if (GET_MODE_BITSIZE (QImode) <= count)
- info->alg = SHIFT_LOOP;
- else
+ if (count < GET_MODE_BITSIZE (QImode))
info->alg = shift_alg_qi[cpu][shift_type][count];
break;
case HIshift:
- if (GET_MODE_BITSIZE (HImode) <= count)
- info->alg = SHIFT_LOOP;
- else
+ if (count < GET_MODE_BITSIZE (HImode))
info->alg = shift_alg_hi[cpu][shift_type][count];
break;
case SIshift:
- if (GET_MODE_BITSIZE (SImode) <= count)
- info->alg = SHIFT_LOOP;
- else
+ if (count < GET_MODE_BITSIZE (SImode))
info->alg = shift_alg_si[cpu][shift_type][count];
break;
@@ -2458,7 +2498,7 @@ get_shift_alg (shift_type, shift_mode, count, info)
goto end;
}
}
- else if (8 <= count && count <= 12)
+ else if (8 <= count && count <= 13)
{
info->remainder = count - 8;
@@ -2484,6 +2524,28 @@ get_shift_alg (shift_type, shift_mode, count, info)
goto end;
}
}
+ else if (count == 14)
+ {
+ switch (shift_type)
+ {
+ case SHIFT_ASHIFT:
+ if (TARGET_H8300)
+ info->special = "mov.b\t%s0,%t0\n\trotr.b\t%t0\n\trotr.b\t%t0\n\tand.b\t#0xC0,%t0\n\tsub.b\t%s0,%s0";
+ goto end;
+ case SHIFT_LSHIFTRT:
+ if (TARGET_H8300)
+ info->special = "mov.b\t%t0,%s0\n\trotl.b\t%s0\n\trotl.b\t%s0\n\tand.b\t#3,%s0\n\tsub.b\t%t0,%t0";
+ goto end;
+ case SHIFT_ASHIFTRT:
+ if (TARGET_H8300)
+ info->special = "mov.b\t%t0,%s0\n\tshll.b\t%s0\n\tsubx.b\t%t0,%t0\n\tshll.b\t%s0\n\tmov.b\t%t0,%s0\n\tbst.b\t#0,%s0";
+ else if (TARGET_H8300H)
+ info->special = "shll.b\t%t0\n\tsubx.b\t%s0,%s0\n\tshll.b\t%t0\n\trotxl.b\t%s0\n\texts.w\t%T0";
+ else /* TARGET_H8300S */
+ info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0\n\tshar.w\t#2,%T0\n\tshar.w\t#2,%T0\n\tshar.w\t#2,%T0";
+ goto end;
+ }
+ }
else if (count == 15)
{
switch (shift_type)
@@ -2706,7 +2768,7 @@ h8300_shift_needs_scratch_p (count, mode)
int count;
enum machine_mode mode;
{
- int cpu;
+ enum h8_cpu cpu;
int a, lr, ar;
if (GET_MODE_BITSIZE (mode) <= count)
@@ -2714,11 +2776,11 @@ h8300_shift_needs_scratch_p (count, mode)
/* Find out the target CPU. */
if (TARGET_H8300)
- cpu = 0;
+ cpu = H8_300;
else if (TARGET_H8300H)
- cpu = 1;
+ cpu = H8_300H;
else
- cpu = 2;
+ cpu = H8_S;
/* Find the shift algorithm. */
switch (mode)
@@ -2745,7 +2807,7 @@ h8300_shift_needs_scratch_p (count, mode)
abort ();
}
- /* On H8/300H and H8/S, count == 8 uses the scratch register. */
+ /* On H8/300H and H8S, count == 8 uses the scratch register. */
return (a == SHIFT_LOOP || lr == SHIFT_LOOP || ar == SHIFT_LOOP
|| (!TARGET_H8300 && mode == SImode && count == 8));
}
@@ -3139,7 +3201,7 @@ expand_a_rotate (code, operands)
tmp = gen_rtx_PLUS (QImode, counter, GEN_INT (-1));
emit_insn (gen_rtx_SET (VOIDmode, counter, tmp));
- /* If the loop counter is non-zero, we go back to the beginning
+ /* If the loop counter is nonzero, we go back to the beginning
of the loop. */
emit_cmp_and_jump_insns (counter, GEN_INT (0), NE, NULL_RTX, QImode, 1,
start_label);
@@ -3237,7 +3299,7 @@ emit_a_rotate (code, operands)
break;
case SImode:
- /* This code works on the H8/300H and H8/S. */
+ /* This code works on the H8/300H and H8S. */
insn_buf = "xor.w\t%e0,%f0\n\txor.w\t%f0,%e0\n\txor.w\t%e0,%f0";
output_asm_insn (insn_buf, operands);
break;
@@ -3652,10 +3714,16 @@ h8300_adjust_insn_length (insn, length)
/* @Rs is 2 bytes shorter than the longest. */
if (GET_CODE (addr) == REG)
return -2;
+
+ /* @aa:8 is 2 bytes shorter than the longest. */
+ if (GET_MODE (SET_SRC (pat)) == QImode
+ && ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_FLAG (addr))
+ || EIGHTBIT_CONSTANT_ADDRESS_P (addr)))
+ return -2;
}
else
{
- /* On the H8/300H and H8/S, we subtract the difference
+ /* On the H8/300H and H8S, we subtract the difference
between the actual length and the longest one, which is
@(d:24,ERs). */
@@ -3764,7 +3832,7 @@ h8300_adjust_insn_length (insn, length)
states += 6;
}
- /* We use 2-bit rotatations on the H8/S. */
+ /* We use 2-bit rotatations on the H8S. */
if (TARGET_H8300S)
amount = amount / 2 + amount % 2;
diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h
index 1ef8f78bea4..70501fd2496 100644
--- a/gcc/config/h8300/h8300.h
+++ b/gcc/config/h8300/h8300.h
@@ -115,10 +115,10 @@ extern int target_flags;
An empty string NAME is used to identify the default VALUE. */
#define TARGET_SWITCHES \
- { {"s", 1, N_("Generate H8/S code")}, \
- {"no-s", -1, N_("Do not generate H8/S code")}, \
- {"s2600", 2, N_("Generate H8/S2600 code")}, \
- {"no-s2600", -2, N_("Do not generate H8/S2600 code")}, \
+ { {"s", 1, N_("Generate H8S code")}, \
+ {"no-s", -1, N_("Do not generate H8S code")}, \
+ {"s2600", 2, N_("Generate H8S/2600 code")}, \
+ {"no-s2600", -2, N_("Do not generate H8S/2600 code")}, \
{"int32", 8, N_("Make integers 32 bits wide")}, \
{"addresses", 64, NULL}, \
{"quickcall", 128, \
@@ -224,11 +224,11 @@ extern int target_flags;
structure layouts. */
#define EMPTY_FIELD_BOUNDARY 16
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 0
/* No data type wants to be aligned rounder than this.
- 32 bit values are aligned as such on the H8/300H and H8/S for speed. */
+ 32 bit values are aligned as such on the H8/300H and H8S for speed. */
#define BIGGEST_ALIGNMENT \
(((TARGET_H8300H || TARGET_H8300S) && ! TARGET_ALIGN_300) ? 32 : 16)
@@ -392,8 +392,8 @@ enum reg_class {
#define REG_CLASS_CONTENTS \
{ {0}, /* No regs */ \
- {0x6ff}, /* GENERAL_REGS */ \
- {0x100}, /* MAC_REGS */ \
+ {0x6ff}, /* GENERAL_REGS */ \
+ {0x100}, /* MAC_REGS */ \
{0x7ff}, /* ALL_REGS */ \
}
@@ -686,14 +686,14 @@ struct cum_arg
H8/300
vvvv context
- 1 0000 7900xxxx mov.w #0x1234,r3
- 2 0004 5A00xxxx jmp @0x1234
+ 1 0000 7900xxxx mov.w #0x1234,r3
+ 2 0004 5A00xxxx jmp @0x1234
^^^^ function
H8/300H
vvvvvvvv context
- 2 0000 7A00xxxxxxxx mov.l #0x12345678,er3
- 3 0006 5Axxxxxx jmp @0x123456
+ 2 0000 7A00xxxxxxxx mov.l #0x12345678,er3
+ 3 0006 5Axxxxxx jmp @0x123456
^^^^^^ function
*/
@@ -822,26 +822,36 @@ struct cum_arg
? !h8300_shift_needs_scratch_p (INTVAL (OP), SImode) \
: 0)
-/* Nonzero if X is a constant address suitable as an 8-bit absolute on
- the H8/300H, which is a special case of the 'R' operand. */
+/* Nonzero if X is a constant address suitable as an 8-bit absolute,
+ which is a special case of the 'R' operand. */
-#define EIGHTBIT_CONSTANT_ADDRESS_P(X) \
- (GET_CODE (X) == CONST_INT && TARGET_H8300H \
- && 0xffff00 <= INTVAL (X) && INTVAL (X) <= 0xffffff)
+#define EIGHTBIT_CONSTANT_ADDRESS_P(X) \
+ ((GET_CODE (X) == CONST_INT) \
+ && ((TARGET_H8300H && 0xffff00 <= INTVAL (X) \
+ && INTVAL (X) <= 0xffffff) \
+ || (TARGET_H8300S && 0xffffff00 <= INTVAL (X) \
+ && INTVAL (X) <= 0xffffffff) \
+ || (TARGET_H8300 && 0xff00 <= (INTVAL (X) & 0x0000FFFF) \
+ && (INTVAL (X) & 0x0000FFFF) <= 0xffff)))
/* Nonzero if X is a constant address suitable as an 16-bit absolute
- on the H8/300H. */
-
-#define TINY_CONSTANT_ADDRESS_P(X) \
- (GET_CODE (X) == CONST_INT && TARGET_H8300H \
- && ((0xff8000 <= INTVAL (X) && INTVAL (X) <= 0xffffff) \
- || (0x000000 <= INTVAL (X) && INTVAL (X) <= 0x007fff)))
+ on H8/300H and H8S. */
+
+#define TINY_CONSTANT_ADDRESS_P(X) \
+ ((GET_CODE (X) == CONST_INT) \
+ && ((TARGET_H8300H \
+ && ((0xff8000 <= INTVAL (X) && INTVAL (X) <= 0xffffff) \
+ || (0x000000 <= INTVAL (X) && INTVAL (X) <= 0x007fff))) \
+ || (TARGET_H8300S \
+ && ((0xffff8000 <= INTVAL (X) && INTVAL (X) <= 0xffffffff) \
+ || (0x00000000 <= INTVAL (X) \
+ && INTVAL (X) <= 0x00007fff)))))
/* 'U' if valid for a bset destination;
i.e. a register, register indirect, or the eightbit memory region
(a SYMBOL_REF with an SYMBOL_REF_FLAG set).
- On the H8/S 'U' can also be a 16bit or 32bit absolute. */
+ On the H8S 'U' can also be a 16bit or 32bit absolute. */
#define OK_FOR_U(OP) \
((GET_CODE (OP) == REG && REG_OK_FOR_BASE_P (OP)) \
|| (GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \
@@ -1098,7 +1108,7 @@ struct cum_arg
{ {"er0", 0}, {"er1", 1}, {"er2", 2}, {"er3", 3}, {"er4", 4}, \
{"er5", 5}, {"er6", 6}, {"er7", 7}, {"r7", 7} }
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
#define SDB_DELIM "\n"
/* Support -gstabs. */
@@ -1133,20 +1143,13 @@ struct cum_arg
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class.
-
- N.B.: The h8300.md branch_true and branch_false patterns also know
- how to generate internal labels. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
- fprintf (FILE, ".%s%d:\n", 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'. */
+ This is suitable for output with `assemble_name'.
+ N.B.: The h8300.md branch_true and branch_false patterns also know
+ how to generate internal labels. */
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf (LABEL, "*.%s%d", PREFIX, NUM)
@@ -1212,13 +1215,7 @@ struct cum_arg
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%d\n", (SIZE)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
/* Print an instruction operand X on file FILE.
Look in h8300.c for details. */
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index 9aa47ce8f45..0148585dcef 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -28,14 +28,14 @@
;; "worst case" and then be adjusted to their correct values by
;; h8300_adjust_insn_length.
-;; On the H8/300H and H8/S, adds/subs operate on the 32bit "er"
+;; On the H8/300H and H8S, adds/subs operate on the 32bit "er"
;; registers. Right now GCC doesn't expose the "e" half to the
;; compiler, so using add/subs for addhi and subhi is safe. Long
;; term, we want to expose the "e" half to the compiler (gives us 8
;; more 16bit registers). At that point addhi and subhi can't use
;; adds/subs.
-;; There's currently no way to have a insv/extzv expander for the H8/300H
+;; There's currently no way to have an insv/extzv expander for the H8/300H
;; because word_mode is different for the H8/300 and H8/300H.
;; Shifts/rotates by small constants should be handled by special
@@ -97,7 +97,7 @@
;; none - insn does not affect cc
;; none_0hit - insn does not affect cc but it does modify operand 0
;; This attribute is used to keep track of when operand 0 changes.
-;; See the description of NOTICE_UPDATE_CC for more info.
+;; See the description of NOTICE_UPDATE_CC for more info.
;; set_znv - insn sets z,n,v to usable values (like a tst insn); c is unknown.
;; set_zn - insn sets z,n to usable values; v,c are unknown.
;; compare - compare instruction
@@ -353,7 +353,7 @@
|| register_operand (operands[1], SImode))"
"*
{
- int rn = -1;
+ unsigned int rn = -1;
switch (which_alternative)
{
case 0:
@@ -420,7 +420,7 @@
"*
{
/* Copy of the movsi stuff. */
- int rn = -1;
+ unsigned int rn = -1;
switch (which_alternative)
{
case 0:
@@ -922,7 +922,7 @@
(umod:HI
(match_dup 1)
(zero_extend:HI (match_dup 2)))))]
- "TARGET_H8300H || TARGET_H8300S"
+ ""
"*
{
if (find_reg_note (insn, REG_UNUSED, operands[3]))
@@ -1529,7 +1529,7 @@
;; Call subroutine with no return value.
-;; ??? Even though we use HImode here, this works on the H8/300H and H8/S.
+;; ??? Even though we use HImode here, this works on the H8/300H and H8S.
(define_insn "call"
[(call (match_operand:QI 0 "call_insn_operand" "or")
@@ -1552,7 +1552,7 @@
;; Call subroutine, returning value in operand 0
;; (which must be a hard register).
-;; ??? Even though we use HImode here, this works on the H8/300H and H8/S.
+;; ??? Even though we use HImode here, this works on the H8/300H and H8S.
(define_insn "call_value"
[(set (match_operand 0 "" "=r")
@@ -1991,7 +1991,7 @@
"TARGET_H8300"
"
{
- /* We only have single bit bitfield instructions. */
+ /* We only have single bit bit-field instructions. */
if (INTVAL (operands[1]) != 1)
FAIL;
@@ -2019,7 +2019,7 @@
"TARGET_H8300"
"
{
- /* We only have single bit bitfield instructions. */
+ /* We only have single bit bit-field instructions. */
if (INTVAL (operands[2]) != 1)
FAIL;
diff --git a/gcc/config/h8300/lib1funcs.asm b/gcc/config/h8300/lib1funcs.asm
index b86e9efe5e2..734b25d7992 100644
--- a/gcc/config/h8300/lib1funcs.asm
+++ b/gcc/config/h8300/lib1funcs.asm
@@ -775,7 +775,7 @@ L_skip2:
space. For the H8/300H and H8S, the C version is good enough. */
#ifdef __H8300__
/* We still treat NANs different than libgcc2.c, but then, the
- behaviour is undefined anyways. */
+ behavior is undefined anyways. */
.global ___fixunssfsi
___fixunssfsi:
cmp.b #0x47,r0h
diff --git a/gcc/config/i370/i370-c.c b/gcc/config/i370/i370-c.c
index d2344bc0108..5651a5661c3 100644
--- a/gcc/config/i370/i370-c.c
+++ b/gcc/config/i370/i370-c.c
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
#include "toplev.h"
#include "cpplib.h"
#include "c-pragma.h"
-#include "i370-protos.h"
+#include "tm_p.h"
#ifdef TARGET_HLASM
diff --git a/gcc/config/i370/i370-protos.h b/gcc/config/i370/i370-protos.h
index 8ca7ca64085..a3f4acd8eb8 100644
--- a/gcc/config/i370/i370-protos.h
+++ b/gcc/config/i370/i370-protos.h
@@ -24,6 +24,8 @@ Boston, MA 02111-1307, USA. */
#ifndef GCC_I370_PROTOS_H
#define GCC_I370_PROTOS_H
+extern void override_options PARAMS ((void));
+
#ifdef RTX_CODE
extern int i370_branch_dest PARAMS ((rtx));
extern int i370_branch_length PARAMS ((rtx));
diff --git a/gcc/config/i370/i370.c b/gcc/config/i370/i370.c
index e84ccc85a14..8e7ffd2ea3a 100644
--- a/gcc/config/i370/i370.c
+++ b/gcc/config/i370/i370.c
@@ -109,6 +109,7 @@ static void i370_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static int mvs_hash_alias PARAMS ((const char *));
#endif
static void i370_encode_section_info PARAMS ((tree, int));
+static void i370_internal_label PARAMS ((FILE *, const char *, unsigned long));
/* ===================================================== */
/* defines and functions specific to the HLASM assembler */
@@ -312,9 +313,23 @@ static const unsigned char ebcasc[256] =
#define TARGET_ASM_FUNCTION_EPILOGUE i370_output_function_epilogue
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO i370_encode_section_info
+#undef TARGET_ASM_INTERNAL_LABEL
+#define TARGET_ASM_INTERNAL_LABEL i370_internal_label
struct gcc_target targetm = TARGET_INITIALIZER;
+/* Set global variables as needed for the options enabled. */
+
+void
+override_options ()
+{
+ /* We're 370 floating point, not IEEE floating point. */
+ memset (real_format_for_mode, 0, sizeof real_format_for_mode);
+ real_format_for_mode[SFmode - QFmode] = &i370_single_format;
+ real_format_for_mode[DFmode - QFmode] = &i370_double_format;
+}
+
+
/* Map characters from one character set to another.
C is the character to be translated. */
@@ -1444,7 +1459,7 @@ i370_globalize_label (stream, name)
-- subtracts stackframe size from the stack pointer.
-- stores backpointer to old caller stack.
- XXX hack alert -- if the global var int leaf_function is non-zero,
+ XXX hack alert -- if the global var int leaf_function is nonzero,
then this is a leaf, and it might be possible to optimize the prologue
into doing even less, e.g. not grabbing a new stackframe or maybe just a
partial stack frame.
@@ -1585,3 +1600,14 @@ i370_encode_section_info (decl, first)
SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
}
+static void
+i370_internal_label (stream, prefix, labelno)
+ FILE *stream;
+ const char *prefix;
+ unsigned long labelno;
+{
+ if (!strcmp (prefix, "L"))
+ mvs_add_label(labelno);
+
+ default_internal_label (stream, prefix, labelno);
+}
diff --git a/gcc/config/i370/i370.h b/gcc/config/i370/i370.h
index 7bcbdf893a1..802103315d2 100644
--- a/gcc/config/i370/i370.h
+++ b/gcc/config/i370/i370.h
@@ -76,6 +76,8 @@ extern int mvs_function_name_length;
{ "no-char-instructions", -1, N_("Do not generate char instructions")}, \
{ "", TARGET_DEFAULT, 0} }
+#define OVERRIDE_OPTIONS override_options ()
+
/* To use IBM supplied macro function prologue and epilogue, define the
following to 1. Should only be needed if IBM changes the definition
of their prologue and epilogue. */
@@ -654,12 +656,6 @@ enum reg_class
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT */
-/* #define HAVE_POST_DECREMENT */
-
-/* #define HAVE_PRE_DECREMENT */
-/* #define HAVE_PRE_INCREMENT */
-
/* These assume that REGNO is a hard or pseudo reg number. They give
nonzero only if REGNO is a hard reg of the suitable class or a pseudo
reg currently allocated to a suitable hard reg.
@@ -1096,18 +1092,6 @@ enum reg_class
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf (LABEL, "*%s%d", PREFIX, NUM)
-/* Generate internal label. Since we can branch here from off page, we
- must reload the base register. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
-{ \
- if (!strcmp (PREFIX,"L")) \
- { \
- mvs_add_label(NUM); \
- } \
- fprintf (FILE, "%s%d\tEQU\t*\n", PREFIX, NUM); \
-}
-
/* Generate case label. For HLASM we can change to the data CSECT
and put the vectors out of the code body. The assembler just
concatenates CSECTs with the same name. */
@@ -1256,15 +1240,7 @@ enum reg_class
ASM_OUTPUT_SKIP (FILE,SIZE); \
}
-/* Store in OUTPUT a string (made with alloca) containing an
- assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-{ \
- (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10); \
- sprintf ((OUTPUT), "%s%d", (NAME), (LABELNO)); \
-}
+#define ASM_PN_FORMAT "%s%lu"
/* Print operand XV (an rtx) in assembler syntax to file FILE.
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
@@ -1369,21 +1345,21 @@ enum reg_class
else \
{ \
char buf[50]; \
- REAL_VALUE_TYPE rval; \
- REAL_VALUE_FROM_CONST_DOUBLE(rval, XV); \
- REAL_VALUE_TO_DECIMAL (rval, HOST_WIDE_INT_PRINT_DEC, buf); \
if (GET_MODE (XV) == SFmode) \
{ \
mvs_page_lit += 4; \
+ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (XV), \
+ sizeof (buf), 0, 1); \
fprintf (FILE, "=E'%s'", buf); \
} \
- else \
- if (GET_MODE (XV) == DFmode) \
+ else if (GET_MODE (XV) == DFmode) \
{ \
mvs_page_lit += 8; \
+ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (XV), \
+ sizeof (buf), 0, 1); \
fprintf (FILE, "=D'%s'", buf); \
} \
- else /* VOIDmode !?!? strange but true ... */ \
+ else /* VOIDmode */ \
{ \
mvs_page_lit += 8; \
fprintf (FILE, "=XL8'%08X%08X'", \
@@ -1663,21 +1639,21 @@ enum reg_class
else \
{ \
char buf[50]; \
- REAL_VALUE_TYPE rval; \
- REAL_VALUE_FROM_CONST_DOUBLE(rval, XV); \
- REAL_VALUE_TO_DECIMAL (rval, HOST_WIDE_INT_PRINT_DEC, buf); \
if (GET_MODE (XV) == SFmode) \
{ \
mvs_page_lit += 4; \
+ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (XV), \
+ sizeof (buf), 0, 1); \
fprintf (FILE, "=E'%s'", buf); \
} \
- else \
- if (GET_MODE (XV) == DFmode) \
+ else if (GET_MODE (XV) == DFmode) \
{ \
mvs_page_lit += 8; \
+ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (XV), \
+ sizeof (buf), 0, 1); \
fprintf (FILE, "=D'%s'", buf); \
} \
- else /* VOIDmode !?!? strange but true ... */ \
+ else /* VOIDmode */ \
{ \
mvs_page_lit += 8; \
fprintf (FILE, "=XL8'%08X%08X'", \
@@ -1835,19 +1811,6 @@ abort(); \
/* #define ASM_OUTPUT_LABELREF(FILE, NAME) */ /* use gas -- defaults.h */
-/* Generate internal label. Since we can branch here from off page, we
- must reload the base register. Note that internal labels are generated
- for loops, goto's and case labels. */
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
-{ \
- if (!strcmp (PREFIX,"L")) \
- { \
- mvs_add_label(NUM); \
- } \
- fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
-}
-
/* let config/svr4.h define this ...
* #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, TABLE)
* fprintf (FILE, "%s%d:\n", PREFIX, NUM)
@@ -1884,11 +1847,7 @@ abort(); \
#undef SHIFT_DOUBLE_OMITS_COUNT
#define SHIFT_DOUBLE_OMITS_COUNT 0
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
- /* Implicit library calls should use memcpy, not bcopy, etc. */
+/* Implicit library calls should use memcpy, not bcopy, etc. */
#define TARGET_MEM_FUNCTIONS
/* Output before read-only data. */
diff --git a/gcc/config/i370/t-i370 b/gcc/config/i370/t-i370
index 049d84f6db9..34758d838fd 100644
--- a/gcc/config/i370/t-i370
+++ b/gcc/config/i370/t-i370
@@ -1,3 +1,3 @@
-i370-c.o: $(srcdir)/config/i370/i370-c.c $(srcdir)/config/i370/i370-protos.h \
- $(CONFIG_H) $(SYSTEM_H) cpplib.h $(TREE_H) c-pragma.h toplev.h
+i370-c.o: $(srcdir)/config/i370/i370-c.c $(CONFIG_H) $(SYSTEM_H) cpplib.h \
+ $(TREE_H) c-pragma.h toplev.h $(TM_P_H)
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
diff --git a/gcc/config/i386/athlon.md b/gcc/config/i386/athlon.md
index d6a52f2cbdd..7113cb88345 100644
--- a/gcc/config/i386/athlon.md
+++ b/gcc/config/i386/athlon.md
@@ -1,34 +1,5 @@
;; AMD Athlon Scheduling
-;; Copyright (C) 2002 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. */
-(define_attr "athlon_decode" "direct,vector"
- (cond [(eq_attr "type" "call,imul,idiv,other,multi,fcmov,fpspc,str,pop,cld,fcmov")
- (const_string "vector")
- (and (eq_attr "type" "push")
- (match_operand 1 "memory_operand" ""))
- (const_string "vector")
- (and (eq_attr "type" "fmov")
- (and (eq_attr "memory" "load,store")
- (eq_attr "mode" "XF")))
- (const_string "vector")]
- (const_string "direct")))
-
;; The Athlon does contain three pipelined FP units, three integer units and
;; three address generation units.
;;
@@ -46,161 +17,419 @@
;; The load/store queue unit is not attached to the schedulers but
;; communicates with all the execution units separately instead.
-(define_function_unit "athlon_vectordec" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_decode" "vector"))
- 1 1)
-
-(define_function_unit "athlon_directdec" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_decode" "direct"))
- 1 1)
-
-(define_function_unit "athlon_vectordec" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_decode" "direct"))
- 1 1 [(eq_attr "athlon_decode" "vector")])
-
-(define_function_unit "athlon_ieu" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "alu1,negnot,alu,icmp,test,imov,imovx,lea,incdec,ishift,rotate,ibr,call,callv,icmov,cld,pop,setcc,push,pop"))
- 1 1)
-
-(define_function_unit "athlon_ieu" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "str"))
- 15 15)
-
-(define_function_unit "athlon_ieu" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "imul"))
- 5 0)
-
-(define_function_unit "athlon_ieu" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "idiv"))
- 42 0)
-
-(define_function_unit "athlon_muldiv" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "imul"))
- 5 0)
-
-(define_function_unit "athlon_muldiv" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "idiv"))
- 42 42)
-
-(define_attr "athlon_fpunits" "none,store,mul,add,muladd,any"
- (cond [(eq_attr "type" "fop,fcmp,fistp")
- (const_string "add")
- (eq_attr "type" "fmul,fdiv,fpspc,fsgn,fcmov")
- (const_string "mul")
- (and (eq_attr "type" "fmov") (eq_attr "memory" "store,both"))
- (const_string "store")
- (and (eq_attr "type" "fmov") (eq_attr "memory" "load"))
- (const_string "any")
+(define_attr "athlon_decode" "direct,vector"
+ (cond [(eq_attr "type" "call,imul,idiv,other,multi,fcmov,fpspc,str,pop,cld")
+ (const_string "vector")
+ (and (eq_attr "type" "push")
+ (match_operand 1 "memory_operand" ""))
+ (const_string "vector")
(and (eq_attr "type" "fmov")
- (ior (match_operand:SI 1 "register_operand" "")
- (match_operand 1 "immediate_operand" "")))
- (const_string "store")
- (eq_attr "type" "fmov")
- (const_string "muladd")]
- (const_string "none")))
-
-;; We use latencies 1 for definitions. This is OK to model colisions
-;; in execution units. The real latencies are modeled in the "fp" pipeline.
-
-;; fsin, fcos: 96-192
-;; fsincos: 107-211
-;; fsqrt: 19 for SFmode, 27 for DFmode, 35 for XFmode.
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "fpspc"))
- 100 1)
-
-;; 16 cycles for SFmode, 20 for DFmode and 24 for XFmode.
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "fdiv"))
- 24 1)
-
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "fop,fmul,fistp"))
- 4 1)
-
-;; XFmode loads are slow.
-;; XFmode store is slow too (8 cycles), but we don't need to model it, because
-;; there are no dependent instructions.
+ (and (eq_attr "memory" "load,store")
+ (eq_attr "mode" "XF")))
+ (const_string "vector")]
+ (const_string "direct")))
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (and (eq_attr "type" "fmov")
- (and (eq_attr "memory" "load")
- (eq_attr "mode" "XF"))))
- 10 1)
+;;
+;; decode0 decode1 decode2
+;; \ | /
+;; instruction control unit (72 entry scheduler)
+;; | |
+;; integer scheduler (18) stack map
+;; / | | | | \ stack rename
+;; ieu0 agu0 ieu1 agu1 ieu2 agu2 scheduler
+;; | agu0 | agu1 agu2 register file
+;; | \ | | / | | |
+;; \ /\ | / fadd fmul fstore
+;; \ / \ | / fadd fmul fstore
+;; imul load/store (2x) fadd fmul fstore
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "fmov,fsgn"))
- 2 1)
+(define_automaton "athlon,athlon_mult,athlon_fp")
+(define_cpu_unit "athlon-decode0" "athlon")
+(define_cpu_unit "athlon-decode1" "athlon")
+(define_cpu_unit "athlon-decode2" "athlon")
+(define_reservation "athlon-vector" "(athlon-decode0 + athlon-decode1
+ + athlon-decode2)")
+(define_reservation "athlon-direct" "(athlon-decode0 | athlon-decode1
+ | athlon-decode2)")
-;; fcmp and ftst instructions
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (and (eq_attr "type" "fcmp")
- (eq_attr "athlon_decode" "direct")))
- 3 1)
+;; Agu and ieu unit results in extremly large automatons and
+;; in our approximation they are hardly filled in. Only ieu
+;; unit can, as issue rate is 3 and agu unit is always used
+;; first in the insn reservations. Skip the models.
-;; fcmpi instructions.
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (and (eq_attr "type" "fcmp")
- (eq_attr "athlon_decode" "vector")))
- 3 1)
+;(define_cpu_unit "athlon-ieu0" "athlon_ieu")
+;(define_cpu_unit "athlon-ieu1" "athlon_ieu")
+;(define_cpu_unit "athlon-ieu2" "athlon_ieu")
+;(define_reservation "athlon-ieu" "(athlon-ieu0 | athlon-ieu1 | athlon-ieu2)")
+(define_reservation "athlon-ieu" "nothing")
+;(define_cpu_unit "athlon-agu0" "athlon_agu")
+;(define_cpu_unit "athlon-agu1" "athlon_agu")
+;(define_cpu_unit "athlon-agu2" "athlon_agu")
+;(define_reservation "athlon-agu" "(athlon-agu0 | athlon-agu1 | athlon-agu2)")
+(define_reservation "athlon-agu" "nothing,nothing")
-(define_function_unit "athlon_fp" 3 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "type" "fcmov"))
- 7 1)
+(define_cpu_unit "athlon-mult" "athlon_mult")
-(define_function_unit "athlon_fp_mul" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_fpunits" "mul"))
- 1 1)
+(define_cpu_unit "athlon-load0" "athlon")
+(define_cpu_unit "athlon-load1" "athlon")
+(define_reservation "athlon-load" "athlon-agu,
+ (athlon-load0 | athlon-load1)")
+(define_reservation "athlon-store" "nothing")
-(define_function_unit "athlon_fp_add" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_fpunits" "add"))
- 1 1)
+;; The three fp units are fully pipelined with latency of 3
+(define_cpu_unit "athlon-fadd" "athlon_fp")
+(define_cpu_unit "athlon-fmul" "athlon_fp")
+(define_cpu_unit "athlon-fstore" "athlon_fp")
+(define_reservation "athlon-fany" "(athlon-fadd | athlon-fmul | athlon-fstore)")
+(define_reservation "athlon-faddmul" "(athlon-fadd | athlon-fmul)")
-(define_function_unit "athlon_fp_muladd" 2 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_fpunits" "muladd,mul,add"))
- 1 1)
-(define_function_unit "athlon_fp_store" 1 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "athlon_fpunits" "store"))
- 1 1)
+;; Jump instructions are executed in the branch unit compltetely transparent to us
+(define_insn_reservation "athlon_branch" 0
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "ibr"))
+ "athlon-direct")
+(define_insn_reservation "athlon_call" 0
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "call,callv"))
+ "athlon-vector")
-;; We don't need to model the Address Generation Unit, since we don't model
-;; the re-order buffer yet and thus we never schedule more than three operations
-;; at time. Later we may want to experiment with MD_SCHED macros modeling the
-;; decoders independently on the functional units.
+;; Latency of push operation is 3 cycles, but ESP value is available
+;; earlier
+(define_insn_reservation "athlon_push" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "push"))
+ "athlon-direct,nothing,athlon-store")
+(define_insn_reservation "athlon_pop" 4
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "push"))
+ "athlon-vector,athlon-ieu,athlon-load")
+(define_insn_reservation "athlon_leave" 3
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "push"))
+ "athlon-vector,athlon-load")
-;(define_function_unit "athlon_agu" 3 0
-; (and (eq_attr "cpu" "athlon")
-; (and (eq_attr "memory" "!none")
-; (eq_attr "athlon_fpunits" "none")))
-; 1 1)
+;; Lea executes in AGU unit with 2 cycles latency.
+(define_insn_reservation "athlon_lea" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "lea"))
+ "athlon-direct,athlon-agu")
-;; Model load unit to avoid too long sequences of loads. We don't need to
-;; model store queue, since it is hardly going to be bottleneck.
+;; Mul executes in special multiplier unit attached to IEU0
+(define_insn_reservation "athlon_imul" 5
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "imul")
+ (eq_attr "memory" "none,unknown")))
+ "athlon-vector,athlon-ieu,athlon-mult,nothing,nothing,athlon-ieu")
+(define_insn_reservation "athlon_imul_mem" 8
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "imul")
+ (eq_attr "memory" "load,both")))
+ "athlon-vector,athlon-load,athlon-ieu,athlon-mult,nothing,nothing,athlon-ieu")
+(define_insn_reservation "athlon_idiv" 42
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "idiv")
+ (eq_attr "memory" "none,unknown")))
+ "athlon-vector,athlon-ieu*42")
+(define_insn_reservation "athlon_idiv_mem" 45
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "idiv")
+ (eq_attr "memory" "load,both")))
+ "athlon-vector,athlon-load,athlon-ieu*42")
+(define_insn_reservation "athlon_str" 15
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "str")
+ (eq_attr "memory" "load,both,store")))
+ "athlon-vector,athlon-load,athlon-ieu*10")
-(define_function_unit "athlon_load" 2 0
- (and (eq_attr "cpu" "athlon")
- (eq_attr "memory" "load,both"))
- 1 1)
+(define_insn_reservation "athlon_idirect" 1
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "direct")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "none,unknown"))))
+ "athlon-direct,athlon-ieu")
+(define_insn_reservation "athlon_ivector" 2
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "vector")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "none,unknown"))))
+ "athlon-vector,athlon-ieu,athlon-ieu")
+(define_insn_reservation "athlon_idirect_loadmov" 3
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "imov")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load")
+(define_insn_reservation "athlon_idirect_load" 4
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "direct")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "load"))))
+ "athlon-direct,athlon-load,athlon-ieu")
+(define_insn_reservation "athlon_ivector_load" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "vector")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "load"))))
+ "athlon-vector,athlon-load,athlon-ieu,athlon-ieu")
+(define_insn_reservation "athlon_idirect_movstore" 1
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "imov")
+ (eq_attr "memory" "store")))
+ "athlon-direct,athlon-agu,athlon-store")
+(define_insn_reservation "athlon_idirect_both" 4
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "direct")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "both"))))
+ "athlon-direct,athlon-load,athlon-ieu,
+ athlon-store")
+(define_insn_reservation "athlon_ivector_both" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "vector")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "both"))))
+ "athlon-vector,athlon-load,athlon-ieu,athlon-ieu,
+ athlon-store")
+(define_insn_reservation "athlon_idirect_store" 1
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "direct")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "store"))))
+ "athlon-direct,athlon-ieu,
+ athlon-store")
+(define_insn_reservation "athlon_ivector_store" 2
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "vector")
+ (and (eq_attr "unit" "integer,unknown")
+ (eq_attr "memory" "store"))))
+ "athlon-vector,athlon-ieu,athlon-ieu,
+ athlon-store")
+;; Athlon floatin point unit
+(define_insn_reservation "athlon_fldxf" 12
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fmov")
+ (and (eq_attr "memory" "load")
+ (eq_attr "mode" "XF"))))
+ "athlon-vector,athlon-fany")
+(define_insn_reservation "athlon_fld" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fmov")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-fany,nothing,athlon-load")
+(define_insn_reservation "athlon_fstxf" 10
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fmov")
+ (and (eq_attr "memory" "store,both")
+ (eq_attr "mode" "XF"))))
+ "athlon-vector,athlon-fstore")
+(define_insn_reservation "athlon_fst" 4
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fmov")
+ (eq_attr "memory" "store,both")))
+ "athlon-direct,athlon-fstore,nothing,athlon-store")
+(define_insn_reservation "athlon_fist" 4
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fistp"))
+ "athlon-direct,athlon-fstore,nothing")
+(define_insn_reservation "athlon_fmov" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fmov"))
+ "athlon-direct,athlon-faddmul")
+(define_insn_reservation "athlon_fadd_load" 7
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fop")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load,athlon-fadd")
+(define_insn_reservation "athlon_fadd" 4
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fop"))
+ "athlon-direct,athlon-fadd")
+(define_insn_reservation "athlon_fmul_load" 7
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fmul")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_fmul" 4
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fmul"))
+ "athlon-direct,athlon-fmul")
+(define_insn_reservation "athlon_fsgn" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fsgn"))
+ "athlon-direct,athlon-fmul")
+(define_insn_reservation "athlon_fdiv_load" 24
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fdiv")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_fdiv" 24
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fdiv"))
+ "athlon-direct,athlon-fmul")
+(define_insn_reservation "athlon_fpspc_load" 103
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fpspc")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_fpspc" 100
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fpspc"))
+ "athlon-vector,athlon-fmul")
+(define_insn_reservation "athlon_fcmov_load" 10
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fcmov")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_fcmov" 7
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fcmov"))
+ "athlon-vector,athlon-fmul")
+(define_insn_reservation "athlon_fcomi_load" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fcmp")
+ (and (eq_attr "athlon_decode" "vector")
+ (eq_attr "memory" "load"))))
+ "athlon-vector,athlon-load,athlon-fadd")
+(define_insn_reservation "athlon_fcomi" 3
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "athlon_decode" "vector")
+ (eq_attr "type" "fcmp")))
+ "athlon-vector,athlon-fadd")
+(define_insn_reservation "athlon_fcom_load" 5
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "fcmp")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load,athlon-fadd")
+(define_insn_reservation "athlon_fcom" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fcmp"))
+ "athlon-direct,athlon-fadd")
+(define_insn_reservation "athlon_fxch" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "fxch"))
+ "athlon-direct,athlon-fany")
+;; Athlon handle MMX operations in the FPU unit with shorter latencies
+(define_insn_reservation "athlon_mmxsseld" 4
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "mmxmov,ssemov")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-fany,athlon-load")
+(define_insn_reservation "athlon_mmxssest" 2
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "mmxmov,ssemov")
+ (eq_attr "memory" "store,both")))
+ "athlon-direct,athlon-store")
+(define_insn_reservation "athlon_mmxssemov" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "mmxmov,ssemov"))
+ "athlon-direct,athlon-faddmul")
+(define_insn_reservation "athlon_mmxmul_load" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "mmxmul")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_mmxmul" 3
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "mmxmul"))
+ "athlon-direct,athlon-fmul")
+(define_insn_reservation "athlon_mmx_load" 5
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "unit" "mmx")
+ (eq_attr "memory" "load")))
+ "athlon-direct,athlon-load,athlon-faddmul")
+(define_insn_reservation "athlon_mmx" 2
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "unit" "mmx"))
+ "athlon-direct,athlon-faddmul")
+;; SSE operations are handled by the i387 unit as well. The latnecy
+;; is same as for i387 operations for scalar operations
+(define_insn_reservation "athlon_sselog_load" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "sselog")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_sselog" 3
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "sselog"))
+ "athlon-vector,athlon-fmul")
+(define_insn_reservation "athlon_ssecmp_load" 5
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssecmp")
+ (and (eq_attr "mode" "SF,DF")
+ (eq_attr "memory" "load"))))
+ "athlon-vector,athlon-load,athlon-fadd")
+(define_insn_reservation "athlon_ssecmp" 2
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssecmp")
+ (eq_attr "mode" "SF,DF")))
+ "athlon-direct,athlon-fadd")
+(define_insn_reservation "athlon_ssecmpvector_load" 6
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssecmp")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-fadd")
+(define_insn_reservation "athlon_ssecmpvector" 3
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "ssecmp"))
+ "athlon-vector,athlon-fadd")
+(define_insn_reservation "athlon_sseadd_load" 7
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "sseadd")
+ (and (eq_attr "mode" "SF,DF")
+ (eq_attr "memory" "load"))))
+ "athlon-direct,athlon-load,athlon-fadd")
+(define_insn_reservation "athlon_sseadd" 4
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "sseadd")
+ (eq_attr "mode" "SF,DF")))
+ "athlon-direct,athlon-fadd")
+(define_insn_reservation "athlon_sseaddvector_load" 8
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "sseadd")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-load,athlon-fadd")
+(define_insn_reservation "athlon_sseaddvector" 5
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "sseadd"))
+ "athlon-vector,athlon-fadd")
+(define_insn_reservation "athlon_ssemul_load" 7
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssemul")
+ (and (eq_attr "mode" "SF,DF")
+ (eq_attr "memory" "load"))))
+ "athlon-direct,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_ssemul" 4
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssemul")
+ (eq_attr "mode" "SF,DF")))
+ "athlon-direct,athlon-fmul")
+(define_insn_reservation "athlon_ssemulvector_load" 8
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssemul")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_ssemulvector" 5
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "ssemul"))
+ "athlon-vector,athlon-fmul")
+(define_insn_reservation "athlon_ssediv_load" 19
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssediv")
+ (and (eq_attr "mode" "SF,DF")
+ (eq_attr "memory" "load"))))
+ "athlon-direct,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_ssediv" 16
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssediv")
+ (eq_attr "mode" "SF,DF")))
+ "athlon-direct,athlon-fmul")
+(define_insn_reservation "athlon_ssedivvector_load" 32
+ (and (eq_attr "cpu" "athlon")
+ (and (eq_attr "type" "ssediv")
+ (eq_attr "memory" "load")))
+ "athlon-vector,athlon-load,athlon-fmul")
+(define_insn_reservation "athlon_ssedivvector" 29
+ (and (eq_attr "cpu" "athlon")
+ (eq_attr "type" "ssediv"))
+ "athlon-vector,athlon-fmul")
diff --git a/gcc/config/i386/att.h b/gcc/config/i386/att.h
index 70ae1641365..8d9930852f7 100644
--- a/gcc/config/i386/att.h
+++ b/gcc/config/i386/att.h
@@ -90,13 +90,6 @@ do \
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
sprintf ((BUF), "%s%s%ld", LOCAL_LABEL_PREFIX, (PREFIX), (long)(NUMBER))
-/* This is how to output 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, "%s%s%d:\n", LOCAL_LABEL_PREFIX, PREFIX, NUM)
-
/* The prefix to add to user-visible assembler symbols. */
#undef USER_LABEL_PREFIX
diff --git a/gcc/config/i386/bsd.h b/gcc/config/i386/bsd.h
index 69ad1688bfb..9f396ec46ae 100644
--- a/gcc/config/i386/bsd.h
+++ b/gcc/config/i386/bsd.h
@@ -88,12 +88,6 @@ Boston, MA 02111-1307, USA. */
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
sprintf ((BUF), "*%s%ld", (PREFIX), (long)(NUMBER))
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", PREFIX, NUM)
-
/* The prefix to add to user-visible assembler symbols. */
#define USER_LABEL_PREFIX "_"
diff --git a/gcc/config/i386/cygwin.h b/gcc/config/i386/cygwin.h
index e849c9b800d..680bf74da77 100644
--- a/gcc/config/i386/cygwin.h
+++ b/gcc/config/i386/cygwin.h
@@ -20,8 +20,8 @@ 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 DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
#define TARGET_VERSION fprintf (stderr, " (x86 Cygwin)");
@@ -418,7 +418,7 @@ extern int i386_pe_dllimport_name_p PARAMS ((const char *));
#undef BIGGEST_FIELD_ALIGNMENT
#define BIGGEST_FIELD_ALIGNMENT 64
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#undef PCC_BITFIELD_TYPE_MATTERS
#define PCC_BITFIELD_TYPE_MATTERS 1
#define GROUP_BITFIELDS_BY_ALIGN TYPE_NATIVE(rec)
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index b37d4e89094..55c29fd945f 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -72,11 +72,6 @@ Boston, MA 02111-1307, USA. */
#define LPREFIX "L"
-/* This definition is unlikely to be used, but provide it just in
- case. */
-
-#define USER_LABEL_PREFIX "_"
-
/* Assembler pseudos to introduce constants of various size. */
#define ASM_BYTE_OP "\t.byte\t"
diff --git a/gcc/config/i386/djgpp.h b/gcc/config/i386/djgpp.h
index 3afafd0ae3c..29b93d96a8c 100644
--- a/gcc/config/i386/djgpp.h
+++ b/gcc/config/i386/djgpp.h
@@ -20,7 +20,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Support generation of DWARF2 debugging info. */
-#define DWARF2_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
diff --git a/gcc/config/i386/freebsd-aout.h b/gcc/config/i386/freebsd-aout.h
index d5fab7c8f76..3eb2ca9822d 100644
--- a/gcc/config/i386/freebsd-aout.h
+++ b/gcc/config/i386/freebsd-aout.h
@@ -210,7 +210,8 @@ do { \
ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \
} while (0)
-#define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k}"
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
+#define ASM_SPEC "%{fpic:-k} %{fPIC:-k}"
#define LINK_SPEC \
"%{p:%e`-p' not supported; use `-pg' and gprof(1)} \
%{shared:-Bshareable} \
diff --git a/gcc/config/i386/gas.h b/gcc/config/i386/gas.h
index 7c15e0bdb13..075d7498f3e 100644
--- a/gcc/config/i386/gas.h
+++ b/gcc/config/i386/gas.h
@@ -43,7 +43,7 @@ Boston, MA 02111-1307, USA. */
/* Ask for COFF symbols. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* Output #ident as a .ident. */
diff --git a/gcc/config/i386/gstabs.h b/gcc/config/i386/gstabs.h
index 716e37a21f3..e9a621871e3 100644
--- a/gcc/config/i386/gstabs.h
+++ b/gcc/config/i386/gstabs.h
@@ -4,4 +4,4 @@
/* We want to output DBX debugging information. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
diff --git a/gcc/config/i386/i386-coff.h b/gcc/config/i386/i386-coff.h
index d4d155323e5..a4bb04ad729 100644
--- a/gcc/config/i386/i386-coff.h
+++ b/gcc/config/i386/i386-coff.h
@@ -27,8 +27,7 @@ Boston, MA 02111-1307, USA. */
/* We want to be able to get DBX debugging information via -gstabs. */
-#undef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
@@ -61,11 +60,4 @@ Boston, MA 02111-1307, USA. */
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
sprintf ((BUF), ".%s%ld", (PREFIX), (long)(NUMBER))
-/* This is how to output 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, ".%s%d:\n", PREFIX, NUM)
-
/* end of i386-coff.h */
diff --git a/gcc/config/i386/i386-interix.h b/gcc/config/i386/i386-interix.h
index 02842238bb6..79aafa43344 100644
--- a/gcc/config/i386/i386-interix.h
+++ b/gcc/config/i386/i386-interix.h
@@ -26,8 +26,8 @@ Boston, MA 02111-1307, USA. */
/* The rest must follow. */
-#define DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
#define HANDLE_SYSV_PRAGMA
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index a81e0f537b2..a8244a38b69 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -42,6 +42,12 @@ extern int standard_80387_constant_p PARAMS ((rtx));
extern int standard_sse_constant_p PARAMS ((rtx));
extern int symbolic_reference_mentioned_p PARAMS ((rtx));
+extern int any_fp_register_operand PARAMS ((rtx, enum machine_mode));
+extern int register_and_not_any_fp_reg_operand PARAMS ((rtx, enum machine_mode));
+
+extern int fp_register_operand PARAMS ((rtx, enum machine_mode));
+extern int register_and_not_fp_reg_operand PARAMS ((rtx, enum machine_mode));
+
extern int x86_64_general_operand PARAMS ((rtx, enum machine_mode));
extern int x86_64_szext_general_operand PARAMS ((rtx, enum machine_mode));
extern int x86_64_nonmemory_operand PARAMS ((rtx, enum machine_mode));
@@ -57,6 +63,7 @@ extern int initial_exec_symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int local_exec_symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int pic_symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int call_insn_operand PARAMS ((rtx, enum machine_mode));
+extern int sibcall_insn_operand PARAMS ((rtx, enum machine_mode));
extern int constant_call_address_operand PARAMS ((rtx, enum machine_mode));
extern int const0_operand PARAMS ((rtx, enum machine_mode));
extern int const1_operand PARAMS ((rtx, enum machine_mode));
@@ -110,6 +117,7 @@ extern const char *output_fix_trunc PARAMS ((rtx, rtx*));
extern const char *output_fp_compare PARAMS ((rtx, rtx*, int, int));
extern void i386_dwarf_output_addr_const PARAMS ((FILE*, rtx));
+extern void i386_output_dwarf_dtprel PARAMS ((FILE*, int, rtx));
extern rtx i386_simplify_dwarf_addr PARAMS ((rtx));
extern void ix86_expand_clear PARAMS ((rtx));
@@ -204,7 +212,6 @@ extern tree ix86_handle_shared_attribute PARAMS ((tree *, tree, tree, int, bool
extern unsigned int i386_pe_section_type_flags PARAMS ((tree, const char *,
int));
extern void i386_pe_asm_named_section PARAMS ((const char *, unsigned int));
-extern void x86_output_mi_thunk PARAMS ((FILE *, int, tree));
extern int x86_field_alignment PARAMS ((tree, int));
#endif
@@ -212,6 +219,13 @@ extern rtx ix86_tls_get_addr PARAMS ((void));
extern void x86_machine_dependent_reorg PARAMS ((rtx));
/* In winnt.c */
+extern int i386_pe_dllexport_name_p PARAMS ((const char *));
+extern int i386_pe_dllimport_name_p PARAMS ((const char *));
+extern void i386_pe_unique_section PARAMS ((tree, int));
+extern void i386_pe_declare_function_type PARAMS ((FILE *, const char *, int));
+extern void i386_pe_record_external_function PARAMS ((const char *));
+extern void i386_pe_record_exported_symbol PARAMS ((const char *, int));
+extern void i386_pe_asm_file_end PARAMS ((FILE *));
extern void i386_pe_encode_section_info PARAMS ((tree, int));
extern const char *i386_pe_strip_name_encoding PARAMS ((const char *));
extern const char *i386_pe_strip_name_encoding_full PARAMS ((const char *));
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 2f66a01230b..ae79a13fe8e 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -84,7 +84,15 @@ struct processor_costs size_cost = { /* costs for tunning for size */
3, /* MMX or SSE register to integer */
0, /* size of prefetch block */
0, /* number of parallel prefetches */
+ 1, /* Branch cost */
+ 2, /* cost of FADD and FSUB insns. */
+ 2, /* cost of FMUL instruction. */
+ 2, /* cost of FDIV instruction. */
+ 2, /* cost of FABS instruction. */
+ 2, /* cost of FCHS instruction. */
+ 2, /* cost of FSQRT instruction. */
};
+
/* Processor costs (relative to an add) */
static const
struct processor_costs i386_cost = { /* 386 specific costs */
@@ -121,6 +129,13 @@ struct processor_costs i386_cost = { /* 386 specific costs */
3, /* MMX or SSE register to integer */
0, /* size of prefetch block */
0, /* number of parallel prefetches */
+ 1, /* Branch cost */
+ 23, /* cost of FADD and FSUB insns. */
+ 27, /* cost of FMUL instruction. */
+ 88, /* cost of FDIV instruction. */
+ 22, /* cost of FABS instruction. */
+ 24, /* cost of FCHS instruction. */
+ 122, /* cost of FSQRT instruction. */
};
static const
@@ -158,6 +173,13 @@ struct processor_costs i486_cost = { /* 486 specific costs */
3, /* MMX or SSE register to integer */
0, /* size of prefetch block */
0, /* number of parallel prefetches */
+ 1, /* Branch cost */
+ 8, /* cost of FADD and FSUB insns. */
+ 16, /* cost of FMUL instruction. */
+ 73, /* cost of FDIV instruction. */
+ 3, /* cost of FABS instruction. */
+ 3, /* cost of FCHS instruction. */
+ 83, /* cost of FSQRT instruction. */
};
static const
@@ -195,6 +217,13 @@ struct processor_costs pentium_cost = {
3, /* MMX or SSE register to integer */
0, /* size of prefetch block */
0, /* number of parallel prefetches */
+ 2, /* Branch cost */
+ 3, /* cost of FADD and FSUB insns. */
+ 3, /* cost of FMUL instruction. */
+ 39, /* cost of FDIV instruction. */
+ 1, /* cost of FABS instruction. */
+ 1, /* cost of FCHS instruction. */
+ 70, /* cost of FSQRT instruction. */
};
static const
@@ -232,6 +261,13 @@ struct processor_costs pentiumpro_cost = {
3, /* MMX or SSE register to integer */
32, /* size of prefetch block */
6, /* number of parallel prefetches */
+ 2, /* Branch cost */
+ 3, /* cost of FADD and FSUB insns. */
+ 5, /* cost of FMUL instruction. */
+ 56, /* cost of FDIV instruction. */
+ 2, /* cost of FABS instruction. */
+ 2, /* cost of FCHS instruction. */
+ 56, /* cost of FSQRT instruction. */
};
static const
@@ -269,6 +305,13 @@ struct processor_costs k6_cost = {
6, /* MMX or SSE register to integer */
32, /* size of prefetch block */
1, /* number of parallel prefetches */
+ 1, /* Branch cost */
+ 2, /* cost of FADD and FSUB insns. */
+ 2, /* cost of FMUL instruction. */
+ 56, /* cost of FDIV instruction. */
+ 2, /* cost of FABS instruction. */
+ 2, /* cost of FCHS instruction. */
+ 56, /* cost of FSQRT instruction. */
};
static const
@@ -285,38 +328,45 @@ struct processor_costs athlon_cost = {
8, /* "large" insn */
9, /* MOVE_RATIO */
4, /* cost for loading QImode using movzbl */
- {4, 5, 4}, /* cost of loading integer registers
+ {3, 4, 3}, /* cost of loading integer registers
in QImode, HImode and SImode.
Relative to reg-reg move (2). */
- {2, 3, 2}, /* cost of storing integer registers */
+ {3, 4, 3}, /* cost of storing integer registers */
4, /* cost of reg,reg fld/fst */
- {6, 6, 20}, /* cost of loading fp registers
+ {4, 4, 12}, /* cost of loading fp registers
in SFmode, DFmode and XFmode */
- {4, 4, 16}, /* cost of loading integer registers */
+ {6, 6, 8}, /* cost of loading integer registers */
2, /* cost of moving MMX register */
- {2, 2}, /* cost of loading MMX registers
+ {4, 4}, /* cost of loading MMX registers
in SImode and DImode */
- {2, 2}, /* cost of storing MMX registers
+ {4, 4}, /* cost of storing MMX registers
in SImode and DImode */
2, /* cost of moving SSE register */
- {2, 2, 8}, /* cost of loading SSE registers
+ {4, 4, 6}, /* cost of loading SSE registers
in SImode, DImode and TImode */
- {2, 2, 8}, /* cost of storing SSE registers
+ {4, 4, 5}, /* cost of storing SSE registers
in SImode, DImode and TImode */
- 6, /* MMX or SSE register to integer */
+ 5, /* MMX or SSE register to integer */
64, /* size of prefetch block */
6, /* number of parallel prefetches */
+ 2, /* Branch cost */
+ 4, /* cost of FADD and FSUB insns. */
+ 4, /* cost of FMUL instruction. */
+ 24, /* cost of FDIV instruction. */
+ 2, /* cost of FABS instruction. */
+ 2, /* cost of FCHS instruction. */
+ 35, /* cost of FSQRT instruction. */
};
static const
struct processor_costs pentium4_cost = {
1, /* cost of an add instruction */
1, /* cost of a lea instruction */
- 8, /* variable shift costs */
- 8, /* constant shift costs */
- 30, /* cost of starting a multiply */
+ 4, /* variable shift costs */
+ 4, /* constant shift costs */
+ 15, /* cost of starting a multiply */
0, /* cost of multiply per each bit set */
- 112, /* cost of a divide/mod */
+ 56, /* cost of a divide/mod */
1, /* cost of movsx */
1, /* cost of movzx */
16, /* "large" insn */
@@ -343,6 +393,13 @@ struct processor_costs pentium4_cost = {
10, /* MMX or SSE register to integer */
64, /* size of prefetch block */
6, /* number of parallel prefetches */
+ 2, /* Branch cost */
+ 5, /* cost of FADD and FSUB insns. */
+ 7, /* cost of FMUL instruction. */
+ 43, /* cost of FDIV instruction. */
+ 2, /* cost of FABS instruction. */
+ 2, /* cost of FCHS instruction. */
+ 43, /* cost of FSQRT instruction. */
};
const struct processor_costs *ix86_cost = &pentium_cost;
@@ -396,6 +453,13 @@ const int x86_epilogue_using_move = m_ATHLON | m_PENT4 | m_PPRO;
const int x86_decompose_lea = m_PENT4;
const int x86_shift1 = ~m_486;
const int x86_arch_always_fancy_math_387 = m_PENT | m_PPRO | m_ATHLON | m_PENT4;
+const int x86_sse_partial_reg_dependency = m_PENT4 | m_PPRO;
+/* Set for machines where the type and dependencies are resolved on SSE register
+ parts insetad of whole registers, so we may maintain just lower part of
+ scalar values in proper format leaving the upper part undefined. */
+const int x86_sse_partial_regs = m_ATHLON;
+const int x86_sse_typeless_stores = m_ATHLON;
+const int x86_sse_load0_by_pxor = m_PPRO | m_PENT4;
/* In case the avreage insn count for single function invocation is
lower than this constant, emit fast (but longer) prologue and
@@ -701,6 +765,10 @@ static int ix86_variable_issue PARAMS ((FILE *, int, rtx, int));
static int ia32_use_dfa_pipeline_interface PARAMS ((void));
static int ia32_multipass_dfa_lookahead PARAMS ((void));
static void ix86_init_mmx_sse_builtins PARAMS ((void));
+static rtx ia32_this_parameter PARAMS ((tree));
+static void x86_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
+static void x86_output_mi_vcall_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
+ HOST_WIDE_INT, tree));
struct ix86_address
{
@@ -722,8 +790,6 @@ static rtx ix86_expand_sse_compare PARAMS ((const struct builtin_description *,
static rtx ix86_expand_unop1_builtin PARAMS ((enum insn_code, tree, rtx));
static rtx ix86_expand_unop_builtin PARAMS ((enum insn_code, tree, rtx, int));
static rtx ix86_expand_binop_builtin PARAMS ((enum insn_code, tree, rtx));
-static rtx ix86_expand_timode_binop_builtin PARAMS ((enum insn_code,
- tree, rtx));
static rtx ix86_expand_store_builtin PARAMS ((enum insn_code, tree));
static rtx safe_vector_operand PARAMS ((rtx, enum machine_mode));
static enum rtx_code ix86_fp_compare_code_to_integer PARAMS ((enum rtx_code));
@@ -741,7 +807,9 @@ static unsigned int ix86_select_alt_pic_regnum PARAMS ((void));
static int ix86_save_reg PARAMS ((unsigned int, int));
static void ix86_compute_frame_layout PARAMS ((struct ix86_frame *));
static int ix86_comp_type_attributes PARAMS ((tree, tree));
+static int ix86_fntype_regparm PARAMS ((tree));
const struct attribute_spec ix86_attribute_table[];
+static bool ix86_function_ok_for_sibcall PARAMS ((tree, tree));
static tree ix86_handle_cdecl_attribute PARAMS ((tree *, tree, tree, int, bool *));
static tree ix86_handle_regparm_attribute PARAMS ((tree *, tree, tree, int, bool *));
static int ix86_value_regno PARAMS ((enum machine_mode));
@@ -843,11 +911,19 @@ static enum x86_64_reg_class merge_classes PARAMS ((enum x86_64_reg_class,
#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
ia32_multipass_dfa_lookahead
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
+
#ifdef HAVE_AS_TLS
#undef TARGET_HAVE_TLS
#define TARGET_HAVE_TLS true
#endif
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
+#undef TARGET_ASM_OUTPUT_MI_VCALL_THUNK
+#define TARGET_ASM_OUTPUT_MI_VCALL_THUNK x86_output_mi_vcall_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Sometimes certain combinations of command options do not make
@@ -876,17 +952,16 @@ override_options ()
const int align_jump;
const int align_jump_max_skip;
const int align_func;
- const int branch_cost;
}
const processor_target_table[PROCESSOR_max] =
{
- {&i386_cost, 0, 0, 4, 3, 4, 3, 4, 1},
- {&i486_cost, 0, 0, 16, 15, 16, 15, 16, 1},
- {&pentium_cost, 0, 0, 16, 7, 16, 7, 16, 1},
- {&pentiumpro_cost, 0, 0, 16, 15, 16, 7, 16, 1},
- {&k6_cost, 0, 0, 32, 7, 32, 7, 32, 1},
- {&athlon_cost, 0, 0, 16, 7, 64, 7, 16, 1},
- {&pentium4_cost, 0, 0, 0, 0, 0, 0, 0, 1}
+ {&i386_cost, 0, 0, 4, 3, 4, 3, 4},
+ {&i486_cost, 0, 0, 16, 15, 16, 15, 16},
+ {&pentium_cost, 0, 0, 16, 7, 16, 7, 16},
+ {&pentiumpro_cost, 0, 0, 16, 15, 16, 7, 16},
+ {&k6_cost, 0, 0, 32, 7, 32, 7, 32},
+ {&athlon_cost, 0, 0, 16, 7, 64, 7, 16},
+ {&pentium4_cost, 0, 0, 0, 0, 0, 0, 0}
};
static const char * const cpu_names[] = TARGET_CPU_DEFAULT_NAMES;
@@ -911,6 +986,9 @@ override_options ()
{"i586", PROCESSOR_PENTIUM, 0},
{"pentium", PROCESSOR_PENTIUM, 0},
{"pentium-mmx", PROCESSOR_PENTIUM, PTA_MMX},
+ {"winchip-c6", PROCESSOR_I486, PTA_MMX},
+ {"winchip2", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
+ {"c3", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
{"i686", PROCESSOR_PENTIUMPRO, 0},
{"pentiumpro", PROCESSOR_PENTIUMPRO, 0},
{"pentium2", PROCESSOR_PENTIUMPRO, PTA_MMX},
@@ -934,6 +1012,11 @@ override_options ()
int const pta_size = ARRAY_SIZE (processor_alias_table);
+ /* By default our XFmode is the 80-bit extended format. If we have
+ use TFmode instead, it's also the 80-bit format, but with padding. */
+ real_format_for_mode[XFmode - QFmode] = &ieee_extended_intel_96_format;
+ real_format_for_mode[TFmode - QFmode] = &ieee_extended_intel_128_format;
+
#ifdef SUBTARGET_OVERRIDE_OPTIONS
SUBTARGET_OVERRIDE_OPTIONS;
#endif
@@ -993,19 +1076,19 @@ override_options ()
/* Default cpu tuning to the architecture. */
ix86_cpu = ix86_arch;
if (processor_alias_table[i].flags & PTA_MMX
- && !(target_flags & MASK_MMX_SET))
+ && !(target_flags_explicit & MASK_MMX))
target_flags |= MASK_MMX;
if (processor_alias_table[i].flags & PTA_3DNOW
- && !(target_flags & MASK_3DNOW_SET))
+ && !(target_flags_explicit & MASK_3DNOW))
target_flags |= MASK_3DNOW;
if (processor_alias_table[i].flags & PTA_3DNOW_A
- && !(target_flags & MASK_3DNOW_A_SET))
+ && !(target_flags_explicit & MASK_3DNOW_A))
target_flags |= MASK_3DNOW_A;
if (processor_alias_table[i].flags & PTA_SSE
- && !(target_flags & MASK_SSE_SET))
+ && !(target_flags_explicit & MASK_SSE))
target_flags |= MASK_SSE;
if (processor_alias_table[i].flags & PTA_SSE2
- && !(target_flags & MASK_SSE2_SET))
+ && !(target_flags_explicit & MASK_SSE2))
target_flags |= MASK_SSE2;
if (processor_alias_table[i].flags & PTA_PREFETCH_SSE)
x86_prefetch_sse = true;
@@ -1112,20 +1195,20 @@ override_options ()
don't want additional code to keep the stack aligned when
optimizing for code size. */
ix86_preferred_stack_boundary = (optimize_size
- ? TARGET_64BIT ? 64 : 32
+ ? TARGET_64BIT ? 128 : 32
: 128);
if (ix86_preferred_stack_boundary_string)
{
i = atoi (ix86_preferred_stack_boundary_string);
- if (i < (TARGET_64BIT ? 3 : 2) || i > 12)
+ if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
error ("-mpreferred-stack-boundary=%d is not between %d and 12", i,
- TARGET_64BIT ? 3 : 2);
+ TARGET_64BIT ? 4 : 2);
else
ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
}
/* Validate -mbranch-cost= value, or provide default. */
- ix86_branch_cost = processor_target_table[ix86_cpu].branch_cost;
+ ix86_branch_cost = processor_target_table[ix86_cpu].cost->branch_cost;
if (ix86_branch_cost_string)
{
i = atoi (ix86_branch_cost_string);
@@ -1228,7 +1311,7 @@ override_options ()
target_flags |= MASK_3DNOW_A;
}
if ((x86_accumulate_outgoing_args & CPUMASK)
- && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS_SET)
+ && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
&& !optimize_size)
target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
@@ -1240,6 +1323,10 @@ override_options ()
internal_label_prefix_len = p - internal_label_prefix;
*p = '\0';
}
+
+ /* In 64-bit mode, we do not have support for vcall thunks. */
+ if (TARGET_64BIT)
+ targetm.asm_out.output_mi_vcall_thunk = NULL;
}
void
@@ -1284,6 +1371,65 @@ const struct attribute_spec ix86_attribute_table[] =
{ NULL, 0, 0, false, false, false, NULL }
};
+/* If PIC, we cannot make sibling calls to global functions
+ because the PLT requires %ebx live.
+ If we are returning floats on the register stack, we cannot make
+ sibling calls to functions that return floats. (The stack adjust
+ instruction will wind up after the sibcall jump, and not be executed.) */
+
+static bool
+ix86_function_ok_for_sibcall (decl, exp)
+ tree decl;
+ tree exp;
+{
+ /* We don't have 64-bit patterns in place. */
+ if (TARGET_64BIT)
+ return false;
+
+ /* If we are generating position-independent code, we cannot sibcall
+ optimize any indirect call, or a direct call to a global function,
+ as the PLT requires %ebx be live. */
+ if (flag_pic && (!decl || TREE_PUBLIC (decl)))
+ return false;
+
+ /* If we are returning floats on the 80387 register stack, we cannot
+ make a sibcall from a function that doesn't return a float to a
+ function that does; the necessary stack adjustment will not be
+ executed. */
+ if (TARGET_FLOAT_RETURNS_IN_80387
+ && FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (exp)))
+ && !FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (cfun->decl)))))
+ return false;
+
+ /* If this call is indirect, we'll need to be able to use a call-clobbered
+ register for the address of the target function. Make sure that all
+ such registers are not used for passing parameters. */
+ if (!decl && !TARGET_64BIT)
+ {
+ int regparm = ix86_regparm;
+ tree attr, type;
+
+ /* We're looking at the CALL_EXPR, we need the type of the function. */
+ type = TREE_OPERAND (exp, 0); /* pointer expression */
+ type = TREE_TYPE (type); /* pointer type */
+ type = TREE_TYPE (type); /* function type */
+
+ attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
+ if (attr)
+ regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
+
+ if (regparm >= 3)
+ {
+ /* ??? Need to count the actual number of registers to be used,
+ not the possible number of registers. Fix later. */
+ return false;
+ }
+ }
+
+ /* Otherwise okay. That also includes certain types of indirect calls. */
+ return true;
+}
+
/* Handle a "cdecl" or "stdcall" attribute;
arguments as in struct attribute_spec.handler. */
static tree
@@ -1376,6 +1522,21 @@ ix86_comp_type_attributes (type1, type2)
return 1;
}
+/* Return the regparm value for a fuctio with the indicated TYPE. */
+
+static int
+ix86_fntype_regparm (type)
+ tree type;
+{
+ tree attr;
+
+ attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
+ if (attr)
+ return TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
+ else
+ return ix86_regparm;
+}
+
/* Value is the number of bytes of arguments automatically
popped when returning from a subroutine call.
FUNDECL is the declaration node of the function (as a tree),
@@ -1419,15 +1580,7 @@ ix86_return_pops_args (fundecl, funtype, size)
if (aggregate_value_p (TREE_TYPE (funtype))
&& !TARGET_64BIT)
{
- int nregs = ix86_regparm;
-
- if (funtype)
- {
- tree attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (funtype));
-
- if (attr)
- nregs = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
- }
+ int nregs = ix86_fntype_regparm (funtype);
if (!nregs)
return GET_MODE_SIZE (Pmode);
@@ -1592,7 +1745,11 @@ classify_argument (mode, type, classes, bit_offset)
{
int bytes =
(mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
- int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+ int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+
+ /* Variable sized entities are always passed/returned in memory. */
+ if (bytes < 0)
+ return 0;
if (type && AGGREGATE_TYPE_P (type))
{
@@ -1850,8 +2007,7 @@ classify_argument (mode, type, classes, bit_offset)
case V2SImode:
case V4HImode:
case V8QImode:
- classes[0] = X86_64_SSE_CLASS;
- return 1;
+ return 0;
case BLKmode:
case VOIDmode:
return 0;
@@ -2750,6 +2906,43 @@ ix86_va_arg (valist, type)
return addr_rtx;
}
+/* Return nonzero if OP is either a i387 or SSE fp register. */
+int
+any_fp_register_operand (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ return ANY_FP_REG_P (op);
+}
+
+/* Return nonzero if OP is an i387 fp register. */
+int
+fp_register_operand (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ return FP_REG_P (op);
+}
+
+/* Return nonzero if OP is a non-fp register_operand. */
+int
+register_and_not_any_fp_reg_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ return register_operand (op, mode) && !ANY_FP_REG_P (op);
+}
+
+/* Return nonzero of OP is a register operand other than an
+ i387 fp register. */
+int
+register_and_not_fp_reg_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ return register_operand (op, mode) && !FP_REG_P (op);
+}
+
/* Return nonzero if OP is general operand representable on x86_64. */
int
@@ -3073,6 +3266,32 @@ call_insn_operand (op, mode)
return general_operand (op, Pmode);
}
+/* Test for a valid operand for a call instruction. Don't allow the
+ arg pointer register or virtual regs since they may decay into
+ reg + const, which the patterns can't handle. */
+
+int
+sibcall_insn_operand (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ /* Disallow indirect through a virtual register. This leads to
+ compiler aborts when trying to eliminate them. */
+ if (GET_CODE (op) == REG
+ && (op == arg_pointer_rtx
+ || op == frame_pointer_rtx
+ || (REGNO (op) >= FIRST_PSEUDO_REGISTER
+ && REGNO (op) <= LAST_VIRTUAL_REGISTER)))
+ return 0;
+
+ /* Explicitly allow SYMBOL_REF even if pic. */
+ if (GET_CODE (op) == SYMBOL_REF)
+ return 1;
+
+ /* Otherwise we can only allow register operands. */
+ return register_operand (op, Pmode);
+}
+
int
constant_call_address_operand (op, mode)
rtx op;
@@ -3213,6 +3432,30 @@ nonmemory_no_elim_operand (op, mode)
return GET_CODE (op) == CONST_INT || register_operand (op, mode);
}
+/* Return false if this is any eliminable register or stack register,
+ otherwise work like register_operand. */
+
+int
+index_register_operand (op, mode)
+ register rtx op;
+ enum machine_mode mode;
+{
+ rtx t = op;
+ if (GET_CODE (t) == SUBREG)
+ t = SUBREG_REG (t);
+ if (!REG_P (t))
+ return 0;
+ if (t == arg_pointer_rtx
+ || t == frame_pointer_rtx
+ || t == virtual_incoming_args_rtx
+ || t == virtual_stack_vars_rtx
+ || t == virtual_stack_dynamic_rtx
+ || REGNO (t) == STACK_POINTER_REGNUM)
+ return 0;
+
+ return general_operand (op, mode);
+}
+
/* Return true if op is a Q_REGS class register. */
int
@@ -3959,7 +4202,7 @@ output_set_got (dest)
rtx xops[3];
xops[0] = dest;
- xops[1] = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
+ xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
{
@@ -3975,7 +4218,7 @@ output_set_got (dest)
is what will be referred to by the Mach-O PIC subsystem. */
ASM_OUTPUT_LABEL (asm_out_file, machopic_function_base_name ());
#endif
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
if (flag_pic)
@@ -5009,18 +5252,14 @@ legitimate_pic_address_disp_p (disp)
case UNSPEC_GOTOFF:
return local_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
case UNSPEC_GOTTPOFF:
+ case UNSPEC_GOTNTPOFF:
+ case UNSPEC_INDNTPOFF:
if (saw_plus)
return false;
return initial_exec_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
case UNSPEC_NTPOFF:
- /* ??? Could support offset here. */
- if (saw_plus)
- return false;
return local_exec_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
case UNSPEC_DTPOFF:
- /* ??? Could support offset here. */
- if (saw_plus)
- return false;
return local_dynamic_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
}
@@ -5196,6 +5435,8 @@ legitimate_address_p (mode, addr, strict)
goto is_legitimate_pic;
case UNSPEC_GOTTPOFF:
+ case UNSPEC_GOTNTPOFF:
+ case UNSPEC_INDNTPOFF:
case UNSPEC_NTPOFF:
case UNSPEC_DTPOFF:
break;
@@ -5471,23 +5712,7 @@ ix86_encode_section_info (decl, first)
const char *symbol_str;
char *newstr;
size_t len;
- enum tls_model kind;
-
- if (!flag_pic)
- {
- if (local_p)
- kind = TLS_MODEL_LOCAL_EXEC;
- else
- kind = TLS_MODEL_INITIAL_EXEC;
- }
- /* Local dynamic is inefficient when we're not combining the
- parts of the address. */
- else if (optimize && local_p)
- kind = TLS_MODEL_LOCAL_DYNAMIC;
- else
- kind = TLS_MODEL_GLOBAL_DYNAMIC;
- if (kind < flag_tls_default)
- kind = flag_tls_default;
+ enum tls_model kind = decl_tls_model (decl);
symbol_str = XSTR (symbol, 0);
@@ -5602,32 +5827,36 @@ legitimize_address (x, oldx, mode)
regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
pic = pic_offset_table_rtx;
}
- else
+ else if (!TARGET_GNU_TLS)
{
pic = gen_reg_rtx (Pmode);
emit_insn (gen_set_got (pic));
}
+ else
+ pic = NULL;
base = get_thread_pointer ();
- off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_GOTTPOFF);
+ off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
+ !TARGET_GNU_TLS
+ ? UNSPEC_GOTTPOFF
+ : flag_pic ? UNSPEC_GOTNTPOFF
+ : UNSPEC_INDNTPOFF);
off = gen_rtx_CONST (Pmode, off);
- off = gen_rtx_PLUS (Pmode, pic, off);
+ if (flag_pic || !TARGET_GNU_TLS)
+ off = gen_rtx_PLUS (Pmode, pic, off);
off = gen_rtx_MEM (Pmode, off);
RTX_UNCHANGING_P (off) = 1;
set_mem_alias_set (off, ix86_GOT_alias_set ());
-
- /* Damn Sun for specifing a set of dynamic relocations without
- considering the two-operand nature of the architecture!
- We'd be much better off with a "GOTNTPOFF" relocation that
- already contained the negated constant. */
- /* ??? Using negl and reg+reg addressing appears to be a lose
- size-wise. The negl is two bytes, just like the extra movl
- incurred by the two-operand subl, but reg+reg addressing
- uses the two-byte modrm form, unlike plain reg. */
-
dest = gen_reg_rtx (Pmode);
- emit_insn (gen_subsi3 (dest, base, off));
+
+ if (TARGET_GNU_TLS)
+ {
+ emit_move_insn (dest, off);
+ return gen_rtx_PLUS (Pmode, base, dest);
+ }
+ else
+ emit_insn (gen_subsi3 (dest, base, off));
break;
case TLS_MODEL_LOCAL_EXEC:
@@ -5908,6 +6137,7 @@ output_pic_addr_const (file, x, code)
fputs ("@GOTPCREL(%rip)", file);
break;
case UNSPEC_GOTTPOFF:
+ /* FIXME: This might be @TPOFF in Sun ld too. */
fputs ("@GOTTPOFF", file);
break;
case UNSPEC_TPOFF:
@@ -5919,6 +6149,12 @@ output_pic_addr_const (file, x, code)
case UNSPEC_DTPOFF:
fputs ("@DTPOFF", file);
break;
+ case UNSPEC_GOTNTPOFF:
+ fputs ("@GOTNTPOFF", file);
+ break;
+ case UNSPEC_INDNTPOFF:
+ fputs ("@INDNTPOFF", file);
+ break;
default:
output_operand_lossage ("invalid UNSPEC as operand");
break;
@@ -5952,6 +6188,33 @@ i386_dwarf_output_addr_const (file, x)
fputc ('\n', file);
}
+/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+ We need to emit DTP-relative relocations. */
+
+void
+i386_output_dwarf_dtprel (file, size, x)
+ FILE *file;
+ int size;
+ rtx x;
+{
+ switch (size)
+ {
+ case 4:
+ fputs (ASM_LONG, file);
+ break;
+ case 8:
+#ifdef ASM_QUAD
+ fputs (ASM_QUAD, file);
+ break;
+#endif
+ default:
+ abort ();
+ }
+
+ output_addr_const (file, x);
+ fputs ("@DTPOFF", file);
+}
+
/* In the name of slightly smaller debug output, and to cater to
general assembler losage, recognize PIC+GOTOFF and turn it back
into a direct symbol reference. */
@@ -6602,22 +6865,18 @@ print_operand (file, x, code)
/* These float cases don't actually occur as immediate operands. */
else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
{
- REAL_VALUE_TYPE r;
char dstr[30];
- REAL_VALUE_FROM_CONST_DOUBLE (r, x);
- REAL_VALUE_TO_DECIMAL (r, "%.22e", dstr);
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
fprintf (file, "%s", dstr);
}
else if (GET_CODE (x) == CONST_DOUBLE
&& (GET_MODE (x) == XFmode || GET_MODE (x) == TFmode))
{
- REAL_VALUE_TYPE r;
char dstr[30];
- REAL_VALUE_FROM_CONST_DOUBLE (r, x);
- REAL_VALUE_TO_DECIMAL (r, "%.22e", dstr);
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
fprintf (file, "%s", dstr);
}
@@ -6702,7 +6961,8 @@ print_operand_address (file, addr)
|| GET_CODE (addr) == LABEL_REF
|| (GET_CODE (addr) == CONST
&& GET_CODE (XEXP (addr, 0)) == PLUS
- && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
+ && (GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
+ || GET_CODE (XEXP (XEXP (addr, 0), 0)) == LABEL_REF)
&& GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)))
fputs ("(%rip)", file);
}
@@ -6801,6 +7061,7 @@ output_addr_const_extra (file, x)
{
case UNSPEC_GOTTPOFF:
output_addr_const (file, op);
+ /* FIXME: This might be @TPOFF in Sun ld. */
fputs ("@GOTTPOFF", file);
break;
case UNSPEC_TPOFF:
@@ -6815,6 +7076,14 @@ output_addr_const_extra (file, x)
output_addr_const (file, op);
fputs ("@DTPOFF", file);
break;
+ case UNSPEC_GOTNTPOFF:
+ output_addr_const (file, op);
+ fputs ("@GOTNTPOFF", file);
+ break;
+ case UNSPEC_INDNTPOFF:
+ output_addr_const (file, op);
+ fputs ("@INDNTPOFF", file);
+ break;
default:
return false;
@@ -7331,8 +7600,8 @@ ix86_output_addr_diff_elt (file, value, rel)
machopic_function_base_name () + 1);
#endif
else
- asm_fprintf (file, "%s%U_GLOBAL_OFFSET_TABLE_+[.-%s%d]\n",
- ASM_LONG, LPREFIX, value);
+ asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
+ ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
}
/* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
@@ -7539,8 +7808,7 @@ ix86_expand_vector_move (mode, operands)
/* Make operand1 a register if it isn't already. */
if ((reload_in_progress | reload_completed) == 0
&& !register_operand (operands[0], mode)
- && !register_operand (operands[1], mode)
- && operands[1] != CONST0_RTX (mode))
+ && !register_operand (operands[1], mode))
{
rtx temp = force_reg (GET_MODE (operands[1]), operands[1]);
emit_move_insn (operands[0], temp);
@@ -8990,7 +9258,7 @@ ix86_expand_int_movcc (operands)
emit_insn (gen_rtx_SET (VOIDmode, out, tmp));
}
if (out != operands[0])
- emit_move_insn (operands[0], out);
+ emit_move_insn (operands[0], copy_rtx (out));
return 1; /* DONE */
}
@@ -9009,12 +9277,9 @@ ix86_expand_int_movcc (operands)
* This is reasonably steep, but branch mispredict costs are
* high on modern cpus, so consider failing only if optimizing
* for space.
- *
- * %%% Parameterize branch_cost on the tuning architecture, then
- * use that. The 80386 couldn't care less about mispredicts.
*/
- if (!optimize_size && !TARGET_CMOVE)
+ if (!TARGET_CMOVE && BRANCH_COST >= 2)
{
if (cf == 0)
{
@@ -9092,7 +9357,7 @@ ix86_expand_int_movcc (operands)
optab op;
rtx var, orig_out, out, tmp;
- if (optimize_size)
+ if (BRANCH_COST >= 2)
return 0; /* FAIL */
/* If one of the two operands is an interesting constant, load a
@@ -11017,13 +11282,6 @@ ix86_adjust_cost (insn, link, dep_insn, cost)
memory = get_attr_memory (insn);
dep_memory = get_attr_memory (dep_insn);
- if (dep_memory == MEMORY_LOAD || dep_memory == MEMORY_BOTH)
- {
- if (dep_insn_type == TYPE_IMOV || dep_insn_type == TYPE_FMOV)
- cost += 2;
- else
- cost += 3;
- }
/* Show ability of reorder buffer to hide latency of load by executing
in parallel with previous instruction in case
previous instruction is not needed to compute the address. */
@@ -11297,7 +11555,7 @@ ix86_variable_issue (dump, sched_verbose, insn, can_issue_more)
static int
ia32_use_dfa_pipeline_interface ()
{
- if (ix86_cpu == PROCESSOR_PENTIUM)
+ if (ix86_cpu == PROCESSOR_PENTIUM || ix86_cpu == PROCESSOR_ATHLON)
return 1;
return 0;
}
@@ -11568,6 +11826,11 @@ x86_initialize_trampoline (tramp, fnaddr, cxt)
if (offset > TRAMPOLINE_SIZE)
abort ();
}
+
+#ifdef TRANSFER_FROM_TRAMPOLINE
+ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
+ LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
+#endif
}
#define def_builtin(MASK, NAME, TYPE, CODE) \
@@ -11592,30 +11855,30 @@ struct builtin_description
static const struct builtin_description bdesc_comi[] =
{
- { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, EQ, 0 },
- { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, LT, 0 },
- { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, LE, 0 },
- { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, LT, 1 },
- { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, LE, 1 },
- { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, NE, 0 },
- { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, EQ, 0 },
- { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, LT, 0 },
- { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, LE, 0 },
- { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, LT, 1 },
- { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, LE, 1 },
- { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, NE, 0 },
- { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, EQ, 0 },
- { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, LT, 0 },
- { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, LE, 0 },
- { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, LT, 1 },
- { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, LE, 1 },
- { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, NE, 0 },
- { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, EQ, 0 },
- { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, LT, 0 },
- { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, LE, 0 },
- { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, LT, 1 },
- { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, LE, 1 },
- { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, NE, 0 },
+ { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
+ { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
+ { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
+ { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
+ { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
+ { MASK_SSE1, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
+ { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
+ { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
+ { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
+ { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
+ { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
+ { MASK_SSE1, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
};
static const struct builtin_description bdesc_2arg[] =
@@ -11645,14 +11908,10 @@ static const struct builtin_description bdesc_2arg[] =
{ MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, 0 },
{ MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, 0 },
{ MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, 0 },
- { MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpgtss", IX86_BUILTIN_CMPGTSS, LT, 1 },
- { MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpgess", IX86_BUILTIN_CMPGESS, LE, 1 },
{ MASK_SSE1, CODE_FOR_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, 0 },
{ MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, EQ, 0 },
{ MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, LT, 0 },
{ MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, LE, 0 },
- { MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, LT, 1 },
- { MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, LE, 1 },
{ MASK_SSE1, CODE_FOR_vmmaskncmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, UNORDERED, 0 },
{ MASK_SSE1, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, 0, 0 },
@@ -11660,6 +11919,11 @@ static const struct builtin_description bdesc_2arg[] =
{ MASK_SSE1, CODE_FOR_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, 0, 0 },
{ MASK_SSE1, CODE_FOR_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, 0, 0 },
+ { MASK_SSE1, CODE_FOR_sse_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, 0, 0 },
+ { MASK_SSE1, CODE_FOR_sse_nandv4sf3, "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, 0, 0 },
+ { MASK_SSE1, CODE_FOR_sse_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, 0, 0 },
+ { MASK_SSE1, CODE_FOR_sse_xorv4sf3, "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, 0, 0 },
+
{ MASK_SSE1, CODE_FOR_sse_movss, "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, 0, 0 },
{ MASK_SSE1, CODE_FOR_sse_movhlps, "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, 0, 0 },
{ MASK_SSE1, CODE_FOR_sse_movlhps, "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, 0, 0 },
@@ -11769,14 +12033,10 @@ static const struct builtin_description bdesc_2arg[] =
{ MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, 0 },
{ MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, 0 },
{ MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, 0 },
- { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpgtsd", IX86_BUILTIN_CMPGTSD, LT, 1 },
- { MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpgesd", IX86_BUILTIN_CMPGESD, LE, 1 },
{ MASK_SSE2, CODE_FOR_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, 0 },
{ MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, EQ, 0 },
{ MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, LT, 0 },
{ MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, LE, 0 },
- { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpngtsd", IX86_BUILTIN_CMPNGTSD, LT, 1 },
- { MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpngesd", IX86_BUILTIN_CMPNGESD, LE, 1 },
{ MASK_SSE2, CODE_FOR_vmmaskncmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, UNORDERED, 0 },
{ MASK_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, 0, 0 },
@@ -11784,10 +12044,10 @@ static const struct builtin_description bdesc_2arg[] =
{ MASK_SSE2, CODE_FOR_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, 0, 0 },
{ MASK_SSE2, CODE_FOR_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, 0, 0 },
- { MASK_SSE2, CODE_FOR_sse2_anddf3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, 0, 0 },
- { MASK_SSE2, CODE_FOR_sse2_nanddf3, "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, 0, 0 },
- { MASK_SSE2, CODE_FOR_sse2_iordf3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, 0, 0 },
- { MASK_SSE2, CODE_FOR_sse2_xordf3, "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, 0, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, 0, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_nandv2df3, "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, 0, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, 0, 0 },
+ { MASK_SSE2, CODE_FOR_sse2_xorv2df3, "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, 0, 0 },
{ MASK_SSE2, CODE_FOR_sse2_movsd, "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, 0, 0 },
{ MASK_SSE2, CODE_FOR_sse2_unpckhpd, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, 0, 0 },
@@ -12292,11 +12552,6 @@ ix86_init_mmx_sse_builtins ()
def_builtin (MASK_SSE1, "__builtin_ia32_cvttps2pi", v2si_ftype_v4sf, IX86_BUILTIN_CVTTPS2PI);
def_builtin (MASK_SSE1, "__builtin_ia32_cvttss2si", int_ftype_v4sf, IX86_BUILTIN_CVTTSS2SI);
- def_builtin (MASK_SSE1, "__builtin_ia32_andps", v4sf_ftype_v4sf_v4sf, IX86_BUILTIN_ANDPS);
- def_builtin (MASK_SSE1, "__builtin_ia32_andnps", v4sf_ftype_v4sf_v4sf, IX86_BUILTIN_ANDNPS);
- def_builtin (MASK_SSE1, "__builtin_ia32_orps", v4sf_ftype_v4sf_v4sf, IX86_BUILTIN_ORPS);
- def_builtin (MASK_SSE1, "__builtin_ia32_xorps", v4sf_ftype_v4sf_v4sf, IX86_BUILTIN_XORPS);
-
def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_pextrw", int_ftype_v4hi_int, IX86_BUILTIN_PEXTRW);
def_builtin (MASK_SSE1 | MASK_3DNOW_A, "__builtin_ia32_pinsrw", v4hi_ftype_v4hi_int_int, IX86_BUILTIN_PINSRW);
@@ -12444,10 +12699,12 @@ ix86_init_mmx_sse_builtins ()
def_builtin (MASK_SSE2, "__builtin_ia32_psraw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRAW128);
def_builtin (MASK_SSE2, "__builtin_ia32_psrad128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRAD128);
+ def_builtin (MASK_SSE2, "__builtin_ia32_pslldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLDQI128);
def_builtin (MASK_SSE2, "__builtin_ia32_psllwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSLLWI128);
def_builtin (MASK_SSE2, "__builtin_ia32_pslldi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSLLDI128);
def_builtin (MASK_SSE2, "__builtin_ia32_psllqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLQI128);
+ def_builtin (MASK_SSE2, "__builtin_ia32_psrldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSRLDQI128);
def_builtin (MASK_SSE2, "__builtin_ia32_psrlwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSRLWI128);
def_builtin (MASK_SSE2, "__builtin_ia32_psrldi128", v4si_ftype_v4si_int, IX86_BUILTIN_PSRLDI128);
def_builtin (MASK_SSE2, "__builtin_ia32_psrlqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSRLQI128);
@@ -12475,7 +12732,8 @@ safe_vector_operand (x, mode)
: gen_rtx_SUBREG (DImode, x, 0)));
else
emit_insn (gen_sse_clrv4sf (mode == V4SFmode ? x
- : gen_rtx_SUBREG (V4SFmode, x, 0)));
+ : gen_rtx_SUBREG (V4SFmode, x, 0),
+ CONST0_RTX (V4SFmode)));
return x;
}
@@ -12529,45 +12787,6 @@ ix86_expand_binop_builtin (icode, arglist, target)
return target;
}
-/* In type_for_mode we restrict the ability to create TImode types
- to hosts with 64-bit H_W_I. So we've defined the SSE logicals
- to have a V4SFmode signature. Convert them in-place to TImode. */
-
-static rtx
-ix86_expand_timode_binop_builtin (icode, arglist, target)
- enum insn_code icode;
- tree arglist;
- rtx target;
-{
- rtx pat;
- tree arg0 = TREE_VALUE (arglist);
- tree arg1 = TREE_VALUE (TREE_CHAIN (arglist));
- rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
- rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
-
- op0 = gen_lowpart (TImode, op0);
- op1 = gen_lowpart (TImode, op1);
- target = gen_reg_rtx (TImode);
-
- if (! (*insn_data[icode].operand[1].predicate) (op0, TImode))
- op0 = copy_to_mode_reg (TImode, op0);
- if (! (*insn_data[icode].operand[2].predicate) (op1, TImode))
- op1 = copy_to_mode_reg (TImode, op1);
-
- /* In the commutative cases, both op0 and op1 are nonimmediate_operand,
- yet one of the two must not be a memory. This is normally enforced
- by expanders, but we didn't bother to create one here. */
- if (GET_CODE (op0) == MEM && GET_CODE (op1) == MEM)
- op0 = copy_to_mode_reg (TImode, op0);
-
- pat = GEN_FCN (icode) (target, op0, op1);
- if (! pat)
- return 0;
- emit_insn (pat);
-
- return gen_lowpart (V4SFmode, target);
-}
-
/* Subroutine of ix86_expand_builtin to take care of stores. */
static rtx
@@ -12765,14 +12984,14 @@ ix86_expand_sse_comi (d, arglist, target)
op1 = copy_to_mode_reg (mode1, op1);
op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
- pat = GEN_FCN (d->icode) (op0, op1, op2);
+ pat = GEN_FCN (d->icode) (op0, op1);
if (! pat)
return 0;
emit_insn (pat);
emit_insn (gen_rtx_SET (VOIDmode,
gen_rtx_STRICT_LOW_PART (VOIDmode, target),
gen_rtx_fmt_ee (comparison, QImode,
- gen_rtx_REG (CCmode, FLAGS_REG),
+ SET_DEST (pat),
const0_rtx)));
return SUBREG_REG (target);
@@ -12913,19 +13132,6 @@ ix86_expand_builtin (exp, target, subtarget, mode, ignore)
case IX86_BUILTIN_RCPSS:
return ix86_expand_unop1_builtin (CODE_FOR_vmrcpv4sf2, arglist, target);
- case IX86_BUILTIN_ANDPS:
- return ix86_expand_timode_binop_builtin (CODE_FOR_sse_andti3,
- arglist, target);
- case IX86_BUILTIN_ANDNPS:
- return ix86_expand_timode_binop_builtin (CODE_FOR_sse_nandti3,
- arglist, target);
- case IX86_BUILTIN_ORPS:
- return ix86_expand_timode_binop_builtin (CODE_FOR_sse_iorti3,
- arglist, target);
- case IX86_BUILTIN_XORPS:
- return ix86_expand_timode_binop_builtin (CODE_FOR_sse_xorti3,
- arglist, target);
-
case IX86_BUILTIN_LOADAPS:
return ix86_expand_unop_builtin (CODE_FOR_sse_movaps, arglist, target, 1);
@@ -13084,6 +13290,35 @@ ix86_expand_builtin (exp, target, subtarget, mode, ignore)
emit_insn (pat);
return target;
+ case IX86_BUILTIN_PSLLDQI128:
+ case IX86_BUILTIN_PSRLDQI128:
+ icode = ( fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3
+ : CODE_FOR_sse2_lshrti3);
+ arg0 = TREE_VALUE (arglist);
+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));
+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
+ op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
+ tmode = insn_data[icode].operand[0].mode;
+ mode1 = insn_data[icode].operand[1].mode;
+ mode2 = insn_data[icode].operand[2].mode;
+
+ if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
+ {
+ op0 = copy_to_reg (op0);
+ op0 = simplify_gen_subreg (mode1, op0, GET_MODE (op0), 0);
+ }
+ if (! (*insn_data[icode].operand[2].predicate) (op1, mode2))
+ {
+ error ("shift must be an immediate");
+ return const0_rtx;
+ }
+ target = gen_reg_rtx (V2DImode);
+ pat = GEN_FCN (icode) (simplify_gen_subreg (tmode, target, V2DImode, 0), op0, op1);
+ if (! pat)
+ return 0;
+ emit_insn (pat);
+ return target;
+
case IX86_BUILTIN_FEMMS:
emit_insn (gen_femms ());
return NULL_RTX;
@@ -13165,7 +13400,7 @@ ix86_expand_builtin (exp, target, subtarget, mode, ignore)
case IX86_BUILTIN_SSE_ZERO:
target = gen_reg_rtx (V4SFmode);
- emit_insn (gen_sse_clrv4sf (target));
+ emit_insn (gen_sse_clrv4sf (target, CONST0_RTX (V4SFmode)));
return target;
case IX86_BUILTIN_MMX_ZERO:
@@ -13230,6 +13465,11 @@ ix86_expand_builtin (exp, target, subtarget, mode, ignore)
case IX86_BUILTIN_STORERPD:
return ix86_expand_store_builtin (CODE_FOR_sse2_movapd, arglist);
+ case IX86_BUILTIN_CLRPD:
+ target = gen_reg_rtx (V2DFmode);
+ emit_insn (gen_sse_clrv2df (target));
+ return target;
+
case IX86_BUILTIN_MFENCE:
emit_insn (gen_sse2_mfence ());
return 0;
@@ -13241,9 +13481,8 @@ ix86_expand_builtin (exp, target, subtarget, mode, ignore)
arg0 = TREE_VALUE (arglist);
op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
icode = CODE_FOR_sse2_clflush;
- mode0 = insn_data[icode].operand[0].mode;
- if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
- op0 = copy_to_mode_reg (mode0, op0);
+ if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
+ op0 = copy_to_mode_reg (Pmode, op0);
emit_insn (gen_sse2_clflush (op0));
return 0;
@@ -13402,6 +13641,8 @@ ix86_preferred_reload_class (x, class)
rtx x;
enum reg_class class;
{
+ if (GET_CODE (x) == CONST_VECTOR && x != CONST0_RTX (GET_MODE (x)))
+ return NO_REGS;
if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
{
/* SSE can't load any constant directly yet. */
@@ -13477,17 +13718,33 @@ ix86_register_move_cost (mode, class1, class2)
enum reg_class class1, class2;
{
/* In case we require secondary memory, compute cost of the store followed
- by load. In case of copying from general_purpose_register we may emit
- multiple stores followed by single load causing memory size mismatch
- stall. Count this as arbitarily high cost of 20. */
+ by load. In order to avoid bad register allocation choices, we need
+ for this to be *at least* as high as the symmetric MEMORY_MOVE_COST. */
+
if (ix86_secondary_memory_needed (class1, class2, mode, 0))
{
- int add_cost = 0;
+ int cost = 1;
+
+ cost += MAX (MEMORY_MOVE_COST (mode, class1, 0),
+ MEMORY_MOVE_COST (mode, class1, 1));
+ cost += MAX (MEMORY_MOVE_COST (mode, class2, 0),
+ MEMORY_MOVE_COST (mode, class2, 1));
+
+ /* In case of copying from general_purpose_register we may emit multiple
+ stores followed by single load causing memory size mismatch stall.
+ Count this as arbitarily high cost of 20. */
if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
- add_cost = 20;
- return (MEMORY_MOVE_COST (mode, class1, 0)
- + MEMORY_MOVE_COST (mode, class2, 1) + add_cost);
+ cost += 20;
+
+ /* In the case of FP/MMX moves, the registers actually overlap, and we
+ have to switch modes in order to treat them differently. */
+ if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
+ || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
+ cost += 20;
+
+ return cost;
}
+
/* Moves between SSE/MMX and integer unit are expensive. */
if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
|| SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
@@ -13620,7 +13877,8 @@ ix86_memory_move_cost (mode, class, in)
if (mode == TFmode)
mode = XFmode;
return ((in ? ix86_cost->int_load[2] : ix86_cost->int_store[2])
- * (int) GET_MODE_SIZE (mode) / 4);
+ * ((int) GET_MODE_SIZE (mode)
+ + UNITS_PER_WORD -1 ) / UNITS_PER_WORD);
}
}
@@ -13746,27 +14004,51 @@ x86_order_regs_for_local_alloc ()
reg_alloc_order [pos++] = 0;
}
-void
-x86_output_mi_thunk (file, delta, function)
- FILE *file;
- int delta;
+/* Returns an expression indicating where the this parameter is
+ located on entry to the FUNCTION. */
+
+static rtx
+ia32_this_parameter (function)
tree function;
{
- tree parm;
- rtx xops[3];
+ tree type = TREE_TYPE (function);
- if (ix86_regparm > 0)
- parm = TYPE_ARG_TYPES (TREE_TYPE (function));
+ if (ix86_fntype_regparm (type) > 0)
+ {
+ tree parm;
+
+ parm = TYPE_ARG_TYPES (type);
+ /* Figure out whether or not the function has a variable number of
+ arguments. */
+ for (; parm; parm = TREE_CHAIN (parm))\
+ if (TREE_VALUE (parm) == void_type_node)
+ break;
+ /* If not, the this parameter is in %eax. */
+ if (parm)
+ return gen_rtx_REG (SImode, 0);
+ }
+
+ if (aggregate_value_p (TREE_TYPE (type)))
+ return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 8));
else
- parm = NULL_TREE;
- for (; parm; parm = TREE_CHAIN (parm))
- if (TREE_VALUE (parm) == void_type_node)
- break;
+ return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 4));
+}
+
+
+static void
+x86_output_mi_vcall_thunk (file, thunk, delta, vcall_index, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ HOST_WIDE_INT vcall_index;
+ tree function;
+{
+ rtx xops[3];
- xops[0] = GEN_INT (delta);
if (TARGET_64BIT)
{
int n = aggregate_value_p (TREE_TYPE (TREE_TYPE (function))) != 0;
+ xops[0] = GEN_INT (delta);
xops[1] = gen_rtx_REG (DImode, x86_64_int_parameter_registers[n]);
output_asm_insn ("add{q} {%0, %1|%1, %0}", xops);
if (flag_pic)
@@ -13784,25 +14066,61 @@ x86_output_mi_thunk (file, delta, function)
}
else
{
- if (parm)
- xops[1] = gen_rtx_REG (SImode, 0);
- else if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function))))
- xops[1] = gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 8));
- else
- xops[1] = gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 4));
- output_asm_insn ("add{l} {%0, %1|%1, %0}", xops);
+ /* Adjust the this parameter by a fixed constant. */
+ if (delta)
+ {
+ xops[0] = GEN_INT (delta);
+ xops[1] = ia32_this_parameter (function);
+ output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
+ }
+
+ /* Adjust the this parameter by a value stored in the vtable. */
+ if (vcall_index)
+ {
+ rtx this_parm;
+
+ /* Put the this parameter into %eax. */
+ this_parm = ia32_this_parameter (function);
+ if (!REG_P (this_parm))
+ {
+ xops[0] = this_parm;
+ xops[1] = gen_rtx_REG (Pmode, 0);
+ output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
+ }
+ /* Load the virtual table pointer into %edx. */
+ if (ix86_fntype_regparm (TREE_TYPE (function)) > 2)
+ error ("virtual function `%D' cannot have more than two register parameters",
+ function);
+ xops[0] = gen_rtx_MEM (Pmode,
+ gen_rtx_REG (Pmode, 0));
+ xops[1] = gen_rtx_REG (Pmode, 1);
+ output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
+ /* Adjust the this parameter. */
+ xops[0] = gen_rtx_MEM (SImode,
+ plus_constant (gen_rtx_REG (Pmode, 1),
+ vcall_index));
+ xops[1] = gen_rtx_REG (Pmode, 0);
+ output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
+ /* Put the this parameter back where it came from. */
+ if (!REG_P (this_parm))
+ {
+ xops[0] = gen_rtx_REG (Pmode, 0);
+ xops[1] = ia32_this_parameter (function);
+ output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
+ }
+ }
if (flag_pic)
{
xops[0] = pic_offset_table_rtx;
xops[1] = gen_label_rtx ();
- xops[2] = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
+ xops[2] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
if (ix86_regparm > 2)
abort ();
output_asm_insn ("push{l}\t%0", xops);
output_asm_insn ("call\t%P1", xops);
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (xops[1]));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (xops[1]));
output_asm_insn ("pop{l}\t%0", xops);
output_asm_insn
("add{l}\t{%2+[.-%P1], %0|%0, OFFSET FLAT: %2+[.-%P1]}", xops);
@@ -13814,13 +14132,24 @@ x86_output_mi_thunk (file, delta, function)
}
else
{
- fprintf (file, "\tjmp ");
+ fprintf (file, "\tjmp\t");
assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
fprintf (file, "\n");
}
}
}
+static void
+x86_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ x86_output_mi_vcall_thunk (file, thunk, delta, /*vcall_index=*/0,
+ function);
+}
+
int
x86_field_alignment (field, computed)
tree field;
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 0daf4e2f3a2..f4f43803695 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -75,6 +75,13 @@ struct processor_costs {
const int prefetch_block; /* bytes moved to cache for prefetch. */
const int simultaneous_prefetches; /* number of parallel prefetch
operations. */
+ const int branch_cost; /* Default value for BRANCH_COST. */
+ const int fadd; /* cost of FADD and FSUB instructions. */
+ const int fmul; /* cost of FMUL instruction. */
+ const int fdiv; /* cost of FDIV instruction. */
+ const int fabs; /* cost of FABS instruction. */
+ const int fchs; /* cost of FCHS instruction. */
+ const int fsqrt; /* cost of FSQRT instruction. */
};
extern const struct processor_costs *ix86_cost;
@@ -105,19 +112,16 @@ extern int target_flags;
#define MASK_INLINE_ALL_STROPS 0x00000400 /* Inline stringops in all cases */
#define MASK_NO_PUSH_ARGS 0x00000800 /* Use push instructions */
#define MASK_ACCUMULATE_OUTGOING_ARGS 0x00001000/* Accumulate outgoing args */
-#define MASK_ACCUMULATE_OUTGOING_ARGS_SET 0x00002000
-#define MASK_MMX 0x00004000 /* Support MMX regs/builtins */
-#define MASK_MMX_SET 0x00008000
-#define MASK_SSE 0x00010000 /* Support SSE regs/builtins */
-#define MASK_SSE_SET 0x00020000
-#define MASK_SSE2 0x00040000 /* Support SSE2 regs/builtins */
-#define MASK_SSE2_SET 0x00080000
-#define MASK_3DNOW 0x00100000 /* Support 3Dnow builtins */
-#define MASK_3DNOW_SET 0x00200000
-#define MASK_3DNOW_A 0x00400000 /* Support Athlon 3Dnow builtins */
-#define MASK_3DNOW_A_SET 0x00800000
-#define MASK_128BIT_LONG_DOUBLE 0x01000000 /* long double size is 128bit */
-#define MASK_64BIT 0x02000000 /* Produce 64bit code */
+#define MASK_MMX 0x00002000 /* Support MMX regs/builtins */
+#define MASK_SSE 0x00004000 /* Support SSE regs/builtins */
+#define MASK_SSE2 0x00008000 /* Support SSE2 regs/builtins */
+#define MASK_3DNOW 0x00010000 /* Support 3Dnow builtins */
+#define MASK_3DNOW_A 0x00020000 /* Support Athlon 3Dnow builtins */
+#define MASK_128BIT_LONG_DOUBLE 0x00040000 /* long double size is 128bit */
+#define MASK_64BIT 0x00080000 /* Produce 64bit code */
+
+/* Unused: 0x03f0000 */
+
/* ... overlap with subtarget options starts by 0x04000000. */
#define MASK_NO_RED_ZONE 0x04000000 /* Do not use red zone */
@@ -174,7 +178,15 @@ extern int target_flags;
/* Debug FUNCTION_ARG macros */
#define TARGET_DEBUG_ARG (ix86_debug_arg_string != 0)
-/* 64bit Sledgehammer mode */
+/* 64bit Sledgehammer mode. For libgcc2 we make sure this is a
+ compile-time constant. */
+#ifdef IN_LIBGCC2
+#ifdef __x86_64__
+#define TARGET_64BIT 1
+#else
+#define TARGET_64BIT 0
+#endif
+#else
#ifdef TARGET_BI_ARCH
#define TARGET_64BIT (target_flags & MASK_64BIT)
#else
@@ -184,6 +196,7 @@ extern int target_flags;
#define TARGET_64BIT 0
#endif
#endif
+#endif
#define TARGET_386 (ix86_cpu == PROCESSOR_I386)
#define TARGET_486 (ix86_cpu == PROCESSOR_I486)
@@ -209,6 +222,8 @@ extern const int x86_partial_reg_dependency, x86_memory_mismatch_stall;
extern const int x86_accumulate_outgoing_args, x86_prologue_using_move;
extern const int x86_epilogue_using_move, x86_decompose_lea;
extern const int x86_arch_always_fancy_math_387, x86_shift1;
+extern const int x86_sse_partial_reg_dependency, x86_sse_partial_regs;
+extern const int x86_sse_typeless_stores, x86_sse_load0_by_pxor;
extern int x86_prefetch_sse;
#define TARGET_USE_LEAVE (x86_use_leave & CPUMASK)
@@ -245,6 +260,12 @@ extern int x86_prefetch_sse;
#define TARGET_SUB_ESP_8 (x86_sub_esp_8 & CPUMASK)
#define TARGET_INTEGER_DFMODE_MOVES (x86_integer_DFmode_moves & CPUMASK)
#define TARGET_PARTIAL_REG_DEPENDENCY (x86_partial_reg_dependency & CPUMASK)
+#define TARGET_SSE_PARTIAL_REG_DEPENDENCY \
+ (x86_sse_partial_reg_dependency & CPUMASK)
+#define TARGET_SSE_PARTIAL_REGS (x86_sse_partial_regs & CPUMASK)
+#define TARGET_SSE_TYPELESS_STORES (x86_sse_typeless_stores & CPUMASK)
+#define TARGET_SSE_TYPELESS_LOAD0 (x86_sse_typeless_load0 & CPUMASK)
+#define TARGET_SSE_LOAD0_BY_PXOR (x86_sse_load0_by_pxor & CPUMASK)
#define TARGET_MEMORY_MISMATCH_STALL (x86_memory_mismatch_stall & CPUMASK)
#define TARGET_PROLOGUE_USING_MOVE (x86_prologue_using_move & CPUMASK)
#define TARGET_EPILOGUE_USING_MOVE (x86_epilogue_using_move & CPUMASK)
@@ -334,30 +355,25 @@ extern int x86_prefetch_sse;
N_("Use push instructions to save outgoing arguments") }, \
{ "no-push-args", MASK_NO_PUSH_ARGS, \
N_("Do not use push instructions to save outgoing arguments") }, \
- { "accumulate-outgoing-args", (MASK_ACCUMULATE_OUTGOING_ARGS \
- | MASK_ACCUMULATE_OUTGOING_ARGS_SET), \
+ { "accumulate-outgoing-args", MASK_ACCUMULATE_OUTGOING_ARGS, \
N_("Use push instructions to save outgoing arguments") }, \
- { "no-accumulate-outgoing-args",MASK_ACCUMULATE_OUTGOING_ARGS_SET, \
+ { "no-accumulate-outgoing-args",-MASK_ACCUMULATE_OUTGOING_ARGS, \
N_("Do not use push instructions to save outgoing arguments") }, \
- { "mmx", MASK_MMX | MASK_MMX_SET, \
+ { "mmx", MASK_MMX, \
N_("Support MMX built-in functions") }, \
{ "no-mmx", -MASK_MMX, \
N_("Do not support MMX built-in functions") }, \
- { "no-mmx", MASK_MMX_SET, "" }, \
- { "3dnow", MASK_3DNOW | MASK_3DNOW_SET, \
+ { "3dnow", MASK_3DNOW, \
N_("Support 3DNow! built-in functions") }, \
- { "no-3dnow", -MASK_3DNOW, "" }, \
- { "no-3dnow", MASK_3DNOW_SET, \
+ { "no-3dnow", -MASK_3DNOW, \
N_("Do not support 3DNow! built-in functions") }, \
- { "sse", MASK_SSE | MASK_SSE_SET, \
+ { "sse", MASK_SSE, \
N_("Support MMX and SSE built-in functions and code generation") }, \
- { "no-sse", -MASK_SSE, "" }, \
- { "no-sse", MASK_SSE_SET, \
+ { "no-sse", -MASK_SSE, \
N_("Do not support MMX and SSE built-in functions and code generation") },\
- { "sse2", MASK_SSE2 | MASK_SSE2_SET, \
+ { "sse2", MASK_SSE2, \
N_("Support MMX, SSE and SSE2 built-in functions and code generation") }, \
- { "no-sse2", -MASK_SSE2, "" }, \
- { "no-sse2", MASK_SSE2_SET, \
+ { "no-sse2", -MASK_SSE2, \
N_("Do not support MMX, SSE and SSE2 built-in functions and code generation") }, \
{ "128bit-long-double", MASK_128BIT_LONG_DOUBLE, \
N_("sizeof(long double) is 16") }, \
@@ -537,6 +553,10 @@ extern int x86_prefetch_sse;
builtin_define ("__SSE__"); \
if (TARGET_SSE2) \
builtin_define ("__SSE2__"); \
+ if (TARGET_SSE_MATH && TARGET_SSE) \
+ builtin_define ("__SSE_MATH__"); \
+ if (TARGET_SSE_MATH && TARGET_SSE2) \
+ builtin_define ("__SSE2_MATH__"); \
\
/* Built-ins based on -march=. */ \
if (ix86_arch == PROCESSOR_I486) \
@@ -631,8 +651,7 @@ extern int x86_prefetch_sse;
/* Define for XFmode or TFmode extended real floating point support.
The XFmode is specified by i386 ABI, while TFmode may be faster
- due to alignment and simplifications in the address calculations.
- */
+ due to alignment and simplifications in the address calculations. */
#define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : 96)
#define MAX_LONG_DOUBLE_TYPE_SIZE 128
#ifdef __x86_64__
@@ -640,10 +659,14 @@ extern int x86_prefetch_sse;
#else
#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96
#endif
-/* Tell real.c that this is the 80-bit Intel extended float format
- packaged in a 128-bit or 96bit entity. */
-#define INTEL_EXTENDED_IEEE_FORMAT 1
+/* Set the value of FLT_EVAL_METHOD in float.h. When using only the
+ FPU, assume that the fpcw is set to extended precision; when using
+ only SSE, rounding is correct; when using both SSE and the FPU,
+ the rounding precision is indeterminate, since either may be chosen
+ apparently at random. */
+#define TARGET_FLT_EVAL_METHOD \
+ (TARGET_MIX_SSE_I387 ? -1 : TARGET_SSE_MATH ? 1 : 2)
#define SHORT_TYPE_SIZE 16
#define INT_TYPE_SIZE 32
@@ -696,8 +719,11 @@ extern int x86_prefetch_sse;
#define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN \
(ix86_preferred_stack_boundary > STACK_BOUNDARY && !TARGET_64BIT)
-/* Allocation boundary for the code of a function. */
-#define FUNCTION_BOUNDARY 16
+/* Minimum allocation boundary for the code of a function. */
+#define FUNCTION_BOUNDARY 8
+
+/* C++ stores the virtual bit in the lowest bit of function pointers. */
+#define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_pfn
/* Alignment of field after `int : 0' in a structure. */
@@ -713,10 +739,9 @@ extern int x86_prefetch_sse;
#define BIGGEST_ALIGNMENT 128
-/* Decide whether a variable of mode MODE must be 128 bit aligned. */
+/* Decide whether a variable of mode MODE should be 128 bit aligned. */
#define ALIGN_MODE_128(MODE) \
- ((MODE) == XFmode || (MODE) == TFmode || ((MODE) == TImode) \
- || (MODE) == V4SFmode || (MODE) == V4SImode)
+ ((MODE) == XFmode || (MODE) == TFmode || SSE_REG_MODE_P (MODE))
/* The published ABIs say that doubles should be aligned on word
boundaries, so lower the aligment for structure fields unless
@@ -726,7 +751,11 @@ extern int x86_prefetch_sse;
supports no vector modes, cut out the complexity and fall back
on BIGGEST_FIELD_ALIGNMENT. */
#ifdef IN_TARGET_LIBS
+#ifdef __x86_64__
+#define BIGGEST_FIELD_ALIGNMENT 128
+#else
#define BIGGEST_FIELD_ALIGNMENT 32
+#endif
#else
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
x86_field_alignment (FIELD, COMPUTED)
@@ -779,13 +808,13 @@ extern int x86_prefetch_sse;
#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
ix86_function_arg_boundary ((MODE), (TYPE))
-/* Set this non-zero if move instructions will actually fail to work
+/* Set this nonzero if move instructions will actually fail to work
when given unaligned data. */
#define STRICT_ALIGNMENT 0
/* If bit field type is int, don't let it cross an int,
and give entire struct the alignment of an int. */
-/* Required on the 386 since it doesn't have bitfield insns. */
+/* Required on the 386 since it doesn't have bit-field insns. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* Standard register usage. */
@@ -986,6 +1015,17 @@ do { \
|| (MODE) == CDImode \
|| (TARGET_64BIT && ((MODE) == TImode || (MODE) == CTImode)))
+/* Return true for modes passed in SSE registers. */
+#define SSE_REG_MODE_P(MODE) \
+ ((MODE) == TImode || (MODE) == V16QImode \
+ || (MODE) == V8HImode || (MODE) == V2DFmode || (MODE) == V2DImode \
+ || (MODE) == V4SFmode || (MODE) == V4SImode)
+
+/* Return true for modes passed in MMX registers. */
+#define MMX_REG_MODE_P(MODE) \
+ ((MODE) == V8QImode || (MODE) == V4HImode || (MODE) == V2SImode \
+ || (MODE) == V2SFmode)
+
/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */
#define HARD_REGNO_MODE_OK(REGNO, MODE) \
@@ -1098,6 +1138,8 @@ do { \
: reload_completed ? REGNO (pic_offset_table_rtx) \
: REAL_PIC_OFFSET_TABLE_REGNUM)
+#define GOT_SYMBOL_NAME "_GLOBAL_OFFSET_TABLE_"
+
/* Register in which address to store a structure value
arrives in the function. On the 386, the prologue
copies this from the stack to register %eax. */
@@ -1665,18 +1707,6 @@ typedef struct ix86_args {
#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0
-/* If PIC, we cannot make sibling calls to global functions
- because the PLT requires %ebx live.
- If we are returning floats on the register stack, we cannot make
- sibling calls to functions that return floats. (The stack adjust
- instruction will wind up after the sibcall jump, and not be executed.) */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) \
- ((DECL) \
- && (! flag_pic || ! TREE_PUBLIC (DECL)) \
- && (! TARGET_FLOAT_RETURNS_IN_80387 \
- || ! FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (DECL)))) \
- || FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (cfun->decl))))))
-
/* Perform any needed actions needed for a function that is receiving a
variable number of arguments.
@@ -1797,12 +1827,6 @@ do { \
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Macros to check register numbers against specific register classes. */
/* These assume that REGNO is a hard or pseudo reg number.
@@ -2003,13 +2027,9 @@ enum ix86_builtins
IX86_BUILTIN_CMPEQSS,
IX86_BUILTIN_CMPLTSS,
IX86_BUILTIN_CMPLESS,
- IX86_BUILTIN_CMPGTSS,
- IX86_BUILTIN_CMPGESS,
IX86_BUILTIN_CMPNEQSS,
IX86_BUILTIN_CMPNLTSS,
IX86_BUILTIN_CMPNLESS,
- IX86_BUILTIN_CMPNGTSS,
- IX86_BUILTIN_CMPNGESS,
IX86_BUILTIN_CMPORDSS,
IX86_BUILTIN_CMPUNORDSS,
IX86_BUILTIN_CMPNESS,
@@ -2217,13 +2237,9 @@ enum ix86_builtins
IX86_BUILTIN_CMPEQSD,
IX86_BUILTIN_CMPLTSD,
IX86_BUILTIN_CMPLESD,
- IX86_BUILTIN_CMPGTSD,
- IX86_BUILTIN_CMPGESD,
IX86_BUILTIN_CMPNEQSD,
IX86_BUILTIN_CMPNLTSD,
IX86_BUILTIN_CMPNLESD,
- IX86_BUILTIN_CMPNGTSD,
- IX86_BUILTIN_CMPNGESD,
IX86_BUILTIN_CMPORDSD,
IX86_BUILTIN_CMPUNORDSD,
IX86_BUILTIN_CMPNESD,
@@ -2377,11 +2393,13 @@ enum ix86_builtins
IX86_BUILTIN_PSRLW128,
IX86_BUILTIN_PSRLD128,
IX86_BUILTIN_PSRLQ128,
+ IX86_BUILTIN_PSLLDQI128,
IX86_BUILTIN_PSLLWI128,
IX86_BUILTIN_PSLLDI128,
IX86_BUILTIN_PSLLQI128,
IX86_BUILTIN_PSRAWI128,
IX86_BUILTIN_PSRADI128,
+ IX86_BUILTIN_PSRLDQI128,
IX86_BUILTIN_PSRLWI128,
IX86_BUILTIN_PSRLDI128,
IX86_BUILTIN_PSRLQI128,
@@ -2624,7 +2642,9 @@ do { \
break; \
\
case MULT: \
- if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fmul); \
+ else if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
{ \
unsigned HOST_WIDE_INT value = INTVAL (XEXP (X, 1)); \
int nbits = 0; \
@@ -2646,10 +2666,16 @@ do { \
case UDIV: \
case MOD: \
case UMOD: \
- TOPLEVEL_COSTS_N_INSNS (ix86_cost->divide); \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fdiv); \
+ else \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->divide); \
+ break; \
\
case PLUS: \
- if (!TARGET_DECOMPOSE_LEA \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fadd); \
+ else if (!TARGET_DECOMPOSE_LEA \
&& INTEGRAL_MODE_P (GET_MODE (X)) \
&& GET_MODE_BITSIZE (GET_MODE (X)) <= GET_MODE_BITSIZE (Pmode)) \
{ \
@@ -2689,21 +2715,29 @@ do { \
+ rtx_cost (XEXP (X, 1), (OUTER_CODE))); \
} \
} \
+ /* fall through */ \
\
+ case MINUS: \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fadd); \
/* fall through */ \
+ \
case AND: \
case IOR: \
case XOR: \
- case MINUS: \
if (!TARGET_64BIT && GET_MODE (X) == DImode) \
return (COSTS_N_INSNS (ix86_cost->add) * 2 \
+ (rtx_cost (XEXP (X, 0), (OUTER_CODE)) \
<< (GET_MODE (XEXP (X, 0)) != DImode)) \
+ (rtx_cost (XEXP (X, 1), (OUTER_CODE)) \
<< (GET_MODE (XEXP (X, 1)) != DImode))); \
- \
/* fall through */ \
+ \
case NEG: \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fchs); \
+ /* fall through */ \
+ \
case NOT: \
if (!TARGET_64BIT && GET_MODE (X) == DImode) \
TOPLEVEL_COSTS_N_INSNS (ix86_cost->add * 2); \
@@ -2715,6 +2749,16 @@ do { \
TOPLEVEL_COSTS_N_INSNS (0); \
break; \
\
+ case ABS: \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fabs); \
+ break; \
+ \
+ case SQRT: \
+ if (FLOAT_MODE_P (GET_MODE (X))) \
+ TOPLEVEL_COSTS_N_INSNS (ix86_cost->fsqrt); \
+ break; \
+ \
egress_rtx_costs: \
break;
@@ -2819,10 +2863,10 @@ do { \
cost many times greater than aligned accesses, for example if they
are emulated in a trap handler.
- When this macro is non-zero, the compiler will act as if
- `STRICT_ALIGNMENT' were non-zero when generating code for block
+ When this macro is nonzero, the compiler will act as if
+ `STRICT_ALIGNMENT' were nonzero when generating code for block
moves. This can cause significantly more instructions to be
- produced. Therefore, do not set this macro non-zero if unaligned
+ produced. Therefore, do not set this macro nonzero if unaligned
accesses only add a cycle or two to the time for a memory access.
If the value of this macro is always zero, it need not be defined. */
@@ -2860,7 +2904,7 @@ do { \
#define SELECT_CC_MODE(OP, X, Y) ix86_cc_mode ((OP), (X), (Y))
-/* Return non-zero if MODE implies a floating point inequality can be
+/* Return nonzero if MODE implies a floating point inequality can be
reversed. */
#define REVERSIBLE_CC_MODE(MODE) 1
@@ -2965,25 +3009,29 @@ extern int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER];
? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
: DW_EH_PE_absptr)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* This is how to output an insn to push a register on the stack.
It need not be very fast code. */
#define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \
- asm_fprintf ((FILE), "\tpush{l}\t%%e%s\n", reg_names[(REGNO)])
+do { \
+ if (TARGET_64BIT) \
+ asm_fprintf ((FILE), "\tpush{q}\t%%r%s\n", \
+ reg_names[(REGNO)] + (REX_INT_REGNO_P (REGNO) != 0)); \
+ else \
+ asm_fprintf ((FILE), "\tpush{l}\t%%e%s\n", reg_names[(REGNO)]); \
+} while (0)
/* This is how to output an insn to pop a register from the stack.
It need not be very fast code. */
#define ASM_OUTPUT_REG_POP(FILE, REGNO) \
- asm_fprintf ((FILE), "\tpop{l}\t%%e%s\n", reg_names[(REGNO)])
+do { \
+ if (TARGET_64BIT) \
+ asm_fprintf ((FILE), "\tpop{q}\t%%r%s\n", \
+ reg_names[(REGNO)] + (REX_INT_REGNO_P (REGNO) != 0)); \
+ else \
+ asm_fprintf ((FILE), "\tpop{l}\t%%e%s\n", reg_names[(REGNO)]); \
+} while (0)
/* This is how to output an element of a case-vector that is absolute. */
@@ -3012,6 +3060,13 @@ extern int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER];
#define ASM_SIMPLIFY_DWARF_ADDR(X) \
i386_simplify_dwarf_addr (X)
+/* Emit a dtp-relative reference to a TLS variable. */
+
+#ifdef HAVE_AS_TLS
+#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
+ i386_output_dwarf_dtprel (FILE, SIZE, X)
+#endif
+
/* Switch to init or fini section via SECTION_OP, emit a call to FUNC,
and switch back. For x86 we do this only to save a few bytes that
would otherwise be unused in the text section. */
@@ -3147,6 +3202,7 @@ do { \
LABEL_REF, SUBREG, REG, MEM}}, \
{"pic_symbolic_operand", {CONST}}, \
{"call_insn_operand", {REG, SUBREG, MEM, SYMBOL_REF}}, \
+ {"sibcall_insn_operand", {REG, SUBREG, SYMBOL_REF}}, \
{"constant_call_address_operand", {SYMBOL_REF, CONST}}, \
{"const0_operand", {CONST_INT, CONST_DOUBLE}}, \
{"const1_operand", {CONST_INT}}, \
@@ -3157,6 +3213,7 @@ do { \
{"general_no_elim_operand", {CONST_INT, CONST_DOUBLE, CONST, \
SYMBOL_REF, LABEL_REF, SUBREG, REG, MEM}}, \
{"nonmemory_no_elim_operand", {CONST_INT, REG, SUBREG}}, \
+ {"index_register_operand", {SUBREG, REG}}, \
{"q_regs_operand", {SUBREG, REG}}, \
{"non_q_regs_operand", {SUBREG, REG}}, \
{"fcmov_comparison_operator", {EQ, NE, LTU, GTU, LEU, GEU, UNORDERED, \
@@ -3186,7 +3243,11 @@ do { \
{"global_dynamic_symbolic_operand", {SYMBOL_REF}}, \
{"local_dynamic_symbolic_operand", {SYMBOL_REF}}, \
{"initial_exec_symbolic_operand", {SYMBOL_REF}}, \
- {"local_exec_symbolic_operand", {SYMBOL_REF}},
+ {"local_exec_symbolic_operand", {SYMBOL_REF}}, \
+ {"any_fp_register_operand", {REG}}, \
+ {"register_and_not_any_fp_reg_operand", {REG}}, \
+ {"fp_register_operand", {REG}}, \
+ {"register_and_not_fp_reg_operand", {REG}}, \
/* A list of predicates that do special things with modes, and so
should not elicit warnings for VOIDmode match_operand. */
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 01e03c3a811..0e4b387f91c 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -61,6 +61,8 @@
(UNSPEC_TPOFF 4)
(UNSPEC_NTPOFF 5)
(UNSPEC_DTPOFF 6)
+ (UNSPEC_GOTNTPOFF 7)
+ (UNSPEC_INDNTPOFF 8)
; Prologue support
(UNSPEC_STACK_PROBE 10)
@@ -161,7 +163,9 @@
sse,ssemov,sseadd,ssemul,ssecmp,ssecvt,ssediv")
(const_string "sse")
(eq_attr "type" "mmx,mmxmov,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft")
- (const_string "mmx")]
+ (const_string "mmx")
+ (eq_attr "type" "other")
+ (const_string "unknown")]
(const_string "integer")))
;; The (bounding maximum) length of an instruction immediate.
@@ -2077,15 +2081,15 @@
;; %%% Kill this when call knows how to work this out.
(define_split
[(set (match_operand:SF 0 "push_operand" "")
- (match_operand:SF 1 "register_operand" ""))]
- "!TARGET_64BIT && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:SF 1 "any_fp_register_operand" ""))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -4)))
(set (mem:SF (reg:SI 7)) (match_dup 1))])
(define_split
[(set (match_operand:SF 0 "push_operand" "")
- (match_operand:SF 1 "register_operand" ""))]
- "TARGET_64BIT && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:SF 1 "any_fp_register_operand" ""))]
+ "TARGET_64BIT"
[(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -8)))
(set (mem:SF (reg:DI 7)) (match_dup 1))])
@@ -2129,12 +2133,12 @@
case 4:
return "mov{l}\t{%1, %0|%0, %1}";
case 5:
- if (TARGET_SSE2 && !TARGET_ATHLON)
+ if (get_attr_mode (insn) == MODE_TI)
return "pxor\t%0, %0";
else
return "xorps\t%0, %0";
case 6:
- if (TARGET_PARTIAL_REG_DEPENDENCY)
+ if (get_attr_mode (insn) == MODE_V4SF)
return "movaps\t{%1, %0|%0, %1}";
else
return "movss\t{%1, %0|%0, %1}";
@@ -2154,7 +2158,40 @@
}
}
[(set_attr "type" "fmov,fmov,fmov,imov,imov,ssemov,ssemov,ssemov,ssemov,mmxmov,mmxmov,mmxmov")
- (set_attr "mode" "SF,SF,SF,SI,SI,TI,SF,SF,SF,SI,SI,DI")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "3,4,9,10")
+ (const_string "SI")
+ (eq_attr "alternative" "5")
+ (if_then_else
+ (and (and (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
+ (const_int 0))
+ (ne (symbol_ref "TARGET_SSE2")
+ (const_int 0)))
+ (eq (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "TI")
+ (const_string "V4SF"))
+ /* For architectures resolving dependencies on
+ whole SSE registers use APS move to break dependency
+ chains, otherwise use short move to avoid extra work.
+
+ Do the same for architectures resolving dependencies on
+ the parts. While in DF mode it is better to always handle
+ just register parts, the SF mode is different due to lack
+ of instructions to load just part of the register. It is
+ better to maintain the whole registers in single format
+ to avoid problems on using packed logical operations. */
+ (eq_attr "alternative" "6")
+ (if_then_else
+ (ior (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
+ (const_int 0))
+ (ne (symbol_ref "TARGET_SSE_PARTIAL_REGS")
+ (const_int 0)))
+ (const_string "V4SF")
+ (const_string "SF"))
+ (eq_attr "alternative" "11")
+ (const_string "DI")]
+ (const_string "SF")))])
(define_insn "*swapsf"
[(set (match_operand:SF 0 "register_operand" "+f")
@@ -2249,16 +2286,16 @@
;; %%% Kill this when call knows how to work this out.
(define_split
[(set (match_operand:DF 0 "push_operand" "")
- (match_operand:DF 1 "register_operand" ""))]
- "!TARGET_64BIT && reload_completed && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:DF 1 "any_fp_register_operand" ""))]
+ "!TARGET_64BIT && reload_completed"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -8)))
(set (mem:DF (reg:SI 7)) (match_dup 1))]
"")
(define_split
[(set (match_operand:DF 0 "push_operand" "")
- (match_operand:DF 1 "register_operand" ""))]
- "TARGET_64BIT && reload_completed && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:DF 1 "any_fp_register_operand" ""))]
+ "TARGET_64BIT && reload_completed"
[(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -8)))
(set (mem:DF (reg:DI 7)) (match_dup 1))]
"")
@@ -2315,25 +2352,78 @@
case 4:
return "#";
case 5:
- if (TARGET_ATHLON)
- return "xorpd\t%0, %0";
- else
- return "pxor\t%0, %0";
+ switch (get_attr_mode (insn))
+ {
+ case MODE_V4SF:
+ return "xorps\t%0, %0";
+ case MODE_V2DF:
+ return "xorpd\t%0, %0";
+ case MODE_TI:
+ return "pxor\t%0, %0";
+ default:
+ abort ();
+ }
case 6:
- if (TARGET_PARTIAL_REG_DEPENDENCY)
- return "movapd\t{%1, %0|%0, %1}";
+ switch (get_attr_mode (insn))
+ {
+ case MODE_V4SF:
+ return "movaps\t{%1, %0|%0, %1}";
+ case MODE_V2DF:
+ return "movapd\t{%1, %0|%0, %1}";
+ case MODE_DF:
+ return "movsd\t{%1, %0|%0, %1}";
+ default:
+ abort ();
+ }
+ case 7:
+ if (get_attr_mode (insn) == MODE_V2DF)
+ return "movlpd\t{%1, %0|%0, %1}";
else
return "movsd\t{%1, %0|%0, %1}";
- case 7:
case 8:
- return "movsd\t{%1, %0|%0, %1}";
+ return "movsd\t{%1, %0|%0, %1}";
default:
abort();
}
}
[(set_attr "type" "fmov,fmov,fmov,multi,multi,ssemov,ssemov,ssemov,ssemov")
- (set_attr "mode" "DF,DF,DF,SI,SI,TI,DF,DF,DF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "3,4")
+ (const_string "SI")
+ /* xorps is one byte shorter. */
+ (eq_attr "alternative" "5")
+ (cond [(ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
+ (const_int 0))
+ (const_string "TI")]
+ (const_string "V2DF"))
+ /* For architectures resolving dependencies on
+ whole SSE registers use APD move to break dependency
+ chains, otherwise use short move to avoid extra work.
+
+ movaps encodes one byte shorter. */
+ (eq_attr "alternative" "6")
+ (cond
+ [(ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
+ (const_int 0))
+ (const_string "V2DF")]
+ (const_string "DF"))
+ /* For achitectures resolving dependencies on register
+ parts we may avoid extra work to zero out upper part
+ of register. */
+ (eq_attr "alternative" "7")
+ (if_then_else
+ (ne (symbol_ref "TARGET_SSE_PARTIAL_REGS")
+ (const_int 0))
+ (const_string "V2DF")
+ (const_string "DF"))]
+ (const_string "DF")))])
(define_insn "*movdf_integer"
[(set (match_operand:DF 0 "nonimmediate_operand" "=f#Yr,m,f#Yr,r#Yf,o,Y#rf,Y#rf,Y#rf,m")
@@ -2377,16 +2467,34 @@
return "#";
case 5:
- if (TARGET_ATHLON)
- return "xorpd\t%0, %0";
- else
- return "pxor\t%0, %0";
+ switch (get_attr_mode (insn))
+ {
+ case MODE_V4SF:
+ return "xorps\t%0, %0";
+ case MODE_V2DF:
+ return "xorpd\t%0, %0";
+ case MODE_TI:
+ return "pxor\t%0, %0";
+ default:
+ abort ();
+ }
case 6:
- if (TARGET_PARTIAL_REG_DEPENDENCY)
- return "movapd\t{%1, %0|%0, %1}";
+ switch (get_attr_mode (insn))
+ {
+ case MODE_V4SF:
+ return "movaps\t{%1, %0|%0, %1}";
+ case MODE_V2DF:
+ return "movapd\t{%1, %0|%0, %1}";
+ case MODE_DF:
+ return "movsd\t{%1, %0|%0, %1}";
+ default:
+ abort ();
+ }
+ case 7:
+ if (get_attr_mode (insn) == MODE_V2DF)
+ return "movlpd\t{%1, %0|%0, %1}";
else
return "movsd\t{%1, %0|%0, %1}";
- case 7:
case 8:
return "movsd\t{%1, %0|%0, %1}";
@@ -2395,7 +2503,42 @@
}
}
[(set_attr "type" "fmov,fmov,fmov,multi,multi,ssemov,ssemov,ssemov,ssemov")
- (set_attr "mode" "DF,DF,DF,SI,SI,TI,DF,DF,DF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "3,4")
+ (const_string "SI")
+ /* xorps is one byte shorter. */
+ (eq_attr "alternative" "5")
+ (cond [(ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
+ (const_int 0))
+ (const_string "TI")]
+ (const_string "V2DF"))
+ /* For architectures resolving dependencies on
+ whole SSE registers use APD move to break dependency
+ chains, otherwise use short move to avoid extra work.
+
+ movaps encodes one byte shorter. */
+ (eq_attr "alternative" "6")
+ (cond
+ [(ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (ne (symbol_ref "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
+ (const_int 0))
+ (const_string "V2DF")]
+ (const_string "DF"))
+ /* For achitectures resolving dependencies on register
+ parts we may avoid extra work to zero out upper part
+ of register. */
+ (eq_attr "alternative" "7")
+ (if_then_else
+ (ne (symbol_ref "TARGET_SSE_PARTIAL_REGS")
+ (const_int 0))
+ (const_string "V2DF")
+ (const_string "DF"))]
+ (const_string "DF")))])
(define_split
[(set (match_operand:DF 0 "nonimmediate_operand" "")
@@ -2568,28 +2711,28 @@
&& (GET_MODE (operands[0]) == XFmode
|| GET_MODE (operands[0]) == TFmode
|| GET_MODE (operands[0]) == DFmode)
- && (!REG_P (operands[1]) || !ANY_FP_REGNO_P (REGNO (operands[1])))"
+ && !ANY_FP_REG_P (operands[1])"
[(const_int 0)]
"ix86_split_long_move (operands); DONE;")
(define_split
[(set (match_operand:XF 0 "push_operand" "")
- (match_operand:XF 1 "register_operand" ""))]
- "!TARGET_64BIT && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:XF 1 "any_fp_register_operand" ""))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12)))
(set (mem:XF (reg:SI 7)) (match_dup 1))])
(define_split
[(set (match_operand:TF 0 "push_operand" "")
- (match_operand:TF 1 "register_operand" ""))]
- "!TARGET_64BIT && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:TF 1 "any_fp_register_operand" ""))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -16)))
(set (mem:TF (reg:SI 7)) (match_dup 1))])
(define_split
[(set (match_operand:TF 0 "push_operand" "")
- (match_operand:TF 1 "register_operand" ""))]
- "TARGET_64BIT && ANY_FP_REGNO_P (REGNO (operands[1]))"
+ (match_operand:TF 1 "any_fp_register_operand" ""))]
+ "TARGET_64BIT"
[(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -16)))
(set (mem:TF (reg:DI 7)) (match_dup 1))])
@@ -3341,15 +3484,15 @@
(define_split
[(set (match_operand:DF 0 "push_operand" "")
- (float_extend:DF (match_operand:SF 1 "register_operand" "")))]
- "!TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:DF (match_operand:SF 1 "fp_register_operand" "")))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -8)))
(set (mem:DF (reg:SI 7)) (float_extend:DF (match_dup 1)))])
(define_split
[(set (match_operand:DF 0 "push_operand" "")
- (float_extend:DF (match_operand:SF 1 "register_operand" "")))]
- "TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:DF (match_operand:SF 1 "fp_register_operand" "")))]
+ "TARGET_64BIT"
[(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -8)))
(set (mem:DF (reg:DI 7)) (float_extend:DF (match_dup 1)))])
@@ -3361,8 +3504,8 @@
(define_split
[(set (match_operand:XF 0 "push_operand" "")
- (float_extend:XF (match_operand:SF 1 "register_operand" "")))]
- "!TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:XF (match_operand:SF 1 "fp_register_operand" "")))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12)))
(set (mem:XF (reg:SI 7)) (float_extend:XF (match_dup 1)))])
@@ -3374,15 +3517,15 @@
(define_split
[(set (match_operand:TF 0 "push_operand" "")
- (float_extend:TF (match_operand:SF 1 "register_operand" "")))]
- "!TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:TF (match_operand:SF 1 "fp_register_operand" "")))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -16)))
(set (mem:TF (reg:SI 7)) (float_extend:TF (match_dup 1)))])
(define_split
[(set (match_operand:TF 0 "push_operand" "")
- (float_extend:TF (match_operand:SF 1 "register_operand" "")))]
- "TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:TF (match_operand:SF 1 "fp_register_operand" "")))]
+ "TARGET_64BIT"
[(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -16)))
(set (mem:DF (reg:DI 7)) (float_extend:TF (match_dup 1)))])
@@ -3394,8 +3537,8 @@
(define_split
[(set (match_operand:XF 0 "push_operand" "")
- (float_extend:XF (match_operand:DF 1 "register_operand" "")))]
- "!TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:XF (match_operand:DF 1 "fp_register_operand" "")))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12)))
(set (mem:DF (reg:SI 7)) (float_extend:XF (match_dup 1)))])
@@ -3407,15 +3550,15 @@
(define_split
[(set (match_operand:TF 0 "push_operand" "")
- (float_extend:TF (match_operand:DF 1 "register_operand" "")))]
- "!TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:TF (match_operand:DF 1 "fp_register_operand" "")))]
+ "!TARGET_64BIT"
[(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -16)))
(set (mem:TF (reg:SI 7)) (float_extend:XF (match_dup 1)))])
(define_split
[(set (match_operand:TF 0 "push_operand" "")
- (float_extend:TF (match_operand:DF 1 "register_operand" "")))]
- "TARGET_64BIT && FP_REGNO_P (REGNO (operands[1]))"
+ (float_extend:TF (match_operand:DF 1 "fp_register_operand" "")))]
+ "TARGET_64BIT"
[(set (reg:DI 7) (plus:DI (reg:DI 7) (const_int -16)))
(set (mem:TF (reg:DI 7)) (float_extend:TF (match_dup 1)))])
@@ -3702,7 +3845,7 @@
(float_truncate:SF
(match_operand:DF 1 "nonimmediate_operand" "f,f,f,f,mY")))
(clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m,X"))]
- "TARGET_80387 && TARGET_SSE2"
+ "TARGET_80387 && TARGET_SSE2 && !TARGET_SSE_PARTIAL_REGS"
{
switch (which_alternative)
{
@@ -3712,7 +3855,30 @@
else
return "fst%z0\t%y0";
case 4:
- return "cvtsd2ss\t{%1, %0|%0, %1}";
+ return "#";
+ default:
+ abort ();
+ }
+}
+ [(set_attr "type" "fmov,multi,multi,multi,ssecvt")
+ (set_attr "mode" "SF,SF,SF,SF,DF")])
+
+(define_insn "*truncdfsf2_1_sse_nooverlap"
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=*!m,?f#rx,?r#fx,?x#rf,&Y")
+ (float_truncate:SF
+ (match_operand:DF 1 "nonimmediate_operand" "f,f,f,f,mY")))
+ (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m,X"))]
+ "TARGET_80387 && TARGET_SSE2 && TARGET_SSE_PARTIAL_REGS"
+{
+ switch (which_alternative)
+ {
+ case 0:
+ if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+ return "fstp%z0\t%y0";
+ else
+ return "fst%z0\t%y0";
+ case 4:
+ return "#";
default:
abort ();
}
@@ -3724,7 +3890,7 @@
[(set (match_operand:SF 0 "nonimmediate_operand" "=Y,!m")
(float_truncate:SF
(match_operand:DF 1 "nonimmediate_operand" "mY,f")))]
- "TARGET_80387 && TARGET_SSE2
+ "TARGET_80387 && TARGET_SSE2 && !TARGET_SSE_PARTIAL_REGS
&& (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
{
switch (which_alternative)
@@ -3743,7 +3909,30 @@
[(set_attr "type" "ssecvt,fmov")
(set_attr "mode" "DF,SF")])
-(define_insn "truncdfsf2_3"
+(define_insn "*truncdfsf2_2_nooverlap"
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=&Y,!m")
+ (float_truncate:SF
+ (match_operand:DF 1 "nonimmediate_operand" "mY,f")))]
+ "TARGET_80387 && TARGET_SSE2 && TARGET_SSE_PARTIAL_REGS
+ && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
+{
+ switch (which_alternative)
+ {
+ case 0:
+ return "#";
+ case 1:
+ if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+ return "fstp%z0\t%y0";
+ else
+ return "fst%z0\t%y0";
+ default:
+ abort ();
+ }
+}
+ [(set_attr "type" "ssecvt,fmov")
+ (set_attr "mode" "DF,SF")])
+
+(define_insn "*truncdfsf2_3"
[(set (match_operand:SF 0 "memory_operand" "=m")
(float_truncate:SF
(match_operand:DF 1 "register_operand" "f")))]
@@ -3761,11 +3950,20 @@
[(set (match_operand:SF 0 "register_operand" "=Y")
(float_truncate:SF
(match_operand:DF 1 "nonimmediate_operand" "mY")))]
- "!TARGET_80387 && TARGET_SSE2"
+ "!TARGET_80387 && TARGET_SSE2 && !TARGET_SSE_PARTIAL_REGS"
"cvtsd2ss\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecvt")
(set_attr "mode" "DF")])
+(define_insn "*truncdfsf2_sse_only_nooverlap"
+ [(set (match_operand:SF 0 "register_operand" "=&Y")
+ (float_truncate:SF
+ (match_operand:DF 1 "nonimmediate_operand" "mY")))]
+ "!TARGET_80387 && TARGET_SSE2 && TARGET_SSE_PARTIAL_REGS"
+ "#"
+ [(set_attr "type" "ssecvt")
+ (set_attr "mode" "DF")])
+
(define_split
[(set (match_operand:SF 0 "memory_operand" "")
(float_truncate:SF
@@ -3775,23 +3973,62 @@
[(set (match_dup 0) (float_truncate:SF (match_dup 1)))]
"")
+; Avoid possible reformating penalty on the destination by first
+; zeroing it out
(define_split
- [(set (match_operand:SF 0 "nonimmediate_operand" "")
+ [(set (match_operand:SF 0 "register_operand" "")
(float_truncate:SF
(match_operand:DF 1 "nonimmediate_operand" "")))
(clobber (match_operand 2 "" ""))]
"TARGET_80387 && reload_completed
- && !FP_REG_P (operands[0]) && !FP_REG_P (operands[1])"
- [(set (match_dup 0) (float_truncate:SF (match_dup 1)))]
- "")
+ && SSE_REG_P (operands[0])"
+ [(const_int 0)]
+{
+ rtx src, dest;
+ if (!TARGET_SSE_PARTIAL_REGS)
+ emit_insn (gen_truncdfsf2_sse_only (operands[0], operands[1]));
+ else
+ {
+ dest = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+ src = simplify_gen_subreg (V2DFmode, operands[1], DFmode, 0);
+ /* simplify_gen_subreg refuses to widen memory references. */
+ if (GET_CODE (src) == SUBREG)
+ alter_subreg (&src);
+ if (reg_overlap_mentioned_p (operands[0], operands[1]))
+ abort ();
+ emit_insn (gen_sse_clrv4sf (dest, CONST0_RTX (V4SFmode)));
+ emit_insn (gen_cvtsd2ss (dest, dest, src));
+ }
+ DONE;
+})
(define_split
[(set (match_operand:SF 0 "register_operand" "")
(float_truncate:SF
- (match_operand:DF 1 "register_operand" "")))
- (clobber (match_operand:SF 2 "memory_operand" ""))]
+ (match_operand:DF 1 "nonimmediate_operand" "")))]
"TARGET_80387 && reload_completed
- && FP_REG_P (operands[1])"
+ && SSE_REG_P (operands[0]) && TARGET_SSE_PARTIAL_REGS"
+ [(const_int 0)]
+{
+ rtx src, dest;
+ dest = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+ src = simplify_gen_subreg (V2DFmode, operands[1], DFmode, 0);
+ /* simplify_gen_subreg refuses to widen memory references. */
+ if (GET_CODE (src) == SUBREG)
+ alter_subreg (&src);
+ if (reg_overlap_mentioned_p (operands[0], operands[1]))
+ abort ();
+ emit_insn (gen_sse_clrv4sf (dest, CONST0_RTX (V4SFmode)));
+ emit_insn (gen_cvtsd2ss (dest, dest, src));
+ DONE;
+})
+
+(define_split
+ [(set (match_operand:SF 0 "register_operand" "")
+ (float_truncate:SF
+ (match_operand:DF 1 "fp_register_operand" "")))
+ (clobber (match_operand:SF 2 "memory_operand" ""))]
+ "TARGET_80387 && reload_completed"
[(set (match_dup 2) (float_truncate:SF (match_dup 1)))
(set (match_dup 0) (match_dup 2))]
"")
@@ -4488,6 +4725,22 @@
(set_attr "mode" "SF")
(set_attr "fp_int_src" "true")])
+; Avoid possible reformating penalty on the destination by first
+; zeroing it out
+(define_split
+ [(set (match_operand:SF 0 "register_operand" "")
+ (float:SF (match_operand:SI 1 "nonimmediate_operand" "")))]
+ "TARGET_80387 && reload_completed
+ && SSE_REG_P (operands[0]) && TARGET_SSE_PARTIAL_REGS"
+ [(const_int 0)]
+{
+ rtx dest;
+ dest = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+ emit_insn (gen_sse_clrv4sf (dest, CONST0_RTX (V4SFmode)));
+ emit_insn (gen_cvtsi2ss (dest, dest, operands[1]));
+ DONE;
+})
+
(define_expand "floatdisf2"
[(set (match_operand:SF 0 "register_operand" "")
(float:SF (match_operand:DI 1 "nonimmediate_operand" "")))]
@@ -4526,6 +4779,22 @@
(set_attr "mode" "SF")
(set_attr "fp_int_src" "true")])
+; Avoid possible reformating penalty on the destination by first
+; zeroing it out
+(define_split
+ [(set (match_operand:SF 0 "register_operand" "")
+ (float:SF (match_operand:DI 1 "nonimmediate_operand" "")))]
+ "TARGET_80387 && reload_completed
+ && SSE_REG_P (operands[0]) && TARGET_SSE_PARTIAL_REGS"
+ [(const_int 0)]
+{
+ rtx dest;
+ dest = simplify_gen_subreg (V4SFmode, operands[0], SFmode, 0);
+ emit_insn (gen_sse_clrv4sf (dest, CONST0_RTX (V4SFmode)));
+ emit_insn (gen_cvtsi2ssq (dest, dest, operands[1]));
+ DONE;
+})
+
(define_insn "floathidf2"
[(set (match_operand:DF 0 "register_operand" "=f,f")
(float:DF (match_operand:HI 1 "nonimmediate_operand" "m,r")))]
@@ -4670,10 +4939,9 @@
;; %%% Kill these when reload knows how to do it.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "fp_register_operand" "")
(float (match_operand 1 "register_operand" "")))]
- "reload_completed && FLOAT_MODE_P (GET_MODE (operands[0]))
- && FP_REG_P (operands[0])"
+ "reload_completed && FLOAT_MODE_P (GET_MODE (operands[0]))"
[(const_int 0)]
{
operands[2] = ix86_force_to_memory (GET_MODE (operands[1]), operands[1]);
@@ -4703,7 +4971,7 @@
(plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "roiF,riF")))
(clobber (reg:CC 17))]
- "!TARGET_64BIT"
+ "!TARGET_64BIT && ix86_binary_operator_ok (PLUS, DImode, operands)"
"#")
(define_split
@@ -4845,7 +5113,7 @@
(define_insn_and_split "*lea_general_1"
[(set (match_operand 0 "register_operand" "=r")
- (plus (plus (match_operand 1 "register_operand" "r")
+ (plus (plus (match_operand 1 "index_register_operand" "r")
(match_operand 2 "register_operand" "r"))
(match_operand 3 "immediate_operand" "i")))]
"(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
@@ -4877,7 +5145,7 @@
(define_insn_and_split "*lea_general_1_zext"
[(set (match_operand:DI 0 "register_operand" "=r")
(zero_extend:DI
- (plus:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
+ (plus:SI (plus:SI (match_operand:SI 1 "index_register_operand" "r")
(match_operand:SI 2 "register_operand" "r"))
(match_operand:SI 3 "immediate_operand" "i"))))]
"TARGET_64BIT"
@@ -4897,7 +5165,7 @@
(define_insn_and_split "*lea_general_2"
[(set (match_operand 0 "register_operand" "=r")
- (plus (mult (match_operand 1 "register_operand" "r")
+ (plus (mult (match_operand 1 "index_register_operand" "r")
(match_operand 2 "const248_operand" "i"))
(match_operand 3 "nonmemory_operand" "ri")))]
"(GET_MODE (operands[0]) == QImode || GET_MODE (operands[0]) == HImode
@@ -4927,7 +5195,7 @@
(define_insn_and_split "*lea_general_2_zext"
[(set (match_operand:DI 0 "register_operand" "=r")
(zero_extend:DI
- (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
+ (plus:SI (mult:SI (match_operand:SI 1 "index_register_operand" "r")
(match_operand:SI 2 "const248_operand" "n"))
(match_operand:SI 3 "nonmemory_operand" "ri"))))]
"TARGET_64BIT"
@@ -4946,7 +5214,7 @@
(define_insn_and_split "*lea_general_3"
[(set (match_operand 0 "register_operand" "=r")
- (plus (plus (mult (match_operand 1 "register_operand" "r")
+ (plus (plus (mult (match_operand 1 "index_register_operand" "r")
(match_operand 2 "const248_operand" "i"))
(match_operand 3 "register_operand" "r"))
(match_operand 4 "immediate_operand" "i")))]
@@ -4980,7 +5248,7 @@
(define_insn_and_split "*lea_general_3_zext"
[(set (match_operand:DI 0 "register_operand" "=r")
(zero_extend:DI
- (plus:SI (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
+ (plus:SI (plus:SI (mult:SI (match_operand:SI 1 "index_register_operand" "r")
(match_operand:SI 2 "const248_operand" "n"))
(match_operand:SI 3 "register_operand" "r"))
(match_operand:SI 4 "immediate_operand" "i"))))]
@@ -7250,7 +7518,7 @@
(use (match_dup 3))
(clobber (reg:CC 17))])]
{
- /* Avoid use of cltd in favour of a mov+shift. */
+ /* Avoid use of cltd in favor of a mov+shift. */
if (!TARGET_USE_CLTD && !optimize_size)
{
if (true_regnum (operands[1]))
@@ -7335,7 +7603,7 @@
(use (match_dup 3))
(clobber (reg:CC 17))])]
{
- /* Avoid use of cltd in favour of a mov+shift. */
+ /* Avoid use of cltd in favor of a mov+shift. */
if (!TARGET_USE_CLTD && !optimize_size)
{
if (true_regnum (operands[1]))
@@ -9348,19 +9616,19 @@
"#")
(define_split
- [(set (match_operand:SF 0 "register_operand" "")
+ [(set (match_operand:SF 0 "fp_register_operand" "")
(neg:SF (match_operand:SF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(neg:SF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:SF 0 "register_operand" "")
+ [(set (match_operand:SF 0 "register_and_not_fp_reg_operand" "")
(neg:SF (match_operand:SF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 0) (xor:SI (match_dup 0) (match_dup 1)))
(clobber (reg:CC 17))])]
"operands[1] = gen_int_mode (0x80000000, SImode);
@@ -9490,6 +9758,14 @@
(xor:TI (subreg:TI (match_dup 1) 0)
(subreg:TI (match_dup 2) 0)))]
{
+ /* Avoid possible reformating on the operands. */
+ if (TARGET_SSE_PARTIAL_REGS && !optimize_size)
+ {
+ rtx op = gen_rtx_SUBREG (V2DFmode, operands[1], 0);
+ emit_insn (gen_sse2_unpcklpd (op, op, op));
+ op = gen_rtx_SUBREG (V2DFmode, operands[2], 0);
+ emit_insn (gen_sse2_unpcklpd (op, op, op));
+ }
if (operands_match_p (operands[0], operands[2]))
{
rtx tmp;
@@ -9523,20 +9799,19 @@
"#")
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "fp_register_operand" "")
(neg:DF (match_operand:DF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(neg:DF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "register_and_not_fp_reg_operand" "")
(neg:DF (match_operand:DF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "!TARGET_64BIT && TARGET_80387 && reload_completed
- && !FP_REGNO_P (REGNO (operands[0]))"
+ "!TARGET_64BIT && TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 3) (xor:SI (match_dup 3) (match_dup 4)))
(clobber (reg:CC 17))])]
"operands[4] = gen_int_mode (0x80000000, SImode);
@@ -9568,19 +9843,19 @@
"#")
(define_split
- [(set (match_operand:XF 0 "register_operand" "")
+ [(set (match_operand:XF 0 "fp_register_operand" "")
(neg:XF (match_operand:XF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(neg:XF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:XF 0 "register_operand" "")
+ [(set (match_operand:XF 0 "register_and_not_fp_reg_operand" "")
(neg:XF (match_operand:XF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 0) (xor:SI (match_dup 0) (match_dup 1)))
(clobber (reg:CC 17))])]
"operands[1] = GEN_INT (0x8000);
@@ -9598,19 +9873,19 @@
"#")
(define_split
- [(set (match_operand:TF 0 "register_operand" "")
+ [(set (match_operand:TF 0 "fp_register_operand" "")
(neg:TF (match_operand:TF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(neg:TF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:TF 0 "register_operand" "")
+ [(set (match_operand:TF 0 "register_and_not_fp_reg_operand" "")
(neg:TF (match_operand:TF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 0) (xor:SI (match_dup 0) (match_dup 1)))
(clobber (reg:CC 17))])]
"operands[1] = GEN_INT (0x8000);
@@ -9723,14 +9998,17 @@
{
/* Using SSE is tricky, since we need bitwise negation of -0
in register. */
- rtx reg = gen_reg_rtx (SFmode);
+ rtx reg = gen_reg_rtx (V4SFmode);
rtx dest = operands[0];
+ rtx imm;
operands[1] = force_reg (SFmode, operands[1]);
operands[0] = force_reg (SFmode, operands[0]);
+ imm = gen_lowpart (SFmode, gen_int_mode(~0x80000000, SImode));
emit_move_insn (reg,
- gen_lowpart (SFmode,
- gen_int_mode (0x80000000, SImode)));
+ gen_rtx_CONST_VECTOR (V4SFmode,
+ gen_rtvec (4, imm, CONST0_RTX (SFmode),
+ CONST0_RTX (SFmode), CONST0_RTX (SFmode))));
emit_insn (gen_abssf2_ifs (operands[0], operands[1], reg));
if (dest != operands[0])
emit_move_insn (dest, operands[0]);
@@ -9747,9 +10025,9 @@
"#")
(define_insn "abssf2_ifs"
- [(set (match_operand:SF 0 "nonimmediate_operand" "=x#fr,f#xr,rm#xf")
- (abs:SF (match_operand:SF 1 "nonimmediate_operand" "x,0,0")))
- (use (match_operand:SF 2 "nonmemory_operand" "*0#x,*g#x,*g#x"))
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=x#fr,x#fr,f#xr,rm#xf")
+ (abs:SF (match_operand:SF 1 "nonimmediate_operand" "0,x,0,0")))
+ (use (match_operand:V4SF 2 "nonimmediate_operand" "xm,0,x*rm,x*rm"))
(clobber (reg:CC 17))]
"TARGET_SSE
&& (reload_in_progress || reload_completed
@@ -9760,7 +10038,7 @@
(define_split
[(set (match_operand:SF 0 "memory_operand" "")
(abs:SF (match_operand:SF 1 "memory_operand" "")))
- (use (match_operand:SF 2 "" ""))
+ (use (match_operand:V4SF 2 "" ""))
(clobber (reg:CC 17))]
""
[(parallel [(set (match_dup 0)
@@ -9770,7 +10048,7 @@
(define_split
[(set (match_operand:SF 0 "register_operand" "")
(abs:SF (match_operand:SF 1 "register_operand" "")))
- (use (match_operand:SF 2 "" ""))
+ (use (match_operand:V4SF 2 "" ""))
(clobber (reg:CC 17))]
"reload_completed && !SSE_REG_P (operands[0])"
[(parallel [(set (match_dup 0)
@@ -9779,13 +10057,32 @@
(define_split
[(set (match_operand:SF 0 "register_operand" "")
+ (abs:SF (match_dup 0)))
+ (use (match_operand:V4SF 1 "nonmemory_operand" ""))
+ (clobber (reg:CC 17))]
+ "reload_completed && SSE_REG_P (operands[0])"
+ [(set (subreg:TI (match_dup 0) 0)
+ (and:TI (subreg:TI (match_dup 0) 0)
+ (subreg:TI (match_dup 1) 0)))]
+{
+ operands[0] = gen_rtx_SUBREG (V4SFmode, operands[0], 0);
+})
+
+(define_split
+ [(set (match_operand:SF 0 "register_operand" "")
(abs:SF (match_operand:SF 1 "register_operand" "")))
- (use (match_operand:SF 2 "register_operand" ""))
+ (use (match_operand:V4SF 2 "register_operand" ""))
(clobber (reg:CC 17))]
"reload_completed && SSE_REG_P (operands[0])"
[(set (subreg:TI (match_dup 0) 0)
- (and:TI (not:TI (subreg:TI (match_dup 2) 0))
- (subreg:TI (match_dup 1) 0)))])
+ (and:TI (subreg:TI (match_dup 0) 0)
+ (subreg:TI (match_dup 1) 0)))]
+{
+ /* Operand2 should match operand0, as the opposite case is handled above. */
+ if (REGNO (operands[2]) != REGNO (operands[0]))
+ abort ();
+ operands[0] = gen_rtx_SUBREG (V4SFmode, operands[0], 0);
+})
;; Keep 'f' and 'r' in separate alternatives to avoid reload problems
;; because of secondary memory needed to reload from class FLOAT_INT_REGS
@@ -9798,19 +10095,19 @@
"#")
(define_split
- [(set (match_operand:SF 0 "register_operand" "")
+ [(set (match_operand:SF 0 "fp_register_operand" "")
(abs:SF (match_operand:SF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387"
[(set (match_dup 0)
(abs:SF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:SF 0 "register_operand" "")
+ [(set (match_operand:SF 0 "register_and_not_fp_reg_operand" "")
(abs:SF (match_operand:SF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 0) (and:SI (match_dup 0) (match_dup 1)))
(clobber (reg:CC 17))])]
"operands[1] = gen_int_mode (~0x80000000, SImode);
@@ -9848,17 +10145,22 @@
{
/* Using SSE is tricky, since we need bitwise negation of -0
in register. */
- rtx reg = gen_reg_rtx (DFmode);
+ rtx reg = gen_reg_rtx (V2DFmode);
#if HOST_BITS_PER_WIDE_INT >= 64
- rtx imm = gen_int_mode (((HOST_WIDE_INT)1) << 63, DImode);
+ rtx imm = gen_int_mode (~(((HOST_WIDE_INT)1) << 63), DImode);
#else
- rtx imm = immed_double_const (0, 0x80000000, DImode);
+ rtx imm = immed_double_const (~0, ~0x80000000, DImode);
#endif
rtx dest = operands[0];
operands[1] = force_reg (DFmode, operands[1]);
operands[0] = force_reg (DFmode, operands[0]);
- emit_move_insn (reg, gen_lowpart (DFmode, imm));
+
+ /* Produce LONG_DOUBLE with the proper immediate argument. */
+ imm = gen_lowpart (DFmode, imm);
+ emit_move_insn (reg,
+ gen_rtx_CONST_VECTOR (V2DFmode,
+ gen_rtvec (2, imm, CONST0_RTX (DFmode))));
emit_insn (gen_absdf2_ifs (operands[0], operands[1], reg));
if (dest != operands[0])
emit_move_insn (dest, operands[0]);
@@ -9875,9 +10177,9 @@
"#")
(define_insn "absdf2_ifs"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=Y#fr,mf#Yr,mr#Yf")
- (abs:DF (match_operand:DF 1 "nonimmediate_operand" "Y,0,0")))
- (use (match_operand:DF 2 "nonmemory_operand" "*0#Y,*g#Y,*g#Y"))
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=Y#fr,Y#fr,mf#Yr,mr#Yf")
+ (abs:DF (match_operand:DF 1 "nonimmediate_operand" "0,Y,0,0")))
+ (use (match_operand:V2DF 2 "nonimmediate_operand" "Ym,0,Y*rm,Y*rm"))
(clobber (reg:CC 17))]
"!TARGET_64BIT && TARGET_SSE2
&& (reload_in_progress || reload_completed
@@ -9886,9 +10188,9 @@
"#")
(define_insn "*absdf2_ifs_rex64"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=Y#fr,mf#Yr")
- (abs:DF (match_operand:DF 1 "nonimmediate_operand" "Y,0")))
- (use (match_operand:DF 2 "nonmemory_operand" "*0#Y,*g#Y"))
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=Y#fr,Y#fr,mf#Yr")
+ (abs:DF (match_operand:DF 1 "nonimmediate_operand" "0,Y,0")))
+ (use (match_operand:V2DF 2 "nonimmediate_operand" "Ym,*0,*Y*rm"))
(clobber (reg:CC 17))]
"TARGET_64BIT && TARGET_SSE2
&& (reload_in_progress || reload_completed
@@ -9899,7 +10201,7 @@
(define_split
[(set (match_operand:DF 0 "memory_operand" "")
(abs:DF (match_operand:DF 1 "memory_operand" "")))
- (use (match_operand:DF 2 "" ""))
+ (use (match_operand:V2DF 2 "" ""))
(clobber (reg:CC 17))]
""
[(parallel [(set (match_dup 0)
@@ -9909,7 +10211,7 @@
(define_split
[(set (match_operand:DF 0 "register_operand" "")
(abs:DF (match_operand:DF 1 "register_operand" "")))
- (use (match_operand:DF 2 "" ""))
+ (use (match_operand:V2DF 2 "" ""))
(clobber (reg:CC 17))]
"reload_completed && !SSE_REG_P (operands[0])"
[(parallel [(set (match_dup 0)
@@ -9918,13 +10220,38 @@
(define_split
[(set (match_operand:DF 0 "register_operand" "")
+ (abs:DF (match_dup:DF 0)))
+ (use (match_operand:V2DF 1 "nonimmediate_operand" ""))
+ (clobber (reg:CC 17))]
+ "reload_completed && SSE_REG_P (operands[0])"
+ [(set (subreg:TI (match_dup 0) 0)
+ (and:TI (subreg:TI (match_dup 0) 0)
+ (subreg:TI (match_dup 1) 0)))]
+{
+ operands[0] = gen_rtx_SUBREG (V2DFmode, operands[0], 0);
+ /* Avoid possible reformating on the operands. */
+ if (TARGET_SSE_PARTIAL_REGS && !optimize_size)
+ emit_insn (gen_sse2_unpcklpd (operands[0], operands[0], operands[0]));
+})
+
+(define_split
+ [(set (match_operand:DF 0 "register_operand" "")
(abs:DF (match_operand:DF 1 "register_operand" "")))
- (use (match_operand:DF 2 "register_operand" ""))
+ (use (match_operand:V2DF 2 "register_operand" ""))
(clobber (reg:CC 17))]
"reload_completed && SSE_REG_P (operands[0])"
[(set (subreg:TI (match_dup 0) 0)
- (and:TI (not:TI (subreg:TI (match_dup 2) 0))
- (subreg:TI (match_dup 1) 0)))])
+ (and:TI (subreg:TI (match_dup 0) 0)
+ (subreg:TI (match_dup 1) 0)))]
+{
+ operands[0] = gen_rtx_SUBREG (V2DFmode, operands[0], 0);
+ /* Operand2 should match operand0, as the opposite case is handled above. */
+ if (REGNO (operands[2]) != REGNO (operands[0]))
+ abort ();
+ /* Avoid possible reformating on the operands. */
+ if (TARGET_SSE_PARTIAL_REGS && !optimize_size)
+ emit_insn (gen_sse2_unpcklpd (operands[0], operands[0], operands[0]));
+})
;; Keep 'f' and 'r' in separate alternatives to avoid reload problems
@@ -9951,20 +10278,19 @@
"#")
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "fp_register_operand" "")
(abs:DF (match_operand:DF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(abs:DF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "register_and_not_fp_reg_operand" "")
(abs:DF (match_operand:DF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "!TARGET_64BIT && TARGET_80387 && reload_completed &&
- !FP_REGNO_P (REGNO (operands[0]))"
+ "!TARGET_64BIT && TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 3) (and:SI (match_dup 3) (match_dup 4)))
(clobber (reg:CC 17))])]
"operands[4] = gen_int_mode (~0x80000000, SImode);
@@ -9996,19 +10322,19 @@
"#")
(define_split
- [(set (match_operand:XF 0 "register_operand" "")
+ [(set (match_operand:XF 0 "fp_register_operand" "")
(abs:XF (match_operand:XF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(abs:XF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:XF 0 "register_operand" "")
+ [(set (match_operand:XF 0 "register_and_not_fp_reg_operand" "")
(abs:XF (match_operand:XF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 0) (and:SI (match_dup 0) (match_dup 1)))
(clobber (reg:CC 17))])]
"operands[1] = GEN_INT (~0x8000);
@@ -10023,19 +10349,19 @@
"#")
(define_split
- [(set (match_operand:TF 0 "register_operand" "")
+ [(set (match_operand:TF 0 "fp_register_operand" "")
(abs:TF (match_operand:TF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && FP_REGNO_P (REGNO (operands[0])) && reload_completed"
+ "TARGET_80387 && reload_completed"
[(set (match_dup 0)
(abs:TF (match_dup 1)))]
"")
(define_split
- [(set (match_operand:TF 0 "register_operand" "")
+ [(set (match_operand:TF 0 "register_and_not_any_fp_reg_operand" "")
(abs:TF (match_operand:TF 1 "register_operand" "")))
(clobber (reg:CC 17))]
- "TARGET_80387 && reload_completed && !FP_REGNO_P (REGNO (operands[0]))"
+ "TARGET_80387 && reload_completed"
[(parallel [(set (match_dup 0) (and:SI (match_dup 0) (match_dup 1)))
(clobber (reg:CC 17))])]
"operands[1] = GEN_INT (~0x8000);
@@ -10615,7 +10941,7 @@
;; Convert lea to the lea pattern to avoid flags dependency.
(define_split
[(set (match_operand 0 "register_operand" "")
- (ashift (match_operand 1 "register_operand" "")
+ (ashift (match_operand 1 "index_register_operand" "")
(match_operand:QI 2 "const_int_operand" "")))
(clobber (reg:CC 17))]
"reload_completed
@@ -10633,6 +10959,26 @@
DONE;
})
+;; Rare case of shifting RSP is handled by generating move and shift
+(define_split
+ [(set (match_operand 0 "register_operand" "")
+ (ashift (match_operand 1 "register_operand" "")
+ (match_operand:QI 2 "const_int_operand" "")))
+ (clobber (reg:CC 17))]
+ "reload_completed
+ && true_regnum (operands[0]) != true_regnum (operands[1])"
+ [(const_int 0)]
+{
+ rtx pat, clob;
+ emit_move_insn (operands[1], operands[0]);
+ pat = gen_rtx_SET (VOIDmode, operands[0],
+ gen_rtx_ASHIFT (GET_MODE (operands[0]),
+ operands[0], operands[2]));
+ clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
+ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, pat, clob)));
+ DONE;
+})
+
(define_insn "*ashlsi3_1_zext"
[(set (match_operand:DI 0 "register_operand" "=r,r")
(zero_extend:DI (ashift:SI (match_operand:SI 1 "register_operand" "0,r")
@@ -13409,19 +13755,22 @@
(define_insn "*call_1"
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "rsm"))
(match_operand 1 "" ""))]
- "!TARGET_64BIT"
+ "!SIBLING_CALL_P (insn) && !TARGET_64BIT"
{
if (constant_call_address_operand (operands[0], QImode))
- {
- if (SIBLING_CALL_P (insn))
- return "jmp\t%P0";
- else
- return "call\t%P0";
- }
- if (SIBLING_CALL_P (insn))
- return "jmp\t%A0";
- else
- return "call\t%A0";
+ return "call\t%P0";
+ return "call\t%A0";
+}
+ [(set_attr "type" "call")])
+
+(define_insn "*sibcall_1"
+ [(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "s,c,d,a"))
+ (match_operand 1 "" ""))]
+ "SIBLING_CALL_P (insn) && !TARGET_64BIT"
+{
+ if (constant_call_address_operand (operands[0], QImode))
+ return "jmp\t%P0";
+ return "jmp\t%A0";
}
[(set_attr "type" "call")])
@@ -13804,9 +14153,13 @@
(clobber (reg:CC 17))])]
""
{
- if (!flag_pic)
- abort ();
- operands[2] = pic_offset_table_rtx;
+ if (flag_pic)
+ operands[2] = pic_offset_table_rtx;
+ else
+ {
+ operands[2] = gen_reg_rtx (Pmode);
+ emit_insn (gen_set_got (operands[2]));
+ }
operands[3] = ix86_tls_get_addr ();
})
@@ -13846,9 +14199,13 @@
(clobber (reg:CC 17))])]
""
{
- if (!flag_pic)
- abort ();
- operands[1] = pic_offset_table_rtx;
+ if (flag_pic)
+ operands[1] = pic_offset_table_rtx;
+ else
+ {
+ operands[1] = gen_reg_rtx (Pmode);
+ emit_insn (gen_set_got (operands[1]));
+ }
operands[2] = ix86_tls_get_addr ();
})
@@ -15963,12 +16320,12 @@
(set_attr "mode" "DF")])
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "register_and_not_any_fp_reg_operand" "")
(if_then_else:DF (match_operator 1 "fcmov_comparison_operator"
[(match_operand 4 "" "") (const_int 0)])
(match_operand:DF 2 "nonimmediate_operand" "")
(match_operand:DF 3 "nonimmediate_operand" "")))]
- "!TARGET_64BIT && !ANY_FP_REG_P (operands[0]) && reload_completed"
+ "!TARGET_64BIT && reload_completed"
[(set (match_dup 2)
(if_then_else:SI (match_op_dup 1 [(match_dup 4) (const_int 0)])
(match_dup 5)
@@ -16076,13 +16433,13 @@
;; We can't represent the LT test directly. Do this by swapping the operands.
(define_split
- [(set (match_operand:SF 0 "register_operand" "")
+ [(set (match_operand:SF 0 "fp_register_operand" "")
(if_then_else:SF (lt (match_operand:SF 1 "register_operand" "")
(match_operand:SF 2 "register_operand" ""))
(match_operand:SF 3 "register_operand" "")
(match_operand:SF 4 "register_operand" "")))
(clobber (reg:CC 17))]
- "FP_REG_P (operands[0]) && reload_completed
+ "reload_completed
&& ((operands_match_p (operands[1], operands[3])
&& operands_match_p (operands[2], operands[4]))
|| (operands_match_p (operands[1], operands[4])
@@ -16158,13 +16515,13 @@
;; We can't represent the LT test directly. Do this by swapping the operands.
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "fp_register_operand" "")
(if_then_else:DF (lt (match_operand:DF 1 "register_operand" "")
(match_operand:DF 2 "register_operand" ""))
(match_operand:DF 3 "register_operand" "")
(match_operand:DF 4 "register_operand" "")))
(clobber (reg:CC 17))]
- "FP_REG_P (operands[0]) && reload_completed
+ "reload_completed
&& ((operands_match_p (operands[1], operands[3])
&& operands_match_p (operands[2], operands[4]))
|| (operands_match_p (operands[1], operands[4])
@@ -16239,13 +16596,13 @@
(match_dup 2)))])
(define_split
- [(set (match_operand:SF 0 "register_operand" "")
+ [(set (match_operand:SF 0 "fp_register_operand" "")
(if_then_else:SF (gt (match_operand:SF 1 "register_operand" "")
(match_operand:SF 2 "register_operand" ""))
(match_operand:SF 3 "register_operand" "")
(match_operand:SF 4 "register_operand" "")))
(clobber (reg:CC 17))]
- "FP_REG_P (operands[0]) && reload_completed
+ "reload_completed
&& ((operands_match_p (operands[1], operands[3])
&& operands_match_p (operands[2], operands[4]))
|| (operands_match_p (operands[1], operands[4])
@@ -16320,13 +16677,13 @@
(match_dup 2)))])
(define_split
- [(set (match_operand:DF 0 "register_operand" "")
+ [(set (match_operand:DF 0 "fp_register_operand" "")
(if_then_else:DF (gt (match_operand:DF 1 "register_operand" "")
(match_operand:DF 2 "register_operand" ""))
(match_operand:DF 3 "register_operand" "")
(match_operand:DF 4 "register_operand" "")))
(clobber (reg:CC 17))]
- "FP_REG_P (operands[0]) && reload_completed
+ "reload_completed
&& ((operands_match_p (operands[1], operands[3])
&& operands_match_p (operands[2], operands[4]))
|| (operands_match_p (operands[1], operands[4])
@@ -16548,7 +16905,7 @@
;; cmpCC op0, op4 - set op0 to 0 or ffffffff depending on the comparison
;; and op2, op0 - zero op2 if comparison was false
;; nand op0, op3 - load op3 to op0 if comparison was false
-;; or op2, op0 - get the non-zero one into the result.
+;; or op2, op0 - get the nonzero one into the result.
(define_split
[(set (match_operand 0 "register_operand" "")
(if_then_else (match_operator 1 "sse_comparison_operator"
@@ -16567,6 +16924,14 @@
(set (subreg:TI (match_dup 0) 0) (ior:TI (subreg:TI (match_dup 6) 0)
(subreg:TI (match_dup 7) 0)))]
{
+ if (GET_MODE (operands[2]) == DFmode
+ && TARGET_SSE_PARTIAL_REGS && !optimize_size)
+ {
+ rtx op = gen_rtx_SUBREG (V2DFmode, operands[2], 0);
+ emit_insn (gen_sse2_unpcklpd (op, op, op));
+ op = gen_rtx_SUBREG (V2DFmode, operands[3], 0);
+ emit_insn (gen_sse2_unpcklpd (op, op, op));
+ }
/* If op2 == op3, op3 will be clobbered before it is used.
This should be optimized out though. */
if (operands_match_p (operands[2], operands[3]))
@@ -16675,6 +17040,20 @@
(set (subreg:TI (match_dup 0) 0) (and:TI (match_dup 6)
(subreg:TI (match_dup 7) 0)))]
{
+ if (TARGET_SSE_PARTIAL_REGS && !optimize_size
+ && GET_MODE (operands[2]) == DFmode)
+ {
+ if (REG_P (operands[2]))
+ {
+ rtx op = gen_rtx_SUBREG (V2DFmode, operands[2], 0);
+ emit_insn (gen_sse2_unpcklpd (op, op, op));
+ }
+ if (REG_P (operands[3]))
+ {
+ rtx op = gen_rtx_SUBREG (V2DFmode, operands[3], 0);
+ emit_insn (gen_sse2_unpcklpd (op, op, op));
+ }
+ }
PUT_MODE (operands[1], GET_MODE (operands[0]));
if (!sse_comparison_operator (operands[1], VOIDmode))
{
@@ -17300,7 +17679,7 @@
[(set (match_operand:SI 0 "register_operand" "")
(subreg:SI (mult:DI (match_operand:DI 1 "register_operand" "")
(match_operand:DI 2 "const_int_operand" "")) 0))]
- "exact_log2 (INTVAL (operands[1])) >= 0
+ "exact_log2 (INTVAL (operands[2])) >= 0
&& REGNO (operands[0]) == REGNO (operands[1])
&& peep2_regno_dead_p (0, FLAGS_REG)"
[(parallel [(set (match_dup 0) (ashift:SI (match_dup 0) (match_dup 2)))
@@ -17689,19 +18068,23 @@
[(set (match_operand 0 "" "")
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "rsm"))
(match_operand:SI 2 "" "")))]
- "!TARGET_64BIT"
+ "!SIBLING_CALL_P (insn) && !TARGET_64BIT"
{
if (constant_call_address_operand (operands[1], QImode))
- {
- if (SIBLING_CALL_P (insn))
- return "jmp\t%P1";
- else
- return "call\t%P1";
- }
- if (SIBLING_CALL_P (insn))
- return "jmp\t%*%1";
- else
- return "call\t%*%1";
+ return "call\t%P1";
+ return "call\t%*%1";
+}
+ [(set_attr "type" "callv")])
+
+(define_insn "*sibcall_value_1"
+ [(set (match_operand 0 "" "")
+ (call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "s,c,d,a"))
+ (match_operand:SI 2 "" "")))]
+ "SIBLING_CALL_P (insn) && !TARGET_64BIT"
+{
+ if (constant_call_address_operand (operands[1], QImode))
+ return "jmp\t%P1";
+ return "jmp\t%*%1";
}
[(set_attr "type" "callv")])
@@ -17768,7 +18151,7 @@
{
operands[2] = gen_label_rtx ();
output_asm_insn ("j%c0\t%l2\; int\t%1", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (operands[2]));
RET;
})
@@ -17781,7 +18164,6 @@
[(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,m")
(match_operand:V4SF 1 "nonimmediate_operand" "xm,x"))]
"TARGET_SSE"
- ;; @@@ let's try to use movaps here.
"movaps\t{%1, %0|%0, %1}"
[(set_attr "type" "ssemov")
(set_attr "mode" "V4SF")])
@@ -17790,8 +18172,36 @@
[(set (match_operand:V4SI 0 "nonimmediate_operand" "=x,m")
(match_operand:V4SI 1 "nonimmediate_operand" "xm,x"))]
"TARGET_SSE"
+{
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "movaps\t{%1, %0|%0, %1}";
+ else
+ return "movdqa\t{%1, %0|%0, %1}";
+}
+ [(set_attr "type" "ssemov")
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "0")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI"))
+ (eq_attr "alternative" "1")
+ (if_then_else
+ (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
+ (const_int 0))
+ (ne (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "V4SF")
+ (const_string "TI"))]
+ (const_string "TI")))])
+
+(define_insn "movv2di_internal"
+ [(set (match_operand:V2DI 0 "nonimmediate_operand" "=x,m")
+ (match_operand:V2DI 1 "nonimmediate_operand" "xm,x"))]
+ "TARGET_SSE"
;; @@@ let's try to use movaps here.
- "movaps\t{%1, %0|%0, %1}"
+ "movdqa\t{%1, %0|%0, %1}"
[(set_attr "type" "ssemov")
(set_attr "mode" "V4SF")])
@@ -17841,30 +18251,87 @@
(define_insn "movv2df_internal"
[(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,m")
- (match_operand:V2DF 1 "general_operand" "xm,x"))]
+ (match_operand:V2DF 1 "nonimmediate_operand" "xm,x"))]
"TARGET_SSE2"
- ;; @@@ let's try to use movaps here.
- "movapd\t{%1, %0|%0, %1}"
+{
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "movaps\t{%1, %0|%0, %1}";
+ else
+ return "movapd\t{%1, %0|%0, %1}";
+}
[(set_attr "type" "ssemov")
- (set_attr "mode" "V2DF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "0")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "V2DF"))
+ (eq_attr "alternative" "1")
+ (if_then_else
+ (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
+ (const_int 0))
+ (ne (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "V4SF")
+ (const_string "V2DF"))]
+ (const_string "V2DF")))])
(define_insn "movv8hi_internal"
[(set (match_operand:V8HI 0 "nonimmediate_operand" "=x,m")
- (match_operand:V8HI 1 "general_operand" "xm,x"))]
+ (match_operand:V8HI 1 "nonimmediate_operand" "xm,x"))]
"TARGET_SSE2"
- ;; @@@ let's try to use movaps here.
- "movaps\t{%1, %0|%0, %1}"
+{
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "movaps\t{%1, %0|%0, %1}";
+ else
+ return "movdqa\t{%1, %0|%0, %1}";
+}
[(set_attr "type" "ssemov")
- (set_attr "mode" "V4SF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "0")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI"))
+ (eq_attr "alternative" "1")
+ (if_then_else
+ (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
+ (const_int 0))
+ (ne (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "V4SF")
+ (const_string "TI"))]
+ (const_string "TI")))])
(define_insn "movv16qi_internal"
[(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
- (match_operand:V16QI 1 "general_operand" "xm,x"))]
+ (match_operand:V16QI 1 "nonimmediate_operand" "xm,x"))]
"TARGET_SSE2"
- ;; @@@ let's try to use movaps here.
- "movaps\t{%1, %0|%0, %1}"
+{
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "movaps\t{%1, %0|%0, %1}";
+ else
+ return "movdqa\t{%1, %0|%0, %1}";
+}
[(set_attr "type" "ssemov")
- (set_attr "mode" "V4SF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "0")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI"))
+ (eq_attr "alternative" "1")
+ (if_then_else
+ (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
+ (const_int 0))
+ (ne (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "V4SF")
+ (const_string "TI"))]
+ (const_string "TI")))])
(define_expand "movv2df"
[(set (match_operand:V2DF 0 "general_operand" "")
@@ -17905,12 +18372,21 @@
(define_expand "movv4si"
[(set (match_operand:V4SI 0 "general_operand" "")
(match_operand:V4SI 1 "general_operand" ""))]
- "TARGET_MMX"
+ "TARGET_SSE"
{
ix86_expand_vector_move (V4SImode, operands);
DONE;
})
+(define_expand "movv2di"
+ [(set (match_operand:V2DI 0 "general_operand" "")
+ (match_operand:V2DI 1 "general_operand" ""))]
+ "TARGET_SSE"
+{
+ ix86_expand_vector_move (V2DImode, operands);
+ DONE;
+})
+
(define_expand "movv2si"
[(set (match_operand:V2SI 0 "general_operand" "")
(match_operand:V2SI 1 "general_operand" ""))]
@@ -18061,26 +18537,83 @@
[(set (match_operand:TI 0 "nonimmediate_operand" "=x,x,m")
(match_operand:TI 1 "general_operand" "O,xm,x"))]
"TARGET_SSE && !TARGET_64BIT"
- "@
- xorps\t%0, %0
- movaps\t{%1, %0|%0, %1}
- movaps\t{%1, %0|%0, %1}"
+{
+ switch (which_alternative)
+ {
+ case 0:
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "xorps\t%0, %0";
+ else
+ return "pxor\t%0, %0";
+ case 1:
+ case 2:
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "movaps\t{%1, %0|%0, %1}";
+ else
+ return "movdqa\t{%1, %0|%0, %1}";
+ default:
+ abort ();
+ }
+}
[(set_attr "type" "ssemov,ssemov,ssemov")
- (set_attr "mode" "V4SF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "0,1")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI"))
+ (eq_attr "alternative" "2")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI"))]
+ (const_string "TI")))])
(define_insn "*movti_rex64"
- [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o,x,mx,x")
- (match_operand:TI 1 "general_operand" "riFo,riF,O,x,m"))]
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o,x,x,xm")
+ (match_operand:TI 1 "general_operand" "riFo,riF,O,xm,x"))]
"TARGET_64BIT
&& (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
- "@
- #
- #
- xorps\t%0, %0
- movaps\\t{%1, %0|%0, %1}
- movaps\\t{%1, %0|%0, %1}"
+{
+ switch (which_alternative)
+ {
+ case 0:
+ case 1:
+ return "#";
+ case 2:
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "xorps\t%0, %0";
+ else
+ return "pxor\t%0, %0";
+ case 3:
+ case 4:
+ if (get_attr_mode (insn) == MODE_V4SF)
+ return "movaps\t{%1, %0|%0, %1}";
+ else
+ return "movdqa\t{%1, %0|%0, %1}";
+ default:
+ abort ();
+ }
+}
[(set_attr "type" "*,*,ssemov,ssemov,ssemov")
- (set_attr "mode" "V4SF")])
+ (set (attr "mode")
+ (cond [(eq_attr "alternative" "2,3")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI"))
+ (eq_attr "alternative" "4")
+ (if_then_else
+ (ior (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
+ (const_int 0))
+ (ne (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "V4SF")
+ (const_string "TI"))]
+ (const_string "DI")))])
(define_split
[(set (match_operand:TI 0 "nonimmediate_operand" "")
@@ -18427,236 +18960,313 @@
;; SSE logical operations.
+;; SSE defines logical operations on floating point values. This brings
+;; interesting challenge to RTL representation where logicals are only valid
+;; on integral types. We deal with this by representing the floating point
+;; logical as logical on arguments casted to TImode as this is what hardware
+;; really does. Unfortunately hardware requires the type information to be
+;; present and thus we must avoid subregs from being simplified and elliminated
+;; in later compilation phases.
+;;
+;; We have following variants from each instruction:
+;; sse_andsf3 - the operation taking V4SF vector operands
+;; and doing TImode cast on them
+;; *sse_andsf3_memory - the operation taking one memory operand casted to
+;; TImode, since backend insist on elliminating casts
+;; on memory operands
+;; sse_andti3_sf_1 - the operation taking SF scalar operands.
+;; We can not accept memory operand here as instruction reads
+;; whole scalar. This is generated only post reload by GCC
+;; scalar float operations that expands to logicals (fabs)
+;; sse_andti3_sf_2 - the operation taking SF scalar input and TImode
+;; memory operand. Eventually combine can be able
+;; to synthetize these using splitter.
+;; sse2_anddf3, *sse2_anddf3_memory
+;;
+;;
;; These are not called andti3 etc. because we really really don't want
;; the compiler to widen DImode ands to TImode ands and then try to move
;; into DImode subregs of SSE registers, and them together, and move out
;; of DImode subregs again!
+;; SSE1 single precision floating point logical operation
+(define_expand "sse_andv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
+ (and:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0)
+ (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
+ "TARGET_SSE"
+ "")
-(define_insn "*sse_andti3_df_1"
- [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (and:TI (subreg:TI (match_operand:DF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:DF 2 "register_operand" "Y") 0)))]
- "TARGET_SSE2"
- "andpd\t{%2, %0|%0, %2}"
+(define_insn "*sse_andv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
+ (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "andps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
+ (set_attr "mode" "V4SF")])
-(define_insn "*sse_andti3_df_2"
- [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (and:TI (subreg:TI (match_operand:DF 1 "register_operand" "0") 0)
- (match_operand:TI 2 "nonimmediate_operand" "Ym")))]
- "TARGET_SSE2"
- "andpd\t{%2, %0|%0, %2}"
+(define_insn "*sse_andsf3"
+ [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
+ (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "andps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
+ (set_attr "mode" "V4SF")])
-(define_insn "*sse_andti3_sf_1"
- [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (and:TI (subreg:TI (match_operand:SF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:SF 2 "register_operand" "x") 0)))]
+(define_expand "sse_nandv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
+ (and:TI (not:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0))
+ (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
"TARGET_SSE"
- "andps\t{%2, %0|%0, %2}"
+ "")
+
+(define_insn "*sse_nandv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
+ (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE"
+ "andnps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V4SF")])
-(define_insn "*sse_andti3_sf_2"
+(define_insn "*sse_nandsf3"
[(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (and:TI (subreg:TI (match_operand:SF 1 "register_operand" "0") 0)
- (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
"TARGET_SSE"
- "andps\t{%2, %0|%0, %2}"
+ "andnps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V4SF")])
-(define_insn "sse_andti3"
- [(set (match_operand:TI 0 "register_operand" "=x")
- (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+(define_expand "sse_iorv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
+ (ior:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0)
+ (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
+ "TARGET_SSE"
+ "")
+
+(define_insn "*sse_iorv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
+ (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE && !TARGET_SSE2
+ "TARGET_SSE
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "andps\t{%2, %0|%0, %2}"
+ "orps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V4SF")])
-(define_insn "sse2_andti3"
- [(set (match_operand:TI 0 "register_operand" "=x")
- (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+(define_insn "*sse_iorsf3"
+ [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
+ (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE2
+ "TARGET_SSE
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "pand\t{%2, %0|%0, %2}"
+ "orps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "TI")])
+ (set_attr "mode" "V4SF")])
-(define_insn "sse2_andv2di3"
- [(set (match_operand:V2DI 0 "register_operand" "=x")
- (and:V2DI (match_operand:V2DI 1 "nonimmediate_operand" "%0")
- (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE2
+(define_expand "sse_xorv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "") 0)
+ (xor:TI (subreg:TI (match_operand:V4SF 1 "register_operand" "") 0)
+ (subreg:TI (match_operand:V4SF 2 "nonimmediate_operand" "") 0)))]
+ "TARGET_SSE
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "pand\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "TI")])
-
-(define_insn "*sse_nandti3_df"
- [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (and:TI (not:TI (subreg:TI (match_operand:DF 1 "register_operand" "0") 0))
- (match_operand:TI 2 "nonimmediate_operand" "Ym")))]
- "TARGET_SSE2"
- "andnpd\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
+ "")
-(define_insn "*sse_nandti3_sf"
- [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (and:TI (not:TI (subreg:TI (match_operand:SF 1 "register_operand" "0") 0))
+(define_insn "*sse_xorv4sf3"
+ [(set (subreg:TI (match_operand:V4SF 0 "register_operand" "=x") 0)
+ (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE"
- "andnps\t{%2, %0|%0, %2}"
+ "TARGET_SSE
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "xorps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V4SF")])
-(define_insn "sse_nandti3"
- [(set (match_operand:TI 0 "register_operand" "=x")
- (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
+(define_insn "*sse_xorsf3"
+ [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
+ (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE && !TARGET_SSE2"
- "andnps\t{%2, %0|%0, %2}"
+ "TARGET_SSE
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "xorps\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V4SF")])
-(define_insn "sse2_nandti3"
- [(set (match_operand:TI 0 "register_operand" "=x")
- (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
- (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+;; SSE2 double precision floating point logical operation
+
+(define_expand "sse2_andv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
+ (and:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "") 0)
+ (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
"TARGET_SSE2"
- "pandn\t{%2, %0|%0, %2}"
+ "")
+
+(define_insn "*sse2_andv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
+ (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE2
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "andpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "TI")])
+ (set_attr "mode" "V2DF")])
-(define_insn "sse2_nandv2di3"
- [(set (match_operand:V2DI 0 "register_operand" "=x")
- (and:V2DI (not:V2DI (match_operand:V2DI 1 "nonimmediate_operand" "%0"))
- (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
+(define_insn "*sse2_andv2df3"
+ [(set (subreg:TI (match_operand:DF 0 "register_operand" "=x") 0)
+ (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
"TARGET_SSE2
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "pandn\t{%2, %0|%0, %2}"
+ "andpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "TI")])
+ (set_attr "mode" "V2DF")])
-(define_insn "*sse_iorti3_df_1"
- [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (ior:TI (subreg:TI (match_operand:DF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:DF 2 "register_operand" "Y") 0)))]
+(define_expand "sse2_nandv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
+ (and:TI (not:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "") 0))
+ (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
"TARGET_SSE2"
- "orpd\t{%2, %0|%0, %2}"
+ "")
+
+(define_insn "*sse2_nandv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
+ (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE2"
+ "andnpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V2DF")])
-(define_insn "*sse_iorti3_df_2"
+(define_insn "*sse_nandti3_df"
[(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (ior:TI (subreg:TI (match_operand:DF 1 "register_operand" "0") 0)
+ (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
(match_operand:TI 2 "nonimmediate_operand" "Ym")))]
"TARGET_SSE2"
+ "andnpd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sselog")
+ (set_attr "mode" "V2DF")])
+
+(define_expand "sse2_iorv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
+ (ior:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "") 0)
+ (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
+ "TARGET_SSE2"
+ "")
+
+(define_insn "*sse2_iorv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
+ (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE2
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
"orpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "V2DF")])
-(define_insn "*sse_iorti3_sf_1"
- [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (ior:TI (subreg:TI (match_operand:SF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:SF 2 "register_operand" "x") 0)))]
- "TARGET_SSE"
- "orps\t{%2, %0|%0, %2}"
+(define_insn "*sse2_iordf3"
+ [(set (subreg:TI (match_operand:DF 0 "register_operand" "=x") 0)
+ (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE2
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "orpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V4SF")])
+ (set_attr "mode" "V2DF")])
-(define_insn "*sse_iorti3_sf_2"
- [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (ior:TI (subreg:TI (match_operand:SF 1 "register_operand" "0") 0)
+(define_expand "sse2_xorv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "") 0)
+ (xor:TI (subreg:TI (match_operand:V2DF 1 "nonimmediate_operand" "") 0)
+ (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "") 0)))]
+ "TARGET_SSE2"
+ "")
+
+(define_insn "*sse2_xorv2df3"
+ [(set (subreg:TI (match_operand:V2DF 0 "register_operand" "=x") 0)
+ (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE"
- "orps\t{%2, %0|%0, %2}"
+ "TARGET_SSE2
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "xorpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V4SF")])
+ (set_attr "mode" "V2DF")])
-(define_insn "sse_iorti3"
- [(set (match_operand:TI 0 "register_operand" "=x")
- (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+(define_insn "*sse2_xordf3"
+ [(set (subreg:TI (match_operand:DF 0 "register_operand" "=x") 0)
+ (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE && !TARGET_SSE2
+ "TARGET_SSE2
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "orps\t{%2, %0|%0, %2}"
+ "xorpd\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V4SF")])
+ (set_attr "mode" "V2DF")])
-(define_insn "sse2_iorti3"
+;; SSE2 integral logicals. These patterns must always come after floating
+;; point ones since we don't want compiler to use integer opcodes on floating
+;; point SSE values to avoid matching of subregs in the match_operand.
+(define_insn "*sse2_andti3"
[(set (match_operand:TI 0 "register_operand" "=x")
- (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
+ (and:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
"TARGET_SSE2
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "por\t{%2, %0|%0, %2}"
+ "pand\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "TI")])
-(define_insn "sse2_iorv2di3"
+(define_insn "sse2_andv2di3"
[(set (match_operand:V2DI 0 "register_operand" "=x")
- (ior:V2DI (match_operand:V2DI 1 "nonimmediate_operand" "%0")
+ (and:V2DI (match_operand:V2DI 1 "nonimmediate_operand" "%0")
(match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
"TARGET_SSE2
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "por\t{%2, %0|%0, %2}"
+ "pand\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
(set_attr "mode" "TI")])
-(define_insn "*sse_xorti3_df_1"
- [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (xor:TI (subreg:TI (match_operand:DF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:DF 2 "register_operand" "Y") 0)))]
- "TARGET_SSE2"
- "xorpd\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
-
-(define_insn "*sse_xorti3_df_2"
- [(set (subreg:TI (match_operand:DF 0 "register_operand" "=Y") 0)
- (xor:TI (subreg:TI (match_operand:DF 1 "register_operand" "0") 0)
- (match_operand:TI 2 "nonimmediate_operand" "Ym")))]
+(define_insn "*sse2_nandti3"
+ [(set (match_operand:TI 0 "register_operand" "=x")
+ (and:TI (not:TI (match_operand:TI 1 "register_operand" "0"))
+ (match_operand:TI 2 "nonimmediate_operand" "xm")))]
"TARGET_SSE2"
- "xorpd\t{%2, %0|%0, %2}"
+ "pandn\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
+ (set_attr "mode" "TI")])
-(define_insn "*sse_xorti3_sf_1"
- [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (xor:TI (subreg:TI (match_operand:SF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:SF 2 "register_operand" "x") 0)))]
- "TARGET_SSE"
- "xorps\t{%2, %0|%0, %2}"
+(define_insn "sse2_nandv2di3"
+ [(set (match_operand:V2DI 0 "register_operand" "=x")
+ (and:V2DI (not:V2DI (match_operand:V2DI 1 "nonimmediate_operand" "%0"))
+ (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE2
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "pandn\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V4SF")])
+ (set_attr "mode" "TI")])
-(define_insn "*sse_xorti3_sf_2"
- [(set (subreg:TI (match_operand:SF 0 "register_operand" "=x") 0)
- (xor:TI (subreg:TI (match_operand:SF 1 "register_operand" "0") 0)
+(define_insn "*sse2_iorti3"
+ [(set (match_operand:TI 0 "register_operand" "=x")
+ (ior:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE"
- "xorps\t{%2, %0|%0, %2}"
+ "TARGET_SSE2
+ && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
+ "por\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V4SF")])
+ (set_attr "mode" "TI")])
-(define_insn "sse_xorti3"
- [(set (match_operand:TI 0 "register_operand" "=x")
- (xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
- (match_operand:TI 2 "nonimmediate_operand" "xm")))]
- "TARGET_SSE && !TARGET_SSE2
+(define_insn "sse2_iorv2di3"
+ [(set (match_operand:V2DI 0 "register_operand" "=x")
+ (ior:V2DI (match_operand:V2DI 1 "nonimmediate_operand" "%0")
+ (match_operand:V2DI 2 "nonimmediate_operand" "xm")))]
+ "TARGET_SSE2
&& (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
- "xorps\t{%2, %0|%0, %2}"
+ "por\t{%2, %0|%0, %2}"
[(set_attr "type" "sselog")
- (set_attr "mode" "V4SF")])
+ (set_attr "mode" "TI")])
-(define_insn "sse2_xorti3"
+(define_insn "*sse2_xorti3"
[(set (match_operand:TI 0 "register_operand" "=x")
(xor:TI (match_operand:TI 1 "nonimmediate_operand" "%0")
(match_operand:TI 2 "nonimmediate_operand" "xm")))]
@@ -18680,9 +19290,34 @@
;; this insn.
(define_insn "sse_clrv4sf"
[(set (match_operand:V4SF 0 "register_operand" "=x")
- (unspec:V4SF [(const_int 0)] UNSPEC_NOP))]
+ (match_operand:V4SF 1 "const0_operand" "X"))]
"TARGET_SSE"
- "xorps\t{%0, %0|%0, %0}"
+{
+ if (get_attr_mode (insn) == MODE_TI)
+ return "pxor\t{%0, %0|%0, %0}";
+ else
+ return "xorps\t{%0, %0|%0, %0}";
+}
+ [(set_attr "type" "sselog")
+ (set_attr "memory" "none")
+ (set (attr "mode")
+ (if_then_else
+ (and (and (ne (symbol_ref "TARGET_SSE_LOAD0_BY_PXOR")
+ (const_int 0))
+ (ne (symbol_ref "TARGET_SSE2")
+ (const_int 0)))
+ (eq (symbol_ref "optimize_size")
+ (const_int 0)))
+ (const_string "TI")
+ (const_string "V4SF")))])
+
+;; Use xor, but don't show input operands so they aren't live before
+;; this insn.
+(define_insn "sse_clrv2df"
+ [(set (match_operand:V2DF 0 "register_operand" "=x")
+ (unspec:V2DF [(const_int 0)] UNSPEC_NOP))]
+ "TARGET_SSE2"
+ "xorpd\t{%0, %0|%0, %0}"
[(set_attr "type" "sselog")
(set_attr "memory" "none")
(set_attr "mode" "V4SF")])
@@ -18749,13 +19384,12 @@
(define_insn "sse_comi"
[(set (reg:CCFP 17)
- (match_operator:CCFP 2 "sse_comparison_operator"
- [(vec_select:SF
- (match_operand:V4SF 0 "register_operand" "x")
- (parallel [(const_int 0)]))
- (vec_select:SF
- (match_operand:V4SF 1 "register_operand" "x")
- (parallel [(const_int 0)]))]))]
+ (compare:CCFP (vec_select:SF
+ (match_operand:V4SF 0 "register_operand" "x")
+ (parallel [(const_int 0)]))
+ (vec_select:SF
+ (match_operand:V4SF 1 "register_operand" "x")
+ (parallel [(const_int 0)]))))]
"TARGET_SSE"
"comiss\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecmp")
@@ -18763,13 +19397,12 @@
(define_insn "sse_ucomi"
[(set (reg:CCFPU 17)
- (match_operator:CCFPU 2 "sse_comparison_operator"
- [(vec_select:SF
- (match_operand:V4SF 0 "register_operand" "x")
- (parallel [(const_int 0)]))
- (vec_select:SF
- (match_operand:V4SF 1 "register_operand" "x")
- (parallel [(const_int 0)]))]))]
+ (compare:CCFPU (vec_select:SF
+ (match_operand:V4SF 0 "register_operand" "x")
+ (parallel [(const_int 0)]))
+ (vec_select:SF
+ (match_operand:V4SF 1 "register_operand" "x")
+ (parallel [(const_int 0)]))))]
"TARGET_SSE"
"ucomiss\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecmp")
@@ -18861,7 +19494,6 @@
[(set_attr "type" "sse")
(set_attr "mode" "SF")])
-
;; SSE <-> integer/MMX conversions
(define_insn "cvtpi2ps"
@@ -18909,6 +19541,18 @@
[(set_attr "type" "ssecvt")
(set_attr "mode" "SF")])
+(define_insn "cvtsi2ssq"
+ [(set (match_operand:V4SF 0 "register_operand" "=x")
+ (vec_merge:V4SF
+ (match_operand:V4SF 1 "register_operand" "0")
+ (vec_duplicate:V4SF
+ (float:SF (match_operand:DI 2 "nonimmediate_operand" "rm")))
+ (const_int 14)))]
+ "TARGET_SSE && TARGET_64BIT"
+ "cvtsi2ssq\t{%2, %0|%0, %2}"
+ [(set_attr "type" "ssecvt")
+ (set_attr "mode" "SF")])
+
(define_insn "cvtss2si"
[(set (match_operand:SI 0 "register_operand" "=r")
(vec_select:SI
@@ -19703,7 +20347,7 @@
output_asm_insn (\"rex\", operands);
output_asm_insn (\"movaps\\t{%5, %4|%4, %5}\", operands);
}
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (operands[3]));
RET;
}
@@ -19819,7 +20463,8 @@
(clobber (reg:DI 36))]
"TARGET_3DNOW"
"femms"
- [(set_attr "type" "mmx")])
+ [(set_attr "type" "mmx")
+ (set_attr "memory" "none")])
(define_insn "pf2id"
[(set (match_operand:V2SI 0 "register_operand" "=y")
@@ -20235,42 +20880,6 @@
"minsd\t{%2, %0|%0, %2}"
[(set_attr "type" "sseadd")
(set_attr "mode" "DF")])
-
-(define_insn "sse2_anddf3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (subreg:V2DF (and:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "xm") 0)) 0))]
- "TARGET_SSE2"
- "andpd\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
-
-(define_insn "sse2_nanddf3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (subreg:V2DF (and:TI (not:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "0") 0))
- (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "xm") 0)) 0))]
- "TARGET_SSE2"
- "andnpd\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
-
-(define_insn "sse2_iordf3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (subreg:V2DF (ior:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "xm") 0)) 0))]
- "TARGET_SSE2"
- "orpd\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
-
-(define_insn "sse2_xordf3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (subreg:V2DF (xor:TI (subreg:TI (match_operand:V2DF 1 "register_operand" "%0") 0)
- (subreg:TI (match_operand:V2DF 2 "nonimmediate_operand" "xm") 0)) 0))]
- "TARGET_SSE2"
- "xorpd\t{%2, %0|%0, %2}"
- [(set_attr "type" "sselog")
- (set_attr "mode" "V2DF")])
;; SSE2 square root. There doesn't appear to be an extension for the
;; reciprocal/rsqrt instructions if the Intel manual is to be believed.
@@ -20311,7 +20920,12 @@
[(match_operand:V2DF 1 "register_operand" "0")
(match_operand:V2DF 2 "nonimmediate_operand" "x")])))]
"TARGET_SSE2"
- "cmpn%D3pd\t{%2, %0|%0, %2}"
+{
+ if (GET_CODE (operands[3]) == UNORDERED)
+ return "cmpordps\t{%2, %0|%0, %2}";
+ else
+ return "cmpn%D3pd\t{%2, %0|%0, %2}";
+}
[(set_attr "type" "ssecmp")
(set_attr "mode" "V2DF")])
@@ -20338,19 +20952,23 @@
(subreg:V2DI (match_dup 1) 0)
(const_int 1)))]
"TARGET_SSE2"
- "cmp%D3sd\t{%2, %0|%0, %2}"
+{
+ if (GET_CODE (operands[3]) == UNORDERED)
+ return "cmpordsd\t{%2, %0|%0, %2}";
+ else
+ return "cmpn%D3sd\t{%2, %0|%0, %2}";
+}
[(set_attr "type" "ssecmp")
(set_attr "mode" "DF")])
(define_insn "sse2_comi"
[(set (reg:CCFP 17)
- (match_operator:CCFP 2 "sse_comparison_operator"
- [(vec_select:DF
- (match_operand:V2DF 0 "register_operand" "x")
- (parallel [(const_int 0)]))
- (vec_select:DF
- (match_operand:V2DF 1 "register_operand" "x")
- (parallel [(const_int 0)]))]))]
+ (compare:CCFP (vec_select:DF
+ (match_operand:V2DF 0 "register_operand" "x")
+ (parallel [(const_int 0)]))
+ (vec_select:DF
+ (match_operand:V2DF 1 "register_operand" "x")
+ (parallel [(const_int 0)]))))]
"TARGET_SSE2"
"comisd\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecmp")
@@ -20358,13 +20976,12 @@
(define_insn "sse2_ucomi"
[(set (reg:CCFPU 17)
- (match_operator:CCFPU 2 "sse_comparison_operator"
- [(vec_select:DF
- (match_operand:V2DF 0 "register_operand" "x")
- (parallel [(const_int 0)]))
- (vec_select:DF
- (match_operand:V2DF 1 "register_operand" "x")
- (parallel [(const_int 0)]))]))]
+ (compare:CCFPU (vec_select:DF
+ (match_operand:V2DF 0 "register_operand" "x")
+ (parallel [(const_int 0)]))
+ (vec_select:DF
+ (match_operand:V2DF 1 "register_operand" "x")
+ (parallel [(const_int 0)]))))]
"TARGET_SSE2"
"ucomisd\t{%1, %0|%0, %1}"
[(set_attr "type" "ssecmp")
@@ -20556,7 +21173,7 @@
(vec_merge:V4SF (match_operand:V4SF 1 "register_operand" "0")
(vec_duplicate:V4SF
(float_truncate:V2SF
- (match_operand:V2DF 2 "register_operand" "xm")))
+ (match_operand:V2DF 2 "nonimmediate_operand" "xm")))
(const_int 14)))]
"TARGET_SSE2"
"cvtsd2ss\t{%2, %0|%0, %2}"
@@ -20568,7 +21185,7 @@
(vec_merge:V2DF (match_operand:V2DF 1 "register_operand" "0")
(float_extend:V2DF
(vec_select:V2SF
- (match_operand:V4SF 2 "register_operand" "xm")
+ (match_operand:V4SF 2 "nonimmediate_operand" "xm")
(parallel [(const_int 0)
(const_int 1)])))
(const_int 2)))]
@@ -20844,10 +21461,20 @@
(define_insn "sse2_clrti"
[(set (match_operand:TI 0 "register_operand" "=x") (const_int 0))]
"TARGET_SSE2"
- "pxor\t{%0, %0|%0, %0}"
- [(set_attr "type" "sseiadd")
+{
+ if (get_attr_mode (insn) == MODE_TI)
+ return "pxor\t%0, %0";
+ else
+ return "xorps\t%0, %0";
+}
+ [(set_attr "type" "ssemov")
(set_attr "memory" "none")
- (set_attr "mode" "TI")])
+ (set (attr "mode")
+ (if_then_else
+ (ne (symbol_ref "optimize_size")
+ (const_int 0))
+ (const_string "V4SF")
+ (const_string "TI")))])
;; MMX unsigned averages/sum of absolute differences
@@ -21532,7 +22159,7 @@
(set_attr "mode" "V2DF")])
(define_insn "sse2_clflush"
- [(unspec_volatile [(match_operand:SI 0 "address_operand" "p")]
+ [(unspec_volatile [(match_operand 0 "address_operand" "p")]
UNSPECV_CLFLUSH)]
"TARGET_SSE2"
"clflush %0"
diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h
index d2113909ece..965120a1bb6 100644
--- a/gcc/config/i386/linux64.h
+++ b/gcc/config/i386/linux64.h
@@ -60,10 +60,6 @@ Boston, MA 02111-1307, USA. */
%{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
%{static:-static}}"
-#define STARTFILE_PREFIX_SPEC "\
- %{m32: /usr/local/lib/ /lib/ /usr/lib/} \
- %{!m32: /usr/local/lib64/ /lib64/ /usr/lib64/}"
-
#undef STARTFILE_SPEC
#define STARTFILE_SPEC \
"%{!shared: \
diff --git a/gcc/config/i386/lynx-ng.h b/gcc/config/i386/lynx-ng.h
index 08fa60f430c..8d41add6cee 100644
--- a/gcc/config/i386/lynx-ng.h
+++ b/gcc/config/i386/lynx-ng.h
@@ -68,10 +68,3 @@ Boston, MA 02111-1307, USA. */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
sprintf ((BUF), ".%s%ld", (PREFIX), (long)(NUMBER))
-
-/* This is how to output 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, ".%s%d:\n", PREFIX, NUM)
diff --git a/gcc/config/i386/lynx.h b/gcc/config/i386/lynx.h
index 7835f2713f2..bdbfbe65f0f 100644
--- a/gcc/config/i386/lynx.h
+++ b/gcc/config/i386/lynx.h
@@ -69,10 +69,3 @@ Boston, MA 02111-1307, USA. */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
sprintf ((BUF), ".%s%ld", (PREFIX), (long)(NUMBER))
-
-/* This is how to output 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, ".%s%d:\n", PREFIX, NUM)
diff --git a/gcc/config/i386/mmintrin.h b/gcc/config/i386/mmintrin.h
index 88e384f8011..52e5195fbaf 100644
--- a/gcc/config/i386/mmintrin.h
+++ b/gcc/config/i386/mmintrin.h
@@ -30,8 +30,11 @@
#ifndef _MMINTRIN_H_INCLUDED
#define _MMINTRIN_H_INCLUDED
+#ifndef __MMX__
+# error "MMX instruction set not enabled"
+#else
/* The data type intended for user use. */
-typedef unsigned long long __m64 __attribute__ ((__aligned__ (8)));
+typedef int __m64 __attribute__ ((__mode__ (__V2SI__)));
/* Internal data types for implementing the intrinsics. */
typedef int __v2si __attribute__ ((__mode__ (__V2SI__)));
@@ -49,14 +52,16 @@ _mm_empty (void)
static __inline __m64
_mm_cvtsi32_si64 (int __i)
{
- return (unsigned int) __i;
+ long long __tmp = (unsigned int)__i;
+ return (__m64) __tmp;
}
/* Convert the lower 32 bits of the __m64 object into an integer. */
static __inline int
_mm_cvtsi64_si32 (__m64 __i)
{
- return __i;
+ long long __tmp = (long long)__i;
+ return __tmp;
}
/* Pack the four 16-bit values from M1 into the lower four 8-bit values of
@@ -269,7 +274,7 @@ _mm_mullo_pi16 (__m64 __m1, __m64 __m2)
static __inline __m64
_mm_sll_pi16 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psllw ((__v4hi)__m, __count);
+ return (__m64) __builtin_ia32_psllw ((__v4hi)__m, (long long)__count);
}
static __inline __m64
@@ -282,7 +287,7 @@ _mm_slli_pi16 (__m64 __m, int __count)
static __inline __m64
_mm_sll_pi32 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_pslld ((__v2si)__m, __count);
+ return (__m64) __builtin_ia32_pslld ((__v2si)__m, (long long)__count);
}
static __inline __m64
@@ -293,22 +298,22 @@ _mm_slli_pi32 (__m64 __m, int __count)
/* Shift the 64-bit value in M left by COUNT. */
static __inline __m64
-_mm_sll_pi64 (__m64 __m, __m64 __count)
+_mm_sll_si64 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psllq (__m, __count);
+ return (__m64) __builtin_ia32_psllq ((long long)__m, (long long)__count);
}
static __inline __m64
-_mm_slli_pi64 (__m64 __m, int __count)
+_mm_slli_si64 (__m64 __m, int __count)
{
- return (__m64) __builtin_ia32_psllq (__m, __count);
+ return (__m64) __builtin_ia32_psllq ((long long)__m, (long long)__count);
}
/* Shift four 16-bit values in M right by COUNT; shift in the sign bit. */
static __inline __m64
_mm_sra_pi16 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psraw ((__v4hi)__m, __count);
+ return (__m64) __builtin_ia32_psraw ((__v4hi)__m, (long long)__count);
}
static __inline __m64
@@ -321,7 +326,7 @@ _mm_srai_pi16 (__m64 __m, int __count)
static __inline __m64
_mm_sra_pi32 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psrad ((__v2si)__m, __count);
+ return (__m64) __builtin_ia32_psrad ((__v2si)__m, (long long)__count);
}
static __inline __m64
@@ -334,7 +339,7 @@ _mm_srai_pi32 (__m64 __m, int __count)
static __inline __m64
_mm_srl_pi16 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psrlw ((__v4hi)__m, __count);
+ return (__m64) __builtin_ia32_psrlw ((__v4hi)__m, (long long)__count);
}
static __inline __m64
@@ -347,7 +352,7 @@ _mm_srli_pi16 (__m64 __m, int __count)
static __inline __m64
_mm_srl_pi32 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psrld ((__v2si)__m, __count);
+ return (__m64) __builtin_ia32_psrld ((__v2si)__m, (long long)__count);
}
static __inline __m64
@@ -358,22 +363,22 @@ _mm_srli_pi32 (__m64 __m, int __count)
/* Shift the 64-bit value in M left by COUNT; shift in zeros. */
static __inline __m64
-_mm_srl_pi64 (__m64 __m, __m64 __count)
+_mm_srl_si64 (__m64 __m, __m64 __count)
{
- return (__m64) __builtin_ia32_psrlq (__m, __count);
+ return (__m64) __builtin_ia32_psrlq ((long long)__m, (long long)__count);
}
static __inline __m64
-_mm_srli_pi64 (__m64 __m, int __count)
+_mm_srli_si64 (__m64 __m, int __count)
{
- return (__m64) __builtin_ia32_psrlq (__m, __count);
+ return (__m64) __builtin_ia32_psrlq ((long long)__m, (long long)__count);
}
/* Bit-wise AND the 64-bit values in M1 and M2. */
static __inline __m64
_mm_and_si64 (__m64 __m1, __m64 __m2)
{
- return __builtin_ia32_pand (__m1, __m2);
+ return (__m64) __builtin_ia32_pand ((long long)__m1, (long long)__m2);
}
/* Bit-wise complement the 64-bit value in M1 and bit-wise AND it with the
@@ -381,21 +386,21 @@ _mm_and_si64 (__m64 __m1, __m64 __m2)
static __inline __m64
_mm_andnot_si64 (__m64 __m1, __m64 __m2)
{
- return __builtin_ia32_pandn (__m1, __m2);
+ return (__m64) __builtin_ia32_pandn ((long long)__m1, (long long)__m2);
}
/* Bit-wise inclusive OR the 64-bit values in M1 and M2. */
static __inline __m64
_mm_or_si64 (__m64 __m1, __m64 __m2)
{
- return __builtin_ia32_por (__m1, __m2);
+ return (__m64)__builtin_ia32_por ((long long)__m1, (long long)__m2);
}
/* Bit-wise exclusive OR the 64-bit values in M1 and M2. */
static __inline __m64
_mm_xor_si64 (__m64 __m1, __m64 __m2)
{
- return __builtin_ia32_pxor (__m1, __m2);
+ return (__m64)__builtin_ia32_pxor ((long long)__m1, (long long)__m2);
}
/* Compare eight 8-bit values. The result of the comparison is 0xFF if the
@@ -444,7 +449,7 @@ _mm_cmpgt_pi32 (__m64 __m1, __m64 __m2)
static __inline __m64
_mm_setzero_si64 (void)
{
- return __builtin_ia32_mmx_zero ();
+ return (__m64)__builtin_ia32_mmx_zero ();
}
/* Creates a vector of two 32-bit values; I0 is least significant. */
@@ -539,4 +544,5 @@ _mm_set1_pi8 (char __b)
return _mm_set1_pi32 (__i);
}
+#endif /* __MMX__ */
#endif /* _MMINTRIN_H_INCLUDED */
diff --git a/gcc/config/i386/netbsd-elf.h b/gcc/config/i386/netbsd-elf.h
index a1591f732f1..4f49bd3e84f 100644
--- a/gcc/config/i386/netbsd-elf.h
+++ b/gcc/config/i386/netbsd-elf.h
@@ -121,4 +121,7 @@ Boston, MA 02111-1307, USA. */
we don't care about compatibility with older gcc versions. */
#define DEFAULT_PCC_STRUCT_RETURN 1
+/* Attempt to enable execute permissions on the stack. */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
#define TARGET_VERSION fprintf (stderr, " (NetBSD/i386 ELF)");
diff --git a/gcc/config/i386/netbsd.h b/gcc/config/i386/netbsd.h
index 332e70f1f42..45ae893595e 100644
--- a/gcc/config/i386/netbsd.h
+++ b/gcc/config/i386/netbsd.h
@@ -62,3 +62,11 @@
/* Until they use ELF or something that handles dwarf2 unwinds
and initialization stuff better. */
#define DWARF2_UNWIND_INFO 0
+
+/* Redefine this so that it becomes "_GLOBAL_OFFSET_TABLE_" when the label
+ prefix is added. */
+#undef GOT_SYMBOL_NAME
+#define GOT_SYMBOL_NAME "GLOBAL_OFFSET_TABLE_"
+
+/* Attempt to enable execute permissions on the stack. */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
diff --git a/gcc/config/i386/netbsd64.h b/gcc/config/i386/netbsd64.h
index 89050bc540b..341b6d1189b 100644
--- a/gcc/config/i386/netbsd64.h
+++ b/gcc/config/i386/netbsd64.h
@@ -69,5 +69,7 @@ Boston, MA 02111-1307, USA. */
fprintf (FILE, "\tcall __mcount\n"); \
}
+/* Attempt to enable execute permissions on the stack. */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
#define TARGET_VERSION fprintf (stderr, " (NetBSD/x86_64 ELF)");
diff --git a/gcc/config/i386/openbsd.h b/gcc/config/i386/openbsd.h
index 8f54026539b..60f16575e21 100644
--- a/gcc/config/i386/openbsd.h
+++ b/gcc/config/i386/openbsd.h
@@ -96,9 +96,6 @@ Boston, MA 02111-1307, USA. */
#undef ASM_PREFERRED_EH_DATA_FORMAT
-
-/* Note that we pick up ASM_OUTPUT_MI_THUNK from unix.h. */
-
#undef ASM_COMMENT_START
#define ASM_COMMENT_START ";#"
diff --git a/gcc/config/i386/pentium.md b/gcc/config/i386/pentium.md
index 2d418bdf119..40789558458 100644
--- a/gcc/config/i386/pentium.md
+++ b/gcc/config/i386/pentium.md
@@ -77,7 +77,7 @@
;; |
;; fpu
;; We add dummy "port" pipes allocated only first cycle of
-;; instruction to specify this behaviour.
+;; instruction to specify this behavior.
(define_cpu_unit "pentium-portu,pentium-portv" "pentium")
(define_cpu_unit "pentium-u,pentium-v" "pentium")
@@ -118,7 +118,7 @@
(pentium-load+pentium-firstv))")
(define_reservation "pentium-firstuboth" "(pentium-load + pentium-firstu
+ pentium-memory)")
-(define_reservation "pentium-firstvboth" "(pentium-load + pentium-firstu
+(define_reservation "pentium-firstvboth" "(pentium-load + pentium-firstv
+ pentium-memory)")
(define_reservation "pentium-firstuvboth" "(pentium-load + pentium-firstuv
+ pentium-memory)
diff --git a/gcc/config/i386/rtemself.h b/gcc/config/i386/rtemself.h
index dcf2808cd14..096717816f2 100644
--- a/gcc/config/i386/rtemself.h
+++ b/gcc/config/i386/rtemself.h
@@ -1,4 +1,4 @@
-/* Definitions for rtems targeting a ix86 using ELF.
+/* Definitions for rtems targeting an ix86 using ELF.
Copyright (C) 1996, 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
diff --git a/gcc/config/i386/sco5.h b/gcc/config/i386/sco5.h
index 9d7c314d5a7..5fabc219e39 100644
--- a/gcc/config/i386/sco5.h
+++ b/gcc/config/i386/sco5.h
@@ -343,7 +343,7 @@ do { \
do { \
if (TARGET_ELF) \
ASM_OUTPUT_ALIGN ((FILE), 2); \
- ASM_OUTPUT_INTERNAL_LABEL((FILE),(PREFIX),(NUM)); \
+ (*targetm.asm_out.internal_label)((FILE),(PREFIX),(NUM)); \
} while (0)
#undef ASM_OUTPUT_IDENT
@@ -354,10 +354,6 @@ do { \
#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
if (TARGET_ELF) (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0))
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
-
/* The prefix to add to user-visible assembler symbols. */
#undef USER_LABEL_PREFIX
@@ -413,16 +409,12 @@ do { \
#define DBX_REGISTER_NUMBER(n) \
((TARGET_ELF) ? svr4_dbx_register_map[n] : dbx_register_map[n])
-#undef DWARF2_DEBUGGING_INFO
-#undef DWARF_DEBUGGING_INFO
-#undef SDB_DEBUGGING_INFO
-#undef DBX_DEBUGGING_INFO
-#undef PREFERRED_DEBUGGING_TYPE
-
#define DWARF2_DEBUGGING_INFO 1
#define DWARF_DEBUGGING_INFO 1
-#define SDB_DEBUGGING_INFO 1
-#define DBX_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
+#define DBX_DEBUGGING_INFO 1
+
+#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE \
((TARGET_ELF) ? DWARF2_DEBUG: SDB_DEBUG)
diff --git a/gcc/config/i386/scodbx.h b/gcc/config/i386/scodbx.h
deleted file mode 100644
index 7da93053256..00000000000
--- a/gcc/config/i386/scodbx.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Definitions for Intel 386 running SCO Unix System V,
- using dbx-in-coff encapsulation.
- Copyright (C) 1992, 1995, 1996, 1999 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. */
-
-#include "i386/svr3dbx.h"
-
-/* Overridden defines for SCO systems from sco.h. */
-
-/* By default, target has a 80387, uses IEEE compatible arithmetic,
- and returns float values in the 387, ie,
- (TARGET_80387 | TARGET_FLOAT_RETURNS_IN_80387)
-
- SCO's software emulation of a 387 fails to handle the `fucomp'
- opcode. fucomp is only used when generating IEEE compliant code.
- So don't make TARGET_IEEE_FP default for SCO. */
-
-#undef TARGET_SUBTARGET_DEFAULT
-#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_FLOAT_RETURNS)
-
-/* Use crt1.o as a startup file and crtn.o as a closing file. */
-
-#undef STARTFILE_SPEC
-#define STARTFILE_SPEC \
- "%{!r:%{!z:svr3.ifile%s}%{z:svr3z.ifile%s}}\
- %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}"
-
-/* Library spec, including SCO international language support. */
-
-#undef LIB_SPEC
-#define LIB_SPEC \
- "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} %{scointl:libintl.a%s} -lc"
-
-/* Specify predefined symbols in preprocessor. */
-
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -DM_UNIX -DM_I386 -DM_COFF -DM_WORDSWAP -Asystem=svr3"
-
-#undef CPP_SPEC
-#define CPP_SPEC "%(cpp_cpu) %{scointl:-DM_INTERNAT}"
-
-/* This spec is used for telling cpp whether char is signed or not. */
-
-#undef SIGNED_CHAR_SPEC
-#if DEFAULT_SIGNED_CHAR
-#define SIGNED_CHAR_SPEC \
- "%{funsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}"
-#else
-#define SIGNED_CHAR_SPEC \
- "%{!fsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}"
-#endif
-
-/* caller has to pop the extra argument passed to functions that return
- structures. */
-
-#undef RETURN_POPS_ARGS
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \
- ((FUNDECL) && TREE_CODE (FUNDECL) == IDENTIFIER_NODE ? 0 \
- : (TARGET_RTD \
- && (TYPE_ARG_TYPES (FUNTYPE) == 0 \
- || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \
- == void_type_node))) ? (SIZE) \
- : 0)
-/* On other 386 systems, the last line looks like this:
- : (aggregate_value_p (TREE_TYPE (FUNTYPE))) ? GET_MODE_SIZE (Pmode) : 0) */
-
-/* Handle #pragma pack. */
-#define HANDLE_SYSV_PRAGMA
diff --git a/gcc/config/i386/svr3dbx.h b/gcc/config/i386/svr3dbx.h
index 3357d68591d..4be7a70d06b 100644
--- a/gcc/config/i386/svr3dbx.h
+++ b/gcc/config/i386/svr3dbx.h
@@ -24,7 +24,7 @@ Boston, MA 02111-1307, USA. */
/* We want to output DBX debugging information. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Compensate for botch in dbxout_init/dbxout_source_file which
unconditionally drops the first character from ltext_label_name */
diff --git a/gcc/config/i386/sysv3.h b/gcc/config/i386/sysv3.h
index 67194f4acc5..93f94450124 100644
--- a/gcc/config/i386/sysv3.h
+++ b/gcc/config/i386/sysv3.h
@@ -42,7 +42,7 @@ Boston, MA 02111-1307, USA. */
#define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
-/* Writing `int' for a bitfield forces int alignment for the structure. */
+/* Writing `int' for a bit-field forces int alignment for the structure. */
#define PCC_BITFIELD_TYPE_MATTERS 1
@@ -53,8 +53,7 @@ Boston, MA 02111-1307, USA. */
/* We want to be able to get DBX debugging information via -gstabs. */
-#undef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
diff --git a/gcc/config/i386/t-cygwin b/gcc/config/i386/t-cygwin
index 68d2ac53bc5..6fcb8340ddc 100644
--- a/gcc/config/i386/t-cygwin
+++ b/gcc/config/i386/t-cygwin
@@ -14,7 +14,7 @@ LIBGCC2_INCLUDES = -I$(srcdir)/../winsup/include \
-I$(srcdir)/../winsup/cygwin/include \
-I$(srcdir)/../winsup/w32api/include
-winnt.o: $(srcdir)/config/i386/winnt.c $(RTL_H) $(TREE_H) $(CONFIG_H)
+winnt.o: $(srcdir)/config/i386/winnt.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_P_H)
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/i386/winnt.c
# Don't run fixproto
diff --git a/gcc/config/i386/t-interix b/gcc/config/i386/t-interix
index 9153348f8ce..710de8b0881 100644
--- a/gcc/config/i386/t-interix
+++ b/gcc/config/i386/t-interix
@@ -1,6 +1,6 @@
LIB1ASMSRC = i386/cygwin.asm
LIB1ASMFUNCS = _chkstk
-winnt.o: $(srcdir)/config/i386/winnt.c
+winnt.o: $(srcdir)/config/i386/winnt.c $(TM_P_H)
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/i386/winnt.c
diff --git a/gcc/config/i386/t-linux64 b/gcc/config/i386/t-linux64
index 46a7caadf77..31b6ad46386 100644
--- a/gcc/config/i386/t-linux64
+++ b/gcc/config/i386/t-linux64
@@ -6,10 +6,9 @@ SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
MULTILIB_OPTIONS = m64/m32
MULTILIB_DIRNAMES = 64 32
+MULTILIB_OSDIRNAMES = ../lib64 ../lib
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/gcc/config/i386/unix.h b/gcc/config/i386/unix.h
index 3ba1bd5da7d..e69f26d7490 100644
--- a/gcc/config/i386/unix.h
+++ b/gcc/config/i386/unix.h
@@ -1,5 +1,5 @@
/* Definitions for Unix assembler syntax for the Intel 80386.
- Copyright (C) 1988, 1994, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1988, 1994, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -65,8 +65,3 @@ Boston, MA 02111-1307, USA. */
and returns float values in the 387. */
#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS)
-
-/* 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) \
- x86_output_mi_thunk (FILE, DELTA, FUNCTION);
diff --git a/gcc/config/i386/win32.h b/gcc/config/i386/win32.h
index 48b38877370..93f58c93f12 100644
--- a/gcc/config/i386/win32.h
+++ b/gcc/config/i386/win32.h
@@ -25,8 +25,8 @@ Boston, MA 02111-1307, USA. */
/* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop). */
#define HANDLE_PRAGMA_PACK_PUSH_POP 1
-#define DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
#include "i386/unix.h"
diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
index f629d35570b..f6417aa30bf 100644
--- a/gcc/config/i386/winnt.c
+++ b/gcc/config/i386/winnt.c
@@ -78,6 +78,15 @@ ix86_handle_dll_attribute (node, name, args, flags, no_add_attrs)
}
}
+ /* `extern' needn't be specified with dllimport.
+ Specify `extern' now and hope for the best. Sigh. */
+ else if (TREE_CODE (*node) == VAR_DECL
+ && is_attribute_p ("dllimport", name))
+ {
+ DECL_EXTERNAL (*node) = 1;
+ TREE_PUBLIC (*node) = 1;
+ }
+
return NULL_TREE;
}
@@ -126,7 +135,7 @@ associated_type (decl)
return t;
}
-/* Return non-zero if DECL is a dllexport'd object. */
+/* Return nonzero if DECL is a dllexport'd object. */
int
i386_pe_dllexport_p (decl)
@@ -153,7 +162,7 @@ i386_pe_dllexport_p (decl)
return 0;
}
-/* Return non-zero if DECL is a dllimport'd object. */
+/* Return nonzero if DECL is a dllimport'd object. */
int
i386_pe_dllimport_p (decl)
@@ -184,7 +193,7 @@ i386_pe_dllimport_p (decl)
return 0;
}
-/* Return non-zero if SYMBOL is marked as being dllexport'd. */
+/* Return nonzero if SYMBOL is marked as being dllexport'd. */
int
i386_pe_dllexport_name_p (symbol)
@@ -193,7 +202,7 @@ i386_pe_dllexport_name_p (symbol)
return symbol[0] == '@' && symbol[1] == 'e' && symbol[2] == '.';
}
-/* Return non-zero if SYMBOL is marked as being dllimport'd. */
+/* Return nonzero if SYMBOL is marked as being dllimport'd. */
int
i386_pe_dllimport_name_p (symbol)
@@ -302,16 +311,6 @@ i386_pe_mark_dllimport (decl)
return;
}
- /* `extern' needn't be specified with dllimport.
- Specify `extern' now and hope for the best. Sigh. */
- if (TREE_CODE (decl) == VAR_DECL
- /* ??? Is this test for vtables needed? */
- && !DECL_VIRTUAL_P (decl))
- {
- DECL_EXTERNAL (decl) = 1;
- TREE_PUBLIC (decl) = 1;
- }
-
newname = alloca (strlen (oldname) + 11);
sprintf (newname, "@i._imp__%s", oldname);
@@ -584,7 +583,7 @@ i386_pe_asm_named_section (name, flags)
/* Mark a function appropriately. This should only be called for
functions for which we are not emitting COFF debugging information.
FILE is the assembler output file, NAME is the name of the
- function, and PUBLIC is non-zero if the function is globally
+ function, and PUBLIC is nonzero if the function is globally
visible. */
void
diff --git a/gcc/config/i386/x86-64.h b/gcc/config/i386/x86-64.h
index 56e46841729..54efb8144f1 100644
--- a/gcc/config/i386/x86-64.h
+++ b/gcc/config/i386/x86-64.h
@@ -85,9 +85,8 @@ Boston, MA 02111-1307, USA. */
/* i386 System V Release 4 uses DWARF debugging info.
x86-64 ABI specifies DWARF2. */
-#undef DWARF2_DEBUGGING_INFO
#undef DWARF_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
#define DWARF2_UNWIND_INFO 1
/* Incorrectly autodetected in cross compilation. */
#undef HAVE_AS_DWARF2_DEBUG_LINE
diff --git a/gcc/config/i386/xm-dgux.h b/gcc/config/i386/xm-dgux.h
deleted file mode 100644
index 881c5c7be9d..00000000000
--- a/gcc/config/i386/xm-dgux.h
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Configuration for GCC for Intel i386 running DG/ux */
-
-/* looks just like sysv4 for now */
-#include "xm-svr4.h"
diff --git a/gcc/config/i386/xm-sun.h b/gcc/config/i386/xm-sun.h
deleted file mode 100644
index 6c0f0a25630..00000000000
--- a/gcc/config/i386/xm-sun.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Configuration for GNU C-compiler for Intel 80386 running SunOS 4.0.
- Copyright (C) 1988, 1997 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. */
-
-#define USG
diff --git a/gcc/config/i386/xm-sysv3.h b/gcc/config/i386/xm-sysv3.h
deleted file mode 100644
index 9a655443ff5..00000000000
--- a/gcc/config/i386/xm-sysv3.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Configuration for GCC for Intel i386 running System V Release 3. */
-
-#include "xm-svr3.h"
diff --git a/gcc/config/i386/xmmintrin.h b/gcc/config/i386/xmmintrin.h
index 09eea2236dc..8c5d41b660e 100644
--- a/gcc/config/i386/xmmintrin.h
+++ b/gcc/config/i386/xmmintrin.h
@@ -30,6 +30,10 @@
#ifndef _XMMINTRIN_H_INCLUDED
#define _XMMINTRIN_H_INCLUDED
+#ifndef __SSE__
+# error "SSE instruction set not enabled"
+#else
+
/* We need type definitions from the MMX header file. */
#include <mmintrin.h>
@@ -245,13 +249,21 @@ _mm_cmple_ss (__m128 __A, __m128 __B)
static __inline __m128
_mm_cmpgt_ss (__m128 __A, __m128 __B)
{
- return (__m128) __builtin_ia32_cmpgtss ((__v4sf)__A, (__v4sf)__B);
+ return (__m128) __builtin_ia32_movss ((__v4sf) __A,
+ (__v4sf)
+ __builtin_ia32_cmpltss ((__v4sf) __B,
+ (__v4sf)
+ __A));
}
static __inline __m128
_mm_cmpge_ss (__m128 __A, __m128 __B)
{
- return (__m128) __builtin_ia32_cmpgess ((__v4sf)__A, (__v4sf)__B);
+ return (__m128) __builtin_ia32_movss ((__v4sf) __A,
+ (__v4sf)
+ __builtin_ia32_cmpless ((__v4sf) __B,
+ (__v4sf)
+ __A));
}
static __inline __m128
@@ -275,13 +287,21 @@ _mm_cmpnle_ss (__m128 __A, __m128 __B)
static __inline __m128
_mm_cmpngt_ss (__m128 __A, __m128 __B)
{
- return (__m128) __builtin_ia32_cmpngtss ((__v4sf)__A, (__v4sf)__B);
+ return (__m128) __builtin_ia32_movss ((__v4sf) __A,
+ (__v4sf)
+ __builtin_ia32_cmpnltss ((__v4sf) __B,
+ (__v4sf)
+ __A));
}
static __inline __m128
_mm_cmpnge_ss (__m128 __A, __m128 __B)
{
- return (__m128) __builtin_ia32_cmpngess ((__v4sf)__A, (__v4sf)__B);
+ return (__m128) __builtin_ia32_movss ((__v4sf) __A,
+ (__v4sf)
+ __builtin_ia32_cmpnless ((__v4sf) __B,
+ (__v4sf)
+ __A));
}
static __inline __m128
@@ -586,7 +606,7 @@ _mm_cvtps_pi16(__m128 __A)
__v4sf __losf = __builtin_ia32_movhlps (__hisf, __hisf);
__v2si __hisi = __builtin_ia32_cvtps2pi (__hisf);
__v2si __losi = __builtin_ia32_cvtps2pi (__losf);
- return (__m64) __builtin_ia32_packssdw (__losi, __hisi);
+ return (__m64) __builtin_ia32_packssdw (__hisi, __losi);
}
/* Convert the four SPFP values in A to four signed 8-bit integers. */
@@ -871,7 +891,7 @@ _mm_storeu_ps (float *__P, __m128 __A)
__builtin_ia32_storeups (__P, (__v4sf)__A);
}
-/* Store four SPFP values in reverse order. The addres must be aligned. */
+/* Store four SPFP values in reverse order. The address must be aligned. */
static __inline void
_mm_storer_ps (float *__P, __m128 __A)
{
@@ -1017,7 +1037,7 @@ _mm_prefetch (void *__P, enum _mm_hint __I)
static __inline void
_mm_stream_pi (__m64 *__P, __m64 __A)
{
- __builtin_ia32_movntq (__P, __A);
+ __builtin_ia32_movntq (__P, (long long)__A);
}
/* Likewise. The address must be 16-byte aligned. */
@@ -1066,9 +1086,159 @@ typedef int __v4si __attribute__ ((mode (V4SI)));
typedef int __v8hi __attribute__ ((mode (V8HI)));
typedef int __v16qi __attribute__ ((mode (V16QI)));
-#define __m128i __m128
+/* Create a selector for use with the SHUFPD instruction. */
+#define _MM_SHUFFLE2(fp1,fp0) \
+ (((fp1) << 1) | (fp0))
+
+#define __m128i __v2di
#define __m128d __v2df
+/* Create a vector with element 0 as *P and the rest zero. */
+static __inline __m128d
+_mm_load_sd (double *__P)
+{
+ return (__m128d) __builtin_ia32_loadsd (__P);
+}
+
+/* Create a vector with all two elements equal to *P. */
+static __inline __m128d
+_mm_load1_pd (double *__P)
+{
+ __v2df __tmp = __builtin_ia32_loadsd (__P);
+ return (__m128d) __builtin_ia32_shufpd (__tmp, __tmp, _MM_SHUFFLE2 (0,0));
+}
+
+static __inline __m128d
+_mm_load_pd1 (double *__P)
+{
+ return _mm_load1_pd (__P);
+}
+
+/* Load two DPFP values from P. The addresd must be 16-byte aligned. */
+static __inline __m128d
+_mm_load_pd (double *__P)
+{
+ return (__m128d) __builtin_ia32_loadapd (__P);
+}
+
+/* Load two DPFP values from P. The addresd need not be 16-byte aligned. */
+static __inline __m128d
+_mm_loadu_pd (double *__P)
+{
+ return (__m128d) __builtin_ia32_loadupd (__P);
+}
+
+/* Load two DPFP values in reverse order. The addresd must be aligned. */
+static __inline __m128d
+_mm_loadr_pd (double *__P)
+{
+ __v2df __tmp = __builtin_ia32_loadapd (__P);
+ return (__m128d) __builtin_ia32_shufpd (__tmp, __tmp, _MM_SHUFFLE2 (0,1));
+}
+
+/* Create a vector with element 0 as F and the rest zero. */
+static __inline __m128d
+_mm_set_sd (double __F)
+{
+ return (__m128d) __builtin_ia32_loadsd (&__F);
+}
+
+/* Create a vector with all two elements equal to F. */
+static __inline __m128d
+_mm_set1_pd (double __F)
+{
+ __v2df __tmp = __builtin_ia32_loadsd (&__F);
+ return (__m128d) __builtin_ia32_shufpd (__tmp, __tmp, _MM_SHUFFLE2 (0,0));
+}
+
+static __inline __m128d
+_mm_set_pd1 (double __F)
+{
+ return _mm_set1_pd (__F);
+}
+
+/* Create the vector [Z Y]. */
+static __inline __m128d
+_mm_set_pd (double __Z, double __Y)
+{
+ union {
+ double __a[2];
+ __m128d __v;
+ } __u;
+
+ __u.__a[0] = __Y;
+ __u.__a[1] = __Z;
+
+ return __u.__v;
+}
+
+/* Create the vector [Y Z]. */
+static __inline __m128d
+_mm_setr_pd (double __Z, double __Y)
+{
+ return _mm_set_pd (__Y, __Z);
+}
+
+/* Create a vector of zeros. */
+static __inline __m128d
+_mm_setzero_pd (void)
+{
+ return (__m128d) __builtin_ia32_setzeropd ();
+}
+
+/* Stores the lower DPFP value. */
+static __inline void
+_mm_store_sd (double *__P, __m128d __A)
+{
+ __builtin_ia32_storesd (__P, (__v2df)__A);
+}
+
+/* Store the lower DPFP value acrosd two words. */
+static __inline void
+_mm_store1_pd (double *__P, __m128d __A)
+{
+ __v2df __va = (__v2df)__A;
+ __v2df __tmp = __builtin_ia32_shufpd (__va, __va, _MM_SHUFFLE2 (0,0));
+ __builtin_ia32_storeapd (__P, __tmp);
+}
+
+static __inline void
+_mm_store_pd1 (double *__P, __m128d __A)
+{
+ _mm_store1_pd (__P, __A);
+}
+
+/* Store two DPFP values. The addresd must be 16-byte aligned. */
+static __inline void
+_mm_store_pd (double *__P, __m128d __A)
+{
+ __builtin_ia32_storeapd (__P, (__v2df)__A);
+}
+
+/* Store two DPFP values. The addresd need not be 16-byte aligned. */
+static __inline void
+_mm_storeu_pd (double *__P, __m128d __A)
+{
+ __builtin_ia32_storeupd (__P, (__v2df)__A);
+}
+
+/* Store two DPFP values in reverse order. The addresd must be aligned. */
+static __inline void
+_mm_storer_pd (double *__P, __m128d __A)
+{
+ __v2df __va = (__v2df)__A;
+ __v2df __tmp = __builtin_ia32_shufpd (__va, __va, _MM_SHUFFLE2 (0,1));
+ __builtin_ia32_storeapd (__P, __tmp);
+}
+
+/* Sets the low DPFP value of A from the low value of B. */
+static __inline __m128d
+_mm_move_sd (__m128d __A, __m128d __B)
+{
+ return (__m128d) __builtin_ia32_movsd ((__v2df)__A, (__v2df)__B);
+}
+
+
static __inline __m128d
_mm_add_pd (__m128d __A, __m128d __B)
{
@@ -1123,10 +1293,12 @@ _mm_sqrt_pd (__m128d __A)
return (__m128d)__builtin_ia32_sqrtpd ((__v2df)__A);
}
+/* Return pair {sqrt (A[0), B[1]}. */
static __inline __m128d
-_mm_sqrt_sd (__m128d __A)
+_mm_sqrt_sd (__m128d __A, __m128d __B)
{
- return (__m128d)__builtin_ia32_sqrtsd ((__v2df)__A);
+ __v2df __tmp = __builtin_ia32_movsd ((__v2df)__A, (__v2df)__B);
+ return (__m128d)__builtin_ia32_sqrtsd ((__v2df)__tmp);
}
static __inline __m128d
@@ -1150,7 +1322,7 @@ _mm_max_pd (__m128d __A, __m128d __B)
static __inline __m128d
_mm_max_sd (__m128d __A, __m128d __B)
{
- return (__m128d)__builtin_ia32_minsd ((__v2df)__A, (__v2df)__B);
+ return (__m128d)__builtin_ia32_maxsd ((__v2df)__A, (__v2df)__B);
}
static __inline __m128d
@@ -1270,13 +1442,21 @@ _mm_cmple_sd (__m128d __A, __m128d __B)
static __inline __m128d
_mm_cmpgt_sd (__m128d __A, __m128d __B)
{
- return (__m128d)__builtin_ia32_cmpgtsd ((__v2df)__A, (__v2df)__B);
+ return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
+ (__v2df)
+ __builtin_ia32_cmpltsd ((__v2df) __B,
+ (__v2df)
+ __A));
}
static __inline __m128d
_mm_cmpge_sd (__m128d __A, __m128d __B)
{
- return (__m128d)__builtin_ia32_cmpgesd ((__v2df)__A, (__v2df)__B);
+ return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
+ (__v2df)
+ __builtin_ia32_cmplesd ((__v2df) __B,
+ (__v2df)
+ __A));
}
static __inline __m128d
@@ -1300,13 +1480,21 @@ _mm_cmpnle_sd (__m128d __A, __m128d __B)
static __inline __m128d
_mm_cmpngt_sd (__m128d __A, __m128d __B)
{
- return (__m128d)__builtin_ia32_cmpngtsd ((__v2df)__A, (__v2df)__B);
+ return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
+ (__v2df)
+ __builtin_ia32_cmpnltsd ((__v2df) __B,
+ (__v2df)
+ __A));
}
static __inline __m128d
_mm_cmpnge_sd (__m128d __A, __m128d __B)
{
- return (__m128d)__builtin_ia32_cmpngesd ((__v2df)__A, (__v2df)__B);
+ return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
+ (__v2df)
+ __builtin_ia32_cmpnlesd ((__v2df) __B,
+ (__v2df)
+ __A));
}
static __inline __m128d
@@ -1489,7 +1677,7 @@ _mm_cvtss_sd (__m128d __A, __m128d __B)
return (__m128d)__builtin_ia32_cvtss2sd ((__v2df) __A, (__v4sf)__B);
}
-#define _mm_shuffle_pd(__A, __B, __C) ((__m128d)__builtin_ia32_shufpd ((__v2df)__A, (__v2df)__B, (C)))
+#define _mm_shuffle_pd(__A, __B, __C) ((__m128d)__builtin_ia32_shufpd ((__v2df)__A, (__v2df)__B, (__C)))
static __inline __m128d
_mm_unpackhi_pd (__m128d __A, __m128d __B)
@@ -1504,25 +1692,25 @@ _mm_unpacklo_pd (__m128d __A, __m128d __B)
}
static __inline __m128d
-_mm_loadh_pd (__m128d __A, __m128d *__B)
+_mm_loadh_pd (__m128d __A, double *__B)
{
return (__m128d)__builtin_ia32_loadhpd ((__v2df)__A, (__v2si *)__B);
}
static __inline void
-_mm_storeh_pd (__m128d *__A, __m128d __B)
+_mm_storeh_pd (double *__A, __m128d __B)
{
__builtin_ia32_storehpd ((__v2si *)__A, (__v2df)__B);
}
static __inline __m128d
-_mm_loadl_pd (__m128d __A, __m128d *__B)
+_mm_loadl_pd (__m128d __A, double *__B)
{
return (__m128d)__builtin_ia32_loadlpd ((__v2df)__A, (__v2si *)__B);
}
static __inline void
-_mm_storel_pd (__m128d *__A, __m128d __B)
+_mm_storel_pd (double *__A, __m128d __B)
{
__builtin_ia32_storelpd ((__v2si *)__A, (__v2df)__B);
}
@@ -1791,6 +1979,22 @@ _mm_srai_epi32 (__m128i __A, int __B)
return (__m128i)__builtin_ia32_psradi128 ((__v4si)__A, __B);
}
+#if 0
+static __m128i __attribute__((__always_inline__))
+_mm_srli_si128 (__m128i __A, const int __B)
+{
+ return ((__m128i)__builtin_ia32_psrldqi128 (__A, __B))
+}
+
+static __m128i __attribute__((__always_inline__))
+_mm_srli_si128 (__m128i __A, const int __B)
+{
+ return ((__m128i)__builtin_ia32_pslldqi128 (__A, __B))
+}
+#endif
+#define _mm_srli_si128(__A, __B) ((__m128i)__builtin_ia32_psrldqi128 (__A, __B))
+#define _mm_slli_si128(__A, __B) ((__m128i)__builtin_ia32_pslldqi128 (__A, __B))
+
static __inline __m128i
_mm_srli_epi16 (__m128i __A, int __B)
{
@@ -1979,6 +2183,7 @@ _mm_mfence (void)
__builtin_ia32_mfence ();
}
-#endif /* __SSE2_BUILTINS__ */
+#endif /* __SSE2__ */
+#endif /* __SSE__ */
#endif /* _XMMINTRIN_H_INCLUDED */
diff --git a/gcc/config/i960/i960.c b/gcc/config/i960/i960.c
index 6aec8c50239..b15e27d9327 100644
--- a/gcc/config/i960/i960.c
+++ b/gcc/config/i960/i960.c
@@ -46,6 +46,7 @@ Boston, MA 02111-1307, USA. */
static void i960_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
static void i960_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
+static void i960_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
/* Save the operands last given to a compare for use when we
generate a scc or bcc insn. */
@@ -98,13 +99,52 @@ static int ret_label = 0;
#undef TARGET_ASM_FUNCTION_EPILOGUE
#define TARGET_ASM_FUNCTION_EPILOGUE i960_output_function_epilogue
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK i960_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
-/* Initialize variables before compiling any files. */
+/* Override conflicting target switch options.
+ Doesn't actually detect if more than one -mARCH option is given, but
+ does handle the case of two blatantly conflicting -mARCH options.
+
+ Also initialize variables before compiling any files. */
void
i960_initialize ()
{
+ if (TARGET_K_SERIES && TARGET_C_SERIES)
+ {
+ warning ("conflicting architectures defined - using C series");
+ target_flags &= ~TARGET_FLAG_K_SERIES;
+ }
+ if (TARGET_K_SERIES && TARGET_MC)
+ {
+ warning ("conflicting architectures defined - using K series");
+ target_flags &= ~TARGET_FLAG_MC;
+ }
+ if (TARGET_C_SERIES && TARGET_MC)
+ {
+ warning ("conflicting architectures defined - using C series");
+ target_flags &= ~TARGET_FLAG_MC;
+ }
+ if (TARGET_IC_COMPAT3_0)
+ {
+ flag_short_enums = 1;
+ flag_signed_char = 1;
+ target_flags |= TARGET_FLAG_CLEAN_LINKAGE;
+ if (TARGET_IC_COMPAT2_0)
+ {
+ warning ("iC2.0 and iC3.0 are incompatible - using iC3.0");
+ target_flags &= ~TARGET_FLAG_IC_COMPAT2_0;
+ }
+ }
+ if (TARGET_IC_COMPAT2_0)
+ {
+ flag_signed_char = 1;
+ target_flags |= TARGET_FLAG_CLEAN_LINKAGE;
+ }
+
if (TARGET_IC_COMPAT2_0)
{
i960_maxbitalignment = 8;
@@ -115,6 +155,9 @@ i960_initialize ()
i960_maxbitalignment = 128;
i960_last_maxbitalignment = 8;
}
+
+ /* Tell the compiler which flavor of TFmode we're using. */
+ real_format_for_mode[TFmode - QFmode] = &ieee_extended_intel_128_format;
}
/* Return true if OP can be used as the source of an fp move insn. */
@@ -321,8 +364,8 @@ bitpos (val)
return -1;
}
-/* Return non-zero if OP is a mask, i.e. all one bits are consecutive.
- The return value indicates how many consecutive non-zero bits exist
+/* Return nonzero if OP is a mask, i.e. all one bits are consecutive.
+ The return value indicates how many consecutive nonzero bits exist
if this is a mask. This is the same as the next function, except that
it does not indicate what the start and stop bit positions are. */
@@ -764,13 +807,13 @@ i960_output_ldconst (dst, src)
output_asm_insn ("ldconst %1,%0", operands);
return "";
}
- else if (mode == XFmode)
+ else if (mode == TFmode)
{
REAL_VALUE_TYPE d;
long value_long[3];
int i;
- if (fp_literal_zero (src, XFmode))
+ if (fp_literal_zero (src, TFmode))
return "movt 0,%0";
REAL_VALUE_FROM_CONST_DOUBLE (d, src);
@@ -1746,7 +1789,6 @@ i960_print_operand (file, x, code)
}
else if (rtxcode == CONST_DOUBLE)
{
- REAL_VALUE_TYPE d;
char dstr[30];
if (x == CONST0_RTX (GET_MODE (x)))
@@ -1760,8 +1802,7 @@ i960_print_operand (file, x, code)
return;
}
- REAL_VALUE_FROM_CONST_DOUBLE (d, x);
- REAL_VALUE_TO_DECIMAL (d, "%#g", dstr);
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
fprintf (file, "0f%s", dstr);
return;
}
@@ -2169,7 +2210,7 @@ hard_regno_mode_ok (regno, mode)
case DImode: case DFmode:
return (regno & 1) == 0;
- case TImode: case XFmode:
+ case TImode: case TFmode:
return (regno & 3) == 0;
default:
@@ -2180,7 +2221,7 @@ hard_regno_mode_ok (regno, mode)
{
switch (mode)
{
- case SFmode: case DFmode: case XFmode:
+ case SFmode: case DFmode: case TFmode:
case SCmode: case DCmode:
return 1;
@@ -2358,14 +2399,7 @@ i960_arg_size_and_align (mode, type, size_out, align_out)
size = (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
if (type == 0)
- {
- /* ??? This is a hack to properly correct the alignment of XFmode
- values without affecting anything else. */
- if (size == 3)
- align = 4;
- else
- align = size;
- }
+ align = size;
else if (TYPE_ALIGN (type) >= BITS_PER_WORD)
align = TYPE_ALIGN (type) / BITS_PER_WORD;
else
@@ -2464,11 +2498,18 @@ i960_object_bytes_bitalign (n)
MIN (pragma align, structure size alignment)). */
int
-i960_round_align (align, tsize)
+i960_round_align (align, type)
int align;
- tree tsize;
+ tree type;
{
int new_align;
+ tree tsize;
+
+ if (TARGET_OLD_ALIGN || TYPE_PACKED (type))
+ return align;
+ if (TREE_CODE (type) != RECORD_TYPE)
+ return align;
+ tsize = TYPE_SIZE (type);
if (! tsize || TREE_CODE (tsize) != INTEGER_CST)
return align;
@@ -2513,16 +2554,20 @@ i960_setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
if (cum->ca_nstackparms == 0 && first_reg < NPARM_REGS && !no_rtl)
{
rtx label = gen_label_rtx ();
- rtx regblock;
+ rtx regblock, fake_arg_pointer_rtx;
- /* If arg_pointer_rtx == 0, no arguments were passed on the stack
+ /* Use a different rtx than arg_pointer_rtx so that cse and friends
+ can go on believing that the argument pointer can never be zero. */
+ fake_arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
+
+ /* If the argument pointer is 0, no arguments were passed on the stack
and we need to allocate a chunk to save the registers (if any
arguments were passed on the stack the caller would allocate the
48 bytes as well). We must allocate all 48 bytes (12*4) because
va_start assumes it. */
- emit_insn (gen_cmpsi (arg_pointer_rtx, const0_rtx));
+ emit_insn (gen_cmpsi (fake_arg_pointer_rtx, const0_rtx));
emit_jump_insn (gen_bne (label));
- emit_insn (gen_rtx_SET (VOIDmode, arg_pointer_rtx,
+ emit_insn (gen_rtx_SET (VOIDmode, fake_arg_pointer_rtx,
stack_pointer_rtx));
emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
memory_address (SImode,
@@ -2559,6 +2604,7 @@ i960_va_start (valist, nextarg)
rtx nextarg ATTRIBUTE_UNUSED;
{
tree s, t, base, num;
+ rtx fake_arg_pointer_rtx;
/* The array type always decays to a pointer before we get here, so we
can't use ARRAY_REF. */
@@ -2567,7 +2613,10 @@ i960_va_start (valist, nextarg)
build (PLUS_EXPR, unsigned_type_node, valist,
TYPE_SIZE_UNIT (TREE_TYPE (valist))));
- s = make_tree (unsigned_type_node, arg_pointer_rtx);
+ /* Use a different rtx than arg_pointer_rtx so that cse and friends
+ can go on believing that the argument pointer can never be zero. */
+ fake_arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
+ s = make_tree (unsigned_type_node, fake_arg_pointer_rtx);
t = build (MODIFY_EXPR, unsigned_type_node, base, s);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
@@ -2779,3 +2828,25 @@ i960_scan_opcode (p)
break;
}
}
+
+static void
+i960_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ int d = delta;
+ if (d < 0 && d > -32)
+ fprintf (file, "\tsubo %d,g0,g0\n", -d);
+ else if (d > 0 && d < 32)
+ fprintf (file, "\taddo %d,g0,g0\n", d);
+ else
+ {
+ fprintf (file, "\tldconst %d,r5\n", d);
+ fprintf (file, "\taddo r5,g0,g0\n");
+ }
+ fprintf (file, "\tbx ");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "\n");
+}
diff --git a/gcc/config/i960/i960.h b/gcc/config/i960/i960.h
index d6015618f67..3ce98e23011 100644
--- a/gcc/config/i960/i960.h
+++ b/gcc/config/i960/i960.h
@@ -111,10 +111,10 @@ Boston, MA 02111-1307, USA. */
#define TARGET_VERSION fprintf (stderr," (intel 80960)");
/* Generate DBX debugging information. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Generate SDB style debugging information. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
#define EXTENDED_SDB_BASIC_TYPES
/* Generate DBX_DEBUGGING_INFO by default. */
@@ -335,44 +335,7 @@ extern int target_flags;
/* Override conflicting target switch options.
Doesn't actually detect if more than one -mARCH option is given, but
does handle the case of two blatantly conflicting -mARCH options. */
-#define OVERRIDE_OPTIONS \
-{ \
- if (TARGET_K_SERIES && TARGET_C_SERIES) \
- { \
- warning ("conflicting architectures defined - using C series"); \
- target_flags &= ~TARGET_FLAG_K_SERIES; \
- } \
- if (TARGET_K_SERIES && TARGET_MC) \
- { \
- warning ("conflicting architectures defined - using K series"); \
- target_flags &= ~TARGET_FLAG_MC; \
- } \
- if (TARGET_C_SERIES && TARGET_MC) \
- { \
- warning ("conflicting architectures defined - using C series");\
- target_flags &= ~TARGET_FLAG_MC; \
- } \
- if (TARGET_IC_COMPAT3_0) \
- { \
- flag_short_enums = 1; \
- flag_signed_char = 1; \
- target_flags |= TARGET_FLAG_CLEAN_LINKAGE; \
- if (TARGET_IC_COMPAT2_0) \
- { \
- warning ("iC2.0 and iC3.0 are incompatible - using iC3.0"); \
- target_flags &= ~TARGET_FLAG_IC_COMPAT2_0; \
- } \
- } \
- if (TARGET_IC_COMPAT2_0) \
- { \
- flag_signed_char = 1; \
- target_flags |= TARGET_FLAG_CLEAN_LINKAGE; \
- } \
- /* ??? See the LONG_DOUBLE_TYPE_SIZE definition below. */ \
- if (TARGET_LONG_DOUBLE_64) \
- warning ("the -mlong-double-64 option does not work yet");\
- i960_initialize (); \
-}
+#define OVERRIDE_OPTIONS i960_initialize ()
/* Don't enable anything by default. The user is expected to supply a -mARCH
option. If none is given, then -mka is added by CC1_SPEC. */
@@ -399,20 +362,16 @@ extern int target_flags;
/* Width of a word, in units (bytes). */
#define UNITS_PER_WORD 4
-/* Width in bits of a long double. Define to 96, and let
- ROUND_TYPE_ALIGN adjust the alignment for speed. */
-#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_64 ? 64 : 96)
-
-/* ??? This must be a constant, because real.c and real.h test it with #if. */
-#undef LONG_DOUBLE_TYPE_SIZE
-#define LONG_DOUBLE_TYPE_SIZE 96
+/* Width in bits of a long double. */
+#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_64 ? 64 : 128)
+#define MAX_LONG_DOUBLE_TYPE_SIZE 128
/* Define this to set long double type size to use in libgcc2.c, which can
not depend on target_flags. */
#if defined(__LONG_DOUBLE_64__)
#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
#else
-#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128
#endif
/* Allocation boundary (in *bits*) for storing pointers in memory. */
@@ -457,33 +416,14 @@ extern int target_flags;
? i960_object_bytes_bitalign (int_size_in_bytes (TREE_TYPE (EXP))) \
: (ALIGN))
-/* Make XFmode floating point quantities be 128 bit aligned. */
-#define DATA_ALIGNMENT(TYPE, ALIGN) \
- (TREE_CODE (TYPE) == ARRAY_TYPE \
- && TYPE_MODE (TREE_TYPE (TYPE)) == XFmode \
- && (ALIGN) < 128 ? 128 : (ALIGN))
-
/* Macros to determine size of aggregates (structures and unions
in C). Normally, these may be defined to simply return the maximum
alignment and simple rounded-up size, but on some machines (like
the i960), the total size of a structure is based on a non-trivial
rounding method. */
-#define ROUND_TYPE_ALIGN(TYPE, COMPUTED, SPECIFIED) \
- ((TREE_CODE (TYPE) == REAL_TYPE && TYPE_MODE (TYPE) == XFmode) \
- ? 128 /* Put 80 bit floating point elements on 128 bit boundaries. */ \
- : ((!TARGET_OLD_ALIGN && !TYPE_PACKED (TYPE) \
- && TREE_CODE (TYPE) == RECORD_TYPE) \
- ? i960_round_align (MAX ((COMPUTED), (SPECIFIED)), TYPE_SIZE (TYPE)) \
- : MAX ((COMPUTED), (SPECIFIED))))
-
-#define ROUND_TYPE_SIZE(TYPE, COMPUTED, SPECIFIED) \
- ((TREE_CODE (TYPE) == REAL_TYPE && TYPE_MODE (TYPE) == XFmode) \
- ? bitsize_int (128) : round_up (COMPUTED, SPECIFIED))
-#define ROUND_TYPE_SIZE_UNIT(TYPE, COMPUTED, SPECIFIED) \
- ((TREE_CODE (TYPE) == REAL_TYPE && TYPE_MODE (TYPE) == XFmode) \
- ? size_int (16) : round_up (COMPUTED, SPECIFIED))
-
+#define ROUND_TYPE_ALIGN(TYPE, COMPUTED, SPECIFIED) \
+ i960_round_align (MAX ((COMPUTED), (SPECIFIED)), TYPE)
/* Standard register usage. */
@@ -566,7 +506,7 @@ extern int target_flags;
/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
On 80960, the cpu registers can hold any mode but the float registers
- can only hold SFmode, DFmode, or XFmode. */
+ can only hold SFmode, DFmode, or TFmode. */
#define HARD_REGNO_MODE_OK(REGNO, MODE) hard_regno_mode_ok ((REGNO), (MODE))
/* Value is 1 if it is a good idea to tie two pseudo registers
@@ -991,12 +931,6 @@ struct cum_args { int ca_nregparms; int ca_nstackparms; };
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Macros to check register numbers against specific register classes. */
/* These assume that REGNO is a hard or pseudo reg number.
@@ -1166,7 +1100,7 @@ struct cum_args { int ca_nregparms; int ca_nstackparms; };
#define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
/* Nonzero if access to memory by bytes is no faster than for words.
- Value changed to 1 after reports of poor bitfield code with g++.
+ Value changed to 1 after reports of poor bit-field code with g++.
Indications are that code is usually as good, sometimes better. */
#define SLOW_BYTE_ACCESS 1
@@ -1319,12 +1253,6 @@ extern struct rtx_def *i960_compare_op0, *i960_compare_op1;
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", 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.
@@ -1410,13 +1338,6 @@ extern struct rtx_def *i960_compare_op0, *i960_compare_op1;
#define LABEL_ALIGN_AFTER_BARRIER(LABEL) (TARGET_CODE_ALIGN ? 3 : 0)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
/* Print operand X (an rtx) in assembler syntax to file FILE.
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
@@ -1523,22 +1444,3 @@ extern enum insn_types i960_last_insn_type;
/* Defined in reload.c, and used in insn-recog.c. */
extern int rtx_equal_function_value_matters;
-
-/* 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) \
-do { \
- int d = (DELTA); \
- if (d < 0 && d > -32) \
- fprintf (FILE, "\tsubo %d,g0,g0\n", -d); \
- else if (d > 0 && d < 32) \
- fprintf (FILE, "\taddo %d,g0,g0\n", d); \
- else \
- { \
- fprintf (FILE, "\tldconst %d,r5\n", d); \
- fprintf (FILE, "\taddo r5,g0,g0\n"); \
- } \
- fprintf (FILE, "\tbx "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "\n"); \
-} while (0);
diff --git a/gcc/config/i960/i960.md b/gcc/config/i960/i960.md
index 91fb78b5604..af0193fcceb 100644
--- a/gcc/config/i960/i960.md
+++ b/gcc/config/i960/i960.md
@@ -2061,10 +2061,10 @@
;; Tetra (16 byte) float support.
-(define_expand "cmpxf"
+(define_expand "cmptf"
[(set (reg:CC 36)
- (compare:CC (match_operand:XF 0 "register_operand" "")
- (match_operand:XF 1 "nonmemory_operand" "")))]
+ (compare:CC (match_operand:TF 0 "register_operand" "")
+ (match_operand:TF 1 "nonmemory_operand" "")))]
"TARGET_NUMERICS"
"
{
@@ -2075,27 +2075,27 @@
(define_insn ""
[(set (reg:CC 36)
- (compare:CC (match_operand:XF 0 "register_operand" "f")
- (match_operand:XF 1 "nonmemory_operand" "fGH")))]
+ (compare:CC (match_operand:TF 0 "register_operand" "f")
+ (match_operand:TF 1 "nonmemory_operand" "fGH")))]
"TARGET_NUMERICS"
"cmpr %0,%1"
[(set_attr "type" "fpcc")])
-(define_expand "movxf"
- [(set (match_operand:XF 0 "general_operand" "")
- (match_operand:XF 1 "fpmove_src_operand" ""))]
+(define_expand "movtf"
+ [(set (match_operand:TF 0 "general_operand" "")
+ (match_operand:TF 1 "fpmove_src_operand" ""))]
""
"
{
- if (emit_move_sequence (operands, XFmode))
+ if (emit_move_sequence (operands, TFmode))
DONE;
}")
(define_insn ""
- [(set (match_operand:XF 0 "general_operand" "=r,f,d,d,m")
- (match_operand:XF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
- "register_operand (operands[0], XFmode)
- || register_operand (operands[1], XFmode)"
+ [(set (match_operand:TF 0 "general_operand" "=r,f,d,d,m")
+ (match_operand:TF 1 "fpmove_src_operand" "r,GH,F,m,d"))]
+ "register_operand (operands[0], TFmode)
+ || register_operand (operands[1], TFmode)"
"*
{
switch (which_alternative)
@@ -2119,9 +2119,9 @@
}"
[(set_attr "type" "move,move,load,fpload,fpstore")])
-(define_insn "extendsfxf2"
- [(set (match_operand:XF 0 "register_operand" "=f,d")
- (float_extend:XF
+(define_insn "extendsftf2"
+ [(set (match_operand:TF 0 "register_operand" "=f,d")
+ (float_extend:TF
(match_operand:SF 1 "register_operand" "d,f")))]
"TARGET_NUMERICS"
"@
@@ -2129,9 +2129,9 @@
movre %1,%0"
[(set_attr "type" "fpmove")])
-(define_insn "extenddfxf2"
- [(set (match_operand:XF 0 "register_operand" "=f,d")
- (float_extend:XF
+(define_insn "extenddftf2"
+ [(set (match_operand:TF 0 "register_operand" "=f,d")
+ (float_extend:TF
(match_operand:DF 1 "register_operand" "d,f")))]
"TARGET_NUMERICS"
"@
@@ -2139,85 +2139,85 @@
movre %1,%0"
[(set_attr "type" "fpmove")])
-(define_insn "truncxfdf2"
+(define_insn "trunctfdf2"
[(set (match_operand:DF 0 "register_operand" "=d")
(float_truncate:DF
- (match_operand:XF 1 "register_operand" "f")))]
+ (match_operand:TF 1 "register_operand" "f")))]
"TARGET_NUMERICS"
"movrl %1,%0"
[(set_attr "type" "fpmove")])
-(define_insn "truncxfsf2"
+(define_insn "trunctfsf2"
[(set (match_operand:SF 0 "register_operand" "=d")
(float_truncate:SF
- (match_operand:XF 1 "register_operand" "f")))]
+ (match_operand:TF 1 "register_operand" "f")))]
"TARGET_NUMERICS"
"movr %1,%0"
[(set_attr "type" "fpmove")])
-(define_insn "floatsixf2"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (float:XF (match_operand:SI 1 "register_operand" "d")))]
+(define_insn "floatsitf2"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (float:TF (match_operand:SI 1 "register_operand" "d")))]
"TARGET_NUMERICS"
"cvtir %1,%0"
[(set_attr "type" "fpcvt")])
-(define_insn "fix_truncxfsi2"
+(define_insn "fix_trunctfsi2"
[(set (match_operand:SI 0 "register_operand" "=d")
- (fix:SI (fix:XF (match_operand:XF 1 "register_operand" "f"))))]
+ (fix:SI (fix:TF (match_operand:TF 1 "register_operand" "f"))))]
"TARGET_NUMERICS"
"cvtzri %1,%0"
[(set_attr "type" "fpcvt")])
-(define_insn "fixuns_truncxfsi2"
+(define_insn "fixuns_trunctfsi2"
[(set (match_operand:SI 0 "register_operand" "=d")
- (unsigned_fix:SI (fix:XF (match_operand:XF 1 "register_operand" "f"))))]
+ (unsigned_fix:SI (fix:TF (match_operand:TF 1 "register_operand" "f"))))]
"TARGET_NUMERICS"
"cvtzri %1,%0"
[(set_attr "type" "fpcvt")])
-(define_insn "addxf3"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (plus:XF (match_operand:XF 1 "nonmemory_operand" "%fGH")
- (match_operand:XF 2 "nonmemory_operand" "fGH")))]
+(define_insn "addtf3"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (plus:TF (match_operand:TF 1 "nonmemory_operand" "%fGH")
+ (match_operand:TF 2 "nonmemory_operand" "fGH")))]
"TARGET_NUMERICS"
"addr %1,%2,%0"
[(set_attr "type" "fpadd")])
-(define_insn "subxf3"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (minus:XF (match_operand:XF 1 "nonmemory_operand" "fGH")
- (match_operand:XF 2 "nonmemory_operand" "fGH")))]
+(define_insn "subtf3"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (minus:TF (match_operand:TF 1 "nonmemory_operand" "fGH")
+ (match_operand:TF 2 "nonmemory_operand" "fGH")))]
"TARGET_NUMERICS"
"subr %2,%1,%0"
[(set_attr "type" "fpadd")])
-(define_insn "mulxf3"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (mult:XF (match_operand:XF 1 "nonmemory_operand" "%fGH")
- (match_operand:XF 2 "nonmemory_operand" "fGH")))]
+(define_insn "multf3"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (mult:TF (match_operand:TF 1 "nonmemory_operand" "%fGH")
+ (match_operand:TF 2 "nonmemory_operand" "fGH")))]
"TARGET_NUMERICS"
"mulr %1,%2,%0"
[(set_attr "type" "fpmul")])
-(define_insn "divxf3"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (div:XF (match_operand:XF 1 "nonmemory_operand" "fGH")
- (match_operand:XF 2 "nonmemory_operand" "fGH")))]
+(define_insn "divtf3"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (div:TF (match_operand:TF 1 "nonmemory_operand" "fGH")
+ (match_operand:TF 2 "nonmemory_operand" "fGH")))]
"TARGET_NUMERICS"
"divr %2,%1,%0"
[(set_attr "type" "fpdiv")])
-(define_insn "negxf2"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (neg:XF (match_operand:XF 1 "register_operand" "f")))]
+(define_insn "negtf2"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (neg:TF (match_operand:TF 1 "register_operand" "f")))]
"TARGET_NUMERICS"
"subr %1,0f0.0,%0"
[(set_attr "type" "fpadd")])
-(define_insn "absxf2"
- [(set (match_operand:XF 0 "register_operand" "=f")
- (abs:XF (match_operand:XF 1 "register_operand" "f")))]
+(define_insn "abstf2"
+ [(set (match_operand:TF 0 "register_operand" "=f")
+ (abs:TF (match_operand:TF 1 "register_operand" "f")))]
"(TARGET_NUMERICS)"
"cpysre %1,0f0.0,%0"
[(set_attr "type" "fpmove")])
@@ -2292,8 +2292,8 @@
""
"
{
- emit_insn (gen_call_internal (operands[0], operands[1],
- virtual_outgoing_args_rtx));
+ emit_call_insn (gen_call_internal (operands[0], operands[1],
+ virtual_outgoing_args_rtx));
DONE;
}")
@@ -2322,8 +2322,9 @@
""
"
{
- emit_insn (gen_call_value_internal (operands[0], operands[1], operands[2],
- virtual_outgoing_args_rtx));
+ emit_call_insn (gen_call_value_internal (operands[0], operands[1],
+ operands[2],
+ virtual_outgoing_args_rtx));
DONE;
}")
diff --git a/gcc/config/ia64/aix.h b/gcc/config/ia64/aix.h
index 40b654836d1..c9dca9c4f12 100644
--- a/gcc/config/ia64/aix.h
+++ b/gcc/config/ia64/aix.h
@@ -71,32 +71,36 @@ Boston, MA 02111-1307, USA. */
/* Define this so we can compile MS code for use with WINE. */
#define HANDLE_PRAGMA_PACK_PUSH_POP
+/* Target OS builtins. */
+#define TARGET_OS_CPP_BUILTINS() \
+do { \
+ if (flag_iso) \
+ builtin_define("_ANSI_C_SOURCE"); \
+ builtin_define("_AIX"); \
+ builtin_define("_AIX64"); \
+ builtin_define("unix"); \
+ builtin_assert("system=unix"); \
+ builtin_assert("system=aix"); \
+ builtin_define("__64BIT__"); \
+ builtin_define("_LONG_LONG"); \
+ builtin_define("_IA64"); \
+ builtin_define("__int128=__size128_t"); \
+ if (c_language == clk_cplusplus) \
+ { \
+ builtin_define("_XOPEN_SOURCE=500"); \
+ builtin_define("_XOPEN_SOURCE_EXTENDED=1"); \
+ builtin_define("_LARGE_FILE_API"); \
+ builtin_define("_ALL_SOURCE"); \
+ } \
+} while (0)
+
/* A C string constant that tells the GNU CC driver program options to pass to
CPP. It can also specify how to translate options you give to GNU CC into
options for GNU CC to pass to the CPP. */
-/* If -ansi, we need to define _ANSI_C_SOURCE to get the right headers. */
#undef CPP_SPEC
#define CPP_SPEC "\
-%{mcpu=itanium:-D__itanium__} %{mbig-endian:-D__BIG_ENDIAN__} \
-%{ansi:-D_ANSI_C_SOURCE} \
-%{posix:-D_POSIX_SOURCE} \
-%{cpp_cpu}"
-
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "\
- -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
-#define CPLUSPLUS_CPP_SPEC \
- "-D_XOPEN_SOURCE=500 \
- -D_XOPEN_SOURCE_EXTENDED=1 \
- -D_LARGE_FILE_API \
- -D_ALL_SOURCE \
- %{cpp_cpu}"
+%{posix:-D_POSIX_SOURCE}"
/* Define this for shared library support. */
diff --git a/gcc/config/ia64/elf.h b/gcc/config/ia64/elf.h
index af6d9176a7c..e30090d9c27 100644
--- a/gcc/config/ia64/elf.h
+++ b/gcc/config/ia64/elf.h
@@ -5,12 +5,6 @@
#define TARGET_VERSION fprintf (stderr, " (IA-64) ELF");
-/* Define this to be a string constant containing `-D' options to define the
- predefined macros that identify this machine and system. These macros will
- be predefined unless the `-ansi' option is specified. */
-/* ??? This is undefed in svr4.h. */
-#define CPP_PREDEFINES "-Dia64 -Amachine=ia64"
-
/* A C string constant that tells the GNU CC driver program options to pass to
the assembler. It can also specify how to translate options you give to GNU
CC into options for GNU CC to pass to the assembler. */
diff --git a/gcc/config/ia64/hpux.h b/gcc/config/ia64/hpux.h
index 561d629d64b..1b0f653f612 100644
--- a/gcc/config/ia64/hpux.h
+++ b/gcc/config/ia64/hpux.h
@@ -25,26 +25,29 @@ Boston, MA 02111-1307, USA. */
#define TARGET_VERSION fprintf (stderr, " (IA-64) HP-UX");
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "\
- -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
- which is a primitive type in HP C but does not exist in GNU C. Same
- for __float80 and __float128. These types appear in HP-UX header
- files and so must have some definition. */
-
-#undef CPP_SPEC
-#define CPP_SPEC "\
- %{mcpu=itanium:-D__itanium__} \
- %{mlp64:-D__LP64__ -D_LP64} \
- %{!ansi:%{!std=c*:%{!std=i*: -D_HPUX_SOURCE -D__STDC_EXT__}}} \
- -D__fpreg=long\\ double \
- -D__float80=long\\ double \
- -D__float128=long\\ double"
+/* Target OS builtins. */
+/* -D__fpreg=long double is needed to compensate for
+ the lack of __fpreg which is a primative type in
+ HP C but does not exist in GNU C. */
+#define TARGET_OS_CPP_BUILTINS() \
+do { \
+ builtin_assert("system=hpux"); \
+ builtin_assert("system=posix"); \
+ builtin_assert("system=unix"); \
+ builtin_define_std("hpux"); \
+ builtin_define_std("unix"); \
+ builtin_define("__IA64__"); \
+ builtin_define("_LONGLONG"); \
+ builtin_define("_UINT128_T"); \
+ builtin_define("__fpreg=long double"); \
+ builtin_define("__float80=long double"); \
+ builtin_define("__float128=long double"); \
+ if (c_language == clk_cplusplus || !flag_iso) \
+ { \
+ builtin_define("_HPUX_SOURCE"); \
+ builtin_define("__STDC_EXT__"); \
+ } \
+} while (0)
#undef ASM_EXTRA_SPEC
#define ASM_EXTRA_SPEC "%{milp32:-milp32} %{mlp64:-mlp64}"
@@ -52,24 +55,37 @@ Boston, MA 02111-1307, USA. */
#undef ENDFILE_SPEC
#undef STARTFILE_SPEC
-#ifdef CROSS_COMPILE
-#define STARTFILE_SPEC "%{!shared:crt0%O%s}"
-#else
-#define STARTFILE_SPEC "/usr/ccs/lib/hpux64/crt0%O"
+#define STARTFILE_SPEC "%{!shared:%{static:crt0%O%s}}"
+
+#ifndef CROSS_COMPILE
+#define STARTFILE_PREFIX_SPEC \
+ "%{mlp64: /usr/ccs/lib/hpux64/} \
+ %{!mlp64: /usr/ccs/lib/hpux32/}"
#endif
#undef LINK_SPEC
-#define LINK_SPEC "\
- +Accept TypeMismatch \
- %{shared:-b} \
- %{!shared: \
- -u main \
- %{!static: \
- %{rdynamic:-export-dynamic}} \
- %{static:-static}}"
+#define LINK_SPEC \
+ "+Accept TypeMismatch \
+ %{shared:-b} \
+ %{!shared: \
+ -u main \
+ %{static:-noshared}}"
#undef LIB_SPEC
-#define LIB_SPEC "%{!shared:%{!symbolic:-lc}}"
+#define LIB_SPEC \
+ "%{!shared: \
+ %{p:%{!mlp64:-L/usr/lib/hpux32/libp} \
+ %{mlp64:-L/usr/lib/hpux64/libp} -lprof} \
+ %{pg:%{!mlp64:-L/usr/lib/hpux32/libp} \
+ %{mlp64:-L/usr/lib/hpux64/libp} -lgprof} \
+ %{!symbolic:-lc}}"
+
+#ifndef CROSS_COMPILE
+#undef LIBGCC_SPEC
+#define LIBGCC_SPEC \
+ "%{shared-libgcc:%{!mlp64:-lgcc_s_hpux32}%{mlp64:-lgcc_s_hpux64} -lgcc} \
+ %{!shared-libgcc:-lgcc}"
+#endif
#undef SUBTARGET_SWITCHES
#define SUBTARGET_SWITCHES \
@@ -85,15 +101,11 @@ Boston, MA 02111-1307, USA. */
#define JMP_BUF_SIZE (8 * 76)
-#undef READONLY_DATA_SECTION_ASM_OP
-#define READONLY_DATA_SECTION_ASM_OP \
- "\t.section\t.rodata,\t\"a\",\t\"progbits\""
-
#undef BITS_BIG_ENDIAN
#define BITS_BIG_ENDIAN 1
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_DWARF2_ASM | MASK_BIG_ENDIAN)
+#define TARGET_DEFAULT (MASK_DWARF2_ASM | MASK_BIG_ENDIAN | MASK_ILP32)
/* This needs to be set to force structure arguments with a single
field to be treated as structures and not as the type of their
@@ -103,6 +115,17 @@ Boston, MA 02111-1307, USA. */
structure handling, this macro simply ensures that single field
structures are always treated like structures. */
+/* ASM_OUTPUT_EXTERNAL_LIBCALL defaults to just a globalize_label call,
+ but that doesn't put out the @function type information which causes
+ shared library problems. */
+
+#undef ASM_OUTPUT_EXTERNAL_LIBCALL
+#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
+do { \
+ (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0)); \
+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, XSTR (FUN, 0), "function"); \
+} while (0)
+
#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) 1
/* Override the setting of FUNCTION_ARG_REG_LITTLE_ENDIAN in
@@ -121,3 +144,41 @@ Boston, MA 02111-1307, USA. */
#undef PAD_VARARGS_DOWN
#define PAD_VARARGS_DOWN (!AGGREGATE_TYPE_P (type))
+
+#define REGISTER_TARGET_PRAGMAS(PFILE) \
+ cpp_register_pragma (PFILE, 0, "builtin", ia64_hpux_handle_builtin_pragma)
+
+/* Tell ia64.c that we are using the HP linker and we should delay output of
+ function extern declarations so that we don't output them for functions
+ which are never used (and may not be defined). */
+
+#undef TARGET_HPUX_LD
+#define TARGET_HPUX_LD 1
+
+/* Put out the needed function declarations at the end. */
+
+#define ASM_FILE_END(STREAM) ia64_hpux_asm_file_end(STREAM)
+
+#undef CTORS_SECTION_ASM_OP
+#define CTORS_SECTION_ASM_OP "\t.section\t.init_array,\t\"aw\",\"init_array\""
+
+#undef DTORS_SECTION_ASM_OP
+#define DTORS_SECTION_ASM_OP "\t.section\t.fini_array,\t\"aw\",\"fini_array\""
+
+#undef READONLY_DATA_SECTION_ASM_OP
+#define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata,\t\"a\",\t\"progbits\""
+
+#undef DATA_SECTION_ASM_OP
+#define DATA_SECTION_ASM_OP "\t.section\t.data,\t\"aw\",\t\"progbits\""
+
+#undef SDATA_SECTION_ASM_OP
+#define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\t\"asw\",\t\"progbits\""
+
+#undef BSS_SECTION_ASM_OP
+#define BSS_SECTION_ASM_OP "\t.section\t.bss,\t\"aw\",\t\"nobits\""
+
+#undef SBSS_SECTION_ASM_OP
+#define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\t\"asw\",\t\"nobits\""
+
+#undef TEXT_SECTION_ASM_OP
+#define TEXT_SECTION_ASM_OP "\t.section\t.text,\t\"ax\",\t\"progbits\""
diff --git a/gcc/config/ia64/hpux_longdouble.h b/gcc/config/ia64/hpux_longdouble.h
index bfc12d4fc70..d1af4a0d418 100644
--- a/gcc/config/ia64/hpux_longdouble.h
+++ b/gcc/config/ia64/hpux_longdouble.h
@@ -18,8 +18,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. */
-/* Tell real.c that we are not using INTEL_EXTENDED_IEEE_FORMAT */
-
+/* We are using IEEE quad precision, not a double-extended with padding. */
#undef INTEL_EXTENDED_IEEE_FORMAT
#define INTEL_EXTENDED_IEEE_FORMAT 0
diff --git a/gcc/config/ia64/ia64-c.c b/gcc/config/ia64/ia64-c.c
new file mode 100644
index 00000000000..c19a5860532
--- /dev/null
+++ b/gcc/config/ia64/ia64-c.c
@@ -0,0 +1,190 @@
+/* Definitions of C specific functions for GNU compiler.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Contributed by Steve Ellcey <sje@cup.hp.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. */
+
+#include "config.h"
+#include "system.h"
+#include "tree.h"
+#include "cpplib.h"
+#include "c-common.h"
+#include "c-pragma.h"
+#include "toplev.h"
+
+static void ia64_hpux_add_pragma_builtin PARAMS ((tree func));
+
+void
+ia64_hpux_handle_builtin_pragma (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ /* #pragma builtin name, name, name */
+
+ enum cpp_ttype type;
+ tree x;
+
+ type = c_lex (&x);
+ while (type == CPP_NAME)
+ {
+ ia64_hpux_add_pragma_builtin (x);
+ type = c_lex (&x);
+ if (type == CPP_COMMA)
+ type = c_lex (&x);
+ }
+ if (type != CPP_EOF)
+ warning ("malformed #pragma builtin");
+}
+
+/* List of standard math functions which do not set matherr by default
+ and which have a different version which does set errno and which we
+ want to call *if* we have seen an extern for the routine and we have
+ asked for strict C89 compatibility. */
+
+typedef struct c89_mathlib_names
+{
+ const char *realname; /* User visible function name. */
+ const char *c89name; /* libm special name needed to set errno. */
+} c89_mathlib_names;
+
+static const c89_mathlib_names c89_mathlib_name_list [] =
+{
+ {"acos", "_Acos_e#"},
+ {"acosd", "_Acosd_e#"},
+ {"acosdf", "_Acosdf_e#"},
+ {"acosdl", "_Acosdl_e#"},
+ {"acosdw", "_Acosdw_e#"},
+ {"acosf", "_Acosf_e#"},
+ {"acosh", "_Acosh_e#"},
+ {"acoshf", "_Acoshf_e#"},
+ {"acoshl", "_Acoshl_e#"},
+ {"acoshw", "_Acoshw_e#"},
+ {"acosl", "_Acosl_e#"},
+ {"acosw", "_Acosw_e#"},
+ {"asin", "_Asin_e#"},
+ {"asind", "_Asind_e#"},
+ {"asindf", "_Asindf_e#"},
+ {"asindl", "_Asindl_e#"},
+ {"asindw", "_Asindw_e#"},
+ {"asinf", "_Asinf_e#"},
+ {"asinl", "_Asinl_e#"},
+ {"asinw", "_Asinw_e#"},
+ {"atanh", "_Atanh_e#"},
+ {"atanhf", "_Atanhf_e#"},
+ {"atanhl", "_Atanhl_e#"},
+ {"atanhw", "_Atanhw_e#"},
+ {"cosh", "_Cosh_e#"},
+ {"coshf", "_Coshf_e#"},
+ {"coshl", "_Coshl_e#"},
+ {"coshw", "_Coshw_e#"},
+ {"exp2", "_Exp2_e#"},
+ {"exp2f", "_Exp2f_e#"},
+ {"exp2l", "_Exp2l_e#"},
+ {"exp2w", "_Exp2w_e#"},
+ {"exp", "_Exp_e#"},
+ {"expf", "_Expf_e#"},
+ {"expl", "_Expl_e#"},
+ {"expm1", "_Expm1_e#"},
+ {"expm1f", "_Expm1f_e#"},
+ {"expm1l", "_Expm1l_e#"},
+ {"expm1w", "_Expm1w_e#"},
+ {"expw", "_Expw_e#"},
+ {"fmod", "_Fmod_e#"},
+ {"fmodf", "_Fmodf_e#"},
+ {"fmodl", "_Fmodl_e#"},
+ {"fmodw", "_Fmodw_e#"},
+ {"gamma", "_Gamma_e#"},
+ {"gammaf", "_Gammaf_e#"},
+ {"gammal", "_Gammal_e#"},
+ {"gammaw", "_Gammaw_e#"},
+ {"ldexp", "_Ldexp_e#"},
+ {"ldexpf", "_Ldexpf_e#"},
+ {"ldexpl", "_Ldexpl_e#"},
+ {"ldexpw", "_Ldexpw_e#"},
+ {"lgamma", "_Lgamma_e#"},
+ {"lgammaf", "_Lgammaf_e#"},
+ {"lgammal", "_Lgammal_e#"},
+ {"lgammaw", "_Lgammaw_e#"},
+ {"log10", "_Log10_e#"},
+ {"log10f", "_Log10f_e#"},
+ {"log10l", "_Log10l_e#"},
+ {"log10w", "_Log10w_e#"},
+ {"log1p", "_Log1p_e#"},
+ {"log1pf", "_Log1pf_e#"},
+ {"log1pl", "_Log1pl_e#"},
+ {"log1pw", "_Log1pw_e#"},
+ {"log2", "_Log2_e#"},
+ {"log2f", "_Log2f_e#"},
+ {"log2l", "_Log2l_e#"},
+ {"log2w", "_Log2w_e#"},
+ {"log", "_Log_e#"},
+ {"logb", "_Logb_e#"},
+ {"logbf", "_Logbf_e#"},
+ {"logbl", "_Logbl_e#"},
+ {"logbw", "_Logbw_e#"},
+ {"logf", "_Logf_e#"},
+ {"logl", "_Logl_e#"},
+ {"logw", "_Logw_e#"},
+ {"nextafter", "_Nextafter_e#"},
+ {"nextafterf", "_Nextafterf_e#"},
+ {"nextafterl", "_Nextafterl_e#"},
+ {"nextafterw", "_Nextafterw_e#"},
+ {"pow", "_Pow_e#"},
+ {"powf", "_Powf_e#"},
+ {"powl", "_Powl_e#"},
+ {"poww", "_Poww_e#"},
+ {"remainder", "_Remainder_e#"},
+ {"remainderf", "_Remainderf_e#"},
+ {"remainderl", "_Remainderl_e#"},
+ {"remainderw", "_Remainderw_e#"},
+ {"scalb", "_Scalb_e#"},
+ {"scalbf", "_Scalbf_e#"},
+ {"scalbl", "_Scalbl_e#"},
+ {"scalbw", "_Scalbw_e#"},
+ {"sinh", "_Sinh_e#"},
+ {"sinhf", "_Sinhf_e#"},
+ {"sinhl", "_Sinhl_e#"},
+ {"sinhw", "_Sinhw_e#"},
+ {"sqrt", "_Sqrt_e#"},
+ {"sqrtf", "_Sqrtf_e#"},
+ {"sqrtl", "_Sqrtl_e#"},
+ {"sqrtw", "_Sqrtw_e#"},
+ {"tgamma", "_Tgamma_e#"},
+ {"tgammaf", "_Tgammaf_e#"},
+ {"tgammal", "_Tgammal_e#"},
+ {"tgammaw", "_Tgammaw_e#"}
+};
+
+static void
+ia64_hpux_add_pragma_builtin (func)
+ tree func;
+{
+ size_t i;
+
+ if (!flag_isoc94 && flag_iso)
+ {
+ for (i = 0; i < ARRAY_SIZE (c89_mathlib_name_list); i++)
+ {
+ if (!strcmp(c89_mathlib_name_list[i].realname,
+ IDENTIFIER_POINTER (func)))
+ {
+ add_to_renaming_pragma_list(func,
+ get_identifier(c89_mathlib_name_list[i].c89name));
+ }
+ }
+ }
+}
diff --git a/gcc/config/ia64/ia64-protos.h b/gcc/config/ia64/ia64-protos.h
index 0244b511c9d..36af17aa70a 100644
--- a/gcc/config/ia64/ia64-protos.h
+++ b/gcc/config/ia64/ia64-protos.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler for IA-64.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -144,3 +144,9 @@ extern void sbss_section PARAMS ((void));
/* expr.h defines ARGS_SIZE_RTX and `enum direction'. */
extern enum direction ia64_hpux_function_arg_padding PARAMS ((enum machine_mode, tree));
#endif /* ARGS_SIZE_RTX */
+
+#ifdef GCC_C_PRAGMA_H
+extern void ia64_hpux_handle_builtin_pragma PARAMS ((cpp_reader *));
+#endif
+
+extern void ia64_hpux_asm_file_end PARAMS ((FILE *));
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 08a2dfacbaf..17c3fc61ac8 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -161,6 +161,8 @@ static int ia64_sched_reorder PARAMS ((FILE *, int, rtx *, int *, int));
static int ia64_sched_reorder2 PARAMS ((FILE *, int, rtx *, int *, int));
static int ia64_variable_issue PARAMS ((FILE *, int, rtx, int));
+static void ia64_output_mi_thunk PARAMS((FILE *, tree, HOST_WIDE_INT, tree));
+
static void ia64_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT));
static void ia64_aix_select_section PARAMS ((tree, int,
@@ -171,6 +173,9 @@ static void ia64_aix_unique_section PARAMS ((tree, int))
static void ia64_aix_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT))
ATTRIBUTE_UNUSED;
+
+static void ia64_hpux_add_extern_decl PARAMS ((const char *name))
+ ATTRIBUTE_UNUSED;
/* Table of valid machine attributes. */
static const struct attribute_spec ia64_attribute_table[] =
@@ -241,6 +246,9 @@ static const struct attribute_spec ia64_attribute_table[] =
#define TARGET_HAVE_TLS true
#endif
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK ia64_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Return 1 if OP is a valid operand for the MEM of a CALL insn. */
@@ -1038,6 +1046,10 @@ ia64_expand_load_address (dest, src, scratch)
scratch = no_new_pseudos ? temp : gen_reg_rtx (DImode);
insn = emit_insn (gen_load_symptr (temp, src, scratch));
+#ifdef POINTERS_EXTEND_UNSIGNED
+ if (GET_MODE (temp) != GET_MODE (src))
+ src = convert_memory_address (GET_MODE (temp), src);
+#endif
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, src, REG_NOTES (insn));
}
@@ -4039,8 +4051,13 @@ ia64_asm_output_external (file, decl, name)
{
int save_referenced;
- /* GNU as does not need anything here. */
- if (TARGET_GNU_AS)
+ /* GNU as does not need anything here, but the HP linker does need
+ something for external functions. */
+
+ if (TARGET_GNU_AS
+ && (!TARGET_HPUX_LD
+ || TREE_CODE (decl) != FUNCTION_DECL
+ || strstr(name, "__builtin_") == name))
return;
/* ??? The Intel assembler creates a reference that needs to be satisfied by
@@ -4055,13 +4072,18 @@ ia64_asm_output_external (file, decl, name)
|| ! strcmp (name, "__builtin_args_info"))
return;
- /* assemble_name will set TREE_SYMBOL_REFERENCED, so we must save and
- restore it. */
- save_referenced = TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl));
- if (TREE_CODE (decl) == FUNCTION_DECL)
- ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
- (*targetm.asm_out.globalize_label) (file, name);
- TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = save_referenced;
+ if (TARGET_HPUX_LD)
+ ia64_hpux_add_extern_decl (name);
+ else
+ {
+ /* assemble_name will set TREE_SYMBOL_REFERENCED, so we must save and
+ restore it. */
+ save_referenced = TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl));
+ if (TREE_CODE (decl) == FUNCTION_DECL)
+ ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
+ (*targetm.asm_out.globalize_label) (file, name);
+ TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = save_referenced;
+ }
}
/* Parse the -mfixed-range= option string. */
@@ -4169,6 +4191,10 @@ ia64_override_options ()
ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE;
init_machine_status = ia64_init_machine_status;
+
+ /* Tell the compiler which flavor of TFmode we're using. */
+ if (INTEL_EXTENDED_IEEE_FORMAT)
+ real_format_for_mode[TFmode - QFmode] = &ieee_extended_intel_128_format;
}
static enum attr_itanium_requires_unit0 ia64_safe_itanium_requires_unit0 PARAMS((rtx));
@@ -7121,24 +7147,7 @@ ia64_encode_section_info (decl, first)
is_local = (*targetm.binds_local_p) (decl);
if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
- {
- enum tls_model kind;
- if (!flag_pic)
- {
- if (is_local)
- kind = TLS_MODEL_LOCAL_EXEC;
- else
- kind = TLS_MODEL_INITIAL_EXEC;
- }
- else if (is_local)
- kind = TLS_MODEL_LOCAL_DYNAMIC;
- else
- kind = TLS_MODEL_GLOBAL_DYNAMIC;
- if (kind < flag_tls_default)
- kind = flag_tls_default;
-
- encoding = " GLil"[kind];
- }
+ encoding = " GLil"[decl_tls_model (decl)];
/* Determine if DECL will wind up in .sdata/.sbss. */
else if (is_local && ia64_in_small_data_p (decl))
encoding = 's';
@@ -8050,6 +8059,56 @@ ia64_hpux_function_arg_padding (mode, type)
: GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
? downward : upward);
}
+
+/* Linked list of all external functions that are to be emitted by GCC.
+ We output the name if and only if TREE_SYMBOL_REFERENCED is set in
+ order to avoid putting out names that are never really used. */
+
+struct extern_func_list
+{
+ struct extern_func_list *next; /* next external */
+ char *name; /* name of the external */
+} *extern_func_head = 0;
+
+static void
+ia64_hpux_add_extern_decl (name)
+ const char *name;
+{
+ struct extern_func_list *p;
+
+ p = (struct extern_func_list *) xmalloc (sizeof (struct extern_func_list));
+ p->name = xmalloc (strlen (name) + 1);
+ strcpy(p->name, name);
+ p->next = extern_func_head;
+ extern_func_head = p;
+}
+
+/* Print out the list of used global functions. */
+
+void
+ia64_hpux_asm_file_end (file)
+ FILE *file;
+{
+ while (extern_func_head)
+ {
+ const char *const real_name =
+ (* targetm.strip_name_encoding) (extern_func_head->name);
+ tree decl = get_identifier (real_name);
+
+ if (decl && ! TREE_ASM_WRITTEN (decl) && TREE_SYMBOL_REFERENCED (decl))
+ {
+ TREE_ASM_WRITTEN (decl) = 1;
+ (*targetm.asm_out.globalize_label) (file, real_name);
+ fprintf (file, "%s", TYPE_ASM_OP);
+ assemble_name (file, real_name);
+ putc (',', file);
+ fprintf (file, TYPE_OPERAND_FMT, "function");
+ putc ('\n', file);
+ }
+ extern_func_head = extern_func_head->next;
+ }
+}
+
/* Switch to the section to which we should output X. The only thing
special we do here is to honor small data. */
@@ -8105,4 +8164,39 @@ ia64_aix_select_rtx_section (mode, x, align)
flag_pic = save_pic;
}
+static void
+ia64_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ if (CONST_OK_FOR_I (delta))
+ {
+ fprintf (file, "\tadds r32 = ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, ", r32\n");
+ }
+ else
+ {
+ if (CONST_OK_FOR_J (delta))
+ {
+ fprintf (file, "\taddl r2 = ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, ", r0\n");
+ }
+ else
+ {
+ fprintf (file, "\tmovl r2 = ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, "\n");
+ }
+ fprintf (file, "\t;;\n");
+ fprintf (file, "\tadd r32 = r2, r32\n");
+ }
+ fprintf (file, "\tbr ");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "\n");
+}
+
#include "gt-ia64.h"
diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h
index 0a640d0a6e6..55ec9868051 100644
--- a/gcc/config/ia64/ia64.h
+++ b/gcc/config/ia64/ia64.h
@@ -31,14 +31,27 @@ Boston, MA 02111-1307, USA. */
/* Run-time target specifications */
+/* Target CPU builtins. */
+#define TARGET_CPU_CPP_BUILTINS() \
+do { \
+ builtin_assert("cpu=ia64"); \
+ builtin_assert("machine=ia64"); \
+ builtin_define("__ia64"); \
+ builtin_define("__ia64__"); \
+ builtin_define("__itanium__"); \
+ builtin_define("__ELF__"); \
+ if (!TARGET_ILP32) \
+ { \
+ builtin_define("_LP64"); \
+ builtin_define("__LP64__"); \
+ } \
+ if (TARGET_BIG_ENDIAN) \
+ builtin_define("__BIG_ENDIAN__"); \
+} while (0)
+
#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 ""
@@ -114,6 +127,8 @@ extern int ia64_tls_size;
#define TARGET_TLS22 (ia64_tls_size == 22)
#define TARGET_TLS64 (ia64_tls_size == 64)
+#define TARGET_HPUX_LD 0
+
/* This macro defines names of command options to set and clear bits in
`target_flags'. Its definition is an initializer with a subgrouping for
each command option. */
@@ -209,13 +224,6 @@ extern const char *ia64_tls_size_string;
/* Driver configuration */
/* A C string constant that tells the GNU CC driver program options to pass to
- CPP. It can also specify how to translate options you give to GNU CC into
- options for GNU CC to pass to the CPP. */
-
-#define CPP_SPEC \
- "%{mcpu=itanium:-D__itanium__} %{mbig-endian:-D__BIG_ENDIAN__} %(cpp_cpu)"
-
-/* A C string constant that tells the GNU CC driver program options to pass to
`cc1'. It can also specify how to translate options you give to GNU CC into
options for GNU CC to pass to the `cc1'. */
@@ -321,10 +329,10 @@ while (0)
/* Define this if you wish to imitate the way many other C compilers handle
alignment of bitfields and the structures that contain them.
- The behavior is that the type written for a bitfield (`int', `short', or
+ The behavior is that the type written for a bit-field (`int', `short', or
other integer type) imposes an alignment for the entire structure, as if the
structure really did contain an ordinary field of that type. In addition,
- the bitfield is placed within the structure so that it would fit within such
+ the bit-field is placed within the structure so that it would fit within such
a field, not crossing a boundary for it. */
#define PCC_BITFIELD_TYPE_MATTERS 1
@@ -334,11 +342,8 @@ while (0)
/* Allow pairs of registers to be used, which is the intent of the default. */
#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TImode)
-/* A code distinguishing the floating point format of the target machine. */
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
/* By default, the C++ compiler will use function addresses in the
- vtable entries. Setting this non-zero tells the compiler to use
+ vtable entries. Setting this nonzero 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
that the address of a function descriptor may be treated as a
@@ -376,9 +381,8 @@ while (0)
#define LONG_DOUBLE_TYPE_SIZE 128
-/* Tell real.c that this is the 80-bit Intel extended float format
- packaged in a 128-bit entity. */
-
+/* By default we use the 80-bit Intel extended float format packaged
+ in a 128-bit entity. */
#define INTEL_EXTENDED_IEEE_FORMAT 1
#define DEFAULT_SIGNED_CHAR 1
@@ -965,7 +969,7 @@ enum reg_class
/* Certain machines have the property that some registers cannot be copied to
some other registers without using memory. Define this macro on those
- machines to be a C expression that is non-zero if objects of mode M in
+ machines to be a C expression that is nonzero if objects of mode M in
registers of CLASS1 can only be copied to registers of class CLASS2 by
storing a register of CLASS1 into memory and loading that memory location
into a register of CLASS2. */
@@ -1195,7 +1199,7 @@ enum reg_class
{RETURN_ADDRESS_POINTER_REGNUM, BR_REG (0)}, \
}
-/* A C expression that returns non-zero if the compiler is allowed to try to
+/* A C expression that returns nonzero if the compiler is allowed to try to
replace register number FROM with register number TO. The frame pointer
is automatically handled. */
@@ -1424,39 +1428,6 @@ do { \
#define ASM_FILE_START(FILE) \
emit_safe_across_calls (FILE)
-/* A C compound statement that outputs the assembler code for a thunk function,
- used to implement C++ virtual function calls with multiple inheritance. */
-
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
-do { \
- if (CONST_OK_FOR_I (DELTA)) \
- { \
- fprintf (FILE, "\tadds r32 = "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, ", r32\n"); \
- } \
- else \
- { \
- if (CONST_OK_FOR_J (DELTA)) \
- { \
- fprintf (FILE, "\taddl r2 = "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, ", r0\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tmovl r2 = "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, "\n"); \
- } \
- fprintf (FILE, "\t;;\n"); \
- fprintf (FILE, "\tadd r32 = r2, r32\n"); \
- } \
- fprintf (FILE, "\tbr "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "\n"); \
-} while (0)
-
/* Output part N of a function descriptor for DECL. For ia64, both
words are emitted with a single relocation, so ignore N > 0. */
#define ASM_OUTPUT_FDESC(FILE, DECL, PART) \
@@ -1923,18 +1894,9 @@ do { \
sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
} while (0)
-/* A C expression to assign to OUTVAR (which is a variable of type `char *') a
- newly allocated string made from the string NAME and the number NUMBER, with
- some suitable punctuation added. */
-
/* ??? Not sure if using a ? in the name for Intel as is safe. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \
-do { \
- (OUTVAR) = (char *) alloca (strlen (NAME) + 12); \
- sprintf (OUTVAR, "%s%c%ld", (NAME), (TARGET_GNU_AS ? '.' : '?'), \
- (long)(NUMBER)); \
-} while (0)
+#define ASM_PN_FORMAT (TARGET_GNU_AS ? "%s.%lu" : "%s?%lu")
/* A C statement to output to the stdio stream STREAM assembler code which
defines (equates) the symbol NAME to have the value VALUE. */
@@ -2245,13 +2207,13 @@ do { \
/* Define this macro if GNU CC should produce dwarf version 2 format debugging
output in response to the `-g' option. */
-#define DWARF2_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
#define DWARF2_ASM_LINE_DEBUG_INFO (TARGET_DWARF2_ASM)
/* Use tags for debug info labels, so that they don't break instruction
bundles. This also avoids getting spurious DV warnings from the
- assembler. This is similar to ASM_OUTPUT_INTERNAL_LABEL, except that we
+ assembler. This is similar to (*targetm.asm_out.internal_label), except that we
add brackets around the label. */
#define ASM_OUTPUT_DEBUG_LABEL(FILE, PREFIX, NUM) \
diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md
index 75a36b3a1a0..4a256907e70 100644
--- a/gcc/config/ia64/ia64.md
+++ b/gcc/config/ia64/ia64.md
@@ -766,7 +766,7 @@
;; Floating Point Moves
;;
;; Note - Patterns for SF mode moves are compulsory, but
-;; patterns for DF are optional, as GCC can synthesise them.
+;; patterns for DF are optional, as GCC can synthesize them.
(define_expand "movsf"
[(set (match_operand:SF 0 "general_operand" "")
@@ -1244,7 +1244,7 @@
"dep %0 = %3, %0, %2, %1"
[(set_attr "itanium_class" "ishf")])
-;; Combine doesn't like to create bitfield insertions into zero.
+;; Combine doesn't like to create bit-field insertions into zero.
(define_insn "*depz_internal"
[(set (match_operand:DI 0 "gr_register_operand" "=r")
(and:DI (ashift:DI (match_operand:DI 1 "gr_register_operand" "r")
@@ -1990,6 +1990,7 @@
"INTEL_EXTENDED_IEEE_FORMAT && TARGET_INLINE_DIV"
{
rtx op1_tf, op2_tf, op0_tf, op0_di, twon34;
+ REAL_VALUE_TYPE twon34_r;
op0_tf = gen_reg_rtx (TFmode);
op0_di = gen_reg_rtx (DImode);
@@ -2005,14 +2006,9 @@
expand_float (op2_tf, operands[2], 0);
/* 2^-34 */
-#if 0
- twon34 = (CONST_DOUBLE_FROM_REAL_VALUE
- (REAL_VALUE_FROM_TARGET_SINGLE (0x2e800000), TFmode));
+ real_2expN (&twon34_r, -34);
+ twon34 = CONST_DOUBLE_FROM_REAL_VALUE (twon34_r, TFmode);
twon34 = force_reg (TFmode, twon34);
-#else
- twon34 = gen_reg_rtx (TFmode);
- convert_move (twon34, force_const_mem (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (REAL_VALUE_FROM_TARGET_SINGLE (0x2e800000), SFmode)), 0);
-#endif
emit_insn (gen_divsi3_internal (op0_tf, op1_tf, op2_tf, twon34));
@@ -2051,6 +2047,7 @@
"INTEL_EXTENDED_IEEE_FORMAT && TARGET_INLINE_DIV"
{
rtx op1_tf, op2_tf, op0_tf, op0_di, twon34;
+ REAL_VALUE_TYPE twon34_r;
op0_tf = gen_reg_rtx (TFmode);
op0_di = gen_reg_rtx (DImode);
@@ -2066,14 +2063,9 @@
expand_float (op2_tf, operands[2], 1);
/* 2^-34 */
-#if 0
- twon34 = (CONST_DOUBLE_FROM_REAL_VALUE
- (REAL_VALUE_FROM_TARGET_SINGLE (0x2e800000), TFmode));
+ real_2expN (&twon34_r, -34);
+ twon34 = CONST_DOUBLE_FROM_REAL_VALUE (twon34_r, TFmode);
twon34 = force_reg (TFmode, twon34);
-#else
- twon34 = gen_reg_rtx (TFmode);
- convert_move (twon34, force_const_mem (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (REAL_VALUE_FROM_TARGET_SINGLE (0x2e800000), SFmode)), 0);
-#endif
emit_insn (gen_divsi3_internal (op0_tf, op1_tf, op2_tf, twon34));
diff --git a/gcc/config/ia64/linux.h b/gcc/config/ia64/linux.h
index 07882cd1272..e1d60f7d8c4 100644
--- a/gcc/config/ia64/linux.h
+++ b/gcc/config/ia64/linux.h
@@ -9,10 +9,15 @@
#undef CC1_SPEC
#define CC1_SPEC "%{profile:-p} %{G*}"
-/* ??? Maybe this should be in sysv4.h? */
-#define CPP_PREDEFINES "\
- -D__gnu_linux__ -D__linux -D__linux__ -D_LONGLONG \
- -Dlinux -Dunix -Asystem=linux"
+/* Target OS builtins. */
+#define TARGET_OS_CPP_BUILTINS() \
+do { \
+ builtin_assert("system=linux"); \
+ builtin_define_std("linux"); \
+ builtin_define_std("unix"); \
+ builtin_define("__gnu_linux__"); \
+ builtin_define("_LONGLONG"); \
+} while (0)
/* Need to override linux.h STARTFILE_SPEC, since it has crtbeginT.o in. */
#undef STARTFILE_SPEC
diff --git a/gcc/config/ia64/quadlib.c b/gcc/config/ia64/quadlib.c
index fac3b28084b..e55c97d2be9 100644
--- a/gcc/config/ia64/quadlib.c
+++ b/gcc/config/ia64/quadlib.c
@@ -1,5 +1,5 @@
/* Subroutines for long double support.
- 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,8 +27,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. */
-int _U_Qfcmp (long double a, long double b, int);
-long _U_Qfcnvfxt_quad_to_sgl (long double);
+extern int _U_Qfcmp (long double a, long double b, int);
+
+int _U_Qfeq (long double, long double);
+int _U_Qfne (long double, long double);
+int _U_Qfgt (long double, long double);
+int _U_Qfge (long double, long double);
+int _U_Qflt (long double, long double);
+int _U_Qfle (long double, long double);
+int _U_Qfcomp (long double, long double);
int
_U_Qfeq (long double a, long double b)
@@ -74,9 +81,3 @@ _U_Qfcomp (long double a, long double b)
return (_U_Qfcmp (a, b, 22) != 0 ? 1 : -1);
}
-
-long double
-_U_Qfneg (long double a)
-{
- return (0.0L - a);
-}
diff --git a/gcc/config/ia64/t-aix b/gcc/config/ia64/t-aix
index 2e738f9b9e1..7b6df46a5d0 100644
--- a/gcc/config/ia64/t-aix
+++ b/gcc/config/ia64/t-aix
@@ -6,11 +6,7 @@ CRTSTUFF_T_CFLAGS_S = -fPIC
TARGET_LIBGCC2_CFLAGS = -fPIC -D__64BIT__ -D_LONG_LONG -D_IA64 -D__int128=__size128_t
LIB2ADDEH += $(srcdir)/config/ia64/unwind-aix.c
-# Add crt[in].o to the list defined in t-ia64. These files provide
-# endpoints for crtbegin/end.
-
-EXTRA_PARTS=crti.o crtn.o crtbegin.o crtend.o crtbeginS.o crtendS.o
-
+# Assemble startup files.
crti.o: $(srcdir)/config/ia64/crti.asm $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -o crti.o -x assembler $(srcdir)/config/ia64/crti.asm
crtn.o: $(srcdir)/config/ia64/crtn.asm $(GCC_PASSES)
diff --git a/gcc/config/ia64/t-hpux b/gcc/config/ia64/t-hpux
index 9f8296ba892..d8201f9d5e1 100644
--- a/gcc/config/ia64/t-hpux
+++ b/gcc/config/ia64/t-hpux
@@ -13,3 +13,36 @@ LIB2FUNCS_EXTRA=quadlib.c
quadlib.c: $(srcdir)/config/ia64/quadlib.c
cat $(srcdir)/config/ia64/quadlib.c > quadlib.c
+
+# We get an undefined main when building a cross compiler because our
+# linkspec has "-u main" and we want that for linking but it makes
+# LIBGCC1_TEST fail because it uses -nostdlib -nostartup.
+
+LIBGCC1_TEST =
+
+# Don't run fix-headers. HP-UX headers are standards conformant
+# and don't need to be fixed up in this way.
+# If we remove this (and run fix-headers) we should define FIXPROTO_DEFINES
+# and also fix the definition of putenv in sys-protos.h (const char not char).
+
+STMP_FIXPROTO =
+
+# We do not want to include the EH stuff that linux uses, we want to use
+# the HP-UX libunwind library.
+
+LIB2ADDEH =
+
+SHLIB_EXT = .so
+SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
+ -Wl,+h,@shlib_base_name@.so.0 \
+ -o @shlib_base_name@.so @multilib_flags@ @shlib_objs@ -lc && \
+ rm -f @shlib_base_name@.so.0 && \
+ $(LN_S) @shlib_base_name@.so @shlib_base_name@.so.0
+# $(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_base_name@.so $$(slibdir)/@shlib_base_name@.so.0; \
+ rm -f $$(slibdir)/@shlib_base_name@.so; \
+ $(LN_S) @shlib_base_name@.so.0 $$(slibdir)/@shlib_base_name@.so; \
+ chmod +x $$(slibdir)/@shlib_base_name@.so
+
+SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
diff --git a/gcc/config/ia64/t-ia64 b/gcc/config/ia64/t-ia64
index 41c0235c17c..068d5908e45 100644
--- a/gcc/config/ia64/t-ia64
+++ b/gcc/config/ia64/t-ia64
@@ -19,11 +19,6 @@ LIB1ASMFUNCS = __divtf3 __divdf3 __divsf3 \
SHLIB_MAPFILES += $(srcdir)/config/ia64/libgcc-ia64.ver
-# For svr4 we build crtbegin.o and crtend.o which serve to add begin and
-# end labels to the .ctors and .dtors section when we link using gcc.
-
-EXTRA_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o
-
# Effectively disable the crtbegin/end rules using crtstuff.c
T = disable
@@ -40,3 +35,7 @@ crtfastmath.o: $(srcdir)/config/ia64/crtfastmath.c $(GCC_PASSES)
$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -c -o crtfastmath.o $(srcdir)/config/ia64/crtfastmath.c
LIB2ADDEH = $(srcdir)/config/ia64/unwind-ia64.c $(srcdir)/unwind-sjlj.c
+
+ia64-c.o: $(srcdir)/config/ia64/ia64-c.c $(CONFIG_H) $(SYSTEM_H) \
+ $(TREE_H) $(CPPLIB_H) $(C_COMMON_H) c-pragma.h toplev.h
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
diff --git a/gcc/config/ia64/unwind-ia64.c b/gcc/config/ia64/unwind-ia64.c
index daf02a2cd30..e55f1f8c363 100644
--- a/gcc/config/ia64/unwind-ia64.c
+++ b/gcc/config/ia64/unwind-ia64.c
@@ -143,7 +143,7 @@ typedef struct unw_state_record
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 char *imask; /* imask of spill_mask record or NULL */
unsigned long pr_val; /* predicate values */
unsigned long pr_mask; /* predicate mask */
long spill_offset; /* psp-relative offset for spill base */
diff --git a/gcc/config/interix.h b/gcc/config/interix.h
index 9100e01adb7..34f2e62d15c 100644
--- a/gcc/config/interix.h
+++ b/gcc/config/interix.h
@@ -70,19 +70,6 @@ for windows/multi thread */
&& strcmp (STR, "Tbss"))
-#if 0
-/* don't do this until we can sort out the default path issues. MK */
-#undef STANDARD_EXEC_PREFIX
-#define STANDARD_EXEC_PREFIX ""
-
-#undef STANDARD_STARTFILE_PREFIX
-#define STANDARD_STARTFILE_PREFIX ""
-
-#undef TOOLDIR_BASE_PREFIX
-#define TOOLDIR_BASE_PREFIX ""
-
-#endif /* 0 */
-
#define STDC_0_IN_SYSTEM_HEADERS 1
#define HANDLE_SYSV_PRAGMA
@@ -90,8 +77,8 @@ for windows/multi thread */
/* Names to predefine in the preprocessor for this target machine. */
-#define DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
@@ -104,7 +91,7 @@ for windows/multi thread */
#define WCHAR_TYPE_SIZE 16
/* Our strategy for finding global constructors is a bit different, although
- not a lot. */
+ not a lot. */
#define DO_GLOBAL_CTORS_BODY \
do { \
int i; \
diff --git a/gcc/config/ip2k/ip2k-protos.h b/gcc/config/ip2k/ip2k-protos.h
index 3d9c1679367..2ec040007a1 100644
--- a/gcc/config/ip2k/ip2k-protos.h
+++ b/gcc/config/ip2k/ip2k-protos.h
@@ -21,14 +21,14 @@
extern void asm_file_start PARAMS ((FILE *));
extern void asm_file_end PARAMS ((FILE *));
-extern void function_prologue PARAMS ((FILE *, int));
-extern void function_epilogue PARAMS ((FILE *, int));
+extern void function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
+extern void function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
extern int find_one_set_bit_p PARAMS ((HOST_WIDE_INT));
extern int find_one_clear_bit_p PARAMS ((HOST_WIDE_INT));
#ifdef TREE_CODE
extern void unique_section PARAMS ((tree, int));
-extern void encode_section_info PARAMS ((tree));
+extern void encode_section_info PARAMS ((tree, int));
extern void asm_output_section_name PARAMS ((FILE *, tree, const char *,
int));
extern int valid_machine_type_attribute PARAMS ((tree, tree, tree, tree));
diff --git a/gcc/config/ip2k/ip2k.c b/gcc/config/ip2k/ip2k.c
index a41a7b6d2d1..c0a643ae1d1 100644
--- a/gcc/config/ip2k/ip2k.c
+++ b/gcc/config/ip2k/ip2k.c
@@ -52,6 +52,7 @@
#define CHAIN_FRAMES (frame_pointer_needed || FRAME_POINTER_REQUIRED)
static int ip2k_naked_function_p PARAMS ((tree));
+#ifdef IP2K_MD_REORG_PASS
static void mdr_resequence_xy_yx PARAMS ((rtx));
static void mdr_pres_replace_and_recurse PARAMS ((rtx, rtx, rtx));
static void mdr_propagate_reg_equivs_sequence PARAMS ((rtx, rtx, rtx));
@@ -59,10 +60,7 @@ static void mdr_propagate_reg_equivs PARAMS ((rtx));
static int track_dp_reload PARAMS ((rtx , rtx *, int , int));
static void mdr_try_dp_reload_elim PARAMS ((rtx));
static void mdr_try_move_dp_reload PARAMS ((rtx));
-static int ip2k_check_can_adjust_stack_ref PARAMS ((rtx, int));
-static void ip2k_adjust_stack_ref PARAMS ((rtx *, int));
static void mdr_try_move_pushes PARAMS ((rtx));
-static int ip2k_xexp_not_uses_reg_for_mem PARAMS ((rtx, unsigned int));
static void mdr_try_propagate_clr_sequence PARAMS ((rtx, unsigned int));
static void mdr_try_propagate_clr PARAMS ((rtx));
static void mdr_try_propagate_move_sequence PARAMS ((rtx, rtx, rtx));
@@ -70,6 +68,10 @@ static void mdr_try_propagate_move PARAMS ((rtx));
static void mdr_try_remove_redundant_insns PARAMS ((rtx));
static int track_w_reload PARAMS ((rtx, rtx *, int , int));
static void mdr_try_wreg_elim PARAMS ((rtx));
+#endif /* IP2K_MD_REORG_PASS */
+static int ip2k_check_can_adjust_stack_ref PARAMS ((rtx, int));
+static void ip2k_adjust_stack_ref PARAMS ((rtx *, int));
+static int ip2k_xexp_not_uses_reg_for_mem PARAMS ((rtx, unsigned int));
/* Initialize the GCC target structure. */
@@ -156,7 +158,7 @@ ip2k_return_pops_args (fundecl, funtype, size)
return 0;
}
-/* Return non-zero if FUNC is a naked function. */
+/* Return nonzero if FUNC is a naked function. */
static int
ip2k_naked_function_p (func)
@@ -175,7 +177,7 @@ ip2k_naked_function_p (func)
void
function_prologue (file, size)
FILE *file;
- int size;
+ HOST_WIDE_INT size;
{
int leaf_func_p;
int main_p;
@@ -297,11 +299,13 @@ function_prologue (file, size)
void
function_epilogue (file, size)
FILE *file;
- int size;
+ HOST_WIDE_INT size;
{
int leaf_func_p;
int reg,savelimit;
rtx operands[2]; /* Dummy used by OUT_ASn */
+ int args_locals_size = current_function_args_size;
+ int saved_regs_p = 0;
int need_ret = 1;
/* Use this opportunity to reset the reorg flags! */
@@ -323,42 +327,54 @@ function_epilogue (file, size)
epilogue_size = 0;
fprintf (file, "/* epilogue: frame size=%d */\n", size);
+ savelimit = (CHAIN_FRAMES) ? REG_FP : (REG_FP + 2);
+ for (reg = 0; reg < savelimit; reg++)
+ if (regs_ever_live[reg] && ! call_used_regs[reg])
+ {
+ saved_regs_p = 1;
+ break;
+ }
+
if (size)
{
- operands[0] = GEN_INT (size);
-
- switch (size & 0xff)
+ if (leaf_func_p && !CHAIN_FRAMES && !saved_regs_p
+ && current_function_pops_args)
+ args_locals_size = current_function_args_size + size;
+ else
{
- default:
- OUT_AS2 (mov, w, %L0);
- OUT_AS2 (add, spl, w);
- epilogue_size += 4;
- /* fall-thru */
- case 0:
- break;
- case 1:
- OUT_AS1 (inc, spl);
- epilogue_size += 2;
- }
+ operands[0] = GEN_INT (size);
- switch (size & 0xff00)
- {
- default:
- if ((size & 0xff) != ((size >> 8) & 0xff))
- OUT_AS2 (mov, w, %H0);
- OUT_AS2 (add, sph, w);
- epilogue_size += 4;
- /* fall-thru */
- case 0:
- break;
- case 1:
- OUT_AS1 (inc, sph);
- epilogue_size += 2;
+ switch (size & 0xff)
+ {
+ default:
+ OUT_AS2 (mov, w, %L0);
+ OUT_AS2 (add, spl, w);
+ epilogue_size += 4;
+ /* fall-thru */
+ case 0:
+ break;
+ case 1:
+ OUT_AS1 (inc, spl);
+ epilogue_size += 2;
+ }
+
+ switch (size & 0xff00)
+ {
+ default:
+ if ((size & 0xff) != ((size >> 8) & 0xff))
+ OUT_AS2 (mov, w, %H0);
+ OUT_AS2 (add, sph, w);
+ epilogue_size += 4;
+ /* fall-thru */
+ case 0:
+ break;
+ case 0x100:
+ OUT_AS1 (inc, sph);
+ epilogue_size += 2;
+ }
}
}
- savelimit = (CHAIN_FRAMES) ? REG_FP : (REG_FP + 2);
-
for (reg = 0; reg < savelimit; reg++)
{
if (regs_ever_live[reg] && ! call_used_regs[reg])
@@ -426,10 +442,10 @@ function_epilogue (file, size)
else
{
if (current_function_pops_args
- && current_function_args_size >= 2
- && current_function_args_size < 0x100)
+ && args_locals_size >= 2
+ && args_locals_size < 0x100)
{
- if (current_function_args_size == 2)
+ if (args_locals_size == 2)
{
if (CHAIN_FRAMES)
{
@@ -441,7 +457,7 @@ function_epilogue (file, size)
}
else
{
- operands[0] = GEN_INT (current_function_args_size);
+ operands[0] = GEN_INT (args_locals_size);
if (CHAIN_FRAMES)
{
OUT_AS2 (mov, w, %L0);
@@ -454,12 +470,11 @@ function_epilogue (file, size)
}
}
- if (current_function_pops_args && current_function_args_size
- && need_ret)
+ if (current_function_pops_args && args_locals_size && need_ret)
{
- operands[0] = GEN_INT (current_function_args_size);
+ operands[0] = GEN_INT (args_locals_size);
- switch (current_function_args_size & 0xff)
+ switch (args_locals_size & 0xff)
{
default:
OUT_AS2 (mov, w, %L0);
@@ -475,11 +490,10 @@ function_epilogue (file, size)
epilogue_size += 2;
}
- switch (current_function_args_size & 0xff00)
+ switch (args_locals_size & 0xff00)
{
default:
- if ((current_function_args_size & 0xff)
- != ((current_function_args_size >> 8) & 0xff))
+ if ((args_locals_size & 0xff) != ((args_locals_size >> 8) & 0xff))
OUT_AS2 (mov, w, %H0);
OUT_AS2 (add, sph, w);
epilogue_size += 4;
@@ -488,7 +502,7 @@ function_epilogue (file, size)
case 0:
break;
- case 1:
+ case 0x100:
OUT_AS1 (inc, sph);
epilogue_size += 2;
}
@@ -1075,25 +1089,6 @@ ip2k_set_compare (x, y)
rtx x;
rtx y;
{
- /* If we're doing a DImode compare then force any CONST_INT second
- operand to be CONST_DOUBLE. */
- if (GET_MODE (x) == DImode && GET_CODE (y) == CONST_INT)
- {
- rtx value;
- size_t i;
-
- value = rtx_alloc (CONST_DOUBLE);
- PUT_MODE (value, VOIDmode);
-
- CONST_DOUBLE_LOW (value) = INTVAL (y);
- CONST_DOUBLE_HIGH (value) = INTVAL (y) > 0 ? 0 : -1;
-
- for (i = 2; i < (sizeof CONST_DOUBLE_FORMAT - 1); i++)
- XWINT (value, i) = 0;
-
- y = value;
- }
-
ip2k_compare_operands[0] = x;
ip2k_compare_operands[1] = y;
return "";
@@ -1675,6 +1670,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
int imm_cmp = 0;
int can_use_skip = 0;
rtx ninsn;
+ HOST_WIDE_INT const_low;
+ HOST_WIDE_INT const_high;
operands[2] = label;
@@ -1743,7 +1740,7 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
goto zero;
case GTU:
- code = NE; /* Anything non-zero is GTU. */
+ code = NE; /* Anything nonzero is GTU. */
/* fall-thru */
case EQ:
@@ -2332,10 +2329,10 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{
if (INTVAL (operands[0]) == 0)
{
- OUT_AS2 (mov, w, %A0);
- OUT_AS2 (or, w, %B0);
- OUT_AS2 (or, w, %C0);
- OUT_AS2 (or, w, %D0);
+ OUT_AS2 (mov, w, %A1);
+ OUT_AS2 (or, w, %B1);
+ OUT_AS2 (or, w, %C1);
+ OUT_AS2 (or, w, %D1);
OUT_AS1 (snz,);
OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2);
@@ -2377,10 +2374,10 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{
if (INTVAL (operands[0]) == 0)
{
- OUT_AS2 (mov, w, %A0);
- OUT_AS2 (or, w, %B0);
- OUT_AS2 (or, w, %C0);
- OUT_AS2 (or, w, %D0);
+ OUT_AS2 (mov, w, %A1);
+ OUT_AS2 (or, w, %B1);
+ OUT_AS2 (or, w, %C1);
+ OUT_AS2 (or, w, %D1);
OUT_AS1 (sz,);
OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2);
@@ -2465,6 +2462,16 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
break;
case DImode:
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ const_low = INTVAL (operands[1]);
+ const_high = (const_low >= 0) - 1;
+ }
+ else if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ {
+ const_low = CONST_DOUBLE_LOW (operands[1]);
+ const_high = CONST_DOUBLE_HIGH (operands[1]);
+ }
switch (code)
{
case EQ:
@@ -2519,14 +2526,14 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{
if (imm_cmp)
{
- s = (CONST_DOUBLE_HIGH (operands[1]) >> 24) & 0xff;
- t = (CONST_DOUBLE_HIGH (operands[1]) >> 16) & 0xff;
- u = (CONST_DOUBLE_HIGH (operands[1]) >> 8) & 0xff;
- v = CONST_DOUBLE_HIGH (operands[1]) & 0xff;
- w = (CONST_DOUBLE_LOW (operands[1]) >> 24) & 0xff;
- x = (CONST_DOUBLE_LOW (operands[1]) >> 16) & 0xff;
- y = (CONST_DOUBLE_LOW (operands[1]) >> 8) & 0xff;
- z = CONST_DOUBLE_LOW (operands[1]) & 0xff;
+ s = (const_high >> 24) & 0xff;
+ t = (const_high >> 16) & 0xff;
+ u = (const_high >> 8) & 0xff;
+ v = const_high & 0xff;
+ w = (const_low >> 24) & 0xff;
+ x = (const_low >> 16) & 0xff;
+ y = (const_low >> 8) & 0xff;
+ z = const_low & 0xff;
}
OUT_AS2 (mov, w, %S1);
@@ -2648,14 +2655,14 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{
if (imm_cmp)
{
- s = (CONST_DOUBLE_HIGH (operands[1]) >> 24) & 0xff;
- t = (CONST_DOUBLE_HIGH (operands[1]) >> 16) & 0xff;
- u = (CONST_DOUBLE_HIGH (operands[1]) >> 8) & 0xff;
- v = CONST_DOUBLE_HIGH (operands[1]) & 0xff;
- w = (CONST_DOUBLE_LOW (operands[1]) >> 24) & 0xff;
- x = (CONST_DOUBLE_LOW (operands[1]) >> 16) & 0xff;
- y = (CONST_DOUBLE_LOW (operands[1]) >> 8) & 0xff;
- z = CONST_DOUBLE_LOW (operands[1]) & 0xff;
+ s = (const_high >> 24) & 0xff;
+ t = (const_high >> 16) & 0xff;
+ u = (const_high >> 8) & 0xff;
+ v = const_high & 0xff;
+ w = (const_low >> 24) & 0xff;
+ x = (const_low >> 16) & 0xff;
+ y = (const_low >> 8) & 0xff;
+ z = const_low & 0xff;
}
OUT_AS2 (mov, w, %S1);
@@ -2734,13 +2741,11 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
if (imm_sub)
{
/* > 0xffffffffffffffff never suceeds! */
- if (((CONST_DOUBLE_HIGH (operands[1]) & 0xffffffff)
- != 0xffffffff)
- || ((CONST_DOUBLE_LOW (operands[1]) & 0xffffffff)
- != 0xffffffff))
+ if (((const_high & 0xffffffff) != 0xffffffff)
+ || ((const_low & 0xffffffff) != 0xffffffff))
{
- operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[1]) + 1);
- operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1])
+ operands[3] = GEN_INT (const_low + 1);
+ operands[4] = GEN_INT (const_high
+ (INTVAL (operands[3]) ? 0 : 1));
OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z0);
@@ -2790,27 +2795,38 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
case GEU:
if (imm_sub)
{
- if ((CONST_DOUBLE_HIGH (operands[0]) == 0)
- && (CONST_DOUBLE_LOW (operands[0]) == 0))
+ HOST_WIDE_INT const_low0;
+ HOST_WIDE_INT const_high0;
+
+ if (GET_CODE (operands[0]) == CONST_INT)
+ {
+ const_low0 = INTVAL (operands[0]);
+ const_high0 = (const_low >= 0) - 1;
+ }
+ else if (GET_CODE (operands[0]) == CONST_DOUBLE)
+ {
+ const_low0 = CONST_DOUBLE_LOW (operands[0]);
+ const_high0 = CONST_DOUBLE_HIGH (operands[0]);
+ }
+
+ if (const_high0 == 0 && const_low0 == 0)
{
- OUT_AS2 (mov, w, %S0);
- OUT_AS2 (or, w, %T0);
- OUT_AS2 (or, w, %U0);
- OUT_AS2 (or, w, %V0);
- OUT_AS2 (or, w, %W0);
- OUT_AS2 (or, w, %X0);
- OUT_AS2 (or, w, %Y0);
- OUT_AS2 (or, w, %Z0);
+ OUT_AS2 (mov, w, %S1);
+ OUT_AS2 (or, w, %T1);
+ OUT_AS2 (or, w, %U1);
+ OUT_AS2 (or, w, %V1);
+ OUT_AS2 (or, w, %W1);
+ OUT_AS2 (or, w, %X1);
+ OUT_AS2 (or, w, %Y1);
+ OUT_AS2 (or, w, %Z1);
OUT_AS1 (snz,);
OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2);
}
else
{
- operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[0]) - 1);
- operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[0])
- - (CONST_DOUBLE_LOW (operands[0])
- ? 1 : 0));
+ operands[3] = GEN_INT (const_low0 - 1);
+ operands[4] = GEN_INT (const_high0 - (const_low0 ? 1 : 0));
OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z1);
OUT_AS2 (mov, w, %C3);
@@ -2859,27 +2875,38 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
case LTU:
if (imm_sub)
{
- if ((CONST_DOUBLE_HIGH (operands[0]) == 0)
- && (CONST_DOUBLE_LOW (operands[0]) == 0))
+ HOST_WIDE_INT const_low0;
+ HOST_WIDE_INT const_high0;
+
+ if (GET_CODE (operands[0]) == CONST_INT)
{
- OUT_AS2 (mov, w, %S0);
- OUT_AS2 (or, w, %T0);
- OUT_AS2 (or, w, %U0);
- OUT_AS2 (or, w, %V0);
- OUT_AS2 (or, w, %W0);
- OUT_AS2 (or, w, %X0);
- OUT_AS2 (or, w, %Y0);
- OUT_AS2 (or, w, %Z0);
+ const_low0 = INTVAL (operands[0]);
+ const_high0 = (const_low >= 0) - 1;
+ }
+ else if (GET_CODE (operands[0]) == CONST_DOUBLE)
+ {
+ const_low0 = CONST_DOUBLE_LOW (operands[0]);
+ const_high0 = CONST_DOUBLE_HIGH (operands[0]);
+ }
+
+ if (const_high0 == 0 && const_low0 == 0)
+ {
+ OUT_AS2 (mov, w, %S1);
+ OUT_AS2 (or, w, %T1);
+ OUT_AS2 (or, w, %U1);
+ OUT_AS2 (or, w, %V1);
+ OUT_AS2 (or, w, %W1);
+ OUT_AS2 (or, w, %X1);
+ OUT_AS2 (or, w, %Y1);
+ OUT_AS2 (or, w, %Z1);
OUT_AS1 (sz,);
OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2);
}
else
{
- operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[0]) - 1);
- operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[0])
- - (CONST_DOUBLE_LOW (operands[0])
- ? 1 : 0));
+ operands[3] = GEN_INT (const_low0 - 1);
+ operands[4] = GEN_INT (const_high0 - (const_low0 ? 1 : 0));
OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z1);
OUT_AS2 (mov, w, %C3);
@@ -2928,10 +2955,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
case LEU:
if (imm_sub)
{
- if (((CONST_DOUBLE_HIGH (operands[1]) & 0xffffffff)
- == 0xffffffff)
- && ((CONST_DOUBLE_LOW (operands[1]) & 0xffffffff)
- == 0xffffffff))
+ if (((const_high & 0xffffffff) == 0xffffffff)
+ && ((const_low & 0xffffffff) == 0xffffffff))
{
/* <= 0xffffffffffffffff always suceeds. */
OUT_AS1 (page, %2);
@@ -2939,8 +2964,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
}
else
{
- operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[1]) + 1);
- operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1])
+ operands[3] = GEN_INT (const_low + 1);
+ operands[4] = GEN_INT (const_high
+ (INTVAL (operands[3]) ? 0 : 1));
OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z0);
@@ -3047,8 +3072,9 @@ asm_output_float (file, n)
char dstr[100];
REAL_VALUE_TO_TARGET_SINGLE (n, val);
- REAL_VALUE_TO_DECIMAL (n, "%g", dstr);
- fprintf (file, "\t.long 0x%08lx\t/* %s */\n",val, dstr);
+ real_to_decimal (dstr, &n, sizeof (dstr), 0, 1);
+
+ fprintf (file, "\t.long 0x%08lx\t/* %s */\n", val, dstr);
}
/* Sets section name for declaration DECL. */
@@ -3167,8 +3193,9 @@ valid_machine_decl_attribute (decl, attributes, attr, args)
/* Encode section information about tree DECL. */
void
-encode_section_info (decl)
+encode_section_info (decl, first)
tree decl;
+ int first ATTRIBUTE_UNUSED;
{
if (! DECL_P (decl))
return;
@@ -3355,6 +3382,7 @@ ip2k_address_cost (x)
much cheaper and the move from this to the original source operand will be
no more expensive than the original move. */
+#ifdef IP2K_MD_REORG_PASS
static void
mdr_resequence_xy_yx (first_insn)
rtx first_insn;
@@ -4100,9 +4128,10 @@ mdr_try_move_dp_reload (first_insn)
}
}
}
+#endif /* IP2K_MD_REORG_PASS */
/* Look to see if the expression, x, can have any stack references offset by
- a fixed constant, offset. If it definitely can then returns non-zero. */
+ a fixed constant, offset. If it definitely can then returns nonzero. */
static int
ip2k_check_can_adjust_stack_ref (x, offset)
@@ -4193,6 +4222,7 @@ ip2k_adjust_stack_ref (x, offset)
}
}
+#ifdef IP2K_MD_REORG_PASS
/* As part of the machine-dependent reorg we look to move push instructions
to earlier points within the file. Moving these out of the way allows more
peepholes to match. */
@@ -4636,10 +4666,11 @@ mdr_try_propagate_clr (first_insn)
}
}
}
+#endif /* IP2K_MD_REORG_PASS */
/* Look to see if the expression, x, does not make any memory references
via the specified register. This is very conservative and only returns
- non-zero if we definitely don't have such a memory ref. */
+ nonzero if we definitely don't have such a memory ref. */
static int
ip2k_xexp_not_uses_reg_for_mem (x, regno)
@@ -4693,6 +4724,7 @@ ip2k_xexp_not_uses_reg_for_mem (x, regno)
}
}
+#ifdef IP2K_MD_REORG_PASS
/* Assist the following function, mdr_try_propagate_move(). */
static void
@@ -5249,6 +5281,7 @@ mdr_try_wreg_elim (first_insn)
free (ip2k_we_jump_targets);
}
+#endif /* IP2K_MD_REORG_PASS */
/* We perform a lot of untangling of the RTL within the reorg pass since
the IP2k requires some really bizarre (and really undesireable) things
@@ -5258,9 +5291,11 @@ mdr_try_wreg_elim (first_insn)
void
machine_dependent_reorg (first_insn)
- rtx first_insn;
+ rtx first_insn ATTRIBUTE_UNUSED;
{
+#ifdef IP2K_MD_REORG_PASS
rtx insn, set;
+#endif
CC_STATUS_INIT;
diff --git a/gcc/config/ip2k/ip2k.h b/gcc/config/ip2k/ip2k.h
index 379682d87bb..467dfa7b2d2 100644
--- a/gcc/config/ip2k/ip2k.h
+++ b/gcc/config/ip2k/ip2k.h
@@ -801,7 +801,7 @@ enum reg_class {
machines allow copying all registers to and from memory, but
require a scratch register for stores to some memory locations
(e.g., those with symbolic address on the RT, and those with
- certain symbolic address on the Sparc when compiling PIC). In
+ certain symbolic address on the SPARC when compiling PIC). In
some cases, both an intermediate and a scratch register are
required.
@@ -851,13 +851,13 @@ enum reg_class {
class of registers. In that case, secondary reload registers are
not needed and would not be helpful. Instead, a stack location
must be used to perform the copy and the `movM' pattern should use
- memory as a intermediate storage. This case often occurs between
+ memory as an intermediate storage. This case often occurs between
floating-point and general registers. */
/* `SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)'
Certain machines have the property that some registers cannot be
copied to some other registers without using memory. Define this
- macro on those machines to be a C expression that is non-zero if
+ macro on those machines to be a C expression that is nonzero if
objects of mode M in registers of CLASS1 can only be copied to
registers of class CLASS2 by storing a register of CLASS1 into
memory and loading that memory location into a register of CLASS2.
@@ -881,16 +881,16 @@ enum reg_class {
classes that there would not be enough registers to use as spill
registers if this were done.
- Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero
- value on these machines. When this macro has a non-zero value, the
+ Define `SMALL_REGISTER_CLASSES' to be an expression with a nonzero
+ value on these machines. When this macro has a nonzero value, the
compiler allows registers explicitly used in the rtl to be used as
spill registers but avoids extending the lifetime of these
registers.
- It is always safe to define this macro with a non-zero value, but
+ It is always safe to define this macro with a nonzero value, but
if you unnecessarily define it, you will reduce the amount of
optimizations that can be performed in some cases. If you do not
- define this macro with a non-zero value when it is required, the
+ define this macro with a nonzero value when it is required, the
compiler will run out of spill registers and print a fatal error
message. For most machines, you should not define this macro at
all. */
@@ -1148,7 +1148,7 @@ enum reg_class {
? (flag_omit_frame_pointer && !frame_pointer_needed) : 1)
/* Don't eliminate FP unless we EXPLICITLY_ASKED */
-/* A C expression that returns non-zero if the compiler is allowed to
+/* A C expression that returns nonzero if the compiler is allowed to
try to replace register number FROM-REG with register number
TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is
defined, and will usually be the constant 1, since most of the
@@ -1226,7 +1226,7 @@ enum reg_class {
argument popping will always be the responsibility of the calling
function.
- On the Vax, all functions always pop their arguments, so the
+ On the VAX, all functions always pop their arguments, so the
definition of this macro is STACK-SIZE. On the 68000, using the
standard calling convention, no functions pop their arguments, so
the value of the macro is always 0 in this case. But an
@@ -1251,7 +1251,7 @@ enum reg_class {
hard register in which to pass the argument, or zero to pass the
argument on the stack.
- For machines like the Vax and 68000, where normally all arguments
+ For machines like the VAX and 68000, where normally all arguments
are pushed, zero suffices as a definition.
The value of the expression can also be a `parallel' RTX. This is
@@ -1275,7 +1275,7 @@ enum reg_class {
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the
definition of this macro to determine if this argument is of a
type that must be passed in the stack. If `REG_PARM_STACK_SPACE'
- is not defined and `FUNCTION_ARG' returns non-zero for such an
+ is not defined and `FUNCTION_ARG' returns nonzero for such an
argument, the compiler will abort. If `REG_PARM_STACK_SPACE' is
defined, the argument will be computed in the stack and then
loaded into a register. */
@@ -1905,10 +1905,10 @@ do { \
cost many times greater than aligned accesses, for example if they
are emulated in a trap handler.
- When this macro is non-zero, the compiler will act as if
- `STRICT_ALIGNMENT' were non-zero when generating code for block
+ When this macro is nonzero, the compiler will act as if
+ `STRICT_ALIGNMENT' were nonzero when generating code for block
moves. This can cause significantly more instructions to be
- produced. Therefore, do not set this macro non-zero if unaligned
+ produced. Therefore, do not set this macro nonzero if unaligned
accesses only add a cycle or two to the time for a memory access.
If the value of this macro is always zero, it need not be defined.
@@ -1960,30 +1960,6 @@ do { \
operation to identify the following data as writable initialized
data. Normally `".data"' is right. */
-
-#undef SELECT_SECTION /* Hide default. */
-#define SELECT_SECTION(EXP,RELOC) data_section ()
-/* `SELECT_SECTION (EXP, RELOC)'
- A C statement or statements to switch to the appropriate section
- for output of EXP. You can assume that EXP is either a `VAR_DECL'
- node or a constant of some sort. RELOC indicates whether the
- initial value of EXP requires link-time relocations. Select the
- section by calling `text_section' or one of the alternatives for
- other sections.
-
- Do not define this macro if you put all read-only variables and
- constants in the read-only data section (usually the text section). */
-
-/* `SELECT_RTX_SECTION (MODE, RTX)'
- A C statement or statements to switch to the appropriate section
- for output of RTX in mode MODE. You can assume that RTX is some
- kind of constant in RTL. The argument MODE is redundant except in
- the case of a `const_int' rtx. Select the section by calling
- `text_section' or one of the alternatives for other sections.
-
- Do not define this macro if you put all constants in the read-only
- data section. */
-
#define JUMP_TABLES_IN_TEXT_SECTION 1
/* Define this macro if jump tables (for `tablejump' insns) should be
output in the text section, along with the assembler instructions.
@@ -2014,9 +1990,9 @@ do { \
#define OBJC_PROLOGUE {}
/* A C statement to output any assembler statements which are
- required to precede any Objective C object definitions or message
+ required to precede any Objective-C object definitions or message
sending. The statement is executed only when compiling an
- Objective C program. */
+ Objective-C program. */
#define ASM_OUTPUT_DOUBLE(STREAM, VALUE) \
fprintf ((STREAM), ".double %.20e\n", (VALUE))
@@ -2073,18 +2049,6 @@ do { \
If you do not define this macro, the default is that only the
character `;' is treated as a logical line separator. */
-#define ASM_OPEN_PAREN "("
-#define ASM_CLOSE_PAREN ")"
-/* These macros are defined as C string constant, describing the
- syntax in the assembler for grouping arithmetic expressions. The
- following definitions are correct for most assemblers:
-
- #define ASM_OPEN_PAREN "("
- #define ASM_CLOSE_PAREN ")"
-
- These macros are provided by `real.h' for writing the definitions of
- `ASM_OUTPUT_DOUBLE' and the like: */
-
#define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \
do { \
fputs ("\t.comm ", (STREAM)); \
@@ -2165,28 +2129,6 @@ do { \
/* Globalizing directive for a label. */
#define GLOBAL_ASM_OP ".global\t"
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
-/* A C expression to assign to OUTVAR (which is a variable of type
- `char *') a newly allocated string made from the string NAME and
- the number NUMBER, with some suitable punctuation added. Use
- `alloca' to get space for the string.
-
- The string will be used as an argument to `ASM_OUTPUT_LABELREF' to
- produce an assembler label for an internal static variable whose
- name is NAME. Therefore, the string must be such as to result in
- valid assembler code. The argument NUMBER is different each time
- this macro is executed; it prevents conflicts between
- similarly-named internal static variables in different scopes.
-
- Ideally this string should not be a valid C identifier, to prevent
- any conflict with the user's own symbols. Most assemblers allow
- periods or percent signs in assembler symbols; putting at least
- one of these between the name and the number will suffice. */
-
#define REGISTER_NAMES { \
"$00","$01","$02","$03","iph","ipl","sph","spl", \
"pch","pcl","wreg","status","dph","dpl","$0e","mulh", \
@@ -2302,7 +2244,7 @@ do { \
The definition should be a C statement to output to the stdio
stream STREAM an assembler pseudo-instruction to generate a
reference to a label. VALUE is the number of an internal label
- whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'. For
+ whose definition is output using `(*targetm.asm_out.internal_label)'. For
example,
fprintf ((STREAM), "\t.word L%d\n", (VALUE)) */
@@ -2335,15 +2277,6 @@ do { \
register. Most RISC machines have this property and most CISC
machines do not. */
-#define EASY_DIV_EXPR TRUNC_DIV_EXPR
-/* An alias for a tree code that is the easiest kind of division to
- compile code for in the general case. It may be `TRUNC_DIV_EXPR',
- `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'. These four
- division operators differ in how they round the result to an
- integer. `EASY_DIV_EXPR' is used when it is permissible to use
- any of those kinds of division and the choice should be made on
- the basis of efficiency. */
-
#define MOVE_MAX 1
/* The maximum number of bytes that a single instruction can move
quickly between memory and registers or between two memory
@@ -2472,7 +2405,7 @@ extern int ip2k_reorg_merge_qimode;
after execution of an instruction whose pattern is EXP.
Do not alter them if the instruction would not alter the cc's. */
-#define NOTICE_UPDATE_CC(EXP, INSN) (0)
+#define NOTICE_UPDATE_CC(EXP, INSN) (void)(0)
/* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */
@@ -2526,8 +2459,6 @@ extern int ip2k_reorg_merge_qimode;
= gen_rtx_SYMBOL_REF (Pmode, "_cmpsi2"); \
}
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
#define PREDICATE_CODES \
{"ip2k_ip_operand", {MEM}}, \
{"ip2k_short_operand", {MEM}}, \
@@ -2548,7 +2479,7 @@ extern int ip2k_reorg_merge_qimode;
EQ, LEU, GEU}},\
{"ip2k_signed_comparison_operator", {LT, GT, LE, GE}},
-#define DWARF2_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
#define DWARF2_ASM_LINE_DEBUG_INFO 1
diff --git a/gcc/config/ip2k/ip2k.md b/gcc/config/ip2k/ip2k.md
index 6b52802bcb2..3fa272e328f 100644
--- a/gcc/config/ip2k/ip2k.md
+++ b/gcc/config/ip2k/ip2k.md
@@ -165,7 +165,7 @@
[(set_attr "skip" "yes")
(set_attr "clobberw" "no")])
-;; IP isn't offsettable but we can fake this behaviour here and win if we would
+;; IP isn't offsettable but we can fake this behavior here and win if we would
;; otherwise use DP and require a reload from IP. This instruction is only
;; matched by peephole2 operations.
;;
@@ -205,7 +205,7 @@
return \"\";
}")
-;; IP isn't offsettable but we can fake this behaviour here and win if we would
+;; IP isn't offsettable but we can fake this behavior here and win if we would
;; otherwise use DP and require a reload from IP. This instruction is only
;; matched by peephole2 operations.
;;
@@ -387,6 +387,8 @@
if (!find_regno_note (insn, REG_DEAD, REG_IP))
OUT_AS1 (dec, ipl);
return \"\";
+ default:
+ abort ();
}
}")
@@ -414,6 +416,8 @@
if (!find_regno_note (insn, REG_DEAD, REG_IP))
OUT_AS1 (dec, ipl);
return \"\";
+ default:
+ abort ();
}
}")
@@ -457,6 +461,8 @@
OUT_AS2 (sub, ipl, w);
}
return \"\";
+ default:
+ abort ();
}
}")
@@ -620,6 +626,8 @@
AS2 (mov, %L0, w) CR_TAB
AS1 (pop, %H2%>) CR_TAB
AS2 (mov, %L2, w);
+ default:
+ abort ();
}
}")
@@ -726,7 +734,9 @@
AS1 (pop, %B2%>) CR_TAB
AS1 (pop, %C2%>) CR_TAB
AS2 (mov, %D2, w);
- }
+ default:
+ abort ();
+ }
}")
;; We have to be *very* careful with this one to use predicates that do not
@@ -981,6 +991,8 @@
p += sprintf (p, \"\;and\\tw,#$%2.2x\;or\\t%%0,w\", mask);
return buff;
}
+ default:
+ abort ();
}
}"
[(set_attr "skip" "yes,yes,no,no,no,no,no")
@@ -1145,6 +1157,8 @@
AS2 (mov, w, %H1) CR_TAB
AS2 (addc, 1(SP), w);
}
+ default:
+ abort ();
}
}"
[(set_attr "clobberw" "no,yes,yes,yes,yes,yes,yes,yes")])
@@ -2050,6 +2064,8 @@
AS2 (mov, %A0, w) CR_TAB
AS2 (mov, w, %A2) CR_TAB
AS2 (subc, %A0, w);
+ default:
+ abort ();
}
}")
@@ -2214,6 +2230,8 @@
AS2 (mov, %S0, w) CR_TAB
AS2 (mov, w, %S2) CR_TAB
AS2 (subc, %S0, w);
+ default:
+ abort ();
}
}")
@@ -3338,6 +3356,8 @@
AS1 (page, 1b) CR_TAB
AS1 (jmp, 1b);
}
+ default:
+ abort ();
}
}")
@@ -3782,6 +3802,8 @@
AS1 (page, 1b) CR_TAB
AS1 (jmp, 1b);
}
+ default:
+ abort ();
}
}")
@@ -3848,6 +3870,8 @@
AS2 (mulu, w, %e2) CR_TAB
AS2 (mov, w, mulh) CR_TAB
AS2 (mov, %0, w);
+ default:
+ abort ();
}
}")
@@ -4202,6 +4226,8 @@
AS1 (page, 1b) CR_TAB
AS1 (jmp, 1b);
}
+ default:
+ abort ();
}
}")
@@ -4425,6 +4451,8 @@
AS2 (mov, %L0, w) CR_TAB
AS2 (mov, w, %H1) CR_TAB
AS2 (mov, %H0, w);
+ default:
+ abort ();
}
}")
@@ -5287,6 +5315,8 @@
OUT_AS2 (mov, w, %1);
OUT_AS2 (add, w, %5);
break;
+ default:
+ abort ();
}
OUT_AS2 (cmp, w, %2);
@@ -5315,6 +5345,8 @@
OUT_AS1 (page, __indcall);
OUT_AS1 (jmp, __indcall%>%>);
return \"\";
+ default:
+ abort ();
}
}")
@@ -5595,6 +5627,8 @@
OUT_AS1 (sz, );
return AS1 (page, %2) CR_TAB
AS1 (jmp, %2);
+ default:
+ abort ();
}
}")
@@ -5641,6 +5675,8 @@
OUT_AS1 (sz, );
return AS1 (page, %2) CR_TAB
AS1 (jmp, %2);
+ default:
+ abort ();
}
}")
@@ -6530,7 +6566,7 @@
;; Tidy up stack slot addressing where we've eliminated some registers.
;; This looks like something strange going on though as gcc-2.97 didn't
-;; exhibit this behaviour, whereas gcc-3.0.4 does.
+;; exhibit this behavior, whereas gcc-3.0.4 does.
;;
(define_peephole2
[(set (match_operand:HI 0 "register_operand" "")
diff --git a/gcc/config/ip2k/libgcc.S b/gcc/config/ip2k/libgcc.S
index 1af9ef873ce..fb0c9887195 100644
--- a/gcc/config/ip2k/libgcc.S
+++ b/gcc/config/ip2k/libgcc.S
@@ -1,4 +1,3 @@
-; libgcc.S for the Ubicom IP2k architecture.
;
; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
; Contributed by Red Hat, Inc and Ubicom, Inc.
@@ -1327,8 +1326,11 @@ __cmpdi2_dp:
.sect .pram.libgcc,"ax"
.global __fp_pop_args_ret
.global __pop_args_ret
- .func __fp_pop_args_ret, __fp_pop_args_ret
+ .global __pop2_args_ret
+ .func __fp_pop2_args_ret, __fp_pop2_args_ret
+__fp_pop2_args_ret:
+ mov w, #2
__fp_pop_args_ret:
pop 0xfd
pop 0xfe
@@ -1341,29 +1343,11 @@ __pop_args_ret:
.endfunc
#endif /* L_fp_pop_args_ret */
-#if defined(L_leaf_fp_pop_args_ret)
- .sect .pram.libgcc,"ax"
- .global __leaf_fp_pop_args_ret
- .func __leaf_fp_pop_args_ret, __leaf_fp_pop_args_ret
-
-__leaf_fp_pop_args_ret:
- pop 0xfd
- pop 0xfe
- add spl, w
- ret
-
- .endfunc
-#endif /* L_leaf_fp_pop_args_ret */
-
-#if defined(L_fp_pop2_args_ret)
+#if defined(L__pop2_args_ret)
.sect .pram.libgcc,"ax"
- .global __fp_pop2_args_ret
.global __pop2_args_ret
- .func __fp_pop2_args_ret, __fp_pop2_args_ret
+ .func __pop2_args_ret, __pop2_args_ret
-__fp_pop2_args_ret:
- pop 0xfd
- pop 0xfe
__pop2_args_ret:
mov w, #2
pop callh
@@ -1372,22 +1356,23 @@ __pop2_args_ret:
ret
.endfunc
-#endif /* L_fp_pop2_args_ret */
+#endif /* L__pop2_args_ret */
-#if defined(L_leaf_fp_pop2_args_ret)
+#if defined(L_leaf_fp_pop_args_ret)
.sect .pram.libgcc,"ax"
- .global __leaf_fp_pop2_args_ret
- .func __leaf_fp_pop2_args_ret, __leaf_fp_pop2_args_ret
+ .global __leaf_fp_pop_args_ret, __leaf_fp_pop2_args_ret
+ .func __leaf_fp2_pop_args_ret, __leaf_fp_pop2_args_ret
__leaf_fp_pop2_args_ret:
+ mov w, #2
+__leaf_fp_pop_args_ret:
pop 0xfd
pop 0xfe
- mov w, #2
add spl, w
ret
.endfunc
-#endif /* L_leaf_fp_pop2_args_ret */
+#endif /* L_leaf_fp_pop_args_ret */
#if defined(L_movstrhi_countqi)
.sect .pram.libgcc,"ax"
@@ -1449,7 +1434,7 @@ __movstrhi_counthi:
mov w, 8(SP)
mov ipl, w
- test 10(SP) ; If we have a non-zero LSB then adjust the
+ test 10(SP) ; If we have a nonzero LSB then adjust the
sz ; MSB of the loop count to allow us to use
inc 9(SP) ; skip tricks!
@@ -1529,4 +1514,3 @@ _write:
.endfunc
#endif
-
diff --git a/gcc/config/ip2k/t-ip2k b/gcc/config/ip2k/t-ip2k
index 7d82126c61f..7a59a705c83 100644
--- a/gcc/config/ip2k/t-ip2k
+++ b/gcc/config/ip2k/t-ip2k
@@ -17,9 +17,8 @@ LIB1ASMFUNCS = \
_cmpdi2 \
_cmpdi2_dp \
_fp_pop_args_ret \
+ _pop2_args_ret \
_leaf_fp_pop_args_ret \
- _fp_pop2_args_ret \
- _leaf_fp_pop2_args_ret \
_movstrhi_countqi \
_movstrhi_counthi \
abort \
diff --git a/gcc/config/libgloss.h b/gcc/config/libgloss.h
index 8d7dd5bbfe0..f73982b8634 100644
--- a/gcc/config/libgloss.h
+++ b/gcc/config/libgloss.h
@@ -23,7 +23,7 @@ Boston, MA 02111-1307, USA. */
STARTFILE_SPEC is all wrong. */
/* The libgloss standard for crt0.s has the name based on the command line
- option. */
+ option. */
#undef STARTFILE_SPEC
#define STARTFILE_SPEC "%{!shared:%{pg:pgcrt0%O%s}%{!pg:%{p:pcrt0%O%s}%{!p:crt0%O%s}}}"
diff --git a/gcc/config/linux-aout.h b/gcc/config/linux-aout.h
index 2560bb8acee..8193c611364 100644
--- a/gcc/config/linux-aout.h
+++ b/gcc/config/linux-aout.h
@@ -19,11 +19,11 @@ 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. */
-/* Don't assume anything about the header files. */
+/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
/* GNU/Linux uses ctype from glibc.a. I am not sure how complete it is.
- For now, we play safe. It may change later. */
+ For now, we play safe. It may change later. */
#if 0
#undef MULTIBYTE_CHARS
@@ -41,5 +41,5 @@ Boston, MA 02111-1307, USA. */
#define SET_ASM_OP "\t.set\t"
-/* We need that too. */
+/* We need that too. */
#define HANDLE_SYSV_PRAGMA
diff --git a/gcc/config/linux.h b/gcc/config/linux.h
index f4fa716a2eb..5b7311c1697 100644
--- a/gcc/config/linux.h
+++ b/gcc/config/linux.h
@@ -20,11 +20,11 @@ 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. */
-/* Don't assume anything about the header files. */
+/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
/* GNU/Linux uses ctype from glibc.a. I am not sure how complete it is.
- For now, we play safe. It may change later. */
+ For now, we play safe. It may change later. */
#if 0
#undef MULTIBYTE_CHARS
@@ -43,7 +43,7 @@ Boston, MA 02111-1307, USA. */
/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add
the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
provides part of the support for getting C++ file-scope static
- object constructed before entering `main'. */
+ object constructed before entering `main'. */
#undef STARTFILE_SPEC
#ifdef USE_GNULIBC_1
@@ -73,7 +73,7 @@ Boston, MA 02111-1307, USA. */
#define ENDFILE_SPEC \
"%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
-/* This is for -profile to use -lc_p instead of -lc. */
+/* This is for -profile to use -lc_p instead of -lc. */
#ifndef CC1_SPEC
#define CC1_SPEC "%{profile:-p}"
#endif
@@ -85,7 +85,7 @@ Boston, MA 02111-1307, USA. */
#undef LIB_SPEC
/* We no longer link with libc_p.a or libg.a by default. If you
want to profile or debug the GNU/Linux C library, please add
- -profile or -ggdb to LDFLAGS at the link time, respectively. */
+ -profile or -ggdb to LDFLAGS at the link time, respectively. */
#if 1
#ifdef USE_GNULIBC_1
#define LIB_SPEC \
diff --git a/gcc/config/lynx-ng.h b/gcc/config/lynx-ng.h
index 3ae07e1d601..9d948015322 100644
--- a/gcc/config/lynx-ng.h
+++ b/gcc/config/lynx-ng.h
@@ -19,7 +19,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* This is for backwards compatibility with older Lynx tools, which use
- a version of a.out format. */
+ a version of a.out format. */
#undef ASM_SPEC
#define ASM_SPEC "%{mcoff:-C}"
@@ -54,7 +54,7 @@ Boston, MA 02111-1307, USA. */
/* We want to output DBX debugging information. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
@@ -62,7 +62,7 @@ Boston, MA 02111-1307, USA. */
we can create debuggable SDB/coff files. This won't be needed when
stabs-in-coff works. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* Generate calls to memcpy, memcmp and memset. */
@@ -103,7 +103,7 @@ Boston, MA 02111-1307, USA. */
#define MD_EXEC_PREFIX "/usr/local/lib/gcc-"
-/* This is needed because /bin/ld does not handle -L options correctly. */
+/* This is needed because /bin/ld does not handle -L options correctly. */
#define LINK_LIBGCC_SPECIAL_1
diff --git a/gcc/config/lynx.h b/gcc/config/lynx.h
index 193935ee228..7f1cb547a42 100644
--- a/gcc/config/lynx.h
+++ b/gcc/config/lynx.h
@@ -20,27 +20,27 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* LynxOS is a multi-platform Unix, similar to SVR3, but not identical.
- We can get quite a bit from generic svr3, but have to do some overrides. */
+ We can get quite a bit from generic svr3, but have to do some overrides. */
#include "svr3.h"
-/* Define various macros, depending on the combination of flags. */
+/* Define various macros, depending on the combination of flags. */
#undef CPP_SPEC
#define CPP_SPEC "%{mthreads:-D_MULTITHREADED} \
%{mposix:-D_POSIX_SOURCE} \
%{msystem-v:-I/usr/include_v}"
-/* No asm spec needed, since using GNU assembler always. */
+/* No asm spec needed, since using GNU assembler always. */
-/* No linker spec needed, since using GNU linker always. */
+/* No linker spec needed, since using GNU linker always. */
#undef LIB_SPEC
#define LIB_SPEC "%{mthreads:-L/lib/thread/} \
%{msystem-v:-lc_v} \
%{!msystem-v:%{mposix:-lc_p} -lc -lm}"
-/* Set the appropriate names for the Lynx startfiles. */
+/* Set the appropriate names for the Lynx startfiles. */
#undef STARTFILE_SPEC
#define STARTFILE_SPEC "%{p:%{mthreads:thread/pinit1.o%s}%{!mthreads:pinit1.o%s}}%{!p:%{msystem-v:vinit1.o%s -e_start}%{!msystem-v:%{mthreads:thread/init1.o%s}%{!mthreads:init1.o%s}}}"
@@ -48,7 +48,7 @@ Boston, MA 02111-1307, USA. */
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "%{p:_etext.o%s}%{!p:initn.o%s}"
-/* Override the svr3 versions. */
+/* Override the svr3 versions. */
#undef WCHAR_TYPE
#define WCHAR_TYPE "int"
@@ -58,16 +58,16 @@ Boston, MA 02111-1307, USA. */
/* We want to output DBX (stabs) debugging information normally. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
/* It is convenient to be able to generate standard coff debugging
- if requested via -gcoff. */
+ if requested via -gcoff. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
-/* Be function-relative for block and source line stab directives. */
+/* Be function-relative for block and source line stab directives. */
#define DBX_BLOCKS_FUNCTION_RELATIVE 1
@@ -97,7 +97,7 @@ Boston, MA 02111-1307, USA. */
#define HANDLE_SYSV_PRAGMA
-/* Some additional command-line options. */
+/* Some additional command-line options. */
#define TARGET_THREADS (target_flags & MASK_THREADS)
#define MASK_THREADS 0x40000000
@@ -124,7 +124,7 @@ do { \
} while (0)
/* Since init.o et al put all sorts of stuff into the init section,
- we can't use the standard init section support in crtbegin.o. */
+ we can't use the standard init section support in crtbegin.o. */
#undef INIT_SECTION_ASM_OP
@@ -143,6 +143,6 @@ do { \
#undef DO_GLOBAL_CTORS_BODY
#undef DO_GLOBAL_DTORS_BODY
-/* LynxOS doesn't have mcount. */
+/* LynxOS doesn't have mcount. */
#undef FUNCTION_PROFILER
#define FUNCTION_PROFILER(file, profile_label_no)
diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c
index c4814317a1d..5903277c8c2 100644
--- a/gcc/config/m32r/m32r.c
+++ b/gcc/config/m32r/m32r.c
@@ -36,7 +36,7 @@ Boston, MA 02111-1307, USA. */
#include "recog.h"
#include "toplev.h"
#include "ggc.h"
-#include "m32r-protos.h"
+#include "tm_p.h"
#include "target.h"
#include "target-def.h"
@@ -1029,7 +1029,7 @@ extend_operand (op, mode)
}
}
-/* Return non-zero if the operand is an insn that is a small insn.
+/* Return nonzero if the operand is an insn that is a small insn.
Allow const_int 0 as well, which is a placeholder for NOP slots. */
int
@@ -1046,7 +1046,7 @@ small_insn_p (op, mode)
return get_attr_length (op) == 2;
}
-/* Return non-zero if the operand is an insn that is a large insn. */
+/* Return nonzero if the operand is an insn that is a large insn. */
int
large_insn_p (op, mode)
@@ -2181,7 +2181,7 @@ m32r_output_function_epilogue (file, size)
m32r_compute_function_type (NULL_TREE);
}
-/* Return non-zero if this function is known to have a null or 1 instruction
+/* Return nonzero if this function is known to have a null or 1 instruction
epilogue. */
int
@@ -2311,14 +2311,13 @@ m32r_print_operand (file, x, code)
case 'A' :
{
- REAL_VALUE_TYPE d;
char str[30];
if (GET_CODE (x) != CONST_DOUBLE
|| GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT)
fatal_insn ("bad insn for 'A'", x);
- REAL_VALUE_FROM_CONST_DOUBLE (d, x);
- REAL_VALUE_TO_DECIMAL (d, "%.20e", str);
+
+ real_to_decimal (str, CONST_DOUBLE_REAL_VALUE (x), sizeof (str), 0, 1);
fprintf (file, "%s", str);
return;
}
@@ -2590,7 +2589,7 @@ zero_and_one (operand1, operand2)
||((INTVAL (operand1) == 1) && (INTVAL (operand2) == 0)));
}
-/* Return non-zero if the operand is suitable for use in a conditional move sequence. */
+/* Return nonzero if the operand is suitable for use in a conditional move sequence. */
int
conditional_move_operand (operand, mode)
rtx operand;
@@ -2862,7 +2861,7 @@ m32r_output_block_move (insn, operands)
stores are done without any increment, then the remaining ones can use
the pre-increment addressing mode.
- Note: expand_block_move() also relies upon this behaviour when building
+ Note: expand_block_move() also relies upon this behavior when building
loops to copy large blocks. */
first_time = 1;
diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h
index 2b3720dd3be..195b4682a1f 100644
--- a/gcc/config/m32r/m32r.h
+++ b/gcc/config/m32r/m32r.h
@@ -185,7 +185,7 @@ Boston, MA 02111-1307, USA. */
extern int target_flags;
-/* If non-zero, tell the linker to do relaxing.
+/* If nonzero, tell the linker to do relaxing.
We don't do anything with the option, other than recognize it.
LINK_SPEC handles passing -relax to the linker.
This can cause incorrect debugging information as line numbers may
@@ -480,7 +480,7 @@ extern enum m32r_sdata m32r_sdata;
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* No data type wants to be aligned rounder than this. */
@@ -972,7 +972,7 @@ M32R_STACK_ALIGN (current_function_outgoing_args_size)
{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \
{ ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM }}
-/* A C expression that returns non-zero if the compiler is allowed to
+/* A C expression that returns nonzero if the compiler is allowed to
try to replace register number FROM-REG with register number
TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is
defined, and will usually be the constant 1, since most of the
@@ -1414,7 +1414,7 @@ do { \
/* Condition code usage. */
-/* Return non-zero if SELECT_CC_MODE will never return MODE for a
+/* Return nonzero if SELECT_CC_MODE will never return MODE for a
floating point inequality comparison. */
#define REVERSIBLE_CC_MODE(MODE) 1 /*???*/
@@ -1694,17 +1694,6 @@ sbss_section () \
} \
while (0)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- do \
- { \
- (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10);\
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)); \
- } \
- while (0)
-
/* How to refer to registers in assembler output.
This sequence is indexed by compiler's hard-register-number (see above). */
#ifndef SUBTARGET_REGISTER_NAMES
@@ -1860,13 +1849,9 @@ extern char m32r_punct_chars[256];
/* Debugging information. */
/* Generate DBX and DWARF debugging information. */
-#undef DBX_DEBUGGING_INFO
-#undef DWARF_DEBUGGING_INFO
-#undef DWARF2_DEBUGGING_INFO
-
-#define DBX_DEBUGGING_INFO
-#define DWARF_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define DWARF_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
/* Prefer STABS (for now). */
#undef PREFERRED_DEBUGGING_TYPE
diff --git a/gcc/config/m32r/m32r.md b/gcc/config/m32r/m32r.md
index 4de64b05272..83976a8737d 100644
--- a/gcc/config/m32r/m32r.md
+++ b/gcc/config/m32r/m32r.md
@@ -1242,7 +1242,7 @@
;; reg == small constant comparisons are best handled by putting the result
;; of the comparison in a tmp reg and then using beqz/bnez.
;; ??? The result register doesn't contain 0/STORE_FLAG_VALUE,
-;; it contains 0/non-zero.
+;; it contains 0/nonzero.
(define_insn "cmp_ne_small_const_insn"
[(set (match_operand:SI 0 "register_operand" "=r,r")
diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c
index 169381f7681..ddad74b31ba 100644
--- a/gcc/config/m68hc11/m68hc11.c
+++ b/gcc/config/m68hc11/m68hc11.c
@@ -64,7 +64,6 @@ static int go_if_legitimate_address_internal PARAMS((rtx, enum machine_mode,
int));
static int register_indirect_p PARAMS((rtx, enum machine_mode, int));
static rtx m68hc11_expand_compare PARAMS((enum rtx_code, rtx, rtx));
-static int m68hc11_autoinc_compatible_p PARAMS ((rtx, rtx));
static int must_parenthesize PARAMS ((rtx));
static int m68hc11_shift_cost PARAMS ((enum machine_mode, rtx, int));
static int m68hc11_auto_inc_p PARAMS ((rtx));
@@ -78,6 +77,8 @@ static void m68hc11_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static void m68hc11_asm_out_constructor PARAMS ((rtx, int));
static void m68hc11_asm_out_destructor PARAMS ((rtx, int));
static void m68hc11_encode_section_info PARAMS((tree, int));
+static int autoinc_mode PARAMS((rtx));
+static int m68hc11_make_autoinc_notes PARAMS((rtx *, void *));
rtx m68hc11_soft_tmp_reg;
@@ -2260,11 +2261,10 @@ print_operand (file, op, letter)
else if (GET_CODE (op) == CONST_DOUBLE
&& (GET_MODE (op) == DFmode || GET_MODE (op) == XFmode))
{
- REAL_VALUE_TYPE r;
char dstr[30];
- REAL_VALUE_FROM_CONST_DOUBLE (r, op);
- REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr);
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (op),
+ sizeof (dstr), 0, 1);
asm_fprintf (file, "%I0r%s", dstr);
}
else
diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h
index d42dab13e12..393ab7bbf42 100644
--- a/gcc/config/m68hc11/m68hc11.h
+++ b/gcc/config/m68hc11/m68hc11.h
@@ -303,11 +303,6 @@ extern const struct processor_costs *m68hc11_cost;
this size or smaller can be used for structures and unions with the
appropriate sizes. */
#define MAX_FIXED_MODE_SIZE 64
-
-/* Floats are checked in a generic way. */
-/* #define CHECK_FLOAT_VALUE(MODE, D, OVERFLOW) */
-
-
/* target machine storage layout */
@@ -1609,16 +1604,6 @@ do { \
assemble_name (FILE, NAME); \
fputs ("\n", FILE);}
-
-
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* How to refer to registers in assembler output. This sequence is indexed
by compiler's hard-register-number (see above). */
#define REGISTER_NAMES \
diff --git a/gcc/config/m68hc11/m68hc11.md b/gcc/config/m68hc11/m68hc11.md
index 5b7e0887de4..beeded3d6ad 100644
--- a/gcc/config/m68hc11/m68hc11.md
+++ b/gcc/config/m68hc11/m68hc11.md
@@ -651,7 +651,7 @@
")
(define_insn "movdi_internal"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=uS,U,!u,U,m,m,!u")
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=ou,U,!u,U,m,m,!u")
(match_operand:DI 1 "general_operand" "K,iU,iU,!u,mi,!u,!mu"))
(clobber (match_scratch:HI 2 "=X,&d,&d,&d,&d,&d,&d"))]
""
@@ -687,7 +687,7 @@
")
(define_insn "movdf_internal"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=uS,U,!u,U,m,m,!u")
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=ou,U,!u,U,m,m,!u")
(match_operand:DF 1 "general_operand" "G,iU,iU,!u,mi,!u,!mu"))
(clobber (match_scratch:HI 2 "=X,&d,&d,&d,&d,&d,&d"))]
""
@@ -732,7 +732,7 @@
")
(define_insn "movsi_internal"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=uS,mu,?D,m,?D,?u,?u,!u,D")
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=ou,mu,?D,m,?D,?u,?u,!u,D")
(match_operand:SI 1 "general_operand" "K,imu,im,?D,!u,?D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=X,&d,X,X,X,X,&d,&d,X"))]
""
@@ -768,7 +768,7 @@
")
(define_insn "movsf_internal"
- [(set (match_operand:SF 0 "nonimmediate_operand" "=S!u,m,D,m,D,!u,!u,!u,D")
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=o!u,m,D,m,D,!u,!u,!u,D")
(match_operand:SF 1 "general_operand" "G,im,im,D,!u,D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=X,&d,X,X,X,X,&d,&d,X"))]
""
@@ -1483,7 +1483,7 @@
if (X_REG_P (operands[0]))
output_asm_insn (\"dex\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[2]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[2]));
if (!X_REG_P (operands[0]))
{
@@ -1552,7 +1552,7 @@
output_asm_insn (\"bpl\\t%l0\", ops);
output_asm_insn (\"deca\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[0]));
}
else
@@ -1570,7 +1570,7 @@
output_asm_insn (\"bpl\\t%l0\", ops);
}
output_asm_insn (\"dec\\t%h0\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[0]));
}
@@ -1653,7 +1653,7 @@
ops[0] = gen_label_rtx ();
output_asm_insn (\"bpl\\t%l0\", ops);
output_asm_insn (\"dex\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
return \"\";
}")
@@ -1810,7 +1810,7 @@
output_asm_insn (\"inx\", ops);
CC_STATUS_INIT;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[2]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[2]));
return \"\";
}")
@@ -1892,7 +1892,7 @@
output_asm_insn (\"bcc\\t%l3\", ops);
output_asm_insn (\"inx\", ops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[3]));
}
CC_STATUS_INIT;
@@ -1995,7 +1995,7 @@
output_asm_insn (inch_mem, ops);
}
}
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[2]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[2]));
CC_STATUS_INIT;
return \"\";
@@ -2060,7 +2060,7 @@
ops[0] = gen_label_rtx ();
output_asm_insn (\"bcc\\t%l0\", ops);
output_asm_insn (\"in%0\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
CC_STATUS_INIT;
return \"\";
}")
@@ -2258,7 +2258,7 @@
Register X/Y is lost, this is specified by the (clobber) statement. */
output_asm_insn (\"ts%3\", operands);
if (GET_CODE (operands[2]) == CONST_INT
- && ((val = INTVAL (operands[2]) >= 0 && val < 0x100))
+ && ((val = INTVAL (operands[2])) >= 0 && val < 0x100)
&& dead_register_here (insn, gen_rtx (REG, HImode, HARD_D_REGNUM)))
{
output_asm_insn (\"ldab\\t%2\", operands);
@@ -2538,7 +2538,7 @@
output_asm_insn (\"subd\\t%2\", operands);
output_asm_insn (\"bcc\\t%l0\", ops);
output_asm_insn (\"dex\", ops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
CC_STATUS_INIT;
return \"\";
}")
@@ -2565,7 +2565,7 @@
output_asm_insn (\"sbca\\t#0\", operands);
output_asm_insn (\"bcc\\t%l0\", ops);
output_asm_insn (\"dex\", ops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
CC_STATUS_INIT;
return \"\";
}")
@@ -3090,7 +3090,7 @@
if ((val & 0x0FF00) != 0x0FF00)
output_asm_insn (\"bclr\\t0,%2, %h1\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[2]));
return \"\";
}
@@ -3241,7 +3241,7 @@
output_asm_insn (\".relax\\t%l2\", ops);
m68hc11_gen_movhi (insn, ops);
output_asm_insn (\"bclr\\t0,%2, %1\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[2]));
return \"\";
}
@@ -3357,7 +3357,7 @@
if ((val & 0x0FF00) != 0)
output_asm_insn (\"bset\\t0,%2, %h1\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[2]));
return \"\";
}
@@ -3455,7 +3455,7 @@
output_asm_insn (\".relax\\t%l2\", ops);
m68hc11_gen_movhi (insn, ops);
output_asm_insn (\"bset\\t0,%2, %1\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[2]));
return \"\";
}
@@ -4283,7 +4283,7 @@
output_asm_insn (\"comb\\n\\tcoma\\n\\tinx\\n\\txgdx\", operands);
output_asm_insn (\"bne\\t%l0\", ops);
output_asm_insn (\"inx\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\", CODE_LABEL_NUMBER (ops[0]));
return \"\";
}")
@@ -4993,7 +4993,7 @@
output_asm_insn (\"comb\", operands);
CC_STATUS_INIT;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[0]));
return \"\";
}
@@ -5007,7 +5007,7 @@
output_asm_insn (\"bge\\t%l0\", ops);
output_asm_insn (\"deca\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[0]));
val -= 8;
@@ -5030,7 +5030,7 @@
output_asm_insn (\"bcc\\t%l0\", ops);
output_asm_insn (\"coma\", ops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[0]));
return \"\";
}
@@ -5722,14 +5722,14 @@
ops[1] = gen_label_rtx ();
output_asm_insn (\"ble\\t%l1\", ops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[0]));
output_asm_insn (\"lsrb\", operands);
output_asm_insn (\"deca\", operands);
output_asm_insn (\"bne\\t%l0\", ops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (ops[1]));
return \"\";
}")
diff --git a/gcc/config/m68k/3b1.h b/gcc/config/m68k/3b1.h
index 898ece10c66..655e45c8c81 100644
--- a/gcc/config/m68k/3b1.h
+++ b/gcc/config/m68k/3b1.h
@@ -52,7 +52,7 @@ Boston, MA 02111-1307, USA. */
/* Make output for SDB. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* The .file command should always begin the output. */
@@ -96,7 +96,6 @@ output_file_directive ((FILE), main_input_filename)
/* Override parts of m68k.h to fit the SGS-3b1 assembler. */
#undef TARGET_VERSION
-#undef ASM_FORMAT_PRIVATE_NAME
#undef ASM_OUTPUT_ALIGN
#undef ASM_OUTPUT_SOURCE_FILENAME
#undef ASM_OUTPUT_SOURCE_LINE
@@ -105,7 +104,6 @@ output_file_directive ((FILE), main_input_filename)
#undef FUNCTION_PROFILER
#undef ASM_OUTPUT_ADDR_VEC_ELT
#undef ASM_OUTPUT_ADDR_DIFF_ELT
-#undef ASM_OUTPUT_INTERNAL_LABEL
#undef ASM_OUTPUT_OPCODE
#undef ASM_OUTPUT_LOCAL
#undef USER_LABEL_PREFIX
@@ -113,13 +111,7 @@ output_file_directive ((FILE), main_input_filename)
#define TARGET_VERSION fprintf (stderr, " (68k, SGS/AT&T unixpc syntax)");
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
- sprintf ((OUTPUT), "%s_%%%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s_%%%lu"
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
do { \
@@ -323,9 +315,6 @@ do { \
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf ((LABEL), "%s%%%ld", (PREFIX), (long)(NUM))
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%%%d:\n", PREFIX, NUM)
-
/* Must put address in %a0 , not %d0 . -- LGM, 7/15/88 */
#define FUNCTION_PROFILER(FILE, LABEL_NO) \
fprintf (FILE, "\tmov.l &LP%%%d,%%a0\n\tjsr mcount\n", (LABEL_NO))
diff --git a/gcc/config/m68k/3b1g.h b/gcc/config/m68k/3b1g.h
index 5aecd462919..5850a8a0d22 100644
--- a/gcc/config/m68k/3b1g.h
+++ b/gcc/config/m68k/3b1g.h
@@ -41,7 +41,7 @@ Boston, MA 02111-1307, USA. */
#define CPP_PREDEFINES "-Dmc68000 -Dmc68k -Dunix -Dunixpc -Asystem=unix -Asystem=svr3 -Acpu=m68k -Amachine=m68k"
/* This is (not really) BSD, so (but) it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Specify how to pad function arguments.
Value should be `upward', `downward' or `none'.
diff --git a/gcc/config/m68k/amix.h b/gcc/config/m68k/amix.h
index b302d0ece2f..b634f391f8f 100644
--- a/gcc/config/m68k/amix.h
+++ b/gcc/config/m68k/amix.h
@@ -142,10 +142,3 @@ do { \
else \
sprintf (LABEL, "*%s%s%ld", LOCAL_LABEL_PREFIX, PREFIX, (long)(NUM)); \
} while (0)
-
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- if (flag_pic && !strcmp(PREFIX,"LC")) \
- fprintf (FILE, "%s%%%d:\n", PREFIX, NUM); \
- else \
- asm_fprintf (FILE, "%0L%s%d:\n", PREFIX, NUM)
diff --git a/gcc/config/m68k/atari.h b/gcc/config/m68k/atari.h
index 54ea0c2dad6..67528c3a7df 100644
--- a/gcc/config/m68k/atari.h
+++ b/gcc/config/m68k/atari.h
@@ -99,10 +99,3 @@ do { \
else \
sprintf (LABEL, "*%s%s%ld", LOCAL_LABEL_PREFIX, PREFIX, (long)(NUM)); \
} while (0)
-
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- if (flag_pic && !strcmp(PREFIX,"LC")) \
- fprintf (FILE, "%s%%%d:\n", PREFIX, NUM); \
- else \
- asm_fprintf (FILE, "%0L%s%d:\n", PREFIX, NUM)
diff --git a/gcc/config/m68k/ccur-GAS.h b/gcc/config/m68k/ccur-GAS.h
index 08909a83ade..4df5ec4bcd0 100644
--- a/gcc/config/m68k/ccur-GAS.h
+++ b/gcc/config/m68k/ccur-GAS.h
@@ -93,7 +93,7 @@ Boston, MA 02111-1307, USA. */
&& (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Override parts of m68k.h */
diff --git a/gcc/config/m68k/coff.h b/gcc/config/m68k/coff.h
index 9c677f0fada..88720d78157 100644
--- a/gcc/config/m68k/coff.h
+++ b/gcc/config/m68k/coff.h
@@ -24,7 +24,7 @@ Boston, MA 02111-1307, USA. */
/* Generate sdb debugging information. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* Output DBX (stabs) debugging information if using -gstabs. */
diff --git a/gcc/config/m68k/hp2bsd.h b/gcc/config/m68k/hp2bsd.h
index 769dc28698d..5e4501b83c4 100644
--- a/gcc/config/m68k/hp2bsd.h
+++ b/gcc/config/m68k/hp2bsd.h
@@ -59,7 +59,7 @@ Boston, MA 02111-1307, USA. */
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Define subroutines to call to handle multiply, divide, and remainder.
These routines are built into the c-library on the hp200.
diff --git a/gcc/config/m68k/hp310g.h b/gcc/config/m68k/hp310g.h
index c07a73b2cb6..d5c543eb3b2 100644
--- a/gcc/config/m68k/hp310g.h
+++ b/gcc/config/m68k/hp310g.h
@@ -5,7 +5,7 @@
/* This wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#define USE_GAS
diff --git a/gcc/config/m68k/hp320.h b/gcc/config/m68k/hp320.h
index 7a18c52256a..a7839bac1f9 100644
--- a/gcc/config/m68k/hp320.h
+++ b/gcc/config/m68k/hp320.h
@@ -171,9 +171,7 @@ Boston, MA 02111-1307, USA. */
#undef ASM_OUTPUT_SKIP
#undef ASM_OUTPUT_COMMON
#undef ASM_OUTPUT_LOCAL
-#undef ASM_FORMAT_PRIVATE_NAME
#undef FUNCTION_PROFILER
-#undef ASM_OUTPUT_INTERNAL_LABEL
#undef GLOBAL_ASM_OP
#undef IMMEDIATE_PREFIX
#undef REGISTER_PREFIX
@@ -249,20 +247,7 @@ Boston, MA 02111-1307, USA. */
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%u,2\n", (ROUNDED)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
-do{ if (PREFIX[0] == 'L' && PREFIX[1] == 'I') \
- fprintf(FILE, "\tset %s%d,.+2\n", PREFIX, NUM); \
- else \
- fprintf (FILE, "%s%d:\n", PREFIX, NUM); \
-} while(0)
+#define ASM_PN_FORMAT "%s___%lu"
#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
fprintf (FILE, "\tlong L%d\n", VALUE)
@@ -300,7 +285,7 @@ do { \
if (CODE == 'f') \
{ \
char dstr[30]; \
- REAL_VALUE_TO_DECIMAL (VALUE, "%.9g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 9, 0); \
fprintf ((FILE), "&0f%s", dstr); \
} \
else \
@@ -317,7 +302,7 @@ do { \
#undef ASM_OUTPUT_DOUBLE_OPERAND
#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
do { char dstr[30]; \
- REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1); \
fprintf (FILE, "&0f%s", dstr); \
} while (0)
@@ -326,7 +311,7 @@ do { \
#undef ASM_OUTPUT_LONG_DOUBLE_OPERAND
#define ASM_OUTPUT_LONG_DOUBLE_OPERAND(FILE,VALUE) \
do { char dstr[30]; \
- REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1); \
fprintf (FILE, "&0f%s", dstr); \
} while (0)
@@ -351,15 +336,11 @@ do { \
{ REAL_VALUE_TYPE r; long l; \
REAL_VALUE_FROM_CONST_DOUBLE (r, X); \
PRINT_OPERAND_FLOAT (CODE, FILE, r, l); } \
- else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \
- { REAL_VALUE_TYPE r; char dstr[30]; \
- REAL_VALUE_FROM_CONST_DOUBLE (r, X); \
- REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr); \
- fprintf (FILE, "&0f%s", dstr); } \
- else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == XFmode) \
- { REAL_VALUE_TYPE r; char dstr[30]; \
- REAL_VALUE_FROM_CONST_DOUBLE (r, X); \
- REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr); \
+ else if (GET_CODE (X) == CONST_DOUBLE \
+ && (GET_MODE (X) == DFmode || GET_MODE (X) == XFmode)) \
+ { char dstr[30]; \
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \
+ sizeof (dstr), 0, 1); \
fprintf (FILE, "&0f%s", dstr); } \
else { putc ('&', FILE); output_addr_const (FILE, X); }}
#endif
diff --git a/gcc/config/m68k/hp320g.h b/gcc/config/m68k/hp320g.h
index 1e931854e90..b20cc3d03cc 100644
--- a/gcc/config/m68k/hp320g.h
+++ b/gcc/config/m68k/hp320g.h
@@ -5,7 +5,7 @@
/* This wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#define USE_GAS
diff --git a/gcc/config/m68k/hp3bsd.h b/gcc/config/m68k/hp3bsd.h
index b5c6f33beac..23cc9c71b20 100644
--- a/gcc/config/m68k/hp3bsd.h
+++ b/gcc/config/m68k/hp3bsd.h
@@ -23,7 +23,7 @@
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Do not break .stabs pseudos into continuations. */
diff --git a/gcc/config/m68k/hp3bsd44.h b/gcc/config/m68k/hp3bsd44.h
index bf2d37ed1b8..780a639efa5 100644
--- a/gcc/config/m68k/hp3bsd44.h
+++ b/gcc/config/m68k/hp3bsd44.h
@@ -32,7 +32,7 @@
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Do not break .stabs pseudos into continuations. */
diff --git a/gcc/config/m68k/linux-aout.h b/gcc/config/m68k/linux-aout.h
index 08e2ef574a3..2be6da806a2 100644
--- a/gcc/config/m68k/linux-aout.h
+++ b/gcc/config/m68k/linux-aout.h
@@ -24,7 +24,7 @@ Boston, MA 02111-1307, USA. */
/* 68020 with 68881 */
#define TARGET_DEFAULT (MASK_BITFIELD|MASK_68881|MASK_68020)
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#define ASM_COMMENT_START "|"
diff --git a/gcc/config/m68k/linux.h b/gcc/config/m68k/linux.h
index af7b9285c2c..bf80cea9f9c 100644
--- a/gcc/config/m68k/linux.h
+++ b/gcc/config/m68k/linux.h
@@ -315,15 +315,6 @@ do { \
|| (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)) \
|| PCREL_GENERAL_OPERAND_OK)
-/* Turn off function cse if we are doing PIC. We always want function
- call to be done as `bsr foo@PLTPC', so it will force the assembler
- to create the PLT entry for `foo'. Doing function cse will cause
- the address of `foo' to be loaded into a register, which is exactly
- what we want to avoid when we are doing PIC on svr4 m68k. */
-#undef SUBTARGET_OVERRIDE_OPTIONS
-#define SUBTARGET_OVERRIDE_OPTIONS \
- if (flag_pic) flag_no_function_cse = 1;
-
/* For m68k SVR4, structures are returned using the reentrant
technique. */
#undef PCC_STATIC_STRUCT_RETURN
@@ -363,28 +354,3 @@ do { \
: "d" (_beg), "d" (_len) \
: "%d0", "%d2", "%d3"); \
}
-
-/* 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) \
-do { \
- if (DELTA > 0 && DELTA <= 8) \
- asm_fprintf (FILE, "\taddq.l %I%d,4(%Rsp)\n", DELTA); \
- else if (DELTA < 0 && DELTA >= -8) \
- asm_fprintf (FILE, "\tsubq.l %I%d,4(%Rsp)\n", -DELTA); \
- else \
- asm_fprintf (FILE, "\tadd.l %I%d,4(%Rsp)\n", DELTA); \
- \
- if (flag_pic) \
- { \
- fprintf (FILE, "\tbra.l "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "@PLTPC\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tjmp "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "\n"); \
- } \
-} while (0)
diff --git a/gcc/config/m68k/m68k-aout.h b/gcc/config/m68k/m68k-aout.h
index b65f9fefcd1..136ae61aec0 100644
--- a/gcc/config/m68k/m68k-aout.h
+++ b/gcc/config/m68k/m68k-aout.h
@@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
#include "m68k/m68kemb.h"
#include "aoutos.h"
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef SDB_DEBUGGING_INFO
/* If defined, a C expression whose value is a string containing the
diff --git a/gcc/config/m68k/m68k-protos.h b/gcc/config/m68k/m68k-protos.h
index 6a132beeb62..72120ead37f 100644
--- a/gcc/config/m68k/m68k-protos.h
+++ b/gcc/config/m68k/m68k-protos.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. Sun 68000/68020 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 5302ff20e61..9ab168dda6f 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -65,6 +65,10 @@ static void m68k_coff_asm_named_section PARAMS ((const char *, unsigned int));
#ifdef CTOR_LIST_BEGIN
static void m68k_svr3_asm_out_constructor PARAMS ((rtx, int));
#endif
+#ifdef HPUX_ASM
+static void m68k_hp320_internal_label PARAMS ((FILE *, const char *, unsigned long));
+#endif
+static void m68k_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
/* Alignment to use for loops and jumps */
@@ -121,6 +125,13 @@ int m68k_last_compare_had_fp_operands;
#define TARGET_ASM_FUNCTION_PROLOGUE m68k_output_function_prologue
#undef TARGET_ASM_FUNCTION_EPILOGUE
#define TARGET_ASM_FUNCTION_EPILOGUE m68k_output_function_epilogue
+#ifdef HPUX_ASM
+#undef TARGET_ASM_INTERNAL_LABEL
+#define TARGET_ASM_INTERNAL_LABEL m68k_hp320_internal_label
+#endif
+
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK m68k_output_mi_thunk
struct gcc_target targetm = TARGET_INITIALIZER;
@@ -174,6 +185,30 @@ override_options ()
else
m68k_align_funcs = i;
}
+
+ /* -fPIC uses 32-bit pc-relative displacements, which don't exist
+ until the 68020. */
+ if (! TARGET_68020 && flag_pic == 2)
+ error("-fPIC is not currently supported on the 68000 or 68010\n");
+
+ /* ??? A historic way of turning on pic, or is this intended to
+ be an embedded thing that doesn't have the same name binding
+ significance that it does on hosted ELF systems? */
+ if (TARGET_PCREL && flag_pic == 0)
+ flag_pic = 1;
+
+ /* Turn off function cse if we are doing PIC. We always want function call
+ to be done as `bsr foo@PLTPC', so it will force the assembler to create
+ the PLT entry for `foo'. Doing function cse will cause the address of
+ `foo' to be loaded into a register, which is exactly what we want to
+ avoid when we are doing PIC on svr4 m68k. */
+ if (flag_pic)
+ flag_no_function_cse = 1;
+
+ SUBTARGET_OVERRIDE_OPTIONS;
+
+ /* Tell the compiler which flavor of XFmode we're using. */
+ real_format_for_mode[XFmode - QFmode] = &ieee_extended_motorola_format;
}
/* This function generates the assembly code for function entry.
@@ -1119,7 +1154,7 @@ valid_dbcc_comparison_p (x, mode)
}
}
-/* Return non-zero if flags are currently in the 68881 flag register. */
+/* Return nonzero if flags are currently in the 68881 flag register. */
int
flags_in_68881 ()
{
@@ -1333,13 +1368,13 @@ output_scc_di(op, operand1, operand2, dest)
switch (op_code)
{
case EQ:
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("seq %5", loperands);
break;
case NE:
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("sne %5", loperands);
break;
@@ -1351,15 +1386,15 @@ output_scc_di(op, operand1, operand2, dest)
#else
output_asm_insn ("shi %5\n\tjra %l6", loperands);
#endif
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("sgt %5", loperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[6]));
break;
case GTU:
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("shi %5", loperands);
break;
@@ -1371,15 +1406,15 @@ output_scc_di(op, operand1, operand2, dest)
#else
output_asm_insn ("scs %5\n\tjra %l6", loperands);
#endif
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("slt %5", loperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[6]));
break;
case LTU:
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("scs %5", loperands);
break;
@@ -1391,15 +1426,15 @@ output_scc_di(op, operand1, operand2, dest)
#else
output_asm_insn ("scc %5\n\tjra %l6", loperands);
#endif
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("sge %5", loperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[6]));
break;
case GEU:
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("scc %5", loperands);
break;
@@ -1411,15 +1446,15 @@ output_scc_di(op, operand1, operand2, dest)
#else
output_asm_insn ("sls %5\n\tjra %l6", loperands);
#endif
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("sle %5", loperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[6]));
break;
case LEU:
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (loperands[4]));
output_asm_insn ("sls %5", loperands);
break;
@@ -1834,7 +1869,7 @@ output_move_himode (operands)
CODE_LABEL_NUMBER (XEXP (labelref, 0)));
#endif /* not SGS */
#else /* SGS_SWITCH_TABLES or not MOTOROLA */
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LI",
+ (*targetm.asm_out.internal_label) (asm_out_file, "LI",
CODE_LABEL_NUMBER (XEXP (labelref, 0)));
#ifdef SGS_SWITCH_TABLES
/* Set flag saying we need to define the symbol
@@ -2719,22 +2754,18 @@ floating_exact_log2 (x)
rtx x;
{
REAL_VALUE_TYPE r, r1;
- int i;
+ int exp;
REAL_VALUE_FROM_CONST_DOUBLE (r, x);
- if (REAL_VALUES_LESS (r, dconst0))
+ if (REAL_VALUES_LESS (r, dconst1))
return 0;
- r1 = dconst1;
- i = 0;
- while (REAL_VALUES_LESS (r1, r))
- {
- r1 = REAL_VALUE_LDEXP (dconst1, i);
- if (REAL_VALUES_EQUAL (r1, r))
- return i;
- i = i + 1;
- }
+ exp = real_exponent (&r);
+ real_2expN (&r1, exp);
+ if (REAL_VALUES_EQUAL (r1, r))
+ return exp;
+
return 0;
}
@@ -3119,7 +3150,7 @@ print_operand (file, op, letter)
macro. See m68k/sgs.h for an example; for versions without the bug.
Some assemblers refuse all the above solutions. The workaround is to
emit "K(pc,d0.l*2)" with K being a small constant known to give the
- right behaviour.
+ right behavior.
They also do not like things like "pea 1.w", so we simple leave off
the .w on small constants.
@@ -3815,3 +3846,82 @@ m68k_svr3_asm_out_constructor (symbol, priority)
output_asm_insn (output_move_simode (xop), xop);
}
#endif
+
+#ifdef HPUX_ASM
+static void
+m68k_hp320_internal_label (stream, prefix, labelno)
+ FILE *stream;
+ const char *prefix;
+ unsigned long labelno;
+{
+ if (prefix[0] == 'L' && prefix[1] == 'I')
+ fprintf(stream, "\tset %s%ld,.+2\n", prefix, labelno);
+ else
+ fprintf (stream, "%s%ld:\n", prefix, labelno);
+}
+#endif
+
+static void
+m68k_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ rtx xops[1];
+ const char *fmt;
+
+ if (delta > 0 && delta <= 8)
+ asm_fprintf (file, "\taddq.l %I%d,4(%Rsp)\n", (int) delta);
+ else if (delta < 0 && delta >= -8)
+ asm_fprintf (file, "\tsubq.l %I%d,4(%Rsp)\n", (int) -delta);
+ else
+ {
+ asm_fprintf (file, "\tadd.l %I");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ asm_fprintf (file, ",4(%Rsp)\n");
+ }
+
+ xops[0] = DECL_RTL (function);
+
+ /* Logic taken from call patterns in m68k.md. */
+ if (flag_pic)
+ {
+ if (TARGET_PCREL)
+ fmt = "bra.l %o0";
+ else
+ {
+#ifdef MOTOROLA
+#ifdef HPUX_ASM
+ fmt = "bra.l %0";
+#else
+#ifdef USE_GAS
+ fmt = "bra.l %0@PLTPC";
+#else
+ fmt = "bra %0@PLTPC";
+#endif
+#endif
+#else
+#ifdef USE_GAS
+ fmt = "bra.l %0";
+#else
+ fmt = "jbra %0,a1";
+#endif
+#endif
+ }
+ }
+ else
+ {
+#if defined (MOTOROLA) && !defined (USE_GAS)
+#ifdef MOTOROLA_BSR
+ fmt = "bra %0";
+#else
+ fmt = "jmp %0";
+#endif
+#else
+ fmt = "jbra %0";
+#endif
+ }
+
+ output_asm_insn (fmt, xops);
+}
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index feb27a2da4a..a5a63544c0b 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -69,7 +69,7 @@ extern int target_flags;
#define MASK_68881 2
#define TARGET_68881 (target_flags & MASK_68881)
-/* Compile using 68020 bitfield insns. */
+/* Compile using 68020 bit-field insns. */
#define MASK_BITFIELD 4
#define TARGET_BITFIELD (target_flags & MASK_BITFIELD)
@@ -277,15 +277,7 @@ extern int target_flags;
Don't use this macro to turn on various extra optimizations for
`-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
-#define OVERRIDE_OPTIONS \
-{ \
- override_options(); \
- if (! TARGET_68020 && flag_pic == 2) \
- error("-fPIC is not currently supported on the 68000 or 68010\n"); \
- if (TARGET_PCREL && flag_pic == 0) \
- flag_pic = 1; \
- SUBTARGET_OVERRIDE_OPTIONS; \
-}
+#define OVERRIDE_OPTIONS override_options()
/* These are meant to be redefined in the host dependent files */
#define SUBTARGET_SWITCHES
@@ -297,6 +289,11 @@ extern int target_flags;
/* Define for XFmode extended real floating point support. */
#define LONG_DOUBLE_TYPE_SIZE 96
+/* Set the value of FLT_EVAL_METHOD in float.h. When using 68040 fp
+ instructions, we get proper intermediate rounding, otherwise we
+ get extended precision results. */
+#define TARGET_FLT_EVAL_METHOD (TARGET_68040_ONLY ? 0 : 2)
+
/* Define this if most significant bit is lowest numbered
in instructions that operate on numbered bit-fields.
This is true for 68020 insns such as bfins and bfexts.
@@ -1193,10 +1190,8 @@ __transfer_from_trampoline () \
/* Addressing modes, and classification of registers for them. */
#define HAVE_POST_INCREMENT 1
-/* #define HAVE_POST_DECREMENT 0 */
#define HAVE_PRE_DECREMENT 1
-/* #define HAVE_PRE_INCREMENT 0 */
/* Macros to check register numbers against specific register classes. */
@@ -1743,12 +1738,6 @@ __transfer_from_trampoline () \
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
asm_fprintf (FILE, "%0U%s", NAME)
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- asm_fprintf (FILE, "%0L%s%d:\n", 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.
@@ -1810,14 +1799,6 @@ __transfer_from_trampoline () \
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%u\n", (ROUNDED)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* Output a float value (represented as a C double) as an immediate operand.
This macro is a 68k-specific macro. */
@@ -1826,7 +1807,7 @@ __transfer_from_trampoline () \
if (CODE == 'f') \
{ \
char dstr[30]; \
- REAL_VALUE_TO_DECIMAL (VALUE, "%.9g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 9, 0); \
asm_fprintf ((FILE), "%I0r%s", dstr); \
} \
else \
@@ -1841,7 +1822,7 @@ __transfer_from_trampoline () \
This macro is a 68k-specific macro. */
#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
do { char dstr[30]; \
- REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1); \
asm_fprintf (FILE, "%I0r%s", dstr); \
} while (0)
@@ -1849,7 +1830,7 @@ __transfer_from_trampoline () \
generated by m68k.md. */
#define ASM_OUTPUT_LONG_DOUBLE_OPERAND(FILE,VALUE) \
do { char dstr[30]; \
- REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1); \
asm_fprintf (FILE, "%I0r%s", dstr); \
} while (0)
diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
index 969e5dc3099..8ce07245216 100644
--- a/gcc/config/m68k/m68k.md
+++ b/gcc/config/m68k/m68k.md
@@ -2326,7 +2326,7 @@
#else
output_asm_insn (\"add%.l %#1,%2\", operands);
#endif
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (operands[3]));
return \"\";
}")
@@ -6187,7 +6187,7 @@
output_asm_insn (\"cmp%.w %#0,%0\;jne %l4\;cmp%.w %#0,%3\;jeq %l1\", operands);
#endif
}
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (operands[4]));
return \"\";
} ")
@@ -7481,7 +7481,7 @@
CODE_LABEL_NUMBER (XEXP (labelref, 0)));
#endif /* not SGS */
#else /* SGS_SWITCH_TABLES or not MOTOROLA */
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"LI\",
CODE_LABEL_NUMBER (XEXP (labelref, 0)));
#ifdef SGS_SWITCH_TABLES
/* Set flag saying we need to define the symbol
diff --git a/gcc/config/m68k/m68kelf.h b/gcc/config/m68k/m68kelf.h
index fef3ebcda85..7866a239209 100644
--- a/gcc/config/m68k/m68kelf.h
+++ b/gcc/config/m68k/m68kelf.h
@@ -251,20 +251,6 @@ extern int switch_table_difference_label_flag;
|| (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)) \
|| PCREL_GENERAL_OPERAND_OK)
-/* Turn off function cse if we are doing PIC. We always want function call
- to be done as `bsr foo@PLTPC', so it will force the assembler to create
- the PLT entry for `foo'. Doing function cse will cause the address of `foo'
- to be loaded into a register, which is exactly what we want to avoid when
- we are doing PIC on svr4 m68k. */
-#undef OVERRIDE_OPTIONS
-#define OVERRIDE_OPTIONS \
-{ \
- if (flag_pic) flag_no_function_cse = 1; \
- if (! TARGET_68020 && flag_pic == 2) \
- error("-fPIC is not currently supported on the 68000 or 68010\n"); \
- if (TARGET_PCREL && flag_pic == 0) \
- flag_pic = 1; \
-}
/* end of stuff from m68kv4.h */
#undef SGS_CMP_ORDER
diff --git a/gcc/config/m68k/m68kv4.h b/gcc/config/m68k/m68kv4.h
index fbe7c426731..5318824ecb3 100644
--- a/gcc/config/m68k/m68kv4.h
+++ b/gcc/config/m68k/m68kv4.h
@@ -283,19 +283,6 @@ int switch_table_difference_label_flag;
|| (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)) \
|| PCREL_GENERAL_OPERAND_OK)
-/* Turn off function cse if we are doing PIC. We always want function call
- to be done as `bsr foo@PLTPC', so it will force the assembler to create
- the PLT entry for `foo'. Doing function cse will cause the address of `foo'
- to be loaded into a register, which is exactly what we want to avoid when
- we are doing PIC on svr4 m68k. */
-#undef OVERRIDE_OPTIONS
-#define OVERRIDE_OPTIONS \
-{ \
- if (flag_pic) flag_no_function_cse = 1; \
- if (! TARGET_68020 && flag_pic == 2) \
- error("-fPIC is not currently supported on the 68000 or 68010\n"); \
-}
-
/* Output assembler code for a block containing the constant parts
of a trampoline, leaving space for the variable parts. */
diff --git a/gcc/config/m68k/mot3300.h b/gcc/config/m68k/mot3300.h
index 8868e6e537d..6304e531dea 100644
--- a/gcc/config/m68k/mot3300.h
+++ b/gcc/config/m68k/mot3300.h
@@ -120,7 +120,7 @@ Boston, MA 02111-1307, USA. */
/* Make output for SDB. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
#undef REGISTER_PREFIX
#define REGISTER_PREFIX "%"
@@ -276,14 +276,7 @@ Boston, MA 02111-1307, USA. */
#define GLOBAL_ASM_OP "\tglobal\t"
#endif /* USE_GAS */
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
- sprintf ((OUTPUT), "%s_%%%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s_%%%lu"
#undef INT_OP_GROUP
#ifdef USE_GAS
@@ -393,13 +386,6 @@ Boston, MA 02111-1307, USA. */
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf ((LABEL), "%s%s%ld", LOCAL_LABEL_PREFIX, (PREFIX), (long)(NUM))
-/* This is how to output 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) \
- asm_fprintf (FILE, "%L%s%d:\n", PREFIX, NUM)
-
/* The prefix to add to user-visible assembler symbols. */
#undef USER_LABEL_PREFIX
@@ -411,7 +397,7 @@ Boston, MA 02111-1307, USA. */
/* The L after the local prefix is the "L" prefix for the normal labels
generated by gcc; why are ASM_OUTPUT_ADDR_VEC_ELT and
ASM_OUTPUT_ADDR_DIFF_ELT not called with a PREFIX parameter, like
- ASM_OUTPUT_INTERNAL_LABEL ? */
+ (*targetm.asm_out.internal_label) ? */
#undef ASM_OUTPUT_ADDR_VEC_ELT
#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
diff --git a/gcc/config/m68k/netbsd-elf.h b/gcc/config/m68k/netbsd-elf.h
index 92291445452..62f67ef534d 100644
--- a/gcc/config/m68k/netbsd-elf.h
+++ b/gcc/config/m68k/netbsd-elf.h
@@ -103,10 +103,12 @@ Boston, MA 02111-1307, USA. */
#undef ASM_SPEC
#define ASM_SPEC \
- " %| %(asm_default_spec) \
+ "%(asm_default_spec) \
%{m68010} %{m68020} %{m68030} %{m68040} %{m68060} \
%{fpic:-k} %{fPIC:-k -K}"
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
+
/* Provide a LINK_SPEC appropriate for a NetBSD/m68k ELF target. */
#undef LINK_SPEC
@@ -273,17 +275,6 @@ while (0)
fprintf ((FILE), ",%u\n", (SIZE)))
-/* Turn off function cse if we are doing PIC. We always want function
- call to be done as `bsr foo@PLTPC', so it will force the assembler
- to create the PLT entry for `foo'. Doing function cse will cause
- the address of `foo' to be loaded into a register, which is exactly
- what we want to avoid when we are doing PIC on svr4 m68k. */
-
-#undef SUBTARGET_OVERRIDE_OPTIONS
-#define SUBTARGET_OVERRIDE_OPTIONS \
- if (flag_pic) flag_no_function_cse = 1;
-
-
/* XXX
This is the end of the chunk lifted from m68kelf.h */
@@ -432,36 +423,6 @@ while (0)
#undef DEFAULT_PCC_STRUCT_RETURN
#define DEFAULT_PCC_STRUCT_RETURN 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) \
-do \
- { \
- if (DELTA > 0 && DELTA <= 8) \
- asm_fprintf (FILE, "\taddq.l %I%d,4(%Rsp)\n", DELTA); \
- else if (DELTA < 0 && DELTA >= -8) \
- asm_fprintf (FILE, "\tsubq.l %I%d,4(%Rsp)\n", -DELTA); \
- else \
- asm_fprintf (FILE, "\tadd.l %I%d,4(%Rsp)\n", DELTA); \
- \
- if (flag_pic) \
- { \
- fprintf (FILE, "\tbra.l "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "@PLTPC\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tjmp "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "\n"); \
- } \
- } \
-while (0)
-
-
/* Output assembler code for a block containing the constant parts
of a trampoline, leaving space for the variable parts. */
diff --git a/gcc/config/m68k/netbsd.h b/gcc/config/m68k/netbsd.h
index 6397014b89f..69a88afe0d5 100644
--- a/gcc/config/m68k/netbsd.h
+++ b/gcc/config/m68k/netbsd.h
@@ -31,7 +31,9 @@
"%{!msoft-float:-D__HAVE_68881__ -D__HAVE_FPU__} %(netbsd_cpp_spec)"
#undef ASM_SPEC
-#define ASM_SPEC " %| %{m68030} %{m68040} %{m68060} %{fpic:-k} %{fPIC:-k -K}"
+#define ASM_SPEC "%{m68030} %{m68040} %{m68060} %{fpic:-k} %{fPIC:-k -K}"
+
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
/* Make gcc agree with <machine/ansi.h> */
@@ -48,7 +50,7 @@
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Do not break .stabs pseudos into continuations. */
diff --git a/gcc/config/m68k/openbsd.h b/gcc/config/m68k/openbsd.h
index ac3b6882c11..baa4ef0928c 100644
--- a/gcc/config/m68k/openbsd.h
+++ b/gcc/config/m68k/openbsd.h
@@ -1,5 +1,5 @@
/* Configuration file for an m68k OpenBSD target.
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -38,7 +38,9 @@ Boston, MA 02111-1307, USA. */
/* m68k as needs to know about the processor subtype. */
#undef ASM_SPEC
-#define ASM_SPEC "%| %{m68030} %{m68040} %{m68060} %{fpic:-k} %{fPIC:-k -K}"
+#define ASM_SPEC "%{m68030} %{m68040} %{m68060} %{fpic:-k} %{fPIC:-k -K}"
+
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
/* Layout of source language data types. */
@@ -63,7 +65,7 @@ Boston, MA 02111-1307, USA. */
/* Specific options for DBX Output. */
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Do not break .stabs pseudos into continuations. */
#define DBX_CONTIN_LENGTH 0
@@ -84,38 +86,3 @@ Boston, MA 02111-1307, USA. */
dwarf unwind information. egcs doesn't try too hard to check internal
configuration files... */
#define DWARF2_UNWIND_INFO 0
-
-
-/* TODO: ASM_OUTPUT_MI_THUNK is busted. I need to figure out
- what bra func@PLTPC means under linux, and find the corresponding
- construction for our gas/pic setup. */
-#if 0
-/* Taken from linux.h. Processor dependent optimized code to handle C++
- multiple inheritance vtable lookup. */
-
-/* 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) \
-do { \
- if (DELTA > 0 && DELTA <= 8) \
- asm_fprintf (FILE, "\taddq.l %I%d,4(%Rsp)\n", DELTA); \
- else if (DELTA < 0 && DELTA >= -8) \
- asm_fprintf (FILE, "\tsubq.l %I%d,4(%Rsp)\n", -DELTA); \
- else \
- asm_fprintf (FILE, "\tadd.l %I%d,4(%Rsp)\n", DELTA); \
- \
- if (flag_pic) \
- { \
- fprintf (FILE, "\tbra.l "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "@PLTPC\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tjmp "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "\n"); \
- } \
-} while (0)
-#endif
-
diff --git a/gcc/config/m68k/pbb.h b/gcc/config/m68k/pbb.h
index 01d96bce2c1..6eef2acaf47 100644
--- a/gcc/config/m68k/pbb.h
+++ b/gcc/config/m68k/pbb.h
@@ -47,7 +47,7 @@ Boston, MA 02111-1307, USA. */
/* We want DBX format for use with gdb under COFF. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Generate calls to memcpy, memcmp and memset. */
diff --git a/gcc/config/m68k/plexus.h b/gcc/config/m68k/plexus.h
index 35c8e1a15d7..0fac3e29dc7 100644
--- a/gcc/config/m68k/plexus.h
+++ b/gcc/config/m68k/plexus.h
@@ -85,7 +85,7 @@ Boston, MA 02111-1307, USA. */
#ifdef HAVE_GAS_2_X
#undef DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
#undef ASM_FILE_START
#define ASM_FILE_START(FILE) \
diff --git a/gcc/config/m68k/sgs.h b/gcc/config/m68k/sgs.h
index 949ea7dcaa7..fb799bed6bd 100644
--- a/gcc/config/m68k/sgs.h
+++ b/gcc/config/m68k/sgs.h
@@ -42,7 +42,7 @@ Boston, MA 02111-1307, USA. */
#define SWBEG_ASM_OP "\t.swbeg "
#define SET_ASM_OP "\t.set "
-#define ASM_PN_FORMAT "%s_%d" /* Format for private names */
+#define ASM_PN_FORMAT "%s_%lu" /* Format for private names */
/* Here are four prefixes that are used by asm_fprintf to
facilitate customization for alternate assembler syntaxes.
@@ -360,7 +360,7 @@ do { \
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
do { \
ASM_OUTPUT_BEFORE_CASE_LABEL((FILE),(PREFIX),(NUM),(TABLE)); \
- ASM_OUTPUT_INTERNAL_LABEL((FILE),(PREFIX),(NUM)); \
+ (*targetm.asm_out.internal_label)((FILE),(PREFIX),(NUM)); \
} while (0)
/* At end of a switch table, define LDnnn iff the symbol LInnn was defined.
@@ -390,13 +390,3 @@ extern int switch_table_difference_label_flag;
keep switch tables in the text section. */
#define JUMP_TABLES_IN_TEXT_SECTION 1
-
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), ASM_PN_FORMAT, (NAME), (LABELNO)))
-
diff --git a/gcc/config/m68k/sun2.h b/gcc/config/m68k/sun2.h
index 7c2d48e09e9..0f3dde3aeee 100644
--- a/gcc/config/m68k/sun2.h
+++ b/gcc/config/m68k/sun2.h
@@ -74,4 +74,4 @@ Boston, MA 02111-1307, USA. */
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
diff --git a/gcc/config/m68k/sun2o4.h b/gcc/config/m68k/sun2o4.h
index b3564c23335..0601bd07f84 100644
--- a/gcc/config/m68k/sun2o4.h
+++ b/gcc/config/m68k/sun2o4.h
@@ -121,7 +121,7 @@ Boston, MA 02111-1307, USA. */
} \
else \
{ char dstr[30]; \
- REAL_VALUE_TO_DECIMAL ((VALUE), "%.9g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 9, 0); \
fprintf (FILE, "#0r%s", dstr); \
} \
} while (0)
@@ -141,7 +141,7 @@ Boston, MA 02111-1307, USA. */
} \
else \
{ char dstr[30]; \
- REAL_VALUE_TO_DECIMAL ((VALUE), "%.20g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1); \
fprintf (FILE, "#0r%s", dstr); \
} \
} while (0)
diff --git a/gcc/config/m68k/sun3.h b/gcc/config/m68k/sun3.h
index 6f29be516f9..1d64599f332 100644
--- a/gcc/config/m68k/sun3.h
+++ b/gcc/config/m68k/sun3.h
@@ -161,7 +161,7 @@ Boston, MA 02111-1307, USA. */
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Generate calls to memcpy, memcmp and memset. */
#define TARGET_MEM_FUNCTIONS
@@ -208,7 +208,7 @@ Boston, MA 02111-1307, USA. */
} \
else \
{ char dstr[30]; \
- REAL_VALUE_TO_DECIMAL ((VALUE), "%.9g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 9, 0); \
asm_fprintf (FILE, "%I0r%s", dstr); \
} \
} while (0)
@@ -228,7 +228,7 @@ Boston, MA 02111-1307, USA. */
} \
else \
{ char dstr[30]; \
- REAL_VALUE_TO_DECIMAL ((VALUE), "%.17g", dstr); \
+ real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1); \
asm_fprintf (FILE, "%I0r%s", dstr); \
} \
} while (0)
diff --git a/gcc/config/m68k/tower-as.h b/gcc/config/m68k/tower-as.h
index 6c74368eb76..f81268b061c 100644
--- a/gcc/config/m68k/tower-as.h
+++ b/gcc/config/m68k/tower-as.h
@@ -46,7 +46,7 @@ Boston, MA 02111-1307, USA. */
#define CPP_SPEC "-D__TOWER_ASM__ %{m68881:-D__HAVE_68881__}"
/* We don't want local labels to start with period.
- See ASM_OUTPUT_INTERNAL_LABEL. */
+ See (*targetm.asm_out.internal_label). */
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX ""
@@ -68,7 +68,7 @@ Boston, MA 02111-1307, USA. */
/* Turn on SDB debugging info. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* All the ASM_OUTPUT macros need to conform to the Tower as syntax. */
@@ -210,14 +210,7 @@ Boston, MA 02111-1307, USA. */
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%d\n", ((SIZE) == 0) ? (ROUNDED) : (SIZE)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 11), \
- sprintf ((OUTPUT), "%s%%%%%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s%%%%%lu"
/* This is the command to make the user-level label named NAME
defined for reference from other files. */
@@ -229,10 +222,6 @@ Boston, MA 02111-1307, USA. */
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf ((LABEL), "%s%%%ld", (PREFIX), (long)(NUM))
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf ((FILE), "%s%%%d:\n", (PREFIX), (NUM))
-
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n", \
diff --git a/gcc/config/m68k/vxm68k.h b/gcc/config/m68k/vxm68k.h
index 161d063a129..a4daa367afa 100644
--- a/gcc/config/m68k/vxm68k.h
+++ b/gcc/config/m68k/vxm68k.h
@@ -65,7 +65,7 @@ Unrecognized value in TARGET_CPU_DEFAULT.
%{!mc68000:%{!m68000:%{!m68010:%{!mc68020:%{!m68020:%{!m68030:%{!m68040:%{!m68020-40:%{!m68302:%{!m68332:%(cpp_subtarget_cpu_default) }}}}}}}}}} \
"
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef SDB_DEBUGGING_INFO
/* These are the official values from WRS. */
diff --git a/gcc/config/m88k/aout-dbx.h b/gcc/config/m88k/aout-dbx.h
index 1b8446ba79b..4eef7d685ba 100644
--- a/gcc/config/m88k/aout-dbx.h
+++ b/gcc/config/m88k/aout-dbx.h
@@ -20,6 +20,6 @@ Boston, MA 02111-1307, USA. */
/* a.out with DBX. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#define DEFAULT_GDB_EXTENSIONS 0
diff --git a/gcc/config/m88k/m88k-aout.h b/gcc/config/m88k/m88k-aout.h
index aa553764890..50ea8dd3da7 100644
--- a/gcc/config/m88k/m88k-aout.h
+++ b/gcc/config/m88k/m88k-aout.h
@@ -21,7 +21,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#undef SDB_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#include "m88k/m88k.h"
#include "aoutos.h"
diff --git a/gcc/config/m88k/m88k-move.sh b/gcc/config/m88k/m88k-move.sh
index 5e757bd2180..874bc364ae5 100755
--- a/gcc/config/m88k/m88k-move.sh
+++ b/gcc/config/m88k/m88k-move.sh
@@ -44,7 +44,7 @@
# 27-Aug-90 Vince Guarna/Tom Wood
# Version 3 assembler syntax (-abi).
# 16-Aug-90 Ron Guilmette
-# Avoid problems on a Sparc. The common
+# Avoid problems on a SPARC. The common
# denominator among shells seems to be '...\'
# rather than '...\\'.
# 15-Aug-90 Ron Guilmette
diff --git a/gcc/config/m88k/m88k.c b/gcc/config/m88k/m88k.c
index 5da1a90b921..d63bcd2f148 100644
--- a/gcc/config/m88k/m88k.c
+++ b/gcc/config/m88k/m88k.c
@@ -74,6 +74,9 @@ static void m88k_svr3_asm_out_destructor PARAMS ((rtx, int));
static void m88k_select_section PARAMS ((tree, int, unsigned HOST_WIDE_INT));
static int m88k_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static void m88k_encode_section_info PARAMS ((tree, int));
+#ifdef AS_BUG_DOT_LABELS
+static void m88k_internal_label PARAMS ((FILE *, const char *, unsigned long));
+#endif
/* Initialize the GCC target structure. */
#undef TARGET_ASM_BYTE_OP
@@ -101,6 +104,10 @@ static void m88k_encode_section_info PARAMS ((tree, int));
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO m88k_encode_section_info
+#ifdef AS_BUG_DOT_LABELS
+#undef TARGET_ASM_INTERNAL_LABEL
+#define TARGET_ASM_INTERNAL_LABEL m88k_internal_label
+#endif
struct gcc_target targetm = TARGET_INITIALIZER;
@@ -246,7 +253,7 @@ output_load_const_dimode (operands)
do the move. Otherwise, return 0 and the caller will emit the move
normally.
- SCRATCH if non zero can be used as a scratch register for the move
+ SCRATCH if nonzero can be used as a scratch register for the move
operation. It is provided by a SECONDARY_RELOAD_* macro if needed. */
int
@@ -315,7 +322,7 @@ emit_move_sequence (operands, mode, scratch)
/* Return a legitimate reference for ORIG (either an address or a MEM)
using the register REG. If PIC and the address is already
position-independent, use ORIG. Newly generated position-independent
- addresses go into a reg. This is REG if non zero, otherwise we
+ addresses go into a reg. This is REG if nonzero, otherwise we
allocate register(s) as necessary. If this is called during reload,
and we need a second temp register, then we use SCRATCH, which is
provided via the SECONDARY_INPUT_RELOAD_CLASS mechanism. */
@@ -892,7 +899,9 @@ output_call (operands, addr)
jump = XVECEXP (final_sequence, 0, 1);
if (GET_CODE (jump) == JUMP_INSN)
{
+#ifndef USE_GAS
rtx low, high;
+#endif
const char *last;
rtx dest = XEXP (SET_SRC (PATTERN (jump)), 0);
int delta = 4 * (INSN_ADDRESSES (INSN_UID (dest))
@@ -1714,7 +1723,7 @@ void
output_label (label_number)
int label_number;
{
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", label_number);
+ (*targetm.asm_out.internal_label) (asm_out_file, "L", label_number);
}
/* Generate the assembly code for function entry.
@@ -1906,7 +1915,7 @@ m88k_layout_frame ()
m88k_stack_size = m88k_fp_offset + STARTING_FRAME_OFFSET;
/* First, combine m88k_stack_size and size. If m88k_stack_size is
- non-zero, align the frame size to 8 mod 16; otherwise align the
+ nonzero, align the frame size to 8 mod 16; otherwise align the
frame size to 0 mod 16. (If stacks are 8 byte aligned, this ends
up as a NOP. */
{
@@ -2921,7 +2930,7 @@ print_operand (file, x, code)
fprintf (file, "%d", value);
return;
- case 'S': /* compliment the value and then... */
+ case 'S': /* complement the value and then... */
value = ~value;
case 's': /* print the width and offset values forming the integer
constant with a SET instruction. See integer_ok_for_set. */
@@ -3339,3 +3348,15 @@ m88k_encode_section_info (decl, first)
SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (decl), 0)) = 1;
}
}
+
+#ifdef AS_BUG_DOT_LABELS /* The assembler requires a declaration of local. */
+static void
+m88k_internal_label (stream, prefix, labelno)
+ FILE *stream;
+ const char *prefix;
+ unsigned long labelno;
+{
+ fprintf (stream, TARGET_SVR4 ? ".%s%lu:\n%s.%s%lu\n" : "@%s%ld:\n",
+ prefix, labelno, INTERNAL_ASM_OP, prefix, labelno);
+}
+#endif
diff --git a/gcc/config/m88k/m88k.h b/gcc/config/m88k/m88k.h
index bdd323b031a..d6d1e8fac03 100644
--- a/gcc/config/m88k/m88k.h
+++ b/gcc/config/m88k/m88k.h
@@ -383,20 +383,12 @@ extern int flag_pic; /* -fpic */
when given unaligned data. */
#define STRICT_ALIGNMENT 1
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* Maximum size (in bits) to use for the largest integral type that
replaces a BLKmode type. */
/* #define MAX_FIXED_MODE_SIZE 0 */
-
-/* Check a `double' value for validity for a particular machine mode.
- This is defined to avoid crashes outputting certain constants.
- Since we output the number in hex, the assembler won't choke on it. */
-/* #define CHECK_FLOAT_VALUE(MODE,VALUE) */
-
-/* A code distinguishing the floating point format of the target machine. */
-/* #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT */
/*** Register Usage ***/
@@ -1112,7 +1104,7 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
fprintf (FILE, "\tor\t %s,%s,0\n", reg_names[11], reg_names[1]); \
/* Locate this block; transfer to the next instruction. */ \
fprintf (FILE, "\tbsr\t %s\n", &buf[1]); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LTRMP", labelno); \
+ (*targetm.asm_out.internal_label) (FILE, "LTRMP", labelno); \
/* Save r10; use it as the relative pointer; restore r1. */ \
fprintf (FILE, "\tst\t %s,%s,24\n", reg_names[10], reg_names[1]); \
fprintf (FILE, "\tor\t %s,%s,0\n", reg_names[10], reg_names[1]); \
@@ -1163,12 +1155,6 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
#define SELECT_CC_MODE(OP,X,Y) CCmode
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Recognize any constant value that is a valid address.
When PIC, we do not accept an address that would require a scratch reg
to load into a register. */
@@ -1885,25 +1871,11 @@ do { \
fputs (NAME, FILE); \
}
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class.
- For V.4, labels use `.' rather than `@'. */
-
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#ifdef AS_BUG_DOT_LABELS /* The assembler requires a declaration of local. */
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, TARGET_SVR4 ? ".%s%d:\n%s.%s%d\n" : "@%s%d:\n", \
- PREFIX, NUM, INTERNAL_ASM_OP, PREFIX, NUM)
-#else
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, TARGET_SVR4 ? ".%s%d:\n" : "@%s%d:\n", PREFIX, NUM)
-#endif /* AS_BUG_DOT_LABELS */
-
/* 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'. This must agree
- with ASM_OUTPUT_INTERNAL_LABEL above, except for being prefixed
+ with (*targetm.asm_out.internal_label) above, except for being prefixed
with an `*'. */
#undef ASM_GENERATE_INTERNAL_LABEL
@@ -1925,7 +1897,7 @@ do { \
readonly_data_section (); \
ASM_OUTPUT_ALIGN (FILE, 2); \
} \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \
} while (0)
/* Epilogue for case labels. This jump instruction is called by casesi
@@ -2000,13 +1972,6 @@ do { \
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%u,%d\n", (SIZE) ? (SIZE) : 1, (SIZE) <= 4 ? 4 : 8))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* This is how to output an insn to push a register on the stack.
It need not be very fast code. */
#define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
@@ -2038,10 +2003,10 @@ do { \
#define OCS_END_PREFIX "Lte"
#define PUT_OCS_FUNCTION_START(FILE) \
- { ASM_OUTPUT_INTERNAL_LABEL (FILE, OCS_START_PREFIX, m88k_function_number); }
+ { (*targetm.asm_out.internal_label) (FILE, OCS_START_PREFIX, m88k_function_number); }
#define PUT_OCS_FUNCTION_END(FILE) \
- { ASM_OUTPUT_INTERNAL_LABEL (FILE, OCS_END_PREFIX, m88k_function_number); }
+ { (*targetm.asm_out.internal_label) (FILE, OCS_END_PREFIX, m88k_function_number); }
/* Macros for debug information */
#define DEBUGGER_AUTO_OFFSET(X) \
diff --git a/gcc/config/m88k/m88k.md b/gcc/config/m88k/m88k.md
index 24a66f86ec8..edefd23db08 100644
--- a/gcc/config/m88k/m88k.md
+++ b/gcc/config/m88k/m88k.md
@@ -398,10 +398,10 @@
;;
;; When the extracted conditions are the same, the define_split patterns
;; below change extu/extu/{and,or} into {and,or}/extu. If the reversed
-;; conditions match, one compare word can be complimented, resulting in
+;; conditions match, one compare word can be complemented, resulting in
;; {and.c,or.c}/extu. These changes are done for ext/ext/{and,or} as well.
;; If the conditions don't line up, one can be rotated. To keep the pairwise
-;; relationship, it may be necessary to both rotate and compliment. Rotating
+;; relationship, it may be necessary to both rotate and complement. Rotating
;; makes branching cheaper, but doesn't help (or hurt) creating a value, so
;; we don't do this for ext/ext/{and,or}.
;;
@@ -430,7 +430,7 @@
; /* The conditions match. */
else if (GET_CODE (operands[1])
== reverse_condition (GET_CODE (operands[3])))
- /* Reverse the condition by complimenting the compare word. */
+ /* Reverse the condition by complementing the compare word. */
operands[4] = gen_rtx_NOT (CCmode, operands[4]);
else
{
@@ -525,7 +525,7 @@
(set (match_dup 0)
(match_op_dup 1 [(match_dup 5) (const_int 0)]))]
"operands[5] = gen_rtx_SUBREG (CCEVENmode, operands[5], 0);
- /* Reverse the condition by complimenting the compare word. */
+ /* Reverse the condition by complementing the compare word. */
if (GET_CODE (operands[1]) != GET_CODE (operands[3]))
operands[4] = gen_rtx_NOT (CCmode, operands[4]);")
@@ -585,7 +585,7 @@
; /* The conditions match. */
else if (GET_CODE (operands[1])
== reverse_condition (GET_CODE (operands[3])))
- /* Reverse the condition by complimenting the compare word. */
+ /* Reverse the condition by complementing the compare word. */
operands[4] = gen_rtx_NOT (CCmode, operands[4]);
else
{
@@ -677,7 +677,7 @@
(set (match_dup 0)
(match_op_dup 1 [(match_dup 5) (const_int 0)]))]
"operands[5] = gen_rtx_SUBREG (CCEVENmode, operands[5], 0);
- /* Reverse the condition by complimenting the compare word. */
+ /* Reverse the condition by complementing the compare word. */
if (GET_CODE (operands[1]) != GET_CODE (operands[3]))
operands[4] = gen_rtx_NOT (CCmode, operands[4]);")
diff --git a/gcc/config/mcore/mcore-elf.h b/gcc/config/mcore/mcore-elf.h
index 8d748031fa6..b4c7ae63d4b 100644
--- a/gcc/config/mcore/mcore-elf.h
+++ b/gcc/config/mcore/mcore-elf.h
@@ -28,17 +28,13 @@ Boston, MA 02111-1307, USA. */
#define SUBTARGET_CPP_PREDEFINES " -D__ELF__"
/* Use DWARF2 debugging info. */
-#ifndef DWARF2_DEBUGGING_INFO
#define DWARF2_DEBUGGING_INFO 1
-#endif
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
/* But allow DWARF 1 if the user wants it. */
-#ifndef DWARF_DEBUGGING_INFO
#define DWARF_DEBUGGING_INFO 1
-#endif
#define EXPORTS_SECTION_ASM_OP "\t.section .exports"
diff --git a/gcc/config/mcore/mcore-pe.h b/gcc/config/mcore/mcore-pe.h
index 6668574458d..a6ea4d4282c 100644
--- a/gcc/config/mcore/mcore-pe.h
+++ b/gcc/config/mcore/mcore-pe.h
@@ -33,7 +33,6 @@ Boston, MA 02111-1307, USA. */
#include "dbxcoff.h"
#undef SDB_DEBUGGING_INFO
-#undef DBX_DEBUGGING_INFO
#define DBX_DEBUGGING_INFO 1
/* Computed in toplev.c. */
@@ -126,7 +125,7 @@ drectve_section () \
assemble_name (FILE, \
XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
putc ('\n', FILE); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LM", sym_lineno); \
+ (*targetm.asm_out.internal_label) (FILE, "LM", sym_lineno); \
sym_lineno ++; \
} \
}
diff --git a/gcc/config/mcore/mcore.c b/gcc/config/mcore/mcore.c
index 650d0dd8a96..872fd7f5bc4 100644
--- a/gcc/config/mcore/mcore.c
+++ b/gcc/config/mcore/mcore.c
@@ -1296,7 +1296,7 @@ mcore_output_inline_const_forced (insn, operands, mode)
/* Now, work our way backwards emitting the constant. */
- /* Emit the value that remains -- it will be non-zero. */
+ /* Emit the value that remains -- it will be nonzero. */
operands[1] = GEN_INT (value);
output_asm_insn (output_inline_const (SImode, operands), operands);
@@ -1437,7 +1437,7 @@ mcore_output_movedouble (operands, mode)
/* Predicates used by the templates. */
-/* Non zero if OP can be source of a simple move operation. */
+/* Nonzero if OP can be source of a simple move operation. */
int
mcore_general_movsrc_operand (op, mode)
@@ -1451,7 +1451,7 @@ mcore_general_movsrc_operand (op, mode)
return general_operand (op, mode);
}
-/* Non zero if OP can be destination of a simple move operation. */
+/* Nonzero if OP can be destination of a simple move operation. */
int
mcore_general_movdst_operand (op, mode)
@@ -1483,7 +1483,7 @@ mcore_arith_reg_operand (op, mode)
return 1;
}
-/* Non zero if OP should be recognized during reload for an ixh/ixw
+/* Nonzero if OP should be recognized during reload for an ixh/ixw
operand. See the ixh/ixw patterns. */
int
@@ -1729,7 +1729,7 @@ mcore_expand_insv (operands)
return 1;
}
- /* Look at some bitfield placements that we aren't interested
+ /* Look at some bit-field placements that we aren't interested
in handling ourselves, unless specifically directed to do so. */
if (! TARGET_W_FIELD)
return 0; /* Generally, give up about now. */
@@ -2618,7 +2618,7 @@ mcore_output_jump_label_table ()
{
pool_node * p = pool_vector + i;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (p->label));
+ (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (p->label));
output_asm_insn (".long %0", &p->value);
}
@@ -3268,7 +3268,7 @@ mcore_function_arg_partial_nregs (cum, mode, type, named)
return reg;
}
-/* Return non-zero if SYMBOL is marked as being dllexport'd. */
+/* Return nonzero if SYMBOL is marked as being dllexport'd. */
int
mcore_dllexport_name_p (symbol)
const char * symbol;
@@ -3276,7 +3276,7 @@ mcore_dllexport_name_p (symbol)
return symbol[0] == '@' && symbol[1] == 'e' && symbol[2] == '.';
}
-/* Return non-zero if SYMBOL is marked as being dllimport'd. */
+/* Return nonzero if SYMBOL is marked as being dllimport'd. */
int
mcore_dllimport_name_p (symbol)
const char * symbol;
diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h
index 685d62013be..bfa8271b8f7 100644
--- a/gcc/config/mcore/mcore.h
+++ b/gcc/config/mcore/mcore.h
@@ -284,7 +284,7 @@ extern int mcore_stack_increment;
/* Every structures size must be a multiple of 8 bits. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* Look at the fundamental type that is used for a bitfield and use
+/* Look at the fundamental type that is used for a bit-field and use
that to impose alignment on the enclosing structure.
struct s {int a:8}; should have same alignment as "int", not "char". */
#define PCC_BITFIELD_TYPE_MATTERS 1
@@ -1173,16 +1173,6 @@ extern long mcore_current_compilation_timestamp;
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
sprintf (STRING, "*.%s%ld", PREFIX, (long) NUM)
-/* Output an internal label definition. */
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
-
-/* Construct a private name. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR,NAME,NUMBER) \
- ((OUTVAR) = (char *) alloca (strlen (NAME) + 10), \
- sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)))
-
/* Jump tables must be 32 bit aligned. */
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(STREAM,PREFIX,NUM,TABLE) \
diff --git a/gcc/config/mcore/mcore.md b/gcc/config/mcore/mcore.md
index 5bdedaf40d3..fe71e377290 100644
--- a/gcc/config/mcore/mcore.md
+++ b/gcc/config/mcore/mcore.md
@@ -2881,7 +2881,7 @@
}
else if (CONST_OK_FOR_K ((1 << INTVAL (operands[2])) - 1))
{
- /* A narrow bitfield (<=5 bits) means we can do a shift to put
+ /* A narrow bit-field (<=5 bits) means we can do a shift to put
it in place and then use an andi to extract it.
This is as good as a shiftleft/shiftright. */
@@ -3319,7 +3319,7 @@
""
"*
{
- int op0 = REGNO (operands[0]);
+ unsigned int op0 = REGNO (operands[0]);
if (GET_CODE (operands[3]) == REG)
{
diff --git a/gcc/config/mips/elf.h b/gcc/config/mips/elf.h
index 6e9004b6e67..c64bb46b621 100644
--- a/gcc/config/mips/elf.h
+++ b/gcc/config/mips/elf.h
@@ -22,13 +22,12 @@ Boston, MA 02111-1307, USA. */
/* Use ELF. */
#undef OBJECT_FORMAT_COFF
#undef EXTENDED_COFF
-#define OBJECT_FORMAT_ELF
/* ??? Move all SDB stuff into separate header file. */
#undef SDB_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
@@ -244,3 +243,6 @@ void FN () \
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "crtend%O%s crtn%O%s"
+
+/* We support #pragma. */
+#define HANDLE_SYSV_PRAGMA 1
diff --git a/gcc/config/mips/elf64.h b/gcc/config/mips/elf64.h
index b7ed0e158e5..e9bed21da10 100644
--- a/gcc/config/mips/elf64.h
+++ b/gcc/config/mips/elf64.h
@@ -22,11 +22,10 @@ Boston, MA 02111-1307, USA. */
#undef OBJECT_FORMAT_COFF
#undef EXTENDED_COFF
-#define OBJECT_FORMAT_ELF
#undef SDB_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
@@ -202,3 +201,6 @@ void FN () \
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "crtend%O%s crtn%O%s"
+
+/* We support #pragma. */
+#define HANDLE_SYSV_PRAGMA 1
diff --git a/gcc/config/mips/iris5gas.h b/gcc/config/mips/iris5gas.h
index a4985db87a5..7ba65656893 100644
--- a/gcc/config/mips/iris5gas.h
+++ b/gcc/config/mips/iris5gas.h
@@ -1,10 +1,10 @@
/* Definitions of target machine for GNU compiler. Irix version 5 with gas. */
/* Enable debugging. */
-#define DBX_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
-#define MIPS_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
+#define MIPS_DEBUGGING_INFO 1
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
/* GNU as does handle DWARF2 directives. */
diff --git a/gcc/config/mips/iris6.h b/gcc/config/mips/iris6.h
index 4761aa5a883..ddfea8f1473 100644
--- a/gcc/config/mips/iris6.h
+++ b/gcc/config/mips/iris6.h
@@ -139,8 +139,8 @@ Boston, MA 02111-1307, USA. */
} while (0)
/* Irix 6 uses DWARF-2. */
-#define DWARF2_DEBUGGING_INFO
-#define MIPS_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
+#define MIPS_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
diff --git a/gcc/config/mips/linux.h b/gcc/config/mips/linux.h
index d25cd51ddcc..959a065d2fc 100644
--- a/gcc/config/mips/linux.h
+++ b/gcc/config/mips/linux.h
@@ -252,3 +252,9 @@ void FN () \
/* The current Linux binutils uses MIPS_STABS_ELF and doesn't support
COFF. */
#undef SDB_DEBUGGING_INFO
+
+#undef LIB_SPEC
+#define LIB_SPEC "\
+%{!static:-rpath-link %R/lib:%R/usr/lib} \
+%{!shared: %{pthread:-lthread} \
+ %{profile:-lc_p} %{!profile: -lc}}"
diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h
index d9b12ba02dc..b557d3caec5 100644
--- a/gcc/config/mips/mips-protos.h
+++ b/gcc/config/mips/mips-protos.h
@@ -87,6 +87,7 @@ extern void init_cumulative_args PARAMS ((CUMULATIVE_ARGS *,
tree, rtx));
extern void gen_conditional_move PARAMS ((rtx *));
extern void mips_gen_conditional_trap PARAMS ((rtx *));
+extern void mips_emit_fcc_reload PARAMS ((rtx, rtx, rtx));
extern void mips_set_return_address PARAMS ((rtx, rtx));
extern void machine_dependent_reorg PARAMS ((rtx));
extern int mips_address_cost PARAMS ((rtx));
@@ -137,6 +138,8 @@ extern int mips_legitimate_address_p PARAMS ((enum machine_mode,
extern int mips_reg_mode_ok_for_base_p PARAMS ((rtx,
enum machine_mode,
int));
+extern bool mips_valid_pointer_mode PARAMS ((enum machine_mode));
+
extern int m16_uimm3_b PARAMS ((rtx, enum machine_mode));
extern int m16_simm4_1 PARAMS ((rtx, enum machine_mode));
extern int m16_nsimm4_1 PARAMS ((rtx, enum machine_mode));
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index f67c5454c0c..92944fb41ca 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -84,6 +84,8 @@ enum internal_test {
struct constant;
struct mips_arg_info;
static enum internal_test map_test_to_internal_test PARAMS ((enum rtx_code));
+static void get_float_compare_codes PARAMS ((enum rtx_code, enum rtx_code *,
+ enum rtx_code *));
static int mips16_simple_memory_operand PARAMS ((rtx, rtx,
enum machine_mode));
static int m16_check_op PARAMS ((rtx, int, int, int));
@@ -216,7 +218,7 @@ struct mips_arg_info
unsigned int stack_words;
/* The offset from the start of the stack overflow area of the argument's
- first stack word. Only meaningful when STACK_WORDS is non-zero. */
+ first stack word. Only meaningful when STACK_WORDS is nonzero. */
unsigned int stack_offset;
};
@@ -238,7 +240,7 @@ int sdb_label_count = 0;
/* Next label # for each statement for Silicon Graphics IRIS systems. */
int sym_lineno = 0;
-/* Non-zero if inside of a function, because the stupid MIPS asm can't
+/* Nonzero if inside of a function, because the stupid MIPS asm can't
handle .files inside of functions. */
int inside_function = 0;
@@ -352,11 +354,6 @@ int mips_split_addresses;
/* Generating calls to position independent functions? */
enum mips_abicalls_type mips_abicalls;
-/* High and low marks for floating point values which we will accept
- as legitimate constants for LEGITIMATE_CONSTANT_P. These are
- initialized in override_options. */
-REAL_VALUE_TYPE dfhigh, dflow, sfhigh, sflow;
-
/* Mode used for saving/restoring general purpose registers. */
static enum machine_mode gpr_mode;
@@ -370,6 +367,11 @@ char mips_hard_regno_mode_ok[(int)MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
constant pool is output. */
int mips_string_length;
+/* When generating mips16 code, a list of all strings that are to be
+ output after the current function. */
+
+static GTY(()) rtx mips16_strings;
+
/* In mips16 mode, we build a list of all the string constants we see
in a particular function. */
@@ -594,9 +596,8 @@ const struct mips_cpu_info mips_cpu_info_table[] = {
{ "r4000", PROCESSOR_R4000, 3 },
{ "vr4100", PROCESSOR_R4100, 3 },
{ "vr4111", PROCESSOR_R4111, 3 },
- { "vr4121", PROCESSOR_R4121, 3 },
+ { "vr4120", PROCESSOR_R4120, 3 },
{ "vr4300", PROCESSOR_R4300, 3 },
- { "vr4320", PROCESSOR_R4320, 3 },
{ "r4400", PROCESSOR_R4000, 3 }, /* = r4000 */
{ "r4600", PROCESSOR_R4600, 3 },
{ "orion", PROCESSOR_R4600, 3 }, /* = r4600 */
@@ -659,6 +660,9 @@ const struct mips_cpu_info mips_cpu_info_table[] = {
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
+#undef TARGET_VALID_POINTER_MODE
+#define TARGET_VALID_POINTER_MODE mips_valid_pointer_mode
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Return truth value of whether OP can be used as an operands
@@ -813,45 +817,22 @@ mips_const_double_ok (op, mode)
rtx op;
enum machine_mode mode;
{
- REAL_VALUE_TYPE d;
-
if (GET_CODE (op) != CONST_DOUBLE)
return 0;
if (mode == VOIDmode)
return 1;
+ /* We've no zero register in mips16 mode. */
+ if (TARGET_MIPS16)
+ return 0;
+
if (mode != SFmode && mode != DFmode)
return 0;
if (op == CONST0_RTX (mode))
return 1;
- /* ??? li.s does not work right with SGI's Irix 6 assembler. */
- if (mips_abi != ABI_32 && mips_abi != ABI_O64 && mips_abi != ABI_EABI)
- return 0;
-
- REAL_VALUE_FROM_CONST_DOUBLE (d, op);
-
- if (REAL_VALUE_ISNAN (d))
- return FALSE;
-
- if (REAL_VALUE_NEGATIVE (d))
- d = REAL_VALUE_NEGATE (d);
-
- if (mode == DFmode)
- {
- if (REAL_VALUES_LESS (d, dfhigh)
- && REAL_VALUES_LESS (dflow, d))
- return 1;
- }
- else
- {
- if (REAL_VALUES_LESS (d, sfhigh)
- && REAL_VALUES_LESS (sflow, d))
- return 1;
- }
-
return 0;
}
@@ -863,9 +844,6 @@ const_float_1_operand (op, mode)
enum machine_mode mode;
{
REAL_VALUE_TYPE d;
- static REAL_VALUE_TYPE onedf;
- static REAL_VALUE_TYPE onesf;
- static int one_initialized;
if (GET_CODE (op) != CONST_DOUBLE
|| mode != GET_MODE (op)
@@ -874,19 +852,7 @@ const_float_1_operand (op, mode)
REAL_VALUE_FROM_CONST_DOUBLE (d, op);
- /* We only initialize these values if we need them, since we will
- never get called unless mips_isa >= 4. */
- if (! one_initialized)
- {
- onedf = REAL_VALUE_ATOF ("1.0", DFmode);
- onesf = REAL_VALUE_ATOF ("1.0", SFmode);
- one_initialized = 1;
- }
-
- if (mode == DFmode)
- return REAL_VALUES_EQUAL (d, onedf);
- else
- return REAL_VALUES_EQUAL (d, onesf);
+ return REAL_VALUES_EQUAL (d, dconst1);
}
/* Return true if a memory load or store of REG plus OFFSET in MODE
@@ -1496,7 +1462,7 @@ mips_reg_mode_ok_for_base_p (reg, mode, strict)
/* This function is used to implement GO_IF_LEGITIMATE_ADDRESS. It
returns a nonzero value if XINSN is a legitimate address for a
- memory operand of the indicated MODE. STRICT is non-zero if this
+ memory operand of the indicated MODE. STRICT is nonzero if this
function is called during reload. */
int
@@ -3144,7 +3110,7 @@ map_test_to_internal_test (test_code)
??? This is called with result nonzero by the Scond patterns in
mips.md. These patterns are called with a target in the mode of
the Scond instruction pattern. Since this must be a constant, we
- must use SImode. This means that if RESULT is non-zero, it will
+ must use SImode. This means that if RESULT is nonzero, it will
always be an SImode register, even if TARGET_64BIT is true. We
cope with this by calling convert_move rather than emit_move_insn.
This will sometimes lead to an unnecessary extension of the result;
@@ -3354,6 +3320,34 @@ gen_int_relational (test_code, result, cmp0, cmp1, p_invert)
return result;
}
+/* Work out how to check a floating-point condition. We need a
+ separate comparison instruction (C.cond.fmt), followed by a
+ branch or conditional move. Given that IN_CODE is the
+ required condition, set *CMP_CODE to the C.cond.fmt code
+ and *action_code to the branch or move code. */
+
+static void
+get_float_compare_codes (in_code, cmp_code, action_code)
+ enum rtx_code in_code, *cmp_code, *action_code;
+{
+ switch (in_code)
+ {
+ case NE:
+ case UNGE:
+ case UNGT:
+ case LTGT:
+ case ORDERED:
+ *cmp_code = reverse_condition_maybe_unordered (in_code);
+ *action_code = EQ;
+ break;
+
+ default:
+ *cmp_code = in_code;
+ *action_code = NE;
+ break;
+ }
+}
+
/* Emit the common code for doing conditional branches.
operand[0] is the label to jump to.
The comparison operands are saved away by cmp{si,di,sf,df}. */
@@ -3367,6 +3361,7 @@ gen_conditional_branch (operands, test_code)
rtx cmp0 = branch_cmp[0];
rtx cmp1 = branch_cmp[1];
enum machine_mode mode;
+ enum rtx_code cmp_code;
rtx reg;
int invert;
rtx label1, label2;
@@ -3386,7 +3381,7 @@ gen_conditional_branch (operands, test_code)
test_code = NE;
}
else if (GET_CODE (cmp1) == CONST_INT && INTVAL (cmp1) != 0)
- /* We don't want to build a comparison against a non-zero
+ /* We don't want to build a comparison against a nonzero
constant. */
cmp1 = force_reg (mode, cmp1);
@@ -3399,15 +3394,10 @@ gen_conditional_branch (operands, test_code)
else
reg = gen_reg_rtx (CCmode);
- /* For cmp0 != cmp1, build cmp0 == cmp1, and test for result ==
- 0 in the instruction built below. The MIPS FPU handles
- inequality testing by testing for equality and looking for a
- false result. */
+ get_float_compare_codes (test_code, &cmp_code, &test_code);
emit_insn (gen_rtx_SET (VOIDmode, reg,
- gen_rtx (test_code == NE ? EQ : test_code,
- CCmode, cmp0, cmp1)));
+ gen_rtx (cmp_code, CCmode, cmp0, cmp1)));
- test_code = test_code == NE ? EQ : NE;
mode = CCmode;
cmp0 = reg;
cmp1 = const0_rtx;
@@ -3501,8 +3491,8 @@ gen_conditional_move (operands)
abort ();
}
}
- else if (cmp_code == NE)
- cmp_code = EQ, move_code = EQ;
+ else
+ get_float_compare_codes (cmp_code, &cmp_code, &move_code);
if (mode == SImode || mode == DImode)
cmp_mode = mode;
@@ -3563,6 +3553,51 @@ mips_gen_conditional_trap (operands)
operands[1]));
}
+/* Return true if operand OP is a condition code register.
+ Only for use during or after reload. */
+
+int
+fcc_register_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ return ((mode == VOIDmode || mode == GET_MODE (op))
+ && (reload_in_progress || reload_completed)
+ && (GET_CODE (op) == REG || GET_CODE (op) == SUBREG)
+ && ST_REG_P (true_regnum (op)));
+}
+
+/* Emit code to move general operand SRC into condition-code
+ register DEST. SCRATCH is a scratch TFmode float register.
+ The sequence is:
+
+ FP1 = SRC
+ FP2 = 0.0f
+ DEST = FP2 < FP1
+
+ where FP1 and FP2 are single-precision float registers
+ taken from SCRATCH. */
+
+void
+mips_emit_fcc_reload (dest, src, scratch)
+ rtx dest, src, scratch;
+{
+ rtx fp1, fp2;
+
+ /* Change the source to SFmode. */
+ if (GET_CODE (src) == MEM)
+ src = adjust_address (src, SFmode, 0);
+ else if (GET_CODE (src) == REG || GET_CODE (src) == SUBREG)
+ src = gen_rtx_REG (SFmode, true_regnum (src));
+
+ fp1 = gen_rtx_REG (SFmode, REGNO (scratch));
+ fp2 = gen_rtx_REG (SFmode, REGNO (scratch) + FP_INC);
+
+ emit_move_insn (copy_rtx (fp1), src);
+ emit_move_insn (copy_rtx (fp2), CONST0_RTX (SFmode));
+ emit_insn (gen_slt_sf (dest, fp2, fp1));
+}
+
/* Emit code to change the current function's return address to
ADDRESS. SCRATCH is available as a scratch register, if needed.
ADDRESS and SCRATCH are both word-mode GPRs. */
@@ -5310,14 +5345,6 @@ override_options ()
else
mips16 = 0;
- /* Initialize the high and low values for legitimate floating point
- constants. Rather than trying to get the accuracy down to the
- last bit, just use approximate ranges. */
- dfhigh = REAL_VALUE_ATOF ("1.0e300", DFmode);
- dflow = REAL_VALUE_ATOF ("1.0e-300", DFmode);
- sfhigh = REAL_VALUE_ATOF ("1.0e38", SFmode);
- sflow = REAL_VALUE_ATOF ("1.0e-38", SFmode);
-
mips_print_operand_punct['?'] = 1;
mips_print_operand_punct['#'] = 1;
mips_print_operand_punct['&'] = 1;
@@ -5411,7 +5438,9 @@ override_options ()
/* Allow integer modes that fit into a single
register. We need to put integers into FPRs
when using instructions like cvt and trunc. */
- || (class == MODE_INT && size <= UNITS_PER_FPREG)));
+ || (class == MODE_INT && size <= UNITS_PER_FPREG)
+ /* Allow TFmode for CCmode reloads. */
+ || (ISA_HAS_8CC && mode == TFmode)));
else if (MD_REG_P (regno))
temp = (class == MODE_INT
@@ -5884,12 +5913,10 @@ print_operand (file, op, letter)
else if (code == CONST_DOUBLE
&& GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT)
{
- REAL_VALUE_TYPE d;
- char s[30];
+ char s[60];
- REAL_VALUE_FROM_CONST_DOUBLE (d, op);
- REAL_VALUE_TO_DECIMAL (d, "%.20e", s);
- fprintf (file, s);
+ real_to_decimal (s, CONST_DOUBLE_REAL_VALUE (op), sizeof (s), 0, 1);
+ fputs (s, file);
}
else if (letter == 'x' && GET_CODE (op) == CONST_INT)
@@ -6062,7 +6089,7 @@ mips_assemble_integer (x, size, aligned_p)
If we have -G 0, or the extern size is unknown, or the object is in a user
specified section that is not .sbss/.sdata, don't bother emitting the
- .externs. In the case of user specified sections this behaviour is
+ .externs. In the case of user specified sections this behavior is
required as otherwise GAS will think the object lives in .sbss/.sdata. */
int
@@ -6897,7 +6924,6 @@ save_restore_insns (store_p, large_reg, large_offset)
HOST_WIDE_INT gp_offset;
HOST_WIDE_INT fp_offset;
HOST_WIDE_INT end_offset;
- rtx insn;
if (frame_pointer_needed
&& ! BITSET_P (mask, HARD_FRAME_POINTER_REGNUM - GP_REG_FIRST))
@@ -6951,11 +6977,9 @@ save_restore_insns (store_p, large_reg, large_offset)
base_reg_rtx = gen_rtx_REG (Pmode, MIPS_TEMP2_REGNUM);
base_offset = large_offset;
if (Pmode == DImode)
- insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg,
- stack_pointer_rtx));
+ emit_insn (gen_adddi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
else
- insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg,
- stack_pointer_rtx));
+ emit_insn (gen_addsi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
}
else
{
@@ -7060,11 +7084,9 @@ save_restore_insns (store_p, large_reg, large_offset)
base_reg_rtx = gen_rtx_REG (Pmode, MIPS_TEMP2_REGNUM);
base_offset = large_offset;
if (Pmode == DImode)
- insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg,
- stack_pointer_rtx));
+ emit_insn (gen_adddi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
else
- insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg,
- stack_pointer_rtx));
+ emit_insn (gen_addsi3 (base_reg_rtx, large_reg, stack_pointer_rtx));
}
else
{
@@ -7687,6 +7709,7 @@ mips_output_function_epilogue (file, size)
HOST_WIDE_INT size ATTRIBUTE_UNUSED;
{
const char *fnname = ""; /* FIXME: Correct initialisation? */
+ rtx string;
#ifndef FUNCTION_NAME_ALREADY_DECLARED
/* Get the function name the same way that toplev.c does before calling
@@ -7751,6 +7774,17 @@ mips_output_function_epilogue (file, size)
string_constants = next;
}
+ /* If any following function uses the same strings as this one, force
+ them to refer those strings indirectly. Nearby functions could
+ refer them using pc-relative addressing, but it isn't safe in
+ general. For instance, some functions may be placed in sections
+ other than .text, and we don't know whether they be close enough
+ to this one. In large files, even other .text functions can be
+ too far away. */
+ for (string = mips16_strings; string != 0; string = XEXP (string, 1))
+ SYMBOL_REF_FLAG (XEXP (string, 0)) = 0;
+ free_EXPR_LIST_list (&mips16_strings);
+
/* Restore the output file if optimizing the GP (optimizing the GP causes
the text to be diverted to a tempfile, so that data decls come before
references to the data). */
@@ -7938,7 +7972,7 @@ mips_can_use_return_insn ()
return compute_frame_size (get_frame_size ()) == 0;
}
-/* Returns non-zero if X contains a SYMBOL_REF. */
+/* Returns nonzero if X contains a SYMBOL_REF. */
static int
symbolic_expression_p (x)
@@ -8092,7 +8126,7 @@ mips_select_section (decl, reloc, align)
precisely correct.
When not mips16 code nor embedded PIC, if a symbol is in a
- gp addresable section, SYMBOL_REF_FLAG is set prevent gcc from
+ gp addressable section, SYMBOL_REF_FLAG is set prevent gcc from
splitting the reference so that gas can generate a gp relative
reference.
@@ -8129,7 +8163,11 @@ mips_encode_section_info (decl, first)
&& (! current_function_decl
|| ! DECL_ONE_ONLY (current_function_decl)))
{
- SYMBOL_REF_FLAG (XEXP (TREE_CST_RTL (decl), 0)) = 1;
+ rtx symref;
+
+ symref = XEXP (TREE_CST_RTL (decl), 0);
+ mips16_strings = alloc_EXPR_LIST (0, symref, mips16_strings);
+ SYMBOL_REF_FLAG (symref) = 1;
mips_string_length += TREE_STRING_LENGTH (decl);
}
}
@@ -8526,6 +8564,14 @@ mips_class_max_nregs (class, mode)
else
return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
}
+
+bool
+mips_valid_pointer_mode (mode)
+ enum machine_mode mode;
+{
+ return (mode == SImode || (TARGET_64BIT && mode == DImode));
+}
+
/* For each mips16 function which refers to GP relative symbols, we
use a pseudo register, initialized at the start of the function, to
@@ -8771,7 +8817,7 @@ mips16_constant (x, mode, addr, addend)
/* Write out code to move floating point arguments in or out of
general registers. Output the instructions to FILE. FP_CODE is
the code describing which arguments are present (see the comment at
- the definition of CUMULATIVE_ARGS in mips.h). FROM_FP_P is non-zero if
+ the definition of CUMULATIVE_ARGS in mips.h). FROM_FP_P is nonzero if
we are copying from the floating point registers. */
static void
@@ -9968,11 +10014,11 @@ mips_adjust_insn_length (insn, length)
INSN is the branch instruction. OPERANDS[0] is the condition.
OPERANDS[1] is the target of the branch. OPERANDS[2] is the target
of the first operand to the condition. If TWO_OPERANDS_P is
- non-zero the comparison takes two operands; OPERANDS[3] will be the
+ nonzero the comparison takes two operands; OPERANDS[3] will be the
second operand.
- If INVERTED_P is non-zero we are to branch if the condition does
- not hold. If FLOAT_P is non-zero this is a floating-point comparison.
+ If INVERTED_P is nonzero we are to branch if the condition does
+ not hold. If FLOAT_P is nonzero this is a floating-point comparison.
LENGTH is the length (in bytes) of the sequence we are to generate.
That tells us whether to generate a simple conditional branch, or a
@@ -9994,7 +10040,7 @@ mips_output_conditional_branch (insn,
static char buffer[200];
/* The kind of comparison we are doing. */
enum rtx_code code = GET_CODE (operands[0]);
- /* Non-zero if the opcode for the comparison needs a `z' indicating
+ /* Nonzero if the opcode for the comparison needs a `z' indicating
that it is a comparision against zero. */
int need_z_p;
/* A string to use in the assembly output to represent the first
@@ -10021,7 +10067,7 @@ mips_output_conditional_branch (insn,
subtract B from A and then look at the sign bit. But, if we
are doing an unsigned comparison, and B is zero, we don't
have to do the subtraction. Instead, we can just check to
- see if A is non-zero. Thus, we change the CODE here to
+ see if A is nonzero. Thus, we change the CODE here to
reflect the simpler comparison operation. */
switch (code)
{
@@ -10130,7 +10176,7 @@ mips_output_conditional_branch (insn,
INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
}
output_asm_insn ("%>%)", 0);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (target));
return "";
}
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index ee5ccf2f48c..5fdb9bfb4eb 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -64,9 +64,8 @@ enum processor_type {
PROCESSOR_R4000,
PROCESSOR_R4100,
PROCESSOR_R4111,
- PROCESSOR_R4121,
+ PROCESSOR_R4120,
PROCESSOR_R4300,
- PROCESSOR_R4320,
PROCESSOR_R4600,
PROCESSOR_R4650,
PROCESSOR_R5000,
@@ -123,7 +122,7 @@ enum block_move_type {
BLOCK_MOVE_LAST /* generate just the last store */
};
-/* Information about one recognised processor. Defined here for the
+/* Information about one recognized processor. Defined here for the
benefit of TARGET_CPU_CPP_BUILTINS. */
struct mips_cpu_info {
/* The 'canonical' name of the processor as far as GCC is concerned.
@@ -357,10 +356,9 @@ extern void sbss_section PARAMS ((void));
/* Architecture target defines. */
#define TARGET_MIPS3900 (mips_arch == PROCESSOR_R3900)
#define TARGET_MIPS4000 (mips_arch == PROCESSOR_R4000)
-#define TARGET_MIPS4100 (mips_arch == PROCESSOR_R4100
-#define TARGET_MIPS4121 (mips_arch == PROCESSOR_R4121)
+#define TARGET_MIPS4100 (mips_arch == PROCESSOR_R4100)
+#define TARGET_MIPS4120 (mips_arch == PROCESSOR_R4120)
#define TARGET_MIPS4300 (mips_arch == PROCESSOR_R4300)
-#define TARGET_MIPS4320 (mips_arch == PROCESSOR_R4320)
#define TARGET_MIPS4KC (mips_arch == PROCESSOR_R4KC)
#define TARGET_MIPS5KC (mips_arch == PROCESSOR_R5KC)
#define TARGET_MIPS5400 (mips_arch == PROCESSOR_R5400)
@@ -769,7 +767,6 @@ extern void sbss_section PARAMS ((void));
/* Generate three-operand multiply instructions for SImode. */
#define GENERATE_MULT3_SI ((TARGET_MIPS3900 \
- || TARGET_MIPS4320 \
|| TARGET_MIPS5400 \
|| TARGET_MIPS5500 \
|| ISA_MIPS32 \
@@ -1220,9 +1217,9 @@ extern int mips_abi;
#endif
-#define SDB_DEBUGGING_INFO /* generate info for mips-tfile */
-#define DBX_DEBUGGING_INFO /* generate stabs (OSF/rose) */
-#define MIPS_DEBUGGING_INFO /* MIPS specific debugging info */
+#define SDB_DEBUGGING_INFO 1 /* generate info for mips-tfile */
+#define DBX_DEBUGGING_INFO 1 /* generate stabs (OSF/rose) */
+#define MIPS_DEBUGGING_INFO 1 /* MIPS specific debugging info */
#ifndef PREFERRED_DEBUGGING_TYPE /* assume SDB_DEBUGGING_INFO */
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
@@ -1575,14 +1572,14 @@ do { \
handle alignment of bitfields and the structures that contain
them.
- The behavior is that the type written for a bitfield (`int',
+ The behavior is that the type written for a bit-field (`int',
`short', or other integer type) imposes an alignment for the
entire structure, as if the structure really did contain an
- ordinary field of that type. In addition, the bitfield is placed
+ ordinary field of that type. In addition, the bit-field is placed
within the structure so that it would fit within such a field,
not crossing a boundary for it.
- Thus, on most machines, a bitfield whose type is written as `int'
+ Thus, on most machines, a bit-field whose type is written as `int'
would not cross a four-byte boundary, and would force four-byte
alignment for the whole structure. (The alignment used may not
be four bytes; it is controlled by the other alignment
@@ -2299,7 +2296,7 @@ extern enum reg_class mips_char_to_class[256];
/* Certain machines have the property that some registers cannot be
copied to some other registers without using memory. Define this
- macro on those machines to be a C expression that is non-zero if
+ macro on those machines to be a C expression that is nonzero if
objects of mode MODE in registers of CLASS1 can only be copied to
registers of class CLASS2 by storing a register of CLASS1 into
memory and loading that memory location into a register of CLASS2.
@@ -2471,7 +2468,7 @@ extern enum reg_class mips_char_to_class[256];
{ FRAME_POINTER_REGNUM, GP_REG_FIRST + 30}, \
{ FRAME_POINTER_REGNUM, GP_REG_FIRST + 17}}
-/* A C expression that returns non-zero if the compiler is allowed to
+/* A C expression that returns nonzero if the compiler is allowed to
try to replace register number FROM-REG with register number
TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is
defined, and will usually be the constant 1, since most of the
@@ -2687,10 +2684,6 @@ extern enum reg_class mips_char_to_class[256];
(PRETEND_SIZE) = mips_setup_incoming_varargs (&(CUM), (MODE), \
(TYPE), (NO_RTL))
-
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
-
#define STRICT_ARGUMENT_NAMING (mips_abi != ABI_32 && mips_abi != ABI_O64)
/* Define a data type for recording info about an argument list
@@ -3006,12 +2999,6 @@ typedef struct mips_args {
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* These assume that REGNO is a hard or pseudo reg number.
They give nonzero only if REGNO is a hard reg of the suitable class
or a pseudo reg currently allocated to a suitable hard reg.
@@ -3828,6 +3815,7 @@ typedef struct mips_args {
REG, SIGN_EXTEND }}, \
{"consttable_operand", { LABEL_REF, SYMBOL_REF, CONST_INT, \
CONST_DOUBLE, CONST }}, \
+ {"fcc_register_operand", { REG, SUBREG }}, \
{"extend_operator", { SIGN_EXTEND, ZERO_EXTEND }}, \
{"highpart_shift_operator", { ASHIFTRT, LSHIFTRT, ROTATERT, ROTATE }},
@@ -4390,14 +4378,6 @@ do { \
#undef ASM_DECLARE_FUNCTION_NAME
#define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL)
-
-/* This is how to output 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(STREAM,PREFIX,NUM) \
- fprintf (STREAM, "%s%s%d:\n", LOCAL_LABEL_PREFIX, 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.
@@ -4449,7 +4429,7 @@ do { \
do { \
if (TARGET_EMBEDDED_PIC || TARGET_MIPS16) \
function_section (current_function_decl); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \
} while (0)
/* This is how to output an assembler line
@@ -4529,14 +4509,6 @@ sdata_section () \
#undef TARGET_ASM_SELECT_SECTION
#define TARGET_ASM_SELECT_SECTION mips_select_section
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
#define ASM_OUTPUT_REG_PUSH(STREAM,REGNO) \
do \
{ \
@@ -4590,15 +4562,14 @@ while (0)
#define MIPS_UNMARK_STAB(code) ((code)-CODE_MASK)
-/* Default definitions for size_t and ptrdiff_t. */
+/* Default definitions for size_t and ptrdiff_t. We must override the
+ definitions from ../svr4.h on mips-*-linux-gnu. */
-#ifndef SIZE_TYPE
+#undef SIZE_TYPE
#define SIZE_TYPE (Pmode == DImode ? "long unsigned int" : "unsigned int")
-#endif
-#ifndef PTRDIFF_TYPE
+#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE (Pmode == DImode ? "long int" : "int")
-#endif
/* See mips_expand_prologue's use of loadgp for when this should be
true. */
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 10b8b623425..a1828f8ff2d 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -122,7 +122,7 @@
;; ??? Fix everything that tests this attribute.
(define_attr "cpu"
- "default,r3000,r3900,r6000,r4000,r4100,r4121,r4300,r4320,r4600,r4650,r5000,r5400,r5500,r8000,sr71000,r4kc,r5kc,r20kc"
+ "default,r3000,r3900,r6000,r4000,r4100,r4111,r4120,r4300,r4600,r4650,r5000,r5400,r5500,r8000,sr71000,r4kc,r5kc,r20kc"
(const (symbol_ref "mips_cpu_attr")))
;; Does the instruction have a mandatory delay slot?
@@ -207,12 +207,12 @@
(define_function_unit "memory" 1 0
(and (eq_attr "type" "load")
- (eq_attr "cpu" "!r3000,r3900,r4600,r4650,r4100,r4121,r4300,r4320,r5000"))
+ (eq_attr "cpu" "!r3000,r3900,r4600,r4650,r4100,r4120,r4300,r5000"))
3 0)
(define_function_unit "memory" 1 0
(and (eq_attr "type" "load")
- (eq_attr "cpu" "r3000,r3900,r4600,r4650,r4100,r4121,r4300,r4320,r5000"))
+ (eq_attr "cpu" "r3000,r3900,r4600,r4650,r4100,r4120,r4300,r5000"))
2 0)
(define_function_unit "memory" 1 0 (eq_attr "type" "store") 1 0)
@@ -225,7 +225,7 @@
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "imul,imadd")
- (eq_attr "cpu" "!r3000,r3900,r4000,r4600,r4650,r4100,r4121,r4300,r4320,r5000"))
+ (eq_attr "cpu" "!r3000,r3900,r4000,r4600,r4650,r4100,r4120,r4300,r5000"))
17 17)
;; On them mips16, we want to stronly discourage a mult from appearing
@@ -252,22 +252,22 @@
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "imul,imadd")
- (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4100,r4121")))
+ (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4100,r4120")))
1 1)
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "imul,imadd")
- (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4100,r4121")))
+ (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4100,r4120")))
4 4)
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "imul,imadd")
- (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4300,r4320,r5000")))
+ (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4300,r5000")))
5 5)
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "imul,imadd")
- (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4300")))
8 8)
(define_function_unit "imuldiv" 1 0
@@ -277,7 +277,7 @@
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "idiv")
- (eq_attr "cpu" "!r3000,r3900,r4000,r4600,r4650,r4100,r4121,r4300,r4320,r5000"))
+ (eq_attr "cpu" "!r3000,r3900,r4000,r4600,r4650,r4100,r4120,r4300,r5000"))
38 38)
(define_function_unit "imuldiv" 1 0
@@ -298,22 +298,22 @@
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "idiv")
- (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4100,r4121")))
+ (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4100,r4120")))
35 35)
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "idiv")
- (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4100,r4121")))
+ (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4100,r4120")))
67 67)
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "idiv")
- (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "mode" "SI") (eq_attr "cpu" "r4300")))
37 37)
(define_function_unit "imuldiv" 1 0
(and (eq_attr "type" "idiv")
- (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "mode" "DI") (eq_attr "cpu" "r4300")))
69 69)
(define_function_unit "imuldiv" 1 0
@@ -334,7 +334,7 @@
;; instructions to be processed in the "imuldiv" unit.
(define_function_unit "adder" 1 1
- (and (eq_attr "type" "fcmp") (eq_attr "cpu" "!r3000,r3900,r6000,r4300,r4320,r5000"))
+ (and (eq_attr "type" "fcmp") (eq_attr "cpu" "!r3000,r3900,r6000,r4300,r5000"))
3 0)
(define_function_unit "adder" 1 1
@@ -346,7 +346,7 @@
1 0)
(define_function_unit "adder" 1 1
- (and (eq_attr "type" "fadd") (eq_attr "cpu" "!r3000,r3900,r6000,r4300,r4320"))
+ (and (eq_attr "type" "fadd") (eq_attr "cpu" "!r3000,r3900,r6000,r4300"))
4 0)
(define_function_unit "adder" 1 1
@@ -359,7 +359,7 @@
(define_function_unit "adder" 1 1
(and (eq_attr "type" "fabs,fneg")
- (eq_attr "cpu" "!r3000,r3900,r4600,r4650,r4300,r4320,r5000"))
+ (eq_attr "cpu" "!r3000,r3900,r4600,r4650,r4300,r5000"))
2 0)
(define_function_unit "adder" 1 1
@@ -369,7 +369,7 @@
(define_function_unit "mult" 1 1
(and (eq_attr "type" "fmul")
(and (eq_attr "mode" "SF")
- (eq_attr "cpu" "!r3000,r3900,r6000,r4600,r4650,r4300,r4320,r5000")))
+ (eq_attr "cpu" "!r3000,r3900,r6000,r4600,r4650,r4300,r5000")))
7 0)
(define_function_unit "mult" 1 1
@@ -389,7 +389,7 @@
(define_function_unit "mult" 1 1
(and (eq_attr "type" "fmul")
- (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r3000,r3900,r6000,r4300,r4320,r5000")))
+ (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r3000,r3900,r6000,r4300,r5000")))
8 0)
(define_function_unit "mult" 1 1
@@ -405,7 +405,7 @@
(define_function_unit "divide" 1 1
(and (eq_attr "type" "fdiv")
(and (eq_attr "mode" "SF")
- (eq_attr "cpu" "!r3000,r3900,r6000,r4600,r4650,r4300,r4320,r5000")))
+ (eq_attr "cpu" "!r3000,r3900,r6000,r4600,r4650,r4300,r5000")))
23 0)
(define_function_unit "divide" 1 1
@@ -431,7 +431,7 @@
(define_function_unit "divide" 1 1
(and (eq_attr "type" "fdiv")
(and (eq_attr "mode" "DF")
- (eq_attr "cpu" "!r3000,r3900,r6000,r4600,r4650,r4300,r4320")))
+ (eq_attr "cpu" "!r3000,r3900,r6000,r4600,r4650,r4300")))
36 0)
(define_function_unit "divide" 1 1
@@ -452,7 +452,7 @@
;;; ??? Is this number right?
(define_function_unit "divide" 1 1
(and (eq_attr "type" "fsqrt,frsqrt")
- (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r4600,r4650,r4300,r4320,r5000")))
+ (and (eq_attr "mode" "SF") (eq_attr "cpu" "!r4600,r4650,r4300,r5000")))
54 0)
(define_function_unit "divide" 1 1
@@ -468,7 +468,7 @@
;;; ??? Is this number right?
(define_function_unit "divide" 1 1
(and (eq_attr "type" "fsqrt,frsqrt")
- (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r4600,r4650,r4300,r4320,r5000")))
+ (and (eq_attr "mode" "DF") (eq_attr "cpu" "!r4600,r4650,r4300,r5000")))
112 0)
(define_function_unit "divide" 1 1
@@ -485,27 +485,27 @@
;; functional unit:
(define_function_unit "imuldiv" 1 0
- (and (eq_attr "type" "fadd") (eq_attr "cpu" "r4300,r4320"))
+ (and (eq_attr "type" "fadd") (eq_attr "cpu" "r4300"))
3 3)
(define_function_unit "imuldiv" 1 0
- (and (eq_attr "type" "fcmp,fabs,fneg") (eq_attr "cpu" "r4300,r4320"))
+ (and (eq_attr "type" "fcmp,fabs,fneg") (eq_attr "cpu" "r4300"))
1 1)
(define_function_unit "imuldiv" 1 0
- (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "type" "fmul") (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4300")))
5 5)
(define_function_unit "imuldiv" 1 0
- (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "type" "fmul") (and (eq_attr "mode" "DF") (eq_attr "cpu" "r4300")))
8 8)
(define_function_unit "imuldiv" 1 0
(and (and (eq_attr "type" "fdiv") (eq_attr "type" "fsqrt,frsqrt"))
- (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "mode" "SF") (eq_attr "cpu" "r4300")))
29 29)
(define_function_unit "imuldiv" 1 0
(and (and (eq_attr "type" "fdiv") (eq_attr "type" "fsqrt,frsqrt"))
- (and (eq_attr "mode" "DF") (eq_attr "cpu" "r4300,r4320")))
+ (and (eq_attr "mode" "DF") (eq_attr "cpu" "r4300")))
58 58)
;; The following functional units do not use the cpu type, and use
@@ -1694,8 +1694,7 @@
"TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
"
{
- if (!TARGET_MIPS4300
- && !TARGET_MIPS4320)
+ if (!TARGET_MIPS4300)
emit_insn (gen_muldf3_internal (operands[0], operands[1], operands[2]));
else
emit_insn (gen_muldf3_r4300 (operands[0], operands[1], operands[2]));
@@ -1706,8 +1705,7 @@
[(set (match_operand:DF 0 "register_operand" "=f")
(mult:DF (match_operand:DF 1 "register_operand" "f")
(match_operand:DF 2 "register_operand" "f")))]
- "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT
- && !TARGET_MIPS4300 &&!TARGET_MIPS4320"
+ "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && !TARGET_MIPS4300"
"mul.d\\t%0,%1,%2"
[(set_attr "type" "fmul")
(set_attr "mode" "DF")])
@@ -1716,8 +1714,7 @@
[(set (match_operand:DF 0 "register_operand" "=f")
(mult:DF (match_operand:DF 1 "register_operand" "f")
(match_operand:DF 2 "register_operand" "f")))]
- "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT
- && (TARGET_MIPS4300 || TARGET_MIPS4320)"
+ "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_MIPS4300"
"*
{
output_asm_insn (\"mul.d\\t%0,%1,%2\", operands);
@@ -1736,7 +1733,7 @@
"TARGET_HARD_FLOAT"
"
{
- if (!TARGET_MIPS4300 && !TARGET_MIPS4320)
+ if (!TARGET_MIPS4300)
emit_insn( gen_mulsf3_internal (operands[0], operands[1], operands[2]));
else
emit_insn( gen_mulsf3_r4300 (operands[0], operands[1], operands[2]));
@@ -1747,8 +1744,7 @@
[(set (match_operand:SF 0 "register_operand" "=f")
(mult:SF (match_operand:SF 1 "register_operand" "f")
(match_operand:SF 2 "register_operand" "f")))]
- "TARGET_HARD_FLOAT
- && !TARGET_MIPS4300 && !TARGET_MIPS4320"
+ "TARGET_HARD_FLOAT && !TARGET_MIPS4300"
"mul.s\\t%0,%1,%2"
[(set_attr "type" "fmul")
(set_attr "mode" "SF")])
@@ -1757,8 +1753,7 @@
[(set (match_operand:SF 0 "register_operand" "=f")
(mult:SF (match_operand:SF 1 "register_operand" "f")
(match_operand:SF 2 "register_operand" "f")))]
- "TARGET_HARD_FLOAT
- && (TARGET_MIPS4300 || TARGET_MIPS4320)"
+ "TARGET_HARD_FLOAT && TARGET_MIPS4300"
"*
{
output_asm_insn (\"mul.s\\t%0,%1,%2\", operands);
@@ -1809,7 +1804,6 @@
if (TARGET_MAD
|| TARGET_MIPS5400
|| TARGET_MIPS5500
- || TARGET_MIPS4320
|| ISA_MIPS32
|| ISA_MIPS64)
return \"mul\\t%0,%1,%2\";
@@ -1874,7 +1868,6 @@
(clobber (match_scratch:SI 6 "=a,a,a"))
(clobber (match_scratch:SI 7 "=X,X,d"))]
"(TARGET_MIPS3900
- || TARGET_MIPS4320
|| TARGET_MIPS5400
|| TARGET_MIPS5500
|| ISA_HAS_MADD_MSUB)
@@ -1899,9 +1892,6 @@
return macc[which_alternative];
}
- if (TARGET_MIPS4320)
- return macc[which_alternative];
-
return madd[which_alternative];
}"
[(set_attr "type" "imadd,imadd,multi")
@@ -4667,7 +4657,7 @@ move\\t%0,%z4\\n\\
rtx label2 = gen_label_rtx ();
REAL_VALUE_TYPE offset;
- offset = REAL_VALUE_LDEXP (dconst1, 31);
+ real_2expN (&offset, 31);
if (reg1) /* turn off complaints about unreached code */
{
@@ -4713,7 +4703,7 @@ move\\t%0,%z4\\n\\
rtx label2 = gen_label_rtx ();
REAL_VALUE_TYPE offset;
- offset = REAL_VALUE_LDEXP (dconst1, 63);
+ real_2expN (&offset, 63);
if (reg1) /* turn off complaints about unreached code */
{
@@ -4759,7 +4749,7 @@ move\\t%0,%z4\\n\\
rtx label2 = gen_label_rtx ();
REAL_VALUE_TYPE offset;
- offset = REAL_VALUE_LDEXP (dconst1, 31);
+ real_2expN (&offset, 31);
if (reg1) /* turn off complaints about unreached code */
{
@@ -4805,7 +4795,7 @@ move\\t%0,%z4\\n\\
rtx label2 = gen_label_rtx ();
REAL_VALUE_TYPE offset;
- offset = REAL_VALUE_LDEXP (dconst1, 63);
+ real_2expN (&offset, 63);
if (reg1) /* turn off complaints about unreached code */
{
@@ -6025,77 +6015,39 @@ move\\t%0,%z4\\n\\
(set_attr "mode" "SI")
(set_attr "length" "8,4,4,8,4,8,4,4,4,4,8,4,8")])
-;; Reload condition code registers. These need scratch registers.
-
+;; Reload condition code registers. reload_incc and reload_outcc
+;; both handle moves from arbitrary operands into condition code
+;; registers. reload_incc handles the more common case in which
+;; a source operand is constrained to be in a condition-code
+;; register, but has not been allocated to one.
+;;
+;; Sometimes, such as in movcc, we have a CCmode destination whose
+;; constraints do not include 'z'. reload_outcc handles the case
+;; when such an operand is allocated to a condition-code register.
+;;
+;; Note that reloads from a condition code register to some
+;; other location can be done using ordinary moves. Moving
+;; into a GPR takes a single movcc, moving elsewhere takes
+;; two. We can leave these cases to the generic reload code.
(define_expand "reload_incc"
- [(set (match_operand:CC 0 "register_operand" "=z")
- (match_operand:CC 1 "general_operand" "z"))
+ [(set (match_operand:CC 0 "fcc_register_operand" "=z")
+ (match_operand:CC 1 "general_operand" ""))
(clobber (match_operand:TF 2 "register_operand" "=&f"))]
"ISA_HAS_8CC && TARGET_HARD_FLOAT"
"
{
- rtx source;
- rtx fp1, fp2;
- int regno;
-
- /* This is called when are copying some value into a condition code
- register. Operand 0 is the condition code register. Operand 1
- is the source. Operand 2 is a scratch register; we use TFmode
- because we actually need two floating point registers. */
- if (! ST_REG_P (true_regnum (operands[0]))
- || ! FP_REG_P (true_regnum (operands[2])))
- abort ();
-
- /* We need to get the source in SFmode so that the insn is
- recognized. */
- if (GET_CODE (operands[1]) == MEM)
- source = adjust_address (operands[1], SFmode, 0);
- else if (GET_CODE (operands[1]) == REG || GET_CODE (operands[1]) == SUBREG)
- source = gen_rtx_REG (SFmode, true_regnum (operands[1]));
- else
- source = operands[1];
-
- /* FP1 and FP2 are the two halves of the TFmode scratch operand. They
- will be single registers in 64-bit mode and register pairs in 32-bit
- mode. SOURCE is loaded into FP1 and zero is loaded into FP2. */
- regno = REGNO (operands[2]);
- fp1 = gen_rtx_REG (SFmode, regno);
- fp2 = gen_rtx_REG (SFmode, regno + HARD_REGNO_NREGS (regno, DFmode));
-
- emit_insn (gen_move_insn (fp1, source));
- emit_insn (gen_move_insn (fp2, gen_rtx_REG (SFmode, 0)));
- emit_insn (gen_rtx_SET (VOIDmode, operands[0],
- gen_rtx_LT (CCmode, fp2, fp1)));
-
+ mips_emit_fcc_reload (operands[0], operands[1], operands[2]);
DONE;
}")
(define_expand "reload_outcc"
- [(set (match_operand:CC 0 "general_operand" "=z")
- (match_operand:CC 1 "register_operand" "z"))
- (clobber (match_operand:CC 2 "register_operand" "=&d"))]
+ [(set (match_operand:CC 0 "fcc_register_operand" "=z")
+ (match_operand:CC 1 "register_operand" ""))
+ (clobber (match_operand:TF 2 "register_operand" "=&f"))]
"ISA_HAS_8CC && TARGET_HARD_FLOAT"
"
{
- /* This is called when we are copying a condition code register out
- to save it somewhere. Operand 0 should be the location we are
- going to save it to. Operand 1 should be the condition code
- register. Operand 2 should be a scratch general purpose register
- created for us by reload. The mips_secondary_reload_class
- function should have told reload that we don't need a scratch
- register if the destination is a general purpose register anyhow. */
- if (ST_REG_P (true_regnum (operands[0]))
- || GP_REG_P (true_regnum (operands[0]))
- || ! ST_REG_P (true_regnum (operands[1]))
- || ! GP_REG_P (true_regnum (operands[2])))
- abort ();
-
- /* All we have to do is copy the value from the condition code to
- the data register, which movcc can handle, and then store the
- value into the real final destination. */
- emit_insn (gen_move_insn (operands[2], operands[1]));
- emit_insn (gen_move_insn (operands[0], operands[2]));
-
+ mips_emit_fcc_reload (operands[0], operands[1], operands[2]);
DONE;
}")
@@ -6402,39 +6354,27 @@ move\\t%0,%z4\\n\\
{
if ((reload_in_progress | reload_completed) == 0
&& !register_operand (operands[0], SFmode)
- && !register_operand (operands[1], SFmode)
- && (TARGET_MIPS16
- || ((GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
- && operands[1] != CONST0_RTX (SFmode))))
- {
- rtx temp = force_reg (SFmode, operands[1]);
- emit_move_insn (operands[0], temp);
- DONE;
- }
+ && !nonmemory_operand (operands[1], SFmode))
+ operands[1] = force_reg (SFmode, operands[1]);
}")
(define_insn "movsf_internal1"
[(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,f,R,m,*f,*d,*d,*d,*d,*R,*m")
- (match_operand:SF 1 "general_operand" "f,G,R,Fm,fG,fG,*d,*f,*G*d,*R,*F*m,*d,*d"))]
+ (match_operand:SF 1 "general_operand" "f,G,R,m,fG,fG,*d,*f,*G*d,*R,*m,*d,*d"))]
"TARGET_HARD_FLOAT
&& (register_operand (operands[0], SFmode)
- || register_operand (operands[1], SFmode)
- || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
- || operands[1] == CONST0_RTX (SFmode))"
+ || nonmemory_operand (operands[1], SFmode))"
"* return mips_move_1word (operands, insn, FALSE);"
[(set_attr "type" "move,xfer,load,load,store,store,xfer,xfer,move,load,load,store,store")
(set_attr "mode" "SF")
(set_attr "length" "4,4,4,8,4,8,4,4,4,4,8,4,8")])
-
(define_insn "movsf_internal2"
[(set (match_operand:SF 0 "nonimmediate_operand" "=d,d,d,R,m")
- (match_operand:SF 1 "general_operand" " Gd,R,Fm,d,d"))]
+ (match_operand:SF 1 "general_operand" " Gd,R,m,d,d"))]
"TARGET_SOFT_FLOAT && !TARGET_MIPS16
&& (register_operand (operands[0], SFmode)
- || register_operand (operands[1], SFmode)
- || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
- || operands[1] == CONST0_RTX (SFmode))"
+ || nonmemory_operand (operands[1], SFmode))"
"* return mips_move_1word (operands, insn, FALSE);"
[(set_attr "type" "move,load,load,store,store")
(set_attr "mode" "SF")
@@ -6442,7 +6382,7 @@ move\\t%0,%z4\\n\\
(define_insn ""
[(set (match_operand:SF 0 "nonimmediate_operand" "=d,y,d,d,d,R,m")
- (match_operand:SF 1 "general_operand" "d,d,y,R,Fm,d,d"))]
+ (match_operand:SF 1 "nonimmediate_operand" "d,d,y,R,m,d,d"))]
"TARGET_MIPS16
&& (register_operand (operands[0], SFmode)
|| register_operand (operands[1], SFmode))"
@@ -6462,55 +6402,40 @@ move\\t%0,%z4\\n\\
{
if ((reload_in_progress | reload_completed) == 0
&& !register_operand (operands[0], DFmode)
- && !register_operand (operands[1], DFmode)
- && (TARGET_MIPS16
- || ((GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)
- && operands[1] != CONST0_RTX (DFmode))))
- {
- rtx temp = force_reg (DFmode, operands[1]);
- emit_move_insn (operands[0], temp);
- DONE;
- }
+ && !nonmemory_operand (operands[1], DFmode))
+ operands[1] = force_reg (DFmode, operands[1]);
}")
(define_insn "movdf_internal1"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,R,To,f,*f,*d,*d,*d,*d,*R,*T")
- (match_operand:DF 1 "general_operand" "f,R,To,fG,fG,F,*d,*f,*d*G,*R,*T*F,*d,*d"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,R,To,*f,*d,*d,*d,*d,*R,*T")
+ (match_operand:DF 1 "general_operand" "f,R,To,fG,fG,*d,*f,*d*G,*R,*T,*d,*d"))]
"TARGET_HARD_FLOAT && !(TARGET_FLOAT64 && !TARGET_64BIT)
&& TARGET_DOUBLE_FLOAT
&& (register_operand (operands[0], DFmode)
- || register_operand (operands[1], DFmode)
- || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
- || operands[1] == CONST0_RTX (DFmode))"
+ || nonmemory_operand (operands[1], DFmode))"
"* return mips_move_2words (operands, insn); "
- [(set_attr "type" "move,load,load,store,store,load,xfer,xfer,move,load,load,store,store")
+ [(set_attr "type" "move,load,load,store,store,xfer,xfer,move,load,load,store,store")
(set_attr "mode" "DF")
- (set_attr "length" "4,8,16,8,16,16,8,8,8,8,16,8,16")])
+ (set_attr "length" "4,8,16,8,16,8,8,8,8,16,8,16")])
(define_insn "movdf_internal1a"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,R,R,To,To,*d,*d,*d,*To,*R,*d")
- (match_operand:DF 1 "general_operand" " f,To,f,G,f,G,*F,*To,*R,*d,*d,*d"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,R,R,To,To,*d,*d,*To,*R,*d")
+ (match_operand:DF 1 "general_operand" " f,To,f,G,f,G,*To,*R,*d,*d,*d"))]
"TARGET_HARD_FLOAT && (TARGET_FLOAT64 && !TARGET_64BIT)
&& TARGET_DOUBLE_FLOAT
&& (register_operand (operands[0], DFmode)
- || register_operand (operands[1], DFmode)
- || (GET_CODE (operands [0]) == MEM
- && ((GET_CODE (operands[1]) == CONST_INT
- && INTVAL (operands[1]) == 0)
- || operands[1] == CONST0_RTX (DFmode))))"
+ || nonmemory_operand (operands[1], DFmode))"
"* return mips_move_2words (operands, insn); "
- [(set_attr "type" "move,load,store,store,store,store,load,load,load,store,store,move")
+ [(set_attr "type" "move,load,store,store,store,store,load,load,store,store,move")
(set_attr "mode" "DF")
- (set_attr "length" "4,8,4,4,8,8,8,8,4,8,4,4")])
+ (set_attr "length" "4,8,4,4,8,8,8,4,8,4,4")])
(define_insn "movdf_internal2"
[(set (match_operand:DF 0 "nonimmediate_operand" "=d,d,d,R,To,d,f,f")
- (match_operand:DF 1 "general_operand" "dG,R,ToF,d,d,f,d,f"))]
+ (match_operand:DF 1 "general_operand" "dG,R,To,d,d,f,d,f"))]
"(TARGET_SOFT_FLOAT || TARGET_SINGLE_FLOAT) && !TARGET_MIPS16
&& (register_operand (operands[0], DFmode)
- || register_operand (operands[1], DFmode)
- || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
- || operands[1] == CONST0_RTX (DFmode))"
+ || nonmemory_operand (operands[1], DFmode))"
"* return mips_move_2words (operands, insn); "
[(set_attr "type" "move,load,load,store,store,xfer,load,move")
(set_attr "mode" "DF")
@@ -6518,7 +6443,7 @@ move\\t%0,%z4\\n\\
(define_insn ""
[(set (match_operand:DF 0 "nonimmediate_operand" "=d,y,d,d,d,R,To")
- (match_operand:DF 1 "general_operand" "d,d,y,R,ToF,d,d"))]
+ (match_operand:DF 1 "nonimmediate_operand" "d,d,y,R,To,d,d"))]
"TARGET_MIPS16
&& (register_operand (operands[0], DFmode)
|| register_operand (operands[1], DFmode))"
@@ -8305,6 +8230,19 @@ move\\t%0,%z4\\n\\
}
}")
+(define_expand "bunge"
+ [(set (pc)
+ (if_then_else (unge:CC (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "
+{
+ gen_conditional_branch (operands, UNGE);
+ DONE;
+}")
+
(define_expand "buneq"
[(set (pc)
(if_then_else (uneq:CC (cc0)
@@ -8321,6 +8259,19 @@ move\\t%0,%z4\\n\\
}
}")
+(define_expand "bltgt"
+ [(set (pc)
+ (if_then_else (ltgt:CC (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "
+{
+ gen_conditional_branch (operands, LTGT);
+ DONE;
+}")
+
(define_expand "bunle"
[(set (pc)
(if_then_else (unle:CC (cc0)
@@ -8337,6 +8288,19 @@ move\\t%0,%z4\\n\\
}
}")
+(define_expand "bungt"
+ [(set (pc)
+ (if_then_else (ungt:CC (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "
+{
+ gen_conditional_branch (operands, UNGT);
+ DONE;
+}")
+
(define_expand "beq"
[(set (pc)
(if_then_else (eq:CC (cc0)
@@ -9405,18 +9369,6 @@ move\\t%0,%z4\\n\\
[(set_attr "type" "fcmp")
(set_attr "mode" "FPSW")])
-(define_insn "sordered_df"
- [(set (match_operand:CC 0 "register_operand" "=z")
- (ordered:CC (match_operand:DF 1 "register_operand" "f")
- (match_operand:DF 2 "register_operand" "f")))]
- "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"
- "*
-{
- return mips_fill_delay_slot (\"c.or.d\\t%Z0%1,%2\", DELAY_FCMP, operands, insn);
-}"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "FPSW")])
-
(define_insn "sunlt_df"
[(set (match_operand:CC 0 "register_operand" "=z")
(unlt:CC (match_operand:DF 1 "register_operand" "f")
@@ -9525,18 +9477,6 @@ move\\t%0,%z4\\n\\
[(set_attr "type" "fcmp")
(set_attr "mode" "FPSW")])
-(define_insn "sordered_sf"
- [(set (match_operand:CC 0 "register_operand" "=z")
- (ordered:CC (match_operand:SF 1 "register_operand" "f")
- (match_operand:SF 2 "register_operand" "f")))]
- "TARGET_HARD_FLOAT"
- "*
-{
- return mips_fill_delay_slot (\"c.or.s\\t%Z0%1,%2\", DELAY_FCMP, operands, insn);
-}"
- [(set_attr "type" "fcmp")
- (set_attr "mode" "FPSW")])
-
(define_insn "sunlt_sf"
[(set (match_operand:CC 0 "register_operand" "=z")
(unlt:CC (match_operand:SF 1 "register_operand" "f")
diff --git a/gcc/config/mips/netbsd.h b/gcc/config/mips/netbsd.h
index bda60584871..3ec054456ee 100644
--- a/gcc/config/mips/netbsd.h
+++ b/gcc/config/mips/netbsd.h
@@ -22,19 +22,12 @@ Boston, MA 02111-1307, USA. */
/* Define default target values. */
-#ifndef TARGET_ENDIAN_DEFAULT
-#define TARGET_ENDIAN_DEFAULT MASK_BIG_ENDIAN
-#endif
-
-#ifndef MACHINE_TYPE
+#undef MACHINE_TYPE
#if TARGET_ENDIAN_DEFAULT != 0
#define MACHINE_TYPE "NetBSD/mipseb ELF"
#else
#define MACHINE_TYPE "NetBSD/mipsel ELF"
#endif
-#endif
-
-#define TARGET_DEFAULT (MASK_GAS|MASK_ABICALLS)
#define TARGET_OS_CPP_BUILTINS() \
do \
@@ -45,15 +38,80 @@ Boston, MA 02111-1307, USA. */
builtin_assert ("machine=mips"); \
if (TARGET_LONG64) \
builtin_define ("__LONG64"); \
+ \
+ if (mips_abi == ABI_EABI) \
+ builtin_define ("__mips_eabi"); \
+ else if (mips_abi == ABI_N32) \
+ builtin_define ("__mips_n32"); \
+ else if (mips_abi == ABI_64) \
+ builtin_define ("__mips_n64"); \
+ else if (mips_abi == ABI_O64) \
+ builtin_define ("__mips_o64"); \
} \
while (0)
-
-/* XXX Don't use DWARF-2 debugging info, for now. */
-#undef DBX_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
-#undef PREFERRED_DEBUGGING_TYPE
-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+/* The generic MIPS TARGET_CPU_CPP_BUILTINS are incorrect for NetBSD.
+ Specifically, they define too many namespace-invasive macros. Override
+ them here. Note this is structured for easy comparison to the version
+ in mips.h.
+
+ FIXME: This probably isn't the best solution. But in the absense
+ of something better, it will have to do, for now. */
+
+#undef TARGET_CPU_CPP_BUILTINS
+#define TARGET_CPU_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("cpu=mips"); \
+ builtin_define ("__mips__"); \
+ builtin_define ("_mips"); \
+ \
+ /* No _R3000 or _R4000. */ \
+ if (TARGET_64BIT) \
+ builtin_define ("__mips64"); \
+ \
+ if (TARGET_FLOAT64) \
+ builtin_define ("__mips_fpr=64"); \
+ else \
+ builtin_define ("__mips_fpr=32"); \
+ \
+ if (TARGET_MIPS16) \
+ builtin_define ("__mips16"); \
+ \
+ MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info); \
+ MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info); \
+ \
+ if (ISA_MIPS1) \
+ builtin_define ("__mips=1"); \
+ else if (ISA_MIPS2) \
+ builtin_define ("__mips=2"); \
+ else if (ISA_MIPS3) \
+ builtin_define ("__mips=3"); \
+ else if (ISA_MIPS4) \
+ builtin_define ("__mips=4"); \
+ else if (ISA_MIPS32) \
+ builtin_define ("__mips=32"); \
+ else if (ISA_MIPS64) \
+ builtin_define ("__mips=64"); \
+ \
+ if (TARGET_HARD_FLOAT) \
+ builtin_define ("__mips_hard_float"); \
+ else if (TARGET_SOFT_FLOAT) \
+ builtin_define ("__mips_soft_float"); \
+ \
+ if (TARGET_SINGLE_FLOAT) \
+ builtin_define ("__mips_single_float"); \
+ \
+ if (TARGET_BIG_ENDIAN) \
+ builtin_define ("__MIPSEB__"); \
+ else \
+ builtin_define ("__MIPSEL__"); \
+ \
+ /* No language dialect defines. */ \
+ \
+ /* ABIs handled in TARGET_OS_CPP_BUILTINS. */ \
+ } \
+ while (0)
/* Include the generic MIPS ELF configuration. */
@@ -74,17 +132,10 @@ Boston, MA 02111-1307, USA. */
/* Extra specs we need. */
#undef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS \
- { "subtarget_endian_default", SUBTARGET_ENDIAN_DEFAULT_SPEC }, \
{ "netbsd_cpp_spec", NETBSD_CPP_SPEC }, \
{ "netbsd_link_spec", NETBSD_LINK_SPEC_ELF }, \
{ "netbsd_entry_point", NETBSD_ENTRY_POINT },
-#if TARGET_ENDIAN_DEFAULT != 0
-#define SUBTARGET_ENDIAN_DEFAULT_SPEC "-D__MIPSEB__"
-#else
-#define SUBTARGET_ENDIAN_DEFAULT_SPEC "-D__MIPSEL__"
-#endif
-
/* Provide a SUBTARGET_CPP_SPEC appropriate for NetBSD. */
#undef SUBTARGET_CPP_SPEC
@@ -107,7 +158,7 @@ Boston, MA 02111-1307, USA. */
#undef SUBTARGET_ASM_SPEC
#define SUBTARGET_ASM_SPEC \
- "%{fpic:-KPIC} %{fPIC:-KPIC}"
+ "%{!fno-PIC:%{!fno-pic:-KPIC}}"
/* -G is incompatible with -KPIC which is the default, so only allow objects
diff --git a/gcc/config/mips/openbsd.h b/gcc/config/mips/openbsd.h
index 02a8f224e57..73a81926be4 100644
--- a/gcc/config/mips/openbsd.h
+++ b/gcc/config/mips/openbsd.h
@@ -21,7 +21,9 @@ Boston, MA 02111-1307, USA. */
/* Definitions needed for OpenBSD, to avoid picking mips 'defaults'. */
/* GAS must know this. */
-#define SUBTARGET_ASM_SPEC "%{fPIC:-KPIC} %|"
+#define SUBTARGET_ASM_SPEC "%{fPIC:-KPIC}"
+
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
/* CPP specific OpenBSD specs. */
#define SUBTARGET_CPP_SPEC OBSD_CPP_SPEC
diff --git a/gcc/config/mips/sni-gas.h b/gcc/config/mips/sni-gas.h
index e79c074405f..5515bfd3c39 100644
--- a/gcc/config/mips/sni-gas.h
+++ b/gcc/config/mips/sni-gas.h
@@ -1,9 +1,9 @@
/* Enable debugging. */
-#define DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
-#define MIPS_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
+#define SDB_DEBUGGING_INFO 1
+#define MIPS_DEBUGGING_INFO 1
+#define DWARF_DEBUGGING_INFO 1
-#define DWARF_DEBUGGING_INFO
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
diff --git a/gcc/config/mips/sr71k.md b/gcc/config/mips/sr71k.md
index faeeebc788b..82162e3ca39 100644
--- a/gcc/config/mips/sr71k.md
+++ b/gcc/config/mips/sr71k.md
@@ -4,7 +4,7 @@
;;
;; The SR3 is describeds as:
;; - nine-stage pipeline, insn buffering with out-of-order issue to
-;; multiple function units, with a average dispatch rate of 2
+;; multiple function units, with an average dispatch rate of 2
;; insn.s per cycle (max 6 insns: 2 fpu, 4 cpu).
;;
;; The details on this are scant except for a diagram in
diff --git a/gcc/config/mips/t-iris6 b/gcc/config/mips/t-iris6
index 582ec4c7949..b55bc36aca8 100644
--- a/gcc/config/mips/t-iris6
+++ b/gcc/config/mips/t-iris6
@@ -4,6 +4,7 @@
MULTILIB_OPTIONS=mabi=n32/mabi=64
MULTILIB_DIRNAMES=
MULTILIB_MATCHES=
+MULTILIB_OSDIRNAMES=../lib32 ../lib64
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
@@ -14,8 +15,6 @@ INSTALL_LIBGCC = install-multilib
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o
CRTSTUFF_T_CFLAGS=-g1
-SHLIB_SLIBDIR_SUFFIXES = mabi=64:/mabi=64 mabi=n32:
-
# This is only needed in the static libgcc as a band-aid until gcc correctly
# implements the N32/N64 ABI structure passing conventions
LIB2FUNCS_STATIC_EXTRA = $(srcdir)/config/mips/irix6-libc-compat.c
diff --git a/gcc/config/mips/t-vr b/gcc/config/mips/t-vr
index 7af78ab21f7..68daad8dc00 100644
--- a/gcc/config/mips/t-vr
+++ b/gcc/config/mips/t-vr
@@ -39,7 +39,7 @@ MULTILIB_OPTIONS = \
EL/EB \
mabi=32/mabi=o64/mabi=eabi \
mgp32 \
- mlong32/mlong64 \
+ mlong64 \
mips16 \
march=vr5400/march=vr4100
@@ -47,7 +47,7 @@ MULTILIB_DIRNAMES = \
el eb \
o32 o64 eabi \
gp32 \
- long32 long64 \
+ long64 \
mips16 \
vr5400 vr4100
@@ -59,38 +59,9 @@ MULTILIB_MATCHES = EL=mel EB=meb
# without a -mabi flag.
MULTILIB_EXCEPTIONS = \
*mabi=32/mlong64* \
- *mabi=32/mgp32/mlong64* \
+ *mabi=32/mgp32* \
*mabi=o64/mgp32* \
*mabi=o64/mlong64* \
mgp32* E[LB]/mgp32* \
mlong64* E[LB]/mlong64* \
*mips16/march=vr5*
-
-# The real value of this macro is very long, so generate it using a
-# shell fragment. The idea is to tell the GCC driver how -mabi,
-# -mgp32, -mlong32 and -mlong64 interact, so that it choses the right
-# library when some options are specified redundantly (for example,
-# -mabi=32 -mgp32).
-
-# The core equalities are listed after "for changes in ". The first
-# entry assumes o64 is the default ABI.
-MULTILIB_REDUNDANT_DIRS=` \
- for endian in '' 'el' 'eb'; do \
- for arch in '' 'vr5400' 'vr4100' \
- 'mips16' 'mips16/vr100'; do \
- for changes in long32= \
- o32/gp32=o32 \
- o32/gp32/long32=o32 \
- o32/long32=o32 \
- o64/long32=o64 \
- eabi/gp32/long32=eabi/gp32 \
- eabi/long64=eabi; do \
- from=\`echo \$${changes} | sed 's/=.*//'\`; \
- to=\`echo \$${changes} | sed 's/.*=//'\`; \
- echo \$$endian \$$from \$$arch=\$$endian \$$to \$$arch \
- | sed -e 's: *= *:=:' \
- -e 's: *:/:g' \
- -e 's:=$$:=.:'; \
- done; \
- done; \
- done`
diff --git a/gcc/config/mips/vr.h b/gcc/config/mips/vr.h
index 4bdc2453472..3ef34afbd34 100644
--- a/gcc/config/mips/vr.h
+++ b/gcc/config/mips/vr.h
@@ -22,3 +22,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define MIPS_CPU_STRING_DEFAULT "vr4100"
#define MULTILIB_DEFAULTS \
{ MULTILIB_ENDIAN_DEFAULT, MULTILIB_ABI_DEFAULT, "march=vr4100" }
+
+/* Make sure that -mlong64 always appears on the command line when
+ 64-bit longs are needed. Also make sure that -mgp32 doesn't appear
+ if it is redundant. */
+#define DRIVER_SELF_SPECS \
+ "%{mabi=eabi:%{!mlong*:%{!mgp32:-mlong64}}}", \
+ "%{mabi=32:%{<mgp32}}"
diff --git a/gcc/config/mmix/mmix-protos.h b/gcc/config/mmix/mmix-protos.h
index e8ef95e9895..618d1984b4a 100644
--- a/gcc/config/mmix/mmix-protos.h
+++ b/gcc/config/mmix/mmix-protos.h
@@ -42,8 +42,6 @@ extern void mmix_asm_output_ascii PARAMS ((FILE *, const char *, int));
extern void mmix_asm_output_label PARAMS ((FILE *, const char *));
extern void mmix_asm_weaken_label PARAMS ((FILE *, const char *));
extern void mmix_asm_output_labelref PARAMS ((FILE *, const char *));
-extern void mmix_asm_output_internal_label
- PARAMS ((FILE *, const char *, int));
extern void mmix_asm_output_def PARAMS ((FILE *, const char *, const char *));
extern int mmix_print_operand_punct_valid_p PARAMS ((int));
extern void mmix_asm_output_reg_push PARAMS ((FILE *, int));
@@ -80,7 +78,6 @@ extern void mmix_asm_output_aligned_local
PARAMS ((FILE *, const char *, int, int));
extern void mmix_asm_declare_register_global
PARAMS ((FILE *, tree, int, const char *));
-extern void mmix_asm_output_mi_thunk PARAMS ((FILE *, tree, int, tree));
/* Need tree.h and rtl.h */
# ifdef RTX_CODE
diff --git a/gcc/config/mmix/mmix.c b/gcc/config/mmix/mmix.c
index deb6b1ef976..966b503589c 100644
--- a/gcc/config/mmix/mmix.c
+++ b/gcc/config/mmix/mmix.c
@@ -130,6 +130,8 @@ static void mmix_target_asm_function_prologue
static void mmix_target_asm_function_end_prologue PARAMS ((FILE *));
static void mmix_target_asm_function_epilogue
PARAMS ((FILE *, HOST_WIDE_INT));
+static void mmix_asm_output_mi_thunk
+ PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
/* Target structure macros. Listed by node. See `Using and Porting GCC'
@@ -162,6 +164,9 @@ static void mmix_target_asm_function_epilogue
#undef TARGET_STRIP_NAME_ENCODING
#define TARGET_STRIP_NAME_ENCODING mmix_strip_name_encoding
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK mmix_asm_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Functions that are expansions for target macros.
@@ -693,7 +698,7 @@ mmix_asm_preferred_eh_data_format (code, global)
return DW_EH_PE_absptr;
}
-/* Make a note that we've seen the beginning of of the prologue. This
+/* Make a note that we've seen the beginning of the prologue. This
matters to whether we'll translate register numbers as calculated by
mmix_machine_dependent_reorg. */
@@ -770,13 +775,13 @@ mmix_target_asm_function_epilogue (stream, locals_size)
fputc ('\n', stream);
}
-/* ASM_OUTPUT_MI_THUNK. */
+/* TARGET_ASM_OUTPUT_MI_THUNK. */
-void
+static void
mmix_asm_output_mi_thunk (stream, fndecl, delta, func)
FILE * stream;
tree fndecl ATTRIBUTE_UNUSED;
- int delta;
+ HOST_WIDE_INT delta;
tree func;
{
/* If you define STRUCT_VALUE to 0, rather than use STRUCT_VALUE_REGNUM,
@@ -785,9 +790,9 @@ mmix_asm_output_mi_thunk (stream, fndecl, delta, func)
const char *regname = reg_names[MMIX_FIRST_INCOMING_ARG_REGNUM];
if (delta >= 0 && delta < 65536)
- fprintf (stream, "\tINCL %s,%d\n", regname, delta);
+ fprintf (stream, "\tINCL %s,%d\n", regname, (int)delta);
else if (delta < 0 && delta >= -255)
- fprintf (stream, "\tSUBU %s,%s,%d\n", regname, regname, -delta);
+ fprintf (stream, "\tSUBU %s,%s,%d\n", regname, regname, (int)-delta);
else
{
mmix_output_register_setting (stream, 255, delta, 1);
@@ -1560,17 +1565,6 @@ mmix_asm_output_labelref (stream, name)
name);
}
-/* ASM_OUTPUT_INTERNAL_LABEL. */
-
-void
-mmix_asm_output_internal_label (stream, name, num)
- FILE * stream;
- const char * name;
- int num;
-{
- fprintf (stream, "%s:%d\tIS @\n", name, num);
-}
-
/* ASM_OUTPUT_DEF. */
void
@@ -1985,7 +1979,7 @@ mmix_get_hard_reg_initial_val (mode, regno)
return get_hard_reg_initial_val (mode, regno);
}
-/* Non-zero when the function epilogue is simple enough that a single
+/* Nonzero when the function epilogue is simple enough that a single
"POP %d,0" should be used even within the function. */
int
diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h
index 5da23882b9b..50de2b1e929 100644
--- a/gcc/config/mmix/mmix.h
+++ b/gcc/config/mmix/mmix.h
@@ -261,7 +261,7 @@ extern int target_flags;
/* Node: Storage Layout */
-/* I see no bitfield instructions. Anyway, the common order is from low
+/* I see no bit-field instructions. Anyway, the common order is from low
to high, as the power of two, hence little-endian. */
#define BITS_BIG_ENDIAN 0
#define BYTES_BIG_ENDIAN 1
@@ -795,10 +795,6 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
#define EPILOGUE_USES(REGNO) \
((REGNO) == MMIX_INCOMING_RETURN_ADDRESS_REGNUM)
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
- mmix_asm_output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
-
-
/* Node: Profiling */
#define FUNCTION_PROFILER(FILE, LABELNO) \
mmix_function_profiler (FILE, LABELNO)
@@ -991,9 +987,6 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
#define ASM_OUTPUT_LABELREF(STREAM, NAME) \
mmix_asm_output_labelref (STREAM, NAME)
-#define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) \
- mmix_asm_output_internal_label (STREAM, PREFIX, NUM)
-
/* We insert a ":" to disambiguate against user symbols like L5. */
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf (LABEL, "*%s:%ld", PREFIX, (long)(NUM))
@@ -1002,9 +995,7 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
":" is seen in the object file; we don't really want that mmixal
feature visible there. We don't want the default, which uses a dot;
that'd be incompatible with mmixal. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- ((OUTPUT) = (char *) alloca (strlen ((NAME)) + 2 + 10), \
- sprintf ((OUTPUT), "%s::%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s::%lu"
#define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
mmix_asm_output_def (STREAM, NAME, VALUE)
@@ -1119,7 +1110,7 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
/* Node: SDB and DWARF */
-#define DWARF2_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
#define DWARF2_ASM_LINE_DEBUG_INFO 1
/* Node: Misc */
diff --git a/gcc/config/mmix/mmix.md b/gcc/config/mmix/mmix.md
index 0f368729312..3f4435ca1f7 100644
--- a/gcc/config/mmix/mmix.md
+++ b/gcc/config/mmix/mmix.md
@@ -348,13 +348,22 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
""
"NEGU %0,0,%1")
-;; FIXME: GCC should be able to synthesize this by itself as "0.0 - x".
(define_expand "negdf2"
+ [(parallel [(set (match_operand:DF 0 "register_operand" "=r")
+ (neg:DF (match_operand:DF 1 "register_operand" "r")))
+ (use (match_dup 2))])]
+ ""
+{
+ /* Emit bit-flipping sequence to be IEEE-safe wrt. -+0. */
+ operands[2] = force_reg (DImode, GEN_INT ((HOST_WIDE_INT) 1 << 63));
+})
+
+(define_insn "*expanded_negdf2"
[(set (match_operand:DF 0 "register_operand" "=r")
- (minus:DF (match_dup 2)
- (match_operand:DF 1 "register_operand" "r")))]
+ (neg:DF (match_operand:DF 1 "register_operand" "r")))
+ (use (match_operand:DI 2 "register_operand" "r"))]
""
- "operands[2] = force_reg (DFmode, CONST0_RTX (DFmode));")
+ "XOR %0,%1,%2")
;; FIXME: define_expand for absdi2?
@@ -1072,7 +1081,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
PUSHGO $%p3,%a1")
;; I hope untyped_call and untyped_return are not needed for MMIX.
-;; Users of Objective C will notice.
+;; Users of Objective-C will notice.
; Generated by GCC.
(define_expand "return"
diff --git a/gcc/config/mn10200/mn10200.c b/gcc/config/mn10200/mn10200.c
index 66ee9ad763d..b41c61fafca 100644
--- a/gcc/config/mn10200/mn10200.c
+++ b/gcc/config/mn10200/mn10200.c
@@ -943,7 +943,7 @@ secondary_reload_class (class, mode, in, input)
The basic shift methods:
- * loop shifts -- emit a loop using one (or two on H8/S) bit shifts;
+ * loop shifts -- emit a loop using one (or two on H8S) bit shifts;
this is the default. SHIFT_LOOP
* inlined shifts -- emit straight line code for the shift; this is
diff --git a/gcc/config/mn10200/mn10200.h b/gcc/config/mn10200/mn10200.h
index 793838fc531..112b90d866b 100644
--- a/gcc/config/mn10200/mn10200.h
+++ b/gcc/config/mn10200/mn10200.h
@@ -824,13 +824,7 @@ struct cum_arg { int nbytes; };
#define ASM_OUTPUT_LABELREF(FILE, NAME) \
fprintf (FILE, "_%s", (*targetm.strip_name_encoding) (NAME))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
/* This is how we tell the assembler that two symbols have the same value. */
diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c
index 52284c0d3f7..92812871cad 100644
--- a/gcc/config/mn10300/mn10300.c
+++ b/gcc/config/mn10300/mn10300.c
@@ -647,7 +647,7 @@ notice_update_cc (body, insn)
}
}
-/* Recognise the PARALLEL rtx generated by mn10300_gen_multiple_store().
+/* Recognize the PARALLEL rtx generated by mn10300_gen_multiple_store().
This function is for MATCH_PARALLEL and so assumes OP is known to be
parallel. If OP is a multiple store, return a mask indicating which
registers it saves. Return 0 otherwise. */
@@ -1141,7 +1141,7 @@ mask_ok_for_mem_btst (len, bit)
int len;
int bit;
{
- int mask = 0;
+ unsigned int mask = 0;
while (len > 0)
{
diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h
index e78e02e50d0..ecda4d4910a 100644
--- a/gcc/config/mn10300/mn10300.h
+++ b/gcc/config/mn10300/mn10300.h
@@ -905,13 +905,7 @@ struct cum_arg {int nbytes; };
#define ASM_OUTPUT_LABELREF(FILE, NAME) \
fprintf (FILE, "_%s", (*targetm.strip_name_encoding) (NAME))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
/* This is how we tell the assembler that two symbols have the same value. */
diff --git a/gcc/config/netbsd-aout.h b/gcc/config/netbsd-aout.h
index d8ab4a46f5b..f7eb1bf1449 100644
--- a/gcc/config/netbsd-aout.h
+++ b/gcc/config/netbsd-aout.h
@@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */
} \
while (0)
-/* This defines which switch letters take arguments. */
+/* This defines which switch letters take arguments. */
#undef SWITCH_TAKES_ARG
#define SWITCH_TAKES_ARG(CHAR) \
@@ -39,7 +39,9 @@ Boston, MA 02111-1307, USA. */
with the options for generating PIC code. */
#undef ASM_SPEC
-#define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k -K}"
+#define ASM_SPEC "%{fpic:-k} %{fPIC:-k -K}"
+
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
/* Provide a STARTFILE_SPEC appropriate for NetBSD a.out. Here we
@@ -58,8 +60,8 @@ Boston, MA 02111-1307, USA. */
/* Provide a LINK_SPEC appropriate for NetBSD a.out. Here we provide
support for the special GCC options -static, -assert, and -nostdlib. */
-#undef LINK_SPEC
-#define LINK_SPEC \
+#undef NETBSD_LINK_SPEC_AOUT
+#define NETBSD_LINK_SPEC_AOUT \
"%{nostdlib:-nostdlib} \
%{!shared: \
%{!nostdlib: \
@@ -71,6 +73,9 @@ Boston, MA 02111-1307, USA. */
%{R*} \
%{assert*}"
+/* Default LINK_SPEC. */
+#undef LINK_SPEC
+#define LINK_SPEC NETBSD_LINK_SPEC_AOUT
/* Some imports from svr4.h in support of shared libraries. */
diff --git a/gcc/config/netbsd.h b/gcc/config/netbsd.h
index 38eb7491d84..c83ff0f545e 100644
--- a/gcc/config/netbsd.h
+++ b/gcc/config/netbsd.h
@@ -42,7 +42,7 @@ Boston, MA 02111-1307, USA. */
/* NETBSD_NATIVE is defined when gcc is integrated into the NetBSD
source tree so it can be configured appropriately without using
- the GNU configure/build mechanism. */
+ the GNU configure/build mechanism. */
#ifdef NETBSD_NATIVE
@@ -77,14 +77,23 @@ Boston, MA 02111-1307, USA. */
#endif /* NETBSD_NATIVE */
-/* Provide a LIB_SPEC appropriate for NetBSD. Just select the appropriate
- libc, depending on whether we're doing profiling; if `-posix' is specified,
- link against the appropriate libposix first. Don't include libc when
- linking a shared library. */
+/* Provide a LIB_SPEC appropriate for NetBSD. Here we:
+
+ 1. Select the appropriate set of libs, depending on whether we're
+ profiling.
+
+ 2. Include the pthread library if -pthread is specified.
+
+ 3. Include the posix library if -posix is specified. */
#undef LIB_SPEC
#define LIB_SPEC \
- "%{posix: \
+ "%{pthread: \
+ %{!p: \
+ %{!pg:-lpthread}} \
+ %{p:-lpthread_p} \
+ %{pg:-lpthread_p}} \
+ %{posix: \
%{!p: \
%{!pg:-lposix}} \
%{p:-lposix_p} \
@@ -152,3 +161,51 @@ Boston, MA 02111-1307, USA. */
#undef WINT_TYPE
#define WINT_TYPE "int"
+
+
+/* Attempt to turn on execute permission for the stack. This may be
+ used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is,
+ if the target machine can change execute permissions on a page).
+
+ There is no way to query the execute permission of the stack, so
+ we always issue the mprotect() call.
+
+ Note that we go out of our way to use namespace-non-invasive calls
+ here. Unfortunately, there is no libc-internal name for mprotect().
+
+ Also note that no errors should be emitted by this code; it is considered
+ dangerous for library calls to send messages to stdout/stderr. */
+
+#define NETBSD_ENABLE_EXECUTE_STACK \
+extern void __enable_execute_stack (void *); \
+void \
+__enable_execute_stack (addr) \
+ void *addr; \
+{ \
+ extern int mprotect (void *, size_t, int); \
+ extern int __sysctl (int *, unsigned int, void *, size_t *, \
+ void *, size_t); \
+ \
+ static int size; \
+ static long mask; \
+ \
+ char *page, *end; \
+ \
+ if (size == 0) \
+ { \
+ int mib[2]; \
+ size_t len; \
+ \
+ mib[0] = 6; /* CTL_HW */ \
+ mib[1] = 7; /* HW_PAGESIZE */ \
+ len = sizeof (size); \
+ (void) __sysctl (mib, 2, &size, &len, NULL, 0); \
+ mask = ~((long) size - 1); \
+ } \
+ \
+ page = (char *) (((long) addr) & mask); \
+ end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
+ \
+ /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
+ (void) mprotect (page, end - page, 7); \
+}
diff --git a/gcc/config/netware.h b/gcc/config/netware.h
index 90e85aac1d5..52bfb4e0d31 100644
--- a/gcc/config/netware.h
+++ b/gcc/config/netware.h
@@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
anyway for cross-compilers, and the other specs won't get picked up
'coz the user is supposed to do ld -r (hmm, perhaps that should be
the default). In any case, setting them thus will catch some
- common user errors. */
+ common user errors. */
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX
@@ -49,7 +49,7 @@ Boston, MA 02111-1307, USA. */
#undef LIBGCC_SPEC
/* set debugging info */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef SDB_DEBUGGING_INFO
#undef DWARF_DEBUGGING_INFO
#undef XCOFF_DEBUGGING_INFO
diff --git a/gcc/config/ns32k/netbsd.h b/gcc/config/ns32k/netbsd.h
index 28bae88cb88..595a36c8fb4 100644
--- a/gcc/config/ns32k/netbsd.h
+++ b/gcc/config/ns32k/netbsd.h
@@ -30,7 +30,7 @@ Boston, MA 02111-1307, USA. */
/* Compile for the floating point unit & 32532 by default;
Don't assume SB is zero;
- Don't use bitfield instructions;
+ Don't use bit-field instructions;
FPU is 32381;
Use multiply-add instructions */
@@ -88,7 +88,7 @@ Boston, MA 02111-1307, USA. */
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Do not break .stabs pseudos into continuations. */
diff --git a/gcc/config/ns32k/ns32k.c b/gcc/config/ns32k/ns32k.c
index ee419a07885..b94765bfb3a 100644
--- a/gcc/config/ns32k/ns32k.c
+++ b/gcc/config/ns32k/ns32k.c
@@ -70,9 +70,6 @@ const struct attribute_spec ns32k_attribute_table[];
static void ns32k_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
static void ns32k_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static void ns32k_encode_section_info PARAMS ((tree, int));
-#ifdef COLLECT
-static void ns32k_globalize_label PARAMS ((FILE *, const char *));
-#endif
/* Initialize the GCC target structure. */
#undef TARGET_ATTRIBUTE_TABLE
@@ -1133,11 +1130,13 @@ print_operand (file, x, code)
{
#ifdef SEQUENT_ASM
/* Sequent likes its floating point constants as integers */
+ long l[2];
+ REAL_VALUE_TO_TARGET_DOUBLE (r, l);
fprintf (file, "0Dx%08x%08x",
- CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x));
+ l[!WORDS_BIG_ENDIAN], l[WORDS_BIG_ENDIAN]);
#else
char s[30];
- REAL_VALUE_TO_DECIMAL (r, "%.20e", s);
+ real_to_decimal (s, &r, sizeof (s), 0, 1);
#ifdef ENCORE_ASM
fprintf (file, "0f%s", s);
#else
@@ -1153,7 +1152,7 @@ print_operand (file, x, code)
fprintf (file, "0Fx%08lx", l);
#else
char s[30];
- REAL_VALUE_TO_DECIMAL (r, "%.20e", s);
+ real_to_decimal (s, &r, sizeof (s), 0, 1);
fprintf (file, "0f%s", s);
#endif
}
@@ -1576,13 +1575,3 @@ ns32k_encode_section_info (decl, first)
|| ! TREE_PUBLIC (decl));
}
}
-
-#ifdef COLLECT
-static void
-ns32k_globalize_label (stream, name)
- FILE *stream;
- const char *name;
-{
- fprintf (stream, "\t.globl\t%s\n", name);
-}
-#endif
diff --git a/gcc/config/ns32k/ns32k.h b/gcc/config/ns32k/ns32k.h
index 7bc02d4ed9d..ba53a6fc28d 100644
--- a/gcc/config/ns32k/ns32k.h
+++ b/gcc/config/ns32k/ns32k.h
@@ -126,7 +126,7 @@ extern int target_flags;
#define TARGET_HIMEM (target_flags & MASK_HIMEM)
-/* Compile using bitfield insns. */
+/* Compile using bit-field insns. */
#define TARGET_BITFIELD ((target_flags & MASK_NO_BITFIELD) == 0)
#define TARGET_IEEE_COMPARE (target_flags & MASK_IEEE_COMPARE)
@@ -276,7 +276,7 @@ while (0)
/* If bit field type is int, don't let it cross an int,
and give entire struct the alignment of an int. */
-/* Required on the 386 since it doesn't have a full set of bitfield insns.
+/* Required on the 386 since it doesn't have a full set of bit-field insns.
(There is no signed extv insn.) */
#define PCC_BITFIELD_TYPE_MATTERS 1
@@ -810,12 +810,6 @@ __transfer_from_trampoline () \
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Macros to check register numbers against specific register classes. */
/* These assume that REGNO is a hard or pseudo reg number.
@@ -863,7 +857,7 @@ __transfer_from_trampoline () \
/* Certain machines have the property that some registers cannot be
copied to some other registers without using memory. Define this
- macro on those machines to be a C expression that is non-zero if
+ macro on those machines to be a C expression that is nonzero if
objects of mode M in registers of CLASS1 can only be copied to
registers of class CLASS2 by storing a register of CLASS1 into
memory and loading that memory location into a register of CLASS2.
@@ -1309,28 +1303,11 @@ __transfer_from_trampoline () \
#define ASM_OUTPUT_REG_POP(FILE,REGNO) \
fprintf (FILE, "\tmovd tos,%s\n", reg_names[REGNO])
-/* This is how to output the definition of a user-level label named NAME,
- such as the label on a static function or variable NAME. */
-
-#ifdef COLLECT
-#define ASM_OUTPUT_LABEL(STREAM,NAME) fprintf ((STREAM), "%s:\n", (NAME))
-#endif
-
/* This is how to output a command to make the user-level label named NAME
defined for reference from other files. */
-#ifdef COLLECT
-#define TARGET_ASM_GLOBALIZE_LABEL ns32k_globalize_label
-#else
/* Globalizing directive for a label. */
#define GLOBAL_ASM_OP ".globl "
-#endif
-
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", PREFIX, NUM)
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
@@ -1382,14 +1359,6 @@ __transfer_from_trampoline () \
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%u\n", (ROUNDED)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* Print an instruction operand X on file FILE.
CODE is the code from the %-spec that requested printing this operand;
if `%z3' was used to print operand 3, then CODE is 'z'. */
diff --git a/gcc/config/ns32k/ns32k.md b/gcc/config/ns32k/ns32k.md
index ba450012a4a..5d93b53d5f4 100644
--- a/gcc/config/ns32k/ns32k.md
+++ b/gcc/config/ns32k/ns32k.md
@@ -2124,7 +2124,7 @@
}")
;; extract(base, width, offset)
-;; Signed bitfield extraction is not supported in hardware on the
+;; Signed bit-field extraction is not supported in hardware on the
;; NS 32032. It is therefore better to let GCC figure out a
;; good strategy for generating the proper instruction sequence
;; and represent it as rtl.
@@ -2169,7 +2169,7 @@
}")
;; The exts/ext instructions have the problem that they always access
-;; 32 bits even if the bitfield is smaller. For example the instruction
+;; 32 bits even if the bit-field is smaller. For example the instruction
;; extsd 7(r1),r0,2,5
;; would read not only at address 7(r1) but also at 8(r1) to 10(r1).
;; If these addresses are in a different (unmapped) page a memory fault
@@ -2693,7 +2693,7 @@
""
"*
{
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"LI\",
CODE_LABEL_NUMBER (operands[1]));
return \"cased %0\";
}")
diff --git a/gcc/config/openbsd.h b/gcc/config/openbsd.h
index ee6b52cdec6..ae41e4739b2 100644
--- a/gcc/config/openbsd.h
+++ b/gcc/config/openbsd.h
@@ -106,16 +106,12 @@ Boston, MA 02111-1307, USA. */
still uses a special flavor of gas that needs to be told when generating
pic code. */
#undef ASM_SPEC
-#define ASM_SPEC "%{fpic:-k} %{fPIC:-k -K} %|"
-
-#else
-/* Since we use gas, stdin -> - is a good idea, but we don't want to
- override native specs just for that. */
-#ifndef ASM_SPEC
-#define ASM_SPEC "%|"
-#endif
+#define ASM_SPEC "%{fpic:-k} %{fPIC:-k -K}"
#endif
+/* Since we use gas, stdin -> - is a good idea. */
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
+
/* LINK_SPEC appropriate for OpenBSD. Support for GCC options
-static, -assert, and -nostdlib. */
#undef LINK_SPEC
diff --git a/gcc/config/pa/pa-64.h b/gcc/config/pa/pa-64.h
index 2658038c51f..646f5f147d7 100644
--- a/gcc/config/pa/pa-64.h
+++ b/gcc/config/pa/pa-64.h
@@ -65,10 +65,8 @@ Boston, MA 02111-1307, USA. */
#define FLOAT_TYPE_SIZE 32
#undef DOUBLE_TYPE_SIZE
#define DOUBLE_TYPE_SIZE 64
-/* This should be 128, but until we work out the ABI for the 128bit
- FP codes supplied by HP we'll keep it at 64 bits. */
#undef LONG_DOUBLE_TYPE_SIZE
-#define LONG_DOUBLE_TYPE_SIZE 64
+#define LONG_DOUBLE_TYPE_SIZE 128
/* Temporary until we figure out what to do with those *(&@$ 32bit
relocs which appear in stabs. */
@@ -90,8 +88,11 @@ Boston, MA 02111-1307, USA. */
#undef STATIC_CHAIN_REGNUM
#define STATIC_CHAIN_REGNUM 31
-/* Nonzero if we do not know how to pass TYPE solely in registers. */
-#define MUST_PASS_IN_STACK(MODE,TYPE) \
- ((TYPE) != 0 \
- && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \
- || TREE_ADDRESSABLE (TYPE)))
+/* If defined, a C expression which determines whether the default
+ implementation of va_arg will attempt to pad down before reading the
+ next argument, if that argument is smaller than its aligned space as
+ controlled by PARM_BOUNDARY. If this macro is not defined, all such
+ arguments are padded down when BYTES_BIG_ENDIAN is true. We don't
+ want aggregrates padded down. */
+
+#define PAD_VARARGS_DOWN (!AGGREGATE_TYPE_P (type))
diff --git a/gcc/config/pa/pa-hiux.h b/gcc/config/pa/pa-hiux.h
index aed3ca3214c..c1d945c6daa 100644
--- a/gcc/config/pa/pa-hiux.h
+++ b/gcc/config/pa/pa-hiux.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for HI-UX.
- Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1993, 1995, 1996, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -21,6 +21,56 @@ Boston, MA 02111-1307, USA. */
/* HIUX is just a HPUX variant. We can simply use the HPUX configuration
for just about everything. */
-/* Predefines are the one noteworthy difference between HPUX and HIUX. */
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dhppa -DPWB -Dunix -D__H3050R -D__H3050RX -Asystem=unix -Asystem=hiux -Acpu=hppa -Amachine=hppa"
+/* OS cpp builtins are the one noteworthy difference between HPUX and HIUX.
+ The following defines are similar to those for hpux10 with the addition
+ of __H3050R and __H3050RX. */
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("system=hiux"); \
+ builtin_assert ("system=unix"); \
+ builtin_define ("__hp9000s800"); \
+ builtin_define ("__hp9000s800__"); \
+ builtin_define ("__hiux"); \
+ builtin_define ("__hiux__"); \
+ builtin_define ("__unix"); \
+ builtin_define ("__unix__"); \
+ builtin_define ("__H3050R"); \
+ builtin_define ("__H3050RX"); \
+ if (c_language == clk_cplusplus) \
+ { \
+ builtin_define ("_HIUX_SOURCE"); \
+ builtin_define ("_INCLUDE_LONGLONG"); \
+ } \
+ else if (!flag_iso) \
+ { \
+ builtin_define ("_HIUX_SOURCE"); \
+ if (preprocessing_trad_p ()) \
+ { \
+ builtin_define ("hp9000s800"); \
+ builtin_define ("hppa"); \
+ builtin_define ("hiux"); \
+ builtin_define ("unix"); \
+ builtin_define ("__CLASSIC_C__"); \
+ builtin_define ("_PWB"); \
+ builtin_define ("PWB"); \
+ } \
+ else \
+ builtin_define ("__STDC_EXT__"); \
+ } \
+ if (TARGET_SIO) \
+ builtin_define ("_SIO"); \
+ else \
+ { \
+ builtin_define ("__hp9000s700"); \
+ builtin_define ("__hp9000s700__"); \
+ builtin_define ("_WSIO"); \
+ } \
+ } \
+ while (0)
+
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "sio", MASK_SIO, N_("Generate cpp defines for server IO") }, \
+ { "wsio", -MASK_SIO, N_("Generate cpp defines for workstation IO") },
diff --git a/gcc/config/pa/pa-hpux.h b/gcc/config/pa/pa-hpux.h
index e541a97da6d..b9d563e09be 100644
--- a/gcc/config/pa/pa-hpux.h
+++ b/gcc/config/pa/pa-hpux.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for HP-UX.
- Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1995, 1996, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -28,13 +28,62 @@ Boston, MA 02111-1307, USA. */
#define SIZE_TYPE "unsigned int"
#define PTRDIFF_TYPE "int"
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("system=hpux"); \
+ builtin_assert ("system=unix"); \
+ builtin_define ("__hp9000s800"); \
+ builtin_define ("__hp9000s800__"); \
+ builtin_define ("__hp9k8"); \
+ builtin_define ("__hp9k8__"); \
+ builtin_define ("__hpux"); \
+ builtin_define ("__hpux__"); \
+ builtin_define ("__unix"); \
+ builtin_define ("__unix__"); \
+ if (c_language == clk_cplusplus) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ builtin_define ("_INCLUDE_LONGLONG"); \
+ } \
+ else if (!flag_iso) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ if (preprocessing_trad_p ()) \
+ { \
+ builtin_define ("hp9000s800"); \
+ builtin_define ("hp9k8"); \
+ builtin_define ("hppa"); \
+ builtin_define ("hpux"); \
+ builtin_define ("unix"); \
+ builtin_define ("__CLASSIC_C__"); \
+ builtin_define ("_PWB"); \
+ builtin_define ("PWB"); \
+ } \
+ else \
+ builtin_define ("__STDC_EXT__"); \
+ } \
+ if (TARGET_SIO) \
+ builtin_define ("_SIO"); \
+ else \
+ { \
+ builtin_define ("__hp9000s700"); \
+ builtin_define ("__hp9000s700__"); \
+ builtin_define ("_WSIO"); \
+ } \
+ } \
+ while (0)
+
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "sio", MASK_SIO, N_("Generate cpp defines for server IO") }, \
+ { "wsio", -MASK_SIO, N_("Generate cpp defines for workstation IO") },
+
/* Like the default, except no -lg. */
#undef LIB_SPEC
#define LIB_SPEC "%{!shared:%{!p:%{!pg:-lc}}%{p: -L/lib/libp/ -lc}%{pg: -L/lib/libp/ -lc}}"
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -Asystem=unix -Asystem=hpux -Acpu=hppa -Amachine=hppa"
-
#undef LINK_SPEC
#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_11)
#define LINK_SPEC \
diff --git a/gcc/config/pa/pa-hpux10.h b/gcc/config/pa/pa-hpux10.h
index ce9969d59f7..0354543e3d0 100644
--- a/gcc/config/pa/pa-hpux10.h
+++ b/gcc/config/pa/pa-hpux10.h
@@ -1,5 +1,6 @@
-/* Definitions of target machine for GNU compiler, for HP PA-RISC 1.1
- Copyright (C) 1995, 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
+/* Definitions of target machine for GNU compiler, for HP PA-RISC
+ Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002
+ Free Software Foundation, Inc.
Contributed by Tim Moore (moore@defmacro.cs.utah.edu)
This file is part of GNU CC.
@@ -19,6 +20,52 @@ 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 TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("system=hpux"); \
+ builtin_assert ("system=unix"); \
+ builtin_define ("__hp9000s800"); \
+ builtin_define ("__hp9000s800__"); \
+ builtin_define ("__hpux"); \
+ builtin_define ("__hpux__"); \
+ builtin_define ("__unix"); \
+ builtin_define ("__unix__"); \
+ if (c_language == clk_cplusplus) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ builtin_define ("_INCLUDE_LONGLONG"); \
+ } \
+ else if (!flag_iso) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ if (preprocessing_trad_p ()) \
+ { \
+ builtin_define ("hp9000s800"); \
+ builtin_define ("hppa"); \
+ builtin_define ("hpux"); \
+ builtin_define ("unix"); \
+ builtin_define ("__CLASSIC_C__"); \
+ builtin_define ("_PWB"); \
+ builtin_define ("PWB"); \
+ } \
+ else \
+ builtin_define ("__STDC_EXT__"); \
+ } \
+ if (TARGET_SIO) \
+ builtin_define ("_SIO"); \
+ else \
+ { \
+ builtin_define ("__hp9000s700"); \
+ builtin_define ("__hp9000s700__"); \
+ builtin_define ("_WSIO"); \
+ } \
+ } \
+ while (0)
+
+#define CPP_SPEC "%{threads: -D_REENTRANT -D_DCE_THREADS}"
+
/* We can debug dynamically linked executables on hpux9; we also want
dereferencing of a NULL pointer to cause a SEGV. */
#undef LINK_SPEC
diff --git a/gcc/config/pa/pa-hpux11.h b/gcc/config/pa/pa-hpux11.h
index 522605453f6..0bc7f1010a5 100644
--- a/gcc/config/pa/pa-hpux11.h
+++ b/gcc/config/pa/pa-hpux11.h
@@ -1,5 +1,5 @@
-/* Definitions of target machine for GNU compiler, for HP PA-RISC 1.1
- Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+/* Definitions of target machine for GNU compiler, for HP PA-RISC
+ Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -18,6 +18,55 @@ 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 TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("system=hpux"); \
+ builtin_assert ("system=unix"); \
+ builtin_define ("__hp9000s800"); \
+ builtin_define ("__hp9000s800__"); \
+ builtin_define ("__hpux"); \
+ builtin_define ("__hpux__"); \
+ builtin_define ("__unix"); \
+ builtin_define ("__unix__"); \
+ if (c_language == clk_cplusplus) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ builtin_define ("_INCLUDE_LONGLONG"); \
+ } \
+ else \
+ { \
+ if (!flag_iso) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ if (preprocessing_trad_p ()) \
+ { \
+ builtin_define ("hp9000s800"); \
+ builtin_define ("hppa"); \
+ builtin_define ("hpux"); \
+ builtin_define ("unix"); \
+ builtin_define ("__CLASSIC_C__"); \
+ builtin_define ("_PWB"); \
+ builtin_define ("PWB"); \
+ } \
+ else \
+ builtin_define ("__STDC_EXT__"); \
+ } \
+ if (!TARGET_64BIT) \
+ builtin_define ("_ILP32"); \
+ } \
+ if (TARGET_SIO) \
+ builtin_define ("_SIO"); \
+ else \
+ { \
+ builtin_define ("__hp9000s700"); \
+ builtin_define ("__hp9000s700__"); \
+ builtin_define ("_WSIO"); \
+ } \
+ } \
+ while (0)
+
/* We can debug dynamically linked executables on hpux11; we also
want dereferencing of a NULL pointer to cause a SEGV. */
#undef LINK_SPEC
diff --git a/gcc/config/pa/pa-hpux7.h b/gcc/config/pa/pa-hpux7.h
index 42c335849a8..0239e038cf8 100644
--- a/gcc/config/pa/pa-hpux7.h
+++ b/gcc/config/pa/pa-hpux7.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for HP-UX.
- Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1995, 1996, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -29,9 +29,58 @@ Boston, MA 02111-1307, USA. */
#define SIZE_TYPE "unsigned int"
#define PTRDIFF_TYPE "int"
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_assert ("system=hpux"); \
+ builtin_assert ("system=unix"); \
+ builtin_define ("__hp9000s800"); \
+ builtin_define ("__hp9000s800__"); \
+ builtin_define ("__hp9k8"); \
+ builtin_define ("__hp9k8__"); \
+ builtin_define ("__hpux"); \
+ builtin_define ("__hpux__"); \
+ builtin_define ("__unix"); \
+ builtin_define ("__unix__"); \
+ if (c_language == clk_cplusplus) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ builtin_define ("_INCLUDE_LONGLONG"); \
+ } \
+ else if (!flag_iso) \
+ { \
+ builtin_define ("_HPUX_SOURCE"); \
+ if (preprocessing_trad_p ()) \
+ { \
+ builtin_define ("hp9000s800"); \
+ builtin_define ("hp9k8"); \
+ builtin_define ("hppa"); \
+ builtin_define ("hpux"); \
+ builtin_define ("unix"); \
+ builtin_define ("__CLASSIC_C__"); \
+ builtin_define ("_PWB"); \
+ builtin_define ("PWB"); \
+ } \
+ else \
+ builtin_define ("__STDC_EXT__"); \
+ } \
+ if (TARGET_SIO) \
+ builtin_define ("_SIO"); \
+ else \
+ { \
+ builtin_define ("__hp9000s700"); \
+ builtin_define ("__hp9000s700__"); \
+ builtin_define ("_WSIO"); \
+ } \
+ } \
+ while (0)
+
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "sio", MASK_SIO, N_("Generate cpp defines for server IO") }, \
+ { "wsio", -MASK_SIO, N_("Generate cpp defines for workstation IO") },
+
/* Like the default, except no -lg. */
#undef LIB_SPEC
#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p: -L/lib/libp/ -lc}%{pg: -L/lib/libp/ -lc}"
-
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -Asystem=unix -Asystem=hpux -Acpu=hppa -Amachine=hppa"
diff --git a/gcc/config/pa/pa-linux.h b/gcc/config/pa/pa-linux.h
index 0fcb1e5095c..0879bbaa3d7 100644
--- a/gcc/config/pa/pa-linux.h
+++ b/gcc/config/pa/pa-linux.h
@@ -56,8 +56,22 @@ Boston, MA 02111-1307, USA. */
} \
} while (0)
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-D__ELF__ -Dunix -D__hppa__ -D__gnu_linux__ -Dlinux -Asystem=unix -Asystem=posix -Acpu=hppa -Amachine=hppa -Amachine=bigendian"
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_define ("__ELF__"); \
+ builtin_define ("__gnu_linux__"); \
+ builtin_define_std ("linux"); \
+ builtin_define_std ("unix"); \
+ builtin_assert ("machine=bigendian"); \
+ builtin_assert ("system=posix"); \
+ builtin_assert ("system=unix"); \
+ } \
+ while (0)
+
+#undef CPP_SPEC
+#define CPP_SPEC "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}"
#undef LIB_SPEC
#define LIB_SPEC \
@@ -81,10 +95,6 @@ Boston, MA 02111-1307, USA. */
%{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
%{static:-static}}"
-/* Sibcalls, stubs, and elf sections don't play well. */
-#undef FUNCTION_OK_FOR_SIBCALL
-#define FUNCTION_OK_FOR_SIBCALL(x) 0
-
/* glibc's profiling functions don't need gcc to allocate counters. */
#define NO_PROFILE_COUNTERS 1
@@ -164,7 +174,7 @@ Boston, MA 02111-1307, USA. */
/* Use the default. */
#undef ASM_OUTPUT_LABEL
-/* NOTE: ASM_OUTPUT_INTERNAL_LABEL() is defined for us by elfos.h, and
+/* NOTE: (*targetm.asm_out.internal_label)() is defined for us by elfos.h, and
does what we want (i.e. uses colons). It must be compatible with
ASM_GENERATE_INTERNAL_LABEL(), so do not define it here. */
@@ -173,6 +183,11 @@ Boston, MA 02111-1307, USA. */
/* Globalizing directive for a label. */
#define GLOBAL_ASM_OP ".globl "
+/* This definition is used inside pa.c to disable all
+ sibcall optimization, because sibcalls, stubs and
+ elf sections don't play well. */
+#define TARGET_HAS_STUBS_AND_ELF_SECTIONS 1
+
/* FIXME: Hacked from the <elfos.h> one so that we avoid multiple
labels in a function declaration (since pa.c seems determined to do
it differently) */
diff --git a/gcc/config/pa/pa-osf.h b/gcc/config/pa/pa-osf.h
index 04086a57b2d..74a6e588505 100644
--- a/gcc/config/pa/pa-osf.h
+++ b/gcc/config/pa/pa-osf.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for HP PA-RISC 1.1
- Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1995, 1996, 2002 Free Software Foundation, Inc.
Contributed by Tim Moore (moore@defmacro.cs.utah.edu)
This file is part of GNU CC.
@@ -19,12 +19,34 @@ 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_PREDEFINES
-#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_11)
-#define CPP_PREDEFINES "-Dhppa -Dunix -Dhp9000 -Dspectrum -DREVARGV -Dhp700 -DHP700 -Dparisc -D__pa_risc -DPARISC -DBYTE_MSF -DBIT_MSF -Asystem=unix -Asystem=mach -Acpu=hppa -Amachine=hppa"
-#else
-#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -Dunix -Dhp9000 -Dhp800 -Dspectrum -DREVARGV -Dparisc -D__pa_risc -DPARISC -DBYTE_MSF -DBIT_MSF -Asystem=unix -Asystem=mach -Acpu=hppa -Amachine=hppa"
-#endif
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ if (TARGET_PA_11) \
+ { \
+ builtin_define_std ("hp700"); \
+ builtin_define_std ("HP700"); \
+ } \
+ else \
+ { \
+ builtin_define_std ("hp800"); \
+ builtin_define_std ("hp9k8"); \
+ builtin_define_std ("hp9000s800"); \
+ } \
+ builtin_define_std ("BIT_MSF"); \
+ builtin_define_std ("BYTE_MSF"); \
+ builtin_define_std ("PARISC"); \
+ builtin_define_std ("REVARGV"); \
+ builtin_define_std ("hp9000"); \
+ builtin_define ("__pa_risc"); \
+ builtin_define_std ("parisc"); \
+ builtin_define_std ("spectrum"); \
+ builtin_define_std ("unix"); \
+ builtin_assert ("system=mach"); \
+ builtin_assert ("system=unix"); \
+ } \
+ while (0)
/* Don't default to pcc-struct-return, because gcc is the only compiler, and
we want to retain compatibility with older gcc versions. */
diff --git a/gcc/config/pa/pa-pro-end.h b/gcc/config/pa/pa-pro-end.h
index f9093909828..a1bd30dc65d 100644
--- a/gcc/config/pa/pa-pro-end.h
+++ b/gcc/config/pa/pa-pro-end.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for PRO.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -25,13 +25,25 @@ Boston, MA 02111-1307, USA. */
#define SIZE_TYPE "unsigned int"
#define PTRDIFF_TYPE "int"
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ if (c_language != clk_cplusplus \
+ && !flag_iso) \
+ { \
+ builtin_define ("hppa"); \
+ builtin_define_std ("PWB"); \
+ } \
+ builtin_define ("__pro__"); \
+ builtin_assert ("system=pro"); \
+ } \
+ while (0)
+
/* Like the default, except no -lg. */
#undef LIB_SPEC
#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p: -L/lib/libp/ -lc}%{pg: -L/lib/libp/ -lc}"
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dhppa -DPWB -Acpu=hppa -D__pro__ -Amachine=hppa"
-
/* hpux8 and later have C++ compatible include files, so do not
pretend they are `extern "C"'. */
#define NO_IMPLICIT_EXTERN_C
diff --git a/gcc/config/pa/pa-protos.h b/gcc/config/pa/pa-protos.h
index 89942f5c2d6..ca115fb55fc 100644
--- a/gcc/config/pa/pa-protos.h
+++ b/gcc/config/pa/pa-protos.h
@@ -126,9 +126,6 @@ extern int eq_neq_comparison_operator PARAMS ((rtx, enum machine_mode));
extern int insn_refs_are_delayed PARAMS ((rtx));
#endif /* RTX_CODE */
-/* Prototype function used in macro ASM_OUTPUT_MI_THUNK. */
-extern void pa_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
-
/* Prototype function used in macro CONST_OK_FOR_LETTER_P. */
extern int zdepi_cint_p PARAMS ((unsigned HOST_WIDE_INT));
@@ -163,6 +160,4 @@ extern rtx function_arg PARAMS ((CUMULATIVE_ARGS *, enum machine_mode,
extern int function_arg_partial_nregs PARAMS ((CUMULATIVE_ARGS *,
enum machine_mode,
tree, int));
-
-extern void pa_asm_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
#endif /* TREE_CODE */
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index 9f692537a46..29f8519cb7c 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -108,6 +108,7 @@ static void store_reg PARAMS ((int, int, int));
static void store_reg_modify PARAMS ((int, int, int));
static void load_reg PARAMS ((int, int, int));
static void set_reg_plus_d PARAMS ((int, int, int, int));
+static void pa_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
static void pa_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
static int pa_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int pa_adjust_priority PARAMS ((rtx, int));
@@ -116,7 +117,11 @@ static void pa_select_section PARAMS ((tree, int, unsigned HOST_WIDE_INT))
ATTRIBUTE_UNUSED;
static void pa_encode_section_info PARAMS ((tree, int));
static const char *pa_strip_name_encoding PARAMS ((const char *));
-static void pa_globalize_label PARAMS ((FILE *, const char *));
+static bool pa_function_ok_for_sibcall PARAMS ((tree, tree));
+static void pa_globalize_label PARAMS ((FILE *, const char *))
+ ATTRIBUTE_UNUSED;
+static void pa_asm_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
+
/* Save the operands last given to a compare for use when we
generate a scc or bcc insn. */
@@ -193,6 +198,12 @@ static size_t n_deferred_plabels = 0;
#undef TARGET_STRIP_NAME_ENCODING
#define TARGET_STRIP_NAME_ENCODING pa_strip_name_encoding
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL pa_function_ok_for_sibcall
+
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK pa_asm_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
void
@@ -304,7 +315,7 @@ override_options ()
}
}
-/* Return non-zero only if OP is a register of mode MODE,
+/* Return nonzero only if OP is a register of mode MODE,
or CONST0_RTX. */
int
reg_or_0_operand (op, mode)
@@ -314,7 +325,7 @@ reg_or_0_operand (op, mode)
return (op == CONST0_RTX (mode) || register_operand (op, mode));
}
-/* Return non-zero if OP is suitable for use in a call to a named
+/* Return nonzero if OP is suitable for use in a call to a named
function.
For 2.5 try to eliminate either call_operand_address or
@@ -3147,7 +3158,7 @@ compute_frame_size (size, fregs_live)
to do a "save" insn. The decision about whether or not
to do this is made in regclass.c. */
-void
+static void
pa_output_function_prologue (file, size)
FILE *file;
HOST_WIDE_INT size ATTRIBUTE_UNUSED;
@@ -4733,7 +4744,7 @@ output_deferred_plabels (file)
/* Now output the deferred plabels. */
for (i = 0; i < n_deferred_plabels; i++)
{
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (deferred_plabels[i].internal_label));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (deferred_plabels[i].internal_label));
assemble_integer (gen_rtx_SYMBOL_REF (Pmode, deferred_plabels[i].name),
TARGET_64BIT ? 8 : 4, TARGET_64BIT ? 64 : 32, 1);
}
@@ -5088,22 +5099,33 @@ function_arg_padding (mode, type)
enum machine_mode mode;
tree type;
{
- int size;
-
- if (mode == BLKmode)
- {
- if (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
- size = int_size_in_bytes (type) * BITS_PER_UNIT;
+ if (mode == BLKmode
+ || (TARGET_64BIT && type && AGGREGATE_TYPE_P (type)))
+ {
+ /* Return none if justification is not required. */
+ if (type
+ && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+ && (int_size_in_bytes (type) * BITS_PER_UNIT) % PARM_BOUNDARY == 0)
+ return none;
+
+ /* The directions set here are ignored when a BLKmode argument larger
+ than a word is placed in a register. Different code is used for
+ the stack and registers. This makes it difficult to have a
+ consistent data representation for both the stack and registers.
+ For both runtimes, the justification and padding for arguments on
+ the stack and in registers should be identical. */
+ if (TARGET_64BIT)
+ /* The 64-bit runtime specifies left justification for aggregates. */
+ return upward;
else
- return upward; /* Don't know if this is right, but */
- /* same as old definition. */
+ /* The 32-bit runtime architecture specifies right justification.
+ When the argument is passed on the stack, the argument is padded
+ with garbage on the left. The HP compiler pads with zeros. */
+ return downward;
}
- else
- size = GET_MODE_BITSIZE (mode);
- if (size < PARM_BOUNDARY)
+
+ if (GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
return downward;
- else if (size % PARM_BOUNDARY)
- return upward;
else
return none;
}
@@ -5195,15 +5217,23 @@ rtx
hppa_va_arg (valist, type)
tree valist, type;
{
- HOST_WIDE_INT align, size, ofs;
+ HOST_WIDE_INT size = int_size_in_bytes (type);
+ HOST_WIDE_INT ofs;
tree t, ptr, pptr;
if (TARGET_64BIT)
{
- /* Every argument in PA64 is passed by value (including large structs).
- Arguments with size greater than 8 must be aligned 0 MOD 16. */
+ /* Every argument in PA64 is supposed to be passed by value
+ (including large structs). However, as a GCC extension, we
+ pass zero and variable sized arguments by reference. Empty
+ structures are a GCC extension not supported by the HP
+ compilers. Thus, passing them by reference isn't likely
+ to conflict with the ABI. For variable sized arguments,
+ GCC doesn't have the infrastructure to allocate these to
+ registers. */
+
+ /* Arguments with a size greater than 8 must be aligned 0 MOD 16. */
- size = int_size_in_bytes (type);
if (size > UNITS_PER_WORD)
{
t = build (PLUS_EXPR, TREE_TYPE (valist), valist,
@@ -5212,57 +5242,75 @@ hppa_va_arg (valist, type)
build_int_2 (-2 * UNITS_PER_WORD, -1));
t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
}
- return std_expand_builtin_va_arg (valist, type);
- }
-
- /* Compute the rounded size of the type. */
- align = PARM_BOUNDARY / BITS_PER_UNIT;
- size = int_size_in_bytes (type);
- ptr = build_pointer_type (type);
+ if (size > 0)
+ return std_expand_builtin_va_arg (valist, type);
+ else
+ {
+ ptr = build_pointer_type (type);
- /* "Large" types are passed by reference. */
- if (size > 8)
- {
- t = build (PREDECREMENT_EXPR, TREE_TYPE (valist), valist,
- build_int_2 (POINTER_SIZE / BITS_PER_UNIT, 0));
- TREE_SIDE_EFFECTS (t) = 1;
+ /* Args grow upward. */
+ t = build (POSTINCREMENT_EXPR, TREE_TYPE (valist), valist,
+ build_int_2 (POINTER_SIZE / BITS_PER_UNIT, 0));
+ TREE_SIDE_EFFECTS (t) = 1;
- pptr = build_pointer_type (ptr);
- t = build1 (NOP_EXPR, pptr, t);
- TREE_SIDE_EFFECTS (t) = 1;
+ pptr = build_pointer_type (ptr);
+ t = build1 (NOP_EXPR, pptr, t);
+ TREE_SIDE_EFFECTS (t) = 1;
- t = build1 (INDIRECT_REF, ptr, t);
- TREE_SIDE_EFFECTS (t) = 1;
+ t = build1 (INDIRECT_REF, ptr, t);
+ TREE_SIDE_EFFECTS (t) = 1;
+ }
}
- else
+ else /* !TARGET_64BIT */
{
- t = build (PLUS_EXPR, TREE_TYPE (valist), valist,
- build_int_2 (-size, -1));
+ ptr = build_pointer_type (type);
- /* Copied from va-pa.h, but we probably don't need to align
- to word size, since we generate and preserve that invariant. */
- t = build (BIT_AND_EXPR, TREE_TYPE (valist), t,
- build_int_2 ((size > 4 ? -8 : -4), -1));
+ /* "Large" and variable sized types are passed by reference. */
+ if (size > 8 || size <= 0)
+ {
+ /* Args grow downward. */
+ t = build (PREDECREMENT_EXPR, TREE_TYPE (valist), valist,
+ build_int_2 (POINTER_SIZE / BITS_PER_UNIT, 0));
+ TREE_SIDE_EFFECTS (t) = 1;
- t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
- TREE_SIDE_EFFECTS (t) = 1;
+ pptr = build_pointer_type (ptr);
+ t = build1 (NOP_EXPR, pptr, t);
+ TREE_SIDE_EFFECTS (t) = 1;
- ofs = (8 - size) % 4;
- if (ofs)
- {
- t = build (PLUS_EXPR, TREE_TYPE (valist), t, build_int_2 (ofs, 0));
+ t = build1 (INDIRECT_REF, ptr, t);
TREE_SIDE_EFFECTS (t) = 1;
}
+ else
+ {
+ t = build (PLUS_EXPR, TREE_TYPE (valist), valist,
+ build_int_2 (-size, -1));
+
+ /* Copied from va-pa.h, but we probably don't need to align to
+ word size, since we generate and preserve that invariant. */
+ t = build (BIT_AND_EXPR, TREE_TYPE (valist), t,
+ build_int_2 ((size > 4 ? -8 : -4), -1));
- t = build1 (NOP_EXPR, ptr, t);
- TREE_SIDE_EFFECTS (t) = 1;
+ t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
+ TREE_SIDE_EFFECTS (t) = 1;
+
+ ofs = (8 - size) % 4;
+ if (ofs)
+ {
+ t = build (PLUS_EXPR, TREE_TYPE (valist), t,
+ build_int_2 (ofs, 0));
+ TREE_SIDE_EFFECTS (t) = 1;
+ }
+
+ t = build1 (NOP_EXPR, ptr, t);
+ TREE_SIDE_EFFECTS (t) = 1;
+ }
}
/* Calculate! */
- return expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL);
+ return expand_expr (t, NULL_RTX, VOIDmode, EXPAND_NORMAL);
}
@@ -5459,7 +5507,7 @@ output_cbranch (operands, nullify, length, negated, insn)
if (TARGET_SOM || ! TARGET_GAS)
{
output_asm_insn ("addil L'%l0-%l4,%%r1", xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (xoperands[4]));
output_asm_insn ("ldo R'%l0-%l4(%%r1),%%r1", xoperands);
}
@@ -6066,7 +6114,7 @@ output_millicode_call (insn, call_dest)
{
/* Add %r1 to the offset of our target from the next insn. */
output_asm_insn ("addil L%%%0-%1,%%r1", xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (xoperands[1]));
output_asm_insn ("ldo R%%%0-%1(%%r1),%%r1", xoperands);
}
@@ -6158,7 +6206,7 @@ output_millicode_call (insn, call_dest)
xoperands[2] = gen_label_rtx ();
output_asm_insn ("\n\t{bl|b,l} %0,%3\n\tldo %1-%2(%3),%3",
xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (xoperands[2]));
}
@@ -6326,7 +6374,7 @@ output_call (insn, call_dest, sibcall)
{
/* Add %r1 to the offset of dyncall from the next insn. */
output_asm_insn ("addil L%%$$dyncall-%1,%%r1", xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (xoperands[1]));
output_asm_insn ("ldo R%%$$dyncall-%1(%%r1),%%r1", xoperands);
}
@@ -6424,7 +6472,7 @@ output_call (insn, call_dest, sibcall)
xoperands[3] = gen_label_rtx ();
output_asm_insn ("\n\t{bl|b,l} %0,%%r2\n\tldo %1-%3(%%r2),%%r2",
xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (xoperands[3]));
}
@@ -6449,11 +6497,6 @@ hppa_encode_label (sym)
char *newstr, *p;
p = newstr = alloca (len + 1);
- if (str[0] == '*')
- {
- str++;
- len--;
- }
*p++ = '@';
strcpy (p, str);
@@ -6485,7 +6528,9 @@ static const char *
pa_strip_name_encoding (str)
const char *str;
{
- return str + (*str == '*' || *str == '@');
+ str += (*str == '@');
+ str += (*str == '*');
+ return str;
}
int
@@ -6514,7 +6559,7 @@ is_function_label_plus_const (op)
/* Output assembly code for a thunk to FUNCTION. */
-void
+static void
pa_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl;
@@ -6588,13 +6633,51 @@ pa_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
{
data_section ();
fprintf (file, "\t.align 4\n");
- ASM_OUTPUT_INTERNAL_LABEL (file, "LTHN", current_thunk_number);
+ (*targetm.asm_out.internal_label) (file, "LTHN", current_thunk_number);
fprintf (file, "\t.word P%%%s\n", target_name);
function_section (thunk_fndecl);
}
current_thunk_number++;
}
+/* Only direct calls to static functions are allowed to be sibling (tail)
+ call optimized.
+
+ This restriction is necessary because some linker generated stubs will
+ store return pointers into rp' in some cases which might clobber a
+ live value already in rp'.
+
+ In a sibcall the current function and the target function share stack
+ space. Thus if the path to the current function and the path to the
+ target function save a value in rp', they save the value into the
+ same stack slot, which has undesirable consequences.
+
+ Because of the deferred binding nature of shared libraries any function
+ with external scope could be in a different load module and thus require
+ rp' to be saved when calling that function. So sibcall optimizations
+ can only be safe for static function.
+
+ Note that GCC never needs return value relocations, so we don't have to
+ worry about static calls with return value relocations (which require
+ saving rp').
+
+ It is safe to perform a sibcall optimization when the target function
+ will never return. */
+static bool
+pa_function_ok_for_sibcall (decl, exp)
+ tree decl;
+ tree exp ATTRIBUTE_UNUSED;
+{
+#ifdef TARGET_HAS_STUBS_AND_ELF_SECTIONS
+ /* Sibcalls, stubs, and elf sections don't play well. */
+ return false;
+#endif
+ return (decl
+ && ! TARGET_PORTABLE_RUNTIME
+ && ! TARGET_64BIT
+ && ! TREE_PUBLIC (decl));
+}
+
/* Returns 1 if the 6 operands specified in OPERANDS are suitable for
use in fmpyadd instructions. */
int
@@ -7445,27 +7528,32 @@ function_arg (cum, mode, type, named, incoming)
int incoming;
{
int max_arg_words = (TARGET_64BIT ? 8 : 4);
+ int alignment = 0;
+ int arg_size;
int fpr_reg_base;
int gpr_reg_base;
rtx retval;
+ if (mode == VOIDmode)
+ return NULL_RTX;
+
+ arg_size = FUNCTION_ARG_SIZE (mode, type);
+
+ /* If this arg would be passed partially or totally on the stack, then
+ this routine should return zero. FUNCTION_ARG_PARTIAL_NREGS will
+ handle arguments which are split between regs and stack slots if
+ the ABI mandates split arguments. */
if (! TARGET_64BIT)
{
- /* If this arg would be passed partially or totally on the stack, then
- this routine should return zero. FUNCTION_ARG_PARTIAL_NREGS will
- handle arguments which are split between regs and stack slots if
- the ABI mandates split arguments. */
- if (cum->words + FUNCTION_ARG_SIZE (mode, type) > max_arg_words
- || mode == VOIDmode)
+ /* The 32-bit ABI does not split arguments. */
+ if (cum->words + arg_size > max_arg_words)
return NULL_RTX;
}
else
{
- int offset = 0;
- if (FUNCTION_ARG_SIZE (mode, type) > 1 && (cum->words & 1))
- offset = 1;
- if (cum->words + offset >= max_arg_words
- || mode == VOIDmode)
+ if (arg_size > 1)
+ alignment = cum->words & 1;
+ if (cum->words + alignment >= max_arg_words)
return NULL_RTX;
}
@@ -7473,70 +7561,60 @@ function_arg (cum, mode, type, named, incoming)
particularly in their handling of FP registers. We might
be able to cleverly share code between them, but I'm not
going to bother in the hope that splitting them up results
- in code that is more easily understood.
+ in code that is more easily understood. */
- The 64bit code probably is very wrong for structure passing. */
if (TARGET_64BIT)
{
/* Advance the base registers to their current locations.
Remember, gprs grow towards smaller register numbers while
- fprs grow to higher register numbers. Also remember FP regs
- are always 4 bytes wide, while the size of an integer register
- varies based on the size of the target word. */
+ fprs grow to higher register numbers. Also remember that
+ although FP regs are 32-bit addressable, we pretend that
+ the registers are 64-bits wide. */
gpr_reg_base = 26 - cum->words;
fpr_reg_base = 32 + cum->words;
- /* If the argument is more than a word long, then we need to align
- the base registers. Same caveats as above. */
- if (FUNCTION_ARG_SIZE (mode, type) > 1)
+ /* Arguments wider than one word and small aggregates need special
+ treatment. */
+ if (arg_size > 1
+ || mode == BLKmode
+ || (type && AGGREGATE_TYPE_P (type)))
{
- if (mode != BLKmode)
- {
- /* First deal with alignment of the doubleword. */
- gpr_reg_base -= (cum->words & 1);
-
- /* This seems backwards, but it is what HP specifies. We need
- gpr_reg_base to point to the smaller numbered register of
- the integer register pair. So if we have an even register
- number, then decrement the gpr base. */
- gpr_reg_base -= ((gpr_reg_base % 2) == 0);
-
- /* FP values behave sanely, except that each FP reg is only
- half of word. */
- fpr_reg_base += ((fpr_reg_base % 2) == 0);
- }
- else
+ /* Double-extended precision (80-bit), quad-precision (128-bit)
+ and aggregates including complex numbers are aligned on
+ 128-bit boundaries. The first eight 64-bit argument slots
+ are associated one-to-one, with general registers r26
+ through r19, and also with floating-point registers fr4
+ through fr11. Arguments larger than one word are always
+ passed in general registers.
+
+ Using a PARALLEL with a word mode register results in left
+ justified data on a big-endian target. */
+
+ rtx loc[8];
+ int i, offset = 0, ub = arg_size;
+
+ /* Align the base register. */
+ gpr_reg_base -= alignment;
+
+ ub = MIN (ub, max_arg_words - cum->words - alignment);
+ for (i = 0; i < ub; i++)
{
- rtx loc[8];
- int i, offset = 0, ub;
- ub = FUNCTION_ARG_SIZE (mode, type);
- ub = MIN (ub,
- MAX (0, max_arg_words - cum->words - (cum->words & 1)));
- gpr_reg_base -= (cum->words & 1);
- for (i = 0; i < ub; i++)
- {
- loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
- gen_rtx_REG (DImode,
- gpr_reg_base),
- GEN_INT (offset));
- gpr_reg_base -= 1;
- offset += 8;
- }
- if (ub == 0)
- return NULL_RTX;
- else if (ub == 1)
- return XEXP (loc[0], 0);
- else
- return gen_rtx_PARALLEL (mode, gen_rtvec_v (ub, loc));
+ loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
+ gen_rtx_REG (DImode, gpr_reg_base),
+ GEN_INT (offset));
+ gpr_reg_base -= 1;
+ offset += 8;
}
+
+ return gen_rtx_PARALLEL (mode, gen_rtvec_v (ub, loc));
}
- }
+ }
else
{
/* If the argument is larger than a word, then we know precisely
which registers we must use. */
- if (FUNCTION_ARG_SIZE (mode, type) > 1)
+ if (arg_size > 1)
{
if (cum->words)
{
@@ -7548,6 +7626,34 @@ function_arg (cum, mode, type, named, incoming)
gpr_reg_base = 25;
fpr_reg_base = 34;
}
+
+ /* Structures 5 to 8 bytes in size are passed in the general
+ registers in the same manner as other non floating-point
+ objects. The data is right-justified and zero-extended
+ to 64 bits.
+
+ This is magic. Normally, using a PARALLEL results in left
+ justified data on a big-endian target. However, using a
+ single double-word register provides the required right
+ justication for 5 to 8 byte structures. This has nothing
+ to do with the direction of padding specified for the argument.
+ It has to do with how the data is widened and shifted into
+ and from the register.
+
+ Aside from adding load_multiple and store_multiple patterns,
+ this is the only way that I have found to obtain right
+ justification of BLKmode data when it has a size greater
+ than one word. Splitting the operation into two SImode loads
+ or returning a DImode REG results in left justified data. */
+ if (mode == BLKmode)
+ {
+ rtx loc[1];
+
+ loc[0] = gen_rtx_EXPR_LIST (VOIDmode,
+ gen_rtx_REG (DImode, gpr_reg_base),
+ const0_rtx);
+ return gen_rtx_PARALLEL (mode, gen_rtvec_v (1, loc));
+ }
}
else
{
@@ -7558,19 +7664,6 @@ function_arg (cum, mode, type, named, incoming)
}
}
- if (TARGET_64BIT && mode == TFmode)
- {
- return
- gen_rtx_PARALLEL
- (mode,
- gen_rtvec (2,
- gen_rtx_EXPR_LIST (VOIDmode,
- gen_rtx_REG (DImode, gpr_reg_base + 1),
- const0_rtx),
- gen_rtx_EXPR_LIST (VOIDmode,
- gen_rtx_REG (DImode, gpr_reg_base),
- GEN_INT (8))));
- }
/* Determine if the argument needs to be passed in both general and
floating point registers. */
if (((TARGET_PORTABLE_RUNTIME || TARGET_64BIT || TARGET_ELF32)
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 04e417f3640..375a9fa5c5c 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -74,14 +74,10 @@ extern enum architecture_type pa_arch;
extern int target_flags;
-/* compile code for HP-PA 1.1 ("Snake") */
+/* compile code for HP-PA 1.1 ("Snake"). */
#define MASK_PA_11 1
-#ifndef TARGET_PA_11
-#define TARGET_PA_11 (target_flags & MASK_PA_11)
-#endif
-
/* Disable all FP registers (they all become fixed). This may be necessary
for compiling kernels which perform lazy context switching of FP regs.
Note if you use this option and try to perform floating point operations
@@ -142,10 +138,28 @@ extern int target_flags;
#define MASK_BIG_SWITCH 2048
#define TARGET_BIG_SWITCH (target_flags & MASK_BIG_SWITCH)
-
/* Generate code for the HPPA 2.0 architecture. TARGET_PA_11 should also be
true when this is true. */
#define MASK_PA_20 4096
+
+/* Generate cpp defines for server I/O. */
+#define MASK_SIO 8192
+#define TARGET_SIO (target_flags & MASK_SIO)
+
+/* Assume GNU linker by default. */
+#define MASK_GNU_LD 16384
+#ifndef TARGET_GNU_LD
+#define TARGET_GNU_LD (target_flags & MASK_GNU_LD)
+#endif
+
+#ifndef TARGET_PA_10
+#define TARGET_PA_10 (target_flags & (MASK_PA_11 | MASK_PA_20) == 0)
+#endif
+
+#ifndef TARGET_PA_11
+#define TARGET_PA_11 (target_flags & MASK_PA_11)
+#endif
+
#ifndef TARGET_PA_20
#define TARGET_PA_20 (target_flags & MASK_PA_20)
#endif
@@ -165,40 +179,69 @@ extern int target_flags;
#define TARGET_SOM 0
#endif
-/* Macro to define tables used to set the flags.
- This is a list in braces of pairs in braces,
- each pair being { "NAME", VALUE }
- where VALUE is the bits to set or minus the bits to clear.
- An empty string NAME is used to identify the default VALUE. */
+/* Macro to define tables used to set the flags. This is a
+ list in braces of target switches with each switch being
+ { "NAME", VALUE, "HELP_STRING" }. VALUE is the bits to set,
+ or minus the bits to clear. An empty string NAME is used to
+ identify the default VALUE. Do not mark empty strings for
+ translation. */
#define TARGET_SWITCHES \
- {{"snake", MASK_PA_11, "Generate PA1.1 code"}, \
- {"nosnake", -(MASK_PA_11 | MASK_PA_20), "Generate PA1.0 code"}, \
- {"pa-risc-1-0", -(MASK_PA_11 | MASK_PA_20), "Generate PA1.0 code"}, \
- {"pa-risc-1-1", MASK_PA_11, "Generate PA1.1 code"}, \
- {"pa-risc-2-0", MASK_PA_20, "Generate PA2.0 code. This option requires binutils 2.10 or later"}, \
- {"disable-fpregs", MASK_DISABLE_FPREGS, "Disable FP regs"}, \
- {"no-disable-fpregs", -MASK_DISABLE_FPREGS, "Do not disable FP regs"},\
- {"no-space-regs", MASK_NO_SPACE_REGS, "Disable space regs"}, \
- {"space-regs", -MASK_NO_SPACE_REGS, "Do not disable space regs"}, \
- {"jump-in-delay", MASK_JUMP_IN_DELAY, "Put jumps in call delay slots"},\
- {"no-jump-in-delay", -MASK_JUMP_IN_DELAY, "Do not put jumps in call delay slots"}, \
- {"disable-indexing", MASK_DISABLE_INDEXING, "Disable indexed addressing"},\
- {"no-disable-indexing", -MASK_DISABLE_INDEXING, "Do not disable indexed addressing"},\
- {"portable-runtime", MASK_PORTABLE_RUNTIME, "Use portable calling conventions"}, \
- {"no-portable-runtime", -MASK_PORTABLE_RUNTIME, "Do not use portable calling conventions"},\
- {"gas", MASK_GAS, "Assume code will be assembled by GAS"}, \
- {"no-gas", -MASK_GAS, "Do not assume code will be assembled by GAS"}, \
- {"soft-float", MASK_SOFT_FLOAT, "Use software floating point"}, \
- {"no-soft-float", -MASK_SOFT_FLOAT, "Do not use software floating point"}, \
- {"long-load-store", MASK_LONG_LOAD_STORE, "Emit long load/store sequences"}, \
- {"no-long-load-store", -MASK_LONG_LOAD_STORE, "Do not emit long load/store sequences"},\
- {"fast-indirect-calls", MASK_FAST_INDIRECT_CALLS, "Generate fast indirect calls"},\
- {"no-fast-indirect-calls", -MASK_FAST_INDIRECT_CALLS, "Do not generate fast indirect calls"},\
- {"big-switch", MASK_BIG_SWITCH, "Generate code for huge switch statements"}, \
- {"no-big-switch", -MASK_BIG_SWITCH, "Do not generate code for huge switch statements"}, \
- {"linker-opt", 0, "Enable linker optimizations"}, \
- { "", TARGET_DEFAULT | TARGET_CPU_DEFAULT, NULL}}
+ {{ "snake", MASK_PA_11, \
+ N_("Generate PA1.1 code") }, \
+ { "nosnake", -(MASK_PA_11 | MASK_PA_20), \
+ N_("Generate PA1.0 code") }, \
+ { "pa-risc-1-0", -(MASK_PA_11 | MASK_PA_20), \
+ N_("Generate PA1.0 code") }, \
+ { "pa-risc-1-1", MASK_PA_11, \
+ N_("Generate PA1.1 code") }, \
+ { "pa-risc-2-0", MASK_PA_20, \
+ N_("Generate PA2.0 code (requires binutils 2.10 or later)") }, \
+ { "disable-fpregs", MASK_DISABLE_FPREGS, \
+ N_("Disable FP regs") }, \
+ { "no-disable-fpregs", -MASK_DISABLE_FPREGS, \
+ N_("Do not disable FP regs") }, \
+ { "no-space-regs", MASK_NO_SPACE_REGS, \
+ N_("Disable space regs") }, \
+ { "space-regs", -MASK_NO_SPACE_REGS, \
+ N_("Do not disable space regs") }, \
+ { "jump-in-delay", MASK_JUMP_IN_DELAY, \
+ N_("Put jumps in call delay slots") }, \
+ { "no-jump-in-delay", -MASK_JUMP_IN_DELAY, \
+ N_("Do not put jumps in call delay slots") }, \
+ { "disable-indexing", MASK_DISABLE_INDEXING, \
+ N_("Disable indexed addressing") }, \
+ { "no-disable-indexing", -MASK_DISABLE_INDEXING, \
+ N_("Do not disable indexed addressing") }, \
+ { "portable-runtime", MASK_PORTABLE_RUNTIME, \
+ N_("Use portable calling conventions") }, \
+ { "no-portable-runtime", -MASK_PORTABLE_RUNTIME, \
+ N_("Do not use portable calling conventions") }, \
+ { "gas", MASK_GAS, \
+ N_("Assume code will be assembled by GAS") }, \
+ { "no-gas", -MASK_GAS, \
+ N_("Do not assume code will be assembled by GAS") }, \
+ { "soft-float", MASK_SOFT_FLOAT, \
+ N_("Use software floating point") }, \
+ { "no-soft-float", -MASK_SOFT_FLOAT, \
+ N_("Do not use software floating point") }, \
+ { "long-load-store", MASK_LONG_LOAD_STORE, \
+ N_("Emit long load/store sequences") }, \
+ { "no-long-load-store", -MASK_LONG_LOAD_STORE, \
+ N_("Do not emit long load/store sequences") }, \
+ { "fast-indirect-calls", MASK_FAST_INDIRECT_CALLS, \
+ N_("Generate fast indirect calls") }, \
+ { "no-fast-indirect-calls", -MASK_FAST_INDIRECT_CALLS, \
+ N_("Do not generate fast indirect calls") }, \
+ { "big-switch", MASK_BIG_SWITCH, \
+ N_("Generate code for huge switch statements") }, \
+ { "no-big-switch", -MASK_BIG_SWITCH, \
+ N_("Do not generate code for huge switch statements") }, \
+ { "linker-opt", 0, \
+ N_("Enable linker optimizations") }, \
+ SUBTARGET_SWITCHES \
+ { "", TARGET_DEFAULT | TARGET_CPU_DEFAULT, \
+ NULL }}
#ifndef TARGET_DEFAULT
#define TARGET_DEFAULT (MASK_GAS | MASK_JUMP_IN_DELAY)
@@ -208,14 +251,20 @@ extern int target_flags;
#define TARGET_CPU_DEFAULT 0
#endif
+#ifndef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES
+#endif
+
#ifndef TARGET_SCHED_DEFAULT
#define TARGET_SCHED_DEFAULT "8000"
#endif
-#define TARGET_OPTIONS \
-{ \
- { "schedule=", &pa_cpu_string, "Specify CPU for scheduling purposes" },\
- { "arch=", &pa_arch_string, "Specify architecture for code generation. Values are 1.0, 1.1, and 2.0. 2.0 requires gas snapshot 19990413 or later." }\
+#define TARGET_OPTIONS \
+{ \
+ { "schedule=", &pa_cpu_string, \
+ N_("Specify CPU for scheduling purposes") }, \
+ { "arch=", &pa_arch_string, \
+ N_("Specify architecture for code generation. Values are 1.0, 1.1, and 2.0. 2.0 requires gas snapshot 19990413 or later.") }\
}
/* Specify the dialect of assembler to use. New mnemonics is dialect one
@@ -265,75 +314,42 @@ extern int target_flags;
((GET_CODE (X) == PLUS ? OFFSET : 0) \
+ (frame_pointer_needed ? 0 : compute_frame_size (get_frame_size (), 0)))
-#define CPP_PA10_SPEC ""
-#define CPP_PA11_SPEC "-D_PA_RISC1_1 -D__hp9000s700"
-#define CPP_PA20_SPEC "-D_PA_RISC2_0 -D__hp9000s800"
-#define CPP_64BIT_SPEC "-D__LP64__"
-
-#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_11) == 0
-#define CPP_CPU_DEFAULT_SPEC "%(cpp_pa10)"
-#endif
-
-#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_11) != 0
-#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_PA_20) != 0
-#define CPP_CPU_DEFAULT_SPEC "%(cpp_pa11) %(cpp_pa20)"
-#else
-#define CPP_CPU_DEFAULT_SPEC "%(cpp_pa11)"
-#endif
-#endif
-
-#if TARGET_64BIT
-#define CPP_64BIT_DEFAULT_SPEC "%(cpp_64bit)"
-#else
-#define CPP_64BIT_DEFAULT_SPEC ""
-#endif
-
-/* This macro defines names of additional specifications to put in the
- specs that can be used in various specifications like CC1_SPEC. Its
- definition is an initializer with a subgrouping for each command option.
-
- Each subgrouping contains a string constant, that defines the
- specification name, and a string constant that used by the GNU CC driver
- program.
-
- Do not define this macro if it does not need to do anything. */
-
-#ifndef SUBTARGET_EXTRA_SPECS
-#define SUBTARGET_EXTRA_SPECS
-#endif
+#define TARGET_CPU_CPP_BUILTINS() \
+do { \
+ builtin_assert("cpu=hppa"); \
+ builtin_assert("machine=hppa"); \
+ builtin_define("__hppa"); \
+ builtin_define("__hppa__"); \
+ if (TARGET_64BIT) \
+ { \
+ builtin_define("_LP64"); \
+ builtin_define("__LP64__"); \
+ } \
+ if (TARGET_PA_20) \
+ builtin_define("_PA_RISC2_0"); \
+ else if (TARGET_PA_11) \
+ builtin_define("_PA_RISC1_1"); \
+ else \
+ builtin_define("_PA_RISC1_0"); \
+} while (0)
-#define EXTRA_SPECS \
- { "cpp_pa10", CPP_PA10_SPEC}, \
- { "cpp_pa11", CPP_PA11_SPEC}, \
- { "cpp_pa20", CPP_PA20_SPEC}, \
- { "cpp_64bit", CPP_64BIT_SPEC}, \
- { "cpp_cpu_default", CPP_CPU_DEFAULT_SPEC }, \
- { "cpp_64bit_default", CPP_64BIT_DEFAULT_SPEC }, \
- SUBTARGET_EXTRA_SPECS
-
-#define CPP_SPEC "\
-%{mpa-risc-1-0:%(cpp_pa10)} \
-%{mpa-risc-1-1:%(cpp_pa11)} \
-%{msnake:%(cpp_pa11)} \
-%{mpa-risc-2-0:%(cpp_pa20)} \
-%{!mpa-risc-1-0:%{!mpa-risc-1-1:%{!mpa-risc-2-0:%{!msnake:%(cpp_cpu_default)}}}} \
-%{m64bit:%(cpp_64bit)} \
-%{!m64bit:%(cpp_64bit_default)} \
-%{!ansi: -D_HPUX_SOURCE -D_HIUX_SOURCE -D__STDC_EXT__ -D_INCLUDE_LONGLONG} \
-%{threads: -D_REENTRANT -D_DCE_THREADS}"
-
-#define CPLUSPLUS_CPP_SPEC "\
--D_HPUX_SOURCE -D_HIUX_SOURCE -D__STDC_EXT__ -D_INCLUDE_LONGLONG \
-%{mpa-risc-1-0:%(cpp_pa10)} \
-%{mpa-risc-1-1:%(cpp_pa11)} \
-%{msnake:%(cpp_pa11)} \
-%{mpa-risc-2-0:%(cpp_pa20)} \
-%{!mpa-risc-1-0:%{!mpa-risc-1-1:%{!mpa-risc-2-0:%{!msnake:%(cpp_cpu_default)}}}} \
-%{m64bit:%(cpp_64bit)} \
-%{!m64bit:%(cpp_64bit_default)} \
-%{threads: -D_REENTRANT -D_DCE_THREADS}"
-
-/* Defines for a K&R CC */
+/* An old set of OS defines for various BSD-like systems. */
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_define_std ("REVARGV"); \
+ builtin_define_std ("hp800"); \
+ builtin_define_std ("hp9000"); \
+ builtin_define_std ("hp9k8"); \
+ if (c_language != clk_cplusplus \
+ && !flag_iso) \
+ builtin_define ("hppa"); \
+ builtin_define_std ("spectrum"); \
+ builtin_define_std ("unix"); \
+ builtin_assert ("system=bsd"); \
+ builtin_assert ("system=unix"); \
+ } \
+ while (0)
#define CC1_SPEC "%{pg:} %{p:}"
@@ -366,9 +382,6 @@ extern int target_flags;
/* Machine dependent reorg pass. */
#define MACHINE_DEPENDENT_REORG(X) pa_reorg(X)
-/* Names to predefine in the preprocessor for this target machine. */
-
-#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -Dunix -Dhp9000 -Dhp800 -Dspectrum -DREVARGV -Asystem=unix -Asystem=bsd -Acpu=hppa -Amachine=hppa"
/* target machine storage layout */
@@ -407,7 +420,7 @@ extern int target_flags;
/* Largest alignment required for any stack parameter, in bits.
Don't define this if it is equal to PARM_BOUNDARY */
-#define MAX_PARM_BOUNDARY 64
+#define MAX_PARM_BOUNDARY (2 * PARM_BOUNDARY)
/* Boundary (in *bits*) on which stack pointer is always aligned;
certain optimizations in combine depend on this.
@@ -427,7 +440,7 @@ extern int target_flags;
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* No data type wants to be aligned rounder than this. This is set
@@ -506,9 +519,13 @@ extern struct rtx_def *hppa_pic_save_rtx PARAMS ((void));
PA64 ABI says that objects larger than 128 bits are returned in memory.
Note, int_size_in_bytes can return -1 if the size of the object is
variable or larger than the maximum value that can be expressed as
- a HOST_WIDE_INT. */
+ a HOST_WIDE_INT. It can also return zero for an empty type. The
+ simplest way to handle variable and empty types is to pass them in
+ memory. This avoids problems in defining the boundaries of argument
+ slots, allocating registers, etc. */
#define RETURN_IN_MEMORY(TYPE) \
- ((unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) > (TARGET_64BIT ? 16 : 8))
+ (int_size_in_bytes (TYPE) > (TARGET_64BIT ? 16 : 8) \
+ || int_size_in_bytes (TYPE) <= 0)
/* Register in which address to store a structure value
is passed to a function. */
@@ -681,16 +698,18 @@ extern struct rtx_def *hppa_pic_save_rtx PARAMS ((void));
otherwise, FUNC is 0. */
/* On the HP-PA the value is found in register(s) 28(-29), unless
- the mode is SF or DF. Then the value is returned in fr4 (32, ) */
+ the mode is SF or DF. Then the value is returned in fr4 (32). */
/* This must perform the same promotions as PROMOTE_MODE, else
PROMOTE_FUNCTION_RETURN will not work correctly. */
-#define FUNCTION_VALUE(VALTYPE, FUNC) \
- gen_rtx_REG (((INTEGRAL_TYPE_P (VALTYPE) \
- && TYPE_PRECISION (VALTYPE) < BITS_PER_WORD) \
- || POINTER_TYPE_P (VALTYPE)) \
- ? word_mode : TYPE_MODE (VALTYPE), \
- TREE_CODE (VALTYPE) == REAL_TYPE && !TARGET_SOFT_FLOAT ? 32 : 28)
+#define FUNCTION_VALUE(VALTYPE, FUNC) \
+ gen_rtx_REG (((INTEGRAL_TYPE_P (VALTYPE) \
+ && TYPE_PRECISION (VALTYPE) < BITS_PER_WORD) \
+ || POINTER_TYPE_P (VALTYPE)) \
+ ? word_mode : TYPE_MODE (VALTYPE), \
+ (TREE_CODE (VALTYPE) == REAL_TYPE \
+ && TYPE_MODE (VALTYPE) != TFmode \
+ && !TARGET_SOFT_FLOAT) ? 32 : 28)
/* Define how to find the value returned by a library function
assuming the value has mode MODE. */
@@ -745,7 +764,9 @@ struct hppa_args {int words, nargs_prototype, indirect; };
(CUM).indirect = 0, \
(CUM).nargs_prototype = 1000
-/* Figure out the size in words of the function argument. */
+/* Figure out the size in words of the function argument. The size
+ returned by this macro should always be greater than zero because
+ we pass variable and zero sized objects by reference. */
#define FUNCTION_ARG_SIZE(MODE, TYPE) \
((((MODE) != BLKmode \
@@ -817,6 +838,12 @@ struct hppa_args {int words, nargs_prototype, indirect; };
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
function_arg (&CUM, MODE, TYPE, NAMED, 0)
+/* Nonzero if we do not know how to pass TYPE solely in registers. */
+#define MUST_PASS_IN_STACK(MODE,TYPE) \
+ ((TYPE) != 0 \
+ && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \
+ || TREE_ADDRESSABLE (TYPE)))
+
#define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
function_arg (&CUM, MODE, TYPE, NAMED, 1)
@@ -833,42 +860,43 @@ struct hppa_args {int words, nargs_prototype, indirect; };
bits, of an argument with the specified mode and type. If it is
not defined, `PARM_BOUNDARY' is used for all arguments. */
-#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
- (((TYPE) != 0) \
- ? ((integer_zerop (TYPE_SIZE (TYPE)) \
- || ! TREE_CONSTANT (TYPE_SIZE (TYPE))) \
- ? BITS_PER_UNIT \
- : (((int_size_in_bytes (TYPE)) + UNITS_PER_WORD - 1) \
- / UNITS_PER_WORD) * BITS_PER_WORD) \
- : ((GET_MODE_ALIGNMENT(MODE) <= PARM_BOUNDARY) \
- ? PARM_BOUNDARY : GET_MODE_ALIGNMENT(MODE)))
-
-/* Arguments larger than eight bytes are passed by invisible reference */
-
-/* PA64 does not pass anything by invisible reference. */
+/* Arguments larger than one word are double word aligned. */
+
+#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \
+ (((TYPE) \
+ ? (integer_zerop (TYPE_SIZE (TYPE)) \
+ || !TREE_CONSTANT (TYPE_SIZE (TYPE)) \
+ || int_size_in_bytes (TYPE) <= UNITS_PER_WORD) \
+ : GET_MODE_SIZE(MODE) <= UNITS_PER_WORD) \
+ ? PARM_BOUNDARY : MAX_PARM_BOUNDARY)
+
+/* In the 32-bit runtime, arguments larger than eight bytes are passed
+ by invisible reference. As a GCC extension, we also pass anything
+ with a zero or variable size by reference.
+
+ The 64-bit runtime does not describe passing any types by invisible
+ reference. The internals of GCC can't currently handle passing
+ empty structures, and zero or variable length arrays when they are
+ not passed entirely on the stack or by reference. Thus, as a GCC
+ extension, we pass these types by reference. The HP compiler doesn't
+ support these types, so hopefully there shouldn't be any compatibility
+ issues. This may have to be revisited when HP releases a C99 compiler
+ or updates the ABI. */
#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
(TARGET_64BIT \
- ? 0 \
- : (((TYPE) && int_size_in_bytes (TYPE) > 8) \
+ ? ((TYPE) && int_size_in_bytes (TYPE) <= 0) \
+ : (((TYPE) && (int_size_in_bytes (TYPE) > 8 \
+ || int_size_in_bytes (TYPE) <= 0)) \
|| ((MODE) && GET_MODE_SIZE (MODE) > 8)))
-/* PA64 does not pass anything by invisible reference.
- This should be undef'ed for 64bit, but we'll see if this works. The
- problem is that we can't test TARGET_64BIT from the preprocessor. */
-#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) \
- (TARGET_64BIT \
- ? 0 \
- : (((TYPE) && int_size_in_bytes (TYPE) > 8) \
- || ((MODE) && GET_MODE_SIZE (MODE) > 8)))
+#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) \
+ FUNCTION_ARG_PASS_BY_REFERENCE (CUM, MODE, TYPE, NAMED)
extern GTY(()) rtx hppa_compare_op0;
extern GTY(()) rtx hppa_compare_op1;
extern enum cmp_type hppa_branch_type;
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
- pa_asm_output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
-
/* On HPPA, we emit profiling code as rtl via PROFILE_HOOK rather than
as assembly via FUNCTION_PROFILER. Just output a local label.
We can't use the function label because the GAS SOM target can't
@@ -879,7 +907,7 @@ extern enum cmp_type hppa_branch_type;
#endif
#define FUNCTION_PROFILER(FILE, LABEL) \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, FUNC_BEGIN_PROLOG_LABEL, LABEL)
+ (*targetm.asm_out.internal_label) (FILE, FUNC_BEGIN_PROLOG_LABEL, LABEL)
#define PROFILE_HOOK(label_no) hppa_profile_hook (label_no)
void hppa_profile_hook PARAMS ((int label_no));
@@ -1663,13 +1691,16 @@ do { \
`assemble_name' uses this. */
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
- fprintf ((FILE), "%s", (NAME) + (FUNCTION_NAME_P (NAME) ? 1 : 0))
-
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- {fprintf (FILE, "%c$%s%04d\n", (PREFIX)[0], (PREFIX) + 1, NUM);}
+ do { \
+ const char *xname = (NAME); \
+ if (FUNCTION_NAME_P (NAME)) \
+ xname += 1; \
+ if (xname[0] == '*') \
+ xname += 1; \
+ else \
+ fputs (user_label_prefix, FILE); \
+ fputs (xname, FILE); \
+ } while (0)
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
@@ -1738,13 +1769,7 @@ do { \
assemble_name ((FILE), (NAME)); \
fprintf ((FILE), "\n\t.block %d\n", (SIZE));}
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
/* All HP assemblers use "!" to separate logical lines. */
#define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == '!')
@@ -1825,35 +1850,6 @@ do { \
/* The number of Pmode words for the setjmp buffer. */
#define JMP_BUF_SIZE 50
-/* Only direct calls to static functions are allowed to be sibling (tail)
- call optimized.
-
- This restriction is necessary because some linker generated stubs will
- store return pointers into rp' in some cases which might clobber a
- live value already in rp'.
-
- In a sibcall the current function and the target function share stack
- space. Thus if the path to the current function and the path to the
- target function save a value in rp', they save the value into the
- same stack slot, which has undesirable consequences.
-
- Because of the deferred binding nature of shared libraries any function
- with external scope could be in a different load module and thus require
- rp' to be saved when calling that function. So sibcall optimizations
- can only be safe for static function.
-
- Note that GCC never needs return value relocations, so we don't have to
- worry about static calls with return value relocations (which require
- saving rp').
-
- It is safe to perform a sibcall optimization when the target function
- will never return. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) \
- (DECL \
- && ! TARGET_PORTABLE_RUNTIME \
- && ! TARGET_64BIT \
- && ! TREE_PUBLIC (DECL))
-
#define PREDICATE_CODES \
{"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \
{"call_operand_address", {LABEL_REF, SYMBOL_REF, CONST_INT, \
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 7632beba83c..30e3a902281 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -628,6 +628,26 @@
[(set_attr "length" "4")
(set_attr "type" "fpcc")])
+;; The following two patterns are optimization placeholders. In almost
+;; all cases, the user of the condition code will be simplified and the
+;; original condition code setting insn should be eliminated.
+
+(define_insn "*setccfp0"
+ [(set (reg:CCFP 0)
+ (const_int 0))]
+ "! TARGET_SOFT_FLOAT"
+ "fcmp,dbl,!= %%fr0,%%fr0"
+ [(set_attr "length" "4")
+ (set_attr "type" "fpcc")])
+
+(define_insn "*setccfp1"
+ [(set (reg:CCFP 0)
+ (const_int 1))]
+ "! TARGET_SOFT_FLOAT"
+ "fcmp,dbl,= %%fr0,%%fr0"
+ [(set_attr "length" "4")
+ (set_attr "type" "fpcc")])
+
;; scc insns.
(define_expand "seq"
@@ -2438,7 +2458,7 @@
output_asm_insn (\"{bl|b,l} .+8,%0\", xoperands);
output_asm_insn (\"{depi|depwi} 0,31,2,%0\", xoperands);
if (TARGET_SOM || ! TARGET_GAS)
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (xoperands[2]));
/* If we're trying to load the address of a label that happens to be
@@ -5806,7 +5826,7 @@
xoperands[2] = gen_label_rtx ();
output_asm_insn (\"{bl|b,l} %0,%%r2\;ldo %1-%2(%%r2),%%r25\", xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (xoperands[2]));
return \"\";
}"
@@ -5871,7 +5891,7 @@
output_asm_insn (\"{bl|b,l} .+8,%%r1\\n\\taddil L'%l0-%l1,%%r1\",
xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (xoperands[1]));
output_asm_insn (\"ldo R'%l0-%l1(%%r1),%%r1\", xoperands);
}
@@ -6111,7 +6131,7 @@
if (TARGET_SOM || ! TARGET_GAS)
{
output_asm_insn (\"addil L%%$$dyncall-%1,%%r1\", xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (xoperands[1]));
output_asm_insn (\"ldo R%%$$dyncall-%1(%%r1),%%r1\", xoperands);
}
@@ -6297,7 +6317,7 @@
if (TARGET_SOM || ! TARGET_GAS)
{
output_asm_insn (\"addil L%%$$dyncall-%1,%%r1\", xoperands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (xoperands[1]));
output_asm_insn (\"ldo R%%$$dyncall-%1(%%r1),%%r1\", xoperands);
}
@@ -6601,8 +6621,13 @@
emit_insn (gen_extzv_64 (operands[0], operands[1],
operands[2], operands[3]));
else
- emit_insn (gen_extzv_32 (operands[0], operands[1],
- operands[2], operands[3]));
+ {
+ if (! uint5_operand (operands[2], SImode)
+ || ! uint5_operand (operands[3], SImode))
+ FAIL;
+ emit_insn (gen_extzv_32 (operands[0], operands[1],
+ operands[2], operands[3]));
+ }
DONE;
}")
@@ -6721,8 +6746,13 @@
emit_insn (gen_insv_64 (operands[0], operands[1],
operands[2], operands[3]));
else
- emit_insn (gen_insv_32 (operands[0], operands[1],
- operands[2], operands[3]));
+ {
+ if (! uint5_operand (operands[2], SImode)
+ || ! uint5_operand (operands[3], SImode))
+ FAIL;
+ emit_insn (gen_insv_32 (operands[0], operands[1],
+ operands[2], operands[3]));
+ }
DONE;
}")
@@ -7435,6 +7465,12 @@
"flag_pic"
"
{
+ /* On the 64-bit port, we need a blockage because there is
+ confusion regarding the dependence of the restore on the
+ frame pointer. As a result, the frame pointer and pic
+ register restores sometimes are interchanged erroneously. */
+ if (TARGET_64BIT)
+ emit_insn (gen_blockage ());
/* Restore the PIC register using hppa_pic_save_rtx (). The
PIC register is not saved in the frame in 64-bit ABI. */
emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
@@ -7446,6 +7482,8 @@
"flag_pic"
"
{
+ if (TARGET_64BIT)
+ emit_insn (gen_blockage ());
/* Restore the PIC register. Hopefully, this will always be from
a stack slot. The only registers that are valid after a
builtin_longjmp are the stack and frame pointers. */
diff --git a/gcc/config/pa/pa32-linux.h b/gcc/config/pa/pa32-linux.h
index 81f64529a3a..c8ea72de828 100644
--- a/gcc/config/pa/pa32-linux.h
+++ b/gcc/config/pa/pa32-linux.h
@@ -22,5 +22,10 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_ELF32
#define TARGET_ELF32 1
-#undef CPP_SPEC
-#define CPP_SPEC "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{mhppa:-D__hppa__} %{posix:-D_POSIX_SOURCE} -D_PA_RISC1_1"
+/* Sibcalls are ok when ld is used in single subspace mode. The
+ multiple subspace mode is not compatible with sibcalls to external
+ functions because the linker generated stubs store the return
+ pointer into the frame. This target does not need multiple
+ subspace stubs, so we allow sibcalls to all functions. */
+#undef FUNCTION_OK_FOR_SIBCALL
+#define FUNCTION_OK_FOR_SIBCALL(DECL) 1
diff --git a/gcc/config/pa/pa32-regs.h b/gcc/config/pa/pa32-regs.h
index 19553c95f38..f5c6aaa615c 100644
--- a/gcc/config/pa/pa32-regs.h
+++ b/gcc/config/pa/pa32-regs.h
@@ -249,16 +249,7 @@ enum reg_class { NO_REGS, R1_REGS, GENERAL_REGS, FPUPPER_REGS, FP_REGS,
{0x00000000, 0x00000000, 0x01000000}, /* SHIFT_REGS */ \
{0xfffffffe, 0xffffffff, 0x01ffffff}} /* ALL_REGS */
-/* This may not actually be necessary anymore. But until I can prove
- otherwise it will stay. */
-#define CLASS_CANNOT_CHANGE_MODE NO_REGS
-
-/* Defines illegal mode changes for CLASS_CANNOT_CHANGE_MODE. */
-#define CLASS_CANNOT_CHANGE_MODE_P(FROM,TO) \
- (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO))
-
-/* The same information, inverted:
- Return the class number of the smallest class containing
+/* Return the class number of the smallest class containing
reg number REGNO. This could be a conditional expression
or could index an array. */
diff --git a/gcc/config/pa/pa64-hpux.h b/gcc/config/pa/pa64-hpux.h
index c82e185434a..3db8626690f 100644
--- a/gcc/config/pa/pa64-hpux.h
+++ b/gcc/config/pa/pa64-hpux.h
@@ -19,11 +19,27 @@ 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 SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "sio", MASK_SIO, \
+ N_("Generate cpp defines for server IO") }, \
+ { "wsio", -MASK_SIO, \
+ N_("Generate cpp defines for workstation IO") }, \
+ {"gnu-ld", MASK_GNU_LD, \
+ N_("Assume code will be linked by GNU ld") }, \
+ {"hp-ld", -MASK_GNU_LD, \
+ N_("Assume code will be linked by HP ld") },
+
/* We can debug dynamically linked executables on hpux11; we also
want dereferencing of a NULL pointer to cause a SEGV. */
#undef LINK_SPEC
+#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD)
+#define LINK_SPEC \
+ "-E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:%{mhp-ld:-b}%{!mhp-ld:-shared}} %{mhp-ld:+Accept TypeMismatch}"
+#else
#define LINK_SPEC \
- "-E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:-shared}"
+ "-E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:%{mgnu-ld:-shared}%{!mgnu-ld:-b}} %{!mgnu-ld:+Accept TypeMismatch}"
+#endif
/* Like the default, except no -lg. */
#undef LIB_SPEC
@@ -83,7 +99,7 @@ do { \
/* It looks like DWARF2 will be the easiest debug format to handle on this
platform. */
#define OBJECT_FORMAT_ELF
-#define DWARF2_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
/* This isn't quite ready yet. I'm seeing it mess up some line
tables. For example, we're getting lines starting/ending at
@@ -143,3 +159,8 @@ do { \
#ifndef ASM_DECLARE_RESULT
#define ASM_DECLARE_RESULT(FILE, RESULT)
#endif
+
+/* If using HP ld do not call pxdb. Use size as a program that does nothing
+ and returns 0. /bin/true cannot be used because it is a script without
+ an interpreter. */
+#define INIT_ENVIRONMENT "LD_PXDB=/usr/ccs/bin/size"
diff --git a/gcc/config/pa/pa64-linux.h b/gcc/config/pa/pa64-linux.h
index e4abfe6a704..82a2b05005b 100644
--- a/gcc/config/pa/pa64-linux.h
+++ b/gcc/config/pa/pa64-linux.h
@@ -1,5 +1,5 @@
/* Definitions for PA_RISC with ELF format on 64-bit Linux
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -18,9 +18,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. */
-#undef CPP_SPEC
-#define CPP_SPEC "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{mhppa:-D__hppa__} %{posix:-D_POSIX_SOURCE} -D_PA_RISC2_0 -D__LP64__"
-
#if 0 /* needs some work :-( */
/* If defined, this macro specifies a table of register pairs used to
eliminate unneeded registers that point into the stack frame. */
@@ -32,7 +29,7 @@ Boston, MA 02111-1307, USA. */
{ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
}
-/* A C expression that returns non-zero if the compiler is allowed to try to
+/* A C expression that returns nonzero if the compiler is allowed to try to
replace register number FROM with register number TO. The frame pointer
is automatically handled. */
diff --git a/gcc/config/pa/pa64-regs.h b/gcc/config/pa/pa64-regs.h
index b193c99b075..0af4c5fb270 100644
--- a/gcc/config/pa/pa64-regs.h
+++ b/gcc/config/pa/pa64-regs.h
@@ -234,16 +234,21 @@ enum reg_class { NO_REGS, R1_REGS, GENERAL_REGS, FPUPPER_REGS, FP_REGS,
/* If defined, gives a class of registers that cannot be used as the
operand of a SUBREG that changes the mode of the object illegally. */
-/* ??? This may not actually be necessary anymore. But until I can prove
- otherwise it will stay. */
+
#define CLASS_CANNOT_CHANGE_MODE (FP_REGS)
-/* Defines illegal mode changes for CLASS_CANNOT_CHANGE_MODE. */
-#define CLASS_CANNOT_CHANGE_MODE_P(FROM,TO) \
- (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO))
+/* Defines illegal mode changes for CLASS_CANNOT_CHANGE_MODE.
+
+ SImode loads to floating-point registers are not zero-extended.
+ The definition for LOAD_EXTEND_OP specifies that integer loads
+ narrower than BITS_PER_WORD will be zero-extended. As a result,
+ we inhibit changes from SImode unless they are to a mode that is
+ identical in size. */
+
+#define CLASS_CANNOT_CHANGE_MODE_P(FROM,TO) \
+ ((FROM) == SImode && GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO))
-/* The same information, inverted:
- Return the class number of the smallest class containing
+/* Return the class number of the smallest class containing
reg number REGNO. This could be a conditional expression
or could index an array. */
diff --git a/gcc/config/pa/rtems.h b/gcc/config/pa/rtems.h
index fe83e85f044..b03b5c802c3 100644
--- a/gcc/config/pa/rtems.h
+++ b/gcc/config/pa/rtems.h
@@ -21,6 +21,17 @@ Boston, MA 02111-1307, USA. */
/* Specify predefined symbols in preprocessor. */
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dhppa -DPWB -Acpu=hppa -Amachine=hppa \
- -D__rtems__ -Asystem=rtems"
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ if (c_language != clk_cplusplus \
+ && !flag_iso) \
+ { \
+ builtin_define ("hppa"); \
+ builtin_define_std ("PWB"); \
+ } \
+ builtin_define ("__rtems__"); \
+ builtin_assert ("system=rtems"); \
+ } \
+ while (0)
diff --git a/gcc/config/pa/som.h b/gcc/config/pa/som.h
index 644c85900b7..e72b7fed64a 100644
--- a/gcc/config/pa/som.h
+++ b/gcc/config/pa/som.h
@@ -365,3 +365,9 @@ do { \
/* SOM does not support the init_priority C++ attribute. */
#undef SUPPORTS_INIT_PRIORITY
#define SUPPORTS_INIT_PRIORITY 0
+
+/* The SOM linker hardcodes paths into binaries. As a result, dotdots
+ must be removed from library prefixes to prevent binaries from depending
+ on the location of the GCC tool directory. The downside is GCC
+ cannot be moved after installation using a symlink. */
+#define ALWAYS_STRIP_DOTDOT 1
diff --git a/gcc/config/pdp11/pdp11.c b/gcc/config/pdp11/pdp11.c
index 3643db6d281..a7066bdffb7 100644
--- a/gcc/config/pdp11/pdp11.c
+++ b/gcc/config/pdp11/pdp11.c
@@ -137,7 +137,7 @@ pdp11_output_function_prologue (stream, size)
{
fprintf (stream, "\t/*abuse empty parameter slot for locals!*/\n");
if (size > 2)
- fprintf(stream, "\tsub $%d, sp\n", size - 2);
+ fprintf(stream, "\tsub $%#o, sp\n", size - 2);
}
}
@@ -168,8 +168,8 @@ pdp11_output_function_prologue (stream, size)
if (frame_pointer_needed)
{
- fprintf(stream, "\tmov fp, -(sp)\n");
- fprintf(stream, "\tmov sp, fp\n");
+ fprintf(stream, "\tmov r5, -(sp)\n");
+ fprintf(stream, "\tmov sp, r5\n");
}
else
{
@@ -178,7 +178,7 @@ pdp11_output_function_prologue (stream, size)
/* make frame */
if (fsize)
- fprintf (stream, "\tsub $%o, sp\n", fsize);
+ fprintf (stream, "\tsub $%#o, sp\n", fsize);
/* save CPU registers */
for (regno = 0; regno < 8; regno++)
@@ -198,7 +198,7 @@ pdp11_output_function_prologue (stream, size)
&& regs_ever_live[regno]
&& ! call_used_regs[regno])
{
- fprintf (stream, "\tfstd %s, -(sp)\n", reg_names[regno]);
+ fprintf (stream, "\tstd %s, -(sp)\n", reg_names[regno]);
via_ac = regno;
}
@@ -211,8 +211,8 @@ pdp11_output_function_prologue (stream, size)
if (via_ac == -1)
abort();
- fprintf (stream, "\tfldd %s, %s\n", reg_names[regno], reg_names[via_ac]);
- fprintf (stream, "\tfstd %s, -(sp)\n", reg_names[via_ac]);
+ fprintf (stream, "\tldd %s, %s\n", reg_names[regno], reg_names[via_ac]);
+ fprintf (stream, "\tstd %s, -(sp)\n", reg_names[via_ac]);
}
}
@@ -277,9 +277,10 @@ pdp11_output_function_epilogue (stream, size)
/* remember # of pushed bytes for CPU regs */
k = 2*j;
+ /* change fp -> r5 due to the compile error on libgcc2.c */
for (i =7 ; i >= 0 ; i--)
if (regs_ever_live[i] && ! call_used_regs[i])
- fprintf(stream, "\tmov %o(fp), %s\n",-fsize-2*j--, reg_names[i]);
+ fprintf(stream, "\tmov %#o(r5), %s\n",(-fsize-2*j--)&0xffff, reg_names[i]);
/* get ACs */
via_ac = FIRST_PSEUDO_REGISTER -1;
@@ -297,7 +298,7 @@ pdp11_output_function_epilogue (stream, size)
&& regs_ever_live[i]
&& ! call_used_regs[i])
{
- fprintf(stream, "\tfldd %o(fp), %s\n", -fsize-k, reg_names[i]);
+ fprintf(stream, "\tldd %#o(r5), %s\n", (-fsize-k)&0xffff, reg_names[i]);
k -= 8;
}
@@ -308,14 +309,14 @@ pdp11_output_function_epilogue (stream, size)
if (! LOAD_FPU_REG_P(via_ac))
abort();
- fprintf(stream, "\tfldd %o(fp), %s\n", -fsize-k, reg_names[via_ac]);
- fprintf(stream, "\tfstd %s, %s\n", reg_names[via_ac], reg_names[i]);
+ fprintf(stream, "\tldd %#o(r5), %s\n", (-fsize-k)&0xffff, reg_names[via_ac]);
+ fprintf(stream, "\tstd %s, %s\n", reg_names[via_ac], reg_names[i]);
k -= 8;
}
}
- fprintf(stream, "\tmov fp, sp\n");
- fprintf (stream, "\tmov (sp)+, fp\n");
+ fprintf(stream, "\tmov r5, sp\n");
+ fprintf (stream, "\tmov (sp)+, r5\n");
}
else
{
@@ -331,7 +332,7 @@ pdp11_output_function_epilogue (stream, size)
if (LOAD_FPU_REG_P(i)
&& regs_ever_live[i]
&& ! call_used_regs[i])
- fprintf(stream, "\tfldd (sp)+, %s\n", reg_names[i]);
+ fprintf(stream, "\tldd (sp)+, %s\n", reg_names[i]);
if (NO_LOAD_FPU_REG_P(i)
&& regs_ever_live[i]
@@ -340,8 +341,8 @@ pdp11_output_function_epilogue (stream, size)
if (! LOAD_FPU_REG_P(via_ac))
abort();
- fprintf(stream, "\tfldd (sp)+, %s\n", reg_names[via_ac]);
- fprintf(stream, "\tfstd %s, %s\n", reg_names[via_ac], reg_names[i]);
+ fprintf(stream, "\tldd (sp)+, %s\n", reg_names[via_ac]);
+ fprintf(stream, "\tstd %s, %s\n", reg_names[via_ac], reg_names[i]);
}
}
@@ -350,7 +351,7 @@ pdp11_output_function_epilogue (stream, size)
fprintf(stream, "\tmov (sp)+, %s\n", reg_names[i]);
if (fsize)
- fprintf((stream), "\tadd $%o, sp\n", fsize);
+ fprintf((stream), "\tadd $%#o, sp\n", (fsize)&0xffff);
}
fprintf (stream, "\trts pc\n");
@@ -562,7 +563,7 @@ output_move_quad (operands)
rtx latehalf[2];
rtx addreg0 = 0, addreg1 = 0;
- output_asm_insn(";; movdi/df: %1 -> %0", operands);
+ output_asm_insn(";/* movdi/df: %1 -> %0 */", operands);
if (REG_P (operands[0]))
optype0 = REGOP;
@@ -817,7 +818,7 @@ output_ascii (file, p, size)
register int c = p[i];
if (c < 0)
c += 256;
- fprintf (file, "%o", c);
+ fprintf (file, "%#o", c);
if (i < size - 1)
putc (',', file);
}
@@ -851,10 +852,12 @@ print_operand_address (file, addr)
fprintf (file, "(%s)", reg_names[REGNO (addr)]);
break;
+ case PRE_MODIFY:
case PRE_DEC:
fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);
break;
+ case POST_MODIFY:
case POST_INC:
fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);
break;
@@ -1546,7 +1549,7 @@ output_addr_const_pdp11 (file, x)
case CONST_INT:
/* Should we check for constants which are too big? Maybe cutting
them off to 16 bits is OK? */
- fprintf (file, "%ho", (unsigned short) INTVAL (x));
+ fprintf (file, "%#ho", (unsigned short) INTVAL (x));
break;
case CONST:
@@ -1562,7 +1565,7 @@ output_addr_const_pdp11 (file, x)
if (CONST_DOUBLE_HIGH (x))
abort (); /* Should we just silently drop the high part? */
else
- fprintf (file, "%ho", (unsigned short) CONST_DOUBLE_LOW (x));
+ fprintf (file, "%#ho", (unsigned short) CONST_DOUBLE_LOW (x));
}
else
/* We can't handle floating point constants;
diff --git a/gcc/config/pdp11/pdp11.h b/gcc/config/pdp11/pdp11.h
index 12230781d81..f9eb3f0e96a 100644
--- a/gcc/config/pdp11/pdp11.h
+++ b/gcc/config/pdp11/pdp11.h
@@ -20,6 +20,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. */
+#define CONSTANT_POOL_BEFORE_FUNCTION 0
/* check whether load_fpu_reg or not */
#define LOAD_FPU_REG_P(x) ((x)>=8 && (x)<=11)
@@ -508,7 +509,7 @@ loading is easier into LOAD_FPU_REGS than FPU_REGS! */
extern int current_first_parm_offset;
/* Offset of first parameter from the argument pointer register value.
- For the pdp11, this is non-zero to account for the return address.
+ For the pdp11, this is nonzero to account for the return address.
1 - return address
2 - frame pointer (always saved, even when not used!!!!)
-- chnage some day !!!:q!
@@ -667,10 +668,8 @@ extern int may_call_alloca;
/* Addressing modes, and classification of registers for them. */
#define HAVE_POST_INCREMENT 1
-/* #define HAVE_POST_DECREMENT 0 */
#define HAVE_PRE_DECREMENT 1
-/* #define HAVE_PRE_INCREMENT 0 */
/* Macros to check register numbers against specific register classes. */
@@ -702,7 +701,7 @@ extern int may_call_alloca;
/* Nonzero if the constant value X is a legitimate general operand.
It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
-#define LEGITIMATE_CONSTANT_P(X) (1)
+#define LEGITIMATE_CONSTANT_P(X) (TARGET_FPU? 1: !(GET_CODE(X) == CONST_DOUBLE))
/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
and check its validity for a certain class.
@@ -773,6 +772,29 @@ extern int may_call_alloca;
&& GET_CODE (XEXP (operand, 0)) == REG \
&& REG_OK_FOR_BASE_P (XEXP (operand, 0))) \
goto ADDR; \
+ \
+ /* accept -(SP) -- which uses PRE_MODIFY for byte mode */ \
+ if (GET_CODE (operand) == PRE_MODIFY \
+ && GET_CODE (XEXP (operand, 0)) == REG \
+ && REGNO (XEXP (operand, 0)) == 6 \
+ && GET_CODE ((xfoob = XEXP (operand, 1))) == PLUS \
+ && GET_CODE (XEXP (xfoob, 0)) == REG \
+ && REGNO (XEXP (xfoob, 0)) == 6 \
+ && CONSTANT_P (XEXP (xfoob, 1)) \
+ && INTVAL (XEXP (xfoob,1)) == -2) \
+ goto ADDR; \
+ \
+ /* accept (SP)+ -- which uses POST_MODIFY for byte mode */ \
+ if (GET_CODE (operand) == POST_MODIFY \
+ && GET_CODE (XEXP (operand, 0)) == REG \
+ && REGNO (XEXP (operand, 0)) == 6 \
+ && GET_CODE ((xfoob = XEXP (operand, 1))) == PLUS \
+ && GET_CODE (XEXP (xfoob, 0)) == REG \
+ && REGNO (XEXP (xfoob, 0)) == 6 \
+ && CONSTANT_P (XEXP (xfoob, 1)) \
+ && INTVAL (XEXP (xfoob,1)) == 2) \
+ goto ADDR; \
+ \
\
/* handle another level of indirection ! */ \
if (GET_CODE(operand) != MEM) \
@@ -1036,12 +1058,6 @@ fprintf (FILE, "$help$: . = .+8 ; space for tmp moves!\n") \
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s_%d:\n", 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.
@@ -1083,7 +1099,7 @@ fprintf (FILE, "$help$: . = .+8 ; space for tmp moves!\n") \
}
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
- fprintf (FILE, "\t.=.+ %o\n", (SIZE))
+ fprintf (FILE, "\t.=.+ %#ho\n", (unsigned short)(SIZE))
/* This says how to output an assembler line
to define a global common symbol. */
@@ -1093,7 +1109,7 @@ fprintf (FILE, "$help$: . = .+8 ; space for tmp moves!\n") \
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), "\n"), \
assemble_name ((FILE), (NAME)), \
- fprintf ((FILE), ": .=.+ %o\n", (ROUNDED)) \
+ fprintf ((FILE), ": .=.+ %#ho\n", (unsigned short)(ROUNDED)) \
)
/* This says how to output an assembler line
@@ -1101,15 +1117,7 @@ fprintf (FILE, "$help$: . = .+8 ; space for tmp moves!\n") \
#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
( assemble_name ((FILE), (NAME)), \
- fprintf ((FILE), ":\t.=.+ %o\n", (ROUNDED)))
-
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
+ fprintf ((FILE), ":\t.=.+ %#ho\n", (unsigned short)(ROUNDED)))
/* Print operand X (an rtx) in assembler syntax to file FILE.
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
@@ -1125,11 +1133,9 @@ fprintf (FILE, "$help$: . = .+8 ; space for tmp moves!\n") \
else if (GET_CODE (X) == MEM) \
output_address (XEXP (X, 0)); \
else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != SImode) \
- { REAL_VALUE_TYPE r; \
- char buf[30]; \
- REAL_VALUE_FROM_CONST_DOUBLE (r, X); \
- REAL_VALUE_TO_DECIMAL (r, "%.20e", buf); \
- fprintf (FILE, "#%s", buf); } \
+ { char buf[30]; \
+ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (X), sizeof (buf), 0, 1); \
+ fprintf (FILE, "$0F%s", buf); } \
else { putc ('$', FILE); output_addr_const_pdp11 (FILE, X); }}
/* Print a memory address as an operand to reference that memory location. */
diff --git a/gcc/config/pdp11/pdp11.md b/gcc/config/pdp11/pdp11.md
index 13f8d02f9c1..fae4907bf83 100644
--- a/gcc/config/pdp11/pdp11.md
+++ b/gcc/config/pdp11/pdp11.md
@@ -621,12 +621,12 @@
;; Move instructions
(define_insn "movdi"
- [(set (match_operand:DI 0 "general_operand" "=g")
- (match_operand:DI 1 "general_operand" "g"))]
+ [(set (match_operand:DI 0 "general_operand" "=g,rm,o")
+ (match_operand:DI 1 "general_operand" "m,r,a"))]
""
"* return output_move_quad (operands);"
;; what's the mose expensive code - say twice movsi = 16
- [(set_attr "length" "16")])
+ [(set_attr "length" "16,16,16")])
(define_insn "movsi"
[(set (match_operand:SI 0 "general_operand" "=r,r,r,rm,m")
@@ -651,8 +651,8 @@
[(set_attr "length" "1,2,2,3")])
(define_insn "movqi"
- [(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
- (match_operand:QI 1 "general_operand" "rRN,Qi,rRN,Qi"))]
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (match_operand:QI 1 "general_operand" "g"))]
""
"*
{
@@ -661,17 +661,22 @@
return \"movb %1, %0\";
}"
- [(set_attr "length" "1,2,2,3")])
+ [(set_attr "length" "1")])
;; do we have to supply all these moves? e.g. to
;; NO_LOAD_FPU_REGs ?
(define_insn "movdf"
- [(set (match_operand:DF 0 "general_operand" "=f,R,f,Q,f,m")
- (match_operand:DF 1 "general_operand" "fR,f,Q,f,F,m"))]
+ [(set (match_operand:DF 0 "general_operand" "=a,fR,a,Q,m")
+ (match_operand:DF 1 "general_operand" "fFR,a,Q,a,m"))]
""
- "* return output_move_quad (operands);"
+ "* if (which_alternative ==0)
+ return \"ldd %1, %0\";
+ else if (which_alternative == 1)
+ return \"std %1, %0\";
+ else
+ return output_move_quad (operands); "
;; just a guess..
- [(set_attr "length" "1,1,2,2,5,16")])
+ [(set_attr "length" "1,1,5,5,16")])
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=g,r,g")
@@ -760,7 +765,7 @@
[(set (match_operand:HI 0 "general_operand" "=r")
(zero_extend:HI (match_operand:QI 1 "general_operand" "0")))]
""
- "bic $(256*255), %0"
+ "bic $0177400, %0"
[(set_attr "length" "2")])
(define_expand "zero_extendhisi2"
@@ -919,7 +924,7 @@
rtx latehalf[2];
latehalf[0] = NULL;
- latehalf[1] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
+ latehalf[1] = gen_rtx_REG (HImode, REGNO (operands[1]) + 1);
output_asm_insn(\"mov %1, -(sp)\", latehalf);
output_asm_insn(\"mov %1, -(sp)\", operands);
@@ -1067,7 +1072,7 @@
return \"decb %0\";
}
- return \"addb %2, %0\";
+ return \"add %2, %0\";
}"
[(set_attr "length" "1,2,2,3")])
@@ -1143,53 +1148,14 @@
if (GET_CODE (operands[2]) == CONST_INT)
abort();
- return \"subb %2, %0\";
+ return \"sub %2, %0\";
}"
[(set_attr "length" "1,2,2,3")])
;;;;- and instructions
;; Bit-and on the pdp (like on the VAX) is done with a clear-bits insn.
-(define_expand "andsi3"
- [(set (match_operand:SI 0 "general_operand" "=g")
- (and:SI (match_operand:SI 1 "general_operand" "0")
- (not:SI (match_operand:SI 2 "general_operand" "g"))))]
- ""
- "
-{
- if (GET_CODE (operands[2]) == CONST_INT)
- operands[2] = GEN_INT (~INTVAL (operands[2]));
- else
- operands[2] = expand_unop (SImode, one_cmpl_optab, operands[2], 0, 1);
-}")
-(define_expand "andhi3"
- [(set (match_operand:HI 0 "general_operand" "=g")
- (and:HI (match_operand:HI 1 "general_operand" "0")
- (not:HI (match_operand:HI 2 "general_operand" "g"))))]
- ""
- "
-{
- if (GET_CODE (operands[2]) == CONST_INT)
- operands[2] = GEN_INT (~INTVAL (operands[2]));
- else
- operands[2] = expand_unop (HImode, one_cmpl_optab, operands[2], 0, 1);
-}")
-
-(define_expand "andqi3"
- [(set (match_operand:QI 0 "general_operand" "=g")
- (and:QI (match_operand:QI 1 "general_operand" "0")
- (not:QI (match_operand:QI 2 "general_operand" "g"))))]
- ""
- "
-{
- rtx op = operands[2];
- if (GET_CODE (op) == CONST_INT)
- operands[2] = GEN_INT (((1 << 8) - 1) & ~INTVAL (op));
- else
- operands[2] = expand_unop (QImode, one_cmpl_optab, op, 0, 1);
-}")
-
-(define_insn "andcbsi3"
+(define_insn "andsi3"
[(set (match_operand:SI 0 "general_operand" "=r,r,o,o,r,r,r,o,o,o")
(and:SI (match_operand:SI 1 "general_operand" "%0,0,0,0,0,0,0,0,0,0")
(not:SI (match_operand:SI 2 "general_operand" "r,o,r,o,I,J,K,I,J,K"))))]
@@ -1237,7 +1203,7 @@
}"
[(set_attr "length" "2,4,4,6,2,2,4,3,3,6")])
-(define_insn "andcbhi3"
+(define_insn "andhi3"
[(set (match_operand:HI 0 "general_operand" "=rR,rR,Q,Q")
(and:HI (match_operand:HI 1 "general_operand" "0,0,0,0")
(not:HI (match_operand:HI 2 "general_operand" "rR,Qi,rR,Qi"))))]
@@ -1245,7 +1211,7 @@
"bic %2, %0"
[(set_attr "length" "1,2,2,3")])
-(define_insn "andcbqi3"
+(define_insn "andqi3"
[(set (match_operand:QI 0 "general_operand" "=rR,rR,Q,Q")
(and:QI (match_operand:QI 1 "general_operand" "0,0,0,0")
(not:QI (match_operand:QI 2 "general_operand" "rR,Qi,rR,Qi"))))]
@@ -1319,9 +1285,9 @@
;;- xor instructions
(define_insn "xorsi3"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
- (xor:SI (match_operand:SI 1 "register_operand" "%0,0,0,0")
- (match_operand:SI 2 "arith_operand" "r,I,J,K")))]
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (xor:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "arith_operand" "r")))]
"TARGET_40_PLUS"
"*
{ /* Here we trust that operands don't overlap */
@@ -1342,18 +1308,8 @@
return \"\";
}
- lateoperands[2] = GEN_INT ((INTVAL (operands[2]) >> 16) & 0xffff);
- operands[2] = GEN_INT (INTVAL(operands[2]) & 0xffff);
-
- if (INTVAL (operands[2]))
- output_asm_insn (\"xor %2, %0\", operands);
-
- if (INTVAL (lateoperands[2]))
- output_asm_insn (\"xor %2, %0\", lateoperands);
-
- return \"\";
}"
- [(set_attr "length" "2,1,1,2")])
+ [(set_attr "length" "2")])
(define_insn "xorhi3"
[(set (match_operand:HI 0 "general_operand" "=rR,Q")
@@ -1373,10 +1329,12 @@
[(set_attr "length" "1,2")])
(define_insn "one_cmplqi2"
- [(set (match_operand:QI 0 "general_operand" "=rR,Q")
- (not:QI (match_operand:QI 1 "general_operand" "0,0")))]
+ [(set (match_operand:QI 0 "general_operand" "=rR,rR")
+ (not:QI (match_operand:QI 1 "general_operand" "0,g")))]
""
- "comb %0"
+ "@
+ comb %0
+ movb %1, %0\; comb %0"
[(set_attr "length" "1,2")])
;;- arithmetic shift instructions
@@ -1423,6 +1381,38 @@
"asr %0"
[(set_attr "length" "1,2")])
+;; lsr
+(define_insn ""
+ [(set (match_operand:HI 0 "general_operand" "=rR,Q")
+ (lshiftrt:HI (match_operand:HI 1 "general_operand" "0,0")
+ (const_int 1)))]
+ ""
+ "clc\;ror %0"
+ [(set_attr "length" "1,2")])
+
+(define_insn "lshrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (lshiftrt:SI (match_operand:SI 1 "general_operand" "0")
+ (const_int 1)))]
+ ""
+{
+
+ rtx lateoperands[2];
+
+ lateoperands[0] = operands[0];
+ operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
+
+ lateoperands[1] = operands[1];
+ operands[1] = gen_rtx_REG (HImode, REGNO (operands[1]) + 1);
+
+ output_asm_insn (\"clc\", operands);
+ output_asm_insn (\"ror %0\", lateoperands);
+ output_asm_insn (\"ror %0\", operands);
+
+ return \"\";
+}
+ [(set_attr "length" "5")])
+
;; shift is by arbitrary count is expensive,
;; shift by one cheap - so let's do that, if
;; space doesn't matter
@@ -1620,6 +1610,29 @@
"{negd|negf} %0"
[(set_attr "length" "1,2")])
+(define_insn "negsi2"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (neg:SI (match_operand:SI 1 "general_operand" "0")))]
+ ""
+{
+
+ rtx lateoperands[2];
+
+ lateoperands[0] = operands[0];
+ operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
+
+ lateoperands[1] = operands[1];
+ operands[1] = gen_rtx_REG (HImode, REGNO (operands[1]) + 1);
+
+ output_asm_insn (\"com %0\", operands);
+ output_asm_insn (\"com %0\", lateoperands);
+ output_asm_insn (\"inc %0\", operands);
+ output_asm_insn (\"adc %0\", lateoperands);
+
+ return \"\";
+}
+ [(set_attr "length" "5")])
+
(define_insn "neghi2"
[(set (match_operand:HI 0 "general_operand" "=rR,Q")
(neg:HI (match_operand:HI 1 "general_operand" "0,0")))]
@@ -1670,7 +1683,7 @@
;;- jump to subroutine
(define_insn "call"
- [(call (match_operand:HI 0 "general_operand" "R,Q")
+ [(call (match_operand:HI 0 "general_operand" "rR,Q")
(match_operand:HI 1 "general_operand" "g,g"))
;; (use (reg:HI 0)) what was that ???
]
@@ -1682,7 +1695,7 @@
;;- jump to subroutine
(define_insn "call_value"
[(set (match_operand 0 "" "")
- (call (match_operand:HI 1 "general_operand" "R,Q")
+ (call (match_operand:HI 1 "general_operand" "rR,Q")
(match_operand:HI 2 "general_operand" "g,g")))
;; (use (reg:HI 0)) - what was that ????
]
@@ -1788,7 +1801,7 @@
"")
(define_insn ""
- [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r") 4)
+ [(set (subreg:HI (match_operand:SI 0 "general_operand" "=r") 2)
(mod:HI (match_operand:SI 1 "general_operand" "0")
(match_operand:HI 2 "general_operand" "g")))]
"TARGET_45"
diff --git a/gcc/config/pdp11/t-pdp11 b/gcc/config/pdp11/t-pdp11
index 38bf1473a44..0231a7b38d6 100644
--- a/gcc/config/pdp11/t-pdp11
+++ b/gcc/config/pdp11/t-pdp11
@@ -1 +1,15 @@
TARGET_LIBGCC2_CFLAGS = -O2 -mfloat32
+LIB2FUNCS_EXTRA = $(srcdir)/config/udivmod.c $(srcdir)/config/udivmodsi4.c
+# floating point emulation libraries
+
+FPBIT = fp-bit.c
+DPBIT = dp-bit.c
+
+fp-bit.c: $(srcdir)/config/fp-bit.c
+ echo '#define FLOAT' > fp-bit.c
+ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
+
+dp-bit.c: $(srcdir)/config/fp-bit.c
+ cat $(srcdir)/config/fp-bit.c > dp-bit.c
+
+MULTILIB_OPTIONS = msoft-float
diff --git a/gcc/config/psos.h b/gcc/config/psos.h
index 9529a216826..72825d458df 100644
--- a/gcc/config/psos.h
+++ b/gcc/config/psos.h
@@ -51,13 +51,13 @@ Boston, MA 02111-1307, USA.
board-support package (e.g. M162) and the run-time configuration
(e.g. application vs. ram-image vs. rom-image). Specify the
startfile in a linker-script created from the generic
- architecture-specific linker-scripts. */
+ architecture-specific linker-scripts. */
#undef STARTFILE_SPEC
#define STARTFILE_SPEC ""
-/* Predefined macros (independent of processor type). */
+/* Predefined macros (independent of processor type). */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-Dpsos"
@@ -85,4 +85,4 @@ Boston, MA 02111-1307, USA.
/* For pSOS we use DBX debugging info. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
diff --git a/gcc/config/ptx4.h b/gcc/config/ptx4.h
index d4a61de8107..4560b86eab3 100644
--- a/gcc/config/ptx4.h
+++ b/gcc/config/ptx4.h
@@ -93,16 +93,7 @@ Boston, MA 02111-1307, USA.
"-no_0f_fix -no_eflags_chk %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}"
#endif
-/* svr4 assemblers need the `-' (indicating input from stdin) to come after
- the -o option (and its argument) for some reason. If we try to put it
- before the -o option, the assembler will try to read the file named as
- the output file in the -o option as an input file (after it has already
- written some stuff to it) and the binary stuff contained therein will
- cause totally confuse the assembler, resulting in many spurious error
- messages. */
-
-#undef ASM_FINAL_SPEC
-#define ASM_FINAL_SPEC "%{pipe:-}"
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
/* Provide a LIB_SPEC appropriate for svr4. Here we tack on the default
standard C library (unless we are building a shared library). */
@@ -180,7 +171,7 @@ Boston, MA 02111-1307, USA.
%{!ansi:values-Xa.o%s} \
crtbegin.o%s"
-/* Don't use bcopy, which doesn't handle overlaps before DYNIX/ptx 4.6. */
+/* Don't use bcopy, which doesn't handle overlaps before DYNIX/ptx 4.6. */
#undef HAVE_BCOPY
@@ -239,7 +230,7 @@ while (0)
/* This says how to output assembler code to declare an uninitialized
external linkage data item. There's a bug in the DYNIX/ptx linker
(PR 254649) when the alignment for such an object is specified, so
- ignore the ALIGN parameter. */
+ ignore the ALIGN parameter. */
#undef ASM_OUTPUT_ALIGNED_COMMON
#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
diff --git a/gcc/config/romp/romp.c b/gcc/config/romp/romp.c
index c01ab051f99..44d422a3716 100644
--- a/gcc/config/romp/romp.c
+++ b/gcc/config/romp/romp.c
@@ -229,7 +229,7 @@ update_cc (body, insn)
break;
case CC_TBIT:
- /* Insn sets T bit if result is non-zero. Next insn must be branch. */
+ /* Insn sets T bit if result is nonzero. Next insn must be branch. */
CC_STATUS_INIT;
cc_status.flags = CC_IN_TB | CC_NOT_NEGATIVE;
break;
@@ -389,7 +389,7 @@ current_function_operand (op, mode)
&& ! strcmp (current_function_name, XSTR (op, 0)));
}
-/* Return non-zero if this function is known to have a null epilogue. */
+/* Return nonzero if this function is known to have a null epilogue. */
int
null_epilogue ()
@@ -786,7 +786,7 @@ print_operand (file, x, code)
break;
case 'Z':
- /* Upper or lower half, depending on which is non-zero or not
+ /* Upper or lower half, depending on which is nonzero or not
all ones. Must be consistent with 'z' above. */
if (GET_CODE (x) != CONST_INT)
output_operand_lossage ("invalid %%Z value");
@@ -1032,7 +1032,7 @@ romp_sa_size ()
return size * 4;
}
-/* Return non-zero if this function makes calls or has fp operations
+/* Return nonzero if this function makes calls or has fp operations
(which are really calls). */
int
@@ -1059,7 +1059,7 @@ romp_makes_calls ()
return 0;
}
-/* Return non-zero if this function will use r14 as a pointer to its
+/* Return nonzero if this function will use r14 as a pointer to its
constant pool. */
int
@@ -1071,7 +1071,7 @@ romp_using_r14 ()
|| get_pool_size () != 0 || romp_makes_calls ());
}
-/* Return non-zero if this function needs to push space on the stack. */
+/* Return nonzero if this function needs to push space on the stack. */
int
romp_pushes_stack ()
diff --git a/gcc/config/romp/romp.h b/gcc/config/romp/romp.h
index ce506b0e99b..e659f8c8b04 100644
--- a/gcc/config/romp/romp.h
+++ b/gcc/config/romp/romp.h
@@ -111,7 +111,7 @@ extern int target_flags;
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field 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. */
@@ -834,12 +834,6 @@ struct rt_cargs {int gregs, fregs; };
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Macros to check register numbers against specific register classes. */
/* These assume that REGNO is a hard or pseudo reg number.
@@ -1085,7 +1079,7 @@ struct rt_cargs {int gregs, fregs; };
#define MOVE_MAX 4
/* Nonzero if access to memory by bytes is no faster than for words.
- Also non-zero if doing byte operations (specifically shifts) in registers
+ Also nonzero if doing byte operations (specifically shifts) in registers
is undesirable. */
#define SLOW_BYTE_ACCESS 1
@@ -1100,7 +1094,7 @@ struct rt_cargs {int gregs, fregs; };
#define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Define the letter code used in a stabs entry for parameters passed
with the register attribute.
@@ -1322,18 +1316,12 @@ struct rt_cargs {int gregs, fregs; };
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", PREFIX, NUM)
-
/* This is how to output a label for a jump table. Arguments are the same as
- for ASM_OUTPUT_INTERNAL_LABEL, except the insn for the jump table is
+ for (*targetm.asm_out.internal_label), except the insn for the jump table is
passed. */
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
-{ ASM_OUTPUT_ALIGN (FILE, 2); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
+{ ASM_OUTPUT_ALIGN (FILE, 2); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); }
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
@@ -1392,14 +1380,6 @@ struct rt_cargs {int gregs, fregs; };
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%d\n", (SIZE)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* Print operand X (an rtx) in assembler syntax to file FILE.
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
For `%' followed by punctuation, CODE is the punctuation and X is null. */
diff --git a/gcc/config/rs6000/aix52.h b/gcc/config/rs6000/aix52.h
new file mode 100644
index 00000000000..b61cc3057e2
--- /dev/null
+++ b/gcc/config/rs6000/aix52.h
@@ -0,0 +1,191 @@
+/* Definitions of target machine for GNU compiler,
+ for IBM RS/6000 POWER running AIX V5.2.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Contributed by David Edelsohn (edelsohn@gnu.org).
+
+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. */
+
+
+/* AIX V5 and above support 64-bit executables. */
+#undef SUBSUBTARGET_SWITCHES
+#define SUBSUBTARGET_SWITCHES \
+ {"aix64", MASK_64BIT | MASK_POWERPC64 | MASK_POWERPC, \
+ N_("Compile for 64-bit pointers") }, \
+ {"aix32", - (MASK_64BIT | MASK_POWERPC64), \
+ N_("Compile for 32-bit pointers") }, \
+ {"pe", 0, \
+ N_("Support message passing with the Parallel Environment") },
+
+/* Sometimes certain combinations of command options do not make sense
+ on a particular target machine. You can define a macro
+ `OVERRIDE_OPTIONS' to take account of this. This macro, if
+ defined, is executed once just after all the command options have
+ been parsed.
+
+ The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
+ get control. */
+
+#define NON_POWERPC_MASKS (MASK_POWER | MASK_POWER2)
+#define SUBTARGET_OVERRIDE_OPTIONS \
+do { \
+ if (TARGET_64BIT && (target_flags & NON_POWERPC_MASKS)) \
+ { \
+ target_flags &= ~NON_POWERPC_MASKS; \
+ warning ("-maix64 and POWER architecture are incompatible"); \
+ } \
+ if (TARGET_64BIT && ! TARGET_POWERPC64) \
+ { \
+ target_flags |= MASK_POWERPC64; \
+ warning ("-maix64 requires PowerPC64 architecture remain enabled"); \
+ } \
+ if (TARGET_POWERPC64 && ! TARGET_64BIT) \
+ { \
+ error ("-maix64 required: 64-bit computation with 32-bit addressing not yet supported"); \
+ } \
+} while (0);
+
+#undef ASM_SPEC
+#define ASM_SPEC "-u %{maix64:-a64 -mppc64} %(asm_cpu)"
+
+/* Common ASM definitions used by ASM_SPEC amonst the various targets
+ for handling -mcpu=xxx switches. */
+#undef ASM_CPU_SPEC
+#define ASM_CPU_SPEC \
+"%{!mcpu*: %{!maix64: \
+ %{mpowerpc64: -mppc64} \
+ %{!mpower64: %(asm_default)}}} \
+%{mcpu=power3: -m604} \
+%{mcpu=power4: -m604} \
+%{mcpu=powerpc: -mppc} \
+%{mcpu=rs64a: -mppc} \
+%{mcpu=603: -m603} \
+%{mcpu=603e: -m603} \
+%{mcpu=604: -m604} \
+%{mcpu=604e: -m604} \
+%{mcpu=620: -mppc} \
+%{mcpu=630: -m604}"
+
+#undef ASM_DEFAULT_SPEC
+#define ASM_DEFAULT_SPEC "-mppc"
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ builtin_define ("_IBMR2"); \
+ builtin_define ("_POWER"); \
+ builtin_define ("_LONG_LONG"); \
+ builtin_define ("_AIX"); \
+ builtin_define ("_AIX32"); \
+ builtin_define ("_AIX41"); \
+ builtin_define ("_AIX43"); \
+ builtin_define ("_AIX51"); \
+ builtin_define ("_AIX52"); \
+ builtin_assert ("system=unix"); \
+ builtin_assert ("system=aix"); \
+ } \
+ while (0)
+
+#undef CPP_SPEC
+#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
+ %{ansi: -D_ANSI_C_SOURCE} \
+ %{maix64: -D__64BIT__} \
+ %{mpe: -I/usr/lpp/ppe.poe/include} \
+ %{pthread: -D_THREAD_SAFE}"
+
+/* The GNU C++ standard library requires that these macros be
+ defined. */
+#undef CPLUSPLUS_CPP_SPEC
+#define CPLUSPLUS_CPP_SPEC \
+ "-D_XOPEN_SOURCE=500 \
+ -D_XOPEN_SOURCE_EXTENDED=1 \
+ -D_LARGE_FILE_API \
+ -D_ALL_SOURCE \
+ %{maix64: -D__64BIT__} \
+ %{mpe: -I/usr/lpp/ppe.poe/include} \
+ %{pthread: -D_THREAD_SAFE}"
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS)
+
+#undef PROCESSOR_DEFAULT
+#define PROCESSOR_DEFAULT PROCESSOR_PPC630
+#undef PROCESSOR_DEFAULT64
+#define PROCESSOR_DEFAULT64 PROCESSOR_POWER4
+
+#undef TARGET_POWER
+#define TARGET_POWER 0
+
+/* Define this macro as a C expression for the initializer of an
+ array of string to tell the driver program which options are
+ defaults for this target and thus do not need to be handled
+ specially when using `MULTILIB_OPTIONS'.
+
+ Do not define this macro if `MULTILIB_OPTIONS' is not defined in
+ the target makefile fragment or if none of the options listed in
+ `MULTILIB_OPTIONS' are set by default. *Note Target Fragment::. */
+
+#undef MULTILIB_DEFAULTS
+
+#undef LIB_SPEC
+#define LIB_SPEC "%{pg:-L/lib/profiled -L/usr/lib/profiled}\
+ %{p:-L/lib/profiled -L/usr/lib/profiled}\
+ %{!maix64:%{!shared:%{g*:-lg}}}\
+ %{mpe:-L/usr/lpp/ppe.poe/lib -lmpi -lvtd}\
+ %{pthread:-lpthreads} -lc"
+
+#undef LINK_SPEC
+#define LINK_SPEC "-bpT:0x10000000 -bpD:0x20000000 %{!r:-btextro} -bnodelcsect\
+ %{static:-bnso %(link_syscalls) } %{shared:-bM:SRE %{!e:-bnoentry}}\
+ %{!maix64:%{!shared:%{g*: %(link_libg) }}} %{maix64:-b64}\
+ %{mpe:-binitfini:poe_remote_main}"
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "%{!shared:\
+ %{maix64:%{pg:gcrt0_64%O%s}%{!pg:%{p:mcrt0_64%O%s}%{!p:crt0_64%O%s}}}\
+ %{!maix64:\
+ %{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}}}}}"
+
+/* AIX V5 typedefs ptrdiff_t as "long" while earlier releases used "int". */
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+/* 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
+
+/* AIX V5 uses PowerPC nop (ori 0,0,0) instruction as call glue for PowerPC
+ and "cror 31,31,31" for POWER architecture. */
+
+#undef RS6000_CALL_GLUE
+#define RS6000_CALL_GLUE "{cror 31,31,31|nop}"
+
+/* AIX 4.2 and above provides initialization and finalization function
+ support from linker command line. */
+#undef HAS_INIT_SECTION
+#define HAS_INIT_SECTION
+
+#undef LD_INIT_SWITCH
+#define LD_INIT_SWITCH "-binitfini"
diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h
index f3e1d715aa5..6bfc07ca981 100644
--- a/gcc/config/rs6000/darwin.h
+++ b/gcc/config/rs6000/darwin.h
@@ -214,7 +214,7 @@ Boston, MA 02111-1307, USA. */
: 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. */
+ support 64 bit PowerPC either, so this just keeps things happy. */
#define DOUBLE_INT_ASM_OP "\t.quad\t"
/* Get HOST_WIDE_INT and CONST_INT to be 32 bits, for compile time
diff --git a/gcc/config/rs6000/eabi.asm b/gcc/config/rs6000/eabi.asm
index 0808e9c3dab..058f9b9d5e7 100644
--- a/gcc/config/rs6000/eabi.asm
+++ b/gcc/config/rs6000/eabi.asm
@@ -139,7 +139,7 @@ FUNC_START(__eabi)
addi 11,11,.LCTOC1@l
cmplwi 2,9,0 /* init flag != 0? */
bnelr 2 /* return now, if we've been called already */
- stw 1,.Linit_p@l(10) /* store a non-zero value in the done flag */
+ stw 1,.Linit_p@l(10) /* store a nonzero value in the done flag */
#else /* -mrelocatable */
mflr 0
@@ -155,7 +155,7 @@ FUNC_START(__eabi)
cmplwi 2,9,0 /* init flag != 0? */
mtlr 0 /* restore in case branch was taken */
bnelr 2 /* return now, if we've been called already */
- stwx 1,10,12 /* store a non-zero value in the done flag */
+ stwx 1,10,12 /* store a nonzero value in the done flag */
beq+ 0,.Lsdata /* skip if we don't need to relocate */
/* We need to relocate the .got2 pointers. */
diff --git a/gcc/config/rs6000/gnu.h b/gcc/config/rs6000/gnu.h
index 32bd906772c..9aeb696db2f 100644
--- a/gcc/config/rs6000/gnu.h
+++ b/gcc/config/rs6000/gnu.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler,
- for powerpc machines running GNU.
+ for PowerPC machines running GNU.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h
index 0beaa618d94..95a4dd5791b 100644
--- a/gcc/config/rs6000/linux.h
+++ b/gcc/config/rs6000/linux.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler,
- for powerpc machines running Linux.
+ for PowerPC machines running Linux.
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation,
Inc.
Contributed by Michael Meissner (meissner@cygnus.com).
diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
index a1f162e0558..d44e5df8bc6 100644
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler,
- for 64 bit powerpc linux.
+ for 64 bit PowerPC linux.
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -73,6 +73,7 @@ Boston, MA 02111-1307, USA. */
#define USER_LABEL_PREFIX ""
/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */
+#undef ADJUST_FIELD_ALIGN
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
(TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
? get_inner_array_type (FIELD) \
@@ -285,7 +286,7 @@ do { \
} \
while (0)
-/* Return non-zero if this entry is to be written into the constant
+/* Return nonzero 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),
we also do this for floating-point constants. We actually can only
@@ -325,7 +326,7 @@ do \
assemble_name (FILE, \
XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
putc ('\n', FILE); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LM", sym_lineno); \
+ (*targetm.asm_out.internal_label) (FILE, "LM", sym_lineno); \
sym_lineno += 1; \
} \
while (0)
@@ -353,6 +354,25 @@ while (0)
#define DBX_OUTPUT_LBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_LBRAC)
#define DBX_OUTPUT_RBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_RBRAC)
+/* Another case where we want the dot name. */
+#define DBX_OUTPUT_NFUN(FILE, LSCOPE, DECL) \
+ do \
+ { \
+ fprintf (FILE, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN); \
+ assemble_name (FILE, LSCOPE); \
+ fputs ("-.", FILE); \
+ assemble_name (FILE, XSTR (XEXP (DECL_RTL (DECL), 0), 0)); \
+ putc ('\n', FILE); \
+ } \
+ while (0)
+
/* Override sysv4.h as these are ABI_V4 only. */
#undef ASM_OUTPUT_REG_PUSH
#undef ASM_OUTPUT_REG_POP
+
+/* Select a format to encode pointers in exception handling data. CODE
+ is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
+ true if the symbol may be affected by dynamic relocations. */
+#undef ASM_PREFERRED_EH_DATA_FORMAT
+#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
+ (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_udata8)
diff --git a/gcc/config/rs6000/lynx.h b/gcc/config/rs6000/lynx.h
index 7878ef94a17..9689bf150f9 100644
--- a/gcc/config/rs6000/lynx.h
+++ b/gcc/config/rs6000/lynx.h
@@ -33,7 +33,6 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_ASM_SELECT_SECTION
#undef USER_LABEL_PREFIX
#undef ASM_OUTPUT_LABELREF
-#undef ASM_OUTPUT_INTERNAL_LABEL
#undef ASM_GENERATE_INTERNAL_LABEL
#undef ASM_OUTPUT_COMMON
#undef ASM_OUTPUT_LOCAL
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 42092118f60..08540e37348 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -150,7 +150,7 @@ extern void setup_incoming_varargs PARAMS ((CUMULATIVE_ARGS *,
enum machine_mode, tree,
int *, int));
extern struct rtx_def *rs6000_va_arg PARAMS ((tree, tree));
-extern void output_mi_thunk PARAMS ((FILE *, tree, int, tree));
+extern void output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
extern int function_ok_for_sibcall PARAMS ((tree));
#ifdef ARGS_SIZE_RTX
/* expr.h defines ARGS_SIZE_RTX and `enum direction' */
@@ -190,8 +190,6 @@ extern void debug_stack_info PARAMS ((rs6000_stack_t *));
extern const char *output_isel PARAMS ((rtx *));
extern int vrsave_operation PARAMS ((rtx, enum machine_mode));
-extern void machopic_output_stub PARAMS ((FILE *, const char *, const char *));
-
/* Declare functions in rs6000-c.c */
#ifdef GCC_CPPLIB_H
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 4becedd80d9..65ab27fec95 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -92,9 +92,12 @@ int rs6000_fprs = 1;
/* String from -misel=. */
const char *rs6000_isel_string;
-/* Set to non-zero once AIX common-mode calls have been defined. */
+/* Set to nonzero once AIX common-mode calls have been defined. */
static int common_mode_defined;
+/* Private copy of original value of flag_pic for ABI_AIX. */
+static int rs6000_flag_pic;
+
/* Save information from a "cmpxx" operation until the branch or scc is
emitted. */
rtx rs6000_compare_op0, rs6000_compare_op1;
@@ -162,9 +165,9 @@ struct builtin_description
const enum rs6000_builtins code;
};
+static bool rs6000_function_ok_for_sibcall PARAMS ((tree, tree));
static void rs6000_add_gc_roots PARAMS ((void));
static int num_insns_constant_wide PARAMS ((HOST_WIDE_INT));
-static rtx expand_block_move_mem PARAMS ((enum machine_mode, rtx, rtx));
static void validate_condition_mode
PARAMS ((enum rtx_code, enum machine_mode));
static rtx rs6000_generate_compare PARAMS ((enum rtx_code));
@@ -183,6 +186,9 @@ static void toc_hash_mark_table PARAMS ((void *));
static int constant_pool_expr_1 PARAMS ((rtx, int *, int *));
static struct machine_function * rs6000_init_machine_status PARAMS ((void));
static bool rs6000_assemble_integer PARAMS ((rtx, unsigned int, int));
+#ifdef HAVE_GAS_HIDDEN
+static void rs6000_assemble_visibility PARAMS ((tree, const char *));
+#endif
static int rs6000_ra_ever_killed PARAMS ((void));
static tree rs6000_handle_longcall_attribute PARAMS ((tree *, tree, tree, int, bool *));
const struct attribute_spec rs6000_attribute_table[];
@@ -201,8 +207,10 @@ static void rs6000_elf_select_section PARAMS ((tree, int,
static void rs6000_elf_unique_section PARAMS ((tree, int));
static void rs6000_elf_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT));
-static void rs6000_elf_encode_section_info PARAMS ((tree, int));
+static void rs6000_elf_encode_section_info PARAMS ((tree, int))
+ ATTRIBUTE_UNUSED;
static const char *rs6000_elf_strip_name_encoding PARAMS ((const char *));
+static bool rs6000_elf_in_small_data_p PARAMS ((tree));
#endif
#if TARGET_XCOFF
static void rs6000_xcoff_asm_globalize_label PARAMS ((FILE *, const char *));
@@ -213,9 +221,11 @@ static void rs6000_xcoff_unique_section PARAMS ((tree, int));
static void rs6000_xcoff_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT));
static const char * rs6000_xcoff_strip_name_encoding PARAMS ((const char *));
+static unsigned int rs6000_xcoff_section_type_flags PARAMS ((tree, const char *, int));
#endif
static void rs6000_xcoff_encode_section_info PARAMS ((tree, int))
ATTRIBUTE_UNUSED;
+static bool rs6000_binds_local_p PARAMS ((tree));
static int rs6000_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int rs6000_adjust_priority PARAMS ((rtx, int));
static int rs6000_issue_rate PARAMS ((void));
@@ -338,16 +348,16 @@ static const char alt_reg_names[][8] =
#undef TARGET_ASM_INTEGER
#define TARGET_ASM_INTEGER rs6000_assemble_integer
+#ifdef HAVE_GAS_HIDDEN
+#undef TARGET_ASM_ASSEMBLE_VISIBILITY
+#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
+#endif
+
#undef TARGET_ASM_FUNCTION_PROLOGUE
#define TARGET_ASM_FUNCTION_PROLOGUE rs6000_output_function_prologue
#undef TARGET_ASM_FUNCTION_EPILOGUE
#define TARGET_ASM_FUNCTION_EPILOGUE rs6000_output_function_epilogue
-#if TARGET_ELF
-#undef TARGET_SECTION_TYPE_FLAGS
-#define TARGET_SECTION_TYPE_FLAGS rs6000_elf_section_type_flags
-#endif
-
#undef TARGET_SCHED_ISSUE_RATE
#define TARGET_SCHED_ISSUE_RATE rs6000_issue_rate
#undef TARGET_SCHED_ADJUST_COST
@@ -361,9 +371,15 @@ static const char alt_reg_names[][8] =
#undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
+#undef TARGET_BINDS_LOCAL_P
+#define TARGET_BINDS_LOCAL_P rs6000_binds_local_p
+
/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Override command line options. Mostly we process the processor
@@ -438,6 +454,9 @@ rs6000_override_options (default_cpu)
{"405", PROCESSOR_PPC405,
MASK_POWERPC | MASK_SOFT_FLOAT | MASK_NEW_MNEMONICS,
POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
+ {"405f", PROCESSOR_PPC405,
+ MASK_POWERPC | MASK_NEW_MNEMONICS,
+ POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
{"505", PROCESSOR_MPCCORE,
MASK_POWERPC | MASK_NEW_MNEMONICS,
POWER_MASKS | POWERPC_OPT_MASKS | MASK_POWERPC64},
@@ -574,27 +593,13 @@ rs6000_override_options (default_cpu)
if (flag_pic != 0 && DEFAULT_ABI == ABI_AIX)
{
+ rs6000_flag_pic = flag_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
- if (flag_function_sections && (write_symbols != NO_DEBUG)
- && DEFAULT_ABI == ABI_AIX)
- {
- warning ("-ffunction-sections disabled on AIX when debugging");
- flag_function_sections = 0;
- }
-
- if (flag_data_sections && (DEFAULT_ABI == ABI_AIX))
- {
- warning ("-fdata-sections not supported on AIX");
- flag_data_sections = 0;
- }
-#endif
+ /* For Darwin, always silently make -fpic and -fPIC identical. */
+ if (flag_pic == 1 && DEFAULT_ABI == ABI_DARWIN)
+ flag_pic = 2;
/* Set debug flags */
if (rs6000_debug_name)
@@ -685,6 +690,10 @@ rs6000_override_options (default_cpu)
target_flags |= MASK_AIX_STRUCT_RET;
}
+ if (TARGET_LONG_DOUBLE_128
+ && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN))
+ real_format_for_mode[TFmode - QFmode] = &ibm_extended_format;
+
/* Register global variables with the garbage collector. */
rs6000_add_gc_roots ();
@@ -809,7 +818,7 @@ rs6000_file_start (file, default_cpu)
}
}
-/* Return non-zero if this function is known to have a null epilogue. */
+/* Return nonzero if this function is known to have a null epilogue. */
int
direct_return ()
@@ -1308,7 +1317,21 @@ easy_fp_constant (op, mode)
return 0;
#endif
- if (mode == DFmode)
+ if (mode == TFmode)
+ {
+ long k[4];
+ REAL_VALUE_TYPE rv;
+
+ REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
+
+ return (num_insns_constant_wide ((HOST_WIDE_INT) k[0]) == 1
+ && num_insns_constant_wide ((HOST_WIDE_INT) k[1]) == 1
+ && num_insns_constant_wide ((HOST_WIDE_INT) k[2]) == 1
+ && num_insns_constant_wide ((HOST_WIDE_INT) k[3]) == 1);
+ }
+
+ else if (mode == DFmode)
{
long k[2];
REAL_VALUE_TYPE rv;
@@ -1759,6 +1782,8 @@ build_mask64_2_operands (in, out)
out[2] = GEN_INT (shift);
out[3] = GEN_INT (m2);
#else
+ (void)in;
+ (void)out;
abort ();
#endif
}
@@ -2095,7 +2120,7 @@ rs6000_legitimize_address (x, oldx, mode)
&& GET_MODE_NUNITS (mode) == 1
&& ((TARGET_HARD_FLOAT && TARGET_FPRS)
|| TARGET_POWERPC64
- || mode != DFmode)
+ || (mode != DFmode && mode != TFmode))
&& (TARGET_POWERPC64 || mode != DImode)
&& mode != TImode)
{
@@ -2239,7 +2264,7 @@ rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
&& REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
&& REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
&& GET_CODE (XEXP (x, 1)) == CONST_INT
- && !SPE_VECTOR_MODE (mode)
+ && !SPE_VECTOR_MODE (mode)
&& !ALTIVEC_VECTOR_MODE (mode))
{
HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
@@ -2348,7 +2373,7 @@ rs6000_legitimate_address (mode, x, reg_ok_strict)
if (mode != TImode
&& ((TARGET_HARD_FLOAT && TARGET_FPRS)
|| TARGET_POWERPC64
- || mode != DFmode)
+ || (mode != DFmode && mode != TFmode))
&& (TARGET_POWERPC64 || mode != DImode)
&& LEGITIMATE_INDEXED_ADDRESS_P (x, reg_ok_strict))
return 1;
@@ -2564,8 +2589,22 @@ rs6000_emit_move (dest, source, mode)
return;
}
- if (! no_new_pseudos && GET_CODE (operands[0]) != REG)
- operands[1] = force_reg (mode, operands[1]);
+ if (!no_new_pseudos)
+ {
+ if (GET_CODE (operands[1]) == MEM && optimize > 0
+ && (mode == QImode || mode == HImode || mode == SImode)
+ && GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode))
+ {
+ rtx reg = gen_reg_rtx (word_mode);
+
+ emit_insn (gen_rtx_SET (word_mode, reg,
+ gen_rtx_ZERO_EXTEND (word_mode,
+ operands[1])));
+ operands[1] = gen_lowpart (mode, reg);
+ }
+ if (GET_CODE (operands[0]) != REG)
+ operands[1] = force_reg (mode, operands[1]);
+ }
if (mode == SFmode && ! TARGET_POWERPC
&& TARGET_HARD_FLOAT && TARGET_FPRS
@@ -2630,6 +2669,7 @@ rs6000_emit_move (dest, source, mode)
case V4HImode:
case V2SFmode:
case V2SImode:
+ case V1DImode:
if (CONSTANT_P (operands[1])
&& !easy_vector_constant (operands[1]))
operands[1] = force_const_mem (mode, operands[1]);
@@ -3011,7 +3051,7 @@ function_arg_advance (cum, mode, type, named)
if (GET_MODE_CLASS (mode) == MODE_FLOAT
&& TARGET_HARD_FLOAT && TARGET_FPRS)
- cum->fregno++;
+ cum->fregno += (mode == TFmode ? 2 : 1);
if (TARGET_DEBUG_ARG)
{
@@ -3130,6 +3170,9 @@ function_arg (cum, mode, type, named)
rtx r1, r2;
enum machine_mode m = GET_MODE_INNER (mode);
+ if (mode == V1DImode)
+ m = SImode;
+
r1 = gen_rtx_REG (m, gregno);
r1 = gen_rtx_EXPR_LIST (m, r1, const0_rtx);
r2 = gen_rtx_REG (m, gregno + 1);
@@ -6030,21 +6073,7 @@ rs6000_common_init_builtins ()
}
}
-/* Generate a memory reference for expand_block_move, copying volatile,
- and other bits from an original memory reference. */
-
-static rtx
-expand_block_move_mem (mode, addr, orig_mem)
- enum machine_mode mode;
- rtx addr;
- rtx orig_mem;
-{
- rtx mem = gen_rtx_MEM (mode, addr);
-
- MEM_COPY_ATTRIBUTES (mem, orig_mem);
- return mem;
-}
-
+
/* Expand a block move operation, and return 1 if successful. Return 0
if we should let the compiler generate normal code.
@@ -6067,14 +6096,6 @@ expand_block_move (operands)
int align;
int bytes;
int offset;
- int num_reg;
- int i;
- rtx src_reg;
- rtx dest_reg;
- rtx src_addr;
- rtx dest_addr;
- rtx tmp_reg;
- rtx stores[MAX_MOVE_REG];
int move_bytes;
/* If this is not a fixed size move, just call memcpy */
@@ -6096,14 +6117,17 @@ expand_block_move (operands)
if (bytes > (TARGET_POWERPC64 ? 64 : 32))
return 0;
- /* Move the address into scratch registers. */
- dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
- src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
-
if (TARGET_STRING) /* string instructions are available */
{
- for ( ; bytes > 0; bytes -= move_bytes)
+ for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
{
+ union {
+ rtx (*movstrsi) PARAMS ((rtx, rtx, rtx, rtx));
+ rtx (*mov) PARAMS ((rtx, rtx));
+ } gen_func;
+ enum machine_mode mode = BLKmode;
+ rtx src, dest;
+
if (bytes > 24 /* move up to 32 bytes at a time */
&& ! fixed_regs[5]
&& ! fixed_regs[6]
@@ -6115,15 +6139,7 @@ expand_block_move (operands)
&& ! fixed_regs[12])
{
move_bytes = (bytes > 32) ? 32 : bytes;
- emit_insn (gen_movstrsi_8reg (expand_block_move_mem (BLKmode,
- dest_reg,
- orig_dest),
- expand_block_move_mem (BLKmode,
- src_reg,
- orig_src),
- GEN_INT ((move_bytes == 32)
- ? 0 : move_bytes),
- align_rtx));
+ gen_func.movstrsi = gen_movstrsi_8reg;
}
else if (bytes > 16 /* move up to 24 bytes at a time */
&& ! fixed_regs[5]
@@ -6134,14 +6150,7 @@ expand_block_move (operands)
&& ! fixed_regs[10])
{
move_bytes = (bytes > 24) ? 24 : bytes;
- emit_insn (gen_movstrsi_6reg (expand_block_move_mem (BLKmode,
- dest_reg,
- orig_dest),
- expand_block_move_mem (BLKmode,
- src_reg,
- orig_src),
- GEN_INT (move_bytes),
- align_rtx));
+ gen_func.movstrsi = gen_movstrsi_6reg;
}
else if (bytes > 8 /* move up to 16 bytes at a time */
&& ! fixed_regs[5]
@@ -6150,14 +6159,7 @@ expand_block_move (operands)
&& ! fixed_regs[8])
{
move_bytes = (bytes > 16) ? 16 : bytes;
- emit_insn (gen_movstrsi_4reg (expand_block_move_mem (BLKmode,
- dest_reg,
- orig_dest),
- expand_block_move_mem (BLKmode,
- src_reg,
- orig_src),
- GEN_INT (move_bytes),
- align_rtx));
+ gen_func.movstrsi = gen_movstrsi_4reg;
}
else if (bytes >= 8 && TARGET_POWERPC64
/* 64-bit loads and stores require word-aligned
@@ -6165,108 +6167,84 @@ expand_block_move (operands)
&& (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
{
move_bytes = 8;
- tmp_reg = gen_reg_rtx (DImode);
- emit_move_insn (tmp_reg,
- expand_block_move_mem (DImode,
- src_reg, orig_src));
- emit_move_insn (expand_block_move_mem (DImode,
- dest_reg, orig_dest),
- tmp_reg);
+ mode = DImode;
+ gen_func.mov = gen_movdi;
}
else if (bytes > 4 && !TARGET_POWERPC64)
{ /* move up to 8 bytes at a time */
move_bytes = (bytes > 8) ? 8 : bytes;
- emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode,
- dest_reg,
- orig_dest),
- expand_block_move_mem (BLKmode,
- src_reg,
- orig_src),
- GEN_INT (move_bytes),
- align_rtx));
+ gen_func.movstrsi = gen_movstrsi_2reg;
}
else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
{ /* move 4 bytes */
move_bytes = 4;
- tmp_reg = gen_reg_rtx (SImode);
- emit_move_insn (tmp_reg,
- expand_block_move_mem (SImode,
- src_reg, orig_src));
- emit_move_insn (expand_block_move_mem (SImode,
- dest_reg, orig_dest),
- tmp_reg);
+ mode = SImode;
+ gen_func.mov = gen_movsi;
}
else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT))
{ /* move 2 bytes */
move_bytes = 2;
- tmp_reg = gen_reg_rtx (HImode);
- emit_move_insn (tmp_reg,
- expand_block_move_mem (HImode,
- src_reg, orig_src));
- emit_move_insn (expand_block_move_mem (HImode,
- dest_reg, orig_dest),
- tmp_reg);
+ mode = HImode;
+ gen_func.mov = gen_movhi;
}
else if (bytes == 1) /* move 1 byte */
{
move_bytes = 1;
- tmp_reg = gen_reg_rtx (QImode);
- emit_move_insn (tmp_reg,
- expand_block_move_mem (QImode,
- src_reg, orig_src));
- emit_move_insn (expand_block_move_mem (QImode,
- dest_reg, orig_dest),
- tmp_reg);
+ mode = QImode;
+ gen_func.mov = gen_movqi;
}
else
{ /* move up to 4 bytes at a time */
move_bytes = (bytes > 4) ? 4 : bytes;
- emit_insn (gen_movstrsi_1reg (expand_block_move_mem (BLKmode,
- dest_reg,
- orig_dest),
- expand_block_move_mem (BLKmode,
- src_reg,
- orig_src),
- GEN_INT (move_bytes),
- align_rtx));
+ gen_func.movstrsi = gen_movstrsi_1reg;
}
- if (bytes > move_bytes)
+ src = adjust_address (orig_src, mode, offset);
+ dest = adjust_address (orig_dest, mode, offset);
+
+ if (mode == BLKmode)
{
- if (! TARGET_POWERPC64)
+ /* Move the address into scratch registers. The movstrsi
+ patterns require zero offset. */
+ if (!REG_P (XEXP (src, 0)))
{
- emit_insn (gen_addsi3 (src_reg, src_reg,
- GEN_INT (move_bytes)));
- emit_insn (gen_addsi3 (dest_reg, dest_reg,
- GEN_INT (move_bytes)));
+ rtx src_reg = copy_addr_to_reg (XEXP (src, 0));
+ src = replace_equiv_address (src, src_reg);
}
- else
+ set_mem_size (src, GEN_INT (move_bytes));
+
+ if (!REG_P (XEXP (dest, 0)))
{
- emit_insn (gen_adddi3 (src_reg, src_reg,
- GEN_INT (move_bytes)));
- emit_insn (gen_adddi3 (dest_reg, dest_reg,
- GEN_INT (move_bytes)));
+ rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0));
+ dest = replace_equiv_address (dest, dest_reg);
}
+ set_mem_size (dest, GEN_INT (move_bytes));
+
+ emit_insn ((*gen_func.movstrsi) (dest, src,
+ GEN_INT (move_bytes & 31),
+ align_rtx));
+ }
+ else
+ {
+ rtx tmp_reg = gen_reg_rtx (mode);
+
+ emit_insn ((*gen_func.mov) (tmp_reg, src));
+ emit_insn ((*gen_func.mov) (dest, tmp_reg));
}
}
}
else /* string instructions not available */
{
- num_reg = offset = 0;
- for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes))
+ rtx stores[MAX_MOVE_REG];
+ int num_reg = 0;
+ int i;
+
+ for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
{
- /* Calculate the correct offset for src/dest */
- if (offset == 0)
- {
- src_addr = src_reg;
- dest_addr = dest_reg;
- }
- else
- {
- src_addr = plus_constant (src_reg, offset);
- dest_addr = plus_constant (dest_reg, offset);
- }
+ rtx (*gen_mov_func) PARAMS ((rtx, rtx));
+ enum machine_mode mode;
+ rtx src, dest, tmp_reg;
/* Generate the appropriate load and store, saving the stores
for later. */
@@ -6276,56 +6254,35 @@ expand_block_move (operands)
&& (align >= 8 || (! STRICT_ALIGNMENT && align >= 4)))
{
move_bytes = 8;
- tmp_reg = gen_reg_rtx (DImode);
- emit_insn (gen_movdi (tmp_reg,
- expand_block_move_mem (DImode,
- src_addr,
- orig_src)));
- stores[num_reg++] = gen_movdi (expand_block_move_mem (DImode,
- dest_addr,
- orig_dest),
- tmp_reg);
+ mode = DImode;
+ gen_mov_func = gen_movdi;
}
else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT))
{
move_bytes = 4;
- tmp_reg = gen_reg_rtx (SImode);
- emit_insn (gen_movsi (tmp_reg,
- expand_block_move_mem (SImode,
- src_addr,
- orig_src)));
- stores[num_reg++] = gen_movsi (expand_block_move_mem (SImode,
- dest_addr,
- orig_dest),
- tmp_reg);
+ mode = SImode;
+ gen_mov_func = gen_movsi;
}
else if (bytes >= 2 && (align >= 2 || ! STRICT_ALIGNMENT))
{
move_bytes = 2;
- tmp_reg = gen_reg_rtx (HImode);
- emit_insn (gen_movhi (tmp_reg,
- expand_block_move_mem (HImode,
- src_addr,
- orig_src)));
- stores[num_reg++] = gen_movhi (expand_block_move_mem (HImode,
- dest_addr,
- orig_dest),
- tmp_reg);
+ mode = HImode;
+ gen_mov_func = gen_movhi;
}
else
{
move_bytes = 1;
- tmp_reg = gen_reg_rtx (QImode);
- emit_insn (gen_movqi (tmp_reg,
- expand_block_move_mem (QImode,
- src_addr,
- orig_src)));
- stores[num_reg++] = gen_movqi (expand_block_move_mem (QImode,
- dest_addr,
- orig_dest),
- tmp_reg);
+ mode = QImode;
+ gen_mov_func = gen_movqi;
}
+ src = adjust_address (orig_src, mode, offset);
+ dest = adjust_address (orig_dest, mode, offset);
+ tmp_reg = gen_reg_rtx (mode);
+
+ emit_insn ((*gen_mov_func) (tmp_reg, src));
+ stores[num_reg++] = (*gen_mov_func) (dest, tmp_reg);
+
if (num_reg >= MAX_MOVE_REG)
{
for (i = 0; i < num_reg; i++)
@@ -7460,7 +7417,7 @@ print_operand (file, x, code)
case 'G':
/* X is a constant integer. If it is negative, print "m",
- otherwise print "z". This is to make a aze or ame insn. */
+ otherwise print "z". This is to make an aze or ame insn. */
if (GET_CODE (x) != CONST_INT)
output_operand_lossage ("invalid %%G value");
else if (INTVAL (x) >= 0)
@@ -8079,7 +8036,7 @@ print_operand_address (file, x)
abort ();
}
-/* Target hook for assembling integer objects. The powerpc version has
+/* Target hook for assembling integer objects. The PowerPC version has
to handle fixup entries for relocatable code if RELOCATABLE_NEEDS_FIXUP
is defined. It also needs to handle DI-mode objects on 64-bit
targets. */
@@ -8142,6 +8099,31 @@ rs6000_assemble_integer (x, size, aligned_p)
#endif /* RELOCATABLE_NEEDS_FIXUP */
return default_assemble_integer (x, size, aligned_p);
}
+
+#ifdef HAVE_GAS_HIDDEN
+/* Emit an assembler directive to set symbol visibility for DECL to
+ VISIBILITY_TYPE. */
+
+static void
+rs6000_assemble_visibility (decl, visibility_type)
+ tree decl;
+ const char *visibility_type;
+{
+ default_assemble_visibility (decl, visibility_type);
+
+ /* Functions need to have their entry point symbol visibility set as
+ well as their descriptor symbol visibility. */
+ if (DEFAULT_ABI == ABI_AIX && TREE_CODE (decl) == FUNCTION_DECL)
+ {
+ const char *name;
+
+ name = ((* targetm.strip_name_encoding)
+ (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
+
+ fprintf (asm_out_file, "\t.%s\t.%s\n", visibility_type, name);
+ }
+}
+#endif
enum rtx_code
rs6000_reverse_condition (mode, code)
@@ -8393,7 +8375,7 @@ rs6000_emit_cbranch (code, loc)
condition code register and its mode specifies what kind of
comparison we made.
- REVERSED is non-zero if we should reverse the sense of the comparison.
+ REVERSED is nonzero if we should reverse the sense of the comparison.
INSN is the insn. */
@@ -8577,7 +8559,7 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
would treat EQ different to UNORDERED, we can't do it. */
if (! flag_unsafe_math_optimizations
&& code != GT && code != UNGE
- && (GET_CODE (op1) != CONST_DOUBLE || target_isinf (c1))
+ && (GET_CODE (op1) != CONST_DOUBLE || real_isinf (&c1))
/* Constructs of the form (a OP b ? a : b) are safe. */
&& ((! rtx_equal_p (op0, false_cond) && ! rtx_equal_p (op1, false_cond))
|| (! rtx_equal_p (op0, true_cond)
@@ -8777,8 +8759,9 @@ first_reg_to_save ()
break;
#if TARGET_MACHO
- if (flag_pic && current_function_uses_pic_offset_table &&
- (first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM))
+ if (flag_pic
+ && current_function_uses_pic_offset_table
+ && first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM)
return RS6000_PIC_OFFSET_TABLE_REGNUM;
#endif
@@ -9444,30 +9427,36 @@ rs6000_return_addr (count, frame)
vector parameters are required to have a prototype, so the argument
type info must be available here. (The tail recursion case can work
with vector parameters, but there's no way to distinguish here.) */
-int
-function_ok_for_sibcall (fndecl)
- tree fndecl;
+static bool
+rs6000_function_ok_for_sibcall (decl, exp)
+ tree decl;
+ tree exp ATTRIBUTE_UNUSED;
{
tree type;
- if (fndecl)
+ if (decl)
{
if (TARGET_ALTIVEC_VRSAVE)
{
- for (type = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
+ for (type = TYPE_ARG_TYPES (TREE_TYPE (decl));
type; type = TREE_CHAIN (type))
{
if (TREE_CODE (TREE_VALUE (type)) == VECTOR_TYPE)
- return 0;
+ return false;
}
}
if (DEFAULT_ABI == ABI_DARWIN
- || (TREE_ASM_WRITTEN (fndecl) && !flag_pic) || !TREE_PUBLIC (fndecl))
- return 1;
+ || (*targetm.binds_local_p) (decl))
+ {
+ tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (decl));
+
+ if (!lookup_attribute ("longcall", attr_list)
+ || lookup_attribute ("shortcall", attr_list))
+ return true;
+ }
}
- return 0;
+ return false;
}
-/* function rewritten to handle sibcalls */
static int
rs6000_ra_ever_killed ()
{
@@ -9475,23 +9464,24 @@ rs6000_ra_ever_killed ()
rtx reg;
rtx insn;
-#ifdef ASM_OUTPUT_MI_THUNK
- if (current_function_is_thunk)
+ if (targetm.asm_out.output_mi_thunk && current_function_is_thunk)
return 0;
-#endif
- /* regs_ever_live has LR marked as used if any sibcalls
- are present. Which it is, but this should not force
- saving and restoring in the prologue/epilog. Likewise,
- reg_set_between_p thinks a sibcall clobbers LR, so
- that is inappropriate. */
+
+ /* regs_ever_live has LR marked as used if any sibcalls are present,
+ but this should not force saving and restoring in the
+ pro/epilogue. Likewise, reg_set_between_p thinks a sibcall
+ clobbers LR, so that is inappropriate. */
+
/* Also, the prologue can generate a store into LR that
doesn't really count, like this:
+
move LR->R0
bcl to set PIC register
move LR->R31
move R0->LR
- When we're called from the epilog, we need to avoid counting
- this as a store; thus we ignore any insns with a REG_MAYBE_DEAD note. */
+
+ When we're called from the epilogue, we need to avoid counting
+ this as a store. */
push_topmost_sequence ();
top = get_insns ();
@@ -9507,8 +9497,8 @@ rs6000_ra_ever_killed ()
else if (GET_CODE (insn) == CALL_INSN
&& !SIBLING_CALL_P (insn))
return 1;
- else if (set_of (reg, insn) != NULL_RTX
- && find_reg_note (insn, REG_MAYBE_DEAD, NULL_RTX) == 0)
+ else if (set_of (reg, insn) != NULL_RTX
+ && !prologue_epilogue_contains (insn))
return 1;
}
}
@@ -9536,91 +9526,88 @@ rs6000_emit_load_toc_table (fromprolog)
rtx dest;
dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
- if (TARGET_ELF && DEFAULT_ABI != ABI_AIX)
+ if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
{
- if (DEFAULT_ABI == ABI_V4 && flag_pic == 1)
+ rtx temp = (fromprolog
+ ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
+ : gen_reg_rtx (Pmode));
+ rs6000_maybe_dead (emit_insn (gen_load_toc_v4_pic_si (temp)));
+ rs6000_maybe_dead (emit_move_insn (dest, temp));
+ }
+ else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
+ {
+ char buf[30];
+ rtx tempLR = (fromprolog
+ ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
+ : gen_reg_rtx (Pmode));
+ rtx temp0 = (fromprolog
+ ? gen_rtx_REG (Pmode, 0)
+ : gen_reg_rtx (Pmode));
+ rtx symF;
+
+ /* possibly create the toc section */
+ if (! toc_initialized)
{
- rtx temp = (fromprolog
- ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
- : gen_reg_rtx (Pmode));
- rs6000_maybe_dead (emit_insn (gen_load_toc_v4_pic_si (temp)));
- rs6000_maybe_dead (emit_move_insn (dest, temp));
+ toc_section ();
+ function_section (current_function_decl);
}
- else if (flag_pic == 2)
- {
- char buf[30];
- rtx tempLR = (fromprolog
- ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
- : gen_reg_rtx (Pmode));
- rtx temp0 = (fromprolog
- ? gen_rtx_REG (Pmode, 0)
- : gen_reg_rtx (Pmode));
- rtx symF;
-
- /* possibly create the toc section */
- if (! toc_initialized)
- {
- toc_section ();
- function_section (current_function_decl);
- }
-
- if (fromprolog)
- {
- rtx symL;
-
- ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
- symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
-
- ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
- symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
-
- rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
- symF)));
- rs6000_maybe_dead (emit_move_insn (dest, tempLR));
- rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
- symL,
- symF)));
- }
- else
- {
- rtx tocsym;
- static int reload_toc_labelno = 0;
- tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
+ if (fromprolog)
+ {
+ rtx symL;
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
+ symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
- ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
- symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
+ symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
- rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1b (tempLR,
- symF,
- tocsym)));
- rs6000_maybe_dead (emit_move_insn (dest, tempLR));
- rs6000_maybe_dead (emit_move_insn (temp0,
- gen_rtx_MEM (Pmode, dest)));
- }
- rs6000_maybe_dead (emit_insn (gen_addsi3 (dest, temp0, dest)));
- }
- else if (flag_pic == 0 && TARGET_MINIMAL_TOC)
- {
- /* This is for AIX code running in non-PIC ELF. */
- char buf[30];
- rtx realsym;
- ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
- realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
-
- rs6000_maybe_dead (emit_insn (gen_elf_high (dest, realsym)));
- rs6000_maybe_dead (emit_insn (gen_elf_low (dest, dest, realsym)));
+ rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR,
+ symF)));
+ rs6000_maybe_dead (emit_move_insn (dest, tempLR));
+ rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
+ symL,
+ symF)));
}
else
- abort ();
+ {
+ rtx tocsym;
+ static int reload_toc_labelno = 0;
+
+ tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LCG", reload_toc_labelno++);
+ symF = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
+
+ rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1b (tempLR,
+ symF,
+ tocsym)));
+ rs6000_maybe_dead (emit_move_insn (dest, tempLR));
+ rs6000_maybe_dead (emit_move_insn (temp0,
+ gen_rtx_MEM (Pmode, dest)));
+ }
+ rs6000_maybe_dead (emit_insn (gen_addsi3 (dest, temp0, dest)));
}
- else
+ else if (TARGET_ELF && !TARGET_AIX && flag_pic == 0 && TARGET_MINIMAL_TOC)
+ {
+ /* This is for AIX code running in non-PIC ELF32. */
+ char buf[30];
+ rtx realsym;
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
+ realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
+
+ rs6000_maybe_dead (emit_insn (gen_elf_high (dest, realsym)));
+ rs6000_maybe_dead (emit_insn (gen_elf_low (dest, dest, realsym)));
+ }
+ else if (DEFAULT_ABI == ABI_AIX)
{
if (TARGET_32BIT)
- rs6000_maybe_dead (emit_insn (gen_load_toc_aix_si (dest)));
+ rs6000_maybe_dead (emit_insn (gen_load_toc_aix_si (dest)));
else
- rs6000_maybe_dead (emit_insn (gen_load_toc_aix_di (dest)));
+ rs6000_maybe_dead (emit_insn (gen_load_toc_aix_di (dest)));
}
+ else
+ abort ();
}
int
@@ -10495,17 +10482,21 @@ rs6000_emit_prologue ()
gen_rtx_REG (Pmode, 11));
}
+#if TARGET_MACHO
if (DEFAULT_ABI == ABI_DARWIN
&& flag_pic && current_function_uses_pic_offset_table)
{
rtx dest = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
+ char *picbase = machopic_function_base_name ();
+ rtx src = gen_rtx_SYMBOL_REF (Pmode, ggc_alloc_string (picbase, -1));
- rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest)));
+ rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest, src)));
rs6000_maybe_dead (
emit_move_insn (gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM),
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)));
}
+#endif
}
/* Write function prologue. */
@@ -11005,7 +10996,7 @@ rs6000_output_function_epilogue (file, size)
if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
&& rs6000_traceback != traceback_none)
{
- const char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
+ const char *fname = NULL;
const char *language_string = lang_hooks.name;
int fixed_parms = 0, float_parms = 0, parm_info = 0;
int i;
@@ -11018,15 +11009,17 @@ rs6000_output_function_epilogue (file, size)
else
optional_tbtab = !optimize_size && !TARGET_ELF;
- while (*fname == '.') /* V.4 encodes . in the name */
- fname++;
+ if (optional_tbtab)
+ {
+ fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
+ while (*fname == '.') /* V.4 encodes . in the name */
+ fname++;
- /* Need label immediately before tbtab, so we can compute its offset
- from the function start. */
- if (*fname == '*')
- ++fname;
- ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
- ASM_OUTPUT_LABEL (file, fname);
+ /* Need label immediately before tbtab, so we can compute
+ its offset from the function start. */
+ ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
+ ASM_OUTPUT_LABEL (file, fname);
+ }
/* The .tbtab pseudo-op can only be used for the first eight
expressions, since it can't handle the possibly variable
@@ -11121,7 +11114,7 @@ rs6000_output_function_epilogue (file, size)
if (mode == SFmode)
bits = 0x2;
- else if (mode == DFmode)
+ else if (mode == DFmode || mode == TFmode)
bits = 0x3;
else
abort ();
@@ -11198,6 +11191,8 @@ rs6000_output_function_epilogue (file, size)
/* Omit this list of longs, because there are no CTL anchors. */
/* Length of function name. */
+ if (*fname == '*')
+ ++fname;
fprintf (file, "\t.short %d\n", (int) strlen (fname));
/* Function name. */
@@ -11248,7 +11243,7 @@ void
output_mi_thunk (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl ATTRIBUTE_UNUSED;
- int delta;
+ HOST_WIDE_INT delta;
tree function;
{
const char *this_reg =
@@ -11266,28 +11261,27 @@ output_mi_thunk (file, thunk_fndecl, delta, function)
if (delta >= -32768 && delta <= 32767)
{
if (! TARGET_NEW_MNEMONICS)
- fprintf (file, "\tcal %s,%d(%s)\n", this_reg, delta, this_reg);
+ fprintf (file, "\tcal %s,%d(%s)\n", this_reg, (int) delta, this_reg);
else
- fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta);
+ fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, (int) delta);
}
+ /* 64-bit constants. If "int" is 32 bits, we'll never hit this abort. */
+ else if (TARGET_64BIT && (delta < -2147483647 - 1 || delta > 2147483647))
+ abort ();
+
/* Large constants that can be done by one addis instruction. */
- else if ((delta & 0xffff) == 0 && num_insns_constant_wide (delta) == 1)
+ else if ((delta & 0xffff) == 0)
asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
- delta >> 16);
+ (int) (delta >> 16));
/* 32-bit constants that can be done by an add and addis instruction. */
- else if (TARGET_32BIT || num_insns_constant_wide (delta) == 1)
+ else
{
/* Break into two pieces, propagating the sign bit from the low
word to the upper word. */
- int delta_high = delta >> 16;
- int delta_low = delta & 0xffff;
- if ((delta_low & 0x8000) != 0)
- {
- delta_high++;
- delta_low = (delta_low ^ 0x8000) - 0x8000; /* sign extend */
- }
+ int delta_low = ((delta & 0xffff) ^ 0x8000) - 0x8000;
+ int delta_high = (delta - delta_low) >> 16;
asm_fprintf (file, "\t{cau|addis} %s,%s,%d\n", this_reg, this_reg,
delta_high);
@@ -11298,10 +11292,6 @@ output_mi_thunk (file, thunk_fndecl, delta, function)
fprintf (file, "\taddi %s,%s,%d\n", this_reg, this_reg, delta_low);
}
- /* 64-bit constants, fixme */
- else
- abort ();
-
/* Get the prefix in front of the names. */
switch (DEFAULT_ABI)
{
@@ -11328,7 +11318,6 @@ output_mi_thunk (file, thunk_fndecl, delta, function)
TYPE_ATTRIBUTES (TREE_TYPE (function)))
|| lookup_attribute ("shortcall",
TYPE_ATTRIBUTES (TREE_TYPE (function)))))
-
{
fprintf (file, "\tb %s", prefix);
assemble_name (file, fname);
@@ -11347,7 +11336,7 @@ output_mi_thunk (file, thunk_fndecl, delta, function)
/* Set up a TOC entry for the function. */
ASM_GENERATE_INTERNAL_LABEL (buf, "Lthunk", labelno);
toc_section ();
- ASM_OUTPUT_INTERNAL_LABEL (file, "Lthunk", labelno);
+ (*targetm.asm_out.internal_label) (file, "Lthunk", labelno);
labelno++;
if (TARGET_MINIMAL_TOC)
@@ -11363,7 +11352,7 @@ output_mi_thunk (file, thunk_fndecl, delta, function)
if (TARGET_ELF)
function_section (current_function_decl);
else
- text_section();
+ text_section ();
if (TARGET_MINIMAL_TOC)
asm_fprintf (file, (TARGET_32BIT)
? "\t{l|lwz} %s,%s(%s)\n" : "\tld %s,%s(%s)\n", r12,
@@ -11458,18 +11447,34 @@ static unsigned
rs6000_hash_constant (k)
rtx k;
{
- unsigned result = (GET_CODE (k) << 3) ^ GET_MODE (k);
- const char *format = GET_RTX_FORMAT (GET_CODE (k));
- int flen = strlen (format);
- int fidx;
+ enum rtx_code code = GET_CODE (k);
+ enum machine_mode mode = GET_MODE (k);
+ unsigned result = (code << 3) ^ mode;
+ const char *format;
+ int flen, fidx;
- if (GET_CODE (k) == LABEL_REF)
- return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
+ format = GET_RTX_FORMAT (code);
+ flen = strlen (format);
+ fidx = 0;
- if (GET_CODE (k) == CODE_LABEL)
- fidx = 3;
- else
- fidx = 0;
+ switch (code)
+ {
+ case LABEL_REF:
+ return result * 1231 + (unsigned) INSN_UID (XEXP (k, 0));
+
+ case CONST_DOUBLE:
+ if (mode != VOIDmode)
+ return real_hash (CONST_DOUBLE_REAL_VALUE (k)) * result;
+ flen = 2;
+ break;
+
+ case CODE_LABEL:
+ fidx = 3;
+ break;
+
+ default:
+ break;
+ }
for (; fidx < flen; fidx++)
switch (format[fidx])
@@ -11506,6 +11511,7 @@ rs6000_hash_constant (k)
default:
abort ();
}
+
return result;
}
@@ -11657,12 +11663,47 @@ output_toc (file, x, labelno, mode)
ASM_OUTPUT_ALIGN (file, 3);
}
- ASM_OUTPUT_INTERNAL_LABEL (file, "LC", labelno);
+ (*targetm.asm_out.internal_label) (file, "LC", labelno);
/* Handle FP constants specially. Note that if we have a minimal
TOC, things we put here aren't actually in the TOC, so we can allow
FP constants. */
- if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
+ if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == TFmode)
+ {
+ REAL_VALUE_TYPE rv;
+ long k[4];
+
+ REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
+
+ if (TARGET_64BIT)
+ {
+ if (TARGET_MINIMAL_TOC)
+ fputs (DOUBLE_INT_ASM_OP, file);
+ else
+ fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
+ k[0] & 0xffffffff, k[1] & 0xffffffff,
+ k[2] & 0xffffffff, k[3] & 0xffffffff);
+ fprintf (file, "0x%lx%08lx,0x%lx%08lx\n",
+ k[0] & 0xffffffff, k[1] & 0xffffffff,
+ k[2] & 0xffffffff, k[3] & 0xffffffff);
+ return;
+ }
+ else
+ {
+ if (TARGET_MINIMAL_TOC)
+ fputs ("\t.long ", file);
+ else
+ fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
+ k[0] & 0xffffffff, k[1] & 0xffffffff,
+ k[2] & 0xffffffff, k[3] & 0xffffffff);
+ fprintf (file, "0x%lx,0x%lx,0x%lx,0x%lx\n",
+ k[0] & 0xffffffff, k[1] & 0xffffffff,
+ k[2] & 0xffffffff, k[3] & 0xffffffff);
+ return;
+ }
+ }
+ else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
{
REAL_VALUE_TYPE rv;
long k[2];
@@ -12430,42 +12471,10 @@ static void
rs6000_elf_select_section (decl, reloc, align)
tree decl;
int reloc;
- unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
+ unsigned HOST_WIDE_INT align;
{
- int size = int_size_in_bytes (TREE_TYPE (decl));
- int needs_sdata;
- int readonly;
- static void (* const sec_funcs[4]) PARAMS ((void)) = {
- &readonly_data_section,
- &sdata2_section,
- &data_section,
- &sdata_section
- };
-
- needs_sdata = (size > 0
- && size <= g_switch_value
- && rs6000_sdata != SDATA_NONE
- && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
-
- if (TREE_CODE (decl) == STRING_CST)
- readonly = ! flag_writable_strings;
- else if (TREE_CODE (decl) == VAR_DECL)
- readonly = (! (flag_pic && reloc)
- && TREE_READONLY (decl)
- && ! TREE_SIDE_EFFECTS (decl)
- && DECL_INITIAL (decl)
- && DECL_INITIAL (decl) != error_mark_node
- && TREE_CONSTANT (DECL_INITIAL (decl)));
- else if (TREE_CODE (decl) == CONSTRUCTOR)
- readonly = (! (flag_pic && reloc)
- && ! TREE_SIDE_EFFECTS (decl)
- && TREE_CONSTANT (decl));
- else
- readonly = 1;
- if (needs_sdata && rs6000_sdata != SDATA_EABI)
- readonly = 0;
-
- (*sec_funcs[(readonly ? 0 : 2) + (needs_sdata ? 1 : 0)])();
+ default_elf_select_section_1 (decl, reloc, align,
+ flag_pic || DEFAULT_ABI == ABI_AIX);
}
/* A C statement to build up a unique section name, expressed as a
@@ -12474,79 +12483,15 @@ rs6000_elf_select_section (decl, reloc, align)
link-time relocations. If you do not define this macro, GCC will use
the symbol name prefixed by `.' as the section name. Note - this
macro can now be called for uninitialized data items as well as
- initialised data and functions. */
+ initialized data and functions. */
static void
rs6000_elf_unique_section (decl, reloc)
tree decl;
int reloc;
{
- int len;
- int sec;
- const char *name;
- char *string;
- const char *prefix;
-
- static const char *const prefixes[7][2] =
- {
- { ".rodata.", ".gnu.linkonce.r." },
- { ".sdata2.", ".gnu.linkonce.s2." },
- { ".data.", ".gnu.linkonce.d." },
- { ".sdata.", ".gnu.linkonce.s." },
- { ".bss.", ".gnu.linkonce.b." },
- { ".sbss.", ".gnu.linkonce.sb." },
- { ".text.", ".gnu.linkonce.t." }
- };
-
- if (TREE_CODE (decl) == FUNCTION_DECL)
- sec = 6;
- else
- {
- int readonly;
- int needs_sdata;
- int size;
-
- readonly = 1;
- if (TREE_CODE (decl) == STRING_CST)
- readonly = ! flag_writable_strings;
- else if (TREE_CODE (decl) == VAR_DECL)
- readonly = (! (flag_pic && reloc)
- && TREE_READONLY (decl)
- && ! TREE_SIDE_EFFECTS (decl)
- && TREE_CONSTANT (DECL_INITIAL (decl)));
-
- size = int_size_in_bytes (TREE_TYPE (decl));
- needs_sdata = (size > 0
- && size <= g_switch_value
- && rs6000_sdata != SDATA_NONE
- && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
-
- if (DECL_INITIAL (decl) == 0
- || DECL_INITIAL (decl) == error_mark_node)
- sec = 4;
- else if (! readonly)
- sec = 2;
- else
- sec = 0;
-
- if (needs_sdata)
- {
- /* .sdata2 is only for EABI. */
- if (sec == 0 && rs6000_sdata != SDATA_EABI)
- sec = 2;
- sec += 1;
- }
- }
-
- name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
- name = (*targetm.strip_name_encoding) (name);
- prefix = prefixes[sec][DECL_ONE_ONLY (decl)];
- len = strlen (name) + strlen (prefix);
- string = alloca (len + 1);
-
- sprintf (string, "%s%s", prefix, name);
-
- DECL_SECTION_NAME (decl) = build_string (len, string);
+ default_unique_section_1 (decl, reloc,
+ flag_pic || DEFAULT_ABI == ABI_AIX);
}
@@ -12569,8 +12514,7 @@ rs6000_elf_encode_section_info (decl, first)
if (TREE_CODE (decl) == FUNCTION_DECL)
{
rtx sym_ref = XEXP (DECL_RTL (decl), 0);
- if ((TREE_ASM_WRITTEN (decl) || ! TREE_PUBLIC (decl))
- && ! DECL_WEAK (decl))
+ if ((*targetm.binds_local_p) (decl))
SYMBOL_REF_FLAG (sym_ref) = 1;
if (DEFAULT_ABI == ABI_AIX)
@@ -12640,6 +12584,34 @@ rs6000_elf_strip_name_encoding (str)
return str;
}
+static bool
+rs6000_elf_in_small_data_p (decl)
+ tree decl;
+{
+ if (rs6000_sdata == SDATA_NONE)
+ return false;
+
+ if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl))
+ {
+ const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
+ if (strcmp (section, ".sdata") == 0
+ || strcmp (section, ".sdata2") == 0
+ || strcmp (section, ".sbss") == 0)
+ return true;
+ }
+ else
+ {
+ HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
+
+ if (size > 0
+ && size <= g_switch_value
+ && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)))
+ return true;
+ }
+
+ return false;
+}
+
#endif /* USING_ELFOS_H */
@@ -13017,7 +12989,9 @@ rs6000_elf_section_type_flags (decl, name, reloc)
const char *name;
int reloc;
{
- unsigned int flags = default_section_type_flags (decl, name, reloc);
+ unsigned int flags
+ = default_section_type_flags_1 (decl, name, reloc,
+ flag_pic || DEFAULT_ABI == ABI_AIX);
if (TARGET_RELOCATABLE)
flags |= SECTION_WRITE;
@@ -13109,34 +13083,39 @@ rs6000_xcoff_asm_globalize_label (stream, name)
static void
rs6000_xcoff_asm_named_section (name, flags)
const char *name;
- unsigned int flags ATTRIBUTE_UNUSED;
+ unsigned int flags;
{
- fprintf (asm_out_file, "\t.csect %s\n", name);
+ int smclass;
+ static const char * const suffix[3] = { "PR", "RO", "RW" };
+
+ if (flags & SECTION_CODE)
+ smclass = 0;
+ else if (flags & SECTION_WRITE)
+ smclass = 2;
+ else
+ smclass = 1;
+
+ fprintf (asm_out_file, "\t.csect %s%s[%s],%u\n",
+ (flags & SECTION_CODE) ? "." : "",
+ name, suffix[smclass], flags & SECTION_ENTSIZE);
}
static void
-rs6000_xcoff_select_section (exp, reloc, align)
- tree exp;
+rs6000_xcoff_select_section (decl, reloc, align)
+ tree decl;
int reloc;
unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
{
- if ((TREE_CODE (exp) == STRING_CST
- && ! flag_writable_strings)
- || (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
- && TREE_READONLY (exp) && ! TREE_THIS_VOLATILE (exp)
- && DECL_INITIAL (exp)
- && (DECL_INITIAL (exp) == error_mark_node
- || TREE_CONSTANT (DECL_INITIAL (exp)))
- && ! (reloc)))
+ if (decl_readonly_section_1 (decl, reloc, 1))
{
- if (TREE_PUBLIC (exp))
+ if (TREE_PUBLIC (decl))
read_only_data_section ();
else
read_only_private_data_section ();
}
else
{
- if (TREE_PUBLIC (exp))
+ if (TREE_PUBLIC (decl))
data_section ();
else
private_data_section ();
@@ -13149,17 +13128,19 @@ rs6000_xcoff_unique_section (decl, reloc)
int reloc ATTRIBUTE_UNUSED;
{
const char *name;
- char *string;
- size_t len;
- if (TREE_CODE (decl) == FUNCTION_DECL)
- {
- name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
- len = strlen (name) + 5;
- string = alloca (len + 1);
- sprintf (string, ".%s[PR]", name);
- DECL_SECTION_NAME (decl) = build_string (len, string);
- }
+ /* Use select_section for private and uninitialized data. */
+ if (!TREE_PUBLIC (decl)
+ || DECL_COMMON (decl)
+ || DECL_INITIAL (decl) == NULL_TREE
+ || DECL_INITIAL (decl) == error_mark_node
+ || (flag_zero_initialized_in_bss
+ && initializer_zerop (DECL_INITIAL (decl))))
+ return;
+
+ name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+ name = (*targetm.strip_name_encoding) (name);
+ DECL_SECTION_NAME (decl) = build_string (strlen (name), name);
}
/* Select section for constant in constant pool.
@@ -13196,9 +13177,32 @@ rs6000_xcoff_strip_name_encoding (name)
return name;
}
+/* Section attributes. AIX is always PIC. */
+
+static unsigned int
+rs6000_xcoff_section_type_flags (decl, name, reloc)
+ tree decl;
+ const char *name;
+ int reloc;
+{
+ unsigned int align;
+ unsigned int flags = default_section_type_flags_1 (decl, name, reloc, 1);
+
+ /* Align to at least UNIT size. */
+ if (flags & SECTION_CODE)
+ align = MIN_UNITS_PER_WORD;
+ else
+ /* Increase alignment of large objects if not already stricter. */
+ align = MAX ((DECL_ALIGN (decl) / BITS_PER_UNIT),
+ int_size_in_bytes (TREE_TYPE (decl)) > MIN_UNITS_PER_WORD
+ ? UNITS_PER_FP_WORD : MIN_UNITS_PER_WORD);
+
+ return flags | (exact_log2 (align) & SECTION_ENTSIZE);
+}
+
#endif /* TARGET_XCOFF */
-/* Note that this is also used for ELF64. */
+/* Note that this is also used for PPC64 Linux. */
static void
rs6000_xcoff_encode_section_info (decl, first)
@@ -13206,7 +13210,16 @@ rs6000_xcoff_encode_section_info (decl, first)
int first ATTRIBUTE_UNUSED;
{
if (TREE_CODE (decl) == FUNCTION_DECL
- && (TREE_ASM_WRITTEN (decl) || ! TREE_PUBLIC (decl))
- && ! DECL_WEAK (decl))
+ && (*targetm.binds_local_p) (decl))
SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
}
+
+/* Cross-module name binding. For AIX and PPC64 Linux, which always are
+ PIC, use private copy of flag_pic. */
+
+static bool
+rs6000_binds_local_p (decl)
+ tree decl;
+{
+ return default_binds_local_p_1 (decl, flag_pic || rs6000_flag_pic);
+}
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 42aa929b855..e22175e3940 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -69,6 +69,7 @@ Boston, MA 02111-1307, USA. */
%{mcpu=401: -mppc} \
%{mcpu=403: -m403} \
%{mcpu=405: -m405} \
+%{mcpu=405f: -m405} \
%{mcpu=505: -mppc} \
%{mcpu=601: -m601} \
%{mcpu=602: -mppc} \
@@ -160,7 +161,7 @@ extern int target_flags;
/* Disable use of FPRs. */
#define MASK_SOFT_FLOAT 0x00000800
-/* Enable load/store multiple, even on powerpc */
+/* Enable load/store multiple, even on PowerPC */
#define MASK_MULTIPLE 0x00001000
#define MASK_MULTIPLE_SET 0x00002000
@@ -522,7 +523,11 @@ extern int rs6000_default_long_calls;
/* Width of a word, in units (bytes). */
#define UNITS_PER_WORD (! TARGET_POWERPC64 ? 4 : 8)
+#ifdef IN_LIBGCC2
+#define MIN_UNITS_PER_WORD UNITS_PER_WORD
+#else
#define MIN_UNITS_PER_WORD 4
+#endif
#define UNITS_PER_FP_WORD 8
#define UNITS_PER_ALTIVEC_WORD 16
#define UNITS_PER_SPE_WORD 8
@@ -628,7 +633,7 @@ extern int rs6000_default_long_calls;
#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \
(TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field 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.
@@ -647,7 +652,7 @@ extern int rs6000_default_long_calls;
&& TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
&& (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-/* Non-zero if move instructions will actually fail to work
+/* Nonzero if move instructions will actually fail to work
when given unaligned data. */
#define STRICT_ALIGNMENT 0
@@ -656,7 +661,8 @@ extern int rs6000_default_long_calls;
emulated in a trap handler. */
#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) \
(STRICT_ALIGNMENT \
- || (((MODE) == SFmode || (MODE) == DFmode || (MODE) == DImode) \
+ || (((MODE) == SFmode || (MODE) == DFmode || (MODE) == TFmode \
+ || (MODE) == DImode) \
&& (ALIGN) < 32))
/* Standard register usage. */
@@ -872,6 +878,7 @@ extern int rs6000_default_long_calls;
#define SPE_VECTOR_MODE(MODE) \
((MODE) == V4HImode \
|| (MODE) == V2SFmode \
+ || (MODE) == V1DImode \
|| (MODE) == V2SImode)
/* Define this macro to be nonzero if the port is prepared to handle
@@ -897,8 +904,7 @@ extern int rs6000_default_long_calls;
: SPE_SIMD_REGNO_P (REGNO) && TARGET_SPE && SPE_VECTOR_MODE (MODE) ? 1 \
: CR_REGNO_P (REGNO) ? GET_MODE_CLASS (MODE) == MODE_CC \
: XER_REGNO_P (REGNO) ? (MODE) == PSImode \
- : ! INT_REGNO_P (REGNO) ? (GET_MODE_CLASS (MODE) == MODE_INT \
- && GET_MODE_SIZE (MODE) <= UNITS_PER_WORD) \
+ : ! INT_REGNO_P (REGNO) ? GET_MODE_SIZE (MODE) <= UNITS_PER_WORD \
: 1)
/* Value is 1 if it is a good idea to tie two pseudo registers
@@ -1221,8 +1227,8 @@ enum reg_class
Return 1 if VALUE is in the range specified by C.
`I' is a signed 16-bit constant
- `J' is a constant with only the high-order 16 bits non-zero
- `K' is a constant with only the low-order 16 bits non-zero
+ `J' is a constant with only the high-order 16 bits nonzero
+ `K' is a constant with only the low-order 16 bits nonzero
`L' is a signed 16-bit constant shifted left 16 bits
`M' is a constant that is greater than 31
`N' is a positive constant that is an exact power of two
@@ -1689,13 +1695,13 @@ typedef struct rs6000_args
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
function_arg_advance (&CUM, MODE, TYPE, NAMED)
-/* Non-zero if we can use a floating-point register to pass this arg. */
+/* Nonzero if we can use a floating-point register to pass this arg. */
#define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
(GET_MODE_CLASS (MODE) == MODE_FLOAT \
&& (CUM).fregno <= FP_ARG_MAX_REG \
&& TARGET_HARD_FLOAT && TARGET_FPRS)
-/* Non-zero if we can use an AltiVec register to pass this arg. */
+/* Nonzero if we can use an AltiVec register to pass this arg. */
#define USE_ALTIVEC_FOR_ARG_P(CUM,MODE,TYPE) \
(ALTIVEC_VECTOR_MODE (MODE) \
&& (CUM).vregno <= ALTIVEC_ARG_MAX_REG \
@@ -1798,10 +1804,6 @@ typedef struct rs6000_args
argument is passed depends on whether or not it is a named argument. */
#define STRICT_ARGUMENT_NAMING 1
-/* We do not allow indirect calls to be optimized into sibling calls, nor
- do we allow calls with vector parameters. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) function_ok_for_sibcall ((DECL))
-
/* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */
@@ -1812,7 +1814,7 @@ typedef struct rs6000_args
the stack pointer does not matter. No definition is equivalent to
always zero.
- On the RS/6000, this is non-zero because we can restore the stack from
+ On the RS/6000, this is nonzero because we can restore the stack from
its backpointer, which we maintain. */
#define EXIT_IGNORE_STACK 1
@@ -1889,7 +1891,7 @@ typedef struct rs6000_args
{{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
- { 30, 30} }
+ { RS6000_PIC_OFFSET_TABLE_REGNUM, RS6000_PIC_OFFSET_TABLE_REGNUM } }
/* Given FROM and TO register numbers, say whether this elimination is allowed.
Frame pointer elimination is automatically handled.
@@ -1900,10 +1902,11 @@ typedef struct rs6000_args
We need r30 if -mminimal-toc was specified, and there are constant pool
references. */
-#define CAN_ELIMINATE(FROM, TO) \
- ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM \
- ? ! frame_pointer_needed \
- : (FROM) == 30 ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0 \
+#define CAN_ELIMINATE(FROM, TO) \
+ ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM \
+ ? ! frame_pointer_needed \
+ : (FROM) == RS6000_PIC_OFFSET_TABLE_REGNUM \
+ ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC || get_pool_size () == 0 \
: 1)
/* Define the offset between two registers, one to be eliminated, and the other
@@ -1918,7 +1921,7 @@ typedef struct rs6000_args
(OFFSET) = info->total_size; \
else if ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
(OFFSET) = (info->push_p) ? info->total_size : 0; \
- else if ((FROM) == 30) \
+ else if ((FROM) == RS6000_PIC_OFFSET_TABLE_REGNUM) \
(OFFSET) = 0; \
else \
abort (); \
@@ -1926,9 +1929,6 @@ typedef struct rs6000_args
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
#define HAVE_PRE_DECREMENT 1
#define HAVE_PRE_INCREMENT 1
@@ -2067,7 +2067,7 @@ typedef struct rs6000_args
|| (TARGET_32BIT \
? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 4) \
: ! (INTVAL (XEXP (X, 1)) & 3))) \
- && ((MODE) != TImode \
+ && (((MODE) != TFmode && (MODE) != TImode) \
|| (TARGET_32BIT \
? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 12) \
: (LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 8) \
@@ -2183,7 +2183,7 @@ do { \
#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)
+#define TOC_REGISTER (TARGET_MINIMAL_TOC ? RS6000_PIC_OFFSET_TABLE_REGNUM : 2)
/* Define this macro if the register defined by
`PIC_OFFSET_TABLE_REGNUM' is clobbered by calls. Do not define
@@ -2255,7 +2255,7 @@ do { \
#define MAX_MOVE_MAX 8
/* Nonzero if access to memory by bytes is no faster than for words.
- Also non-zero if doing byte operations (specifically shifts) in registers
+ Also nonzero if doing byte operations (specifically shifts) in registers
is undesirable. */
#define SLOW_BYTE_ACCESS 1
@@ -2794,14 +2794,6 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */
if ((LOG) != 0) \
fprintf (FILE, "\t.align %d\n", (LOG))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* Pick up the return address upon entry to a procedure. Used for
dwarf2 unwind information. This also enables the table driven
mechanism. */
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index c3ff213832e..e9ae2963da5 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -1,6 +1,6 @@
;; Machine description for IBM RISC System 6000 (POWER) for GNU C compiler
;; Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-;; 1999, 2000, 2001 Free Software Foundation, Inc.
+;; 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
;; This file is part of GNU CC.
@@ -32,6 +32,8 @@
;; 8 movsi_got
;; 9/v eh_reg_restore
;; 10 fctiwz
+;; 15 load_macho_picbase
+;; 16 macho_correct_pic
;; 19 movesi_from_cr
;; 20 movesi_to_cr
@@ -3613,7 +3615,7 @@
#"
[(set_attr "type" "compare")
(set_attr "length" "4,8")])
-
+
(define_split
[(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
(compare:CC
@@ -3633,7 +3635,7 @@
(compare:CC (match_dup 0)
(const_int 0)))]
"")
-
+
;; Rotate and shift insns, in all their variants. These support shifts,
;; field inserts and extracts, and various combinations thereof.
(define_expand "insv"
@@ -3821,7 +3823,7 @@
if (which_alternative == 1)
return \"#\";
- /* If the bitfield being tested fits in the upper or lower half of a
+ /* If the bit-field being tested fits in the upper or lower half of a
word, it is possible to use andiu. or andil. to test it. This is
useful because the condition register set-use delay is smaller for
andi[ul]. than for rlinm. This doesn't work when the starting bit
@@ -3880,14 +3882,12 @@
if (which_alternative == 1)
return \"#\";
- if ((start > 0 && start + size <= 16) || start >= 16)
+ /* Since we are using the output value, we can't ignore any need for
+ a shift. The bit-field must end at the LSB. */
+ if (start >= 16 && start + size == 32)
{
- operands[3] = GEN_INT (((1 << (16 - (start & 15)))
- - (1 << (16 - (start & 15) - size))));
- if (start < 16)
- return \"{andiu.|andis.} %0,%1,%3\";
- else
- return \"{andil.|andi.} %0,%1,%3\";
+ operands[3] = GEN_INT ((1 << size) - 1);
+ return \"{andil.|andi.} %0,%1,%3\";
}
if (start + size >= 32)
@@ -5892,13 +5892,30 @@
"fctidz %0,%1"
[(set_attr "type" "fp")])
-;; This only is safe if rounding mode set appropriately.
-(define_insn_and_split "floatdisf2"
+(define_expand "floatdisf2"
+ [(set (match_operand:SF 0 "gpc_reg_operand" "")
+ (float:SF (match_operand:DI 1 "gpc_reg_operand" "")))]
+ "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
+ "
+{
+ if (!flag_unsafe_math_optimizations)
+ {
+ rtx label = gen_label_rtx ();
+ emit_insn (gen_floatdisf2_internal2 (operands[1], label));
+ emit_label (label);
+ }
+ emit_insn (gen_floatdisf2_internal1 (operands[0], operands[1]));
+ DONE;
+}")
+
+;; This is not IEEE compliant if rounding mode is "round to nearest".
+;; If the DI->DF conversion is inexact, then it's possible to suffer
+;; from double rounding.
+(define_insn_and_split "floatdisf2_internal1"
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
(float:SF (match_operand:DI 1 "gpc_reg_operand" "*f")))
(clobber (match_scratch:DF 2 "=f"))]
- "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS
- && flag_unsafe_math_optimizations"
+ "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
"#"
"&& reload_completed"
[(set (match_dup 2)
@@ -5906,6 +5923,37 @@
(set (match_dup 0)
(float_truncate:SF (match_dup 2)))]
"")
+
+;; Twiddles bits to avoid double rounding.
+;; Bits that might be trucated when converting to DFmode are replaced
+;; by a bit that won't be lost at that stage, but is below the SFmode
+;; rounding position.
+(define_expand "floatdisf2_internal2"
+ [(parallel [(set (match_dup 4)
+ (compare:CC (and:DI (match_operand:DI 0 "" "")
+ (const_int 2047))
+ (const_int 0)))
+ (set (match_dup 2) (and:DI (match_dup 0) (const_int 2047)))
+ (clobber (match_scratch:CC 7 ""))])
+ (set (match_dup 3) (ashiftrt:DI (match_dup 0) (const_int 53)))
+ (set (match_dup 3) (plus:DI (match_dup 3) (const_int 1)))
+ (set (pc) (if_then_else (eq (match_dup 4) (const_int 0))
+ (label_ref (match_operand:DI 1 "" ""))
+ (pc)))
+ (set (match_dup 5) (compare:CCUNS (match_dup 3) (const_int 2)))
+ (set (pc) (if_then_else (ltu (match_dup 5) (const_int 0))
+ (label_ref (match_dup 1))
+ (pc)))
+ (set (match_dup 0) (xor:DI (match_dup 0) (match_dup 2)))
+ (set (match_dup 0) (ior:DI (match_dup 0) (const_int 2048)))]
+ "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
+ "
+{
+ operands[2] = gen_reg_rtx (DImode);
+ operands[3] = gen_reg_rtx (DImode);
+ operands[4] = gen_reg_rtx (CCmode);
+ operands[5] = gen_reg_rtx (CCUNSmode);
+}")
;; Define the DImode operations that can be done in a small number
;; of instructions. The & constraints are to prevent the register
@@ -8301,8 +8349,8 @@
"")
(define_insn "*movcc_internal1"
- [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,y,r,r,r,r,m")
- (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,m,r"))]
+ [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,y,r,r,r,cl,q,r,r,m")
+ (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,r,r,h,m,r"))]
"register_operand (operands[0], CCmode)
|| register_operand (operands[1], CCmode)"
"@
@@ -8312,10 +8360,13 @@
mfcr %0
mfcr %0\;{rlinm|rlwinm} %0,%0,%f1,0xf0000000
mr %0,%1
+ mt%0 %1
+ mt%0 %1
+ mf%1 %0
{l%U1%X1|lwz%U1%X1} %0,%1
{st%U0%U1|stw%U0%U1} %1,%0"
- [(set_attr "type" "cr_logical,cr_logical,cr_logical,cr_logical,cr_logical,*,load,store")
- (set_attr "length" "*,*,12,*,8,*,*,*")])
+ [(set_attr "type" "cr_logical,cr_logical,cr_logical,cr_logical,cr_logical,*,*,mtjmpr,*,load,store")
+ (set_attr "length" "4,4,12,4,8,4,4,4,4,4,4")])
;; For floating-point, we normally deal with the floating-point registers
;; unless -msoft-float is used. The sole exception is that parameter passing
@@ -8354,8 +8405,8 @@
}")
(define_insn "*movsf_hardfloat"
- [(set (match_operand:SF 0 "nonimmediate_operand" "=!r,!r,m,f,f,m,!r,!r")
- (match_operand:SF 1 "input_operand" "r,m,r,f,m,f,G,Fn"))]
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=!r,!r,m,f,f,m,!cl,!q,!r,!r,!r")
+ (match_operand:SF 1 "input_operand" "r,m,r,f,m,f,r,r,h,G,Fn"))]
"(gpc_reg_operand (operands[0], SFmode)
|| gpc_reg_operand (operands[1], SFmode))
&& (TARGET_HARD_FLOAT && TARGET_FPRS)"
@@ -8366,19 +8417,25 @@
fmr %0,%1
lfs%U1%X1 %0,%1
stfs%U0%X0 %1,%0
+ mt%0 %1
+ mt%0 %1
+ mf%1 %0
#
#"
- [(set_attr "type" "*,load,store,fp,fpload,fpstore,*,*")
- (set_attr "length" "4,4,4,4,4,4,4,8")])
+ [(set_attr "type" "*,load,store,fp,fpload,fpstore,*,mtjmpr,*,*,*")
+ (set_attr "length" "4,4,4,4,4,4,4,4,4,4,8")])
(define_insn "*movsf_softfloat"
- [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,m,r,r,r,r,r")
- (match_operand:SF 1 "input_operand" "r,m,r,I,L,R,G,Fn"))]
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=r,cl,q,r,r,m,r,r,r,r,r")
+ (match_operand:SF 1 "input_operand" "r,r,r,h,m,r,I,L,R,G,Fn"))]
"(gpc_reg_operand (operands[0], SFmode)
|| gpc_reg_operand (operands[1], SFmode))
&& (TARGET_SOFT_FLOAT || !TARGET_FPRS)"
"@
mr %0,%1
+ mt%0 %1
+ mt%0 %1
+ mf%1 %0
{l%U1%X1|lwz%U1%X1} %0,%1
{st%U0%X0|stw%U0%X0} %1,%0
{lil|li} %0,%1
@@ -8386,8 +8443,8 @@
{cal|la} %0,%a1
#
#"
- [(set_attr "type" "*,load,store,*,*,*,*,*")
- (set_attr "length" "4,4,4,4,4,4,4,8")])
+ [(set_attr "type" "*,mtjmpr,*,*,load,store,*,*,*,*,*")
+ (set_attr "length" "4,4,4,4,4,4,4,4,4,4,8")])
(define_expand "movdf"
@@ -8460,7 +8517,9 @@
int endian = (WORDS_BIG_ENDIAN == 0);
long l[2];
REAL_VALUE_TYPE rv;
+#if HOST_BITS_PER_WIDE_INT >= 64
HOST_WIDE_INT val;
+#endif
REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
REAL_VALUE_TO_TARGET_DOUBLE (rv, l);
@@ -8468,10 +8527,10 @@
operands[2] = gen_lowpart (DImode, operands[0]);
/* HIGHPART is lower memory address when WORDS_BIG_ENDIAN. */
#if HOST_BITS_PER_WIDE_INT >= 64
- val = ((HOST_WIDE_INT)(unsigned long)l[endian] << 32 |
- ((HOST_WIDE_INT)(unsigned long)l[1 - endian]));
+ val = ((HOST_WIDE_INT)(unsigned long)l[endian] << 32
+ | ((HOST_WIDE_INT)(unsigned long)l[1 - endian]));
- operands[3] = immed_double_const (val, -(val < 0), DImode);
+ operands[3] = gen_int_mode (val, DImode);
#else
operands[3] = immed_double_const (l[1 - endian], l[endian], DImode);
#endif
@@ -8484,8 +8543,8 @@
;; The "??" is a kludge until we can figure out a more reasonable way
;; of handling these non-offsettable values.
(define_insn "*movdf_hardfloat32"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,m,!r,!r,!r,f,f,m")
- (match_operand:DF 1 "input_operand" "r,m,r,G,H,F,f,m,f"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,m,f,f,m,!r,!r,!r")
+ (match_operand:DF 1 "input_operand" "r,m,r,f,m,f,G,H,F"))]
"! TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS
&& (gpc_reg_operand (operands[0], DFmode)
|| gpc_reg_operand (operands[1], DFmode))"
@@ -8562,19 +8621,19 @@
return \"\";
}
case 3:
+ return \"fmr %0,%1\";
case 4:
+ return \"lfd%U1%X1 %0,%1\";
case 5:
- return \"#\";
+ return \"stfd%U0%X0 %1,%0\";
case 6:
- return \"fmr %0,%1\";
case 7:
- return \"lfd%U1%X1 %0,%1\";
case 8:
- return \"stfd%U0%X0 %1,%0\";
+ return \"#\";
}
}"
- [(set_attr "type" "*,load,store,*,*,*,fp,fpload,fpstore")
- (set_attr "length" "8,16,16,8,12,16,*,*,*")])
+ [(set_attr "type" "*,load,store,fp,fpload,fpstore,*,*,*")
+ (set_attr "length" "8,16,16,4,4,4,8,12,16")])
(define_insn "*movdf_softfloat32"
[(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,m,r,r,r")
@@ -8618,8 +8677,8 @@
(set_attr "length" "8,8,8,8,12,16")])
(define_insn "*movdf_hardfloat64"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,m,!r,!r,!r,f,f,m")
- (match_operand:DF 1 "input_operand" "r,m,r,G,H,F,f,m,f"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=!r,??r,m,f,f,m,!cl,!r,!r,!r,!r")
+ (match_operand:DF 1 "input_operand" "r,m,r,f,m,f,r,h,G,H,F"))]
"TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS
&& (gpc_reg_operand (operands[0], DFmode)
|| gpc_reg_operand (operands[1], DFmode))"
@@ -8627,30 +8686,34 @@
mr %0,%1
ld%U1%X1 %0,%1
std%U0%X0 %1,%0
- #
- #
- #
fmr %0,%1
lfd%U1%X1 %0,%1
- stfd%U0%X0 %1,%0"
- [(set_attr "type" "*,load,store,*,*,*,fp,fpload,fpstore")
- (set_attr "length" "4,4,4,8,12,16,4,4,4")])
+ stfd%U0%X0 %1,%0
+ mt%0 %1
+ mf%1 %0
+ #
+ #
+ #"
+ [(set_attr "type" "*,load,store,fp,fpload,fpstore,mtjmpr,*,*,*,*")
+ (set_attr "length" "4,4,4,4,4,4,4,4,8,12,16")])
(define_insn "*movdf_softfloat64"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,m,r,r,r")
- (match_operand:DF 1 "input_operand" "r,m,r,G,H,F"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=r,cl,r,r,m,r,r,r")
+ (match_operand:DF 1 "input_operand" "r,r,h,m,r,G,H,F"))]
"TARGET_POWERPC64 && (TARGET_SOFT_FLOAT || !TARGET_FPRS)
&& (gpc_reg_operand (operands[0], DFmode)
|| gpc_reg_operand (operands[1], DFmode))"
"@
mr %0,%1
+ mt%0 %1
+ mf%1 %0
ld%U1%X1 %0,%1
std%U0%X0 %1,%0
#
#
#"
- [(set_attr "type" "*,load,store,*,*,*")
- (set_attr "length" "*,*,*,8,12,16")])
+ [(set_attr "type" "*,*,*,load,store,*,*,*")
+ (set_attr "length" "4,4,4,4,4,8,12,16")])
(define_expand "movtf"
[(set (match_operand:TF 0 "general_operand" "")
@@ -8681,9 +8744,9 @@
else
return \"fmr %0,%1\;fmr %L0,%L1\";
case 1:
- return \"lfd %0,%1\;lfd %L0,%L1\";
+ return \"lfd %0,%1\;lfd %L0,%Y1\";
case 2:
- return \"stfd %1,%0\;stfd %L1,%L0\";
+ return \"stfd %1,%0\;stfd %L1,%Y0\";
case 3:
case 4:
case 5:
@@ -8695,45 +8758,100 @@
(define_split
[(set (match_operand:TF 0 "gpc_reg_operand" "")
- (match_operand:TF 1 "const_double_operand" ""))]
- "DEFAULT_ABI == ABI_AIX && TARGET_HARD_FLOAT && TARGET_FPRS
- && TARGET_LONG_DOUBLE_128"
- [(set (match_dup 3) (match_dup 1))
- (set (match_dup 0)
- (float_extend:TF (match_dup 3)))]
+ (match_operand:TF 1 "easy_fp_constant" ""))]
+ "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+ && TARGET_HARD_FLOAT && TARGET_FPRS && ! TARGET_POWERPC64
+ && TARGET_LONG_DOUBLE_128 && reload_completed
+ && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
+ || (GET_CODE (operands[0]) == SUBREG
+ && GET_CODE (SUBREG_REG (operands[0])) == REG
+ && REGNO (SUBREG_REG (operands[0])) <= 31))"
+ [(set (match_dup 2) (match_dup 6))
+ (set (match_dup 3) (match_dup 7))
+ (set (match_dup 4) (match_dup 8))
+ (set (match_dup 5) (match_dup 9))]
"
{
- operands[2] = operand_subword (operands[1], 0, 0, DFmode);
- operands[3] = gen_reg_rtx (DFmode);
+ long l[4];
+ REAL_VALUE_TYPE rv;
+
+ REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, l);
+
+ operands[2] = operand_subword (operands[0], 0, 0, TFmode);
+ operands[3] = operand_subword (operands[0], 1, 0, TFmode);
+ operands[4] = operand_subword (operands[0], 2, 0, TFmode);
+ operands[5] = operand_subword (operands[0], 3, 0, TFmode);
+ operands[6] = gen_int_mode (l[0], SImode);
+ operands[7] = gen_int_mode (l[1], SImode);
+ operands[8] = gen_int_mode (l[2], SImode);
+ operands[9] = gen_int_mode (l[3], SImode);
}")
-(define_insn_and_split "extenddftf2"
+(define_split
+ [(set (match_operand:TF 0 "gpc_reg_operand" "")
+ (match_operand:TF 1 "easy_fp_constant" ""))]
+ "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+ && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_POWERPC64
+ && TARGET_LONG_DOUBLE_128 && reload_completed
+ && ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
+ || (GET_CODE (operands[0]) == SUBREG
+ && GET_CODE (SUBREG_REG (operands[0])) == REG
+ && REGNO (SUBREG_REG (operands[0])) <= 31))"
+ [(set (match_dup 2) (match_dup 4))
+ (set (match_dup 3) (match_dup 5))]
+ "
+{
+ long l[4];
+ REAL_VALUE_TYPE rv;
+ HOST_WIDE_INT val;
+
+ REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, l);
+
+ operands[2] = gen_lowpart (DImode, operands[0]);
+ operands[3] = gen_highpart (DImode, operands[0]);
+#if HOST_BITS_PER_WIDE_INT >= 64
+ val = ((HOST_WIDE_INT)(unsigned long)l[0] << 32
+ | ((HOST_WIDE_INT)(unsigned long)l[1]));
+ operands[4] = gen_int_mode (val, DImode);
+
+ val = ((HOST_WIDE_INT)(unsigned long)l[2] << 32
+ | ((HOST_WIDE_INT)(unsigned long)l[3]));
+ operands[5] = gen_int_mode (val, DImode);
+#else
+ operands[4] = immed_double_const (l[1], l[0], DImode);
+ operands[5] = immed_double_const (l[3], l[2], DImode);
+#endif
+}")
+
+(define_insn "extenddftf2"
[(set (match_operand:TF 0 "gpc_reg_operand" "=f")
(float_extend:TF (match_operand:DF 1 "gpc_reg_operand" "f")))]
"DEFAULT_ABI == ABI_AIX && TARGET_HARD_FLOAT && TARGET_FPRS
&& TARGET_LONG_DOUBLE_128"
- "#"
- ""
- [(set (match_dup 2) (match_dup 3))]
- "
+ "*
{
- operands[2] = gen_rtx_REG (DFmode, REGNO (operands[0] + 1));
- operands[3] = CONST0_RTX (DFmode);
-}")
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ return \"fsub %L0,%L0,%L0\";
+ else
+ return \"fmr %0,%1\;fsub %L0,%L0,%L0\";
+}"
+ [(set_attr "type" "fp")])
-(define_insn_and_split "extendsftf2"
+(define_insn "extendsftf2"
[(set (match_operand:TF 0 "gpc_reg_operand" "=f")
(float_extend:TF (match_operand:SF 1 "gpc_reg_operand" "f")))]
"DEFAULT_ABI == ABI_AIX && TARGET_HARD_FLOAT && TARGET_FPRS
&& TARGET_LONG_DOUBLE_128"
- "#"
- ""
- [(set (match_dup 2) (match_dup 3))]
- "
+ "*
{
- operands[2] = gen_rtx_REG (SFmode, REGNO (operands[0] + 1));
- operands[3] = CONST0_RTX (SFmode);
-}")
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ return \"fsub %L0,%L0,%L0\";
+ else
+ return \"fmr %0,%1\;fsub %L0,%L0,%L0\";
+}"
+ [(set_attr "type" "fp")])
(define_insn "trunctfdf2"
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
@@ -8767,8 +8885,8 @@
"#"
"&& reload_completed"
[(set (match_dup 2)
- (float:DF (match_operand:DI 1 "gpc_reg_operand" "")))
- (set (match_operand:TF 0 "gpc_reg_operand" "")
+ (float:DF (match_dup 1)))
+ (set (match_dup 0)
(float_extend:TF (match_dup 2)))]
"")
@@ -8781,34 +8899,36 @@
"#"
"&& reload_completed"
[(set (match_dup 2)
- (float:DF (match_operand:SI 1 "gpc_reg_operand" "")))
- (set (match_operand:TF 0 "gpc_reg_operand" "")
+ (float:DF (match_dup 1)))
+ (set (match_dup 0)
(float_extend:TF (match_dup 2)))]
"")
(define_insn_and_split "fix_trunctfdi2"
[(set (match_operand:DI 0 "gpc_reg_operand" "=*f")
- (fix:DI (match_operand:TF 1 "gpc_reg_operand" "f")))]
+ (fix:DI (match_operand:TF 1 "gpc_reg_operand" "f")))
+ (clobber (match_scratch:DF 2 "=f"))]
"DEFAULT_ABI == ABI_AIX && TARGET_POWERPC64
&& TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
"#"
"&& reload_completed"
[(set (match_dup 2)
- (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "")))
- (set (match_operand:DI 0 "gpc_reg_operand" "")
- (fix:SI (match_dup 2)))]
+ (float_truncate:DF (match_dup 1)))
+ (set (match_dup 0)
+ (fix:DI (match_dup 2)))]
"")
(define_insn_and_split "fix_trunctfsi2"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (fix:SI (match_operand:TF 1 "gpc_reg_operand" "f")))]
+ (fix:SI (match_operand:TF 1 "gpc_reg_operand" "f")))
+ (clobber (match_scratch:DF 2 "=f"))]
"DEFAULT_ABI == ABI_AIX && TARGET_HARD_FLOAT && TARGET_FPRS
&& TARGET_LONG_DOUBLE_128"
"#"
"&& reload_completed"
[(set (match_dup 2)
- (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "")))
- (set (match_operand:SI 0 "gpc_reg_operand" "")
+ (float_truncate:DF (match_dup 1)))
+ (set (match_dup 0)
(fix:SI (match_dup 2)))]
"")
@@ -8912,7 +9032,7 @@
}
}"
[(set_attr "type" "*,load,store,fp,fpload,fpstore,*,*,*,*,*")
- (set_attr "length" "8,8,8,*,*,*,8,12,8,12,16")])
+ (set_attr "length" "8,8,8,4,4,4,8,12,8,12,16")])
(define_split
[(set (match_operand:DI 0 "gpc_reg_operand" "")
@@ -9127,7 +9247,7 @@
}
}"
[(set_attr "type" "store,store,*,load,load")
- (set_attr "length" "*,16,16,*,16")])
+ (set_attr "length" "4,16,16,4,16")])
(define_insn "*movti_string"
[(set (match_operand:TI 0 "reg_or_mem_operand" "=m,????r,????r")
@@ -10153,7 +10273,7 @@
[(set (match_operand:SI 0 "register_operand" "=l")
(match_operand:SI 1 "immediate_operand" "s"))
(unspec [(match_dup 1)] 7)]
- "TARGET_ELF && flag_pic == 2"
+ "TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2"
"bl %1\\n%1:"
[(set_attr "type" "branch")
(set_attr "length" "4")])
@@ -10162,46 +10282,69 @@
[(set (match_operand:SI 0 "register_operand" "=l")
(match_operand:SI 1 "immediate_operand" "s"))
(unspec [(match_dup 1) (match_operand 2 "immediate_operand" "s")] 6)]
- "TARGET_ELF && flag_pic == 2"
+ "TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2"
"bl %1\\n\\t.long %2-%1+4\\n%1:"
[(set_attr "type" "branch")
(set_attr "length" "8")])
(define_insn "load_toc_v4_PIC_2"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
+ (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b")
(minus:SI (match_operand:SI 2 "immediate_operand" "s")
(match_operand:SI 3 "immediate_operand" "s")))))]
- "TARGET_ELF && flag_pic == 2"
+ "TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2"
"{l|lwz} %0,%2-%3(%1)"
[(set_attr "type" "load")])
(define_insn "load_macho_picbase"
[(set (match_operand:SI 0 "register_operand" "=l")
- (unspec:SI [(const_int 0)] 15))]
+ (unspec:SI [(match_operand:SI 1 "immediate_operand" "s")] 15))]
"(DEFAULT_ABI == ABI_DARWIN) && flag_pic"
- "*
-{
-#if TARGET_MACHO
- char *picbase = machopic_function_base_name ();
- operands[1] = gen_rtx_SYMBOL_REF (Pmode, ggc_alloc_string (picbase, -1));
-#endif
- return \"bcl 20,31,%1\\n%1:\";
-}"
+ "bcl 20,31,%1\\n%1:"
[(set_attr "type" "branch")
(set_attr "length" "4")])
+(define_insn "macho_correct_pic"
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+ (plus:SI (match_operand:SI 1 "gpc_reg_operand" "=r")
+ (unspec:SI [(match_operand:SI 2 "immediate_operand" "s")
+ (match_operand:SI 3 "immediate_operand" "s")]
+ 16)))]
+ "DEFAULT_ABI == ABI_DARWIN"
+ "addis %0,%1,ha16(%2-%3)\n\taddi %1,%1,lo16(%2-%3)"
+ [(set_attr "length" "8")])
+
;; If the TOC is shared over a translation unit, as happens with all
;; the kinds of PIC that we support, we need to restore the TOC
;; pointer only when jumping over units of translation.
+;; On Darwin, we need to reload the picbase.
(define_expand "builtin_setjmp_receiver"
[(use (label_ref (match_operand 0 "" "")))]
"(DEFAULT_ABI == ABI_V4 && flag_pic == 1)
- || (TARGET_TOC && TARGET_MINIMAL_TOC)"
+ || (TARGET_TOC && TARGET_MINIMAL_TOC)
+ || (DEFAULT_ABI == ABI_DARWIN && flag_pic)"
"
{
- rs6000_emit_load_toc_table (FALSE);
+#if TARGET_MACHO
+ if (DEFAULT_ABI == ABI_DARWIN)
+ {
+ char *picbase = machopic_function_base_name ();
+ rtx picrtx = gen_rtx_SYMBOL_REF (Pmode, ggc_alloc_string (picbase, -1));
+ rtx picreg = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
+ rtx tmplabrtx;
+ char tmplab[20];
+
+ ASM_GENERATE_INTERNAL_LABEL(tmplab, \"LSJR\",
+ CODE_LABEL_NUMBER (operands[0]));
+ tmplabrtx = gen_rtx_SYMBOL_REF (Pmode, ggc_alloc_string (tmplab, -1));
+
+ emit_insn (gen_load_macho_picbase (picreg, tmplabrtx));
+ emit_insn (gen_macho_correct_pic (picreg, picreg, picrtx, tmplabrtx));
+ }
+ else
+#endif
+ rs6000_emit_load_toc_table (FALSE);
DONE;
}")
@@ -10400,7 +10543,7 @@
}")
;; Call to function in current module. No TOC pointer reload needed.
-;; Operand2 is non-zero if we are using the V.4 calling sequence and
+;; Operand2 is nonzero if we are using the V.4 calling sequence and
;; either the function was not prototyped, or it was prototyped as a
;; variable argument function. It is > 0 if FP registers were passed
;; and < 0 if they were not.
@@ -10486,7 +10629,7 @@
;; Call to function which may be in another module. Restore the TOC
;; pointer (r2) after the call unless this is System V.
-;; Operand2 is non-zero if we are using the V.4 calling sequence and
+;; Operand2 is nonzero if we are using the V.4 calling sequence and
;; either the function was not prototyped, or it was prototyped as a
;; variable argument function. It is > 0 if FP registers were passed
;; and < 0 if they were not.
@@ -14016,7 +14159,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrsi_internal2"
[(set (pc)
@@ -14040,7 +14183,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrdi_internal1"
[(set (pc)
@@ -14064,7 +14207,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrdi_internal2"
[(set (pc)
@@ -14088,7 +14231,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
;; Similar, but we can use GE since we have a REG_NONNEG.
@@ -14114,7 +14257,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrsi_internal4"
[(set (pc)
@@ -14138,7 +14281,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrdi_internal3"
[(set (pc)
@@ -14162,7 +14305,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrdi_internal4"
[(set (pc)
@@ -14186,7 +14329,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
;; Similar but use EQ
@@ -14212,7 +14355,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrsi_internal6"
[(set (pc)
@@ -14236,7 +14379,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrdi_internal5"
[(set (pc)
@@ -14260,7 +14403,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
(define_insn "*ctrdi_internal6"
[(set (pc)
@@ -14284,7 +14427,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "4,12,16")])
;; Now the splitters if we could not allocate the CTR register
diff --git a/gcc/config/rs6000/spe.h b/gcc/config/rs6000/spe.h
index 2032eb74855..279806e71d6 100644
--- a/gcc/config/rs6000/spe.h
+++ b/gcc/config/rs6000/spe.h
@@ -779,15 +779,19 @@ __ev_get_s16_internal (__ev64_opaque__ a, uint32_t pos)
static inline __ev64_opaque__
__ev_set_acc_u64 (uint64_t a)
{
- __ev_mra (a);
- return (__ev64_opaque__) a;
+ __ev64_opaque__ ev32;
+ ev32 = __ev_create_u64 (a);
+ __ev_mra (ev32);
+ return ev32;
}
static inline __ev64_opaque__
__ev_set_acc_s64 (int64_t a)
{
- __ev_mra (a);
- return (__ev64_opaque__) a;
+ __ev64_opaque__ ev32;
+ ev32 = __ev_create_s64 (a);
+ __ev_mra (ev32);
+ return ev32;
}
static inline __ev64_opaque__
diff --git a/gcc/config/rs6000/spe.md b/gcc/config/rs6000/spe.md
index 58423c2fff3..c5132d73c0a 100644
--- a/gcc/config/rs6000/spe.md
+++ b/gcc/config/rs6000/spe.md
@@ -483,7 +483,7 @@
(unspec:V2SI [(match_operand:V2SI 1 "gpc_reg_operand" "r")
(match_operand:QI 2 "immediate_operand" "i")] 519))]
"TARGET_SPE"
- "evrlwi %0,%1"
+ "evrlwi %0,%1,%2"
[(set_attr "type" "vecsimple")
(set_attr "length" "4")])
@@ -2253,6 +2253,22 @@
evor %0,%1,%1"
[(set_attr "type" "vecload")])
+(define_expand "movv1di"
+ [(set (match_operand:V1DI 0 "nonimmediate_operand" "")
+ (match_operand:V1DI 1 "any_operand" ""))]
+ "TARGET_SPE"
+ "{ rs6000_emit_move (operands[0], operands[1], V1DImode); DONE; }")
+
+(define_insn "*movv1di_internal"
+ [(set (match_operand:V1DI 0 "nonimmediate_operand" "=m,r,r")
+ (match_operand:V1DI 1 "input_operand" "r,m,r"))]
+ "TARGET_SPE"
+ "@
+ evstdd%X0 %1,%y0
+ evldd%X1 %0,%y1
+ evor %0,%1,%1"
+ [(set_attr "type" "vecload")])
+
(define_expand "movv4hi"
[(set (match_operand:V4HI 0 "nonimmediate_operand" "")
(match_operand:V4HI 1 "any_operand" ""))]
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index 34cb80eeb26..cf9e59f8ca2 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -261,6 +261,8 @@ do { \
rs6000_sdata_name, rs6000_abi_name); \
} \
\
+ targetm.have_srodata_section = rs6000_sdata == SDATA_EABI; \
+ \
if (TARGET_RELOCATABLE && !TARGET_MINIMAL_TOC) \
{ \
target_flags |= MASK_MINIMAL_TOC; \
@@ -453,7 +455,7 @@ toc_section () \
{ \
toc_initialized = 1; \
fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP); \
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LCTOC", 0); \
+ (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0); \
fprintf (asm_out_file, "\t.tc "); \
ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],"); \
ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
@@ -549,7 +551,7 @@ fini_section () \
#define TARGET_ASM_SELECT_SECTION rs6000_elf_select_section
#define TARGET_ASM_UNIQUE_SECTION rs6000_elf_unique_section
-/* Return non-zero if this entry is to be written into the constant pool
+/* Return nonzero 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), we also do
this for floating-point constants. We actually can only do this
@@ -598,7 +600,7 @@ extern int rs6000_pic_labelno;
{ \
char buf[256]; \
\
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LCL", rs6000_pic_labelno); \
+ (*targetm.asm_out.internal_label) (FILE, "LCL", rs6000_pic_labelno); \
\
ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1); \
fprintf (FILE, "\t%s ", init_ptr); \
@@ -665,8 +667,7 @@ extern int rs6000_pic_labelno;
FUNCTION instead of jumping to it. The generic approach does not support
varargs. */
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
- output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
+#define TARGET_ASM_OUTPUT_MI_THUNK output_mi_thunk
/* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
flag. The LOCAL_LABEL_PREFIX variable is used by dbxelf.h. */
@@ -674,7 +675,7 @@ extern int rs6000_pic_labelno;
#define LOCAL_LABEL_PREFIX "."
#define USER_LABEL_PREFIX ""
-/* svr4.h overrides ASM_OUTPUT_INTERNAL_LABEL. */
+/* svr4.h overrides (*targetm.asm_out.internal_label). */
#define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX) \
asm_fprintf (FILE, "%L%s", PREFIX)
@@ -778,14 +779,16 @@ extern int fixuplabelno;
/* This is the end of what might become sysv4.h. */
/* Use DWARF 2 debugging information by default. */
-#undef PREFERRED_DEBUGGING_TYPE
-#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
/* Historically we have also supported stabs debugging. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
-#define TARGET_ENCODE_SECTION_INFO rs6000_elf_encode_section_info
-#define TARGET_STRIP_NAME_ENCODING rs6000_elf_strip_name_encoding
+#define TARGET_ENCODE_SECTION_INFO rs6000_elf_encode_section_info
+#define TARGET_STRIP_NAME_ENCODING rs6000_elf_strip_name_encoding
+#define TARGET_IN_SMALL_DATA_P rs6000_elf_in_small_data_p
+#define TARGET_SECTION_TYPE_FLAGS rs6000_elf_section_type_flags
/* The ELF version doesn't encode [DS] or whatever at the end of symbols. */
@@ -842,15 +845,15 @@ do { \
%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
-%{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
-%{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} \
-%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
- %{mcall-freebsd: -mbig} \
- %{mcall-i960-old: -mlittle} \
- %{mcall-linux: -mbig} \
- %{mcall-gnu: -mbig} \
- %{mcall-netbsd: -mbig} \
-}}}}"
+%{memb|msdata|msdata=eabi: -memb} \
+%{mlittle|mlittle-endian:-mlittle; \
+ mbig|mbig-endian :-mbig; \
+ mcall-aixdesc | \
+ mcall-freebsd | \
+ mcall-netbsd | \
+ mcall-linux | \
+ mcall-gnu :-mbig; \
+ mcall-i960-old :-mlittle}"
#define CC1_ENDIAN_BIG_SPEC ""
@@ -865,19 +868,15 @@ do { \
/* Pass -G xxx to the compiler and set correct endian mode. */
#define CC1_SPEC "%{G*} \
-%{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} \
-%{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} \
-%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
- %{mcall-aixdesc: -mbig %(cc1_endian_big) } \
- %{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-gnu: %{!mcall-netbsd: \
- %(cc1_endian_default) \
- }}}}}} \
-}}}} \
+%{mlittle|mlittle-endian: %(cc1_endian_little); \
+ mbig |mbig-endian : %(cc1_endian_big); \
+ mcall-aixdesc | \
+ mcall-freebsd | \
+ mcall-netbsd | \
+ mcall-linux | \
+ mcall-gnu : -mbig %(cc1_endian_big); \
+ mcall-i960-old : -mlittle %(cc1_endian_little); \
+ : %(cc1_endian_default)} \
%{mno-sdata: -msdata=none } \
%{meabi: %{!mcall-*: -mcall-sysv }} \
%{!meabi: %{!mno-eabi: \
@@ -910,18 +909,16 @@ do { \
/* Default starting address if specified. */
#define LINK_START_SPEC "\
-%{mads: %(link_start_ads) } \
-%{myellowknife: %(link_start_yellowknife) } \
-%{mmvme: %(link_start_mvme) } \
-%{msim: %(link_start_sim) } \
-%{mwindiss: %(link_start_windiss) } \
-%{mcall-freebsd: %(link_start_freebsd) } \
-%{mcall-linux: %(link_start_linux) } \
-%{mcall-gnu: %(link_start_gnu) } \
-%{mcall-netbsd: %(link_start_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \
- %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: \
- %{!mcall-freebsd: %(link_start_default) }}}}}}}}}"
+%{mads : %(link_start_ads) ; \
+ myellowknife : %(link_start_yellowknife) ; \
+ mmvme : %(link_start_mvme) ; \
+ msim : %(link_start_sim) ; \
+ mwindiss : %(link_start_windiss) ; \
+ mcall-freebsd: %(link_start_freebsd) ; \
+ mcall-linux : %(link_start_linux) ; \
+ mcall-gnu : %(link_start_gnu) ; \
+ mcall-netbsd : %(link_start_netbsd) ; \
+ : %(link_start_default) }"
#define LINK_START_DEFAULT_SPEC ""
@@ -969,18 +966,16 @@ do { \
/* Any specific OS flags. */
#define LINK_OS_SPEC "\
-%{mads: %(link_os_ads) } \
-%{myellowknife: %(link_os_yellowknife) } \
-%{mmvme: %(link_os_mvme) } \
-%{msim: %(link_os_sim) } \
-%{mwindiss: %(link_os_windiss) } \
-%{mcall-freebsd: %(link_os_freebsd) } \
-%{mcall-linux: %(link_os_linux) } \
-%{mcall-gnu: %(link_os_gnu) } \
-%{mcall-netbsd: %(link_os_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \
- %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \
- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}"
+%{mads : %(link_os_ads) ; \
+ myellowknife : %(link_os_yellowknife) ; \
+ mmvme : %(link_os_mvme) ; \
+ msim : %(link_os_sim) ; \
+ mwindiss : %(link_os_windiss) ; \
+ mcall-freebsd: %(link_os_freebsd) ; \
+ mcall-linux : %(link_os_linux) ; \
+ mcall-gnu : %(link_os_gnu) ; \
+ mcall-netbsd : %(link_os_netbsd) ; \
+ : %(link_os_default) }"
#define LINK_OS_DEFAULT_SPEC ""
@@ -992,74 +987,65 @@ do { \
/* Override rs6000.h definition. */
#undef CPP_SPEC
#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} %(cpp_sysv) \
-%{mads: %(cpp_os_ads) } \
-%{myellowknife: %(cpp_os_yellowknife) } \
-%{mmvme: %(cpp_os_mvme) } \
-%{msim: %(cpp_os_sim) } \
-%{mwindiss: %(cpp_os_windiss) } \
-%{mcall-freebsd: %(cpp_os_freebsd) } \
-%{mcall-linux: %(cpp_os_linux) } \
-%{mcall-gnu: %(cpp_os_gnu) } \
-%{mcall-netbsd: %(cpp_os_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \
- %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \
- %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}}"
+%{mads : %(cpp_os_ads) ; \
+ myellowknife : %(cpp_os_yellowknife) ; \
+ mmvme : %(cpp_os_mvme) ; \
+ msim : %(cpp_os_sim) ; \
+ mwindiss : %(cpp_os_windiss) ; \
+ mcall-freebsd: %(cpp_os_freebsd) ; \
+ mcall-linux : %(cpp_os_linux) ; \
+ mcall-gnu : %(cpp_os_gnu) ; \
+ mcall-netbsd : %(cpp_os_netbsd) ; \
+ : %(cpp_os_default) }"
#define CPP_OS_DEFAULT_SPEC ""
/* Override svr4.h definition. */
#undef STARTFILE_SPEC
#define STARTFILE_SPEC "\
-%{mads: %(startfile_ads) } \
-%{myellowknife: %(startfile_yellowknife) } \
-%{mmvme: %(startfile_mvme) } \
-%{msim: %(startfile_sim) } \
-%{mwindiss: %(startfile_windiss) } \
-%{mcall-freebsd: %(startfile_freebsd) } \
-%{mcall-linux: %(startfile_linux) } \
-%{mcall-gnu: %(startfile_gnu) } \
-%{mcall-netbsd: %(startfile_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \
- %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \
- %{!mcall-netbsd: %(startfile_default) }}}}}}}}}"
+%{mads : %(startfile_ads) ; \
+ myellowknife : %(startfile_yellowknife) ; \
+ mmvme : %(startfile_mvme) ; \
+ msim : %(startfile_sim) ; \
+ mwindiss : %(startfile_windiss) ; \
+ mcall-freebsd: %(startfile_freebsd) ; \
+ mcall-linux : %(startfile_linux) ; \
+ mcall-gnu : %(startfile_gnu) ; \
+ mcall-netbsd : %(startfile_netbsd) ; \
+ : %(startfile_default) }"
#define STARTFILE_DEFAULT_SPEC ""
/* Override svr4.h definition. */
#undef LIB_SPEC
#define LIB_SPEC "\
-%{mads: %(lib_ads) } \
-%{myellowknife: %(lib_yellowknife) } \
-%{mmvme: %(lib_mvme) } \
-%{msim: %(lib_sim) } \
-%{mwindiss: %(lib_windiss) } \
-%{mcall-freebsd: %(lib_freebsd) } \
-%{mcall-linux: %(lib_linux) } \
-%{mcall-gnu: %(lib_gnu) } \
-%{mcall-netbsd: %(lib_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \
- %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \
- %{!mcall-netbsd: %(lib_default) }}}}}}}}}"
+%{mads : %(lib_ads) ; \
+ myellowknife : %(lib_yellowknife) ; \
+ mmvme : %(lib_mvme) ; \
+ msim : %(lib_sim) ; \
+ mwindiss : %(lib_windiss) ; \
+ mcall-freebsd: %(lib_freebsd) ; \
+ mcall-linux : %(lib_linux) ; \
+ mcall-gnu : %(lib_gnu) ; \
+ mcall-netbsd : %(lib_netbsd) ; \
+ : %(lib_default) }"
#define LIB_DEFAULT_SPEC ""
/* Override svr4.h definition. */
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "\
-%{mads: crtsavres.o%s %(endfile_ads)} \
-%{myellowknife: crtsavres.o%s %(endfile_yellowknife)} \
-%{mmvme: crtsavres.o%s %(endfile_mvme)} \
-%{msim: crtsavres.o%s %(endfile_sim)} \
-%{mwindiss: %(endfile_windiss)} \
-%{mcall-freebsd: crtsavres.o%s %(endfile_freebsd) } \
-%{mcall-linux: crtsavres.o%s %(endfile_linux) } \
-%{mcall-gnu: crtsavres.o%s %(endfile_gnu) } \
-%{mcall-netbsd: crtsavres.o%s %(endfile_netbsd) } \
-%{mvxworks: crtsavres.o%s %(endfile_vxworks) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \
- %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \
- %{!mcall-netbsd: %{!mvxworks: %(crtsavres_default) \
- %(endfile_default) }}}}}}}}}}"
+%{mads : crtsavres.o%s %(endfile_ads) ; \
+ myellowknife : crtsavres.o%s %(endfile_yellowknife) ; \
+ mmvme : crtsavres.o%s %(endfile_mvme) ; \
+ msim : crtsavres.o%s %(endfile_sim) ; \
+ mwindiss : %(endfile_windiss) ; \
+ mcall-freebsd: crtsavres.o%s %(endfile_freebsd) ; \
+ mcall-linux : crtsavres.o%s %(endfile_linux) ; \
+ mcall-gnu : crtsavres.o%s %(endfile_gnu) ; \
+ mcall-netbsd : crtsavres.o%s %(endfile_netbsd) ; \
+ mvxworks : crtsavres.o%s %(endfile_vxworks) ; \
+ : %(crtsavres_default) %(endfile_default) }"
#define CRTSAVRES_DEFAULT_SPEC "crtsavres.o%s"
@@ -1397,7 +1383,7 @@ ncrtn.o%s"
pack(pop)'. The pack(push,<n>) pragma specifies the maximum
alignment (in bytes) of fields within a structure, in much the
same way as the __aligned__' and __packed__' __attribute__'s
- do. A pack value of zero resets the behaviour to the default.
+ do. A pack value of zero resets the behavior to the default.
Successive invocations of this pragma cause the previous values to
be stacked, so that invocations of #pragma pack(pop)' will return
to the previous value. */
diff --git a/gcc/config/rs6000/t-aix52 b/gcc/config/rs6000/t-aix52
new file mode 100644
index 00000000000..97e1e079508
--- /dev/null
+++ b/gcc/config/rs6000/t-aix52
@@ -0,0 +1,52 @@
+# 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
+
+dp-bit.c: $(srcdir)/config/fp-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
+ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
+
+# Build the libraries for pthread and all of the
+# different processor models
+
+MULTILIB_OPTIONS = pthread maix64
+
+MULTILIB_DIRNAMES = pthread ppc64
+
+MULTILIB_MATCHES =
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
+# Build a shared libgcc library.
+SHLIB_EXT = .a
+SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
+ -Wl,-bE:@shlib_map_file@ -o @multilib_dir@/shr.o \
+ @multilib_flags@ @shlib_objs@ -lc \
+ `case @shlib_base_name@ in \
+ *pthread*) echo -L/usr/lib/threads -lpthreads -lc_r /usr/lib/libc.a ;; \
+ *) echo -lc ;; esac` ; \
+ rm -f tmp-@shlib_base_name@.a ; \
+ $(AR_CREATE_FOR_TARGET) tmp-@shlib_base_name@.a @multilib_dir@/shr.o ; \
+ mv tmp-@shlib_base_name@.a @shlib_base_name@.a ; \
+ rm -f @multilib_dir@/shr.o
+# $(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_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 -X32_64
+
+# Either 32-bit and 64-bit objects in archives.
+AR_FLAGS_FOR_TARGET = -X32_64
+
+# Compile Ada files with minimal-toc. The primary focus is gnatlib, so
+# that the library does not use nearly the entire TOC of applications
+# until gnatlib is built as a shared library on AIX. Compiling the
+# compiler with -mminimal-toc does not cause any harm.
+T_ADAFLAGS = -mminimal-toc
diff --git a/gcc/config/rs6000/xcoff.h b/gcc/config/rs6000/xcoff.h
index 339b25c243a..5058d813986 100644
--- a/gcc/config/rs6000/xcoff.h
+++ b/gcc/config/rs6000/xcoff.h
@@ -23,7 +23,7 @@ Boston, MA 02111-1307, USA. */
#define TARGET_OBJECT_FORMAT OBJECT_XCOFF
/* The RS/6000 uses the XCOFF format. */
-#define XCOFF_DEBUGGING_INFO
+#define XCOFF_DEBUGGING_INFO 1
/* Define if the object format being used is COFF or a superset. */
#define OBJECT_FORMAT_COFF
@@ -135,9 +135,7 @@ toc_section () \
#define READONLY_DATA_SECTION read_only_data_section
-#define TARGET_ASM_SELECT_SECTION rs6000_xcoff_select_section
-
-/* Return non-zero if this entry is to be written into the constant
+/* Return nonzero 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),
we also do this for floating-point constants. We actually can only
@@ -161,9 +159,14 @@ toc_section () \
|| (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
&& ! TARGET_NO_FP_IN_TOC)))))
+#define TARGET_ASM_GLOBALIZE_LABEL rs6000_xcoff_asm_globalize_label
+#define TARGET_ASM_NAMED_SECTION rs6000_xcoff_asm_named_section
+#define TARGET_ASM_SELECT_SECTION rs6000_xcoff_select_section
#define TARGET_ASM_SELECT_RTX_SECTION rs6000_xcoff_select_rtx_section
-#define TARGET_ENCODE_SECTION_INFO rs6000_xcoff_encode_section_info
-#define TARGET_STRIP_NAME_ENCODING rs6000_xcoff_strip_name_encoding
+#define TARGET_ASM_UNIQUE_SECTION rs6000_xcoff_unique_section
+#define TARGET_ENCODE_SECTION_INFO rs6000_xcoff_encode_section_info
+#define TARGET_STRIP_NAME_ENCODING rs6000_xcoff_strip_name_encoding
+#define TARGET_SECTION_TYPE_FLAGS rs6000_xcoff_section_type_flags
/* FP save and restore routines. */
#define SAVE_FP_PREFIX "._savef"
@@ -263,7 +266,7 @@ toc_section () \
#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL) \
{ rtx sym_ref = XEXP (DECL_RTL (DECL), 0); \
- if (!DECL_WEAK (DECL)) \
+ if ((*targetm.binds_local_p) (DECL)) \
SYMBOL_REF_FLAG (sym_ref) = 1; \
if (TREE_PUBLIC (DECL)) \
{ \
@@ -318,12 +321,6 @@ toc_section () \
} \
}
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s..%u:\n", (PREFIX), (unsigned) (NUM))
-
/* This is how to output an internal label prefix. rs6000.c uses this
when generating traceback tables. */
@@ -331,11 +328,11 @@ toc_section () \
fprintf (FILE, "%s..", PREFIX)
/* This is how to output a label for a jump table. Arguments are the same as
- for ASM_OUTPUT_INTERNAL_LABEL, except the insn for the jump table is
+ for (*targetm.asm_out.internal_label), except the insn for the jump table is
passed. */
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
-{ ASM_OUTPUT_ALIGN (FILE, 2); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
+{ ASM_OUTPUT_ALIGN (FILE, 2); (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); }
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
@@ -406,22 +403,11 @@ toc_section () \
/* Output before instructions. */
#define TEXT_SECTION_ASM_OP "\t.csect .text[PR]"
-#define HOT_TEXT_SECTION_NAME ".text[PR]"
-#define UNLIKELY_EXECUTED_TEXT_SECTION_NAME ".text[PR]"
/* Output before writable data.
Align entire section to BIGGEST_ALIGNMENT. */
#define DATA_SECTION_ASM_OP "\t.csect .data[RW],3"
-/* Define unique section name -- functions only. */
-#define TARGET_ASM_UNIQUE_SECTION rs6000_xcoff_unique_section
-
-/* Switch into a generic section. */
-#define TARGET_ASM_NAMED_SECTION rs6000_xcoff_asm_named_section
-
-/* Globalize a label. */
-#define TARGET_ASM_GLOBALIZE_LABEL rs6000_xcoff_asm_globalize_label
-
/* Define the name of the section to use for the EH language specific
data areas (.gcc_except_table on most other systems). */
#define TARGET_ASM_EXCEPTION_SECTION data_section
diff --git a/gcc/config/s390/linux.h b/gcc/config/s390/linux.h
index 0907d290c1a..b94f0b9d8f2 100644
--- a/gcc/config/s390/linux.h
+++ b/gcc/config/s390/linux.h
@@ -126,162 +126,6 @@ Boston, MA 02111-1307, USA. */
{ "link_arch64", LINK_ARCH64_SPEC }, \
-/* Character to start a comment. */
-
-#define ASM_COMMENT_START "#"
-
-
-/* Assembler pseudos to introduce constants of various size. */
-
-#define ASM_DOUBLE "\t.double"
-
-/* The LOCAL_LABEL_PREFIX variable is used by dbxelf.h. */
-#define LOCAL_LABEL_PREFIX "."
-
-/* Prefix for internally generated assembler labels. */
-#define LPREFIX ".L"
-
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#undef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
-
- /* internal macro to output long */
-#define _ASM_OUTPUT_LONG(FILE, VALUE) \
- fprintf (FILE, "\t.long\t0x%lX\n", VALUE);
-
-
-/* This is how to output an element of a case-vector that is absolute. */
-
-#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
- fprintf (FILE, "%s%s%d\n", integer_asm_op (UNITS_PER_WORD, TRUE), \
- LPREFIX, VALUE)
-
-/* This is how to output an element of a case-vector that is relative. */
-
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
- fprintf (FILE, "%s%s%d-%s%d\n", integer_asm_op (UNITS_PER_WORD, TRUE), \
- LPREFIX, VALUE, LPREFIX, REL)
-
-
-
-/* This is how to output an assembler line
- that says to advance the location counter
- to a multiple of 2**LOG bytes. */
-
-#undef ASM_OUTPUT_ALIGN
-#define ASM_OUTPUT_ALIGN(FILE, LOG) \
- if ((LOG)!=0) fprintf ((FILE), "\t.align\t%d\n", 1<<(LOG))
-
-/* This is how to output an assembler line
- that says to advance the location counter by SIZE bytes. */
-
-#undef ASM_OUTPUT_SKIP
-#define ASM_OUTPUT_SKIP(FILE, SIZE) \
- fprintf ((FILE), "\t.set\t.,.+%u\n", (SIZE))
-
-/* This is how to output assembler code to declare an
- uninitialized external linkage data object. */
-
-#undef ASM_OUTPUT_ALIGNED_BSS
-#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
- asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
-
-/* Output before read-only data. */
-
-#define TEXT_SECTION_ASM_OP ".text"
-
-/* Output before writable (initialized) data. */
-
-#define DATA_SECTION_ASM_OP ".data"
-
-/* Output before writable (uninitialized) data. */
-
-#define BSS_SECTION_ASM_OP ".bss"
-
-/* This is how to output a command to make the user-level label named NAME
- defined for reference from other files. */
-
-/* Globalizing directive for a label. */
-#define GLOBAL_ASM_OP ".globl "
-
-/* 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) \
-do { \
- if (TARGET_64BIT) \
- { \
- if (flag_pic) \
- { \
- fprintf (FILE, "\tlarl 1,0f\n"); \
- fprintf (FILE, "\tagf %d,0(1)\n", \
- aggregate_value_p (TREE_TYPE \
- (TREE_TYPE (FUNCTION))) ? 3 :2 ); \
- fprintf (FILE, "\tlarl 1,"); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "@GOTENT\n"); \
- fprintf (FILE, "\tlg 1,0(1)\n"); \
- fprintf (FILE, "\tbr 1\n"); \
- fprintf (FILE, "0:\t.long "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, "\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tlarl 1,0f\n"); \
- fprintf (FILE, "\tagf %d,0(1)\n", \
- aggregate_value_p (TREE_TYPE \
- (TREE_TYPE (FUNCTION))) ? 3 :2 ); \
- fprintf (FILE, "\tjg "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "\n"); \
- fprintf (FILE, "0:\t.long "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, "\n"); \
- } \
- } \
- else \
- { \
- if (flag_pic) \
- { \
- fprintf (FILE, "\tbras 1,0f\n"); \
- fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_-.\n"); \
- fprintf (FILE, "\t.long "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "@GOT\n"); \
- fprintf (FILE, "\t.long "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, "\n"); \
- fprintf (FILE, "0:\tal %d,8(1)\n", \
- aggregate_value_p (TREE_TYPE \
- (TREE_TYPE (FUNCTION))) ? 3 : 2 ); \
- fprintf (FILE, "\tl 0,4(1)\n"); \
- fprintf (FILE, "\tal 1,0(1)\n"); \
- fprintf (FILE, "\talr 1,0\n"); \
- fprintf (FILE, "\tl 1,0(1)\n"); \
- fprintf (FILE, "\tbr 1\n"); \
- } else { \
- fprintf (FILE, "\tbras 1,0f\n"); \
- fprintf (FILE, "\t.long "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "-.\n"); \
- fprintf (FILE, "\t.long "); \
- fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, (DELTA)); \
- fprintf (FILE, "\n"); \
- fprintf (FILE, "0:\tal %d,4(1)\n", \
- aggregate_value_p (TREE_TYPE \
- (TREE_TYPE (FUNCTION))) ? 3 : 2 ); \
- fprintf (FILE, "\tal 1,0(1)\n"); \
- fprintf (FILE, "\tbr 1\n"); \
- } \
- } \
-} while (0)
-
/* Do code reading to identify a signal frame, and set the frame
state data appropriately. See unwind-dw2.c for the structs. */
diff --git a/gcc/config/s390/s390-modes.def b/gcc/config/s390/s390-modes.def
index db577aa90ae..9f9d5265720 100644
--- a/gcc/config/s390/s390-modes.def
+++ b/gcc/config/s390/s390-modes.def
@@ -23,6 +23,8 @@ Boston, MA 02111-1307, USA. */
CC (CCZ)
CC (CCA)
+CC (CCAP)
+CC (CCAN)
CC (CCL)
CC (CCL1)
CC (CCL2)
diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h
index 38c5c0b2035..09822bcabc3 100644
--- a/gcc/config/s390/s390-protos.h
+++ b/gcc/config/s390/s390-protos.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for IBM S/390.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
Contributed by Hartmut Penner (hpenner@de.ibm.com)
This file is part of GNU CC.
@@ -24,13 +24,12 @@ Boston, MA 02111-1307, USA. */
extern void optimization_options PARAMS ((int, int));
extern void override_options PARAMS ((void));
extern int s390_arg_frame_offset PARAMS ((void));
-extern void s390_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
-extern void s390_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
extern void s390_emit_prologue PARAMS ((void));
extern void s390_emit_epilogue PARAMS ((void));
extern void s390_function_profiler PARAMS ((FILE *, int));
#ifdef RTX_CODE
+extern int s390_address_cost PARAMS ((rtx));
extern int q_constraint PARAMS ((rtx));
extern int const0_operand PARAMS ((rtx, enum machine_mode));
extern int consttable_operand PARAMS ((rtx, enum machine_mode));
@@ -51,7 +50,7 @@ extern enum machine_mode s390_tm_ccmode PARAMS ((rtx, rtx, int));
extern enum machine_mode s390_select_ccmode PARAMS ((enum rtx_code, rtx, rtx));
extern int symbolic_reference_mentioned_p PARAMS ((rtx));
extern int legitimate_la_operand_p PARAMS ((rtx));
-extern rtx legitimize_la_operand PARAMS ((rtx));
+extern int preferred_la_operand_p PARAMS ((rtx, int));
extern int legitimate_pic_operand_p PARAMS ((rtx));
extern int legitimate_constant_p PARAMS ((rtx));
extern int legitimate_reload_constant_p PARAMS ((rtx));
@@ -63,6 +62,10 @@ extern enum reg_class s390_secondary_input_reload_class PARAMS ((enum reg_class,
extern int s390_plus_operand PARAMS ((rtx, enum machine_mode));
extern void s390_expand_plus_operand PARAMS ((rtx, rtx, rtx));
extern void emit_pic_move PARAMS ((rtx *, enum machine_mode));
+extern void s390_load_address PARAMS ((rtx, rtx));
+extern void s390_expand_movstr PARAMS ((rtx, rtx, rtx));
+extern void s390_expand_clrstr PARAMS ((rtx, rtx));
+extern void s390_expand_cmpstr PARAMS ((rtx, rtx, rtx, rtx));
extern void s390_output_symbolic_const PARAMS ((FILE *, rtx));
extern void print_operand_address PARAMS ((FILE *, rtx));
@@ -72,6 +75,7 @@ extern void s390_trampoline_template PARAMS ((FILE *));
extern void s390_initialize_trampoline PARAMS ((rtx, rtx, rtx));
extern rtx s390_gen_rtx_const_DI PARAMS ((int, int));
extern rtx s390_simplify_dwarf_addr PARAMS ((rtx));
+extern void s390_machine_dependent_reorg PARAMS ((rtx));
#endif /* RTX_CODE */
#ifdef TREE_CODE
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 85952c5bacb..b0e63d26ed4 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -46,6 +46,7 @@ Boston, MA 02111-1307, USA. */
#include "target-def.h"
#include "debug.h"
#include "langhooks.h"
+#include "optabs.h"
static bool s390_assemble_integer PARAMS ((rtx, unsigned int, int));
static int s390_adjust_cost PARAMS ((rtx, rtx, rtx, int));
@@ -53,6 +54,7 @@ static int s390_adjust_priority PARAMS ((rtx, int));
static void s390_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT));
static void s390_encode_section_info PARAMS ((tree, int));
+static void s390_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
#undef TARGET_ASM_ALIGNED_HI_OP
#define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
@@ -61,12 +63,6 @@ static void s390_encode_section_info PARAMS ((tree, int));
#undef TARGET_ASM_INTEGER
#define TARGET_ASM_INTEGER s390_assemble_integer
-#undef TARGET_ASM_FUNCTION_PROLOGUE
-#define TARGET_ASM_FUNCTION_PROLOGUE s390_function_prologue
-
-#undef TARGET_ASM_FUNCTION_EPILOGUE
-#define TARGET_ASM_FUNCTION_EPILOGUE s390_function_epilogue
-
#undef TARGET_ASM_OPEN_PAREN
#define TARGET_ASM_OPEN_PAREN ""
@@ -85,6 +81,9 @@ static void s390_encode_section_info PARAMS ((tree, int));
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO s390_encode_section_info
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK s390_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
extern int reload_completed;
@@ -92,9 +91,6 @@ extern int reload_completed;
/* The alias set for prologue/epilogue register save/restore. */
static int s390_sr_alias_set = 0;
-/* Function count for creating unique internal labels in a compile unit. */
-int s390_function_count = 0;
-
/* Save information from a "cmpxx" operation until the branch or scc is
emitted. */
rtx s390_compare_op0, s390_compare_op1;
@@ -121,7 +117,6 @@ struct s390_address
struct s390_frame
{
int frame_pointer_p;
- int return_reg_saved_p;
int save_fprs_p;
int first_save_gpr;
int first_restore_gpr;
@@ -136,18 +131,23 @@ static int s390_branch_condition_mask PARAMS ((rtx));
static const char *s390_branch_condition_mnemonic PARAMS ((rtx, int));
static int check_mode PARAMS ((rtx, enum machine_mode *));
static int general_s_operand PARAMS ((rtx, enum machine_mode, int));
-static int s390_decompose_address PARAMS ((rtx, struct s390_address *, int));
+static int s390_decompose_address PARAMS ((rtx, struct s390_address *));
static int reg_used_in_mem_p PARAMS ((int, rtx));
static int addr_generation_dependency_p PARAMS ((rtx, rtx));
-static void s390_split_branches PARAMS ((void));
+static int s390_split_branches PARAMS ((rtx, bool *));
static void find_constant_pool_ref PARAMS ((rtx, rtx *));
static void replace_constant_pool_ref PARAMS ((rtx *, rtx, rtx));
-static void s390_chunkify_pool PARAMS ((void));
-static int save_fprs_p PARAMS ((void));
+static int find_base_register_in_addr PARAMS ((struct s390_address *));
+static bool find_base_register_ref PARAMS ((rtx));
+static void replace_base_register_ref PARAMS ((rtx *, rtx));
+static void s390_optimize_prolog PARAMS ((int));
+static bool s390_fixup_clobbered_return_reg PARAMS ((rtx));
static int find_unused_clobbered_reg PARAMS ((void));
static void s390_frame_info PARAMS ((struct s390_frame *));
static rtx save_fpr PARAMS ((rtx, int, int));
static rtx restore_fpr PARAMS ((rtx, int, int));
+static rtx save_gprs PARAMS ((rtx, int, int, int));
+static rtx restore_gprs PARAMS ((rtx, int, int, int));
static int s390_function_arg_size PARAMS ((enum machine_mode, tree));
@@ -190,6 +190,12 @@ s390_match_ccmode_set (set, req_mode)
&& req_mode != CCSRmode && req_mode != CCURmode)
return 0;
break;
+
+ case CCAPmode:
+ case CCANmode:
+ if (req_mode != CCAmode)
+ return 0;
+ break;
default:
abort ();
@@ -282,6 +288,9 @@ s390_select_ccmode (code, op0, op1)
{
case EQ:
case NE:
+ if (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 1)) == CONST_INT
+ && CONST_OK_FOR_LETTER_P (INTVAL (XEXP (op0, 1)), 'K'))
+ return CCAPmode;
if (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
|| GET_CODE (op1) == NEG)
return CCLmode;
@@ -314,6 +323,14 @@ s390_select_ccmode (code, op0, op1)
case LT:
case GE:
case GT:
+ if (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 1)) == CONST_INT
+ && CONST_OK_FOR_LETTER_P (INTVAL (XEXP (op0, 1)), 'K'))
+ {
+ if (INTVAL (XEXP((op0), 1)) < 0)
+ return CCANmode;
+ else
+ return CCAPmode;
+ }
case UNORDERED:
case ORDERED:
case UNEQ:
@@ -469,6 +486,34 @@ s390_branch_condition_mask (code)
}
break;
+ case CCAPmode:
+ switch (GET_CODE (code))
+ {
+ case EQ: return CC0;
+ case NE: return CC1 | CC2 | CC3;
+ case LT: return CC1 | CC3;
+ case GT: return CC2;
+ case LE: return CC0 | CC1 | CC3;
+ case GE: return CC0 | CC2;
+ default:
+ abort ();
+ }
+ break;
+
+ case CCANmode:
+ switch (GET_CODE (code))
+ {
+ case EQ: return CC0;
+ case NE: return CC1 | CC2 | CC3;
+ case LT: return CC1;
+ case GT: return CC2 | CC3;
+ case LE: return CC0 | CC1;
+ case GE: return CC0 | CC2 | CC3;
+ default:
+ abort ();
+ }
+ break;
+
case CCSmode:
switch (GET_CODE (code))
{
@@ -759,18 +804,13 @@ s390_extract_qi (op, mode, part)
LEVEL is the optimization level specified; 2 if `-O2' is
specified, 1 if `-O' is specified, and 0 if neither is specified.
- SIZE is non-zero if `-Os' is specified and zero otherwise. */
+ SIZE is nonzero if `-Os' is specified and zero otherwise. */
void
optimization_options (level, size)
int level ATTRIBUTE_UNUSED;
int size ATTRIBUTE_UNUSED;
{
-#ifdef HAVE_decrement_and_branch_on_count
- /* When optimizing, enable use of BRCT instruction. */
- if (level >= 1)
- flag_branch_on_count_reg = 1;
-#endif
}
void
@@ -957,7 +997,7 @@ general_s_operand (op, mode, allow_immediate)
case MEM:
if (GET_CODE (XEXP (op, 0)) == ADDRESSOF)
return 1;
- if (s390_decompose_address (XEXP (op, 0), &addr, FALSE)
+ if (s390_decompose_address (XEXP (op, 0), &addr)
&& !addr.indx)
return 1;
break;
@@ -1008,7 +1048,7 @@ q_constraint (op)
if (GET_CODE (op) != MEM)
return 0;
- if (!s390_decompose_address (XEXP (op, 0), &addr, FALSE))
+ if (!s390_decompose_address (XEXP (op, 0), &addr))
return 0;
if (addr.indx)
@@ -1017,6 +1057,19 @@ q_constraint (op)
return 1;
}
+/* Return the cost of an address rtx ADDR. */
+
+int
+s390_address_cost (addr)
+ rtx addr;
+{
+ struct s390_address ad;
+ if (!s390_decompose_address (addr, &ad))
+ return 1000;
+
+ return ad.indx? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
+}
+
/* Return true if OP is a valid operand for the BRAS instruction.
OP is the current operation.
MODE is the current operation mode. */
@@ -1269,15 +1322,6 @@ legitimate_reload_constant_p (op)
&& larl_operand (op, VOIDmode))
return 1;
- /* If reload is completed, and we do not already have a
- literal pool, and OP must be forced to the literal
- pool, then something must have gone wrong earlier.
- We *cannot* force the constant any more, because the
- prolog generation already decided we don't need to
- set up the base register. */
- if (reload_completed && !regs_ever_live[BASE_REGISTER])
- abort ();
-
/* Everything else cannot be handled without reload. */
return 0;
}
@@ -1382,21 +1426,13 @@ s390_plus_operand (op, mode)
SCRATCH may be used as scratch register. */
void
-s390_expand_plus_operand (target, src, scratch_in)
+s390_expand_plus_operand (target, src, scratch)
register rtx target;
register rtx src;
- register rtx scratch_in;
+ register rtx scratch;
{
- rtx sum1, sum2, scratch;
-
- /* ??? reload apparently does not ensure that the scratch register
- and the target do not overlap. We absolutely require this to be
- the case, however. Therefore the reload_in[sd]i patterns ask for
- a double-sized scratch register, and if one part happens to be
- equal to the target, we use the other one. */
- scratch = gen_rtx_REG (Pmode, REGNO (scratch_in));
- if (rtx_equal_p (scratch, target))
- scratch = gen_rtx_REG (Pmode, REGNO (scratch_in) + 1);
+ rtx sum1, sum2;
+ struct s390_address ad;
/* src must be a PLUS; get its two operands. */
if (GET_CODE (src) != PLUS || GET_MODE (src) != Pmode)
@@ -1407,67 +1443,49 @@ s390_expand_plus_operand (target, src, scratch_in)
float registers occur in an address. */
sum1 = find_replacement (&XEXP (src, 0));
sum2 = find_replacement (&XEXP (src, 1));
-
- /* Accept already valid addresses. */
src = gen_rtx_PLUS (Pmode, sum1, sum2);
- if (s390_decompose_address (src, NULL, 1))
- {
- src = legitimize_la_operand (src);
- emit_insn (gen_rtx_SET (VOIDmode, target, src));
- return;
- }
- /* If one of the two operands is equal to the target,
- make it the first one. If one is a constant, make
- it the second one. */
- if (rtx_equal_p (target, sum2)
- || GET_CODE (sum1) == CONST_INT)
+ /* If the address is already strictly valid, there's nothing to do. */
+ if (!s390_decompose_address (src, &ad)
+ || (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base))
+ || (ad.indx && !REG_OK_FOR_INDEX_STRICT_P (ad.indx)))
{
- rtx tem = sum2;
- sum2 = sum1;
- sum1 = tem;
- }
+ /* Otherwise, one of the operands cannot be an address register;
+ we reload its value into the scratch register. */
+ if (true_regnum (sum1) < 1 || true_regnum (sum1) > 15)
+ {
+ emit_move_insn (scratch, sum1);
+ sum1 = scratch;
+ }
+ if (true_regnum (sum2) < 1 || true_regnum (sum2) > 15)
+ {
+ emit_move_insn (scratch, sum2);
+ sum2 = scratch;
+ }
- /* If the first operand is not an address register,
- we reload it into the target. */
- if (true_regnum (sum1) < 1 || true_regnum (sum1) > 15)
- {
- emit_move_insn (target, sum1);
- sum1 = target;
- }
+ /* According to the way these invalid addresses are generated
+ in reload.c, it should never happen (at least on s390) that
+ *neither* of the PLUS components, after find_replacements
+ was applied, is an address register. */
+ if (sum1 == scratch && sum2 == scratch)
+ {
+ debug_rtx (src);
+ abort ();
+ }
- /* Likewise for the second operand. However, take
- care not to clobber the target if we already used
- it for the first operand. Use the scratch instead.
- Also, allow an immediate offset if it is in range. */
- if ((true_regnum (sum2) < 1 || true_regnum (sum2) > 15)
- && !(GET_CODE (sum2) == CONST_INT
- && INTVAL (sum2) >= 0 && INTVAL (sum2) < 4096))
- {
- if (!rtx_equal_p (target, sum1))
- {
- emit_move_insn (target, sum2);
- sum2 = target;
- }
- else
- {
- emit_move_insn (scratch, sum2);
- sum2 = scratch;
- }
+ src = gen_rtx_PLUS (Pmode, sum1, sum2);
}
/* Emit the LOAD ADDRESS pattern. Note that reload of PLUS
is only ever performed on addresses, so we can mark the
sum as legitimate for LA in any case. */
- src = gen_rtx_PLUS (Pmode, sum1, sum2);
- src = legitimize_la_operand (src);
- emit_insn (gen_rtx_SET (VOIDmode, target, src));
+ s390_load_address (target, src);
}
/* Decompose a RTL expression ADDR for a memory address into
- its components, returned in OUT. The boolean STRICT
- specifies whether strict register checking applies.
+ its components, returned in OUT.
+
Returns 0 if ADDR is not a valid memory address, nonzero
otherwise. If OUT is NULL, don't return the components,
but check for validity only.
@@ -1477,10 +1495,9 @@ s390_expand_plus_operand (target, src, scratch_in)
canonical form so that they will be recognized. */
static int
-s390_decompose_address (addr, out, strict)
+s390_decompose_address (addr, out)
register rtx addr;
struct s390_address *out;
- int strict;
{
rtx base = NULL_RTX;
rtx indx = NULL_RTX;
@@ -1545,16 +1562,15 @@ s390_decompose_address (addr, out, strict)
if (GET_CODE (base) != REG || GET_MODE (base) != Pmode)
return FALSE;
- if ((strict && ! REG_OK_FOR_BASE_STRICT_P (base))
- || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (base)))
- return FALSE;
-
if (REGNO (base) == BASE_REGISTER
|| REGNO (base) == STACK_POINTER_REGNUM
|| REGNO (base) == FRAME_POINTER_REGNUM
|| ((reload_completed || reload_in_progress)
&& frame_pointer_needed
&& REGNO (base) == HARD_FRAME_POINTER_REGNUM)
+ || REGNO (base) == ARG_POINTER_REGNUM
+ || (REGNO (base) >= FIRST_VIRTUAL_REGISTER
+ && REGNO (base) <= LAST_VIRTUAL_REGISTER)
|| (flag_pic
&& REGNO (base) == PIC_OFFSET_TABLE_REGNUM))
pointer = TRUE;
@@ -1574,16 +1590,15 @@ s390_decompose_address (addr, out, strict)
if (GET_CODE (indx) != REG || GET_MODE (indx) != Pmode)
return FALSE;
- if ((strict && ! REG_OK_FOR_BASE_STRICT_P (indx))
- || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (indx)))
- return FALSE;
-
if (REGNO (indx) == BASE_REGISTER
|| REGNO (indx) == STACK_POINTER_REGNUM
|| REGNO (indx) == FRAME_POINTER_REGNUM
|| ((reload_completed || reload_in_progress)
&& frame_pointer_needed
&& REGNO (indx) == HARD_FRAME_POINTER_REGNUM)
+ || REGNO (indx) == ARG_POINTER_REGNUM
+ || (REGNO (indx) >= FIRST_VIRTUAL_REGISTER
+ && REGNO (indx) <= LAST_VIRTUAL_REGISTER)
|| (flag_pic
&& REGNO (indx) == PIC_OFFSET_TABLE_REGNUM))
pointer = TRUE;
@@ -1708,7 +1723,26 @@ legitimate_address_p (mode, addr, strict)
register rtx addr;
int strict;
{
- return s390_decompose_address (addr, NULL, strict);
+ struct s390_address ad;
+ if (!s390_decompose_address (addr, &ad))
+ return FALSE;
+
+ if (strict)
+ {
+ if (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base))
+ return FALSE;
+ if (ad.indx && !REG_OK_FOR_INDEX_STRICT_P (ad.indx))
+ return FALSE;
+ }
+ else
+ {
+ if (ad.base && !REG_OK_FOR_BASE_NONSTRICT_P (ad.base))
+ return FALSE;
+ if (ad.indx && !REG_OK_FOR_INDEX_NONSTRICT_P (ad.indx))
+ return FALSE;
+ }
+
+ return TRUE;
}
/* Return 1 if OP is a valid operand for the LA instruction.
@@ -1720,7 +1754,7 @@ legitimate_la_operand_p (op)
register rtx op;
{
struct s390_address addr;
- if (!s390_decompose_address (op, &addr, FALSE))
+ if (!s390_decompose_address (op, &addr))
return FALSE;
if (TARGET_64BIT || addr.pointer)
@@ -1729,30 +1763,47 @@ legitimate_la_operand_p (op)
return FALSE;
}
-/* Return a modified variant of OP that is guaranteed to
- be accepted by legitimate_la_operand_p. */
-
-rtx
-legitimize_la_operand (op)
+/* Return 1 if OP is a valid operand for the LA instruction,
+ and we prefer to use LA over addition to compute it.
+ If STRICT is true, only accept operands that will never
+ change to something we cannot recognize as preferred. */
+
+int
+preferred_la_operand_p (op, strict)
register rtx op;
+ int strict;
{
struct s390_address addr;
- if (!s390_decompose_address (op, &addr, FALSE))
- abort ();
+ if (!s390_decompose_address (op, &addr))
+ return FALSE;
- if (TARGET_64BIT || addr.pointer)
- return op;
+ if (!TARGET_64BIT && !addr.pointer)
+ return FALSE;
- if (!addr.base)
- abort ();
+ if (addr.pointer)
+ return TRUE;
- op = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr.base), 101);
- if (addr.indx)
- op = gen_rtx_PLUS (Pmode, op, addr.indx);
- if (addr.disp)
- op = gen_rtx_PLUS (Pmode, op, addr.disp);
+ if (!strict)
+ if ((addr.base && REG_P (addr.base) && REG_POINTER (addr.base))
+ || (addr.indx && REG_P (addr.indx) && REG_POINTER (addr.indx)))
+ return TRUE;
+
+ return FALSE;
+}
+
+/* Emit a forced load-address operation to load SRC into DST.
+ This will use the LOAD ADDRESS instruction even in situations
+ where legitimate_la_operand_p (SRC) returns false. */
- return op;
+void
+s390_load_address (dst, src)
+ rtx dst;
+ rtx src;
+{
+ if (TARGET_64BIT)
+ emit_move_insn (dst, src);
+ else
+ emit_insn (gen_force_la_31 (dst, src));
}
/* Return a legitimate reference for ORIG (an address) using the
@@ -1826,7 +1877,8 @@ legitimize_pic_address (orig, reg)
/* Assume GOT offset < 4k. This is handled the same way
in both 31- and 64-bit code (@GOT12). */
- current_function_uses_pic_offset_table = 1;
+ if (reload_in_progress || reload_completed)
+ regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
new = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), 110);
new = gen_rtx_CONST (Pmode, new);
@@ -1859,7 +1911,8 @@ legitimize_pic_address (orig, reg)
rtx temp = gen_reg_rtx (Pmode);
- current_function_uses_pic_offset_table = 1;
+ if (reload_in_progress || reload_completed)
+ regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
addr = gen_rtx_UNSPEC (SImode, gen_rtvec (1, addr), 112);
addr = gen_rtx_CONST (SImode, addr);
@@ -2138,6 +2191,312 @@ legitimize_address (x, oldx, mode)
return x;
}
+/* Emit code to move LEN bytes from DST to SRC. */
+
+void
+s390_expand_movstr (dst, src, len)
+ rtx dst;
+ rtx src;
+ rtx len;
+{
+ rtx (*gen_short) PARAMS ((rtx, rtx, rtx)) =
+ TARGET_64BIT ? gen_movstr_short_64 : gen_movstr_short_31;
+ rtx (*gen_long) PARAMS ((rtx, rtx, rtx, rtx)) =
+ TARGET_64BIT ? gen_movstr_long_64 : gen_movstr_long_31;
+
+
+ if (GET_CODE (len) == CONST_INT && INTVAL (len) >= 0 && INTVAL (len) <= 256)
+ {
+ if (INTVAL (len) > 0)
+ emit_insn ((*gen_short) (dst, src, GEN_INT (INTVAL (len) - 1)));
+ }
+
+ else if (TARGET_MVCLE)
+ {
+ enum machine_mode double_mode = TARGET_64BIT ? TImode : DImode;
+ enum machine_mode single_mode = TARGET_64BIT ? DImode : SImode;
+ rtx reg0 = gen_reg_rtx (double_mode);
+ rtx reg1 = gen_reg_rtx (double_mode);
+
+ emit_move_insn (gen_highpart (single_mode, reg0),
+ force_operand (XEXP (dst, 0), NULL_RTX));
+ emit_move_insn (gen_highpart (single_mode, reg1),
+ force_operand (XEXP (src, 0), NULL_RTX));
+
+ convert_move (gen_lowpart (single_mode, reg0), len, 1);
+ convert_move (gen_lowpart (single_mode, reg1), len, 1);
+
+ emit_insn ((*gen_long) (reg0, reg1, reg0, reg1));
+ }
+
+ else
+ {
+ rtx dst_addr, src_addr, count, blocks, temp;
+ rtx end_label = gen_label_rtx ();
+ enum machine_mode mode;
+ tree type;
+
+ mode = GET_MODE (len);
+ if (mode == VOIDmode)
+ mode = word_mode;
+
+ type = (*lang_hooks.types.type_for_mode) (mode, 1);
+ if (!type)
+ abort ();
+
+ dst_addr = gen_reg_rtx (Pmode);
+ src_addr = gen_reg_rtx (Pmode);
+ count = gen_reg_rtx (mode);
+ blocks = gen_reg_rtx (mode);
+
+ convert_move (count, len, 1);
+ emit_cmp_and_jump_insns (count, const0_rtx,
+ EQ, NULL_RTX, mode, 1, end_label);
+
+ emit_move_insn (dst_addr, force_operand (XEXP (dst, 0), NULL_RTX));
+ emit_move_insn (src_addr, force_operand (XEXP (src, 0), NULL_RTX));
+ dst = change_address (dst, VOIDmode, dst_addr);
+ src = change_address (src, VOIDmode, src_addr);
+
+ temp = expand_binop (mode, add_optab, count, constm1_rtx, count, 1, 0);
+ if (temp != count)
+ emit_move_insn (count, temp);
+
+ temp = expand_binop (mode, ashr_optab, count, GEN_INT (8), blocks, 1, 0);
+ if (temp != blocks)
+ emit_move_insn (blocks, temp);
+
+ expand_start_loop (1);
+ expand_exit_loop_top_cond (0, build (NE_EXPR, type,
+ make_tree (type, blocks),
+ make_tree (type, const0_rtx)));
+
+ emit_insn ((*gen_short) (dst, src, GEN_INT (255)));
+ s390_load_address (dst_addr,
+ gen_rtx_PLUS (Pmode, dst_addr, GEN_INT (256)));
+ s390_load_address (src_addr,
+ gen_rtx_PLUS (Pmode, src_addr, GEN_INT (256)));
+
+ temp = expand_binop (mode, add_optab, blocks, constm1_rtx, blocks, 1, 0);
+ if (temp != blocks)
+ emit_move_insn (blocks, temp);
+
+ expand_end_loop ();
+
+ emit_insn ((*gen_short) (dst, src, convert_to_mode (word_mode, count, 1)));
+ emit_label (end_label);
+ }
+}
+
+/* Emit code to clear LEN bytes at DST. */
+
+void
+s390_expand_clrstr (dst, len)
+ rtx dst;
+ rtx len;
+{
+ rtx (*gen_short) PARAMS ((rtx, rtx)) =
+ TARGET_64BIT ? gen_clrstr_short_64 : gen_clrstr_short_31;
+ rtx (*gen_long) PARAMS ((rtx, rtx, rtx)) =
+ TARGET_64BIT ? gen_clrstr_long_64 : gen_clrstr_long_31;
+
+
+ if (GET_CODE (len) == CONST_INT && INTVAL (len) >= 0 && INTVAL (len) <= 256)
+ {
+ if (INTVAL (len) > 0)
+ emit_insn ((*gen_short) (dst, GEN_INT (INTVAL (len) - 1)));
+ }
+
+ else if (TARGET_MVCLE)
+ {
+ enum machine_mode double_mode = TARGET_64BIT ? TImode : DImode;
+ enum machine_mode single_mode = TARGET_64BIT ? DImode : SImode;
+ rtx reg0 = gen_reg_rtx (double_mode);
+ rtx reg1 = gen_reg_rtx (double_mode);
+
+ emit_move_insn (gen_highpart (single_mode, reg0),
+ force_operand (XEXP (dst, 0), NULL_RTX));
+ convert_move (gen_lowpart (single_mode, reg0), len, 1);
+
+ emit_move_insn (gen_highpart (single_mode, reg1), const0_rtx);
+ emit_move_insn (gen_lowpart (single_mode, reg1), const0_rtx);
+
+ emit_insn ((*gen_long) (reg0, reg1, reg0));
+ }
+
+ else
+ {
+ rtx dst_addr, src_addr, count, blocks, temp;
+ rtx end_label = gen_label_rtx ();
+ enum machine_mode mode;
+ tree type;
+
+ mode = GET_MODE (len);
+ if (mode == VOIDmode)
+ mode = word_mode;
+
+ type = (*lang_hooks.types.type_for_mode) (mode, 1);
+ if (!type)
+ abort ();
+
+ dst_addr = gen_reg_rtx (Pmode);
+ src_addr = gen_reg_rtx (Pmode);
+ count = gen_reg_rtx (mode);
+ blocks = gen_reg_rtx (mode);
+
+ convert_move (count, len, 1);
+ emit_cmp_and_jump_insns (count, const0_rtx,
+ EQ, NULL_RTX, mode, 1, end_label);
+
+ emit_move_insn (dst_addr, force_operand (XEXP (dst, 0), NULL_RTX));
+ dst = change_address (dst, VOIDmode, dst_addr);
+
+ temp = expand_binop (mode, add_optab, count, constm1_rtx, count, 1, 0);
+ if (temp != count)
+ emit_move_insn (count, temp);
+
+ temp = expand_binop (mode, ashr_optab, count, GEN_INT (8), blocks, 1, 0);
+ if (temp != blocks)
+ emit_move_insn (blocks, temp);
+
+ expand_start_loop (1);
+ expand_exit_loop_top_cond (0, build (NE_EXPR, type,
+ make_tree (type, blocks),
+ make_tree (type, const0_rtx)));
+
+ emit_insn ((*gen_short) (dst, GEN_INT (255)));
+ s390_load_address (dst_addr,
+ gen_rtx_PLUS (Pmode, dst_addr, GEN_INT (256)));
+
+ temp = expand_binop (mode, add_optab, blocks, constm1_rtx, blocks, 1, 0);
+ if (temp != blocks)
+ emit_move_insn (blocks, temp);
+
+ expand_end_loop ();
+
+ emit_insn ((*gen_short) (dst, convert_to_mode (word_mode, count, 1)));
+ emit_label (end_label);
+ }
+}
+
+/* Emit code to compare LEN bytes at OP0 with those at OP1,
+ and return the result in TARGET. */
+
+void
+s390_expand_cmpstr (target, op0, op1, len)
+ rtx target;
+ rtx op0;
+ rtx op1;
+ rtx len;
+{
+ rtx (*gen_short) PARAMS ((rtx, rtx, rtx)) =
+ TARGET_64BIT ? gen_cmpstr_short_64 : gen_cmpstr_short_31;
+ rtx (*gen_long) PARAMS ((rtx, rtx, rtx, rtx)) =
+ TARGET_64BIT ? gen_cmpstr_long_64 : gen_cmpstr_long_31;
+ rtx (*gen_result) PARAMS ((rtx)) =
+ GET_MODE (target) == DImode ? gen_cmpint_di : gen_cmpint_si;
+
+ op0 = protect_from_queue (op0, 0);
+ op1 = protect_from_queue (op1, 0);
+ len = protect_from_queue (len, 0);
+
+ if (GET_CODE (len) == CONST_INT && INTVAL (len) >= 0 && INTVAL (len) <= 256)
+ {
+ if (INTVAL (len) > 0)
+ {
+ emit_insn ((*gen_short) (op0, op1, GEN_INT (INTVAL (len) - 1)));
+ emit_insn ((*gen_result) (target));
+ }
+ else
+ emit_move_insn (target, const0_rtx);
+ }
+
+ else if (TARGET_MVCLE)
+ {
+ enum machine_mode double_mode = TARGET_64BIT ? TImode : DImode;
+ enum machine_mode single_mode = TARGET_64BIT ? DImode : SImode;
+ rtx reg0 = gen_reg_rtx (double_mode);
+ rtx reg1 = gen_reg_rtx (double_mode);
+
+ emit_move_insn (gen_highpart (single_mode, reg0),
+ force_operand (XEXP (op0, 0), NULL_RTX));
+ emit_move_insn (gen_highpart (single_mode, reg1),
+ force_operand (XEXP (op1, 0), NULL_RTX));
+
+ convert_move (gen_lowpart (single_mode, reg0), len, 1);
+ convert_move (gen_lowpart (single_mode, reg1), len, 1);
+
+ emit_insn ((*gen_long) (reg0, reg1, reg0, reg1));
+ emit_insn ((*gen_result) (target));
+ }
+
+ else
+ {
+ rtx addr0, addr1, count, blocks, temp;
+ rtx end_label = gen_label_rtx ();
+ enum machine_mode mode;
+ tree type;
+
+ mode = GET_MODE (len);
+ if (mode == VOIDmode)
+ mode = word_mode;
+
+ type = (*lang_hooks.types.type_for_mode) (mode, 1);
+ if (!type)
+ abort ();
+
+ addr0 = gen_reg_rtx (Pmode);
+ addr1 = gen_reg_rtx (Pmode);
+ count = gen_reg_rtx (mode);
+ blocks = gen_reg_rtx (mode);
+
+ convert_move (count, len, 1);
+ emit_cmp_and_jump_insns (count, const0_rtx,
+ EQ, NULL_RTX, mode, 1, end_label);
+
+ emit_move_insn (addr0, force_operand (XEXP (op0, 0), NULL_RTX));
+ emit_move_insn (addr1, force_operand (XEXP (op1, 0), NULL_RTX));
+ op0 = change_address (op0, VOIDmode, addr0);
+ op1 = change_address (op1, VOIDmode, addr1);
+
+ temp = expand_binop (mode, add_optab, count, constm1_rtx, count, 1, 0);
+ if (temp != count)
+ emit_move_insn (count, temp);
+
+ temp = expand_binop (mode, ashr_optab, count, GEN_INT (8), blocks, 1, 0);
+ if (temp != blocks)
+ emit_move_insn (blocks, temp);
+
+ expand_start_loop (1);
+ expand_exit_loop_top_cond (0, build (NE_EXPR, type,
+ make_tree (type, blocks),
+ make_tree (type, const0_rtx)));
+
+ emit_insn ((*gen_short) (op0, op1, GEN_INT (255)));
+ temp = gen_rtx_NE (VOIDmode, gen_rtx_REG (CCSmode, 33), const0_rtx);
+ temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
+ gen_rtx_LABEL_REF (VOIDmode, end_label), pc_rtx);
+ temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
+ emit_jump_insn (temp);
+
+ s390_load_address (addr0,
+ gen_rtx_PLUS (Pmode, addr0, GEN_INT (256)));
+ s390_load_address (addr1,
+ gen_rtx_PLUS (Pmode, addr1, GEN_INT (256)));
+
+ temp = expand_binop (mode, add_optab, blocks, constm1_rtx, blocks, 1, 0);
+ if (temp != blocks)
+ emit_move_insn (blocks, temp);
+
+ expand_end_loop ();
+
+ emit_insn ((*gen_short) (op0, op1, convert_to_mode (word_mode, count, 1)));
+ emit_label (end_label);
+
+ emit_insn ((*gen_result) (target));
+ }
+}
+
/* In the name of slightly smaller debug output, and to cater to
general assembler losage, recognize various UNSPEC sequences
and turn them back into a direct symbol reference. */
@@ -2217,8 +2576,13 @@ s390_output_symbolic_const (file, x)
switch (XINT (x, 1))
{
case 100:
+ case 104:
+ s390_output_symbolic_const (file, XVECEXP (x, 0, 0));
+ fprintf (file, "-.LT%d", current_function_funcdef_no);
+ break;
+ case 105:
+ fprintf (file, ".LT%d-", current_function_funcdef_no);
s390_output_symbolic_const (file, XVECEXP (x, 0, 0));
- fprintf (file, "-.LT%X", s390_function_count);
break;
case 110:
s390_output_symbolic_const (file, XVECEXP (x, 0, 0));
@@ -2238,7 +2602,7 @@ s390_output_symbolic_const (file, x)
break;
case 114:
s390_output_symbolic_const (file, XVECEXP (x, 0, 0));
- fprintf (file, "@PLT-.LT%X", s390_function_count);
+ fprintf (file, "@PLT-.LT%d", current_function_funcdef_no);
break;
default:
output_operand_lossage ("invalid UNSPEC as operand (2)");
@@ -2262,7 +2626,9 @@ print_operand_address (file, addr)
{
struct s390_address ad;
- if (!s390_decompose_address (addr, &ad, TRUE))
+ if (!s390_decompose_address (addr, &ad)
+ || (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base))
+ || (ad.indx && !REG_OK_FOR_INDEX_STRICT_P (ad.indx)))
output_operand_lossage ("Cannot decompose address.");
if (ad.disp)
@@ -2313,7 +2679,8 @@ print_operand (file, x, code)
struct s390_address ad;
if (GET_CODE (x) != MEM
- || !s390_decompose_address (XEXP (x, 0), &ad, TRUE)
+ || !s390_decompose_address (XEXP (x, 0), &ad)
+ || (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base))
|| ad.indx)
abort ();
@@ -2329,7 +2696,8 @@ print_operand (file, x, code)
struct s390_address ad;
if (GET_CODE (x) != MEM
- || !s390_decompose_address (XEXP (x, 0), &ad, TRUE)
+ || !s390_decompose_address (XEXP (x, 0), &ad)
+ || (ad.base && !REG_OK_FOR_BASE_STRICT_P (ad.base))
|| ad.indx)
abort ();
@@ -2484,7 +2852,11 @@ addr_generation_dependency_p (dep_rtx, insn)
if (GET_CODE (dep_rtx) == SET)
{
target = SET_DEST (dep_rtx);
-
+ if (GET_CODE (target) == STRICT_LOW_PART)
+ target = XEXP (target, 0);
+ while (GET_CODE (target) == SUBREG)
+ target = SUBREG_REG (target);
+
if (GET_CODE (target) == REG)
{
int regno = REGNO (target);
@@ -2625,18 +2997,25 @@ s390_adjust_priority (insn, priority)
}
-/* Split all branches that exceed the maximum distance. */
+/* Split all branches that exceed the maximum distance.
+ Returns true if this created a new literal pool entry.
+
+ Code generated by this routine is allowed to use
+ TEMP_REG as temporary scratch register. If this is
+ done, TEMP_USED is set to true. */
-static void
-s390_split_branches ()
+static int
+s390_split_branches (temp_reg, temp_used)
+ rtx temp_reg;
+ bool *temp_used;
{
- rtx temp_reg = gen_rtx_REG (Pmode, RETURN_REGNUM);
- rtx insn, pat, label, target, jump, tmp;
+ int new_literal = 0;
+ rtx insn, pat, tmp, target;
+ rtx *label;
- /* In 64-bit mode we can jump +- 4GB. */
+ /* We need correct insn addresses. */
- if (TARGET_64BIT)
- return;
+ shorten_branches (get_insns ());
/* Find all branches that exceed 64KB, and split them. */
@@ -2646,61 +3025,66 @@ s390_split_branches ()
continue;
pat = PATTERN (insn);
- if (GET_CODE (pat) != SET)
+ if (GET_CODE (pat) == PARALLEL && XVECLEN (pat, 0) > 2)
+ pat = XVECEXP (pat, 0, 0);
+ if (GET_CODE (pat) != SET || SET_DEST (pat) != pc_rtx)
continue;
if (GET_CODE (SET_SRC (pat)) == LABEL_REF)
{
- label = SET_SRC (pat);
+ label = &SET_SRC (pat);
}
else if (GET_CODE (SET_SRC (pat)) == IF_THEN_ELSE)
{
if (GET_CODE (XEXP (SET_SRC (pat), 1)) == LABEL_REF)
- label = XEXP (SET_SRC (pat), 1);
+ label = &XEXP (SET_SRC (pat), 1);
else if (GET_CODE (XEXP (SET_SRC (pat), 2)) == LABEL_REF)
- label = XEXP (SET_SRC (pat), 2);
+ label = &XEXP (SET_SRC (pat), 2);
else
continue;
}
else
continue;
- if (get_attr_length (insn) == 4)
+ if (get_attr_length (insn) <= (TARGET_64BIT ? 6 : 4))
continue;
- if (flag_pic)
+ *temp_used = 1;
+
+ if (TARGET_64BIT)
{
- target = gen_rtx_UNSPEC (SImode, gen_rtvec (1, label), 100);
- target = gen_rtx_CONST (SImode, target);
- target = force_const_mem (SImode, target);
- jump = gen_rtx_REG (Pmode, BASE_REGISTER);
- jump = gen_rtx_PLUS (Pmode, jump, temp_reg);
+ tmp = emit_insn_before (gen_rtx_SET (Pmode, temp_reg, *label), insn);
+ INSN_ADDRESSES_NEW (tmp, -1);
+
+ target = temp_reg;
}
- else
+ else if (!flag_pic)
{
- target = force_const_mem (Pmode, label);
- jump = temp_reg;
- }
+ new_literal = 1;
+ tmp = force_const_mem (Pmode, *label);
+ tmp = emit_insn_before (gen_rtx_SET (Pmode, temp_reg, tmp), insn);
+ INSN_ADDRESSES_NEW (tmp, -1);
- if (GET_CODE (SET_SRC (pat)) == IF_THEN_ELSE)
+ target = temp_reg;
+ }
+ else
{
- if (GET_CODE (XEXP (SET_SRC (pat), 1)) == LABEL_REF)
- jump = gen_rtx_IF_THEN_ELSE (VOIDmode, XEXP (SET_SRC (pat), 0),
- jump, pc_rtx);
- else
- jump = gen_rtx_IF_THEN_ELSE (VOIDmode, XEXP (SET_SRC (pat), 0),
- pc_rtx, jump);
+ new_literal = 1;
+ tmp = gen_rtx_UNSPEC (SImode, gen_rtvec (1, *label), 104);
+ tmp = gen_rtx_CONST (SImode, tmp);
+ tmp = force_const_mem (SImode, tmp);
+ tmp = emit_insn_before (gen_rtx_SET (Pmode, temp_reg, tmp), insn);
+ INSN_ADDRESSES_NEW (tmp, -1);
+
+ target = gen_rtx_REG (Pmode, BASE_REGISTER);
+ target = gen_rtx_PLUS (Pmode, target, temp_reg);
}
- tmp = emit_insn_before (gen_rtx_SET (Pmode, temp_reg, target), insn);
- INSN_ADDRESSES_NEW (tmp, -1);
-
- tmp = emit_jump_insn_before (gen_rtx_SET (VOIDmode, pc_rtx, jump), insn);
- INSN_ADDRESSES_NEW (tmp, -1);
-
- remove_insn (insn);
- insn = tmp;
+ if (!validate_change (insn, label, target, 0))
+ abort ();
}
+
+ return new_literal;
}
@@ -2818,6 +3202,153 @@ replace_constant_pool_ref (x, ref, addr)
}
}
+/* Check whether ADDR is an address that uses the base register,
+ without actually constituting a literal pool access. (This happens
+ in 31-bit PIC mode, where the base register is used as anchor for
+ relative addressing of local symbols.)
+
+ Returns 1 if the base register occupies the base slot,
+ returns 2 if the base register occupies the index slot,
+ returns 0 if the address is not of this form. */
+
+static int
+find_base_register_in_addr (addr)
+ struct s390_address *addr;
+{
+ /* If DISP is complex, we might have a literal pool reference. */
+ if (addr->disp && GET_CODE (addr->disp) != CONST_INT)
+ return 0;
+
+ if (addr->base && REG_P (addr->base) && REGNO (addr->base) == BASE_REGISTER)
+ return 1;
+
+ if (addr->indx && REG_P (addr->indx) && REGNO (addr->indx) == BASE_REGISTER)
+ return 2;
+
+ return 0;
+}
+
+/* Return true if X contains an address that uses the base register,
+ without actually constituting a literal pool access. */
+
+static bool
+find_base_register_ref (x)
+ rtx x;
+{
+ bool retv = FALSE;
+ struct s390_address addr;
+ int i, j;
+ const char *fmt;
+
+ /* Addresses can only occur inside a MEM ... */
+ if (GET_CODE (x) == MEM)
+ {
+ if (s390_decompose_address (XEXP (x, 0), &addr)
+ && find_base_register_in_addr (&addr))
+ return TRUE;
+ }
+
+ /* ... or a load-address type pattern. */
+ if (GET_CODE (x) == SET && GET_CODE (SET_DEST (x)) == REG)
+ {
+ if (s390_decompose_address (SET_SRC (x), &addr)
+ && find_base_register_in_addr (&addr))
+ return TRUE;
+ }
+
+ fmt = GET_RTX_FORMAT (GET_CODE (x));
+ for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
+ {
+ if (fmt[i] == 'e')
+ {
+ retv |= find_base_register_ref (XEXP (x, i));
+ }
+ else if (fmt[i] == 'E')
+ {
+ for (j = 0; j < XVECLEN (x, i); j++)
+ retv |= find_base_register_ref (XVECEXP (x, i, j));
+ }
+ }
+
+ return retv;
+}
+
+/* If X contains an address that uses the base register,
+ without actually constituting a literal pool access,
+ replace the base register with REPL in all such cases.
+
+ Handles both MEMs and load address patterns. */
+
+static void
+replace_base_register_ref (x, repl)
+ rtx *x;
+ rtx repl;
+{
+ struct s390_address addr;
+ rtx new_addr;
+ int i, j, pos;
+ const char *fmt;
+
+ /* Addresses can only occur inside a MEM ... */
+ if (GET_CODE (*x) == MEM)
+ {
+ if (s390_decompose_address (XEXP (*x, 0), &addr)
+ && (pos = find_base_register_in_addr (&addr)))
+ {
+ if (pos == 1)
+ addr.base = repl;
+ else
+ addr.indx = repl;
+
+ new_addr = addr.base;
+ if (addr.indx)
+ new_addr = gen_rtx_PLUS (Pmode, new_addr, addr.indx);
+ if (addr.disp)
+ new_addr = gen_rtx_PLUS (Pmode, new_addr, addr.disp);
+
+ *x = replace_equiv_address (*x, new_addr);
+ return;
+ }
+ }
+
+ /* ... or a load-address type pattern. */
+ if (GET_CODE (*x) == SET && GET_CODE (SET_DEST (*x)) == REG)
+ {
+ if (s390_decompose_address (SET_SRC (*x), &addr)
+ && (pos = find_base_register_in_addr (&addr)))
+ {
+ if (pos == 1)
+ addr.base = repl;
+ else
+ addr.indx = repl;
+
+ new_addr = addr.base;
+ if (addr.indx)
+ new_addr = gen_rtx_PLUS (Pmode, new_addr, addr.indx);
+ if (addr.disp)
+ new_addr = gen_rtx_PLUS (Pmode, new_addr, addr.disp);
+
+ SET_SRC (*x) = new_addr;
+ return;
+ }
+ }
+
+ fmt = GET_RTX_FORMAT (GET_CODE (*x));
+ for (i = GET_RTX_LENGTH (GET_CODE (*x)) - 1; i >= 0; i--)
+ {
+ if (fmt[i] == 'e')
+ {
+ replace_base_register_ref (&XEXP (*x, i), repl);
+ }
+ else if (fmt[i] == 'E')
+ {
+ for (j = 0; j < XVECLEN (*x, i); j++)
+ replace_base_register_ref (&XVECEXP (*x, i, j), repl);
+ }
+ }
+}
+
+
/* We keep a list of constants we which we have to add to internal
constant tables in the middle of large functions. */
@@ -2849,17 +3380,26 @@ struct constant_pool
{
struct constant_pool *next;
rtx first_insn;
- rtx last_insn;
+ rtx pool_insn;
+ bitmap insns;
struct constant *constants[NR_C_MODES];
rtx label;
int size;
+ bool anchor;
};
+static struct constant_pool * s390_chunkify_start PARAMS ((rtx, bool *));
+static void s390_chunkify_finish PARAMS ((struct constant_pool *, rtx));
+static void s390_chunkify_cancel PARAMS ((struct constant_pool *));
+
static struct constant_pool *s390_start_pool PARAMS ((struct constant_pool **, rtx));
static void s390_end_pool PARAMS ((struct constant_pool *, rtx));
+static void s390_add_pool_insn PARAMS ((struct constant_pool *, rtx));
static struct constant_pool *s390_find_pool PARAMS ((struct constant_pool *, rtx));
-static rtx s390_add_pool PARAMS ((struct constant_pool *, rtx, enum machine_mode));
+static void s390_add_constant PARAMS ((struct constant_pool *, rtx, enum machine_mode));
+static rtx s390_find_constant PARAMS ((struct constant_pool *, rtx, enum machine_mode));
+static void s390_add_anchor PARAMS ((struct constant_pool *));
static rtx s390_dump_pool PARAMS ((struct constant_pool *));
static void s390_free_pool PARAMS ((struct constant_pool *));
@@ -2881,9 +3421,11 @@ s390_start_pool (pool_list, insn)
pool->label = gen_label_rtx ();
pool->first_insn = insn;
- pool->last_insn = NULL_RTX;
+ pool->pool_insn = NULL_RTX;
+ pool->insns = BITMAP_XMALLOC ();
pool->size = 0;
-
+ pool->anchor = FALSE;
+
for (prev = pool_list; *prev; prev = &(*prev)->next)
;
*prev = pool;
@@ -2891,14 +3433,31 @@ s390_start_pool (pool_list, insn)
return pool;
}
-/* End range of instructions covered by POOL at INSN. */
+/* End range of instructions covered by POOL at INSN and emit
+ placeholder insn representing the pool. */
static void
s390_end_pool (pool, insn)
struct constant_pool *pool;
rtx insn;
{
- pool->last_insn = insn;
+ rtx pool_size = GEN_INT (pool->size + 8 /* alignment slop */);
+
+ if (!insn)
+ insn = get_last_insn ();
+
+ pool->pool_insn = emit_insn_after (gen_pool (pool_size), insn);
+ INSN_ADDRESSES_NEW (pool->pool_insn, -1);
+}
+
+/* Add INSN to the list of insns covered by POOL. */
+
+static void
+s390_add_pool_insn (pool, insn)
+ struct constant_pool *pool;
+ rtx insn;
+{
+ bitmap_set_bit (pool->insns, INSN_UID (insn));
}
/* Return pool out of POOL_LIST that covers INSN. */
@@ -2908,33 +3467,24 @@ s390_find_pool (pool_list, insn)
struct constant_pool *pool_list;
rtx insn;
{
- int addr = INSN_ADDRESSES (INSN_UID (insn));
struct constant_pool *pool;
- if (addr == -1)
- return NULL;
-
for (pool = pool_list; pool; pool = pool->next)
- if (INSN_ADDRESSES (INSN_UID (pool->first_insn)) <= addr
- && (pool->last_insn == NULL_RTX
- || INSN_ADDRESSES (INSN_UID (pool->last_insn)) > addr))
+ if (bitmap_bit_p (pool->insns, INSN_UID (insn)))
break;
return pool;
}
-/* Add constant VAL of mode MODE to the constant pool POOL.
- Return an RTX describing the distance from the start of
- the pool to the location of the new constant. */
+/* Add constant VAL of mode MODE to the constant pool POOL. */
-static rtx
-s390_add_pool (pool, val, mode)
+static void
+s390_add_constant (pool, val, mode)
struct constant_pool *pool;
rtx val;
enum machine_mode mode;
{
struct constant *c;
- rtx offset;
int i;
for (i = 0; i < NR_C_MODES; i++)
@@ -2956,13 +3506,54 @@ s390_add_pool (pool, val, mode)
pool->constants[i] = c;
pool->size += GET_MODE_SIZE (mode);
}
+}
- offset = gen_rtx_MINUS (Pmode, gen_rtx_LABEL_REF (Pmode, c->label),
- gen_rtx_LABEL_REF (Pmode, pool->label));
+/* Find constant VAL of mode MODE in the constant pool POOL.
+ Return an RTX describing the distance from the start of
+ the pool to the location of the new constant. */
+
+static rtx
+s390_find_constant (pool, val, mode)
+ struct constant_pool *pool;
+ rtx val;
+ enum machine_mode mode;
+{
+ struct constant *c;
+ rtx offset;
+ int i;
+
+ for (i = 0; i < NR_C_MODES; i++)
+ if (constant_modes[i] == mode)
+ break;
+ if (i == NR_C_MODES)
+ abort ();
+
+ for (c = pool->constants[i]; c != NULL; c = c->next)
+ if (rtx_equal_p (val, c->value))
+ break;
+
+ if (c == NULL)
+ abort ();
+
+ offset = gen_rtx_MINUS (Pmode, gen_rtx_LABEL_REF (Pmode, c->label),
+ gen_rtx_LABEL_REF (Pmode, pool->label));
offset = gen_rtx_CONST (Pmode, offset);
return offset;
}
+/* Set 'anchor' flag in POOL. */
+
+static void
+s390_add_anchor (pool)
+ struct constant_pool *pool;
+{
+ if (!pool->anchor)
+ {
+ pool->anchor = TRUE;
+ pool->size += 4;
+ }
+}
+
/* Dump out the constants in POOL. */
static rtx
@@ -2973,31 +3564,47 @@ s390_dump_pool (pool)
rtx insn;
int i;
- /* Select location to put literal pool. */
- if (TARGET_64BIT)
- insn = get_last_insn ();
- else
- insn = pool->last_insn? pool->last_insn : get_last_insn ();
-
/* Pool start insn switches to proper section
and guarantees necessary alignment. */
if (TARGET_64BIT)
- insn = emit_insn_after (gen_pool_start_64 (), insn);
+ insn = emit_insn_after (gen_pool_start_64 (), pool->pool_insn);
else
- insn = emit_insn_after (gen_pool_start_31 (), insn);
+ insn = emit_insn_after (gen_pool_start_31 (), pool->pool_insn);
INSN_ADDRESSES_NEW (insn, -1);
insn = emit_label_after (pool->label, insn);
INSN_ADDRESSES_NEW (insn, -1);
+ /* Emit anchor if we need one. */
+ if (pool->anchor)
+ {
+ rtx anchor = gen_rtx_LABEL_REF (VOIDmode, pool->label);
+ anchor = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, anchor), 105);
+ anchor = gen_rtx_CONST (VOIDmode, anchor);
+ insn = emit_insn_after (gen_consttable_si (anchor), insn);
+ INSN_ADDRESSES_NEW (insn, -1);
+ }
+
/* Dump constants in descending alignment requirement order,
ensuring proper alignment for every constant. */
for (i = 0; i < NR_C_MODES; i++)
for (c = pool->constants[i]; c; c = c->next)
{
+ /* Convert 104 unspecs to pool-relative references. */
+ rtx value = c->value;
+ if (GET_CODE (value) == CONST
+ && GET_CODE (XEXP (value, 0)) == UNSPEC
+ && XINT (XEXP (value, 0), 1) == 104
+ && XVECLEN (XEXP (value, 0), 0) == 1)
+ {
+ value = gen_rtx_MINUS (Pmode, XVECEXP (XEXP (value, 0), 0, 0),
+ gen_rtx_LABEL_REF (VOIDmode, pool->label));
+ value = gen_rtx_CONST (VOIDmode, value);
+ }
+
insn = emit_label_after (c->label, insn);
INSN_ADDRESSES_NEW (insn, -1);
- insn = emit_insn_after (gen_consttable[i] (c->value), insn);
+ insn = emit_insn_after (gen_consttable[i] (value), insn);
INSN_ADDRESSES_NEW (insn, -1);
}
@@ -3012,6 +3619,9 @@ s390_dump_pool (pool)
insn = emit_barrier_after (insn);
INSN_ADDRESSES_NEW (insn, -1);
+ /* Remove placeholder insn. */
+ remove_insn (pool->pool_insn);
+
return insn;
}
@@ -3034,57 +3644,86 @@ s390_free_pool (pool)
}
}
+ BITMAP_XFREE (pool->insns);
free (pool);
}
-/* Used in s390.md for branch length calculation. */
-int s390_pool_overflow = 0;
-/* Chunkify the literal pool if required. */
+/* Chunkify the literal pool if required.
+
+ Code generated by this routine is allowed to use
+ TEMP_REG as temporary scratch register. If this is
+ done, TEMP_USED is set to true. */
#define S390_POOL_CHUNK_MIN 0xc00
#define S390_POOL_CHUNK_MAX 0xe00
-static void
-s390_chunkify_pool ()
+static struct constant_pool *
+s390_chunkify_start (temp_reg, temp_used)
+ rtx temp_reg;
+ bool *temp_used;
{
- rtx base_reg = gen_rtx_REG (Pmode,
- TARGET_64BIT? BASE_REGISTER : RETURN_REGNUM);
+ rtx base_reg = gen_rtx_REG (Pmode, BASE_REGISTER);
struct constant_pool *curr_pool = NULL, *pool_list = NULL;
int extra_size = 0;
bitmap far_labels;
rtx insn;
+ rtx (*gen_reload_base) PARAMS ((rtx, rtx)) =
+ TARGET_64BIT? gen_reload_base_64 : gen_reload_base_31;
+
+
/* Do we need to chunkify the literal pool? */
if (get_pool_size () < S390_POOL_CHUNK_MAX)
- return;
+ return NULL;
+
+ /* We need correct insn addresses. */
+
+ shorten_branches (get_insns ());
/* Scan all insns and move literals to pool chunks.
- Replace all occurrances of literal pool references
- by explicit references to pool chunk entries. */
+ Also, emit anchor reload insns before every insn that uses
+ the literal pool base register as anchor pointer. */
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
{
- if (GET_CODE (insn) == INSN)
+ if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
{
- rtx addr, pool_ref = NULL_RTX;
+ rtx pool_ref = NULL_RTX;
find_constant_pool_ref (PATTERN (insn), &pool_ref);
if (pool_ref)
{
if (!curr_pool)
curr_pool = s390_start_pool (&pool_list, insn);
- addr = s390_add_pool (curr_pool, get_pool_constant (pool_ref),
- get_pool_mode (pool_ref));
+ s390_add_constant (curr_pool, get_pool_constant (pool_ref),
+ get_pool_mode (pool_ref));
+ s390_add_pool_insn (curr_pool, insn);
+ }
+
+ else if (!TARGET_64BIT && flag_pic
+ && find_base_register_ref (PATTERN (insn)))
+ {
+ rtx new = gen_reload_anchor (temp_reg, base_reg);
+ new = emit_insn_before (new, insn);
+ INSN_ADDRESSES_NEW (new, INSN_ADDRESSES (INSN_UID (insn)));
+ extra_size += 8;
+ *temp_used = 1;
+
+ if (!curr_pool)
+ curr_pool = s390_start_pool (&pool_list, new);
- addr = gen_rtx_PLUS (Pmode, base_reg, addr);
- replace_constant_pool_ref (&PATTERN (insn), pool_ref, addr);
- INSN_CODE (insn) = -1;
+ s390_add_anchor (curr_pool);
+ s390_add_pool_insn (curr_pool, insn);
}
}
+ if (GET_CODE (insn) == JUMP_INSN || GET_CODE (insn) == CODE_LABEL)
+ if (curr_pool)
+ s390_add_pool_insn (curr_pool, insn);
+
if (!curr_pool
|| INSN_ADDRESSES_SIZE () <= (size_t) INSN_UID (insn)
|| INSN_ADDRESSES (INSN_UID (insn)) == -1)
@@ -3095,7 +3734,7 @@ s390_chunkify_pool ()
if (curr_pool->size < S390_POOL_CHUNK_MAX)
continue;
- s390_end_pool (curr_pool, insn);
+ s390_end_pool (curr_pool, NULL_RTX);
curr_pool = NULL;
}
else
@@ -3108,11 +3747,8 @@ s390_chunkify_pool ()
Those will have an effect on code size, which we need to
consider here. This calculation makes rather pessimistic
worst-case assumptions. */
- if (GET_CODE (insn) == CODE_LABEL
- || GET_CODE (insn) == JUMP_INSN)
+ if (GET_CODE (insn) == CODE_LABEL)
extra_size += 6;
- else if (GET_CODE (insn) == CALL_INSN)
- extra_size += 4;
if (chunk_size < S390_POOL_CHUNK_MIN
&& curr_pool->size < S390_POOL_CHUNK_MIN)
@@ -3128,12 +3764,22 @@ s390_chunkify_pool ()
/* ... so if we don't find one in time, create one. */
else if ((chunk_size > S390_POOL_CHUNK_MAX
- || curr_pool->size > S390_POOL_CHUNK_MAX)
- && (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN))
+ || curr_pool->size > S390_POOL_CHUNK_MAX))
{
- int addr = INSN_ADDRESSES (INSN_UID (insn));
rtx label, jump, barrier;
+ /* We can insert the barrier only after a 'real' insn. */
+ if (GET_CODE (insn) != INSN && GET_CODE (insn) != CALL_INSN)
+ continue;
+ if (get_attr_length (insn) == 0)
+ continue;
+
+ /* Don't separate insns created by s390_split_branches. */
+ if (GET_CODE (insn) == INSN
+ && GET_CODE (PATTERN (insn)) == SET
+ && rtx_equal_p (SET_DEST (PATTERN (insn)), temp_reg))
+ continue;
+
label = gen_label_rtx ();
jump = emit_jump_insn_after (gen_jump (label), insn);
barrier = emit_barrier_after (jump);
@@ -3141,8 +3787,8 @@ s390_chunkify_pool ()
JUMP_LABEL (jump) = label;
LABEL_NUSES (label) = 1;
- INSN_ADDRESSES_NEW (jump, addr+1);
- INSN_ADDRESSES_NEW (barrier, addr+1);
+ INSN_ADDRESSES_NEW (jump, -1);
+ INSN_ADDRESSES_NEW (barrier, -1);
INSN_ADDRESSES_NEW (insn, -1);
s390_end_pool (curr_pool, barrier);
@@ -3152,10 +3798,8 @@ s390_chunkify_pool ()
}
}
- /* Dump out all literal pools. */
-
- for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
- s390_dump_pool (curr_pool);
+ if (curr_pool)
+ s390_end_pool (curr_pool, NULL_RTX);
/* Find all labels that are branched into
@@ -3189,22 +3833,12 @@ s390_chunkify_pool ()
else if (GET_CODE (insn) == JUMP_INSN)
{
rtx pat = PATTERN (insn);
+ if (GET_CODE (pat) == PARALLEL && XVECLEN (pat, 0) > 2)
+ pat = XVECEXP (pat, 0, 0);
+
if (GET_CODE (pat) == SET)
{
- rtx label = 0;
-
- if (GET_CODE (SET_SRC (pat)) == LABEL_REF)
- {
- label = XEXP (SET_SRC (pat), 0);
- }
- else if (GET_CODE (SET_SRC (pat)) == IF_THEN_ELSE)
- {
- if (GET_CODE (XEXP (SET_SRC (pat), 1)) == LABEL_REF)
- label = XEXP (XEXP (SET_SRC (pat), 1), 0);
- else if (GET_CODE (XEXP (SET_SRC (pat), 2)) == LABEL_REF)
- label = XEXP (XEXP (SET_SRC (pat), 2), 0);
- }
-
+ rtx label = JUMP_LABEL (insn);
if (label)
{
if (s390_find_pool (pool_list, label)
@@ -3245,19 +3879,11 @@ s390_chunkify_pool ()
/* Insert base register reload insns before every pool. */
for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
- if (TARGET_64BIT)
- {
- rtx pool_ref = gen_rtx_LABEL_REF (Pmode, curr_pool->label);
- rtx new_insn = gen_rtx_SET (Pmode, base_reg, pool_ref);
- rtx insn = curr_pool->first_insn;
- INSN_ADDRESSES_NEW (emit_insn_before (new_insn, insn), -1);
- }
- else
- {
- rtx new_insn = gen_reload_base (base_reg, curr_pool->label);
- rtx insn = curr_pool->first_insn;
- INSN_ADDRESSES_NEW (emit_insn_before (new_insn, insn), -1);
- }
+ {
+ rtx new_insn = gen_reload_base (base_reg, curr_pool->label);
+ rtx insn = curr_pool->first_insn;
+ INSN_ADDRESSES_NEW (emit_insn_before (new_insn, insn), -1);
+ }
/* Insert base register reload insns at every far label. */
@@ -3268,60 +3894,137 @@ s390_chunkify_pool ()
struct constant_pool *pool = s390_find_pool (pool_list, insn);
if (pool)
{
- if (TARGET_64BIT)
- {
- rtx pool_ref = gen_rtx_LABEL_REF (Pmode, pool->label);
- rtx new_insn = gen_rtx_SET (Pmode, base_reg, pool_ref);
- INSN_ADDRESSES_NEW (emit_insn_after (new_insn, insn), -1);
- }
- else
- {
- rtx new_insn = gen_reload_base (base_reg, pool->label);
- INSN_ADDRESSES_NEW (emit_insn_after (new_insn, insn), -1);
- }
+ rtx new_insn = gen_reload_base (base_reg, pool->label);
+ INSN_ADDRESSES_NEW (emit_insn_after (new_insn, insn), -1);
}
}
- /* Insert base register reload insns after every call if necessary. */
-
- if (REGNO (base_reg) == RETURN_REGNUM)
- for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
- if (GET_CODE (insn) == CALL_INSN)
- {
- struct constant_pool *pool = s390_find_pool (pool_list, insn);
- if (pool)
- {
- rtx new_insn = gen_reload_base2 (base_reg, pool->label);
- INSN_ADDRESSES_NEW (emit_insn_after (new_insn, insn), -1);
- }
- }
+
+ BITMAP_XFREE (far_labels);
/* Recompute insn addresses. */
- s390_pool_overflow = 1;
init_insn_lengths ();
shorten_branches (get_insns ());
- s390_pool_overflow = 0;
- /* Insert base register reload insns after far branches. */
+ return pool_list;
+}
- if (!TARGET_64BIT)
- for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
- if (GET_CODE (insn) == JUMP_INSN
- && GET_CODE (PATTERN (insn)) == SET
- && get_attr_length (insn) >= 12)
- {
- struct constant_pool *pool = s390_find_pool (pool_list, insn);
- if (pool)
+/* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
+ After we have decided to use this list, finish implementing
+ all changes to the current function as required.
+
+ Code generated by this routine is allowed to use
+ TEMP_REG as temporary scratch register. */
+
+static void
+s390_chunkify_finish (pool_list, temp_reg)
+ struct constant_pool *pool_list;
+ rtx temp_reg;
+{
+ rtx base_reg = gen_rtx_REG (Pmode, BASE_REGISTER);
+ struct constant_pool *curr_pool = NULL;
+ rtx insn;
+
+
+ /* Replace all literal pool references. */
+
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ {
+ curr_pool = s390_find_pool (pool_list, insn);
+ if (!curr_pool)
+ continue;
+
+ if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
+ {
+ rtx addr, pool_ref = NULL_RTX;
+ find_constant_pool_ref (PATTERN (insn), &pool_ref);
+ if (pool_ref)
+ {
+ addr = s390_find_constant (curr_pool, get_pool_constant (pool_ref),
+ get_pool_mode (pool_ref));
+ addr = gen_rtx_PLUS (Pmode, base_reg, addr);
+ replace_constant_pool_ref (&PATTERN (insn), pool_ref, addr);
+ INSN_CODE (insn) = -1;
+ }
+
+ else if (!TARGET_64BIT && flag_pic
+ && find_base_register_ref (PATTERN (insn)))
{
- rtx new_insn = gen_reload_base (base_reg, pool->label);
- INSN_ADDRESSES_NEW (emit_insn_after (new_insn, insn), -1);
+ replace_base_register_ref (&PATTERN (insn), temp_reg);
}
+ }
+ }
+
+ /* Dump out all literal pools. */
+
+ for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
+ s390_dump_pool (curr_pool);
+
+ /* Free pool list. */
+
+ while (pool_list)
+ {
+ struct constant_pool *next = pool_list->next;
+ s390_free_pool (pool_list);
+ pool_list = next;
+ }
+}
+
+/* POOL_LIST is a chunk list as prepared by s390_chunkify_start.
+ We have decided we cannot use this list, so revert all changes
+ to the current function that were done by s390_chunkify_start. */
+
+static void
+s390_chunkify_cancel (pool_list)
+ struct constant_pool *pool_list;
+{
+ struct constant_pool *curr_pool = NULL;
+ rtx insn;
+
+ /* Remove all pool placeholder insns. */
+
+ for (curr_pool = pool_list; curr_pool; curr_pool = curr_pool->next)
+ {
+ /* Did we insert an extra barrier? Remove it. */
+ rtx barrier = PREV_INSN (curr_pool->pool_insn);
+ rtx jump = barrier? PREV_INSN (barrier) : NULL_RTX;
+ rtx label = NEXT_INSN (curr_pool->pool_insn);
+
+ if (jump && GET_CODE (jump) == JUMP_INSN
+ && barrier && GET_CODE (barrier) == BARRIER
+ && label && GET_CODE (label) == CODE_LABEL
+ && GET_CODE (PATTERN (jump)) == SET
+ && SET_DEST (PATTERN (jump)) == pc_rtx
+ && GET_CODE (SET_SRC (PATTERN (jump))) == LABEL_REF
+ && XEXP (SET_SRC (PATTERN (jump)), 0) == label)
+ {
+ remove_insn (jump);
+ remove_insn (barrier);
+ remove_insn (label);
}
+ remove_insn (curr_pool->pool_insn);
+ }
- /* Free all memory. */
+ /* Remove all base/anchor register reload insns. */
+
+ for (insn = get_insns (); insn; )
+ {
+ rtx next_insn = NEXT_INSN (insn);
+
+ if (GET_CODE (insn) == INSN
+ && GET_CODE (PATTERN (insn)) == SET
+ && GET_CODE (SET_SRC (PATTERN (insn))) == UNSPEC
+ && (XINT (SET_SRC (PATTERN (insn)), 1) == 210
+ || XINT (SET_SRC (PATTERN (insn)), 1) == 211))
+ remove_insn (insn);
+
+ insn = next_insn;
+ }
+
+ /* Free pool list. */
while (pool_list)
{
@@ -3329,8 +4032,6 @@ s390_chunkify_pool ()
s390_free_pool (pool_list);
pool_list = next;
}
-
- BITMAP_XFREE (far_labels);
}
@@ -3352,17 +4053,17 @@ s390_output_constant_pool (file)
{
if (TARGET_64BIT)
{
- fprintf (file, "\tlarl\t%s,.LT%X\n", reg_names[BASE_REGISTER],
- s390_function_count);
+ fprintf (file, "\tlarl\t%s,.LT%d\n", reg_names[BASE_REGISTER],
+ current_function_funcdef_no);
readonly_data_section ();
ASM_OUTPUT_ALIGN (file, 3);
}
else
{
- fprintf (file, "\tbras\t%s,.LTN%X\n", reg_names[BASE_REGISTER],
- s390_function_count);
+ fprintf (file, "\tbras\t%s,.LTN%d\n", reg_names[BASE_REGISTER],
+ current_function_funcdef_no);
}
- fprintf (file, ".LT%X:\n", s390_function_count);
+ fprintf (file, ".LT%d:\n", current_function_funcdef_no);
s390_pool_count = 0;
output_constant_pool (current_function_name, current_function_decl);
@@ -3371,27 +4072,303 @@ s390_output_constant_pool (file)
if (TARGET_64BIT)
function_section (current_function_decl);
else
- fprintf (file, ".LTN%X:\n", s390_function_count);
+ fprintf (file, ".LTN%d:\n", current_function_funcdef_no);
}
+
+ /* If no pool required, at least output the anchor label. */
+ else if (!TARGET_64BIT && flag_pic)
+ fprintf (file, ".LT%d:\n", current_function_funcdef_no);
}
-/* Return true if floating point registers need to be saved. */
+/* Rework the prolog/epilog to avoid saving/restoring
+ registers unnecessarily. If TEMP_REGNO is nonnegative,
+ it specifies the number of a caller-saved register used
+ as temporary scratch register by code emitted during
+ machine dependent reorg. */
-static int
-save_fprs_p ()
+static void
+s390_optimize_prolog (temp_regno)
+ int temp_regno;
{
- int i;
- if (!TARGET_64BIT)
- return 0;
- for (i=24; i<=31; i++)
+ int save_first, save_last, restore_first, restore_last;
+ int i, j;
+ rtx insn, new_insn, next_insn;
+
+ struct s390_frame frame;
+ s390_frame_info (&frame);
+
+ /* Recompute regs_ever_live data for special registers. */
+ regs_ever_live[BASE_REGISTER] = 0;
+ regs_ever_live[RETURN_REGNUM] = 0;
+ regs_ever_live[STACK_POINTER_REGNUM] = frame.frame_size > 0;
+
+ /* If there is (possibly) any pool entry, we need to
+ load the base register.
+ ??? FIXME: this should be more precise. */
+ if (get_pool_size ())
+ regs_ever_live[BASE_REGISTER] = 1;
+
+ /* In non-leaf functions, the prolog/epilog code relies
+ on RETURN_REGNUM being saved in any case. */
+ if (!current_function_is_leaf)
+ regs_ever_live[RETURN_REGNUM] = 1;
+
+ /* We need to save/restore the temporary register. */
+ if (temp_regno >= 0)
+ regs_ever_live[temp_regno] = 1;
+
+
+ /* Find first and last gpr to be saved. */
+
+ for (i = 6; i < 16; i++)
+ if (regs_ever_live[i])
+ break;
+
+ for (j = 15; j > i; j--)
+ if (regs_ever_live[j])
+ break;
+
+ if (i == 16)
{
- if (regs_ever_live[i] == 1)
- return 1;
+ /* Nothing to save/restore. */
+ save_first = restore_first = -1;
+ save_last = restore_last = -1;
+ }
+ else
+ {
+ /* Save/restore from i to j. */
+ save_first = restore_first = i;
+ save_last = restore_last = j;
+ }
+
+ /* Varargs functions need to save gprs 2 to 6. */
+ if (current_function_stdarg)
+ {
+ save_first = 2;
+ if (save_last < 6)
+ save_last = 6;
+ }
+
+
+ /* If all special registers are in fact used, there's nothing we
+ can do, so no point in walking the insn list. */
+ if (i <= BASE_REGISTER && j >= BASE_REGISTER
+ && i <= RETURN_REGNUM && j >= RETURN_REGNUM)
+ return;
+
+
+ /* Search for prolog/epilog insns and replace them. */
+
+ for (insn = get_insns (); insn; insn = next_insn)
+ {
+ int first, last, off;
+ rtx set, base, offset;
+
+ next_insn = NEXT_INSN (insn);
+
+ if (GET_CODE (insn) != INSN)
+ continue;
+ if (GET_CODE (PATTERN (insn)) != PARALLEL)
+ continue;
+
+ if (store_multiple_operation (PATTERN (insn), VOIDmode))
+ {
+ set = XVECEXP (PATTERN (insn), 0, 0);
+ first = REGNO (SET_SRC (set));
+ last = first + XVECLEN (PATTERN (insn), 0) - 1;
+ offset = const0_rtx;
+ base = eliminate_constant_term (XEXP (SET_DEST (set), 0), &offset);
+ off = INTVAL (offset) - first * UNITS_PER_WORD;
+
+ if (GET_CODE (base) != REG || off < 0)
+ continue;
+ if (first > BASE_REGISTER && first > RETURN_REGNUM)
+ continue;
+ if (last < BASE_REGISTER && last < RETURN_REGNUM)
+ continue;
+
+ if (save_first != -1)
+ {
+ new_insn = save_gprs (base, off, save_first, save_last);
+ new_insn = emit_insn_before (new_insn, insn);
+ INSN_ADDRESSES_NEW (new_insn, -1);
+ }
+
+ remove_insn (insn);
+ }
+
+ if (load_multiple_operation (PATTERN (insn), VOIDmode))
+ {
+ set = XVECEXP (PATTERN (insn), 0, 0);
+ first = REGNO (SET_DEST (set));
+ last = first + XVECLEN (PATTERN (insn), 0) - 1;
+ offset = const0_rtx;
+ base = eliminate_constant_term (XEXP (SET_SRC (set), 0), &offset);
+ off = INTVAL (offset) - first * UNITS_PER_WORD;
+
+ if (GET_CODE (base) != REG || off < 0)
+ continue;
+ if (first > BASE_REGISTER && first > RETURN_REGNUM)
+ continue;
+ if (last < BASE_REGISTER && last < RETURN_REGNUM)
+ continue;
+
+ if (restore_first != -1)
+ {
+ new_insn = restore_gprs (base, off, restore_first, restore_last);
+ new_insn = emit_insn_before (new_insn, insn);
+ INSN_ADDRESSES_NEW (new_insn, -1);
+ }
+
+ remove_insn (insn);
+ }
}
- return 0;
}
+/* Check whether any insn in the function makes use of the original
+ value of RETURN_REG (e.g. for __builtin_return_address).
+ If so, insert an insn reloading that value.
+
+ Return true if any such insn was found. */
+
+static bool
+s390_fixup_clobbered_return_reg (return_reg)
+ rtx return_reg;
+{
+ bool replacement_done = 0;
+ rtx insn;
+
+ struct s390_frame frame;
+ s390_frame_info (&frame);
+
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ {
+ rtx reg, off, new_insn;
+
+ if (GET_CODE (insn) != INSN)
+ continue;
+ if (!reg_referenced_p (return_reg, PATTERN (insn)))
+ continue;
+ if (GET_CODE (PATTERN (insn)) == PARALLEL
+ && store_multiple_operation (PATTERN (insn), VOIDmode))
+ continue;
+
+ if (frame.frame_pointer_p)
+ reg = hard_frame_pointer_rtx;
+ else
+ reg = stack_pointer_rtx;
+
+ off = GEN_INT (frame.frame_size + REGNO (return_reg) * UNITS_PER_WORD);
+ if (INTVAL (off) >= 4096)
+ {
+ off = force_const_mem (Pmode, off);
+ new_insn = gen_rtx_SET (Pmode, return_reg, off);
+ new_insn = emit_insn_before (new_insn, insn);
+ INSN_ADDRESSES_NEW (new_insn, -1);
+ off = return_reg;
+ }
+
+ new_insn = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, reg, off));
+ new_insn = gen_rtx_SET (Pmode, return_reg, new_insn);
+ new_insn = emit_insn_before (new_insn, insn);
+ INSN_ADDRESSES_NEW (new_insn, -1);
+
+ replacement_done = 1;
+ }
+
+ return replacement_done;
+}
+
+/* Perform machine-dependent processing. */
+
+void
+s390_machine_dependent_reorg (first)
+ rtx first ATTRIBUTE_UNUSED;
+{
+ bool fixed_up_clobbered_return_reg = 0;
+ rtx temp_reg = gen_rtx_REG (Pmode, RETURN_REGNUM);
+ bool temp_used = 0;
+
+ /* Make sure all splits have been performed; splits after
+ machine_dependent_reorg might confuse insn length counts. */
+ split_all_insns_noflow ();
+
+
+ /* There are two problematic situations we need to correct:
+
+ - the literal pool might be > 4096 bytes in size, so that
+ some of its elements cannot be directly accessed
+
+ - a branch target might be > 64K away from the branch, so that
+ it is not possible to use a PC-relative instruction.
+
+ To fix those, we split the single literal pool into multiple
+ pool chunks, reloading the pool base register at various
+ points throughout the function to ensure it always points to
+ the pool chunk the following code expects, and / or replace
+ PC-relative branches by absolute branches.
+
+ However, the two problems are interdependent: splitting the
+ literal pool can move a branch further away from its target,
+ causing the 64K limit to overflow, and on the other hand,
+ replacing a PC-relative branch by an absolute branch means
+ we need to put the branch target address into the literal
+ pool, possibly causing it to overflow.
+
+ So, we loop trying to fix up both problems until we manage
+ to satisfy both conditions at the same time. Note that the
+ loop is guaranteed to terminate as every pass of the loop
+ strictly decreases the total number of PC-relative branches
+ in the function. (This is not completely true as there
+ might be branch-over-pool insns introduced by chunkify_start.
+ Those never need to be split however.) */
+
+ for (;;)
+ {
+ struct constant_pool *pool_list;
+
+ /* Try to chunkify the literal pool. */
+ pool_list = s390_chunkify_start (temp_reg, &temp_used);
+
+ /* Split out-of-range branches. If this has created new
+ literal pool entries, cancel current chunk list and
+ recompute it. */
+ if (s390_split_branches (temp_reg, &temp_used))
+ {
+ if (pool_list)
+ s390_chunkify_cancel (pool_list);
+
+ continue;
+ }
+
+ /* Check whether we have clobbered a use of the return
+ register (e.g. for __builtin_return_address). If so,
+ add insns reloading the register where necessary. */
+ if (temp_used && !fixed_up_clobbered_return_reg
+ && s390_fixup_clobbered_return_reg (temp_reg))
+ {
+ fixed_up_clobbered_return_reg = 1;
+
+ /* The fixup insns might have caused a jump to overflow. */
+ if (pool_list)
+ s390_chunkify_cancel (pool_list);
+
+ continue;
+ }
+
+ /* If we made it up to here, both conditions are satisfied.
+ Finish up pool chunkification if required. */
+ if (pool_list)
+ s390_chunkify_finish (pool_list, temp_reg);
+
+ break;
+ }
+
+ s390_optimize_prolog (temp_used? RETURN_REGNUM : -1);
+}
+
+
/* Find first call clobbered register unsused in a function.
This could be used as base register in a leaf function
or for holding the return address before epilogue. */
@@ -3412,6 +4389,7 @@ static void
s390_frame_info (frame)
struct s390_frame *frame;
{
+ char gprs_ever_live[16];
int i, j;
HOST_WIDE_INT fsize = get_frame_size ();
@@ -3419,7 +4397,14 @@ s390_frame_info (frame)
fatal_error ("Total size of local variables exceeds architecture limit.");
/* fprs 8 - 15 are caller saved for 64 Bit ABI. */
- frame->save_fprs_p = save_fprs_p ();
+ frame->save_fprs_p = 0;
+ if (TARGET_64BIT)
+ for (i = 24; i < 32; i++)
+ if (regs_ever_live[i])
+ {
+ frame->save_fprs_p = 1;
+ break;
+ }
frame->frame_size = fsize + frame->save_fprs_p * 64;
@@ -3431,66 +4416,41 @@ s390_frame_info (frame)
|| current_function_stdarg)
frame->frame_size += STARTING_FRAME_OFFSET;
- /* If we need to allocate a frame, the stack pointer is changed. */
-
- if (frame->frame_size > 0)
- regs_ever_live[STACK_POINTER_REGNUM] = 1;
-
- /* If the literal pool might overflow, the return register might
- be used as temp literal pointer. */
-
- if (!TARGET_64BIT && get_pool_size () >= S390_POOL_CHUNK_MAX / 2)
- regs_ever_live[RETURN_REGNUM] = 1;
-
- /* If there is (possibly) any pool entry, we need to
- load base register. */
-
- if (get_pool_size ()
- || !CONST_OK_FOR_LETTER_P (frame->frame_size, 'K')
- || (!TARGET_64BIT && current_function_uses_pic_offset_table))
- regs_ever_live[BASE_REGISTER] = 1;
-
- /* If we need the GOT pointer, remember to save/restore it. */
-
- if (current_function_uses_pic_offset_table)
- regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
-
/* Frame pointer needed. */
frame->frame_pointer_p = frame_pointer_needed;
- /* Find first and last gpr to be saved. */
+ /* Find first and last gpr to be saved. Note that at this point,
+ we assume the return register and the base register always
+ need to be saved. This is done because the usage of these
+ register might change even after the prolog was emitted.
+ If it turns out later that we really don't need them, the
+ prolog/epilog code is modified again. */
+
+ for (i = 0; i < 16; i++)
+ gprs_ever_live[i] = regs_ever_live[i];
+
+ gprs_ever_live[BASE_REGISTER] = 1;
+ gprs_ever_live[RETURN_REGNUM] = 1;
+ gprs_ever_live[STACK_POINTER_REGNUM] = frame->frame_size > 0;
for (i = 6; i < 16; i++)
- if (regs_ever_live[i])
+ if (gprs_ever_live[i])
break;
for (j = 15; j > i; j--)
- if (regs_ever_live[j])
+ if (gprs_ever_live[j])
break;
-
- if (i == 16)
- {
- /* Nothing to save / restore. */
- frame->first_save_gpr = -1;
- frame->first_restore_gpr = -1;
- frame->last_save_gpr = -1;
- frame->return_reg_saved_p = 0;
- }
- else
- {
- /* Save / Restore from gpr i to j. */
- frame->first_save_gpr = i;
- frame->first_restore_gpr = i;
- frame->last_save_gpr = j;
- frame->return_reg_saved_p = (j >= RETURN_REGNUM && i <= RETURN_REGNUM);
- }
+
+ /* Save / Restore from gpr i to j. */
+ frame->first_save_gpr = i;
+ frame->first_restore_gpr = i;
+ frame->last_save_gpr = j;
+
+ /* Varargs functions need to save gprs 2 to 6. */
if (current_function_stdarg)
- {
- /* Varargs function need to save from gpr 2 to gpr 15. */
- frame->first_save_gpr = 2;
- }
+ frame->first_save_gpr = 2;
}
/* Return offset between argument pointer and frame pointer
@@ -3540,30 +4500,118 @@ restore_fpr (base, offset, regnum)
return emit_move_insn (gen_rtx_REG (DFmode, regnum), addr);
}
-/* Output the function prologue assembly code to the
- stdio stream FILE. The local frame size is passed
- in LSIZE. */
+/* Generate insn to save registers FIRST to LAST into
+ the register save area located at offset OFFSET
+ relative to register BASE. */
-void
-s390_function_prologue (file, lsize)
- FILE *file ATTRIBUTE_UNUSED;
- HOST_WIDE_INT lsize ATTRIBUTE_UNUSED;
+static rtx
+save_gprs (base, offset, first, last)
+ rtx base;
+ int offset;
+ int first;
+ int last;
{
- s390_chunkify_pool ();
- s390_split_branches ();
+ rtx addr, insn, note;
+ int i;
+
+ addr = plus_constant (base, offset + first * UNITS_PER_WORD);
+ addr = gen_rtx_MEM (Pmode, addr);
+ set_mem_alias_set (addr, s390_sr_alias_set);
+
+ /* Special-case single register. */
+ if (first == last)
+ {
+ if (TARGET_64BIT)
+ insn = gen_movdi (addr, gen_rtx_REG (Pmode, first));
+ else
+ insn = gen_movsi (addr, gen_rtx_REG (Pmode, first));
+
+ RTX_FRAME_RELATED_P (insn) = 1;
+ return insn;
+ }
+
+
+ insn = gen_store_multiple (addr,
+ gen_rtx_REG (Pmode, first),
+ GEN_INT (last - first + 1));
+
+
+ /* We need to set the FRAME_RELATED flag on all SETs
+ inside the store-multiple pattern.
+
+ However, we must not emit DWARF records for registers 2..5
+ if they are stored for use by variable arguments ...
+
+ ??? Unfortunately, it is not enough to simply not the the
+ FRAME_RELATED flags for those SETs, because the first SET
+ of the PARALLEL is always treated as if it had the flag
+ set, even if it does not. Therefore we emit a new pattern
+ without those registers as REG_FRAME_RELATED_EXPR note. */
+
+ if (first >= 6)
+ {
+ rtx pat = PATTERN (insn);
+
+ for (i = 0; i < XVECLEN (pat, 0); i++)
+ if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
+ RTX_FRAME_RELATED_P (XVECEXP (pat, 0, i)) = 1;
+
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+ else if (last >= 6)
+ {
+ addr = plus_constant (base, offset + 6 * UNITS_PER_WORD);
+ note = gen_store_multiple (gen_rtx_MEM (Pmode, addr),
+ gen_rtx_REG (Pmode, 6),
+ GEN_INT (last - 6 + 1));
+ note = PATTERN (note);
+
+ REG_NOTES (insn) =
+ gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
+ note, REG_NOTES (insn));
+
+ for (i = 0; i < XVECLEN (note, 0); i++)
+ if (GET_CODE (XVECEXP (note, 0, i)) == SET)
+ RTX_FRAME_RELATED_P (XVECEXP (note, 0, i)) = 1;
+
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+
+ return insn;
}
-/* Output the function epilogue assembly code to the
- stdio stream FILE. The local frame size is passed
- in LSIZE. */
+/* Generate insn to restore registers FIRST to LAST from
+ the register save area located at offset OFFSET
+ relative to register BASE. */
-void
-s390_function_epilogue (file, lsize)
- FILE *file ATTRIBUTE_UNUSED;
- HOST_WIDE_INT lsize ATTRIBUTE_UNUSED;
+static rtx
+restore_gprs (base, offset, first, last)
+ rtx base;
+ int offset;
+ int first;
+ int last;
{
- current_function_uses_pic_offset_table = 0;
- s390_function_count++;
+ rtx addr, insn;
+
+ addr = plus_constant (base, offset + first * UNITS_PER_WORD);
+ addr = gen_rtx_MEM (Pmode, addr);
+ set_mem_alias_set (addr, s390_sr_alias_set);
+
+ /* Special-case single register. */
+ if (first == last)
+ {
+ if (TARGET_64BIT)
+ insn = gen_movdi (gen_rtx_REG (Pmode, first), addr);
+ else
+ insn = gen_movsi (gen_rtx_REG (Pmode, first), addr);
+
+ return insn;
+ }
+
+ insn = gen_load_multiple (gen_rtx_REG (Pmode, first),
+ addr,
+ GEN_INT (last - first + 1));
+ return insn;
}
/* Expand the prologue into a bunch of separate insns. */
@@ -3582,7 +4630,7 @@ s390_emit_prologue ()
/* Choose best register to use for temp use within prologue. */
- if (frame.return_reg_saved_p
+ if (!current_function_is_leaf
&& !has_hard_reg_initial_val (Pmode, RETURN_REGNUM)
&& get_pool_size () < S390_POOL_CHUNK_MAX / 2)
temp_reg = gen_rtx_REG (Pmode, RETURN_REGNUM);
@@ -3591,69 +4639,9 @@ s390_emit_prologue ()
/* Save call saved gprs. */
- if (frame.first_save_gpr != -1)
- {
- addr = plus_constant (stack_pointer_rtx,
- frame.first_save_gpr * UNITS_PER_WORD);
- addr = gen_rtx_MEM (Pmode, addr);
- set_mem_alias_set (addr, s390_sr_alias_set);
-
- if (frame.first_save_gpr != frame.last_save_gpr )
- {
- insn = emit_insn (gen_store_multiple (addr,
- gen_rtx_REG (Pmode, frame.first_save_gpr),
- GEN_INT (frame.last_save_gpr
- - frame.first_save_gpr + 1)));
-
- /* We need to set the FRAME_RELATED flag on all SETs
- inside the store-multiple pattern.
-
- However, we must not emit DWARF records for registers 2..5
- if they are stored for use by variable arguments ...
-
- ??? Unfortunately, it is not enough to simply not the the
- FRAME_RELATED flags for those SETs, because the first SET
- of the PARALLEL is always treated as if it had the flag
- set, even if it does not. Therefore we emit a new pattern
- without those registers as REG_FRAME_RELATED_EXPR note. */
-
- if (frame.first_save_gpr >= 6)
- {
- rtx pat = PATTERN (insn);
-
- for (i = 0; i < XVECLEN (pat, 0); i++)
- if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
- RTX_FRAME_RELATED_P (XVECEXP (pat, 0, i)) = 1;
-
- RTX_FRAME_RELATED_P (insn) = 1;
- }
- else if (frame.last_save_gpr >= 6)
- {
- rtx note, naddr;
- naddr = plus_constant (stack_pointer_rtx, 6 * UNITS_PER_WORD);
- note = gen_store_multiple (gen_rtx_MEM (Pmode, naddr),
- gen_rtx_REG (Pmode, 6),
- GEN_INT (frame.last_save_gpr - 6 + 1));
- note = PATTERN (note);
-
- REG_NOTES (insn) =
- gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
- note, REG_NOTES (insn));
-
- for (i = 0; i < XVECLEN (note, 0); i++)
- if (GET_CODE (XVECEXP (note, 0, i)) == SET)
- RTX_FRAME_RELATED_P (XVECEXP (note, 0, i)) = 1;
-
- RTX_FRAME_RELATED_P (insn) = 1;
- }
- }
- else
- {
- insn = emit_move_insn (addr,
- gen_rtx_REG (Pmode, frame.first_save_gpr));
- RTX_FRAME_RELATED_P (insn) = 1;
- }
- }
+ insn = save_gprs (stack_pointer_rtx, 0,
+ frame.first_save_gpr, frame.last_save_gpr);
+ emit_insn (insn);
/* Dump constant pool and set constant pool register (13). */
@@ -3765,7 +4753,7 @@ s390_emit_prologue ()
/* Set up got pointer, if needed. */
- if (current_function_uses_pic_offset_table)
+ if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
{
rtx got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
SYMBOL_REF_FLAG (got_symbol) = 1;
@@ -3912,7 +4900,7 @@ s390_emit_epilogue ()
if (frame.first_restore_gpr != -1)
{
- rtx addr;
+ rtx insn, addr;
int i;
/* Check for global register and save them
@@ -3943,8 +4931,7 @@ s390_emit_epilogue ()
/* Fetch return address from stack before load multiple,
this will do good for scheduling. */
- if (frame.last_save_gpr >= RETURN_REGNUM
- && frame.first_restore_gpr < RETURN_REGNUM)
+ if (!current_function_is_leaf)
{
int return_regnum = find_unused_clobbered_reg();
if (!return_regnum)
@@ -3964,23 +4951,9 @@ s390_emit_epilogue ()
emit_insn (gen_blockage());
- addr = plus_constant (frame_pointer,
- offset + frame.first_restore_gpr * UNITS_PER_WORD);
- addr = gen_rtx_MEM (Pmode, addr);
- set_mem_alias_set (addr, s390_sr_alias_set);
-
- if (frame.first_restore_gpr != frame.last_save_gpr)
- {
- emit_insn (gen_load_multiple (
- gen_rtx_REG (Pmode, frame.first_restore_gpr),
- addr,
- GEN_INT (frame.last_save_gpr - frame.first_restore_gpr + 1)));
- }
- else
- {
- emit_move_insn (gen_rtx_REG (Pmode, frame.first_restore_gpr),
- addr);
- }
+ insn = restore_gprs (frame_pointer, offset,
+ frame.first_restore_gpr, frame.last_save_gpr);
+ emit_insn (insn);
}
/* Return to caller. */
@@ -4518,7 +5491,7 @@ s390_function_profiler (file, labelno)
rtx op[7];
char label[128];
- sprintf (label, "%sP%d", LPREFIX, labelno);
+ ASM_GENERATE_INTERNAL_LABEL (label, "LP", labelno);
fprintf (file, "# function profiler \n");
@@ -4552,7 +5525,7 @@ s390_function_profiler (file, labelno)
output_asm_insn ("bras\t%2,%l6", op);
output_asm_insn (".long\t%4", op);
output_asm_insn (".long\t%3", op);
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (op[6]));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (op[6]));
output_asm_insn ("l\t%0,0(%2)", op);
output_asm_insn ("l\t%2,4(%2)", op);
output_asm_insn ("basr\t%0,%0", op);
@@ -4565,10 +5538,10 @@ s390_function_profiler (file, labelno)
output_asm_insn ("st\t%0,%1", op);
output_asm_insn ("bras\t%2,%l6", op);
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (op[5]));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (op[5]));
output_asm_insn (".long\t%4-%l5", op);
output_asm_insn (".long\t%3-%l5", op);
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (op[6]));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (op[6]));
output_asm_insn ("lr\t%0,%2", op);
output_asm_insn ("a\t%0,0(%2)", op);
output_asm_insn ("a\t%2,4(%2)", op);
@@ -4613,3 +5586,78 @@ s390_encode_section_info (decl, first)
}
}
}
+
+static void
+s390_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ if (TARGET_64BIT)
+ {
+ if (flag_pic)
+ {
+ fprintf (file, "\tlarl 1,0f\n");
+ fprintf (file, "\tagf %d,0(1)\n",
+ aggregate_value_p (TREE_TYPE
+ (TREE_TYPE (function))) ? 3 :2 );
+ fprintf (file, "\tlarl 1,");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "@GOTENT\n");
+ fprintf (file, "\tlg 1,0(1)\n");
+ fprintf (file, "\tbr 1\n");
+ fprintf (file, "0:\t.long ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, "\n");
+ }
+ else
+ {
+ fprintf (file, "\tlarl 1,0f\n");
+ fprintf (file, "\tagf %d,0(1)\n",
+ aggregate_value_p (TREE_TYPE
+ (TREE_TYPE (function))) ? 3 :2 );
+ fprintf (file, "\tjg ");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "\n");
+ fprintf (file, "0:\t.long ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, "\n");
+ }
+ }
+ else
+ {
+ if (flag_pic)
+ {
+ fprintf (file, "\tbras 1,0f\n");
+ fprintf (file, "\t.long _GLOBAL_OFFSET_TABLE_-.\n");
+ fprintf (file, "\t.long ");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "@GOT\n");
+ fprintf (file, "\t.long ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, "\n");
+ fprintf (file, "0:\tal %d,8(1)\n",
+ aggregate_value_p (TREE_TYPE
+ (TREE_TYPE (function))) ? 3 : 2 );
+ fprintf (file, "\tl 0,4(1)\n");
+ fprintf (file, "\tal 1,0(1)\n");
+ fprintf (file, "\talr 1,0\n");
+ fprintf (file, "\tl 1,0(1)\n");
+ fprintf (file, "\tbr 1\n");
+ } else {
+ fprintf (file, "\tbras 1,0f\n");
+ fprintf (file, "\t.long ");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "-.\n");
+ fprintf (file, "\t.long ");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, (delta));
+ fprintf (file, "\n");
+ fprintf (file, "0:\tal %d,4(1)\n",
+ aggregate_value_p (TREE_TYPE
+ (TREE_TYPE (function))) ? 3 : 2 );
+ fprintf (file, "\tal 1,0(1)\n");
+ fprintf (file, "\tbr 1\n");
+ }
+ }
+}
diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h
index c5ba4270d37..607d2ddd51e 100644
--- a/gcc/config/s390/s390.h
+++ b/gcc/config/s390/s390.h
@@ -94,10 +94,6 @@ extern int target_flags;
#define TARGET_IBM_FLOAT 0
#define TARGET_IEEE_FLOAT 1
-/* The current function count for create unique internal labels. */
-
-extern int s390_function_count;
-
/* The amount of space used for outgoing arguments. */
extern int current_function_outgoing_args_size;
@@ -860,12 +856,6 @@ CUMULATIVE_ARGS;
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT */
-/* #define HAVE_POST_DECREMENT */
-
-/* #define HAVE_PRE_DECREMENT */
-/* #define HAVE_PRE_INCREMENT */
-
/* These assume that REGNO is a hard or pseudo reg number. They give
nonzero only if REGNO is a hard reg of the suitable class or a pseudo
reg currently allocated to a suitable hard reg.
@@ -1039,10 +1029,23 @@ CUMULATIVE_ARGS;
#define DEFAULT_SIGNED_CHAR 0
-/* Max number of bytes we can move from memory to memory in one reasonably
- fast instruction. */
+/* The maximum number of bytes that a single instruction can move quickly
+ between memory and registers or between two memory locations. */
+
+#define MOVE_MAX (TARGET_64BIT ? 16 : 8)
+#define MAX_MOVE_MAX 16
-#define MOVE_MAX 256
+/* Determine whether to use move_by_pieces or block move insn. */
+
+#define MOVE_BY_PIECES_P(SIZE, ALIGN) \
+ ( (SIZE) == 1 || (SIZE) == 2 || (SIZE) == 4 \
+ || (TARGET_64BIT && (SIZE) == 8) )
+
+/* Determine whether to use clear_by_pieces or block clear insn. */
+
+#define CLEAR_BY_PIECES_P(SIZE, ALIGN) \
+ ( (SIZE) == 1 || (SIZE) == 2 || (SIZE) == 4 \
+ || (TARGET_64BIT && (SIZE) == 8) )
/* Nonzero if access to memory by bytes is slow and undesirable. */
@@ -1136,17 +1139,17 @@ CUMULATIVE_ARGS;
case MINUS: \
case NEG: \
case NOT: \
- return 1; \
+ return COSTS_N_INSNS (1); \
case MULT: \
if (GET_MODE (XEXP (X, 0)) == DImode) \
- return 40; \
- else \
- return 7; \
+ return COSTS_N_INSNS (40); \
+ else \
+ return COSTS_N_INSNS (7); \
case DIV: \
case UDIV: \
case MOD: \
case UMOD: \
- return 33;
+ return COSTS_N_INSNS (33);
/* An expression giving the cost of an addressing mode that contains
@@ -1188,13 +1191,9 @@ CUMULATIVE_ARGS;
of registers on machines with lots of registers.
This macro will normally either not be defined or be defined as a
- constant.
-
- On s390 symbols are expensive if compiled with fpic
- lifetimes. */
+ constant. */
-#define ADDRESS_COST(RTX) \
- ((flag_pic && GET_CODE (RTX) == SYMBOL_REF) ? 2 : 1)
+#define ADDRESS_COST(RTX) s390_address_cost ((RTX))
/* On s390, copy between fprs and gprs is expensive. */
@@ -1232,10 +1231,36 @@ CUMULATIVE_ARGS;
extern struct rtx_def *s390_compare_op0, *s390_compare_op1;
+/* implicit call of memcpy, not bcopy */
+
+#define TARGET_MEM_FUNCTIONS
+
+
+/* Assembler file format. */
+
+/* Character to start a comment. */
+#define ASM_COMMENT_START "#"
+
+/* Declare an uninitialized external linkage data object. */
+#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
+ asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
+
+/* Globalizing directive for a label. */
+#define GLOBAL_ASM_OP ".globl "
+
+/* Advance the location counter to a multiple of 2**LOG bytes. */
+#define ASM_OUTPUT_ALIGN(FILE, LOG) \
+ if ((LOG)) fprintf ((FILE), "\t.align\t%d\n", 1 << (LOG))
+
+/* Advance the location counter by SIZE bytes. */
+#define ASM_OUTPUT_SKIP(FILE, SIZE) \
+ fprintf ((FILE), "\t.set\t.,.+%u\n", (SIZE))
+
+/* The LOCAL_LABEL_PREFIX variable is used by dbxelf.h. */
+#define LOCAL_LABEL_PREFIX "."
/* How to refer to registers in assembler output. This sequence is
indexed by compiler's hard-register-number (see above). */
-
#define REGISTER_NAMES \
{ "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", \
"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", \
@@ -1244,23 +1269,37 @@ extern struct rtx_def *s390_compare_op0, *s390_compare_op1;
"%ap", "%cc", "%fp" \
}
-/* implicit call of memcpy, not bcopy */
-
-#define TARGET_MEM_FUNCTIONS
-
/* Either simplify a location expression, or return the original. */
-
#define ASM_SIMPLIFY_DWARF_ADDR(X) \
s390_simplify_dwarf_addr (X)
-/* Print operand X (an rtx) in assembler syntax to file FILE.
- CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
- For `%' followed by punctuation, CODE is the punctuation and X is null. */
-
+/* Print operand X (an rtx) in assembler syntax to file FILE. */
#define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
-
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
+/* Output an element of a case-vector that is absolute. */
+#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
+do { \
+ char buf[32]; \
+ fputs (integer_asm_op (UNITS_PER_WORD, TRUE), (FILE)); \
+ ASM_GENERATE_INTERNAL_LABEL (buf, "L", (VALUE)); \
+ assemble_name ((FILE), buf); \
+ fputc ('\n', (FILE)); \
+} while (0)
+
+/* Output an element of a case-vector that is relative. */
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
+do { \
+ char buf[32]; \
+ fputs (integer_asm_op (UNITS_PER_WORD, TRUE), (FILE)); \
+ ASM_GENERATE_INTERNAL_LABEL (buf, "L", (VALUE)); \
+ assemble_name ((FILE), buf); \
+ fputc ('-', (FILE)); \
+ ASM_GENERATE_INTERNAL_LABEL (buf, "L", (REL)); \
+ assemble_name ((FILE), buf); \
+ fputc ('\n', (FILE)); \
+} while (0)
+
/* Define the codes that are matched by predicates in aux-output.c. */
@@ -1277,6 +1316,17 @@ extern struct rtx_def *s390_compare_op0, *s390_compare_op1;
{"s390_plus_operand", { PLUS }},
+/* Sections. */
+
+/* Output before read-only data. */
+#define TEXT_SECTION_ASM_OP ".text"
+
+/* Output before writable (initialized) data. */
+#define DATA_SECTION_ASM_OP ".data"
+
+/* Output before writable (uninitialized) data. */
+#define BSS_SECTION_ASM_OP ".bss"
+
/* S/390 constant pool breaks the devices in crtstuff.c to control section
in where code resides. We have to write it as asm code. */
#ifndef __s390x__
@@ -1294,7 +1344,6 @@ extern struct rtx_def *s390_compare_op0, *s390_compare_op1;
extern int s390_pool_count;
extern int s390_nr_constants;
-extern int s390_pool_overflow;
#define ASM_OUTPUT_POOL_PROLOGUE(FILE, FUNNAME, fndecl, size) \
{ \
@@ -1349,4 +1398,11 @@ extern int s390_pool_overflow;
goto WIN; \
}
+/* In rare cases, correct code generation requires extra machine dependent
+ processing between the second jump optimization pass and delayed branch
+ scheduling. On those machines, define this macro as a C statement to act on
+ the code starting at INSN. */
+
+#define MACHINE_DEPENDENT_REORG(INSN) s390_machine_dependent_reorg (INSN)
+
#endif
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index f8ddc2f82aa..f03d97de952 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -278,7 +278,7 @@
(define_insn "*tmqi_ext"
[(set (reg 33)
- (compare (zero_extract:SI (match_operand:QI 0 "s_operand" "Q")
+ (compare (zero_extract:SI (match_operand:QI 0 "memory_operand" "Q")
(match_operand:SI 1 "const_int_operand" "n")
(match_operand:SI 2 "const_int_operand" "n"))
(const_int 0)))]
@@ -298,54 +298,9 @@
; Test-under-Mask instructions
-(define_insn "*tmdi_reg"
- [(set (reg 33)
- (compare (and:DI (match_operand:DI 0 "register_operand" "%d")
- (match_operand:DI 1 "immediate_operand" "n"))
- (match_operand:DI 2 "immediate_operand" "n")))]
- "TARGET_64BIT
- && s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 1))
- && s390_single_hi (operands[1], DImode, 0) >= 0"
- "*
-{
- int part = s390_single_hi (operands[1], DImode, 0);
- operands[1] = GEN_INT (s390_extract_hi (operands[1], DImode, part));
-
- switch (part)
- {
- case 0: return \"tmhh\\t%0,%x1\";
- case 1: return \"tmhl\\t%0,%x1\";
- case 2: return \"tmlh\\t%0,%x1\";
- case 3: return \"tmll\\t%0,%x1\";
- default: abort ();
- }
-}"
- [(set_attr "op_type" "RI")])
-
-(define_insn "*tmsi_reg"
- [(set (reg 33)
- (compare (and:SI (match_operand:SI 0 "register_operand" "%d")
- (match_operand:SI 1 "immediate_operand" "n"))
- (match_operand:SI 2 "immediate_operand" "n")))]
- "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 1))
- && s390_single_hi (operands[1], SImode, 0) >= 0"
- "*
-{
- int part = s390_single_hi (operands[1], SImode, 0);
- operands[1] = GEN_INT (s390_extract_hi (operands[1], SImode, part));
-
- switch (part)
- {
- case 0: return \"tmh\\t%0,%x1\";
- case 1: return \"tml\\t%0,%x1\";
- default: abort ();
- }
-}"
- [(set_attr "op_type" "RI")])
-
(define_insn "*tmdi_mem"
[(set (reg 33)
- (compare (and:DI (match_operand:DI 0 "s_operand" "%Q")
+ (compare (and:DI (match_operand:DI 0 "memory_operand" "Q")
(match_operand:DI 1 "immediate_operand" "n"))
(match_operand:DI 2 "immediate_operand" "n")))]
"TARGET_64BIT
@@ -365,7 +320,7 @@
(define_insn "*tmsi_mem"
[(set (reg 33)
- (compare (and:SI (match_operand:SI 0 "s_operand" "%Q")
+ (compare (and:SI (match_operand:SI 0 "memory_operand" "Q")
(match_operand:SI 1 "immediate_operand" "n"))
(match_operand:SI 2 "immediate_operand" "n")))]
"s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 0))
@@ -384,7 +339,7 @@
(define_insn "*tmhi_mem"
[(set (reg 33)
- (compare (and:SI (subreg:SI (match_operand:HI 0 "s_operand" "%Q") 0)
+ (compare (and:SI (subreg:SI (match_operand:HI 0 "memory_operand" "Q") 0)
(match_operand:SI 1 "immediate_operand" "n"))
(match_operand:SI 2 "immediate_operand" "n")))]
"s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 0))
@@ -403,7 +358,7 @@
(define_insn "*tmqi_mem"
[(set (reg 33)
- (compare (and:SI (subreg:SI (match_operand:QI 0 "s_operand" "%Q") 0)
+ (compare (and:SI (subreg:SI (match_operand:QI 0 "memory_operand" "Q") 0)
(match_operand:SI 1 "immediate_operand" "n"))
(match_operand:SI 2 "immediate_operand" "n")))]
"s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 0))"
@@ -411,6 +366,51 @@
[(set_attr "op_type" "SI")
(set_attr "atype" "mem")])
+(define_insn "*tmdi_reg"
+ [(set (reg 33)
+ (compare (and:DI (match_operand:DI 0 "nonimmediate_operand" "d")
+ (match_operand:DI 1 "immediate_operand" "n"))
+ (match_operand:DI 2 "immediate_operand" "n")))]
+ "TARGET_64BIT
+ && s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 1))
+ && s390_single_hi (operands[1], DImode, 0) >= 0"
+ "*
+{
+ int part = s390_single_hi (operands[1], DImode, 0);
+ operands[1] = GEN_INT (s390_extract_hi (operands[1], DImode, part));
+
+ switch (part)
+ {
+ case 0: return \"tmhh\\t%0,%x1\";
+ case 1: return \"tmhl\\t%0,%x1\";
+ case 2: return \"tmlh\\t%0,%x1\";
+ case 3: return \"tmll\\t%0,%x1\";
+ default: abort ();
+ }
+}"
+ [(set_attr "op_type" "RI")])
+
+(define_insn "*tmsi_reg"
+ [(set (reg 33)
+ (compare (and:SI (match_operand:SI 0 "nonimmediate_operand" "d")
+ (match_operand:SI 1 "immediate_operand" "n"))
+ (match_operand:SI 2 "immediate_operand" "n")))]
+ "s390_match_ccmode (insn, s390_tm_ccmode (operands[1], operands[2], 1))
+ && s390_single_hi (operands[1], SImode, 0) >= 0"
+ "*
+{
+ int part = s390_single_hi (operands[1], SImode, 0);
+ operands[1] = GEN_INT (s390_extract_hi (operands[1], SImode, part));
+
+ switch (part)
+ {
+ case 0: return \"tmh\\t%0,%x1\";
+ case 1: return \"tml\\t%0,%x1\";
+ default: abort ();
+ }
+}"
+ [(set_attr "op_type" "RI")])
+
(define_insn "*tmhi_full"
[(set (reg 33)
(compare (match_operand:HI 0 "register_operand" "d")
@@ -645,7 +645,7 @@
(define_insn "*cli"
[(set (reg 33)
- (compare (match_operand:QI 0 "s_operand" "Q")
+ (compare (match_operand:QI 0 "memory_operand" "Q")
(match_operand:QI 1 "immediate_operand" "n")))]
"s390_match_ccmode (insn, CCUmode)"
"cli\\t%0,%b1"
@@ -779,24 +779,17 @@
; movti instruction pattern(s).
;
-(define_insn "*movti_ss"
- [(set (match_operand:TI 0 "s_operand" "=Q")
- (match_operand:TI 1 "s_imm_operand" "Q"))]
- ""
- "mvc\\t%O0(16,%R0),%1"
- [(set_attr "op_type" "SS")
- (set_attr "atype" "mem")])
-
(define_insn "movti"
- [(set (match_operand:TI 0 "nonimmediate_operand" "=d,Q,d,m")
- (match_operand:TI 1 "general_operand" "Q,d,dKm,d"))]
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=d,Q,d,m,Q")
+ (match_operand:TI 1 "general_operand" "Q,d,dKm,d,Q"))]
"TARGET_64BIT"
"@
lmg\\t%0,%N0,%1
stmg\\t%1,%N1,%0
#
- #"
- [(set_attr "op_type" "RSE,RSE,NN,NN")
+ #
+ mvc\\t%O0(16,%R0),%1"
+ [(set_attr "op_type" "RSE,RSE,NN,NN,SS")
(set_attr "atype" "mem")])
(define_split
@@ -839,10 +832,13 @@
(match_operand:TI 1 "memory_operand" ""))]
"TARGET_64BIT && reload_completed
&& !s_operand (operands[1], VOIDmode)"
- [(set (match_dup 2) (match_dup 3))
- (set (match_dup 0) (mem:TI (match_dup 2)))]
- "operands[2] = operand_subword (operands[0], 1, 0, TImode);
- operands[3] = legitimize_la_operand (XEXP (operands[1], 0));")
+ [(set (match_dup 0) (match_dup 1))]
+ "
+{
+ rtx addr = operand_subword (operands[0], 1, 0, TImode);
+ s390_load_address (addr, XEXP (operands[1], 0));
+ operands[1] = replace_equiv_address (operands[1], addr);
+}")
;
; movdi instruction pattern(s).
@@ -913,17 +909,9 @@
(set_attr "atype" "reg")
(set_attr "type" "la")])
-(define_insn "*movdi_ss"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (match_operand:DI 1 "s_imm_operand" "Q"))]
- ""
- "mvc\\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")
- (set_attr "atype" "mem")])
-
(define_insn "*movdi_64"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,m,!*f,!*f,!m")
- (match_operand:DI 1 "general_operand" "d,m,d,*f,m,*f"))]
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,m,!*f,!*f,!m,Q")
+ (match_operand:DI 1 "general_operand" "d,m,d,*f,m,*f,Q"))]
"TARGET_64BIT"
"@
lgr\\t%0,%1
@@ -931,13 +919,14 @@
stg\\t%1,%0
ldr\\t%0,%1
ld\\t%0,%1
- std\\t%1,%0"
- [(set_attr "op_type" "RR,RXE,RXE,RR,RX,RX")
- (set_attr "atype" "reg,mem,mem,reg,mem,mem")])
+ std\\t%1,%0
+ mvc\\t%O0(8,%R0),%1"
+ [(set_attr "op_type" "RR,RXE,RXE,RR,RX,RX,SS")
+ (set_attr "atype" "reg,mem,mem,reg,mem,mem,mem")])
(define_insn "*movdi_31"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=d,Q,d,m,!*f,!*f,!m")
- (match_operand:DI 1 "general_operand" "Q,d,dKm,d,*f,m,*f"))]
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=d,Q,d,m,!*f,!*f,!m,Q")
+ (match_operand:DI 1 "general_operand" "Q,d,dKm,d,*f,m,*f,Q"))]
"!TARGET_64BIT"
"@
lm\\t%0,%N0,%1
@@ -946,9 +935,10 @@
#
ldr\\t%0,%1
ld\\t%0,%1
- std\\t%1,%0"
- [(set_attr "op_type" "RS,RS,NN,NN,RR,RX,RX")
- (set_attr "atype" "mem,mem,*,*,reg,mem,mem")])
+ std\\t%1,%0
+ mvc\\t%O0(8,%R0),%1"
+ [(set_attr "op_type" "RS,RS,NN,NN,RR,RX,RX,SS")
+ (set_attr "atype" "mem,mem,*,*,reg,mem,mem,mem")])
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "")
@@ -994,10 +984,13 @@
&& !fp_operand (operands[0], VOIDmode)
&& !fp_operand (operands[1], VOIDmode)
&& !s_operand (operands[1], VOIDmode)"
- [(set (match_dup 2) (match_dup 3))
- (set (match_dup 0) (mem:DI (match_dup 2)))]
- "operands[2] = operand_subword (operands[0], 1, 0, DImode);
- operands[3] = legitimize_la_operand (XEXP (operands[1], 0));")
+ [(set (match_dup 0) (match_dup 1))]
+ "
+{
+ rtx addr = operand_subword (operands[0], 1, 0, DImode);
+ s390_load_address (addr, XEXP (operands[1], 0));
+ operands[1] = replace_equiv_address (operands[1], addr);
+}")
;
; movsi instruction pattern(s).
@@ -1066,17 +1059,9 @@
}"
[(set_attr "op_type" "RI")])
-(define_insn "*movsi_ss"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (match_operand:SI 1 "s_imm_operand" "Q"))]
- ""
- "mvc\\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")
- (set_attr "atype" "mem")])
-
(define_insn "*movsi"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,m,!*f,!*f,!m")
- (match_operand:SI 1 "general_operand" "d,m,d,*f,m,*f"))]
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,m,!*f,!*f,!m,Q")
+ (match_operand:SI 1 "general_operand" "d,m,d,*f,m,*f,Q"))]
""
"@
lr\\t%0,%1
@@ -1084,9 +1069,10 @@
st\\t%1,%0
ler\\t%0,%1
le\\t%0,%1
- ste\\t%1,%0"
- [(set_attr "op_type" "RR,RX,RX,RR,RX,RX")
- (set_attr "atype" "reg,mem,mem,reg,mem,mem")])
+ ste\\t%1,%0
+ mvc\\t%O0(4,%R0),%1"
+ [(set_attr "op_type" "RR,RX,RX,RR,RX,RX,SS")
+ (set_attr "atype" "reg,mem,mem,reg,mem,mem,mem")])
;
@@ -1094,16 +1080,17 @@
;
(define_insn "movhi"
- [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,m")
- (match_operand:HI 1 "general_operand" "d,n,m,d"))]
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,m,Q")
+ (match_operand:HI 1 "general_operand" "d,n,m,d,Q"))]
""
"@
lr\\t%0,%1
lhi\\t%0,%h1
lh\\t%0,%1
- sth\\t%1,%0"
- [(set_attr "op_type" "RR,RI,RX,RX")
- (set_attr "atype" "reg,reg,mem,mem")])
+ sth\\t%1,%0
+ mvc\\t%O0(2,%R0),%1"
+ [(set_attr "op_type" "RR,RI,RX,RX,SS")
+ (set_attr "atype" "reg,reg,mem,mem,mem")])
;
@@ -1111,35 +1098,37 @@
;
(define_insn "movqi_64"
- [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,m,Q")
- (match_operand:QI 1 "general_operand" "d,n,m,d,n"))]
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,m,Q,Q")
+ (match_operand:QI 1 "general_operand" "d,n,m,d,n,Q"))]
"TARGET_64BIT"
"@
lr\\t%0,%1
lhi\\t%0,%b1
llgc\\t%0,%1
stc\\t%1,%0
- mvi\\t%0,%b1"
- [(set_attr "op_type" "RR,RI,RXE,RX,SI")
- (set_attr "atype" "reg,reg,mem,mem,mem")])
+ mvi\\t%0,%b1
+ mvc\\t%O0(1,%R0),%1"
+ [(set_attr "op_type" "RR,RI,RXE,RX,SI,SS")
+ (set_attr "atype" "reg,reg,mem,mem,mem,mem")])
(define_insn "movqi"
- [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,m,Q")
- (match_operand:QI 1 "general_operand" "d,n,m,d,n"))]
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,m,Q,Q")
+ (match_operand:QI 1 "general_operand" "d,n,m,d,n,Q"))]
""
"@
lr\\t%0,%1
lhi\\t%0,%b1
ic\\t%0,%1
stc\\t%1,%0
- mvi\\t%0,%b1"
- [(set_attr "op_type" "RR,RI,RX,RX,SI")
- (set_attr "atype" "reg,reg,mem,mem,mem")])
+ mvi\\t%0,%b1
+ mvc\\t%O0(1,%R0),%1"
+ [(set_attr "op_type" "RR,RI,RX,RX,SI,SS")
+ (set_attr "atype" "reg,reg,mem,mem,mem,mem")])
;
-; moveqstrictqi instruction pattern(s).
+; movstrictqi instruction pattern(s).
;
(define_insn "*movstrictqi"
@@ -1168,7 +1157,7 @@
; movstrictsi instruction pattern(s).
;
-(define_insn "movestrictsi"
+(define_insn "movstrictsi"
[(set (strict_low_part (match_operand:SI 0 "register_operand" "+d,d"))
(match_operand:SI 1 "general_operand" "d,m"))]
"TARGET_64BIT"
@@ -1196,17 +1185,9 @@
operands[1] = force_const_mem (DFmode, operands[1]);
}")
-(define_insn "*movdf_ss"
- [(set (match_operand:DF 0 "s_operand" "=Q")
- (match_operand:DF 1 "s_imm_operand" "Q"))]
- ""
- "mvc\\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")
- (set_attr "atype" "mem")])
-
(define_insn "*movdf_64"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,d,d,m")
- (match_operand:DF 1 "general_operand" "f,m,f,d,m,d"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,d,d,m,Q")
+ (match_operand:DF 1 "general_operand" "f,m,f,d,m,d,Q"))]
"TARGET_64BIT"
"@
ldr\\t%0,%1
@@ -1214,13 +1195,14 @@
std\\t%1,%0
lgr\\t%0,%1
lg\\t%0,%1
- stg\\t%1,%0"
- [(set_attr "op_type" "RR,RX,RX,RR,RXE,RXE")
- (set_attr "atype" "reg,mem,mem,reg,mem,mem")])
+ stg\\t%1,%0
+ mvc\\t%O0(8,%R0),%1"
+ [(set_attr "op_type" "RR,RX,RX,RR,RXE,RXE,SS")
+ (set_attr "atype" "reg,mem,mem,reg,mem,mem,mem")])
(define_insn "*movdf_31"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,d,Q,d,m")
- (match_operand:DF 1 "general_operand" "f,m,f,Q,d,dKm,d"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,d,Q,d,m,Q")
+ (match_operand:DF 1 "general_operand" "f,m,f,Q,d,dKm,d,Q"))]
"!TARGET_64BIT"
"@
ldr\\t%0,%1
@@ -1229,9 +1211,10 @@
lm\\t%0,%N0,%1
stm\\t%1,%N1,%0
#
- #"
- [(set_attr "op_type" "RR,RX,RX,RS,RS,NN,NN")
- (set_attr "atype" "reg,mem,mem,mem,mem,*,*")])
+ #
+ mvc\\t%O0(8,%R0),%1"
+ [(set_attr "op_type" "RR,RX,RX,RS,RS,NN,NN,SS")
+ (set_attr "atype" "reg,mem,mem,mem,mem,*,*,mem")])
(define_split
[(set (match_operand:DF 0 "nonimmediate_operand" "")
@@ -1277,10 +1260,13 @@
&& !fp_operand (operands[0], VOIDmode)
&& !fp_operand (operands[1], VOIDmode)
&& !s_operand (operands[1], VOIDmode)"
- [(set (match_dup 2) (match_dup 3))
- (set (match_dup 0) (mem:DI (match_dup 2)))]
- "operands[2] = operand_subword (operands[0], 1, 0, DFmode);
- operands[3] = legitimize_la_operand (XEXP (operands[1], 0));")
+ [(set (match_dup 0) (match_dup 1))]
+ "
+{
+ rtx addr = operand_subword (operands[0], 1, 0, DFmode);
+ s390_load_address (addr, XEXP (operands[1], 0));
+ operands[1] = replace_equiv_address (operands[1], addr);
+}")
;
; movsf instruction pattern(s).
@@ -1299,17 +1285,9 @@
operands[1] = force_const_mem (SFmode, operands[1]);
}")
-(define_insn "*movsf_ss"
- [(set (match_operand:SF 0 "s_operand" "=Q")
- (match_operand:SF 1 "s_imm_operand" "Q"))]
- ""
- "mvc\\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")
- (set_attr "atype" "mem")])
-
(define_insn "*movsf"
- [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,m,d,d,m")
- (match_operand:SF 1 "general_operand" "f,m,f,d,m,d"))]
+ [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,m,d,d,m,Q")
+ (match_operand:SF 1 "general_operand" "f,m,f,d,m,d,Q"))]
""
"@
ler\\t%0,%1
@@ -1317,9 +1295,10 @@
ste\\t%1,%0
lr\\t%0,%1
l\\t%0,%1
- st\\t%1,%0"
- [(set_attr "op_type" "RR,RX,RX,RR,RX,RX")
- (set_attr "atype" "reg,mem,mem,reg,mem,mem")])
+ st\\t%1,%0
+ mvc\\t%O0(4,%R0),%1"
+ [(set_attr "op_type" "RR,RX,RX,RR,RX,RX,SS")
+ (set_attr "atype" "reg,mem,mem,reg,mem,mem,mem")])
;
; load_multiple pattern(s).
@@ -1533,172 +1512,31 @@
;;
;
-; movstrdi instruction pattern(s).
+; movstrM instruction pattern(s).
;
(define_expand "movstrdi"
- [(set (match_operand:BLK 0 "general_operand" "")
- (match_operand:BLK 1 "general_operand" ""))
- (use (match_operand:DI 2 "general_operand" ""))
- (match_operand 3 "" "")]
- "TARGET_64BIT"
- "
-{
- rtx addr0, addr1;
-
- addr0 = force_operand (XEXP (operands[0], 0), NULL_RTX);
- addr1 = force_operand (XEXP (operands[1], 0), NULL_RTX);
-
- if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) <= 256)
- {
- operands[0] = change_address (operands[0], VOIDmode, addr0);
- operands[1] = change_address (operands[1], VOIDmode, addr1);
- operands[2] = GEN_INT (INTVAL (operands[2]) - 1);
-
- emit_insn (gen_movstrdi_short (operands[0], operands[1], operands[2]));
- DONE;
- }
- else
- {
- if (TARGET_MVCLE)
- {
- /* implementation suggested by Richard Henderson <rth@cygnus.com> */
- rtx reg0 = gen_reg_rtx (TImode);
- rtx reg1 = gen_reg_rtx (TImode);
- rtx len = operands[2];
-
- if (! CONSTANT_P (len))
- len = force_reg (DImode, len);
-
- /* Load up the address+length pairs. */
-
- emit_move_insn (gen_highpart (DImode, reg0), addr0);
- emit_move_insn (gen_lowpart (DImode, reg0), len);
-
- emit_move_insn (gen_highpart (DImode, reg1), addr1);
- emit_move_insn (gen_lowpart (DImode, reg1), len);
-
- /* MOVE */
- emit_insn (gen_movstrdi_64 (reg0, reg1, reg0, reg1));
- DONE;
- }
- else
- {
- rtx label1 = gen_label_rtx ();
- rtx label2 = gen_label_rtx ();
- rtx reg0, reg1, len, blocks;
-
- reg0 = gen_reg_rtx (DImode);
- reg1 = gen_reg_rtx (DImode);
- len = gen_reg_rtx (DImode);
- blocks = gen_reg_rtx (DImode);
-
- emit_move_insn (len, operands[2]);
- emit_insn (gen_cmpdi (len, const0_rtx));
- emit_jump_insn (gen_beq (label1));
- emit_move_insn (reg0, addr0);
- emit_move_insn (reg1, addr1);
- emit_insn (gen_adddi3 (len, len, constm1_rtx));
- emit_insn (gen_ashrdi3 (blocks, len, GEN_INT (8)));
- emit_insn (gen_cmpdi (blocks, const0_rtx));
- emit_jump_insn (gen_beq (label2));
- emit_insn (gen_movstrdi_long (reg0, reg1, reg0, reg1, blocks, blocks));
- emit_label (label2);
- operands[0] = change_address (operands[0], VOIDmode, reg0);
- operands[1] = change_address (operands[1], VOIDmode, reg1);
- emit_insn (gen_movstrdi_short (operands[0], operands[1], len));
- emit_label (label1);
- DONE;
- }
- }
-}")
-
-;
-; movstrsi instruction pattern(s).
-;
+ [(set (match_operand:BLK 0 "memory_operand" "")
+ (match_operand:BLK 1 "memory_operand" ""))
+ (use (match_operand:DI 2 "general_operand" ""))
+ (match_operand 3 "" "")]
+ "TARGET_64BIT"
+ "s390_expand_movstr (operands[0], operands[1], operands[2]); DONE;")
(define_expand "movstrsi"
- [(set (match_operand:BLK 0 "general_operand" "")
- (match_operand:BLK 1 "general_operand" ""))
- (use (match_operand:SI 2 "general_operand" ""))
- (match_operand 3 "" "")]
- "!TARGET_64BIT"
- "
-{
- rtx addr0 = force_operand (XEXP (operands[0], 0), NULL_RTX);
- rtx addr1 = force_operand (XEXP (operands[1], 0), NULL_RTX);
-
- if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) <= 256)
- {
- operands[0] = change_address (operands[0], VOIDmode, addr0);
- operands[1] = change_address (operands[1], VOIDmode, addr1);
- operands[2] = GEN_INT (INTVAL (operands[2]) - 1);
-
- emit_insn (gen_movstrsi_short (operands[0], operands[1], operands[2]));
- DONE;
- }
- else
- {
- if (TARGET_MVCLE)
- {
- /* implementation suggested by Richard Henderson <rth@cygnus.com> */
- rtx reg0 = gen_reg_rtx (DImode);
- rtx reg1 = gen_reg_rtx (DImode);
- rtx len = operands[2];
-
-
- if (! CONSTANT_P (len))
- len = force_reg (SImode, len);
-
- /* Load up the address+length pairs. */
-
- emit_move_insn (gen_highpart (SImode, reg0), addr0);
- emit_move_insn (gen_lowpart (SImode, reg0), len);
-
- emit_move_insn (gen_highpart (SImode, reg1), addr1);
- emit_move_insn (gen_lowpart (SImode, reg1), len);
-
- /* MOVE */
- emit_insn (gen_movstrsi_31 (reg0, reg1, reg0, reg1));
- DONE;
- }
- else
- {
- rtx label1 = gen_label_rtx ();
- rtx label2 = gen_label_rtx ();
- rtx reg0, reg1, len, blocks;
-
- reg0 = gen_reg_rtx (SImode);
- reg1 = gen_reg_rtx (SImode);
- len = gen_reg_rtx (SImode);
- blocks = gen_reg_rtx (SImode);
-
- emit_move_insn (len, operands[2]);
- emit_insn (gen_cmpsi (len, const0_rtx));
- emit_jump_insn (gen_beq (label1));
- emit_move_insn (reg0, addr0);
- emit_move_insn (reg1, addr1);
- emit_insn (gen_addsi3 (len, len, constm1_rtx));
- emit_insn (gen_ashrsi3 (blocks, len, GEN_INT (8)));
- emit_insn (gen_cmpsi (blocks, const0_rtx));
- emit_jump_insn (gen_beq (label2));
- emit_insn (gen_movstrsi_long (reg0, reg1, reg0, reg1, blocks, blocks));
- emit_label (label2);
- operands[0] = change_address (operands[0], VOIDmode, reg0);
- operands[1] = change_address (operands[1], VOIDmode, reg1);
- emit_insn (gen_movstrsi_short (operands[0], operands[1], len));
- emit_label (label1);
- DONE;
- }
- }
-}")
+ [(set (match_operand:BLK 0 "memory_operand" "")
+ (match_operand:BLK 1 "memory_operand" ""))
+ (use (match_operand:SI 2 "general_operand" ""))
+ (match_operand 3 "" "")]
+ ""
+ "s390_expand_movstr (operands[0], operands[1], operands[2]); DONE;")
; Move a block that is up to 256 bytes in length.
; The block length is taken as (operands[2] % 256) + 1.
-(define_insn "movstrdi_short"
- [(set (match_operand:BLK 0 "s_operand" "=Q,Q")
- (match_operand:BLK 1 "s_operand" "Q,Q"))
+(define_insn "movstr_short_64"
+ [(set (match_operand:BLK 0 "memory_operand" "=Q,Q")
+ (match_operand:BLK 1 "memory_operand" "Q,Q"))
(use (match_operand:DI 2 "nonmemory_operand" "n,a"))
(clobber (match_scratch:DI 3 "=X,&a"))]
"TARGET_64BIT"
@@ -1719,12 +1557,13 @@
}
}"
[(set_attr "op_type" "SS,NN")
+ (set_attr "type" "cs,cs")
(set_attr "atype" "mem,mem")
(set_attr "length" "*,14")])
-(define_insn "movstrsi_short"
- [(set (match_operand:BLK 0 "s_operand" "=Q,Q")
- (match_operand:BLK 1 "s_operand" "Q,Q"))
+(define_insn "movstr_short_31"
+ [(set (match_operand:BLK 0 "memory_operand" "=Q,Q")
+ (match_operand:BLK 1 "memory_operand" "Q,Q"))
(use (match_operand:SI 2 "nonmemory_operand" "n,a"))
(clobber (match_scratch:SI 3 "=X,&a"))]
"!TARGET_64BIT"
@@ -1745,64 +1584,13 @@
}
}"
[(set_attr "op_type" "SS,NN")
+ (set_attr "type" "cs,cs")
(set_attr "atype" "mem,mem")
(set_attr "length" "*,14")])
-; Move a block that is a multiple of 256 bytes in length
+; Move a block of arbitrary length.
-(define_insn "movstrdi_long"
- [(set (match_operand:DI 4 "register_operand" "=d")
- (const_int 0))
- (set (match_operand:DI 0 "register_operand" "=a")
- (plus:DI (match_operand:DI 2 "register_operand" "0")
- (ashift:DI (match_operand:DI 5 "register_operand" "4")
- (const_int 8))))
- (set (match_operand:DI 1 "register_operand" "=a")
- (plus:DI (match_operand:DI 3 "register_operand" "1")
- (ashift:DI (match_dup 5) (const_int 8))))
- (set (mem:BLK (match_dup 2))
- (mem:BLK (match_dup 3)))
- (use (match_dup 5))]
- "TARGET_64BIT"
- "*
-{
- output_asm_insn (\"mvc\\t0(256,%0),0(%1)\", operands);
- output_asm_insn (\"la\\t%0,256(%0)\", operands);
- output_asm_insn (\"la\\t%1,256(%1)\", operands);
- return \"brct\\t%4,.-14\";
-}"
- [(set_attr "op_type" "NN")
- (set_attr "atype" "mem")
- (set_attr "length" "18")])
-
-(define_insn "movstrsi_long"
- [(set (match_operand:SI 4 "register_operand" "=d")
- (const_int 0))
- (set (match_operand:SI 0 "register_operand" "=a")
- (plus:SI (match_operand:SI 2 "register_operand" "0")
- (ashift:SI (match_operand:SI 5 "register_operand" "4")
- (const_int 8))))
- (set (match_operand:SI 1 "register_operand" "=a")
- (plus:SI (match_operand:SI 3 "register_operand" "1")
- (ashift:SI (match_dup 5) (const_int 8))))
- (set (mem:BLK (match_dup 2))
- (mem:BLK (match_dup 3)))
- (use (match_dup 5))]
- "!TARGET_64BIT"
- "*
-{
- output_asm_insn (\"mvc\\t0(256,%0),0(%1)\", operands);
- output_asm_insn (\"la\\t%0,256(%0)\", operands);
- output_asm_insn (\"la\\t%1,256(%1)\", operands);
- return \"brct\\t%4,.-14\";
-}"
- [(set_attr "op_type" "NN")
- (set_attr "atype" "mem")
- (set_attr "length" "18")])
-
-; Move a block that is larger than 255 bytes in length.
-
-(define_insn "movstrdi_64"
+(define_insn "movstr_long_64"
[(set (match_operand:TI 0 "register_operand" "=d")
(ashift:TI (plus:TI (match_operand:TI 2 "register_operand" "0")
(lshiftrt:TI (match_dup 2) (const_int 64)))
@@ -1817,10 +1605,11 @@
"TARGET_64BIT"
"mvcle\\t%0,%1,0\;jo\\t.-4"
[(set_attr "op_type" "NN")
+ (set_attr "type" "vs")
(set_attr "atype" "mem")
(set_attr "length" "8")])
-(define_insn "movstrsi_31"
+(define_insn "movstr_long_31"
[(set (match_operand:DI 0 "register_operand" "=d")
(ashift:DI (plus:DI (match_operand:DI 2 "register_operand" "0")
(lshiftrt:DI (match_dup 2) (const_int 32)))
@@ -1834,112 +1623,93 @@
(clobber (reg:CC 33))]
"!TARGET_64BIT"
"mvcle\\t%0,%1,0\;jo\\t.-4"
- [(set_attr "op_type" "NN")
- (set_attr "atype" "mem")
- (set_attr "length" "8")])
+ [(set_attr "op_type" "NN")
+ (set_attr "type" "vs")
+ (set_attr "atype" "mem")
+ (set_attr "length" "8")])
;
-; clrstrdi instruction pattern(s).
+; clrstrM instruction pattern(s).
;
(define_expand "clrstrdi"
- [(set (match_operand:BLK 0 "general_operand" "")
+ [(set (match_operand:BLK 0 "memory_operand" "")
(const_int 0))
(use (match_operand:DI 1 "general_operand" ""))
(match_operand 2 "" "")]
"TARGET_64BIT"
- "
-{
- rtx addr = force_operand (XEXP (operands[0], 0), NULL_RTX);
-
- operands[0] = change_address (operands[0], VOIDmode, addr);
-
- if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) < 256)
- {
- emit_insn (gen_clrstrsico (operands[0], operands[1]));
- DONE;
- }
- else
- {
- rtx reg0 = gen_reg_rtx (TImode);
- rtx reg1 = gen_reg_rtx (TImode);
- rtx len = operands[1];
-
- if (! CONSTANT_P (len))
- len = force_reg (DImode, len);
-
- /* Load up the address+length pairs. */
-
- emit_move_insn (gen_highpart (DImode, reg0), addr);
- emit_move_insn (gen_lowpart (DImode, reg0), len);
-
- emit_move_insn (gen_lowpart (DImode, reg1), const0_rtx);
-
- /* Clear! */
- emit_insn (gen_clrstrsi_64 (reg0, reg1, reg0));
- DONE;
- }
-}")
-
-;
-; clrstrsi instruction pattern(s).
-;
+ "s390_expand_clrstr (operands[0], operands[1]); DONE;")
(define_expand "clrstrsi"
- [(set (match_operand:BLK 0 "general_operand" "")
+ [(set (match_operand:BLK 0 "memory_operand" "")
(const_int 0))
(use (match_operand:SI 1 "general_operand" ""))
(match_operand 2 "" "")]
- "!TARGET_64BIT"
- "
-{
- rtx addr = force_operand (XEXP (operands[0], 0), NULL_RTX);
-
- operands[0] = change_address (operands[0], VOIDmode, addr);
-
- if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) < 256)
- {
- emit_insn (gen_clrstrsico (operands[0], operands[1]));
- DONE;
- }
- else
- {
- rtx reg0 = gen_reg_rtx (DImode);
- rtx reg1 = gen_reg_rtx (DImode);
- rtx len = operands[1];
-
- if (! CONSTANT_P (len))
- len = force_reg (SImode, len);
+ ""
+ "s390_expand_clrstr (operands[0], operands[1]); DONE;")
- /* Load up the address+length pairs. */
+; Clear a block that is up to 256 bytes in length.
+; The block length is taken as (operands[2] % 256) + 1.
- emit_move_insn (gen_highpart (SImode, reg0), addr);
- emit_move_insn (gen_lowpart (SImode, reg0), len);
+(define_insn "clrstr_short_64"
+ [(set (match_operand:BLK 0 "memory_operand" "=Q,Q")
+ (const_int 0))
+ (use (match_operand:DI 1 "nonmemory_operand" "n,a"))
+ (clobber (match_scratch:DI 2 "=X,&a"))
+ (clobber (reg:CC 33))]
+ "TARGET_64BIT"
+ "*
+{
+ switch (which_alternative)
+ {
+ case 0:
+ return \"xc\\t%O0(%b1+1,%R0),%0\";
- emit_move_insn (gen_lowpart (SImode, reg1), const0_rtx);
-
- /* CLear! */
- emit_insn (gen_clrstrsi_31 (reg0, reg1, reg0));
- DONE;
- }
-}")
+ case 1:
+ output_asm_insn (\"bras\\t%2,.+10\", operands);
+ output_asm_insn (\"xc\\t%O0(1,%R0),%0\", operands);
+ return \"ex\\t%1,0(%2)\";
-; Clear memory with length less than 256 bytes
+ default:
+ abort ();
+ }
+}"
+ [(set_attr "op_type" "SS,NN")
+ (set_attr "type" "cs,cs")
+ (set_attr "atype" "mem,mem")
+ (set_attr "length" "*,14")])
-(define_insn "clrstrsico"
- [(set (match_operand:BLK 0 "s_operand" "=Q")
+(define_insn "clrstr_short_31"
+ [(set (match_operand:BLK 0 "memory_operand" "=Q,Q")
(const_int 0))
- (use (match_operand 1 "immediate_operand" "I"))
+ (use (match_operand:SI 1 "nonmemory_operand" "n,a"))
+ (clobber (match_scratch:SI 2 "=X,&a"))
(clobber (reg:CC 33))]
- ""
- "xc\\t%O0(%1,%R0),%0"
- [(set_attr "op_type" "RS")
- (set_attr "type" "cs")
- (set_attr "atype" "mem")])
+ "!TARGET_64BIT"
+ "*
+{
+ switch (which_alternative)
+ {
+ case 0:
+ return \"xc\\t%O0(%b1+1,%R0),%0\";
+
+ case 1:
+ output_asm_insn (\"bras\\t%2,.+10\", operands);
+ output_asm_insn (\"xc\\t%O0(1,%R0),%0\", operands);
+ return \"ex\\t%1,0(%2)\";
+
+ default:
+ abort ();
+ }
+}"
+ [(set_attr "op_type" "SS,NN")
+ (set_attr "type" "cs,cs")
+ (set_attr "atype" "mem,mem")
+ (set_attr "length" "*,14")])
-; Clear memory with length greater 256 bytes or lenght not constant
+; Clear a block of arbitrary length.
-(define_insn "clrstrsi_64"
+(define_insn "clrstr_long_64"
[(set (match_operand:TI 0 "register_operand" "=d")
(ashift:TI (plus:TI (match_operand:TI 2 "register_operand" "0")
(lshiftrt:TI (match_dup 2) (const_int 64)))
@@ -1955,7 +1725,7 @@
(set_attr "type" "vs")
(set_attr "length" "8")])
-(define_insn "clrstrsi_31"
+(define_insn "clrstr_long_31"
[(set (match_operand:DI 0 "register_operand" "=d")
(ashift:DI (plus:DI (match_operand:DI 2 "register_operand" "0")
(lshiftrt:DI (match_dup 2) (const_int 32)))
@@ -1972,157 +1742,91 @@
(set_attr "length" "8")])
;
-; cmpstrdi instruction pattern(s).
+; cmpstrM instruction pattern(s).
;
(define_expand "cmpstrdi"
- [(set (match_operand:DI 0 "register_operand" "")
- (compare:DI (match_operand:BLK 1 "s_operand" "")
- (match_operand:BLK 2 "s_operand" "") ) )
- (use (match_operand:DI 3 "general_operand" ""))
- (use (match_operand:DI 4 "" ""))]
- "TARGET_64BIT"
- "
-{
- rtx addr0, addr1;
+ [(set (match_operand:DI 0 "register_operand" "")
+ (compare:DI (match_operand:BLK 1 "memory_operand" "")
+ (match_operand:BLK 2 "memory_operand" "") ) )
+ (use (match_operand:DI 3 "general_operand" ""))
+ (use (match_operand:DI 4 "" ""))]
+ "TARGET_64BIT"
+ "s390_expand_cmpstr (operands[0], operands[1],
+ operands[2], operands[3]); DONE;")
- /* for pre/post increment */
- operands[1] = protect_from_queue (operands[1], 0);
- operands[2] = protect_from_queue (operands[2], 0);
- operands[3] = protect_from_queue (operands[3], 0);
+(define_expand "cmpstrsi"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (compare:SI (match_operand:BLK 1 "memory_operand" "")
+ (match_operand:BLK 2 "memory_operand" "") ) )
+ (use (match_operand:SI 3 "general_operand" ""))
+ (use (match_operand:SI 4 "" ""))]
+ ""
+ "s390_expand_cmpstr (operands[0], operands[1],
+ operands[2], operands[3]); DONE;")
- addr0 = force_operand (XEXP (operands[1], 0), NULL_RTX);
- addr1 = force_operand (XEXP (operands[2], 0), NULL_RTX);
+; Compare a block that is up to 256 bytes in length.
+; The block length is taken as (operands[2] % 256) + 1.
- if (GET_CODE (operands[3]) == CONST_INT && INTVAL (operands[3]) < 256)
+(define_insn "cmpstr_short_64"
+ [(set (reg:CCS 33)
+ (compare:CCS (match_operand:BLK 0 "memory_operand" "=Q,Q")
+ (match_operand:BLK 1 "memory_operand" "Q,Q")))
+ (use (match_operand:DI 2 "nonmemory_operand" "n,a"))
+ (clobber (match_scratch:DI 3 "=X,&a"))]
+ "TARGET_64BIT"
+ "*
+{
+ switch (which_alternative)
{
- if (INTVAL (operands[3]) == 0) {
- emit_move_insn (operands[0], operands[3]);
- DONE;
- }
-
- operands[1] = change_address (operands[1], VOIDmode, addr0);
- operands[2] = change_address (operands[2], VOIDmode, addr1);
-
- emit_insn (gen_cmpstr_const (operands[1], operands[2], operands[3]));
- emit_insn (gen_cmpint_di (operands[0]));
- DONE;
- }
- else
- {
- /* implementation suggested by Richard Henderson <rth@cygnus.com> */
- rtx reg0 = gen_reg_rtx (TImode);
- rtx reg1 = gen_reg_rtx (TImode);
- rtx len = operands[3];
-
- if (! CONSTANT_P (len))
- len = force_reg (DImode, len);
-
- /* Load up the address+length pairs. */
- emit_move_insn (gen_highpart (DImode, reg0), addr0);
- emit_move_insn (gen_lowpart (DImode, reg0), len);
+ case 0:
+ return \"clc\\t%O0(%b2+1,%R0),%1\";
- emit_move_insn (gen_highpart (DImode, reg1), addr1);
- emit_move_insn (gen_lowpart (DImode, reg1), len);
+ case 1:
+ output_asm_insn (\"bras\\t%3,.+10\", operands);
+ output_asm_insn (\"clc\\t%O0(1,%R0),%1\", operands);
+ return \"ex\\t%2,0(%3)\";
- /* Compare! */
- emit_insn (gen_cmpstr_64 (reg0, reg1, reg0, reg1));
- emit_insn (gen_cmpint_di (operands[0]));
- DONE;
+ default:
+ abort ();
}
-}")
-
-;
-; cmpstrsi instruction pattern(s).
-;
+}"
+ [(set_attr "op_type" "SS,NN")
+ (set_attr "type" "cs,cs")
+ (set_attr "atype" "mem,mem")
+ (set_attr "length" "*,14")])
-(define_expand "cmpstrsi"
- [(set (match_operand:SI 0 "register_operand" "")
- (compare:SI (match_operand:BLK 1 "s_operand" "")
- (match_operand:BLK 2 "s_operand" "") ) )
- (use (match_operand:SI 3 "general_operand" ""))
- (use (match_operand:SI 4 "" ""))]
- ""
- "
+(define_insn "cmpstr_short_31"
+ [(set (reg:CCS 33)
+ (compare:CCS (match_operand:BLK 0 "memory_operand" "=Q,Q")
+ (match_operand:BLK 1 "memory_operand" "Q,Q")))
+ (use (match_operand:SI 2 "nonmemory_operand" "n,a"))
+ (clobber (match_scratch:SI 3 "=X,&a"))]
+ "!TARGET_64BIT"
+ "*
{
- rtx addr0, addr1;
-
- /* for pre/post increment */
- operands[1] = protect_from_queue (operands[1], 0);
- operands[2] = protect_from_queue (operands[2], 0);
- operands[3] = protect_from_queue (operands[3], 0);
-
- addr0 = force_operand (XEXP (operands[1], 0), NULL_RTX);
- addr1 = force_operand (XEXP (operands[2], 0), NULL_RTX);
-
- if (GET_CODE (operands[3]) == CONST_INT && INTVAL (operands[3]) < 256)
+ switch (which_alternative)
{
- if (INTVAL (operands[3]) == 0) {
- emit_move_insn (operands[0], operands[3]);
- DONE;
- }
-
- operands[1] = change_address (operands[1], VOIDmode, addr0);
- operands[2] = change_address (operands[2], VOIDmode, addr1);
-
- emit_insn (gen_cmpstr_const (operands[1], operands[2], operands[3]));
- emit_insn (gen_cmpint_si (operands[0]));
- DONE;
- }
- else
- {
- /* implementation suggested by Richard Henderson <rth@cygnus.com> */
- rtx reg0, reg1;
- rtx len = operands[3];
-
- if (TARGET_64BIT)
- {
- reg0 = gen_reg_rtx (TImode);
- reg1 = gen_reg_rtx (TImode);
- }
- else
- {
- reg0 = gen_reg_rtx (DImode);
- reg1 = gen_reg_rtx (DImode);
- }
-
- if (! CONSTANT_P (len))
- len = force_reg (Pmode, len);
-
- /* Load up the address+length pairs. */
- emit_move_insn (gen_highpart (Pmode, reg0), addr0);
- emit_move_insn (gen_lowpart (Pmode, reg0), len);
-
- emit_move_insn (gen_highpart (Pmode, reg1), addr1);
- emit_move_insn (gen_lowpart (Pmode, reg1), len);
+ case 0:
+ return \"clc\\t%O0(%b2+1,%R0),%1\";
- /* Compare! */
- if (TARGET_64BIT)
- emit_insn (gen_cmpstr_64 (reg0, reg1, reg0, reg1));
- else
- emit_insn (gen_cmpstr_31 (reg0, reg1, reg0, reg1));
+ case 1:
+ output_asm_insn (\"bras\\t%3,.+10\", operands);
+ output_asm_insn (\"clc\\t%O0(1,%R0),%1\", operands);
+ return \"ex\\t%2,0(%3)\";
- emit_insn (gen_cmpint_si (operands[0]));
- DONE;
+ default:
+ abort ();
}
-}")
-
-; Compare a block that is less than 256 bytes in length.
-
-(define_insn "cmpstr_const"
- [(set (reg:CCS 33)
- (compare:CCS (match_operand:BLK 0 "s_operand" "Q")
- (match_operand:BLK 1 "s_operand" "Q")))
- (use (match_operand 2 "immediate_operand" "I"))]
- "(unsigned) INTVAL (operands[2]) < 256"
- "clc\\t%O0(%c2,%R0),%1"
- [(set_attr "op_type" "SS")
- (set_attr "atype" "mem")
- (set_attr "type" "cs")])
+}"
+ [(set_attr "op_type" "SS,NN")
+ (set_attr "type" "cs,cs")
+ (set_attr "atype" "mem,mem")
+ (set_attr "length" "*,14")])
-; Compare a block that is larger than 255 bytes in length.
+; Compare a block of arbitrary length.
-(define_insn "cmpstr_64"
+(define_insn "cmpstr_long_64"
[(clobber (match_operand:TI 0 "register_operand" "=d"))
(clobber (match_operand:TI 1 "register_operand" "=d"))
(set (reg:CCS 33)
@@ -2136,7 +1840,7 @@
(set_attr "atype" "mem")
(set_attr "type" "vs")])
-(define_insn "cmpstr_31"
+(define_insn "cmpstr_long_31"
[(clobber (match_operand:DI 0 "register_operand" "=d"))
(clobber (match_operand:DI 1 "register_operand" "=d"))
(set (reg:CCS 33)
@@ -2227,13 +1931,16 @@
[(set_attr "op_type" "RS")
(set_attr "atype" "mem")])
-(define_split
- [(set (match_operand:SI 0 "register_operand" "")
- (zero_extract:SI (match_operand:QI 1 "s_operand" "")
- (match_operand 2 "const_int_operand" "")
- (const_int 0)))]
- "!TARGET_64BIT && !reload_completed
+(define_insn_and_split "*extractqi"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (zero_extract:SI (match_operand:QI 1 "s_operand" "Q")
+ (match_operand 2 "const_int_operand" "n")
+ (const_int 0)))
+ (clobber (reg:CC 33))]
+ "!TARGET_64BIT
&& INTVAL (operands[2]) > 0 && INTVAL (operands[2]) < 8"
+ "#"
+ "&& reload_completed"
[(parallel
[(set (match_dup 0) (unspec:SI [(match_dup 1)] 10))
(clobber (reg:CC 33))])
@@ -2242,15 +1949,20 @@
{
operands[2] = GEN_INT (32 - INTVAL (operands[2]));
operands[1] = change_address (operands[1], QImode, 0);
-}")
+}"
+ [(set_attr "type" "o2")
+ (set_attr "atype" "mem")])
-(define_split
- [(set (match_operand:SI 0 "register_operand" "")
- (zero_extract:SI (match_operand:QI 1 "s_operand" "")
- (match_operand 2 "const_int_operand" "")
- (const_int 0)))]
- "!TARGET_64BIT && !reload_completed
+(define_insn_and_split "*extracthi"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (zero_extract:SI (match_operand:QI 1 "s_operand" "Q")
+ (match_operand 2 "const_int_operand" "n")
+ (const_int 0)))
+ (clobber (reg:CC 33))]
+ "!TARGET_64BIT
&& INTVAL (operands[2]) >= 8 && INTVAL (operands[2]) < 16"
+ "#"
+ "&& reload_completed"
[(parallel
[(set (match_dup 0) (unspec:SI [(match_dup 1)] 10))
(clobber (reg:CC 33))])
@@ -2259,7 +1971,9 @@
{
operands[2] = GEN_INT (32 - INTVAL (operands[2]));
operands[1] = change_address (operands[1], HImode, 0);
-}")
+}"
+ [(set_attr "type" "o2")
+ (set_attr "atype" "mem")])
;
; extendsidi2 instruction pattern(s).
@@ -2548,6 +2262,21 @@
"llgh\\t%0,%1"
[(set_attr "op_type" "RXE")
(set_attr "atype" "mem")])
+
+(define_insn_and_split "*zero_extendhisi2_31"
+ [(set (match_operand:SI 0 "register_operand" "=&d")
+ (zero_extend:SI (match_operand:HI 1 "memory_operand" "Q")))
+ (clobber (reg:CC 33))]
+ "!TARGET_64BIT"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0) (const_int 0))
+ (parallel
+ [(set (strict_low_part (match_dup 2)) (match_dup 1))
+ (clobber (reg:CC 33))])]
+ "operands[2] = gen_lowpart (HImode, operands[0]);"
+ [(set_attr "type" "o2")
+ (set_attr "atype" "mem")])
;
; zero_extendqisi2 instruction pattern(s).
@@ -2572,6 +2301,18 @@
"llgc\\t%0,%1"
[(set_attr "op_type" "RXE")
(set_attr "atype" "mem")])
+
+(define_insn_and_split "*zero_extendqisi2_31"
+ [(set (match_operand:SI 0 "register_operand" "=&d")
+ (zero_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
+ "!TARGET_64BIT"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0) (const_int 0))
+ (set (strict_low_part (match_dup 2)) (match_dup 1))]
+ "operands[2] = gen_lowpart (QImode, operands[0]);"
+ [(set_attr "type" "o2")
+ (set_attr "atype" "mem")])
;
; zero_extendqihi2 instruction pattern(s).
@@ -2591,13 +2332,25 @@
(define_insn "*zero_extendqihi2_64"
[(set (match_operand:HI 0 "register_operand" "=d")
- (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))
- (clobber (reg:CC 33))]
+ (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
"TARGET_64BIT"
"llgc\\t%0,%1"
[(set_attr "op_type" "RXE")
(set_attr "atype" "mem")])
+(define_insn_and_split "*zero_extendqihi2_31"
+ [(set (match_operand:HI 0 "register_operand" "=&d")
+ (zero_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
+ "!TARGET_64BIT"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0) (const_int 0))
+ (set (strict_low_part (match_dup 2)) (match_dup 1))]
+ "operands[2] = gen_lowpart (QImode, operands[0]);"
+ [(set_attr "type" "o2")
+ (set_attr "atype" "mem")])
+
+
;
; fixuns_truncdfdi2 and fix_truncdfsi2 instruction pattern(s).
;
@@ -3044,20 +2797,24 @@
; adddi3 instruction pattern(s).
;
-(define_insn "addaddr_esame"
- [(set (match_operand:DI 0 "register_operand" "=a,a")
- (plus:DI (match_operand:DI 1 "register_operand" "%a,a")
- (match_operand:DI 2 "nonmemory_operand" "J,a")))]
- "TARGET_64BIT && (((REGNO (operands[1]) == STACK_POINTER_REGNUM ) ||
- (REGNO (operands[1]) == BASE_REGISTER)) &&
- (GET_CODE (operands[2]) == REG ||
- CONST_OK_FOR_LETTER_P (INTVAL (operands[2]),'J')))"
- "@
- la\\t%0,%c2(,%1)
- la\\t%0,0(%1,%2)"
- [(set_attr "op_type" "RX")
- (set_attr "atype" "mem")
- (set_attr "type" "la")])
+(define_insn "*la_64_cc"
+ [(set (match_operand:DI 0 "register_operand" "=d")
+ (match_operand:QI 1 "address_operand" "p"))
+ (clobber (reg:CC 33))]
+ "TARGET_64BIT
+ && preferred_la_operand_p (operands[1], 1)"
+ "#"
+ [(set_attr "op_type" "RX")
+ (set_attr "atype" "mem")
+ (set_attr "type" "la")])
+
+(define_split
+ [(set (match_operand:DI 0 "register_operand" "")
+ (match_operand:QI 1 "address_operand" ""))
+ (clobber (reg:CC 33))]
+ "TARGET_64BIT && reload_completed
+ && preferred_la_operand_p (operands[1], 0)"
+ [(set (match_dup 0) (match_dup 1))])
(define_insn "*adddi3_sign"
[(set (match_operand:DI 0 "register_operand" "=d,d")
@@ -3110,9 +2867,23 @@
[(set_attr "op_type" "RRE,RXE")
(set_attr "atype" "reg,mem")])
+(define_insn "*adddi3_imm_cc"
+ [(set (reg 33)
+ (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "0")
+ (match_operand:DI 2 "const_int_operand" "K"))
+ (const_int 0)))
+ (set (match_operand:DI 0 "register_operand" "=d")
+ (plus:DI (match_dup 1) (match_dup 2)))]
+ "TARGET_64BIT
+ && s390_match_ccmode (insn, CCAmode)
+ && CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K')"
+ "aghi\\t%0,%h2"
+ [(set_attr "op_type" "RI")
+ (set_attr "atype" "reg")])
+
(define_insn "*adddi3_cc"
[(set (reg 33)
- (compare (plus:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:DI 0 "register_operand" "=d,d")
@@ -3126,7 +2897,7 @@
(define_insn "*adddi3_cconly"
[(set (reg 33)
- (compare (plus:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:DI 0 "=d,d"))]
@@ -3139,7 +2910,7 @@
(define_insn "*adddi3_cconly2"
[(set (reg 33)
- (compare (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(neg:SI (match_operand:DI 2 "general_operand" "d,m"))))
(clobber (match_scratch:DI 0 "=d,d"))]
"s390_match_ccmode(insn, CCLmode) && TARGET_64BIT"
@@ -3151,7 +2922,7 @@
(define_insn "*adddi3_64"
[(set (match_operand:DI 0 "register_operand" "=d,d,d")
- (plus:DI (match_operand:DI 1 "register_operand" "%0,0,0")
+ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
(match_operand:DI 2 "general_operand" "d,K,m") ) )
(clobber (reg:CC 33))]
"TARGET_64BIT"
@@ -3164,7 +2935,7 @@
(define_insn_and_split "*adddi3_31"
[(set (match_operand:DI 0 "register_operand" "=&d")
- (plus:DI (match_operand:DI 1 "register_operand" "%0")
+ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
(match_operand:DI 2 "general_operand" "dm") ) )
(clobber (reg:CC 33))]
"!TARGET_64BIT"
@@ -3199,7 +2970,7 @@
(define_expand "adddi3"
[(parallel
[(set (match_operand:DI 0 "register_operand" "")
- (plus:DI (match_operand:DI 1 "register_operand" "")
+ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "")
(match_operand:DI 2 "general_operand" "")))
(clobber (reg:CC 33))])]
""
@@ -3217,7 +2988,7 @@
(define_expand "reload_indi"
[(parallel [(match_operand:DI 0 "register_operand" "=a")
(match_operand:DI 1 "s390_plus_operand" "")
- (match_operand:TI 2 "register_operand" "=&a")])]
+ (match_operand:DI 2 "register_operand" "=&a")])]
"TARGET_64BIT"
"
{
@@ -3230,19 +3001,41 @@
; addsi3 instruction pattern(s).
;
-(define_insn "*la_ccclobber"
+(define_insn "*la_31_cc"
[(set (match_operand:SI 0 "register_operand" "=d")
(match_operand:QI 1 "address_operand" "p"))
(clobber (reg:CC 33))]
- "legitimate_la_operand_p (operands[1])"
- "la\\t%0,%a1"
- [(set_attr "op_type" "RX")
- (set_attr "atype" "mem")
- (set_attr "type" "la")])
+ "!TARGET_64BIT
+ && preferred_la_operand_p (operands[1], 1)"
+ "#"
+ [(set_attr "op_type" "RX")
+ (set_attr "atype" "mem")
+ (set_attr "type" "la")])
+
+(define_split
+ [(set (match_operand:SI 0 "register_operand" "")
+ (match_operand:QI 1 "address_operand" ""))
+ (clobber (reg:CC 33))]
+ "!TARGET_64BIT && reload_completed
+ && preferred_la_operand_p (operands[1], 0)"
+ [(set (match_dup 0) (match_dup 1))])
+
+(define_insn "*addsi3_imm_cc"
+ [(set (reg 33)
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "0")
+ (match_operand:SI 2 "const_int_operand" "K"))
+ (const_int 0)))
+ (set (match_operand:SI 0 "register_operand" "=d")
+ (plus:SI (match_dup 1) (match_dup 2)))]
+ "s390_match_ccmode (insn, CCAmode)
+ && CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K')"
+ "ahi\\t%0,%h2"
+ [(set_attr "op_type" "RI")
+ (set_attr "atype" "reg")])
(define_insn "*addsi3_carry1_cc"
[(set (reg 33)
- (compare (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(match_dup 1)))
(set (match_operand:SI 0 "register_operand" "=d,d")
@@ -3256,7 +3049,7 @@
(define_insn "*addsi3_carry1_cconly"
[(set (reg 33)
- (compare (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(match_dup 1)))
(clobber (match_scratch:SI 0 "=d,d"))]
@@ -3269,7 +3062,7 @@
(define_insn "*addsi3_carry2_cc"
[(set (reg 33)
- (compare (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(match_dup 2)))
(set (match_operand:SI 0 "register_operand" "=d,d")
@@ -3283,7 +3076,7 @@
(define_insn "*addsi3_carry2_cconly"
[(set (reg 33)
- (compare (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(match_dup 2)))
(clobber (match_scratch:SI 0 "=d,d"))]
@@ -3296,7 +3089,7 @@
(define_insn "*addsi3_cc"
[(set (reg 33)
- (compare (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:SI 0 "register_operand" "=d,d")
@@ -3310,7 +3103,7 @@
(define_insn "*addsi3_cconly"
[(set (reg 33)
- (compare (plus:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:SI 0 "=d,d"))]
@@ -3323,7 +3116,7 @@
(define_insn "*addsi3_cconly2"
[(set (reg 33)
- (compare (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(neg:SI (match_operand:SI 2 "general_operand" "d,m"))))
(clobber (match_scratch:SI 0 "=d,d"))]
"s390_match_ccmode(insn, CCLmode)"
@@ -3355,7 +3148,7 @@
(define_insn "addsi3"
[(set (match_operand:SI 0 "register_operand" "=d,d,d")
- (plus:SI (match_operand:SI 1 "register_operand" "%0,0,0")
+ (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
(match_operand:SI 2 "general_operand" "d,K,m")))
(clobber (reg:CC 33))]
""
@@ -3369,7 +3162,42 @@
(define_insn "*la_31"
[(set (match_operand:SI 0 "register_operand" "=d")
(match_operand:QI 1 "address_operand" "p"))]
- "legitimate_la_operand_p (operands[1])"
+ "!TARGET_64BIT && legitimate_la_operand_p (operands[1])"
+ "la\\t%0,%a1"
+ [(set_attr "op_type" "RX")
+ (set_attr "atype" "mem")
+ (set_attr "type" "la")])
+
+(define_insn "*la_31_and"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (and:SI (match_operand:QI 1 "address_operand" "p")
+ (const_int 2147483647)))]
+ "!TARGET_64BIT"
+ "la\\t%0,%a1"
+ [(set_attr "op_type" "RX")
+ (set_attr "atype" "mem")
+ (set_attr "type" "la")])
+
+(define_insn_and_split "*la_31_and_cc"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (and:SI (match_operand:QI 1 "address_operand" "p")
+ (const_int 2147483647)))
+ (clobber (reg:CC 33))]
+ "!TARGET_64BIT"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0)
+ (and:SI (match_dup 1) (const_int 2147483647)))]
+ ""
+ [(set_attr "op_type" "RX")
+ (set_attr "atype" "mem")
+ (set_attr "type" "la")])
+
+(define_insn "force_la_31"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (match_operand:QI 1 "address_operand" "p"))
+ (use (const_int 0))]
+ "!TARGET_64BIT"
"la\\t%0,%a1"
[(set_attr "op_type" "RX")
(set_attr "atype" "mem")
@@ -3378,7 +3206,7 @@
(define_expand "reload_insi"
[(parallel [(match_operand:SI 0 "register_operand" "=a")
(match_operand:SI 1 "s390_plus_operand" "")
- (match_operand:DI 2 "register_operand" "=&a")])]
+ (match_operand:SI 2 "register_operand" "=&a")])]
"!TARGET_64BIT"
"
{
@@ -3394,7 +3222,7 @@
(define_expand "adddf3"
[(parallel
[(set (match_operand:DF 0 "register_operand" "=f,f")
- (plus:DF (match_operand:DF 1 "register_operand" "%0,0")
+ (plus:DF (match_operand:DF 1 "nonimmediate_operand" "%0,0")
(match_operand:DF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))])]
"TARGET_HARD_FLOAT"
@@ -3402,7 +3230,7 @@
(define_insn "*adddf3"
[(set (match_operand:DF 0 "register_operand" "=f,f")
- (plus:DF (match_operand:DF 1 "register_operand" "%0,0")
+ (plus:DF (match_operand:DF 1 "nonimmediate_operand" "%0,0")
(match_operand:DF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
@@ -3414,7 +3242,7 @@
(define_insn "*adddf3_ibm"
[(set (match_operand:DF 0 "register_operand" "=f,f")
- (plus:DF (match_operand:DF 1 "register_operand" "%0,0")
+ (plus:DF (match_operand:DF 1 "nonimmediate_operand" "%0,0")
(match_operand:DF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
@@ -3431,7 +3259,7 @@
(define_expand "addsf3"
[(parallel
[(set (match_operand:SF 0 "register_operand" "=f,f")
- (plus:SF (match_operand:SF 1 "register_operand" "%0,0")
+ (plus:SF (match_operand:SF 1 "nonimmediate_operand" "%0,0")
(match_operand:SF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))])]
"TARGET_HARD_FLOAT"
@@ -3439,7 +3267,7 @@
(define_insn "*addsf3"
[(set (match_operand:SF 0 "register_operand" "=f,f")
- (plus:SF (match_operand:SF 1 "register_operand" "%0,0")
+ (plus:SF (match_operand:SF 1 "nonimmediate_operand" "%0,0")
(match_operand:SF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
@@ -3451,7 +3279,7 @@
(define_insn "*addsf3"
[(set (match_operand:SF 0 "register_operand" "=f,f")
- (plus:SF (match_operand:SF 1 "register_operand" "%0,0")
+ (plus:SF (match_operand:SF 1 "nonimmediate_operand" "%0,0")
(match_operand:SF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
@@ -3792,7 +3620,7 @@
(define_insn "muldi3"
[(set (match_operand:DI 0 "register_operand" "=d,d,d")
- (mult:DI (match_operand:DI 1 "register_operand" "%0,0,0")
+ (mult:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
(match_operand:DI 2 "general_operand" "d,K,m")))]
"TARGET_64BIT"
"@
@@ -3809,7 +3637,7 @@
(define_insn "mulsi3"
[(set (match_operand:SI 0 "register_operand" "=d,d,d")
- (mult:SI (match_operand:SI 1 "register_operand" "%0,0,0")
+ (mult:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
(match_operand:SI 2 "general_operand" "d,K,m")))]
""
"@
@@ -3826,7 +3654,7 @@
(define_expand "mulsidi3"
[(set (match_operand:DI 0 "register_operand" "")
- (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" ""))
+ (mult:DI (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))
(sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))))]
"!TARGET_64BIT"
"
@@ -3866,7 +3694,7 @@
(define_expand "muldf3"
[(parallel
[(set (match_operand:DF 0 "register_operand" "=f,f")
- (mult:DF (match_operand:DF 1 "register_operand" "%0,0")
+ (mult:DF (match_operand:DF 1 "nonimmediate_operand" "%0,0")
(match_operand:DF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))])]
"TARGET_HARD_FLOAT"
@@ -3874,7 +3702,7 @@
(define_insn "*muldf3"
[(set (match_operand:DF 0 "register_operand" "=f,f")
- (mult:DF (match_operand:DF 1 "register_operand" "%0,0")
+ (mult:DF (match_operand:DF 1 "nonimmediate_operand" "%0,0")
(match_operand:DF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
@@ -3887,7 +3715,7 @@
(define_insn "*muldf3_ibm"
[(set (match_operand:DF 0 "register_operand" "=f,f")
- (mult:DF (match_operand:DF 1 "register_operand" "%0,0")
+ (mult:DF (match_operand:DF 1 "nonimmediate_operand" "%0,0")
(match_operand:DF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
@@ -3905,7 +3733,7 @@
(define_expand "mulsf3"
[(parallel
[(set (match_operand:SF 0 "register_operand" "=f,f")
- (mult:SF (match_operand:SF 1 "register_operand" "%0,0")
+ (mult:SF (match_operand:SF 1 "nonimmediate_operand" "%0,0")
(match_operand:SF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))])]
"TARGET_HARD_FLOAT"
@@ -3913,7 +3741,7 @@
(define_insn "*mulsf3"
[(set (match_operand:SF 0 "register_operand" "=f,f")
- (mult:SF (match_operand:SF 1 "register_operand" "%0,0")
+ (mult:SF (match_operand:SF 1 "nonimmediate_operand" "%0,0")
(match_operand:SF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IEEE_FLOAT"
@@ -3926,7 +3754,7 @@
(define_insn "*mulsf3_ibm"
[(set (match_operand:SF 0 "register_operand" "=f,f")
- (mult:SF (match_operand:SF 1 "register_operand" "%0,0")
+ (mult:SF (match_operand:SF 1 "nonimmediate_operand" "%0,0")
(match_operand:SF 2 "general_operand" "f,m")))
(clobber (reg:CC 33))]
"TARGET_HARD_FLOAT && TARGET_IBM_FLOAT"
@@ -4425,7 +4253,7 @@
(define_insn "*anddi3_cc"
[(set (reg 33)
- (compare (and:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:DI 0 "register_operand" "=d,d")
@@ -4439,7 +4267,7 @@
(define_insn "*anddi3_cconly"
[(set (reg 33)
- (compare (and:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:DI 0 "=d,d"))]
@@ -4452,7 +4280,7 @@
(define_insn "*anddi3_ni"
[(set (match_operand:DI 0 "register_operand" "=d")
- (and:DI (match_operand:DI 1 "register_operand" "%0")
+ (and:DI (match_operand:DI 1 "nonimmediate_operand" "0")
(match_operand:DI 2 "immediate_operand" "n")))
(clobber (reg:CC 33))]
"TARGET_64BIT && s390_single_hi (operands[2], DImode, -1) >= 0"
@@ -4475,7 +4303,7 @@
(define_insn "anddi3"
[(set (match_operand:DI 0 "register_operand" "=d,d")
- (and:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m")))
(clobber (reg:CC 33))]
"TARGET_64BIT"
@@ -4511,7 +4339,7 @@
(define_insn "*andsi3_cc"
[(set (reg 33)
- (compare (and:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:SI 0 "register_operand" "=d,d")
@@ -4525,7 +4353,7 @@
(define_insn "*andsi3_cconly"
[(set (reg 33)
- (compare (and:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:SI 0 "=d,d"))]
@@ -4538,7 +4366,7 @@
(define_insn "*andsi3_ni"
[(set (match_operand:SI 0 "register_operand" "=d")
- (and:SI (match_operand:SI 1 "register_operand" "%0")
+ (and:SI (match_operand:SI 1 "nonimmediate_operand" "0")
(match_operand:SI 2 "immediate_operand" "n")))
(clobber (reg:CC 33))]
"TARGET_64BIT && s390_single_hi (operands[2], SImode, -1) >= 0"
@@ -4559,7 +4387,7 @@
(define_insn "andsi3"
[(set (match_operand:SI 0 "register_operand" "=d,d")
- (and:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m")))
(clobber (reg:CC 33))]
""
@@ -4696,7 +4524,7 @@
(define_insn "*iordi3_cc"
[(set (reg 33)
- (compare (ior:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:DI 0 "register_operand" "=d,d")
@@ -4710,7 +4538,7 @@
(define_insn "*iordi3_cconly"
[(set (reg 33)
- (compare (ior:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:DI 0 "=d,d"))]
@@ -4723,7 +4551,7 @@
(define_insn "*iordi3_oi"
[(set (match_operand:DI 0 "register_operand" "=d")
- (ior:DI (match_operand:DI 1 "register_operand" "%0")
+ (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0")
(match_operand:DI 2 "immediate_operand" "n")))
(clobber (reg:CC 33))]
"TARGET_64BIT && s390_single_hi (operands[2], DImode, 0) >= 0"
@@ -4746,7 +4574,7 @@
(define_insn "iordi3"
[(set (match_operand:DI 0 "register_operand" "=d,d")
- (ior:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m")))
(clobber (reg:CC 33))]
"TARGET_64BIT"
@@ -4782,7 +4610,7 @@
(define_insn "*iorsi3_cc"
[(set (reg 33)
- (compare (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:SI 0 "register_operand" "=d,d")
@@ -4796,7 +4624,7 @@
(define_insn "*iorsi3_cconly"
[(set (reg 33)
- (compare (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:SI 0 "=d,d"))]
@@ -4809,7 +4637,7 @@
(define_insn "*iorsi3_oi"
[(set (match_operand:SI 0 "register_operand" "=d")
- (ior:SI (match_operand:SI 1 "register_operand" "%0")
+ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0")
(match_operand:SI 2 "immediate_operand" "n")))
(clobber (reg:CC 33))]
"TARGET_64BIT && s390_single_hi (operands[2], SImode, 0) >= 0"
@@ -4830,7 +4658,7 @@
(define_insn "iorsi3"
[(set (match_operand:SI 0 "register_operand" "=d,d")
- (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m")))
(clobber (reg:CC 33))]
""
@@ -4967,7 +4795,7 @@
(define_insn "*xordi3_cc"
[(set (reg 33)
- (compare (xor:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:DI 0 "register_operand" "=d,d")
@@ -4981,7 +4809,7 @@
(define_insn "*xordi3_cconly"
[(set (reg 33)
- (compare (xor:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:DI 0 "=d,d"))]
@@ -4994,7 +4822,7 @@
(define_insn "xordi3"
[(set (match_operand:DI 0 "register_operand" "=d,d")
- (xor:DI (match_operand:DI 1 "register_operand" "%0,0")
+ (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
(match_operand:DI 2 "general_operand" "d,m")))
(clobber (reg:CC 33))]
"TARGET_64BIT"
@@ -5030,7 +4858,7 @@
(define_insn "*xorsi3_cc"
[(set (reg 33)
- (compare (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(set (match_operand:SI 0 "register_operand" "=d,d")
@@ -5044,7 +4872,7 @@
(define_insn "*xorsi3_cconly"
[(set (reg 33)
- (compare (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (compare (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m"))
(const_int 0)))
(clobber (match_scratch:SI 0 "=d,d"))]
@@ -5057,7 +4885,7 @@
(define_insn "xorsi3"
[(set (match_operand:SI 0 "register_operand" "=d,d")
- (xor:SI (match_operand:SI 1 "register_operand" "%0,0")
+ (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "d,m")))
(clobber (reg:CC 33))]
""
@@ -5197,7 +5025,7 @@
output_asm_insn (\"lcr\\t%N0,%N1\", operands);
output_asm_insn (\"je\\t%l0\", xop);
output_asm_insn (\"bctr\\t%0,0\", operands);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\",
+ (*targetm.asm_out.internal_label) (asm_out_file, \"L\",
CODE_LABEL_NUMBER (xop[0]));
return \"\";
}"
@@ -5896,9 +5724,6 @@
(const_int 4)
(ne (symbol_ref "TARGET_64BIT") (const_int 0))
(const_int 6)
- (ne (symbol_ref "s390_pool_overflow") (const_int 0))
- (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
- (const_int 12) (const_int 14))
(eq (symbol_ref "flag_pic") (const_int 0))
(const_int 6)] (const_int 8)))])
@@ -5948,9 +5773,6 @@
(const_int 4)
(ne (symbol_ref "TARGET_64BIT") (const_int 0))
(const_int 6)
- (ne (symbol_ref "s390_pool_overflow") (const_int 0))
- (if_then_else (eq (symbol_ref "flag_pic") (const_int 0))
- (const_int 12) (const_int 14))
(eq (symbol_ref "flag_pic") (const_int 0))
(const_int 6)] (const_int 8)))])
@@ -5973,54 +5795,217 @@
(const_string "RR") (const_string "RX")))
(set_attr "atype" "mem")])
+;;
+;;- Trap instructions.
+;;
+
+(define_insn "trap"
+ [(trap_if (const_int 1) (const_int 0))]
+ ""
+ "j\\t.+2"
+ [(set_attr "op_type" "RX")])
+
+(define_expand "conditional_trap"
+ [(set (match_dup 2) (match_dup 3))
+ (trap_if (match_operator 0 "comparison_operator"
+ [(match_dup 2) (const_int 0)])
+ (match_operand:SI 1 "general_operand" ""))]
+ ""
+ "
+{
+ enum machine_mode ccmode;
+
+ if (operands[1] != const0_rtx) FAIL;
+
+ ccmode = s390_select_ccmode (GET_CODE (operands[0]),
+ s390_compare_op0, s390_compare_op1);
+ operands[2] = gen_rtx_REG (ccmode, 33);
+ operands[3] = gen_rtx_COMPARE (ccmode, s390_compare_op0, s390_compare_op1);
+}")
+
+(define_insn "*trap"
+ [(trap_if (match_operator 0 "comparison_operator" [(reg 33) (const_int 0)])
+ (const_int 0))]
+ ""
+ "j%C0\\t.+2";
+ [(set_attr "op_type" "RX")])
;;
-;;- Subtract one and jump if not zero.
+;;- Loop instructions.
;;
+;; This is all complicated by the fact that since this is a jump insn
+;; we must handle our own output reloads.
+
+(define_expand "doloop_end"
+ [(use (match_operand 0 "" "")) ; loop pseudo
+ (use (match_operand 1 "" "")) ; iterations; zero if unknown
+ (use (match_operand 2 "" "")) ; max iterations
+ (use (match_operand 3 "" "")) ; loop level
+ (use (match_operand 4 "" ""))] ; label
+ ""
+ "
+{
+ if (GET_MODE (operands[0]) == SImode)
+ emit_jump_insn (gen_doloop_si (operands[4], operands[0], operands[0]));
+ else if (GET_MODE (operands[0]) == DImode && TARGET_64BIT)
+ emit_jump_insn (gen_doloop_di (operands[4], operands[0], operands[0]));
+ else
+ FAIL;
-;(define_expand "decrement_and_branch_on_count"
-; [(use (match_operand 0 "register_operand" ""))
-; (use (label_ref (match_operand 1 "" "")))]
-; ""
-; "
-;{
-;/* if (TARGET_64BIT)
-; emit_jump_insn (gen_brctdi (operands[0], operands[1]));
-; else */
-; emit_jump_insn (gen_brctsi (operands[0], operands[1]));
-; DONE;
-;}")
-;
-;(define_insn "brctsi"
-; [(set (pc)
-; (if_then_else
-; (ne (match_operand:SI 0 "register_operand" "+a")
-; (const_int 1))
-; (label_ref (match_operand 1 "" ""))
-; (pc)))
-; (set (match_dup 0)
-; (plus:SI (match_dup 0) (const_int -1)))]
-; ""
-; "brct\\t%0,%l1"
-; [(set_attr "op_type" "RI")
-; (set_attr "type" "branch")]
-;)
-;
-;(define_insn "ibrctsi"
-; [(set (pc)
-; (if_then_else
-; (eq (match_operand:SI 0 "register_operand" "+a")
-; (const_int 1))
-; (pc)
-; (label_ref (match_operand 1 "" ""))))
-; (set (match_dup 0)
-; (plus:SI (match_dup 0) (const_int -1)))]
-; ""
-; "brct\\t%0,%l1"
-; [(set_attr "op_type" "RI")
-; (set_attr "type" "branch")]
-;)
+ DONE;
+}")
+(define_insn "doloop_si"
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:SI 1 "register_operand" "d,d")
+ (const_int 1))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))
+ (set (match_operand:SI 2 "register_operand" "=1,?*m*d")
+ (plus:SI (match_dup 1) (const_int -1)))
+ (clobber (match_scratch:SI 3 "=X,&d"))
+ (clobber (reg:CC 33))]
+ ""
+ "*
+{
+ if (which_alternative != 0)
+ return \"#\";
+ else if (get_attr_length (insn) == 4)
+ return \"brct\\t%1,%l0\";
+ else
+ abort ();
+}"
+ [(set_attr "op_type" "RI")
+ (set (attr "length")
+ (cond [(lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
+ (const_int 4)
+ (ne (symbol_ref "TARGET_64BIT") (const_int 0))
+ (const_int 10)
+ (eq (symbol_ref "flag_pic") (const_int 0))
+ (const_int 6)] (const_int 8)))])
+
+(define_insn "*doloop_si_long"
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:SI 1 "register_operand" "d,d")
+ (const_int 1))
+ (match_operand 0 "address_operand" "p,p")
+ (pc)))
+ (set (match_operand:SI 2 "register_operand" "=1,?*m*d")
+ (plus:SI (match_dup 1) (const_int -1)))
+ (clobber (match_scratch:SI 3 "=X,&d"))
+ (clobber (reg:CC 33))]
+ ""
+ "*
+{
+ if (get_attr_op_type (insn) == OP_TYPE_RR)
+ return \"bctr\\t%1,%0\";
+ else
+ return \"bct\\t%1,%a0\";
+}"
+ [(set (attr "op_type")
+ (if_then_else (match_operand 0 "register_operand" "")
+ (const_string "RR") (const_string "RX")))
+ (set_attr "atype" "mem")])
+
+(define_split
+ [(set (pc)
+ (if_then_else (ne (match_operand:SI 1 "register_operand" "")
+ (const_int 1))
+ (match_operand 0 "" "")
+ (pc)))
+ (set (match_operand:SI 2 "nonimmediate_operand" "")
+ (plus:SI (match_dup 1) (const_int -1)))
+ (clobber (match_scratch:SI 3 ""))
+ (clobber (reg:CC 33))]
+ "reload_completed
+ && (! REG_P (operands[2])
+ || ! rtx_equal_p (operands[1], operands[2]))"
+ [(set (match_dup 3) (match_dup 1))
+ (parallel [(set (reg:CCAN 33)
+ (compare:CCAN (plus:SI (match_dup 3) (const_int -1))
+ (const_int 0)))
+ (set (match_dup 3) (plus:SI (match_dup 3) (const_int -1)))])
+ (set (match_dup 2) (match_dup 3))
+ (set (pc) (if_then_else (ne (reg:CCAN 33) (const_int 0))
+ (match_dup 0)
+ (pc)))]
+ "")
+
+(define_insn "doloop_di"
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:DI 1 "register_operand" "d,d")
+ (const_int 1))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))
+ (set (match_operand:DI 2 "register_operand" "=1,?*m*r")
+ (plus:DI (match_dup 1) (const_int -1)))
+ (clobber (match_scratch:DI 3 "=X,&d"))
+ (clobber (reg:CC 33))]
+ "TARGET_64BIT"
+ "*
+{
+ if (which_alternative != 0)
+ return \"#\";
+ else if (get_attr_length (insn) == 4)
+ return \"brctg\\t%1,%l0\";
+ else
+ abort ();
+}"
+ [(set_attr "op_type" "RI")
+ (set (attr "length")
+ (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 60000))
+ (const_int 4) (const_int 12)))])
+
+(define_insn "*doloop_di_long"
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:DI 1 "register_operand" "d,d")
+ (const_int 1))
+ (match_operand 0 "address_operand" "p,p")
+ (pc)))
+ (set (match_operand:DI 2 "register_operand" "=1,?*m*d")
+ (plus:DI (match_dup 1) (const_int -1)))
+ (clobber (match_scratch:DI 3 "=X,&d"))
+ (clobber (reg:CC 33))]
+ ""
+ "*
+{
+ if (get_attr_op_type (insn) == OP_TYPE_RRE)
+ return \"bctgr\\t%1,%0\";
+ else
+ return \"bctg\\t%1,%a0\";
+}"
+ [(set (attr "op_type")
+ (if_then_else (match_operand 0 "register_operand" "")
+ (const_string "RRE") (const_string "RXE")))
+ (set_attr "atype" "mem")])
+
+(define_split
+ [(set (pc)
+ (if_then_else (ne (match_operand:DI 1 "register_operand" "")
+ (const_int 1))
+ (match_operand 0 "" "")
+ (pc)))
+ (set (match_operand:DI 2 "nonimmediate_operand" "")
+ (plus:DI (match_dup 1) (const_int -1)))
+ (clobber (match_scratch:DI 3 ""))
+ (clobber (reg:CC 33))]
+ "reload_completed
+ && (! REG_P (operands[2])
+ || ! rtx_equal_p (operands[1], operands[2]))"
+ [(set (match_dup 3) (match_dup 1))
+ (parallel [(set (reg:CCAN 33)
+ (compare:CCAN (plus:DI (match_dup 3) (const_int -1))
+ (const_int 0)))
+ (set (match_dup 3) (plus:DI (match_dup 3) (const_int -1)))])
+ (set (match_dup 2) (match_dup 3))
+ (set (pc) (if_then_else (ne (reg:CCAN 33) (const_int 0))
+ (match_dup 0)
+ (pc)))]
+ "")
;;
;;- Unconditional jump instructions.
@@ -6228,10 +6213,7 @@
compiler doesn't know about it, because the PLT glue
code uses it. In 64-bit, this is not necessary. */
if (plt_call && !TARGET_64BIT)
- {
- current_function_uses_pic_offset_table = 1;
- use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
- }
+ use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
DONE;
}")
@@ -6353,10 +6335,7 @@
compiler doesn't know about it, because the PLT glue
code uses it. In 64-bit, this is not necessary. */
if (plt_call && !TARGET_64BIT)
- {
- current_function_uses_pic_offset_table = 1;
- use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
- }
+ use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
DONE;
}")
@@ -6719,7 +6698,7 @@
[(set_attr "op_type" "NN")
(set_attr "length" "0")])
-(define_insn "reload_base"
+(define_insn "reload_base_31"
[(set (match_operand:SI 0 "register_operand" "=a")
(unspec:SI [(label_ref (match_operand 1 "" ""))] 210))]
"!TARGET_64BIT"
@@ -6728,15 +6707,29 @@
(set_attr "type" "la")
(set_attr "length" "6")])
-(define_insn "reload_base2"
+(define_insn "reload_base_64"
+ [(set (match_operand:DI 0 "register_operand" "=a")
+ (unspec:DI [(label_ref (match_operand 1 "" ""))] 210))]
+ "TARGET_64BIT"
+ "larl\\t%0,%1"
+ [(set_attr "op_type" "RIL")
+ (set_attr "type" "la")])
+
+(define_insn "reload_anchor"
[(set (match_operand:SI 0 "register_operand" "=a")
- (unspec:SI [(label_ref (match_operand 1 "" ""))] 211))]
+ (unspec:SI [(match_operand:SI 1 "register_operand" "a")] 211))]
"!TARGET_64BIT"
- "la\\t%0,%1-.(%0)"
+ "l\\t%0,0(%1)\;la\\t%0,0(%0,%1)"
[(set_attr "op_type" "NN")
(set_attr "type" "la")
- (set_attr "length" "4")])
+ (set_attr "length" "8")])
+(define_insn "pool"
+ [(unspec_volatile [(match_operand 0 "const_int_operand" "n")] 220)]
+ ""
+ "* abort ();"
+ [(set_attr "op_type" "NN")
+ (set (attr "length") (symbol_ref "INTVAL (operands[0])"))])
;;
;; Insns related to generating the function prologue and epilogue.
diff --git a/gcc/config/sh/coff.h b/gcc/config/sh/coff.h
index 4a742af7710..4d6443e0209 100644
--- a/gcc/config/sh/coff.h
+++ b/gcc/config/sh/coff.h
@@ -21,7 +21,7 @@ Boston, MA 02111-1307, USA. */
/* Generate SDB debugging information. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* Output DBX (stabs) debugging information if doing -gstabs. */
@@ -50,10 +50,6 @@ Boston, MA 02111-1307, USA. */
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
sprintf ((STRING), "*%s%s%ld", LOCAL_LABEL_PREFIX, (PREFIX), (long)(NUM))
-/* Output an internal label definition. */
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- asm_fprintf ((FILE), "%L%s%d:\n", (PREFIX), (NUM))
-
/* This is how to output an assembler line
that says to advance the location counter by SIZE bytes. */
diff --git a/gcc/config/sh/elf.h b/gcc/config/sh/elf.h
index a2633512ab2..858adb1d2c4 100644
--- a/gcc/config/sh/elf.h
+++ b/gcc/config/sh/elf.h
@@ -20,7 +20,6 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Generate DWARF2 debugging information and make it the default */
-#undef DWARF2_DEBUGGING_INFO
#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
@@ -93,10 +92,6 @@ Boston, MA 02111-1307, USA. */
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
sprintf ((STRING), "*%s%s%ld", LOCAL_LABEL_PREFIX, (PREFIX), (long)(NUM))
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- asm_fprintf ((FILE), "%L%s%d:\n", (PREFIX), (NUM))
-
#undef ASM_OUTPUT_SOURCE_LINE
#define ASM_OUTPUT_SOURCE_LINE(file, line) \
do \
diff --git a/gcc/config/sh/lib1funcs.asm b/gcc/config/sh/lib1funcs.asm
index 68b2ca30529..f37b5437293 100644
--- a/gcc/config/sh/lib1funcs.asm
+++ b/gcc/config/sh/lib1funcs.asm
@@ -1607,10 +1607,10 @@ LOCAL(no_lo_adj):
would require a lot of instructions to do the shifts just right. Using
the full 64 bit shift result to multiply with the divisor would require
four extra instructions for the upper 32 bits (shift / mulu / shift / sub).
- Fortunately, if the upper 32 bits of the shift result are non-zero, we
+ Fortunately, if the upper 32 bits of the shift result are nonzero, we
know that the rest after taking this partial result into account will
fit into 32 bits. So we just clear the upper 32 bits of the rest if the
- upper 32 bits of the partial result are non-zero. */
+ upper 32 bits of the partial result are nonzero. */
#endif /* __SHMEDIA__ */
#endif /* L_udivdi3 */
@@ -1755,10 +1755,10 @@ LOCAL(no_lo_adj):
would require a lot of instructions to do the shifts just right. Using
the full 64 bit shift result to multiply with the divisor would require
four extra instructions for the upper 32 bits (shift / mulu / shift / sub).
- Fortunately, if the upper 32 bits of the shift result are non-zero, we
+ Fortunately, if the upper 32 bits of the shift result are nonzero, we
know that the rest after taking this partial result into account will
fit into 32 bits. So we just clear the upper 32 bits of the rest if the
- upper 32 bits of the partial result are non-zero. */
+ upper 32 bits of the partial result are nonzero. */
#endif /* __SHMEDIA__ */
#endif /* L_umoddi3 */
diff --git a/gcc/config/sh/linux.h b/gcc/config/sh/linux.h
index 1a3948386fc..2a17afe9206 100644
--- a/gcc/config/sh/linux.h
+++ b/gcc/config/sh/linux.h
@@ -55,6 +55,7 @@ do { \
#undef LIB_SPEC
#define LIB_SPEC \
"%{shared: -lc} \
+ %{!static:-rpath-link %R/lib:%R/usr/lib} \
%{!shared: %{pthread:-lthread} \
%{profile:-lc_p} %{!profile: -lc}}"
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 3512b970d4d..3bbae4d6217 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -199,6 +199,7 @@ static void sh_insert_attributes PARAMS ((tree, tree *));
static int sh_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int sh_use_dfa_interface PARAMS ((void));
static int sh_issue_rate PARAMS ((void));
+static bool sh_function_ok_for_sibcall PARAMS ((tree, tree));
static bool sh_cannot_modify_jumps_p PARAMS ((void));
static bool sh_ms_bitfield_layout_p PARAMS ((tree));
@@ -208,6 +209,8 @@ static const char *sh_strip_name_encoding PARAMS ((const char *));
static void sh_init_builtins PARAMS ((void));
static void sh_media_init_builtins PARAMS ((void));
static rtx sh_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
+static int flow_dependent_p PARAMS ((rtx, rtx));
+static void flow_dependent_p_1 PARAMS ((rtx, rtx, void *));
/* Initialize the GCC target structure. */
@@ -257,6 +260,9 @@ static rtx sh_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
#undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN sh_expand_builtin
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL sh_function_ok_for_sibcall
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Print the operand address in x to the stream. */
@@ -1010,12 +1016,12 @@ output_far_jump (insn, op)
if (far && flag_pic && TARGET_SH2)
{
braf_base_lab = gen_label_rtx ();
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (braf_base_lab));
}
if (far)
output_asm_insn (".align 2", 0);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (this.lab));
+ (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (this.lab));
this.op = op;
if (far && flag_pic)
{
@@ -1074,7 +1080,7 @@ output_branch (logic, insn, operands)
output_asm_insn ("bra\t%l0", &op0);
fprintf (asm_out_file, "\tnop\n");
- ASM_OUTPUT_INTERNAL_LABEL(asm_out_file, "LF", label);
+ (*targetm.asm_out.internal_label)(asm_out_file, "LF", label);
return "";
}
@@ -2506,7 +2512,7 @@ dump_table (scan)
pool_window_last = 0;
}
-/* Return non-zero if constant would be an ok source for a
+/* Return nonzero if constant would be an ok source for a
mov.w instead of a mov.l. */
static int
@@ -2518,7 +2524,7 @@ hi_const (src)
&& INTVAL (src) <= 32767);
}
-/* Non-zero if the insn is a move instruction which needs to be fixed. */
+/* Nonzero if the insn is a move instruction which needs to be fixed. */
/* ??? For a DImode/DFmode moves, we don't need to fix it if each half of the
CONST_DOUBLE input value is CONST_OK_FOR_I. For a SFmode move, we don't
@@ -3860,7 +3866,7 @@ machine_dependent_reorg (first)
split_branches (first);
/* The INSN_REFERENCES_ARE_DELAYED in sh.h is problematic because it
- also has an effect on the register that holds the addres of the sfunc.
+ also has an effect on the register that holds the address of the sfunc.
Insert an extra dummy insn in front of each sfunc that pretends to
use this register. */
if (flag_delayed_branch)
@@ -4172,7 +4178,7 @@ final_prescan_insn (insn, opvec, noperands)
asm_fprintf (asm_out_file, "\t.uses %LL%d\n",
CODE_LABEL_NUMBER (XEXP (note, 0)));
else if (GET_CODE (pattern) == SET)
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (XEXP (note, 0)));
else
abort ();
@@ -4195,7 +4201,7 @@ output_jump_label_table ()
{
pool_node *p = &pool_vector[i];
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
+ (*targetm.asm_out.internal_label) (asm_out_file, "L",
CODE_LABEL_NUMBER (p->label));
output_asm_insn (".long %O0", &p->value);
}
@@ -4438,7 +4444,7 @@ calc_live_regs (count_ptr, live_regs_mask)
&& pr_live))
&& reg != STACK_POINTER_REGNUM && reg != ARG_POINTER_REGNUM
&& reg != RETURN_ADDRESS_POINTER_REGNUM
- && reg != T_REG && reg != GBR_REG && reg != FPSCR_REG)
+ && reg != T_REG && reg != GBR_REG)
: (/* Only push those regs which are used and need to be saved. */
regs_ever_live[reg] && ! call_used_regs[reg]))
{
@@ -5675,6 +5681,11 @@ sh_handle_interrupt_handler_attribute (node, name, args, flags, no_add_attrs)
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
+ else if (TARGET_SHCOMPACT)
+ {
+ error ("attribute interrupt_handler is not compatible with -m5-compact");
+ *no_add_attrs = true;
+ }
return NULL_TREE;
}
@@ -6422,7 +6433,7 @@ branch_dest (branch)
return INSN_ADDRESSES (dest_uid);
}
-/* Return non-zero if REG is not used after INSN.
+/* Return nonzero if REG is not used after INSN.
We assume REG is a reload reg, and therefore does
not live past labels. It may live past calls or jumps though. */
int
@@ -6964,7 +6975,7 @@ sh_can_redirect_branch (branch1, branch2)
return 0;
}
-/* Return non-zero if register old_reg can be renamed to register new_reg. */
+/* Return nonzero if register old_reg can be renamed to register new_reg. */
int
sh_hard_regno_rename_ok (old_reg, new_reg)
unsigned int old_reg ATTRIBUTE_UNUSED;
@@ -6994,7 +7005,7 @@ sh_adjust_cost (insn, link, dep_insn, cost)
rtx dep_insn;
int cost;
{
- rtx reg;
+ rtx reg, use_pat;
if (TARGET_SHMEDIA)
{
@@ -7007,49 +7018,119 @@ sh_adjust_cost (insn, link, dep_insn, cost)
&& get_attr_is_mac_media (dep_insn))
cost = 1;
}
- else if (GET_CODE(insn) == CALL_INSN)
+ else if (REG_NOTE_KIND (link) == 0)
{
+ enum attr_type dep_type, type;
+
+ if (recog_memoized (insn) < 0
+ || recog_memoized (dep_insn) < 0)
+ return;
+
+ dep_type = get_attr_type (dep_insn);
+ if (dep_type == TYPE_FLOAD || dep_type == TYPE_PCFLOAD)
+ cost--;
+ if ((dep_type == TYPE_LOAD_SI || dep_type == TYPE_PCLOAD_SI)
+ && (type = get_attr_type (insn)) != TYPE_CALL
+ && type != TYPE_SFUNC)
+ cost--;
+
/* The only input for a call that is timing-critical is the
function's address. */
- rtx call = PATTERN (insn);
-
- if (GET_CODE (call) == PARALLEL)
- call = XVECEXP (call, 0 ,0);
- if (GET_CODE (call) == SET)
- call = SET_SRC (call);
- if (GET_CODE (call) == CALL && GET_CODE (XEXP (call, 0)) == MEM
- && ! reg_set_p (XEXP (XEXP (call, 0), 0), dep_insn))
- cost = 0;
- }
- /* All sfunc calls are parallels with at least four components.
- Exploit this to avoid unnecessary calls to sfunc_uses_reg. */
- else if (GET_CODE (PATTERN (insn)) == PARALLEL
- && XVECLEN (PATTERN (insn), 0) >= 4
- && (reg = sfunc_uses_reg (insn)))
- {
+ if (GET_CODE(insn) == CALL_INSN)
+ {
+ rtx call = PATTERN (insn);
+
+ if (GET_CODE (call) == PARALLEL)
+ call = XVECEXP (call, 0 ,0);
+ if (GET_CODE (call) == SET)
+ call = SET_SRC (call);
+ if (GET_CODE (call) == CALL && GET_CODE (XEXP (call, 0)) == MEM
+ && ! reg_set_p (XEXP (XEXP (call, 0), 0), dep_insn))
+ cost = 0;
+ }
/* Likewise, the most timing critical input for an sfuncs call
is the function address. However, sfuncs typically start
using their arguments pretty quickly.
Assume a four cycle delay before they are needed. */
- if (! reg_set_p (reg, dep_insn))
- cost -= TARGET_SUPERSCALAR ? 40 : 4;
- }
- /* Adjust load_si / pcload_si type insns latency. Use the known
- nominal latency and form of the insn to speed up the check. */
- else if (cost == 3
- && GET_CODE (PATTERN (dep_insn)) == SET
- /* Latency for dmpy type insns is also 3, so check the that
- it's actually a move insn. */
- && general_movsrc_operand (SET_SRC (PATTERN (dep_insn)), SImode))
+ /* All sfunc calls are parallels with at least four components.
+ Exploit this to avoid unnecessary calls to sfunc_uses_reg. */
+ else if (GET_CODE (PATTERN (insn)) == PARALLEL
+ && XVECLEN (PATTERN (insn), 0) >= 4
+ && (reg = sfunc_uses_reg (insn)))
+ {
+ if (! reg_set_p (reg, dep_insn))
+ cost -= 4;
+ }
+ /* When the preceding instruction loads the shift amount of
+ the following SHAD/SHLD, the latency of the load is increased
+ by 1 cycle. */
+ else if (TARGET_SH4
+ && get_attr_type (insn) == TYPE_DYN_SHIFT
+ && get_attr_any_int_load (dep_insn) == ANY_INT_LOAD_YES
+ && reg_overlap_mentioned_p (SET_DEST (PATTERN (dep_insn)),
+ XEXP (SET_SRC (single_set(insn)),
+ 1)))
+ cost++;
+ /* When an LS group instruction with a latency of less than
+ 3 cycles is followed by a double-precision floating-point
+ instruction, FIPR, or FTRV, the latency of the first
+ instruction is increased to 3 cycles. */
+ else if (cost < 3
+ && get_attr_insn_class (dep_insn) == INSN_CLASS_LS_GROUP
+ && get_attr_dfp_comp (insn) == DFP_COMP_YES)
+ cost = 3;
+ /* The lsw register of a double-precision computation is ready one
+ cycle earlier. */
+ else if (reload_completed
+ && get_attr_dfp_comp (dep_insn) == DFP_COMP_YES
+ && (use_pat = single_set (insn))
+ && ! regno_use_in (REGNO (SET_DEST (single_set (dep_insn))),
+ SET_SRC (use_pat)))
+ cost -= 1;
+
+ if (get_attr_any_fp_comp (dep_insn) == ANY_FP_COMP_YES
+ && get_attr_late_fp_use (insn) == LATE_FP_USE_YES)
+ cost -= 1;
+ }
+ /* An anti-dependence penalty of two applies if the first insn is a double
+ precision fadd / fsub / fmul. */
+ else if (REG_NOTE_KIND (link) == REG_DEP_ANTI
+ && recog_memoized (dep_insn) >= 0
+ && get_attr_type (dep_insn) == TYPE_DFP_ARITH
+ /* A lot of alleged anti-flow dependences are fake,
+ so check this one is real. */
+ && flow_dependent_p (dep_insn, insn))
cost = 2;
- else if (cost == 30
- && GET_CODE (PATTERN (dep_insn)) == SET
- && GET_MODE (SET_SRC (PATTERN (dep_insn))) == SImode)
- cost = 20;
+
return cost;
}
+/* Check if INSN is flow-dependent on DEP_INSN. Can also be used to check
+ if DEP_INSN is anti-flow dependent on INSN. */
+static int
+flow_dependent_p (insn, dep_insn)
+ rtx insn, dep_insn;
+{
+ rtx tmp = PATTERN (insn);
+
+ note_stores (PATTERN (dep_insn), flow_dependent_p_1, &tmp);
+ return tmp == NULL_RTX;
+}
+
+/* A helper function for flow_dependent_p called through note_stores. */
+static void
+flow_dependent_p_1 (x, pat, data)
+ rtx x;
+ rtx pat ATTRIBUTE_UNUSED;
+ void *data;
+{
+ rtx * pinsn = (rtx *) data;
+
+ if (*pinsn && reg_referenced_p (x, *pinsn))
+ *pinsn = NULL_RTX;
+}
+
/* For use by ALLOCATE_INITIAL_VALUE. Note that sh.md contains some
'special function' patterns (type sfunc) that clobber pr, but that
do not look like function calls to leaf_function_p. Hence we must
@@ -7060,27 +7141,26 @@ sh_pr_n_sets ()
return REG_N_SETS (TARGET_SHMEDIA ? PR_MEDIA_REG : PR_REG);
}
-/* This Function Returns non zero if DFA based scheduler
- interface is to be used.At present supported only for
- SH4. */
+/* This Function returns nonzero if the DFA based scheduler interface
+ is to be used. At present this is supported for the SH4 only. */
static int
sh_use_dfa_interface()
{
- if (TARGET_SH4)
- return 1;
- else
- return 0;
+ if (TARGET_HARD_SH4)
+ return 1;
+ else
+ return 0;
}
-/* This function returns "2" that signifies dual issue
- for SH4 processor.To be used by DFA pipeline description. */
+/* This function returns "2" to indicate dual issue for the SH4
+ processor. To be used by the DFA pipeline description. */
static int
sh_issue_rate()
{
- if(TARGET_SH4)
- return 2;
- else
- return 1;
+ if (TARGET_SUPERSCALAR)
+ return 2;
+ else
+ return 1;
}
/* SHmedia requires registers for branches, so we can't generate new
@@ -7225,7 +7305,7 @@ sh_initialize_trampoline (tramp, fnaddr, cxt)
src = gen_rtx_MEM (BLKmode, tramp_templ);
set_mem_align (dst, 256);
set_mem_align (src, 64);
- emit_block_move (dst, src, GEN_INT (fixed_len));
+ emit_block_move (dst, src, GEN_INT (fixed_len), BLOCK_OP_NORMAL);
emit_move_insn (gen_rtx_MEM (Pmode, plus_constant (tramp, fixed_len)),
fnaddr);
@@ -7307,6 +7387,19 @@ sh_initialize_trampoline (tramp, fnaddr, cxt)
}
}
+/* FIXME: This is overly conservative. A SHcompact function that
+ receives arguments ``by reference'' will have them stored in its
+ own stack frame, so it must not pass pointers or references to
+ these arguments to other functions by means of sibling calls. */
+static bool
+sh_function_ok_for_sibcall (decl, exp)
+ tree decl;
+ tree exp ATTRIBUTE_UNUSED;
+{
+ return (decl
+ && (! TARGET_SHCOMPACT
+ || current_function_args_info.stack_regs == 0));
+}
/* Machine specific built-in functions. */
@@ -7576,6 +7669,8 @@ sh_expand_builtin (exp, target, subtarget, mode, ignore)
if (! signature_args[signature][i])
break;
arg = TREE_VALUE (arglist);
+ if (arg == error_mark_node)
+ return const0_rtx;
arglist = TREE_CHAIN (arglist);
opmode = insn_data[icode].operand[nop].mode;
argmode = TYPE_MODE (TREE_TYPE (arg));
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index 1ad1306abdc..ea340746024 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -472,6 +472,14 @@ do { \
break global alloc, and generates slower code anyway due \
to the pressure on R0. */ \
flag_schedule_insns = 0; \
+ \
+ /* Allocation boundary (in *bytes*) for the code of a function. \
+ SH1: 32 bit alignment is faster, because instructions are always \
+ fetched as a pair from a longword boundary. \
+ SH2 .. SH5 : align to cache line start. */ \
+ if (align_functions == 0) \
+ align_functions \
+ = TARGET_SMALLCODE ? FUNCTION_BOUNDARY/8 : (1 << CACHE_LOG); \
} while (0)
/* Target machine storage layout. */
@@ -532,11 +540,9 @@ do { \
The SH2/3 have 16 byte cache lines, and the SH4 has a 32 byte cache line */
#define CACHE_LOG (TARGET_CACHE32 ? 5 : TARGET_SH2 ? 4 : 2)
-/* Allocation boundary (in *bits*) for the code of a function.
- 32 bit alignment is faster, because instructions are always fetched as a
- pair from a longword boundary. */
-#define FUNCTION_BOUNDARY \
- (TARGET_SMALLCODE ? 16 << TARGET_SHMEDIA : (1 << CACHE_LOG) * 8)
+/* ABI given & required minimum allocation boundary (in *bits*) for the
+ code of a function. */
+#define FUNCTION_BOUNDARY (16 << TARGET_SHMEDIA)
/* On SH5, the lowest bit is used to indicate SHmedia functions, so
the vbit must go into the delta field of
@@ -1522,7 +1528,7 @@ enum sh_arg_class { SH_ARG_INT = 0, SH_ARG_FLOAT = 1 };
struct sh_args {
int arg_count[2];
int force_mem;
- /* Non-zero if a prototype is available for the function. */
+ /* Nonzero if a prototype is available for the function. */
int prototype_p;
/* The number of an odd floating-point register, that should be used
for the next argument of type float. */
@@ -1700,13 +1706,6 @@ struct sh_args {
(CUM).outgoing = 0; \
} while (0)
-/* FIXME: This is overly conservative. A SHcompact function that
- receives arguments ``by reference'' will have them stored in its
- own stack frame, so it must not pass pointers or references to
- these arguments to other functions by means of sibling calls. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) \
- (! TARGET_SHCOMPACT || current_function_args_info.stack_regs == 0)
-
/* Update the data in CUM to advance over an argument
of mode MODE and data type TYPE.
(TYPE is null for libcalls where that information may not be
@@ -2018,7 +2017,7 @@ struct sh_args {
: 0)
#define SH5_WOULD_BE_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
- (TARGET_SH5 && (MODE) == BLKmode \
+ (TARGET_SH5 && ((MODE) == BLKmode || (MODE) == TImode) \
&& ((CUM).arg_count[(int) SH_ARG_INT] \
+ (int_size_in_bytes (TYPE) + 7) / 8) > NPARM_REGS (SImode))
@@ -2130,8 +2129,6 @@ while (0)
/* Addressing modes, and classification of registers for them. */
#define HAVE_POST_INCREMENT TARGET_SH1
-/*#define HAVE_PRE_INCREMENT 1*/
-/*#define HAVE_POST_DECREMENT 1*/
#define HAVE_PRE_DECREMENT TARGET_SH1
#define USE_LOAD_POST_INCREMENT(mode) ((mode == SImode || mode == DImode) \
@@ -2271,9 +2268,15 @@ while (0)
(GET_CODE (OP) == CONST && GET_CODE (XEXP ((OP), 0)) == UNSPEC \
&& XINT (XEXP ((OP), 0), 1) == UNSPEC_GOTPLT)
+#define UNSPEC_GOTOFF_P(OP) \
+ (GET_CODE (OP) == UNSPEC && XINT ((OP), 1) == UNSPEC_GOTOFF)
+
#define GOTOFF_P(OP) \
- (GET_CODE (OP) == CONST && GET_CODE (XEXP ((OP), 0)) == UNSPEC \
- && XINT (XEXP ((OP), 0), 1) == UNSPEC_GOTOFF)
+ (GET_CODE (OP) == CONST \
+ && (UNSPEC_GOTOFF_P (XEXP ((OP), 0)) \
+ || (GET_CODE (XEXP ((OP), 0)) == PLUS \
+ && UNSPEC_GOTOFF_P (XEXP (XEXP ((OP), 0), 0)) \
+ && GET_CODE (XEXP (XEXP ((OP), 0), 1)) == CONST_INT)))
#define PIC_ADDR_P(OP) \
(GET_CODE (OP) == CONST && GET_CODE (XEXP ((OP), 0)) == UNSPEC \
@@ -2972,7 +2975,7 @@ while (0)
#define ASM_OUTPUT_LABELREF(FILE, NAME) \
do \
{ \
- char * lname; \
+ const char * lname; \
\
STRIP_DATALABEL_ENCODING (lname, (NAME)); \
if (lname[0] == '*') \
@@ -3008,11 +3011,6 @@ while (0)
/* #define ASM_OUTPUT_CASE_END(STREAM,NUM,TABLE) */
-/* Construct a private name. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR,NAME,NUMBER) \
- ((OUTVAR) = (char *) alloca (strlen (NAME) + 10), \
- sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)))
-
/* Output a relative address table. */
#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM,BODY,VALUE,REL) \
@@ -3271,6 +3269,8 @@ extern int rtx_equal_function_value_matters;
#define PROMOTE_FUNCTION_ARGS
#define PROMOTE_FUNCTION_RETURN
+#define MAX_FIXED_MODE_SIZE (TARGET_SH5 ? 128 : 64)
+
/* ??? Define ACCUMULATE_OUTGOING_ARGS? This is more efficient than pushing
and poping arguments. However, we do have push/pop instructions, and
rather limited offsets (4 bits) in load/store instructions, so it isn't
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index 7016e74ec48..00a91df42c8 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -183,8 +183,10 @@
;; arith3b like above, but might end with a redirected branch
;; load from memory
;; load_si Likewise, SImode variant for general register.
+;; fload Likewise, but load to fp register.
;; store to memory
-;; move register to register
+;; move general purpose register to register
+;; mt_group other sh4 mt instructions
;; fmove register to register, floating point
;; smpy word precision integer multiply
;; dmpy longword or doublelongword precision integer multiply
@@ -194,15 +196,20 @@
;; pstore store of pr reg, which can't be put into delay slot of jsr
;; prget copy pr to register, ditto
;; pcload pc relative load of constant value
+;; pcfload Likewise, but load to fp register.
;; pcload_si Likewise, SImode variant for general register.
;; rte return from exception
;; sfunc special function call with known used registers
;; call function call
;; fp floating point
;; fdiv floating point divide (or square root)
-;; gp_fpul move between general purpose register and fpul
+;; gp_fpul move from general purpose register to fpul
+;; fpul_gp move from fpul to general purpose register
+;; mac_gp move from mac[lh] to general purpose register
;; dfp_arith, dfp_cmp,dfp_conv
+;; ftrc_s fix_truncsfsi2_i4
;; dfdiv double precision floating point divide (or square root)
+;; cwb ic_invalidate_line_i
;; arith_media SHmedia arithmetic, logical, and shift instructions
;; cbranch_media SHmedia conditional branch instructions
;; cmp_media SHmedia compare instructions
@@ -233,30 +240,32 @@
;; nil no-op move, will be deleted.
(define_attr "type"
- "cbranch,jump,jump_ind,arith,arith3,arith3b,dyn_shift,load,load_si,store,move,fmove,smpy,dmpy,return,pload,prset,pstore,prget,pcload,pcload_si,rte,sfunc,call,fp,fdiv,dfp_arith,dfp_cmp,dfp_conv,dfdiv,gp_fpul,arith_media,cbranch_media,cmp_media,dfdiv_media,dfmul_media,dfparith_media,dfpconv_media,dmpy_media,fcmp_media,fdiv_media,fload_media,fmove_media,fparith_media,fpconv_media,fstore_media,gettr_media,invalidate_line_media,jump_media,load_media,pt_media,ptabs_media,store_media,mcmp_media,mac_media,d2mpy_media,atrans_media,ustore_media,nil,other"
+ "mt_group,cbranch,jump,jump_ind,arith,arith3,arith3b,dyn_shift,load,load_si,fload,store,move,fmove,smpy,dmpy,return,pload,prset,pstore,prget,pcload,pcload_si,pcfload,rte,sfunc,call,fp,fdiv,ftrc_s,dfp_arith,dfp_cmp,dfp_conv,dfdiv,gp_fpul,fpul_gp,mac_gp,mem_fpscr,gp_fpscr,cwb,arith_media,cbranch_media,cmp_media,dfdiv_media,dfmul_media,dfparith_media,dfpconv_media,dmpy_media,fcmp_media,fdiv_media,fload_media,fmove_media,fparith_media,fpconv_media,fstore_media,gettr_media,invalidate_line_media,jump_media,load_media,pt_media,ptabs_media,store_media,mcmp_media,mac_media,d2mpy_media,atrans_media,ustore_media,nil,other"
(const_string "other"))
;; We define a new attribute namely "insn_class".We use
-;; this for DFA based pipeline description.
-;; Although the "type" attribute covers almost all insn
-;; classes,it is more convenient to define new attribute
-;; for certain reservations.
+;; this for the DFA based pipeline description.
;;
;; mt_group SH4 "mt" group instructions.
;;
-;; ex_group SH4 "ex" group instructions.They mostly
-;; overlap with arithmetic instructions but
-;; new attribute defined to distinguish from
-;; mt group instructions.
+;; ex_group SH4 "ex" group instructions.
+;;
+;; ls_group SH4 "ls" group instructions.
;;
-;; lds_to_fpscr The "type" attribute couldn't sufficiently
-;; distinguish it from others.It is part of
-;; new attribute.Similar case with ldsmem_to_fpscr
-;; and cwb.
(define_attr "insn_class"
- "mt_group,ex_group,lds_to_fpscr,ldsmem_to_fpscr,cwb,none"
- (const_string "none"))
+ "mt_group,ex_group,ls_group,br_group,fe_group,co_group,none"
+ (cond [(eq_attr "type" "move,mt_group") (const_string "mt_group")
+ (eq_attr "type" "arith,dyn_shift") (const_string "ex_group")
+ (eq_attr "type" "fmove,load,pcload,load_si,pcload_si,fload,pcfload,store,gp_fpul,fpul_gp") (const_string "ls_group")
+ (eq_attr "type" "cbranch,jump") (const_string "br_group")
+ (eq_attr "type" "fp,fdiv,ftrc_s,dfp_arith,dfp_conv,dfdiv")
+ (const_string "fe_group")
+ (eq_attr "type" "jump_ind,smpy,dmpy,mac_gp,return,pload,prset,pstore,prget,rte,sfunc,call,dfp_cmp,mem_fpscr,gp_fpscr,cwb") (const_string "co_group")]
+ (const_string "none")))
+;; nil are zero instructions, and arith3 / arith3b are multiple instructions,
+;; so these do not belong in an insn group, although they are modeled
+;; with their own define_insn_reservations.
;; Indicate what precision must be selected in fpscr for this insn, if any.
@@ -445,178 +454,6 @@
(and (eq_attr "pipe_model" "sh1") (eq_attr "type" "fdiv")) 13 12)
-;; SH4 scheduling
-;; The SH4 is a dual-issue implementation, thus we have to multiply all
-;; costs by at least two.
-;; There will be single increments of the modeled that don't correspond
-;; to the actual target ;; whenever two insns to be issued depend one a
-;; single resource, and the scheduler picks to be the first one.
-;; If we multiplied the costs just by two, just two of these single
-;; increments would amount to an actual cycle. By picking a larger
-;; factor, we can ameliorate the effect; However, we then have to make sure
-;; that only two insns are modeled as issued per actual cycle.
-;; Moreover, we need a way to specify the latency of insns that don't
-;; use an actual function unit.
-;; We use an 'issue' function unit to do that, and a cost factor of 10.
-
-(define_function_unit "issue" 2 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "!nil,arith3"))
- 10 10)
-
-(define_function_unit "issue" 2 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "arith3"))
- 30 30)
-
-;; There is no point in providing exact scheduling information about branches,
-;; because they are at the starts / ends of basic blocks anyways.
-
-;; Some insns cannot be issued before/after another insn in the same cycle,
-;; irrespective of the type of the other insn.
-
-;; default is dual-issue, but can't be paired with an insn that
-;; uses multiple function units.
-(define_function_unit "single_issue" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "!smpy,dmpy,pload,pstore,dfp_cmp,gp_fpul,call,sfunc,arith3,arith3b"))
- 1 10
- [(eq_attr "type" "smpy,dmpy,pload,pstore,dfp_cmp,gp_fpul")])
-
-(define_function_unit "single_issue" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "smpy,dmpy,pload,pstore,dfp_cmp,gp_fpul"))
- 10 10
- [(const_int 1)])
-
-;; arith3 insns are always pairable at the start, but not inecessarily at
-;; the end; however, there doesn't seem to be a way to express that.
-(define_function_unit "single_issue" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "arith3"))
- 30 20
- [(const_int 1)])
-
-;; arith3b insn are pairable at the end and have latency that prevents pairing
-;; with the following branch, but we don't want this latency be respected;
-;; When the following branch is immediately adjacent, we can redirect the
-;; internal branch, which is likly to be a larger win.
-(define_function_unit "single_issue" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "arith3b"))
- 20 20
- [(const_int 1)])
-
-;; calls introduce a longisch delay that is likely to flush the pipelines.
-(define_function_unit "single_issue" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "call,sfunc"))
- 160 160
- [(eq_attr "type" "!call") (eq_attr "type" "call")])
-
-;; Load and store instructions have no alignment peculiarities for the SH4,
-;; but they use the load-store unit, which they share with the fmove type
-;; insns (fldi[01]; fmov frn,frm; flds; fsts; fabs; fneg) .
-;; Loads have a latency of two.
-;; However, call insns can only paired with a preceding insn, and have
-;; a delay slot, so that we want two more insns to be scheduled between the
-;; load of the function address and the call. This is equivalent to a
-;; latency of three.
-;; We cannot use a conflict list for this, because we need to distinguish
-;; between the actual call address and the function arguments.
-;; ADJUST_COST can only properly handle reductions of the cost, so we
-;; use a latency of three here, which gets multiplied by 10 to yield 30.
-;; We only do this for SImode loads of general registers, to make the work
-;; for ADJUST_COST easier.
-
-;; When specifying different latencies for different insns using the
-;; the same function unit, genattrtab.c assumes a 'FIFO constraint'
-;; so that the blockage is at least READY-COST (E) + 1 - READY-COST (C)
-;; for an executing insn E and a candidate insn C.
-;; Therefore, we define three different function units for load_store:
-;; load_store, load and load_si.
-
-(define_function_unit "load_si" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "load_si,pcload_si")) 30 10)
-(define_function_unit "load" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "load,pcload,pload")) 20 10)
-(define_function_unit "load_store" 1 0
- (and (eq_attr "pipe_model" "sh4")
- (eq_attr "type" "load_si,pcload_si,load,pcload,pload,store,pstore,fmove"))
- 10 10)
-
-(define_function_unit "int" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "arith,dyn_shift")) 10 10)
-
-;; Again, we have to pretend a lower latency for the "int" unit to avoid a
-;; spurious FIFO constraint; the multiply instructions use the "int"
-;; unit actually only for two cycles.
-(define_function_unit "int" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "smpy,dmpy")) 20 20)
-
-;; We use a fictous "mpy" unit to express the actual latency.
-(define_function_unit "mpy" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "smpy,dmpy")) 40 20)
-
-;; Again, we have to pretend a lower latency for the "int" unit to avoid a
-;; spurious FIFO constraint.
-(define_function_unit "int" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "gp_fpul")) 10 10)
-
-;; We use a fictous "gp_fpul" unit to express the actual latency.
-(define_function_unit "gp_fpul" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "gp_fpul")) 20 10)
-
-;; ??? multiply uses the floating point unit, but with a two cycle delay.
-;; Thus, a simple single-precision fp operation could finish if issued in
-;; the very next cycle, but stalls when issued two or three cycles later.
-;; Similarily, a divide / sqrt can work without stalls if issued in
-;; the very next cycle, while it would have to block if issued two or
-;; three cycles later.
-;; There is no way to model this with gcc's function units. This problem is
-;; actually mentioned in md.texi. Tackling this problem requires first that
-;; it is possible to speak about the target in an open discussion.
-;;
-;; However, simple double-precision operations always conflict.
-
-(define_function_unit "fp" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "smpy,dmpy")) 40 40
- [(eq_attr "type" "dfp_cmp,dfp_conv,dfp_arith")])
-
-;; The "fp" unit is for pipeline stages F1 and F2.
-
-(define_function_unit "fp" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "fp")) 30 10)
-
-;; Again, we have to pretend a lower latency for the "fp" unit to avoid a
-;; spurious FIFO constraint; the bulk of the fdiv type insns executes in
-;; the F3 stage.
-(define_function_unit "fp" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "fdiv")) 30 10)
-
-;; The "fdiv" function unit models the aggregate effect of the F1, F2 and F3
-;; pipeline stages on the pipelining of fdiv/fsqrt insns.
-;; We also use it to give the actual latency here.
-;; fsqrt is actually one cycle faster than fdiv (and the value used here),
-;; but that will hardly matter in practice for scheduling.
-(define_function_unit "fdiv" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "fdiv")) 120 100)
-
-;; There is again a late use of the "fp" unit by [d]fdiv type insns
-;; that we can't express.
-
-(define_function_unit "fp" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "dfp_cmp,dfp_conv")) 40 20)
-
-(define_function_unit "fp" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "dfp_arith")) 80 60)
-
-(define_function_unit "fp" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "dfdiv")) 230 10)
-
-(define_function_unit "fdiv" 1 0
- (and (eq_attr "pipe_model" "sh4") (eq_attr "type" "dfdiv")) 230 210)
-
;; SH-5 SHmedia scheduling
;; When executing SHmedia code, the SH-5 is a fairly straightforward
;; single-issue machine. It has four pipelines, the branch unit (br),
@@ -706,6 +543,35 @@
(define_attr "is_mac_media" ""
(if_then_else (eq_attr "type" "mac_media") (const_int 1) (const_int 0)))
+(define_attr "branch_zero" "yes,no"
+ (cond [(eq_attr "type" "!cbranch") (const_string "no")
+ (ne (symbol_ref "(next_active_insn (insn)\
+ == (prev_active_insn\
+ (XEXP (SET_SRC (PATTERN (insn)), 1))))\
+ && get_attr_length (next_active_insn (insn)) == 2")
+ (const_int 0))
+ (const_string "yes")]
+ (const_string "no")))
+
+;; SH4 Double-precision computation with double-precision result -
+;; the two halves are ready at different times.
+(define_attr "dfp_comp" "yes,no"
+ (cond [(eq_attr "type" "dfp_arith,dfp_conv,dfdiv") (const_string "yes")]
+ (const_string "no")))
+
+;; Insns for which the latency of a preceding fp insn is decreased by one.
+(define_attr "late_fp_use" "yes,no" (const_string "no"))
+;; And feeding insns for which this relevant.
+(define_attr "any_fp_comp" "yes,no"
+ (cond [(eq_attr "type" "fp,fdiv,ftrc_s,dfp_arith,dfp_conv,dfdiv")
+ (const_string "yes")]
+ (const_string "no")))
+
+(define_attr "any_int_load" "yes,no"
+ (cond [(eq_attr "type" "load,load_si,pcload,pcload_si")
+ (const_string "yes")]
+ (const_string "no")))
+
(define_delay
(eq_attr "needs_delay_slot" "yes")
[(eq_attr "in_delay_slot" "yes") (nil) (nil)])
@@ -755,7 +621,7 @@
(const_int 0)))]
"TARGET_SH1"
"tst %1,%0"
- [(set_attr "insn_class" "mt_group")])
+ [(set_attr "type" "mt_group")])
;; ??? Perhaps should only accept reg/constant if the register is reg 0.
;; That would still allow reload to create cmpi instructions, but would
@@ -772,7 +638,7 @@
tst %0,%0
cmp/eq %1,%0
cmp/eq %1,%0"
- [(set_attr "insn_class" "mt_group,mt_group,mt_group")])
+ [(set_attr "type" "mt_group")])
(define_insn "cmpgtsi_t"
[(set (reg:SI T_REG)
@@ -782,7 +648,7 @@
"@
cmp/gt %1,%0
cmp/pl %0"
- [(set_attr "insn_class" "mt_group,mt_group")])
+ [(set_attr "type" "mt_group")])
(define_insn "cmpgesi_t"
[(set (reg:SI T_REG)
@@ -792,7 +658,7 @@
"@
cmp/ge %1,%0
cmp/pz %0"
- [(set_attr "insn_class" "mt_group,mt_group")])
+ [(set_attr "type" "mt_group")])
;; -------------------------------------------------------------------------
;; SImode unsigned integer comparisons
@@ -804,7 +670,7 @@
(match_operand:SI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"cmp/hs %1,%0"
- [(set_attr "insn_class" "mt_group")])
+ [(set_attr "type" "mt_group")])
(define_insn "cmpgtusi_t"
[(set (reg:SI T_REG)
@@ -812,7 +678,7 @@
(match_operand:SI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"cmp/hi %1,%0"
- [(set_attr "insn_class" "mt_group")])
+ [(set_attr "type" "mt_group")])
;; We save the compare operands in the cmpxx patterns and use them when
;; we generate the branch.
@@ -909,7 +775,7 @@
cmp/eq\\t%S1,%S0\;bf{.|/}s\\t%,Ldi%=\;cmp/ge\\t%S1,%S0\;cmp/hs\\t%R1,%R0\\n%,Ldi%=:
cmp/pz\\t%S0"
[(set_attr "length" "8,2")
- (set_attr "type" "arith3,arith")])
+ (set_attr "type" "arith3,mt_group")])
;; -------------------------------------------------------------------------
;; DImode unsigned integer comparisons
@@ -1176,8 +1042,7 @@
(ltu:SI (plus:SI (match_dup 1) (match_dup 2)) (match_dup 1)))]
"TARGET_SH1"
"addc %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "addc1"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -1187,8 +1052,7 @@
(clobber (reg:SI T_REG))]
"TARGET_SH1"
"addc %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_expand "addsi3"
[(set (match_operand:SI 0 "arith_reg_operand" "")
@@ -1217,8 +1081,7 @@
(match_operand:SI 2 "arith_operand" "rI")))]
"TARGET_SH1"
"add %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
;; -------------------------------------------------------------------------
;; Subtraction instructions
@@ -1287,8 +1150,7 @@
(gtu:SI (minus:SI (match_dup 1) (match_dup 2)) (match_dup 1)))]
"TARGET_SH1"
"subc %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "subc1"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -1298,8 +1160,7 @@
(clobber (reg:SI T_REG))]
"TARGET_SH1"
"subc %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "*subsi3_internal"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -1307,8 +1168,7 @@
(match_operand:SI 2 "arith_reg_operand" "r")))]
"TARGET_SH1"
"sub %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "*subsi3_media"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -1734,6 +1594,14 @@
invariant code motion can move it. */
REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last, REG_NOTES (first));
REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first, REG_NOTES (last));
+ /* expand_binop can't find a suitable code in umul_widen_optab to
+ make a REG_EQUAL note from, so make one here.
+ See also smulsi3_highpart.
+ ??? Alternatively, we could put this at the calling site of expand_binop,
+ i.e. expand_expr. */
+ REG_NOTES (last)
+ = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (SET_SRC (single_set (first))),
+ REG_NOTES (last));
DONE;
}")
@@ -1756,6 +1624,14 @@
invariant code motion can move it. */
REG_NOTES (first) = gen_rtx_INSN_LIST (REG_LIBCALL, last, REG_NOTES (first));
REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first, REG_NOTES (last));
+ /* expand_binop can't find a suitable code in umul_widen_optab to
+ make a REG_EQUAL note from, so make one here.
+ See also smulsi3_highpart.
+ ??? Alternatively, we could put this at the calling site of expand_binop,
+ i.e. expand_expr. */
+ REG_NOTES (last)
+ = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (SET_SRC (single_set (first))),
+ REG_NOTES (last));
DONE;
}")
@@ -2019,6 +1895,7 @@
REG_NOTES (last) = gen_rtx_INSN_LIST (REG_RETVAL, first, REG_NOTES (last));
/* expand_binop can't find a suitable code in mul_highpart_optab to
make a REG_EQUAL note from, so make one here.
+ See also {,u}mulhisi.
??? Alternatively, we could put this at the calling site of expand_binop,
i.e. expand_mult_highpart. */
REG_NOTES (last)
@@ -2076,10 +1953,9 @@
(match_operand:SI 2 "logical_operand" "r,L")))]
"TARGET_SH1"
"and %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
-;; If the constant is 255, then emit a extu.b instruction instead of an
+;; If the constant is 255, then emit an extu.b instruction instead of an
;; and, since that will give better code.
(define_expand "andsi3"
@@ -2133,8 +2009,7 @@
(match_operand:SI 2 "logical_operand" "r,L")))]
"TARGET_SH1"
"or %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "iordi3"
[(set (match_operand:DI 0 "arith_reg_operand" "=r,r")
@@ -2152,8 +2027,7 @@
(match_operand:SI 2 "logical_operand" "L,r")))]
"TARGET_SH1"
"xor %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "xordi3"
[(set (match_operand:DI 0 "arith_reg_operand" "=r,r")
@@ -2220,8 +2094,7 @@
(lshiftrt:SI (match_dup 1) (const_int 31)))]
"TARGET_SH1"
"rotl %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "rotlsi3_31"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -2230,8 +2103,7 @@
(clobber (reg:SI T_REG))]
"TARGET_SH1"
"rotr %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "rotlsi3_16"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -2239,8 +2111,7 @@
(const_int 16)))]
"TARGET_SH1"
"swap.w %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_expand "rotlsi3"
[(set (match_operand:SI 0 "arith_reg_operand" "")
@@ -2304,8 +2175,7 @@
(const_int 8)))]
"TARGET_SH1"
"swap.b %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_expand "rotlhi3"
[(set (match_operand:HI 0 "arith_reg_operand" "")
@@ -2347,8 +2217,7 @@
(clobber (match_dup 4))])]
"operands[4] = gen_rtx_SCRATCH (SImode);"
[(set_attr "length" "*,*,*,4")
- (set_attr "type" "dyn_shift,arith,arith,arith")
- (set_attr "insn_class" "ex_group,ex_group,ex_group,ex_group")])
+ (set_attr "type" "dyn_shift,arith,arith,arith")])
(define_insn "ashlhi3_k"
[(set (match_operand:HI 0 "arith_reg_operand" "=r,r")
@@ -2358,8 +2227,7 @@
"@
add %0,%0
shll%O2 %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "ashlsi3_n"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -2376,8 +2244,7 @@
(eq (symbol_ref "shift_insns_rtx (insn)") (const_int 3))
(const_string "6")]
(const_string "8")))
- (set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ (set_attr "type" "arith")])
(define_split
[(set (match_operand:SI 0 "arith_reg_operand" "")
@@ -2466,8 +2333,7 @@
(clobber (reg:SI T_REG))]
"TARGET_SH1 && INTVAL (operands[2]) == 1"
"shar %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
;; We can't do HImode right shifts correctly unless we start out with an
;; explicit zero / sign extension; doing that would result in worse overall
@@ -2526,8 +2392,7 @@
(lt:SI (match_dup 1) (const_int 0)))]
"TARGET_SH1"
"shll %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "ashrsi3_d"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -2535,8 +2400,7 @@
(neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
"TARGET_SH3"
"shad %2,%0"
- [(set_attr "type" "dyn_shift")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "dyn_shift")])
(define_insn "ashrsi3_n"
[(set (reg:SI R4_REG)
@@ -2587,8 +2451,7 @@
(neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
"TARGET_SH3"
"shld %2,%0"
- [(set_attr "type" "dyn_shift")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "dyn_shift")])
;; Only the single bit shift clobbers the T bit.
@@ -2599,8 +2462,7 @@
(clobber (reg:SI T_REG))]
"TARGET_SH1 && CONST_OK_FOR_M (INTVAL (operands[2]))"
"shlr %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "lshrsi3_k"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -2609,8 +2471,7 @@
"TARGET_SH1 && CONST_OK_FOR_K (INTVAL (operands[2]))
&& ! CONST_OK_FOR_M (INTVAL (operands[2]))"
"shlr%O2 %0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "lshrsi3_n"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -2689,8 +2550,7 @@
"TARGET_SH1"
"shll %R0\;rotcl %S0"
[(set_attr "length" "4")
- (set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ (set_attr "type" "arith")])
(define_insn "ashldi3_media"
[(set (match_operand:DI 0 "arith_reg_operand" "=r,r")
@@ -2730,8 +2590,7 @@
"TARGET_SH1"
"shlr %S0\;rotcr %R0"
[(set_attr "length" "4")
- (set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ (set_attr "type" "arith")])
(define_insn "lshrdi3_media"
[(set (match_operand:DI 0 "arith_reg_operand" "=r,r")
@@ -2771,8 +2630,7 @@
"TARGET_SH1"
"shar %S0\;rotcr %R0"
[(set_attr "length" "4")
- (set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ (set_attr "type" "arith")])
(define_insn "ashrdi3_media"
[(set (match_operand:DI 0 "arith_reg_operand" "=r,r")
@@ -3007,8 +2865,7 @@
(const_int 16))))]
"TARGET_SH1"
"xtrct %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "xtrct_right"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
@@ -3018,8 +2875,7 @@
(const_int 16))))]
"TARGET_SH1"
"xtrct %2,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
;; -------------------------------------------------------------------------
;; Unary arithmetic
@@ -3034,8 +2890,7 @@
(const_int 0)))]
"TARGET_SH1"
"negc %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "*negdi_media"
[(set (match_operand:DI 0 "arith_reg_operand" "=r")
@@ -3073,16 +2928,14 @@
(neg:SI (match_operand:SI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"neg %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "one_cmplsi2"
[(set (match_operand:SI 0 "arith_reg_operand" "=r")
(not:SI (match_operand:SI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"not %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_expand "one_cmpldi2"
[(set (match_operand:DI 0 "arith_reg_operand" "")
@@ -3157,8 +3010,7 @@
(zero_extend:SI (match_operand:HI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"extu.w %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "*zero_extendhisi2_media"
[(set (match_operand:SI 0 "register_operand" "=r,r")
@@ -3196,8 +3048,7 @@
(zero_extend:SI (match_operand:QI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"extu.b %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
(define_insn "*zero_extendqisi2_media"
[(set (match_operand:SI 0 "register_operand" "=r,r")
@@ -3213,8 +3064,7 @@
(zero_extend:HI (match_operand:QI 1 "arith_reg_operand" "r")))]
"TARGET_SH1"
"extu.b %1,%0"
- [(set_attr "type" "arith")
- (set_attr "insn_class" "ex_group")])
+ [(set_attr "type" "arith")])
;; -------------------------------------------------------------------------
;; Sign extension instructions
@@ -3288,8 +3138,7 @@
"@
exts.w %1,%0
mov.w %1,%0"
- [(set_attr "type" "arith,load")
- (set_attr "insn_class" "ex_group,*")])
+ [(set_attr "type" "arith,load")])
(define_insn "*extendhisi2_media"
[(set (match_operand:SI 0 "register_operand" "=r,r")
@@ -3325,8 +3174,7 @@
"@
exts.b %1,%0
mov.b %1,%0"
- [(set_attr "type" "arith,load")
- (set_attr "insn_class" "ex_group,*")])
+ [(set_attr "type" "arith,load")])
(define_insn "*extendqisi2_media"
[(set (match_operand:SI 0 "register_operand" "=r,r")
@@ -3356,8 +3204,7 @@
"@
exts.b %1,%0
mov.b %1,%0"
- [(set_attr "type" "arith,load")
- (set_attr "insn_class" "ex_group,*")])
+ [(set_attr "type" "arith,load")])
/* It would seem useful to combine the truncXi patterns into the movXi
patterns, but unary operators are ignored when matching constraints,
@@ -3431,6 +3278,7 @@
"TARGET_SH3E && ! TARGET_SH5"
"sts.l fpul,@-r15"
[(set_attr "type" "store")
+ (set_attr "late_fp_use" "yes")
(set_attr "hit_stack" "yes")])
;; DFmode pushes for sh4 require a lot of what is defined for movdf_i4,
@@ -3506,8 +3354,7 @@
lds.l %1,%0
lds.l %1,%0
fake %1,%0"
- [(set_attr "type" "pcload_si,move,*,load_si,move,prget,move,store,store,pstore,move,prset,load,pload,pcload_si")
- (set_attr "insn_class" "*,*,mt_group,*,*,*,*,*,*,*,*,*,*,*,*")
+ [(set_attr "type" "pcload_si,move,mt_group,load_si,mac_gp,prget,move,store,store,pstore,move,prset,load,pload,pcload_si")
(set_attr "length" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*")])
;; t/r must come after r/r, lest reload will try to reload stuff like
@@ -3541,7 +3388,8 @@
lds %1,%0
sts %1,%0
! move optimized away"
- [(set_attr "type" "pcload_si,move,*,load_si,move,prget,move,store,store,pstore,move,prset,load,pload,load,store,pcload_si,gp_fpul,gp_fpul,nil")
+ [(set_attr "type" "pcload_si,move,*,load_si,mac_gp,prget,move,store,store,pstore,move,prset,load,pload,load,store,pcload_si,gp_fpul,fpul_gp,nil")
+ (set_attr "late_fp_use" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,yes,*,*,yes,*")
(set_attr "length" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,0")])
(define_insn "movsi_i_lowpart"
@@ -3666,7 +3514,7 @@
"TARGET_HARD_SH4"
"ocbwb\\t@%0\;extu.w\\t%0,%2\;or\\t%1,%2\;mov.l\\t%0,@%2"
[(set_attr "length" "8")
- (set_attr "insn_class" "cwb")])
+ (set_attr "type" "cwb")])
;; ??? could make arg 0 an offsettable memory operand to allow to save
;; an add in the code that calculates the address.
@@ -4313,7 +4161,8 @@
(if_then_else
(ne (symbol_ref "TARGET_SHCOMPACT") (const_int 0))
(const_int 10) (const_int 8))])
- (set_attr "type" "fmove,move,pcload,load,store,pcload,load,store,load,load")
+ (set_attr "type" "fmove,move,pcfload,fload,store,pcload,load,store,load,fload")
+ (set_attr "late_fp_use" "*,*,*,*,yes,*,*,*,*,*")
(set (attr "fp_mode") (if_then_else (eq_attr "fmovd" "yes")
(const_string "double")
(const_string "none")))])
@@ -5015,7 +4864,8 @@
sts.l %1,%0
lds.l %1,%0
! move optimized away"
- [(set_attr "type" "fmove,move,fmove,fmove,pcload,load,store,pcload,load,store,fmove,fmove,load,*,gp_fpul,gp_fpul,store,load,nil")
+ [(set_attr "type" "fmove,move,fmove,fmove,pcfload,fload,store,pcload,load,store,fmove,fmove,load,*,fpul_gp,gp_fpul,store,load,nil")
+ (set_attr "late_fp_use" "*,*,*,*,*,*,yes,*,*,*,*,*,*,*,yes,*,yes,*,*")
(set_attr "length" "*,*,*,*,4,*,*,*,*,*,2,2,2,4,2,2,2,2,0")
(set (attr "fp_mode") (if_then_else (eq_attr "fmovd" "yes")
(const_string "single")
@@ -7996,8 +7846,8 @@
;; GO_IF_LEGITIMATE_ADDRESS guards about bogus addresses before reload,
;; SECONDARY_INPUT_RELOAD_CLASS does this during reload, and the insn's
;; predicate after reload.
-;; The gp_fpul type for r/!c might look a bit odd, but it actually schedules
-;; like a gpr <-> fpul move.
+;; The mac_gp type for r/!c might look a bit odd, but it actually schedules
+;; like a mac -> gpr move.
(define_insn "fpu_switch"
[(set (match_operand:PSI 0 "register_operand" "=c,c,r,c,c,r,m,r")
(match_operand:PSI 1 "general_movsrc_operand" "c,>,m,m,r,r,r,!c"))]
@@ -8016,8 +7866,7 @@
mov.l %1,%0
sts fpscr,%0"
[(set_attr "length" "0,2,2,4,2,2,2,2")
- (set_attr "type" "dfp_conv,dfp_conv,load,dfp_conv,dfp_conv,move,store,gp_fpul")
- (set_attr "insn_class" "ldsmem_to_fpscr,*,*,lds_to_fpscr,*,*,*,*")])
+ (set_attr "type" "nil,mem_fpscr,load,mem_fpscr,gp_fpscr,move,store,mac_gp")])
(define_split
[(set (reg:PSI FPSCR_REG)
@@ -8363,7 +8212,7 @@
(use (match_operand:PSI 2 "fpscr_operand" "c"))]
"TARGET_SH4"
"ftrc %1,%0"
- [(set_attr "type" "fp")
+ [(set_attr "type" "ftrc_s")
(set_attr "fp_mode" "single")])
;; ??? This pattern is used nowhere. fix_truncsfsi2 always expands to
@@ -8785,6 +8634,7 @@
"TARGET_SH4"
"ftrc %1,%0"
[(set_attr "type" "dfp_conv")
+ (set_attr "dfp_comp" "no")
(set_attr "fp_mode" "double")])
;; ??? This pattern is used nowhere. fix_truncdfsi2 always expands to
@@ -9299,7 +9149,9 @@
&& VECTOR_MODE_SUPPORTED_P (GET_MODE (operands[0]))
&& GET_MODE_SIZE (GET_MODE (operands[0])) == 8
&& (XVECEXP (operands[1], 0, 0) != const0_rtx
- || XVECEXP (operands[1], 0, 1) != const0_rtx)"
+ || XVECEXP (operands[1], 0, 1) != const0_rtx)
+ && (XVECEXP (operands[1], 0, 0) != constm1_rtx
+ || XVECEXP (operands[1], 0, 1) != constm1_rtx)"
[(set (match_dup 0) (match_dup 1))
(match_dup 2)]
"
@@ -9310,7 +9162,11 @@
if (unit_size > 2)
operands[2] = gen_mshflo_l (operands[0], operands[0], operands[0]);
else
- operands[2] = gen_mperm_w0 (operands[0], operands[0]);
+ {
+ if (unit_size < 2)
+ operands[0] = gen_rtx_REG (V4HImode, true_regnum (operands[0]));
+ operands[2] = gen_mperm_w0 (operands[0], operands[0]);
+ }
operands[0] = gen_rtx_REG (DImode, true_regnum (operands[0]));
operands[1] = XVECEXP (operands[1], 0, 0);
if (unit_size < 2)
@@ -9877,6 +9733,7 @@
{
emit_insn ((TARGET_LITTLE_ENDIAN ? gen_mperm_w_little : gen_mperm_w_big)
(operands[0], operands[1], operands[2]));
+ DONE;
}")
; This use of vec_select isn't exactly correct according to rtl.texi
@@ -9886,11 +9743,11 @@
(vec_select:V4HI
(match_operand:V4HI 1 "arith_reg_operand" "r")
(parallel
- [(zero_extract (match_operand:QI 2 "extend_reg_or_0_operand" "rU")
- (const_int 2) (const_int 0))
- (zero_extract (match_dup 2) (const_int 2) (const_int 2))
- (zero_extract (match_dup 2) (const_int 2) (const_int 4))
- (zero_extract (match_dup 2) (const_int 2) (const_int 6))])))]
+ [(zero_extract:QI (match_operand:QI 2 "extend_reg_or_0_operand" "rU")
+ (const_int 2) (const_int 0))
+ (zero_extract:QI (match_dup 2) (const_int 2) (const_int 2))
+ (zero_extract:QI (match_dup 2) (const_int 2) (const_int 4))
+ (zero_extract:QI (match_dup 2) (const_int 2) (const_int 6))])))]
"TARGET_SHMEDIA && TARGET_LITTLE_ENDIAN"
"mperm.w %1, %N2, %0"
[(set_attr "type" "arith_media")])
@@ -9900,12 +9757,13 @@
(vec_select:V4HI
(match_operand:V4HI 1 "arith_reg_operand" "r")
(parallel
- [(zero_extract (not:QI (match_operand:QI 2
- "extend_reg_or_0_operand" "rU"))
- (const_int 2) (const_int 0))
- (zero_extract (not:QI (match_dup 2)) (const_int 2) (const_int 2))
- (zero_extract (not:QI (match_dup 2)) (const_int 2) (const_int 4))
- (zero_extract (not:QI (match_dup 2)) (const_int 2) (const_int 6))])))]
+ [(zero_extract:QI (not:QI (match_operand:QI 2
+ "extend_reg_or_0_operand" "rU"))
+ (const_int 2) (const_int 0))
+ (zero_extract:QI (not:QI (match_dup 2)) (const_int 2) (const_int 2))
+ (zero_extract:QI (not:QI (match_dup 2)) (const_int 2) (const_int 4))
+ (zero_extract:QI (not:QI (match_dup 2))
+ (const_int 2) (const_int 6))])))]
"TARGET_SHMEDIA && ! TARGET_LITTLE_ENDIAN"
"mperm.w %1, %N2, %0"
[(set_attr "type" "arith_media")])
@@ -10528,14 +10386,15 @@
rtx discratch = gen_reg_rtx (DImode);
rtx last;
- emit_insn (gen_adddi3z_media (discratch, operands[1],
- force_reg (SImode, GEN_INT (-1))));
- emit_insn (gen_andcdi3 (discratch, discratch,
- simplify_gen_subreg (DImode, operands[1],
- SImode, 0)));
+ emit_insn (gen_adddi3 (discratch,
+ simplify_gen_subreg (DImode, operands[1], SImode, 0),
+ GEN_INT (-1)));
+ emit_insn (gen_andcdi3 (discratch,
+ simplify_gen_subreg (DImode, operands[1], SImode, 0),
+ discratch));
emit_insn (gen_nsbsi (scratch, discratch));
last = emit_insn (gen_subsi3 (operands[0],
- force_reg (SImode, GEN_INT (-64)), scratch));
+ force_reg (SImode, GEN_INT (63)), scratch));
REG_NOTES (last)
= gen_rtx_EXPR_LIST (REG_EQUAL,
gen_rtx_FFS (SImode, operands[0]), REG_NOTES (last));
@@ -10591,18 +10450,22 @@
(define_cpu_unit "f1_1,f1_2" "fpu_pipe")
-;; The floating point units.
+;; The floating point units (except FS - F2 always precedes it.)
-(define_cpu_unit "F1,F2,F3,FS" "fpu_pipe")
+(define_cpu_unit "F0,F1,F2,F3" "fpu_pipe")
;; This is basically the MA unit of SH4
;; used in LOAD/STORE pipeline.
(define_cpu_unit "memory" "inst_pipeline")
+;; However, there are LS group insns that don't use it, even ones that
+;; complete in 0 cycles. So we use an extra unit for the issue of LS insns.
+(define_cpu_unit "load_store" "inst_pipeline")
+
;; The address calculator used for branch instructions.
-;; This will be reserved with "issue" of branch instructions
-;; and this is to make sure that no two branch instructions
+;; This will be reserved after "issue" of branch instructions
+;; and this is to make sure that no two branch instructions
;; can be issued in parallel.
(define_cpu_unit "pcr_addrcalc" "inst_pipeline")
@@ -10613,26 +10476,57 @@
(define_reservation "issue" "pipe_01|pipe_02")
;; This is to express the locking of D stage.
+;; Note that the issue of a CO group insn also effectively locks the D stage.
(define_reservation "d_lock" "pipe_01+pipe_02")
+;; Every FE instruction but fipr / ftrv starts with issue and this.
+(define_reservation "F01" "F0+F1")
+
;; This is to simplify description where F1,F2,FS
;; are used simultaneously.
-(define_reservation "fpu" "F1+F2+FS")
+(define_reservation "fpu" "F1+F2")
;; This is to highlight the fact that f1
;; cannot overlap with F1.
(exclusion_set "f1_1,f1_2" "F1")
+(define_insn_reservation "nil" 0 (eq_attr "type" "nil") "nothing")
+
;; Although reg moves have a latency of zero
;; we need to highlight that they use D stage
;; for one cycle.
+;; Group: MT
+
(define_insn_reservation "reg_mov" 0
- (eq_attr "type" "move,fmove")
- "issue")
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "move"))
+ "issue")
+
+;; Group: LS
+
+(define_insn_reservation "freg_mov" 0
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "fmove"))
+ "issue+load_store")
+
+;; We don't model all pipeline stages; we model the issue ('D') stage
+;; inasmuch as we allow only two instructions to issue simultanously,
+;; and CO instructions prevent any simultanous issue of another instruction.
+;; (This uses pipe_01 and pipe_02).
+;; Double issue of EX insns is prevented by using the int unit in the EX stage.
+;; Double issue of EX / BR insns is prevented by using the int unit /
+;; pcr_addrcalc unit in the EX stage.
+;; Double issue of BR / LS instructions is prevented by using the
+;; pcr_addrcalc / load_store unit in the issue cycle.
+;; Double issue of FE instructions is prevented by using F0 in the first
+;; pipeline stage after the first D stage.
+;; There is no need to describe the [ES]X / [MN]A / S stages after a D stage
+;; (except in the cases outlined above), nor to describe the FS stage after
+;; the F2 stage.
;; Other MT group intructions(1 step operations)
;; Group: MT
@@ -10640,88 +10534,170 @@
;; Issue Rate: 1
(define_insn_reservation "mt" 1
- (eq_attr "insn_class" "mt_group")
- "issue,nothing")
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "mt_group"))
+ "issue")
;; Fixed Point Arithmetic Instructions(1 step operations)
;; Group: EX
;; Latency: 1
;; Issue Rate: 1
-(define_insn_reservation "simple_arith" 1
- (eq_attr "insn_class" "ex_group")
- "issue,int")
+(define_insn_reservation "sh4_simple_arith" 1
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "insn_class" "ex_group"))
+ "issue,int")
+
+;; Load and store instructions have no alignment peculiarities for the SH4,
+;; but they use the load-store unit, which they share with the fmove type
+;; insns (fldi[01]; fmov frn,frm; flds; fsts; fabs; fneg) .
+;; Loads have a latency of two.
+;; However, call insns can only paired with a preceding insn, and have
+;; a delay slot, so that we want two more insns to be scheduled between the
+;; load of the function address and the call. This is equivalent to a
+;; latency of three.
+;; ADJUST_COST can only properly handle reductions of the cost, so we
+;; use a latency of three here, which gets multiplied by 10 to yield 30.
+;; We only do this for SImode loads of general registers, to make the work
+;; for ADJUST_COST easier.
;; Load Store instructions. (MOV.[BWL]@(d,GBR)
;; Group: LS
;; Latency: 2
;; Issue Rate: 1
-(define_insn_reservation "load_store" 2
- (eq_attr "type" "load,load_si,pcload,pcload_si,store")
- "issue,memory*2")
+(define_insn_reservation "sh4_load" 2
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "load,pcload"))
+ "issue+load_store,nothing,memory")
+
+;; calls / sfuncs need an extra instruction for their delay slot.
+;; Moreover, estimating the latency for SImode loads as 3 will also allow
+;; adjust_cost to meaningfully bump it back up to 3 if they load the shift
+;; count of a dynamic shift.
+(define_insn_reservation "sh4_load_si" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "load_si,pcload_si"))
+ "issue+load_store,nothing,memory")
+
+;; (define_bypass 2 "sh4_load_si" "!sh4_call")
+
+;; The load latency is upped to three higher if the dependent insn does
+;; double precision computation. We want the 'default' latency to reflect
+;; that increased latency because otherwise the insn priorities won't
+;; allow proper scheduling.
+(define_insn_reservation "sh4_fload" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "fload,pcfload"))
+ "issue+load_store,nothing,memory")
+
+;; (define_bypass 2 "sh4_fload" "!")
+
+(define_insn_reservation "sh4_store" 1
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "store"))
+ "issue+load_store,nothing,memory")
+
+;; Load Store instructions.
+;; Group: LS
+;; Latency: 1
+;; Issue Rate: 1
+
+(define_insn_reservation "sh4_gp_fpul" 1
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "gp_fpul"))
+ "issue+load_store")
+
+;; Load Store instructions.
+;; Group: LS
+;; Latency: 3
+;; Issue Rate: 1
+
+(define_insn_reservation "sh4_fpul_gp" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "fpul_gp"))
+ "issue+load_store")
;; Branch (BF,BF/S,BT,BT/S,BRA)
;; Group: BR
-;; Latency: 2 (or 1) Actually Observed to be 5/7
+;; Latency when taken: 2 (or 1)
;; Issue Rate: 1
;; The latency is 1 when displacement is 0.
-;; This reservation can be further broken into 2
-;; 1. branch_zero : One with latency 1 and in the TEST
-;; part it also checks for 0 (ZERO) displacement
-;; 2. branch: Latency 2.
+;; We can't really do much with the latency, even if we could express it,
+;; but the pairing restrictions are useful to take into account.
+;; ??? If the branch is likely, we might want to fill the delay slot;
+;; if the branch is likely, but not very likely, should we pretend to use
+;; a resource that CO instructions use, to get a pairable delay slot insn?
-(define_insn_reservation "branch_zero" 5
- (and (eq_attr "type" "cbranch")
- (eq_attr "length" "2"))
- "(issue+pcr_addrcalc),pcr_addrcalc,nothing")
-
-(define_insn_reservation "branch" 7
- (eq_attr "type" "cbranch")
- "(issue+pcr_addrcalc),pcr_addrcalc,nothing")
+(define_insn_reservation "sh4_branch" 1
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "cbranch,jump"))
+ "issue+pcr_addrcalc")
;; Branch Far (JMP,RTS,BRAF)
;; Group: CO
;; Latency: 3
;; Issue Rate: 2
-;; Since issue stage (D stage) is blocked for 2nd cycle,
-;; cpu_unit int is reserved since it might be required for far
-;; address calculation.
+;; ??? Scheduling happens before branch shortening, and hence jmp and braf
+;; can't be distinguished from bra for the "jump" pattern.
-(define_insn_reservation "branch_far" 12
- (and (eq_attr "type" "jump,return")
- (eq_attr "length" "6"))
- "d_lock*2,int+pcr_addrcalc,pcr_addrcalc")
+(define_insn_reservation "sh4_return" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "return,jump_ind"))
+ "d_lock*2")
;; RTE
;; Group: CO
-;; atency: 5
+;; Latency: 5
;; Issue Rate: 5
;; this instruction can be executed in any of the pipelines
;; and blocks the pipeline for next 4 stages.
-(define_insn_reservation "return_from_exp" 5
- (eq_attr "type" "rte")
- "(issue+pcr_addrcalc),d_lock*4,int+pcr_addrcalc,nothing")
+(define_insn_reservation "sh4_return_from_exp" 5
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "rte"))
+ "d_lock*5")
;; OCBP, OCBWB
;; Group: CO
-;; Latency: 5
+;; Latency: 1-5
;; Issue Rate: 1
-(define_insn_reservation "ocbwb" 5
- (eq_attr "insn_class" "cwb")
- "issue,(int+memory),memory*5")
+;; cwb is used for the sequence ocbwb @%0; extu.w %0,%2; or %1,%2; mov.l %0,@%2
+;; ocbwb on its own would be "d_lock,nothing,memory*5"
+(define_insn_reservation "ocbwb" 6
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "cwb"))
+ "d_lock*2,(d_lock+memory)*3,issue+load_store+memory,memory*2")
;; LDS to PR,JSR
;; Group: CO
;; Latency: 3
;; Issue Rate: 2
;; The SX stage is blocked for last 2 cycles.
+;; OTOH, the only time that has an effect for insns generated by the compiler
+;; is when lds to PR is followed by sts from PR - and that is highly unlikely -
+;; or when we are doing a function call - and we don't do inter-function
+;; scheduling. For the function call case, it's really best that we end with
+;; something that models an rts.
-(define_insn_reservation "lds_to_pr" 3
- (eq_attr "type" "prset,call,sfunc")
- "(issue+pcr_addrcalc),(issue+int+pcr_addrcalc),(int+pcr_addrcalc)*2")
+(define_insn_reservation "sh4_lds_to_pr" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "prset") )
+ "d_lock*2")
+
+;; calls introduce a longisch delay that is likely to flush the pipelines
+;; of the caller's instructions. Ordinary functions tend to end with a
+;; load to restore a register (in the delay slot of rts), while sfuncs
+;; tend to end with an EX or MT insn. But that is not actually relevant,
+;; since there are no instructions that contend for memory access early.
+;; We could, of course, provide exact scheduling information for specific
+;; sfuncs, if that should prove useful.
+
+(define_insn_reservation "sh4_call" 16
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "call,sfunc"))
+ "d_lock*16")
;; LDS.L to PR
;; Group: CO
@@ -10730,8 +10706,9 @@
;; The SX unit is blocked for last 2 cycles.
(define_insn_reservation "ldsmem_to_pr" 3
- (eq_attr "type" "pload")
- "(issue+pcr_addrcalc),(issue+int+pcr_addrcalc),(int+memory+pcr_addrcalc),(int+pcr_addrcalc)")
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "pload"))
+ "d_lock*2")
;; STS from PR
;; Group: CO
@@ -10740,17 +10717,19 @@
;; The SX unit in second and third cycles.
(define_insn_reservation "sts_from_pr" 2
- (eq_attr "type" "prget")
- "(issue+pcr_addrcalc),(pipe_01+int+pcr_addrcalc),(int+pcr_addrcalc),nothing")
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "prget"))
+ "d_lock*2")
;; STS.L from PR
;; Group: CO
;; Latency: 2
;; Issue Rate: 2
-(define_insn_reservation "prload_mem" 2
- (eq_attr "type" "pstore")
- "(issue+pcr_addrcalc),(pipe_01+int+pcr_addrcalc),(int+memory+pcr_addrcalc),memory")
+(define_insn_reservation "sh4_prstore_mem" 2
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "pstore"))
+ "d_lock*2,nothing,memory")
;; LDS to FPSCR
;; Group: CO
@@ -10758,9 +10737,10 @@
;; Issue Rate: 1
;; F1 is blocked for last three cycles.
-(define_insn_reservation "fpscr_store" 4
- (eq_attr "insn_class" "lds_to_fpscr")
- "issue,int,F1*3")
+(define_insn_reservation "fpscr_load" 4
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "gp_fpscr"))
+ "d_lock,nothing,F1*3")
;; LDS.L to FPSCR
;; Group: CO
@@ -10769,9 +10749,10 @@
;; Issue Rate: 1
;; F1 is blocked for last three cycles.
-(define_insn_reservation "fpscr_store_mem" 4
- (eq_attr "insn_class" "ldsmem_to_fpscr")
- "issue,(int+memory),(F1+memory),F1*2")
+(define_insn_reservation "fpscr_load_mem" 4
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "mem_fpscr"))
+ "d_lock,nothing,(F1+memory),F1*2")
;; Fixed point multiplication (DMULS.L DMULU.L MUL.L MULS.W,MULU.W)
@@ -10780,28 +10761,49 @@
;; Issue Rate: 1
(define_insn_reservation "multi" 4
- (eq_attr "type" "smpy,dmpy")
- "issue,(issue+int+f1_1),(int+f1_1),(f1_1|f1_2)*2,F2,FS")
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "smpy,dmpy"))
+ "d_lock,(d_lock+f1_1),(f1_1|f1_2)*3,F2")
+
+;; Fixed STS from MACL / MACH
+;; Group: CO
+;; Latency: 3
+;; Issue Rate: 1
+
+(define_insn_reservation "sh4_mac_gp" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "mac_gp"))
+ "d_lock")
;; Single precision floating point computation FCMP/EQ,
-;; FCP/GT, FADD, FLOAT, FMAC, FMUL, FSUB, FTRC, FRVHG, FSCHG
+;; FCMP/GT, FADD, FLOAT, FMAC, FMUL, FSUB, FTRC, FRVHG, FSCHG
;; Group: FE
-;; Latency: 4
+;; Latency: 3/4
;; Issue Rate: 1
-(define_insn_reservation "fp_arith" 4
- (eq_attr "type" "fp")
- "issue,F1,F2,FS")
+(define_insn_reservation "fp_arith" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "fp"))
+ "issue,F01,F2")
+
+(define_insn_reservation "fp_arith_ftrc" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "ftrc_s"))
+ "issue,F01,F2")
+
+(define_bypass 1 "fp_arith_ftrc" "sh4_fpul_gp")
;; Single Precision FDIV/SQRT
;; Group: FE
-;; Latency: 12/13
+;; Latency: 12/13 (FDIV); 11/12 (FSQRT)
;; Issue Rate: 1
+;; We describe fdiv here; fsqrt is actually one cycle faster.
-(define_insn_reservation "fp_div" 13
- (eq_attr "type" "fdiv")
- "issue,F1+F3,F1+F2+F3,F3*7,F1+F3,F2,FS")
+(define_insn_reservation "fp_div" 12
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "fdiv"))
+ "issue,F01+F3,F2+F3,F3*7,F1+F3,F2")
;; Double Precision floating point computation
;; (FCNVDS, FCNVSD, FLOAT, FTRC)
@@ -10809,34 +10811,51 @@
;; Latency: (3,4)/5
;; Issue Rate: 1
-(define_insn_reservation "dp_float" 5
- (eq_attr "type" "dfp_conv")
- "issue,F1,F1+F2,F2+FS,FS")
+(define_insn_reservation "dp_float" 4
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "dfp_conv"))
+ "issue,F01,F1+F2,F2")
-;; Double-precision floating-point (FADD ,FMUL,FSUB)
+;; Double-precision floating-point (FADD,FMUL,FSUB)
;; Group: FE
;; Latency: (7,8)/9
;; Issue Rate: 1
-(define_insn_reservation "fp_double_arith" 9
- (eq_attr "type" "dfp_arith")
- "issue,F1,F1+F2,fpu*4,F2+FS,FS")
+(define_insn_reservation "fp_double_arith" 8
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "dfp_arith"))
+ "issue,F01,F1+F2,fpu*4,F2")
;; Double-precision FCMP (FCMP/EQ,FCMP/GT)
-;; Group: FE
+;; Group: CO
;; Latency: 3/5
;; Issue Rate: 2
-(define_insn_reservation "fp_double_cmp" 5
- (eq_attr "type" "dfp_cmp")
- "issue,(issue+F1),F1+F2,F2+FS,FS")
+(define_insn_reservation "fp_double_cmp" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "dfp_cmp"))
+ "d_lock,(d_lock+F01),F1+F2,F2")
;; Double precision FDIV/SQRT
;; Group: FE
;; Latency: (24,25)/26
;; Issue Rate: 1
-(define_insn_reservation "dp_div" 26
- (eq_attr "type" "dfdiv")
- "issue,F1+F3,F1+F2+F3,F2+F3+FS,F3*16,F1+F3,F1+F2+F3,fpu+F3,F2+FS,FS")
+(define_insn_reservation "dp_div" 25
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "dfdiv"))
+ "issue,F01+F3,F1+F2+F3,F2+F3,F3*16,F1+F3,(fpu+F3)*2,F2")
+
+;; Use the branch-not-taken case to model arith3 insns. For the branch taken
+;; case, we'd get a d_lock instead of issue at the end.
+(define_insn_reservation "arith3" 3
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "arith3"))
+ "issue,d_lock+pcr_addrcalc,issue")
+
+;; arith3b insns schedule the same no matter if the branch is taken or not.
+(define_insn_reservation "arith3b" 2
+ (and (eq_attr "pipe_model" "sh4")
+ (eq_attr "type" "arith3"))
+ "issue,d_lock+pcr_addrcalc")
diff --git a/gcc/config/sparc/cypress.md b/gcc/config/sparc/cypress.md
index f871b1e0030..e9bff6d77a7 100644
--- a/gcc/config/sparc/cypress.md
+++ b/gcc/config/sparc/cypress.md
@@ -1,4 +1,4 @@
-;; Scheduling description for Sparc Cypress.
+;; Scheduling description for SPARC Cypress.
;; Copyright (C) 2002 Free Software Foundation, Inc.
;;
;; This file is part of GNU CC.
diff --git a/gcc/config/sparc/freebsd.h b/gcc/config/sparc/freebsd.h
index e966090eafb..00a8b3d3d5c 100644
--- a/gcc/config/sparc/freebsd.h
+++ b/gcc/config/sparc/freebsd.h
@@ -1,4 +1,4 @@
-/* Definitions for Sun Sparc64 running FreeBSD using the ELF format
+/* Definitions for Sun SPARC64 running FreeBSD using the ELF format
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Contributed by David E. O'Brien <obrien@FreeBSD.org> and BSDi.
@@ -54,7 +54,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define WCHAR_TYPE_SIZE 32
/* Define for support of TFmode long double.
- Sparc ABI says that long double is 4 words. */
+ SPARC ABI says that long double is 4 words. */
#undef LONG_DOUBLE_TYPE_SIZE
#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64)
@@ -103,14 +103,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define LOCAL_LABEL_PREFIX "."
/* XXX2 */
-/* 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)
-
-/* XXX2 */
/* 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. */
diff --git a/gcc/config/sparc/gmon-sol2.c b/gcc/config/sparc/gmon-sol2.c
index bcb0c060358..c5776661eea 100644
--- a/gcc/config/sparc/gmon-sol2.c
+++ b/gcc/config/sparc/gmon-sol2.c
@@ -28,7 +28,7 @@
* SUCH DAMAGE.
*/
-/* Mangled into a form that works on Sparc Solaris 2 by Mark Eichin
+/* Mangled into a form that works on SPARC Solaris 2 by Mark Eichin
* for Cygnus Support, July 1992.
*/
@@ -232,7 +232,7 @@ _mcleanup()
}
/*
- * The Sparc stack frame is only held together by the frame pointers
+ * The SPARC stack frame is only held together by the frame pointers
* in the register windows. According to the SVR4 SPARC ABI
* Supplement, Low Level System Information/Operating System
* Interface/Software Trap Types, a type 3 trap will flush all of the
diff --git a/gcc/config/sparc/hypersparc.md b/gcc/config/sparc/hypersparc.md
index 741f163234e..d80e51e9848 100644
--- a/gcc/config/sparc/hypersparc.md
+++ b/gcc/config/sparc/hypersparc.md
@@ -1,4 +1,4 @@
-;; Scheduling description for HyperSparc.
+;; Scheduling description for HyperSPARC.
;; Copyright (C) 2002 Free Software Foundation, Inc.
;;
;; This file is part of GNU CC.
@@ -18,7 +18,7 @@
;; the Free Software Foundation, 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-;; The HyperSparc is a dual-issue processor. It is not all that fancy.
+;; The HyperSPARC is a dual-issue processor. It is not all that fancy.
;; ??? There are some things not modelled. For example, sethi+or
;; ??? coming right after each other are specifically identified and
diff --git a/gcc/config/sparc/lb1spc.asm b/gcc/config/sparc/lb1spc.asm
index b31f82c8122..b60bd5740e7 100644
--- a/gcc/config/sparc/lb1spc.asm
+++ b/gcc/config/sparc/lb1spc.asm
@@ -1,7 +1,7 @@
/* This is an assembly language implementation of mulsi3, divsi3, and modsi3
for the sparc processor.
- These routines are derived from the Sparc Architecture Manual, version 8,
+ These routines are derived from the SPARC Architecture Manual, version 8,
slightly edited to match the desired calling convention, and also to
optimize them for our purposes. */
@@ -81,7 +81,7 @@ mul_shortway:
#ifdef L_divsi3
/*
- * Division and remainder, from Appendix E of the Sparc Version 8
+ * Division and remainder, from Appendix E of the SPARC Version 8
* Architecture Manual, with fixes from Gordon Irlam.
*/
@@ -197,7 +197,7 @@ ready_to_divide:
nop
be do_single_div
nop
- /* NB: these are commented out in the V8-Sparc manual as well */
+ /* NB: these are commented out in the V8-SPARC manual as well */
/* (I do not understand this) */
! %o5 > %o3: went too far: back up 1 step
! srl %o5, 1, %o5
@@ -544,7 +544,7 @@ divide:
nop
be do_single_div
nop
- /* NB: these are commented out in the V8-Sparc manual as well */
+ /* NB: these are commented out in the V8-SPARC manual as well */
/* (I do not understand this) */
! %o5 > %o3: went too far: back up 1 step
! srl %o5, 1, %o5
diff --git a/gcc/config/sparc/lb1spl.asm b/gcc/config/sparc/lb1spl.asm
index 9dda6755fb7..973401f8018 100644
--- a/gcc/config/sparc/lb1spl.asm
+++ b/gcc/config/sparc/lb1spl.asm
@@ -1,7 +1,7 @@
/* This is an assembly language implementation of mulsi3, divsi3, and modsi3
for the sparclite processor.
- These routines are all from the Sparclite User's Guide, slightly edited
+ These routines are all from the SPARClite User's Guide, slightly edited
to match the desired calling convention, and also to optimize them. */
#ifdef L_udivsi3
diff --git a/gcc/config/sparc/linux.h b/gcc/config/sparc/linux.h
index dc4b50a6445..28b26cacf73 100644
--- a/gcc/config/sparc/linux.h
+++ b/gcc/config/sparc/linux.h
@@ -206,13 +206,6 @@ do { \
#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. */
@@ -231,7 +224,7 @@ do { \
/* Define for support of TFmode long double.
- Sparc ABI says that long double is 4 words. */
+ SPARC ABI says that long double is 4 words. */
#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64)
/* Constant which presents upper bound of the above value. */
diff --git a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h
index d29f6aa597d..d55d738b187 100644
--- a/gcc/config/sparc/linux64.h
+++ b/gcc/config/sparc/linux64.h
@@ -1,5 +1,5 @@
/* Definitions for 64-bit SPARC running Linux-based GNU systems with ELF.
- Copyright 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+ Copyright 1996, 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
Contributed by David S. Miller (davem@caip.rutgers.edu)
This file is part of GNU CC.
@@ -55,38 +55,11 @@ Boston, MA 02111-1307, USA. */
#undef STARTFILE_SPEC
-#define STARTFILE_SPEC32 \
- "%{!shared: \
- %{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}\
+#define STARTFILE_SPEC \
+ "%{!shared:%{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
+ crti.o%s %{static:crtbeginT.o%s}\
%{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
-#define STARTFILE_SPEC64 \
- "%{!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 %{static:crtbeginT.o%s}\
- %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
-
-#ifdef SPARC_BI_ARCH
-
-#if DEFAULT_ARCH32_P
-#define STARTFILE_SPEC "\
-%{m32:" STARTFILE_SPEC32 "} \
-%{m64:" STARTFILE_SPEC64 "} \
-%{!m32:%{!m64:" STARTFILE_SPEC32 "}}"
-#else
-#define STARTFILE_SPEC "\
-%{m32:" STARTFILE_SPEC32 "} \
-%{m64:" STARTFILE_SPEC64 "} \
-%{!m32:%{!m64:" STARTFILE_SPEC64 "}}"
-#endif
-
-#else
-
-#define STARTFILE_SPEC STARTFILE_SPEC64
-
-#endif
-
/* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on
the GNU/Linux magical crtend.o file (see crtstuff.c) which
provides part of the support for getting C++ file-scope static
@@ -95,36 +68,9 @@ Boston, MA 02111-1307, USA. */
#undef ENDFILE_SPEC
-#define ENDFILE_SPEC32 \
- "%{!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 "}} " \
-ENDFILE_SPEC_COMMON
-#else
-#define ENDFILE_SPEC "\
-%{m32:" ENDFILE_SPEC32 "} \
-%{m64:" ENDFILE_SPEC64 "} \
-%{!m32:%{!m64:" ENDFILE_SPEC64 "}} " \
-ENDFILE_SPEC_COMMON
-#endif
-
-#else
-
-#define ENDFILE_SPEC ENDFILE_SPEC64 " " ENDFILE_SPEC_COMMON
-
-#endif
+#define ENDFILE_SPEC \
+ "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s\
+ %{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}"
/* The GNU C++ standard library requires that these macros be defined. */
#undef CPLUSPLUS_CPP_SPEC
@@ -149,7 +95,7 @@ ENDFILE_SPEC_COMMON
#define WCHAR_TYPE_SIZE 32
/* Define for support of TFmode long double.
- Sparc ABI says that long double is 4 words. */
+ SPARC ABI says that long double is 4 words. */
#undef LONG_DOUBLE_TYPE_SIZE
#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64)
@@ -311,11 +257,9 @@ ENDFILE_SPEC_COMMON
/* System V Release 4 uses DWARF debugging info. Buf DWARF1 doesn't do
64-bit anything, so we use DWARF2. */
-#undef DWARF2_DEBUGGING_INFO
#undef DWARF_DEBUGGING_INFO
-#undef DBX_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
-#define DBX_DEBUGGING_INFO
+#define DWARF2_DEBUGGING_INFO 1
+#define DBX_DEBUGGING_INFO 1
#undef ASM_OUTPUT_ALIGNED_LOCAL
#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
@@ -332,13 +276,6 @@ do { \
#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. */
@@ -380,7 +317,7 @@ do { \
/* Handle multilib correctly. */
#if defined(__arch64__)
-/* 64-bit Sparc version */
+/* 64-bit SPARC version */
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
do { \
unsigned int *pc_ = (CONTEXT)->ra; \
@@ -431,7 +368,7 @@ do { \
goto SUCCESS; \
} while (0)
#else
-/* 32-bit Sparc version */
+/* 32-bit SPARC version */
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
do { \
unsigned int *pc_ = (CONTEXT)->ra; \
diff --git a/gcc/config/sparc/liteelf.h b/gcc/config/sparc/liteelf.h
index 5c93c2d943a..9b6cbaa93ff 100644
--- a/gcc/config/sparc/liteelf.h
+++ b/gcc/config/sparc/liteelf.h
@@ -24,10 +24,8 @@ Boston, MA 02111-1307, USA. */
/* Default to dwarf2 in ELF. */
-#undef DWARF_DEBUGGING_INFO
-#define DWARF_DEBUGGING_INFO
-#undef DWARF2_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DWARF_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
diff --git a/gcc/config/sparc/lynx.h b/gcc/config/sparc/lynx.h
index db72a923476..805f65f34e3 100644
--- a/gcc/config/sparc/lynx.h
+++ b/gcc/config/sparc/lynx.h
@@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA. */
#undef LINK_SPEC
-/* Sparc version of libc.a has references to libm.a (printf calls pow for
+/* SPARC version of libc.a has references to libm.a (printf calls pow for
instance), so we must always link both. */
#undef LIB_SPEC
diff --git a/gcc/config/sparc/netbsd-elf.h b/gcc/config/sparc/netbsd-elf.h
index eaa801cf598..7e0d70d9e79 100644
--- a/gcc/config/sparc/netbsd-elf.h
+++ b/gcc/config/sparc/netbsd-elf.h
@@ -69,13 +69,6 @@ Boston, MA 02111-1307, USA. */
#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. */
@@ -102,6 +95,9 @@ Boston, MA 02111-1307, USA. */
#undef STDC_0_IN_SYSTEM_HEADERS
+/* Attempt to enable execute permissions on the stack. */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);
diff --git a/gcc/config/sparc/netbsd.h b/gcc/config/sparc/netbsd.h
index 8ae4c566349..284e288d5e4 100644
--- a/gcc/config/sparc/netbsd.h
+++ b/gcc/config/sparc/netbsd.h
@@ -29,7 +29,7 @@
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* This is the char to use for continuation (in case we need to turn
continuation back on). */
@@ -44,3 +44,6 @@
/* Until they use ELF or something that handles dwarf2 unwinds
and initialization stuff better. */
#define DWARF2_UNWIND_INFO 0
+
+/* Attempt to enable execute permissions on the stack. */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
diff --git a/gcc/config/sparc/openbsd.h b/gcc/config/sparc/openbsd.h
index dc3728453e5..a4333df79ab 100644
--- a/gcc/config/sparc/openbsd.h
+++ b/gcc/config/sparc/openbsd.h
@@ -1,5 +1,5 @@
/* Configuration file for sparc OpenBSD target.
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -43,7 +43,7 @@ Boston, MA 02111-1307, USA. */
/* Specific options for DBX Output. */
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* This is the char to use for continuation */
#define DBX_CONTIN_CHAR '?'
@@ -63,5 +63,3 @@ Boston, MA 02111-1307, USA. */
#define DWARF2_UNWIND_INFO 0
#undef ASM_PREFERRED_EH_DATA_FORMAT
-
-/* Default sparc.h does already define ASM_OUTPUT_MI_THUNK */
diff --git a/gcc/config/sparc/pbd.h b/gcc/config/sparc/pbd.h
index 18391abed9a..dd47b368828 100644
--- a/gcc/config/sparc/pbd.h
+++ b/gcc/config/sparc/pbd.h
@@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */
/* We want DBX format for use with gdb under COFF. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Generate calls to memcpy, memcmp and memset. */
@@ -116,18 +116,9 @@ Boston, MA 02111-1307, USA. */
This is suitable for output with `assemble_name'. */
#undef ASM_GENERATE_INTERNAL_LABEL
-
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf (LABEL, "*.%s%ld", PREFIX, (long)(NUM))
-
-/* This is how to output 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, ".%s%d:\n", PREFIX, NUM)
-
/* This is how to output an element of a case-vector that is relative. */
#undef ASM_OUTPUT_ADDR_DIFF_ELT
diff --git a/gcc/config/sparc/sol2-bi.h b/gcc/config/sparc/sol2-bi.h
index 1ba52606aa3..3f9416daaa0 100644
--- a/gcc/config/sparc/sol2-bi.h
+++ b/gcc/config/sparc/sol2-bi.h
@@ -57,24 +57,6 @@
%{!mcpu*:%(asm_cpu_default)} \
"
-#define STARTFILE_ARCH64_SPEC "\
-%{ansi:/usr/lib/sparcv9/values-Xc.o%s} \
-%{!ansi:/usr/lib/sparcv9/values-Xa.o%s}"
-
-#undef STARTFILE_ARCH_SPEC
-
-#if DEFAULT_ARCH32_P
-#define STARTFILE_ARCH_SPEC "\
-%{m32:" STARTFILE_ARCH32_SPEC "} \
-%{m64:" STARTFILE_ARCH64_SPEC "} \
-%{!m32:%{!m64:" STARTFILE_ARCH32_SPEC "}}"
-#else
-#define STARTFILE_ARCH_SPEC "\
-%{m32:" STARTFILE_ARCH32_SPEC "} \
-%{m64:" STARTFILE_ARCH64_SPEC "} \
-%{!m32:%{!m64:" STARTFILE_ARCH64_SPEC "}}"
-#endif
-
#undef CPP_CPU_DEFAULT_SPEC
#define CPP_CPU_DEFAULT_SPEC \
(DEFAULT_ARCH32_P ? "\
diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h
index e343e3e9535..ba0243ceee2 100644
--- a/gcc/config/sparc/sol2.h
+++ b/gcc/config/sparc/sol2.h
@@ -68,13 +68,6 @@ Boston, MA 02111-1307, USA. */
#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. */
@@ -112,7 +105,7 @@ Boston, MA 02111-1307, USA. */
/* ??? This does not work in SunOS 4.x, so it is not enabled in sparc.h.
Instead, it is enabled here, because it does work under Solaris. */
/* Define for support of TFmode long double.
- Sparc ABI says that long double is 4 words. */
+ SPARC ABI says that long double is 4 words. */
#define LONG_DOUBLE_TYPE_SIZE 128
/* But indicate that it isn't supported by the hardware. */
diff --git a/gcc/config/sparc/sp64-elf.h b/gcc/config/sparc/sp64-elf.h
index caf944b33ff..18187dc64fd 100644
--- a/gcc/config/sparc/sp64-elf.h
+++ b/gcc/config/sparc/sp64-elf.h
@@ -112,7 +112,7 @@ crtbegin.o%s \
GDB doesn't support 64 bit stabs yet and the desired debug format is DWARF
anyway so it is the default. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
diff --git a/gcc/config/sparc/sp86x-elf.h b/gcc/config/sparc/sp86x-elf.h
index 42239a945e1..cb7e8c3f203 100644
--- a/gcc/config/sparc/sp86x-elf.h
+++ b/gcc/config/sparc/sp86x-elf.h
@@ -24,10 +24,8 @@ Boston, MA 02111-1307, USA. */
/* Default to dwarf2 in ELF. */
-#undef DWARF_DEBUGGING_INFO
-#define DWARF_DEBUGGING_INFO
-#undef DWARF2_DEBUGGING_INFO
-#define DWARF2_DEBUGGING_INFO
+#define DWARF_DEBUGGING_INFO 1
+#define DWARF2_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
diff --git a/gcc/config/sparc/sparc-modes.def b/gcc/config/sparc/sparc-modes.def
index e3017552112..3ebf9c8660d 100644
--- a/gcc/config/sparc/sparc-modes.def
+++ b/gcc/config/sparc/sparc-modes.def
@@ -23,7 +23,7 @@ Boston, MA 02111-1307, USA. */
/* Add any extra modes needed to represent the condition code.
- On the Sparc, we have a "no-overflow" mode which is used when an add or
+ On the SPARC, we have a "no-overflow" mode which is used when an add or
subtract insn is used to set the condition code. Different branches are
used in this case for some operations.
diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h
index fc814a8fdbb..0aa6e58f7da 100644
--- a/gcc/config/sparc/sparc-protos.h
+++ b/gcc/config/sparc/sparc-protos.h
@@ -123,6 +123,4 @@ extern int sparc_extra_constraint_check PARAMS ((rtx, int, int));
extern int sparc_rtx_costs PARAMS ((rtx, enum rtx_code, enum rtx_code));
#endif /* RTX_CODE */
-extern void sparc_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
-
#endif /* __SPARC_PROTOS_H__ */
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 971b6f2e5f7..d113ff78718 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -176,6 +176,8 @@ static void emit_soft_tfmode_cvt PARAMS ((enum rtx_code, rtx *));
static void emit_hard_tfmode_operation PARAMS ((enum rtx_code, rtx *));
static void sparc_encode_section_info PARAMS ((tree, int));
+static bool sparc_function_ok_for_sibcall PARAMS ((tree, tree));
+static void sparc_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
/* Option handling. */
@@ -239,6 +241,12 @@ enum processor_type sparc_cpu;
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO sparc_encode_section_info
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
+
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Validate and override various options, and do some machine dependent
@@ -455,7 +463,7 @@ v9_regcmp_p (code)
/* Operand constraints. */
-/* Return non-zero only if OP is a register of mode MODE,
+/* Return nonzero only if OP is a register of mode MODE,
or const0_rtx. */
int
@@ -476,7 +484,7 @@ reg_or_0_operand (op, mode)
return 0;
}
-/* Return non-zero only if OP is const1_rtx. */
+/* Return nonzero only if OP is const1_rtx. */
int
const1_operand (op, mode)
@@ -1410,7 +1418,7 @@ sparc_emit_set_const32 (op0, op1)
}
-/* Sparc-v9 code-model support. */
+/* SPARC-v9 code-model support. */
void
sparc_emit_set_symbolic_const64 (op0, op1, temp1)
rtx op0;
@@ -3074,7 +3082,7 @@ short_branch (uid1, uid2)
return 0;
}
-/* Return non-zero if REG is not used after INSN.
+/* Return nonzero if REG is not used after INSN.
We assume REG is a reload reg, and therefore does
not live past labels or calls or jumps. */
int
@@ -3158,7 +3166,7 @@ pic_address_needs_scratch (x)
/* Legitimize PIC addresses. If the address is already position-independent,
we return ORIG. Newly generated position-independent addresses go into a
- reg. This is REG if non zero, otherwise we allocate register(s) as
+ reg. This is REG if nonzero, otherwise we allocate register(s) as
necessary. */
rtx
@@ -3287,7 +3295,7 @@ load_pic_register ()
align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
if (align > 0)
ASM_OUTPUT_ALIGN (asm_out_file, align);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LGETPC", 0);
+ (*targetm.asm_out.internal_label) (asm_out_file, "LGETPC", 0);
fputs ("\tretl\n\tadd\t%o7, %l7, %l7\n", asm_out_file);
}
@@ -4757,7 +4765,7 @@ function_arg_record_value_2 (type, startbitpos, parms)
}
/* Used by function_arg and function_value to implement the complex
- Sparc64 structure calling conventions. */
+ SPARC64 structure calling conventions. */
static rtx
function_arg_record_value (type, mode, slotno, named, regbase)
@@ -5347,7 +5355,8 @@ sparc_va_arg (valist, type)
PUT_MODE (tmp, BLKmode);
set_mem_alias_set (tmp, 0);
- dest_addr = emit_block_move (tmp, addr_rtx, GEN_INT (rsize));
+ dest_addr = emit_block_move (tmp, addr_rtx, GEN_INT (rsize),
+ BLOCK_OP_NORMAL);
if (dest_addr != NULL_RTX)
addr_rtx = dest_addr;
else
@@ -5369,11 +5378,11 @@ sparc_va_arg (valist, type)
XEXP (OP, 0) is assumed to be a condition code register (integer or
floating point) and its mode specifies what kind of comparison we made.
- REVERSED is non-zero if we should reverse the sense of the comparison.
+ REVERSED is nonzero if we should reverse the sense of the comparison.
- ANNUL is non-zero if we should generate an annulling branch.
+ ANNUL is nonzero if we should generate an annulling branch.
- NOOP is non-zero if we have to follow this branch by a noop.
+ NOOP is nonzero if we have to follow this branch by a noop.
INSN, if set, is the insn. */
@@ -5802,11 +5811,11 @@ sparc_emit_floatunsdi (operands)
operand number of the reg. OP is the conditional expression. The mode
of REG says what kind of comparison we made.
- REVERSED is non-zero if we should reverse the sense of the comparison.
+ REVERSED is nonzero if we should reverse the sense of the comparison.
- ANNUL is non-zero if we should generate an annulling branch.
+ ANNUL is nonzero if we should generate an annulling branch.
- NOOP is non-zero if we have to follow this branch by a noop. */
+ NOOP is nonzero if we have to follow this branch by a noop. */
char *
output_v9branch (op, dest, reg, label, reversed, annul, noop, insn)
@@ -7762,7 +7771,6 @@ set_extends (insn)
return INTVAL (op1) >= 0;
return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
}
- case ASHIFT:
case LSHIFTRT:
return GET_MODE (SET_SRC (pat)) == SImode;
/* Positive integers leave the high bits zero. */
@@ -7812,7 +7820,7 @@ sparc_output_addr_vec (vec)
ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
NEXT_INSN (lab));
#else
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
+ (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
#endif
for (idx = 0; idx < vlen; idx++)
@@ -7842,7 +7850,7 @@ sparc_output_addr_diff_vec (vec)
ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
NEXT_INSN (lab));
#else
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
+ (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
#endif
for (idx = 0; idx < vlen; idx++)
@@ -8021,6 +8029,32 @@ sparc_elf_asm_named_section (name, flags)
}
#endif /* OBJECT_FORMAT_ELF */
+/* We do not allow sibling calls if -mflat, nor
+ 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. */
+static bool
+sparc_function_ok_for_sibcall (decl, exp)
+ tree decl;
+ tree exp ATTRIBUTE_UNUSED;
+{
+ return (decl
+ && ! TARGET_FLAT
+ && (TARGET_ARCH64 || ! current_function_returns_struct));
+}
+
/* ??? Similar to the standard section selection, but force reloc-y-ness
if SUNOS4_SHARED_LIBRARIES. Unclear why this helps (as opposed to
pretending PIC always on), but that's what the old code did. */
@@ -8448,7 +8482,7 @@ sparc_encode_section_info (decl, first)
/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
Used for C++ multiple inheritance. */
-void
+static void
sparc_output_mi_thunk (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl ATTRIBUTE_UNUSED;
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 5c4c9653b13..161d65873a9 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -323,9 +323,11 @@ Unrecognized value in TARGET_CPU_DEFAULT.
/* Special flags to the Sun-4 assembler when using pipe for input. */
#define ASM_SPEC "\
-%| %{R} %{!pg:%{!p:%{fpic:-k} %{fPIC:-k}}} %{keep-local-as-symbols:-L} \
+%{R} %{!pg:%{!p:%{fpic:-k} %{fPIC:-k}}} %{keep-local-as-symbols:-L} \
%(asm_cpu) %(asm_relax)"
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
+
/* This macro defines names of additional specifications to put in the specs
that can be used in various specifications like CC1_SPEC. Its definition
is an initializer with a subgrouping for each command option.
@@ -375,7 +377,7 @@ Unrecognized value in TARGET_CPU_DEFAULT.
/* Generate DBX debugging information. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Run-time compilation parameters selecting different hardware subsets. */
@@ -411,7 +413,7 @@ extern int target_flags;
#define MASK_V9 0x40
#define TARGET_V9 (target_flags & MASK_V9)
-/* Non-zero to generate code that uses the instructions deprecated in
+/* Nonzero to generate code that uses the instructions deprecated in
the v9 architecture. This option only applies to v9 systems. */
/* ??? This isn't user selectable yet. It's used to enable such insns
on 32 bit v9 systems and for the moment they're permanently disabled
@@ -423,7 +425,7 @@ extern int target_flags;
#define MASK_ISA \
(MASK_V8 + MASK_SPARCLITE + MASK_SPARCLET + MASK_V9 + MASK_DEPRECATED_V8_INSNS)
-/* Non-zero means don't pass `-assert pure-text' to the linker. */
+/* Nonzero means don't pass `-assert pure-text' to the linker. */
#define MASK_IMPURE_TEXT 0x100
#define TARGET_IMPURE_TEXT (target_flags & MASK_IMPURE_TEXT)
@@ -434,7 +436,7 @@ extern int target_flags;
#define MASK_FLAT 0x200
#define TARGET_FLAT (target_flags & MASK_FLAT)
-/* Nonzero means use the registers that the Sparc ABI reserves for
+/* Nonzero means use the registers that the SPARC ABI reserves for
application software. This must be the default to coincide with the
setting in FIXED_REGISTERS. */
#define MASK_APP_REGS 0x400
@@ -446,7 +448,7 @@ extern int target_flags;
#define MASK_HARD_QUAD 0x800
#define TARGET_HARD_QUAD (target_flags & MASK_HARD_QUAD)
-/* Non-zero on little-endian machines. */
+/* Nonzero on little-endian machines. */
/* ??? Little endian support currently only exists for sparclet-aout and
sparc64-elf configurations. May eventually want to expand the support
to all targets, but for now it's kept local to only those two. */
@@ -467,14 +469,14 @@ extern int target_flags;
/* 0x20000,0x40000 unused */
-/* Non-zero means use a stack bias of 2047. Stack offsets are obtained by
+/* Nonzero means use a stack bias of 2047. Stack offsets are obtained by
adding 2047 to %sp. This option is for v9 only and is the default. */
#define MASK_STACK_BIAS 0x80000
#define TARGET_STACK_BIAS (target_flags & MASK_STACK_BIAS)
/* 0x100000,0x200000 unused */
-/* Non-zero means -m{,no-}fpu was passed on the command line. */
+/* Nonzero means -m{,no-}fpu was passed on the command line. */
#define MASK_FPU_SET 0x400000
#define TARGET_FPU_SET (target_flags & MASK_FPU_SET)
@@ -560,15 +562,15 @@ extern int target_flags;
{"cypress", 0, \
N_("Optimize for Cypress processors") }, \
{"sparclite", 0, \
- N_("Optimize for SparcLite processors") }, \
+ N_("Optimize for SPARCLite processors") }, \
{"f930", 0, \
N_("Optimize for F930 processors") }, \
{"f934", 0, \
N_("Optimize for F934 processors") }, \
{"v8", 0, \
- N_("Use V8 Sparc ISA") }, \
+ N_("Use V8 SPARC ISA") }, \
{"supersparc", 0, \
- N_("Optimize for SuperSparc processors") }, \
+ N_("Optimize for SuperSPARC processors") }, \
/* End of deprecated options. */ \
{"ptr64", MASK_PTR64, \
N_("Pointers are 64-bit") }, \
@@ -634,7 +636,7 @@ extern enum processor_type sparc_cpu;
{ "tune=", &sparc_select[2].string, \
N_("Schedule code for given CPU") }, \
{ "cmodel=", &sparc_cmodel_string, \
- N_("Use given Sparc code model") }, \
+ N_("Use given SPARC code model") }, \
SUBTARGET_OPTIONS \
}
@@ -700,7 +702,7 @@ extern struct sparc_cpu_select sparc_select[];
/* ??? This does not work in SunOS 4.x, so it is not enabled here.
Instead, it is enabled in sol2.h, because it does work under Solaris. */
/* Define for support of TFmode long double.
- Sparc ABI says that long double is 4 words. */
+ SPARC ABI says that long double is 4 words. */
#define LONG_DOUBLE_TYPE_SIZE 128
#endif
@@ -771,7 +773,7 @@ if (TARGET_ARCH64 \
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* No data type wants to be aligned rounder than this. */
@@ -948,7 +950,7 @@ do \
call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
} \
/* If the user has passed -f{fixed,call-{used,saved}}-g5 */ \
- /* then honour it. */ \
+ /* then honor it. */ \
if (TARGET_ARCH32 && fixed_regs[5]) \
fixed_regs[5] = 1; \
else if (TARGET_ARCH64 && fixed_regs[5] == 2) \
@@ -973,7 +975,7 @@ do \
fixed_regs[regno] = 1; \
} \
/* If the user has passed -f{fixed,call-{used,saved}}-g2 */ \
- /* then honour it. Likewise with g3 and g4. */ \
+ /* then honor it. Likewise with g3 and g4. */ \
if (fixed_regs[2] == 2) \
fixed_regs[2] = ! TARGET_APP_REGS; \
if (fixed_regs[3] == 2) \
@@ -1118,7 +1120,7 @@ extern int sparc_mode_class[];
#define DEFAULT_PCC_STRUCT_RETURN -1
-/* Sparc ABI says that quad-precision floats and all structures are returned
+/* SPARC ABI says that quad-precision floats and all structures are returned
in memory.
For v9: unions <= 32 bytes in size are returned in int regs,
structures up to 32 bytes are returned in int and fp regs. */
@@ -1723,8 +1725,8 @@ extern char leaf_reg_remap[];
struct sparc_args {
int words; /* number of words passed so far */
- int prototype_p; /* non-zero if a prototype is present */
- int libcall_p; /* non-zero if a library call */
+ int prototype_p; /* nonzero if a prototype is present */
+ int libcall_p; /* nonzero if a library call */
};
#define CUMULATIVE_ARGS struct sparc_args
@@ -1817,7 +1819,7 @@ extern GTY(()) rtx sparc_compare_op1;
/* Generate the special assembly code needed to tell the assembler whatever
it might need to know about the return value of a function.
- For Sparc assemblers, we need to output a .proc pseudo-op which conveys
+ For SPARC assemblers, we need to output a .proc pseudo-op which conveys
information to the assembler relating to peephole optimization (done in
the assembler). */
@@ -1932,27 +1934,6 @@ 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.
-
- 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. */
#define SETUP_FRAME_ADDRESSES() \
@@ -2047,12 +2028,6 @@ do { \
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT 0 */
-/* #define HAVE_POST_DECREMENT 0 */
-
-/* #define HAVE_PRE_DECREMENT 0 */
-/* #define HAVE_PRE_INCREMENT 0 */
-
/* Macros to check register numbers against specific register classes. */
/* These assume that REGNO is a hard or pseudo reg number.
@@ -2373,7 +2348,7 @@ do { \
operand. If we find one, push the reload and jump to WIN. This
macro is used in only one place: `find_reloads_address' in reload.c.
- For Sparc 32, we wish to handle addresses by splitting them into
+ For SPARC 32, we wish to handle addresses by splitting them into
HIGH+LO_SUM pairs, retaining the LO_SUM in the memory reference.
This cuts the number of extra insns by one.
@@ -2493,8 +2468,8 @@ do { \
processing is needed. */
#define SELECT_CC_MODE(OP,X,Y) select_cc_mode ((OP), (X), (Y))
-/* Return non-zero if MODE implies a floating point inequality can be
- reversed. For Sparc this is always true because we have a full
+/* Return nonzero if MODE implies a floating point inequality can be
+ reversed. For SPARC this is always true because we have a full
compliment of ordered and unordered comparisons, but until generic
code knows how to reverse it correctly we keep the old definition. */
#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode && (MODE) != CCFPmode)
@@ -2736,12 +2711,6 @@ case LABEL_REF: case SYMBOL_REF: case CONST_DOUBLE:
#define USER_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. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", 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.
@@ -2812,6 +2781,13 @@ do { \
if ((LOG) != 0) \
fprintf (FILE, "\t.align %d\n", (1<<(LOG)))
+/* This is how to output an assembler line that says to advance
+ the location counter to a multiple of 2**LOG bytes using the
+ "nop" instruction as padding. */
+#define ASM_OUTPUT_ALIGN_WITH_NOP(FILE,LOG) \
+ if ((LOG) != 0) \
+ fprintf (FILE, "\t.align %d,0x1000000\n", (1<<(LOG)))
+
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
fprintf (FILE, "\t.skip %u\n", (SIZE))
@@ -2845,14 +2821,6 @@ do { \
ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \
} while (0)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
#define IDENT_ASM_OP "\t.ident\t"
/* Output #ident as a .ident. */
@@ -2860,11 +2828,6 @@ do { \
#define ASM_OUTPUT_IDENT(FILE, NAME) \
fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
-/* 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) \
- sparc_output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
-
#define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
((CHAR) == '#' || (CHAR) == '*' || (CHAR) == '^' || (CHAR) == '(' || (CHAR) == '_')
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index a7318c9374a..4024290d436 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -1602,7 +1602,7 @@
[(set_attr "type" "branch")
(set_attr "branch_type" "fcc")])
-;; Sparc V9-specific jump insns. None of these are guaranteed to be
+;; SPARC V9-specific jump insns. None of these are guaranteed to be
;; in the architecture.
;; There are no 32 bit brreg insns.
@@ -2048,7 +2048,7 @@
;
})
-;; Be careful, fmovd does not exist when !arch64.
+;; Be careful, fmovd does not exist when !v9.
;; We match MEM moves directly when we have correct even
;; numbered registers, but fall into splits otherwise.
;; The constraint ordering here is really important to
@@ -2062,9 +2062,9 @@
(define_insn "*movdi_insn_sp32_v9"
[(set (match_operand:DI 0 "nonimmediate_operand"
- "=T,o,T,U,o,r,r,r,?T,?f,?f,?o,?f")
+ "=T,o,T,U,o,r,r,r,?T,?f,?f,?o,?f,?e,?e,?W")
(match_operand:DI 1 "input_operand"
- " J,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, e, W, e"))]
"! TARGET_ARCH64 && TARGET_V9
&& (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
"@
@@ -2080,9 +2080,13 @@
ldd\t%1, %0
#
#
- #"
- [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
- (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,2")])
+ #
+ fmovd\\t%1, %0
+ ldd\\t%1, %0
+ std\\t%1, %0"
+ [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,*,fpmove,fpload,fpstore")
+ (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,2,*,*,*")
+ (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,*,double,*,*")])
(define_insn "*movdi_insn_sp32"
[(set (match_operand:DI 0 "nonimmediate_operand"
@@ -2202,7 +2206,7 @@
"TARGET_ARCH64 && flag_pic"
"or\t%1, %%lo(%a3-(%a2-.)), %0")
-;; Sparc-v9 code model support insns. See sparc_emit_set_symbolic_const64
+;; SPARC-v9 code model support insns. See sparc_emit_set_symbolic_const64
;; in sparc.c to see what is going on here... PIC stuff comes first.
(define_insn "movdi_lo_sum_pic"
@@ -2388,7 +2392,14 @@
(define_split
[(set (match_operand:DI 0 "register_operand" "")
(match_operand:DI 1 "const_double_operand" ""))]
- "! TARGET_ARCH64 && reload_completed"
+ "reload_completed
+ && (! TARGET_V9
+ || (! TARGET_ARCH64
+ && ((GET_CODE (operands[0]) == REG
+ && REGNO (operands[0]) < 32)
+ || (GET_CODE (operands[0]) == SUBREG
+ && GET_CODE (SUBREG_REG (operands[0])) == REG
+ && REGNO (SUBREG_REG (operands[0])) < 32))))"
[(clobber (const_int 0))]
{
emit_insn (gen_movsi (gen_highpart (SImode, operands[0]),
@@ -3459,10 +3470,10 @@
DONE;
})
-;; Sparc V9 conditional move instructions.
+;; SPARC V9 conditional move instructions.
;; We can handle larger constants here for some flavors, but for now we keep
-;; it simple and only allow those constants supported by all flavours.
+;; it simple and only allow those constants supported by all flavors.
;; Note that emit_conditional_move canonicalizes operands 2,3 so that operand
;; 3 contains the constant if one is present, but we handle either for
;; generality (sparc.c puts a constant in operand 2).
@@ -7216,14 +7227,14 @@
[(set_attr "type" "shift")])
;; Unconditional and other jump instructions
-;; On the Sparc, by setting the annul bit on an unconditional branch, the
+;; On the SPARC, by setting the annul bit on an unconditional branch, the
;; following insn is never executed. This saves us a nop. Dbx does not
;; handle such branches though, so we only use them when optimizing.
(define_insn "jump"
[(set (pc) (label_ref (match_operand 0 "" "")))]
""
{
- /* TurboSparc is reported to have problems with
+ /* TurboSPARC is reported to have problems with
with
foo: b,a foo
i.e. an empty loop with the annul bit set. The workaround is to use
@@ -7909,7 +7920,7 @@
;; ??? This should be a define expand, so that the extra instruction have
;; a chance of being optimized away.
-;; Disabled because none of the UltraSparcs implement popc. The HAL R1
+;; Disabled because none of the UltraSPARCs implement popc. The HAL R1
;; does, but no one uses that and we don't have a switch for it.
;
;(define_insn "ffsdi2"
diff --git a/gcc/config/sparc/sparclet.md b/gcc/config/sparc/sparclet.md
index 805bd29f92f..080090c3ead 100644
--- a/gcc/config/sparc/sparclet.md
+++ b/gcc/config/sparc/sparclet.md
@@ -1,4 +1,4 @@
-;; Scheduling description for Sparclet.
+;; Scheduling description for SPARClet.
;; Copyright (C) 2002 Free Software Foundation, Inc.
;;
;; This file is part of GNU CC.
@@ -18,7 +18,7 @@
;; the Free Software Foundation, 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-;; The Sparclet is a single-issue processor.
+;; The SPARClet is a single-issue processor.
(define_automaton "sparclet")
diff --git a/gcc/config/sparc/supersparc.md b/gcc/config/sparc/supersparc.md
index 21eadf492d6..ea328868e60 100644
--- a/gcc/config/sparc/supersparc.md
+++ b/gcc/config/sparc/supersparc.md
@@ -1,4 +1,4 @@
-;; Scheduling description for SuperSparc.
+;; Scheduling description for SuperSPARC.
;; Copyright (C) 2002 Free Software Foundation, Inc.
;;
;; This file is part of GNU CC.
@@ -18,7 +18,7 @@
;; the Free Software Foundation, 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-;; The SuperSparc is a tri-issue, which was considered quite parallel
+;; The SuperSPARC is a tri-issue, which was considered quite parallel
;; at the time it was released. Much like UltraSPARC-I and UltraSPARC-II
;; there are two integer units but only one of them may take shifts.
;;
diff --git a/gcc/config/sparc/sysv4.h b/gcc/config/sparc/sysv4.h
index 666ee621589..0543b46d531 100644
--- a/gcc/config/sparc/sysv4.h
+++ b/gcc/config/sparc/sysv4.h
@@ -1,4 +1,4 @@
-/* Target definitions for GNU compiler for Sparc running System V.4
+/* Target definitions for GNU compiler for SPARC running System V.4
Copyright (C) 1991, 1992, 1995, 1996, 1997, 1998, 2000, 2002
Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com).
@@ -36,7 +36,7 @@ Boston, MA 02111-1307, USA. */
/* Undefined some symbols which are defined in "svr4.h" but which are
appropriate only for typical svr4 systems, but not for the specific
- case of svr4 running on a Sparc. */
+ case of svr4 running on a SPARC. */
#undef INIT_SECTION_ASM_OP
#undef FINI_SECTION_ASM_OP
@@ -49,7 +49,7 @@ Boston, MA 02111-1307, USA. */
#undef SET_ASM_OP /* Has no equivalent. See ASM_OUTPUT_DEF below. */
/* Provide a set of pre-definitions and pre-assertions appropriate for
- the Sparc running svr4. __svr4__ is our extension. */
+ the SPARC running svr4. __svr4__ is our extension. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES \
@@ -68,10 +68,10 @@ Boston, MA 02111-1307, USA. */
"%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
%{fpic:-K PIC} %{fPIC:-K PIC} %(asm_cpu)"
-/* Define the names of various pseudo-op used by the Sparc/svr4 assembler.
+/* Define the names of various pseudo-op used by the SPARC/svr4 assembler.
Note that many of these are different from the typical pseudo-ops used
by most svr4 assemblers. That is probably due to a (misguided?) attempt
- to keep the Sparc/svr4 assembler somewhat compatible with the Sparc/SunOS
+ to keep the SPARC/svr4 assembler somewhat compatible with the SPARC/SunOS
assembler. */
#define STRING_ASM_OP "\t.asciz\t"
@@ -81,19 +81,19 @@ Boston, MA 02111-1307, USA. */
#define POPSECTION_ASM_OP "\t.popsection"
/* This is the format used to print the second operand of a .type pseudo-op
- for the Sparc/svr4 assembler. */
+ for the SPARC/svr4 assembler. */
#define TYPE_OPERAND_FMT "#%s"
/* This is the format used to print a .pushsection pseudo-op (and its operand)
- for the Sparc/svr4 assembler. */
+ for the SPARC/svr4 assembler. */
#define PUSHSECTION_FORMAT "%s\"%s\"\n"
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \
do { ASM_OUTPUT_ALIGN ((FILE), Pmode == SImode ? 2 : 3); \
- ASM_OUTPUT_INTERNAL_LABEL ((FILE), PREFIX, NUM); \
+ (*targetm.asm_out.internal_label) ((FILE), PREFIX, NUM); \
} while (0)
/* This is how to equate one symbol to another symbol. The syntax used is
@@ -108,9 +108,9 @@ do { ASM_OUTPUT_ALIGN ((FILE), Pmode == SImode ? 2 : 3); \
fprintf (FILE, "\n"); \
} while (0)
-/* Define how the Sparc registers should be numbered for Dwarf output.
+/* Define how the SPARC registers should be numbered for Dwarf output.
The numbering provided here should be compatible with the native
- svr4 SDB debugger in the Sparc/svr4 reference port. The numbering
+ svr4 SDB debugger in the SPARC/svr4 reference port. The numbering
is as follows:
Assembly name gcc internal regno Dwarf regno
diff --git a/gcc/config/sparc/t-linux64 b/gcc/config/sparc/t-linux64
index a6486263835..3e3fa4cae7e 100644
--- a/gcc/config/sparc/t-linux64
+++ b/gcc/config/sparc/t-linux64
@@ -1,8 +1,6 @@
-MULTILIB_OPTIONS = m64/m32 mno-app-regs|mcmodel=medany
-MULTILIB_DIRNAMES = 64 32 alt
-MULTILIB_MATCHES = mcmodel?medany=mcmodel?medmid
-MULTILIB_EXCEPTIONS = m32/mno-app-regs* m32/mcmodel=*
-MULTILIB_EXCLUSIONS = m32/!m64/mno-app-regs m32/!m64/mcmodel=medany
+MULTILIB_OPTIONS = m64/m32
+MULTILIB_DIRNAMES = 64 32
+MULTILIB_OSDIRNAMES = ../lib64 ../lib
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
@@ -10,10 +8,12 @@ INSTALL_LIBGCC = install-multilib
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o \
crtfastmath.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
+
+CRTSTUFF_T_CFLAGS = `if test x$$($(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) \
+ -print-multi-os-directory) \
+ = x../lib64; then echo -mcmodel=medany; fi`
diff --git a/gcc/config/sparc/t-netbsd64 b/gcc/config/sparc/t-netbsd64
index 1292b86367f..0fddb0ffe87 100644
--- a/gcc/config/sparc/t-netbsd64
+++ b/gcc/config/sparc/t-netbsd64
@@ -1,6 +1,8 @@
-MULTILIB_OPTIONS = m32/m64
-MULTILIB_DIRNAMES = 32 64
-MULTILIB_MATCHES =
+# Disable multilib fow now, as NetBSD/sparc64 does not ship with
+# a 32-bit environment.
+#MULTILIB_OPTIONS = m32/m64
+#MULTILIB_DIRNAMES = 32 64
+#MULTILIB_MATCHES =
-LIBGCC = stmp-multilib
-INSTALL_LIBGCC = install-multilib
+#LIBGCC = stmp-multilib
+#INSTALL_LIBGCC = install-multilib
diff --git a/gcc/config/sparc/t-sol2-64 b/gcc/config/sparc/t-sol2-64
index 39204d7368f..3c15f0a712a 100644
--- a/gcc/config/sparc/t-sol2-64
+++ b/gcc/config/sparc/t-sol2-64
@@ -1,11 +1,10 @@
MULTILIB_OPTIONS = m32/m64
MULTILIB_DIRNAMES = sparcv7 sparcv9
MULTILIB_MATCHES =
+MULTILIB_OSDIRNAMES = . sparcv9
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o gmon.o crt1.o crti.o crtn.o gcrt1.o \
crtfastmath.o
-
-SHLIB_SLIBDIR_SUFFIXES = sparcv9:/sparcv9 sparcv7:
diff --git a/gcc/config/sparc/ultra1_2.md b/gcc/config/sparc/ultra1_2.md
index 84cbb4b622b..2194be7ad78 100644
--- a/gcc/config/sparc/ultra1_2.md
+++ b/gcc/config/sparc/ultra1_2.md
@@ -206,7 +206,7 @@
"us1_fpm + us1_fp_double + us1_slotany, nothing*3")
;; This is actually in theory dangerous, because it is possible
-;; for the chip to prematurely dispatch the dependant instruction
+;; for the chip to prematurely dispatch the dependent instruction
;; in the G stage, resulting in a 9 cycle stall. However I have never
;; been able to trigger this case myself even with hand written code,
;; so it must require some rare complicated pipeline state.
diff --git a/gcc/config/sparc/vxsim.h b/gcc/config/sparc/vxsim.h
index 09e1f16d894..39b95c9367c 100644
--- a/gcc/config/sparc/vxsim.h
+++ b/gcc/config/sparc/vxsim.h
@@ -74,13 +74,6 @@ do { \
#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. */
@@ -132,5 +125,5 @@ do { \
/* ??? This does not work in SunOS 4.x, so it is not enabled in sparc.h.
Instead, it is enabled here, because it does work under Solaris. */
/* Define for support of TFmode long double.
- Sparc ABI says that long double is 4 words. */
+ SPARC ABI says that long double is 4 words. */
#define LONG_DOUBLE_TYPE_SIZE 64
diff --git a/gcc/config/sparc/vxsparc64.h b/gcc/config/sparc/vxsparc64.h
index 358f2c00087..d37bd54f860 100644
--- a/gcc/config/sparc/vxsparc64.h
+++ b/gcc/config/sparc/vxsparc64.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler.
- 64-bit VxWorks Sparc version.
+ 64-bit VxWorks SPARC version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
diff --git a/gcc/config/stormy16/stormy-abi b/gcc/config/stormy16/stormy-abi
index 8bd2ebd486f..23eaa7b6321 100644
--- a/gcc/config/stormy16/stormy-abi
+++ b/gcc/config/stormy16/stormy-abi
@@ -105,7 +105,7 @@ count-> r2
...
last procedure parameter word
-and initialises 'count' to be the number of bytes of non-variable
+and initializes 'count' to be the number of bytes of non-variable
arguments to the function.
ELF File Format
@@ -149,7 +149,7 @@ the storage unit being relocated.
In the 'Field' column, the first number indicates whether the
relocation refers to a byte, word or doubleword. The second number,
-if any, indicates the size of the bitfield into which the relocation
+if any, indicates the size of the bit-field into which the relocation
is to occur (and also the size for overflow checking). The third
-number indicates the first bit of the bitfield in the word or
+number indicates the first bit of the bit-field in the word or
doubleword, counting the LSB as bit 0.
diff --git a/gcc/config/stormy16/stormy16-protos.h b/gcc/config/stormy16/stormy16-protos.h
index dc58871a573..e957de1403c 100644
--- a/gcc/config/stormy16/stormy16-protos.h
+++ b/gcc/config/stormy16/stormy16-protos.h
@@ -45,7 +45,6 @@ extern void xstormy16_expand_builtin_va_start PARAMS ((tree, rtx));
extern rtx xstormy16_expand_builtin_va_arg PARAMS ((tree, tree));
extern void xstormy16_initialize_trampoline PARAMS ((rtx, rtx, rtx));
extern rtx xstormy16_function_value PARAMS ((tree, tree));
-extern void xstormy16_asm_output_mi_thunk PARAMS ((FILE *, tree, int, tree));
#endif
#ifdef RTX_CODE
diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c
index 6b9f153e789..de0cc903787 100644
--- a/gcc/config/stormy16/stormy16.c
+++ b/gcc/config/stormy16/stormy16.c
@@ -50,6 +50,8 @@ static rtx emit_addhi3_postreload PARAMS ((rtx, rtx, rtx));
static void xstormy16_asm_out_constructor PARAMS ((rtx, int));
static void xstormy16_asm_out_destructor PARAMS ((rtx, int));
static void xstormy16_encode_section_info PARAMS ((tree, int));
+static void xstormy16_asm_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
+ tree));
/* Define the information needed to generate branch and scc insns. This is
stored from the compare operation. */
@@ -254,7 +256,7 @@ xstormy16_split_cbranch (mode, label, comparison, dest, carry)
OP is the conditional expression, or NULL for branch-always.
- REVERSED is non-zero if we should reverse the sense of the comparison.
+ REVERSED is nonzero if we should reverse the sense of the comparison.
INSN is the insn. */
@@ -331,7 +333,7 @@ xstormy16_output_cbranch_hi (op, label, reversed, insn)
OP is the conditional expression (OP is never NULL_RTX).
- REVERSED is non-zero if we should reverse the sense of the comparison.
+ REVERSED is nonzero if we should reverse the sense of the comparison.
INSN is the insn. */
@@ -407,7 +409,7 @@ xstormy16_output_cbranch_si (op, label, reversed, insn)
registers, but not memory. Some machines allow copying all registers to and
from memory, but require a scratch register for stores to some memory
locations (e.g., those with symbolic address on the RT, and those with
- certain symbolic address on the Sparc when compiling PIC). In some cases,
+ certain symbolic address on the SPARC when compiling PIC). In some cases,
both an intermediate and a scratch register are required.
You should define these macros to indicate to the reload phase that it may
@@ -476,7 +478,7 @@ xstormy16_secondary_reload_class (class, mode, x)
return NO_REGS;
}
-/* Recognise a PLUS that needs the carry register. */
+/* Recognize a PLUS that needs the carry register. */
int
xstormy16_carry_plus_operand (x, mode)
rtx x;
@@ -1170,7 +1172,7 @@ xstormy16_build_va_list ()
return record;
}
-/* Implement the stdarg/varargs va_start macro. STDARG_P is non-zero if this
+/* Implement the stdarg/varargs va_start macro. STDARG_P is nonzero if this
is stdarg.h instead of varargs.h. VALIST is the tree of the va_list
variable to initialize. NEXTARG is the machine independent notion of the
'next' argument after the variable arguments. */
@@ -1380,11 +1382,11 @@ xstormy16_function_value (valtype, func)
extracted from it.) It might possibly be useful on some targets, but
probably not. */
-void
+static void
xstormy16_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl ATTRIBUTE_UNUSED;
- int delta;
+ HOST_WIDE_INT delta;
tree function;
{
int regnum = FIRST_ARGUMENT_REGISTER;
@@ -1393,7 +1395,7 @@ xstormy16_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function))))
regnum += 1;
- fprintf (file, "\tadd %s,#0x%x\n", reg_names[regnum], (delta) & 0xFFFF);
+ fprintf (file, "\tadd %s,#0x%x\n", reg_names[regnum], (int) delta & 0xFFFF);
fputs ("\tjmpf ", file);
assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
putc ('\n', file);
@@ -2031,4 +2033,7 @@ xstormy16_handle_interrupt_attribute (node, name, args, flags, no_add_attrs)
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO xstormy16_encode_section_info
+#undef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK xstormy16_asm_output_mi_thunk
+
struct gcc_target targetm = TARGET_INITIALIZER;
diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h
index 6833ea5aa06..bd2101929db 100644
--- a/gcc/config/stormy16/stormy16.h
+++ b/gcc/config/stormy16/stormy16.h
@@ -126,9 +126,6 @@ do { \
/* Defined in svr4.h. */
#define PCC_BITFIELD_TYPE_MATTERS 1
-
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
/* Layout of Source Language Data Types */
@@ -161,7 +158,7 @@ do { \
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 32
-/* Define this macro if the type of Objective C selectors should be `int'.
+/* Define this macro if the type of Objective-C selectors should be `int'.
If this macro is not defined, then selectors should have the type `struct
objc_selector *'. */
@@ -576,7 +573,7 @@ enum reg_class
registers, but not memory. Some machines allow copying all registers to and
from memory, but require a scratch register for stores to some memory
locations (e.g., those with symbolic address on the RT, and those with
- certain symbolic address on the Sparc when compiling PIC). In some cases,
+ certain symbolic address on the SPARC when compiling PIC). In some cases,
both an intermediate and a scratch register are required.
You should define these macros to indicate to the reload phase that it may
@@ -632,7 +629,7 @@ enum reg_class
/* Certain machines have the property that some registers cannot be copied to
some other registers without using memory. Define this macro on those
- machines to be a C expression that is non-zero if objects of mode M in
+ machines to be a C expression that is nonzero if objects of mode M in
registers of CLASS1 can only be copied to registers of class CLASS2 by
storing a register of CLASS1 into memory and loading that memory location
into a register of CLASS2.
@@ -675,15 +672,15 @@ enum reg_class
few registers of certain classes that there would not be enough registers to
use as spill registers if this were done.
- Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero value on
- these machines. When this macro has a non-zero value, the compiler allows
+ Define `SMALL_REGISTER_CLASSES' to be an expression with a nonzero value on
+ these machines. When this macro has a nonzero value, the compiler allows
registers explicitly used in the rtl to be used as spill registers but
avoids extending the lifetime of these registers.
- It is always safe to define this macro with a non-zero value, but if you
+ It is always safe to define this macro with a nonzero value, but if you
unnecessarily define it, you will reduce the amount of optimizations that
can be performed in some cases. If you do not define this macro with a
- non-zero value when it is required, the compiler will run out of spill
+ nonzero value when it is required, the compiler will run out of spill
registers and print a fatal error message. For most machines, you should
not define this macro at all. */
/* #define SMALL_REGISTER_CLASSES */
@@ -841,7 +838,7 @@ enum reg_class
/* If defined, a C expression that produces the machine-specific code to setup
the stack so that arbitrary frames can be accessed. For example, on the
- Sparc, we must flush all of the register windows to the stack before we can
+ SPARC, we must flush all of the register windows to the stack before we can
access arbitrary stack frames. This macro will seldom need to be defined. */
/* #define SETUP_FRAME_ADDRESSES() */
@@ -1062,7 +1059,7 @@ enum reg_class
{ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
}
-/* A C expression that returns non-zero if the compiler is allowed to try to
+/* A C expression that returns nonzero if the compiler is allowed to try to
replace register number FROM with register number TO. This macro need only
be defined if `ELIMINABLE_REGS' is defined, and will usually be the constant
1, since most of the cases preventing register elimination are things that
@@ -1194,7 +1191,7 @@ enum reg_class
variable number of bytes is passed, it is zero, and argument popping will
always be the responsibility of the calling function.
- On the Vax, all functions always pop their arguments, so the definition of
+ On the VAX, all functions always pop their arguments, so the definition of
this macro is STACK-SIZE. On the 68000, using the standard calling
convention, no functions pop their arguments, so the value of the macro is
always 0 in this case. But an alternative calling convention is available
@@ -1231,7 +1228,7 @@ enum reg_class
register in which to pass the argument, or zero to pass the argument on the
stack.
- For machines like the Vax and 68000, where normally all arguments are
+ For machines like the VAX and 68000, where normally all arguments are
pushed, zero suffices as a definition.
The usual way to make the ANSI library `stdarg.h' work on a machine where
@@ -1242,7 +1239,7 @@ enum reg_class
You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
this macro to determine if this argument is of a type that must be passed in
the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
- returns non-zero for such an argument, the compiler will abort. If
+ returns nonzero for such an argument, the compiler will abort. If
`REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
stack and then loaded into a register. */
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
@@ -1596,40 +1593,6 @@ enum reg_class
You need not define this macro if you did not define
`DELAY_SLOTS_FOR_EPILOGUE'. */
/* #define ELIGIBLE_FOR_EPILOGUE_DELAY(INSN, N) */
-
-/* A C compound statement that outputs the assembler code for a thunk function,
- used to implement C++ virtual function calls with multiple inheritance. The
- thunk acts as a wrapper around a virtual function, adjusting the implicit
- object parameter before handing control off to the real function.
-
- First, emit code to add the integer DELTA to the location that contains the
- incoming first argument. Assume that this argument contains a pointer, and
- is the one used to pass the `this' pointer in C++. This is the incoming
- argument *before* the function prologue, e.g. `%o0' on a sparc. The
- addition must preserve the values of all other incoming arguments.
-
- After the addition, emit code to jump to FUNCTION, which is a
- `FUNCTION_DECL'. This is a direct pure jump, not a call, and does not touch
- the return address. Hence returning from FUNCTION will return to whoever
- called the current `thunk'.
-
- The effect must be as if @var{function} had been called directly
- with the adjusted first argument. This macro is responsible for
- emitting all of the code for a thunk function;
- TARGET_ASM_FUNCTION_PROLOGUE and TARGET_ASM_FUNCTION_EPILOGUE are
- not invoked.
-
- The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already been
- extracted from it.) It might possibly be useful on some targets, but
- probably not.
-
- If you do not define this macro, the target-independent code in the C++
- frontend will generate a less efficient heavyweight thunk that calls
- FUNCTION instead of jumping to it. The generic approach does not support
- varargs. */
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
- xstormy16_asm_output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
-
/* Generating Code for Profiling. */
@@ -1724,7 +1687,7 @@ enum reg_class
#define BUILD_VA_LIST_TYPE(NODE) \
((NODE) = xstormy16_build_va_list ())
-/* Implement the stdarg/varargs va_start macro. STDARG_P is non-zero if this
+/* Implement the stdarg/varargs va_start macro. STDARG_P is nonzero if this
is stdarg.h instead of varargs.h. VALIST is the tree of the va_list
variable to initialize. NEXTARG is the machine independent notion of the
'next' argument after the variable arguments. If not defined, a standard
@@ -2007,7 +1970,7 @@ enum reg_class
C compiler that comes with the system takes care of doing them. */
/* #define perform_... */
-/* Define this macro to generate code for Objective C message sending using the
+/* Define this macro to generate code for Objective-C message sending using the
calling convention of the NeXT system. This calling convention involves
passing the object, the selector and the method arguments all at once to the
method-lookup library function.
@@ -2023,8 +1986,6 @@ enum reg_class
#define HAVE_POST_INCREMENT 1
/* Similar for other kinds of addressing. */
-/* #define HAVE_PRE_INCREMENT 1 */
-/* #define HAVE_POST_DECREMENT 1 */
#define HAVE_PRE_DECREMENT 1
/* A C expression that is 1 if the RTX X is a constant which is a valid
@@ -2189,7 +2150,7 @@ do { \
/* #define EXTRA_CC_MODES */
/* Returns a mode from class `MODE_CC' to be used when comparison operation
- code OP is applied to rtx X and Y. For example, on the Sparc,
+ code OP is applied to rtx X and Y. For example, on the SPARC,
`SELECT_CC_MODE' is defined as (see *note Jump Patterns::. for a
description of the reason for this definition)
@@ -2227,7 +2188,7 @@ do { \
You need not define this macro if it would always returns zero or if the
floating-point format is anything other than `IEEE_FLOAT_FORMAT'. For
- example, here is the definition used on the Sparc, where floating-point
+ example, here is the definition used on the SPARC, where floating-point
inequality comparisons are always given `CCFPEmode':
#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode) */
@@ -2368,10 +2329,10 @@ do { \
times greater than aligned accesses, for example if they are emulated in a
trap handler.
- When this macro is non-zero, the compiler will act as if `STRICT_ALIGNMENT'
- were non-zero when generating code for block moves. This can cause
+ When this macro is nonzero, the compiler will act as if `STRICT_ALIGNMENT'
+ were nonzero when generating code for block moves. This can cause
significantly more instructions to be produced. Therefore, do not set this
- macro non-zero if unaligned accesses only add a cycle or two to the time for
+ macro nonzero if unaligned accesses only add a cycle or two to the time for
a memory access.
If the value of this macro is always zero, it need not be defined. */
@@ -2595,8 +2556,8 @@ do { \
/* #define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME) */
/* A C statement to output any assembler statements which are required to
- precede any Objective C object definitions or message sending. The
- statement is executed only when compiling an Objective C program. */
+ precede any Objective-C object definitions or message sending. The
+ statement is executed only when compiling an Objective-C program. */
/* #define OBJC_PROLOGUE */
@@ -2613,7 +2574,7 @@ do { \
/* #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) */
/* You may define this macro as a C expression. You should define the
- expression to have a non-zero value if GNU CC should output the
+ expression to have a nonzero value if GNU CC should output the
constant pool for a function before the code for the function, or
a zero value if GNU CC should output the constant pool after the
function. If you do not define this macro, the usual case, GNU CC
@@ -2645,7 +2606,7 @@ do { \
outputting the label definition at the proper place. Here is how to do
this:
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "LC", LABELNO);
+ (*targetm.asm_out.internal_label) (FILE, "LC", LABELNO);
When you output a pool entry specially, you should end with a `goto' to the
label JUMPTO. This will prevent the same pool entry from being output a
@@ -2918,31 +2879,11 @@ do { \
is in most Berkeley Unix systems. This macro is used in `assemble_name'. */
/* #define ASM_OUTPUT_LABELREF(STREAM, NAME) */
-/* A C statement to output to the stdio stream STREAM a label whose name is
- made from the string PREFIX and the number NUM.
-
- It is absolutely essential that these labels be distinct from the labels
- used for user-level functions and variables. Otherwise, certain programs
- will have name conflicts with internal labels.
-
- It is desirable to exclude internal labels from the symbol table of the
- object file. Most assemblers have a naming convention for labels that
- should be excluded; on many systems, the letter `L' at the beginning of a
- label has this effect. You should find out what convention your system
- uses, and follow it.
-
- The usual definition of this macro is as follows:
-
- fprintf (STREAM, "L%s%d:\n", PREFIX, NUM)
-
- Defined in svr4.h. */
-/* #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) */
-
/* A C statement to store into the string STRING a label whose name is made
from the string PREFIX and the number NUM.
This string, when output subsequently by `assemble_name', should produce the
- output that `ASM_OUTPUT_INTERNAL_LABEL' would produce with the same PREFIX
+ output that `(*targetm.asm_out.internal_label)' would produce with the same PREFIX
and NUM.
If the string begins with `*', then `assemble_name' will output the rest of
@@ -2955,27 +2896,6 @@ do { \
Defined in svr4.h. */
/* #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) */
-/* A C expression to assign to OUTVAR (which is a variable of type `char *') a
- newly allocated string made from the string NAME and the number NUMBER, with
- some suitable punctuation added. Use `alloca' to get space for the string.
-
- The string will be used as an argument to `ASM_OUTPUT_LABELREF' to produce
- an assembler label for an internal static variable whose name is NAME.
- Therefore, the string must be such as to result in valid assembler code.
- The argument NUMBER is different each time this macro is executed; it
- prevents conflicts between similarly-named internal static variables in
- different scopes.
-
- Ideally this string should not be a valid C identifier, to prevent any
- conflict with the user's own symbols. Most assemblers allow periods or
- percent signs in assembler symbols; putting at least one of these between
- the name and the number will suffice. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \
-do { \
- (OUTVAR) = (char *) alloca (strlen ((NAME)) + 12); \
- sprintf ((OUTVAR), "%s.%ld", (NAME), (long)(NUMBER)); \
-} while (0)
-
/* A C statement to output to the stdio stream STREAM assembler code which
defines (equates) the symbol NAME to have the value VALUE.
@@ -3758,7 +3678,7 @@ do { \
/* A C expression that is nonzero if on this machine the number of bits
actually used for the count of a shift operation is equal to the number of
bits needed to represent the size of the object being shifted. When this
- macro is non-zero, the compiler will assume that it is safe to omit a
+ macro is nonzero, the compiler will assume that it is safe to omit a
sign-extend, zero-extend, and certain bitwise `and' instructions that
truncates the count of a shift operation. On machines that have
instructions that act on bitfields at variable positions, which may include
@@ -3767,7 +3687,7 @@ do { \
instructions.
If both types of instructions truncate the count (for shifts) and position
- (for bitfield operations), or if no variable-position bitfield instructions
+ (for bit-field operations), or if no variable-position bit-field instructions
exist, you should define this macro.
However, on some machines, such as the 80386 and the 680x0, truncation only
@@ -3869,7 +3789,7 @@ do { \
instructions. */
/* #define STORE_FLAG_VALUE */
-/* A C expression that gives a non-zero floating point value that is returned
+/* A C expression that gives a nonzero floating point value that is returned
when comparison operators with floating-point results are true. Define this
macro on machine that have comparison operations that return floating-point
values. If there are no such operations, do not define this macro. */
diff --git a/gcc/config/svr3.h b/gcc/config/svr3.h
index 13e46b2e4c4..8e1e9063e95 100644
--- a/gcc/config/svr3.h
+++ b/gcc/config/svr3.h
@@ -129,7 +129,7 @@ Boston, MA 02111-1307, USA.
/* System V Release 3 uses COFF debugging info. */
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
/* We don't want to output DBX debugging information. */
@@ -158,16 +158,6 @@ Boston, MA 02111-1307, USA.
#undef USER_LABEL_PREFIX
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class.
-
- For most svr3 systems, the convention is that any symbol which begins
- with a period is not put into the linker symbol table by the assembler. */
-
-#undef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- asm_fprintf (FILE, "%0L%s%d:\n", 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.
diff --git a/gcc/config/svr4.h b/gcc/config/svr4.h
index bc6a3b8ed5d..029ad2ccace 100644
--- a/gcc/config/svr4.h
+++ b/gcc/config/svr4.h
@@ -79,22 +79,16 @@ Boston, MA 02111-1307, USA.
Note that gcc doesn't allow a space to follow -Y in a -Ym,* or -Yd,*
option.
+
+ The svr4 assembler wants '-' on the command line if it's expected to
+ read its stdin.
*/
#undef ASM_SPEC
#define ASM_SPEC \
"%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}"
-/* svr4 assemblers need the `-' (indicating input from stdin) to come after
- the -o option (and its argument) for some reason. If we try to put it
- before the -o option, the assembler will try to read the file named as
- the output file in the -o option as an input file (after it has already
- written some stuff to it) and the binary stuff contained therein will
- cause totally confuse the assembler, resulting in many spurious error
- messages. */
-
-#undef ASM_FINAL_SPEC
-#define ASM_FINAL_SPEC "%|"
+#define AS_NEEDS_DASH_FOR_PIPED_INPUT
/* Under svr4, the normal location of the `ld' and `as' programs is the
/usr/ccs/bin directory. */
diff --git a/gcc/config/t-libunwind b/gcc/config/t-libunwind
new file mode 100644
index 00000000000..be50bc481c5
--- /dev/null
+++ b/gcc/config/t-libunwind
@@ -0,0 +1 @@
+LIB2ADDEH = $(srcdir)/unwind-libunwind.c $(srcdir)/unwind-sjlj.c
diff --git a/gcc/config/v850/lib1funcs.asm b/gcc/config/v850/lib1funcs.asm
index 621ba60a486..c5350aa25d2 100644
--- a/gcc/config/v850/lib1funcs.asm
+++ b/gcc/config/v850/lib1funcs.asm
@@ -1,5 +1,5 @@
/* libgcc routines for NEC V850.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -31,70 +31,87 @@ Boston, MA 02111-1307, USA. */
.text
.globl ___mulsi3
.type ___mulsi3,@function
-
-/*
- * #define SHIFT 12
- * #define MASK ((1 << SHIFT) - 1)
- *
- * #define STEP(i, j) \
- * ({ \
- * short a_part = (a >> (i)) & MASK; \
- * short b_part = (b >> (j)) & MASK; \
- * int res = (((int)a_part) * ((int)b_part)); \
- * res; \
- * })
- *
- * int
- * __mulsi3 (unsigned a, unsigned b)
- * {
- * return STEP (0, 0) +
- * ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) +
- * ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0))
- * << (2 * SHIFT));
- * }
- */
-
___mulsi3:
- mov r6,r13
- movea lo(4095),r0,r16
- and r16,r13
- mov r7,r15
- and r16,r15
- mov r13,r10
- mulh r15,r10
- shr 12,r6
- mov r6,r14
- and r16,r14
- mov r14,r11
- mulh r15,r11
- shr 12,r7
- mov r7,r12
- and r16,r12
- shr 12,r7
- and r16,r7
- mulh r13,r7
- shr 12,r6
- mulh r12,r13
- and r16,r6
- add r13,r11
- shl 12,r11
- add r11,r10
- mov r14,r11
- mulh r12,r11
- mulh r15,r6
- add r11,r7
- add r6,r7
- shl 24,r7
- add r7,r10
- jmp [r31]
+#ifdef __v850__
+/*
+ #define SHIFT 12
+ #define MASK ((1 << SHIFT) - 1)
+
+ #define STEP(i, j) \
+ ({ \
+ short a_part = (a >> (i)) & MASK; \
+ short b_part = (b >> (j)) & MASK; \
+ int res = (((int) a_part) * ((int) b_part)); \
+ res; \
+ })
+
+ int
+ __mulsi3 (unsigned a, unsigned b)
+ {
+ return STEP (0, 0) +
+ ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) +
+ ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0))
+ << (2 * SHIFT));
+ }
+*/
+ mov r6, r14
+ movea lo(32767), r0, r10
+ and r10, r14
+ mov r7, r15
+ and r10, r15
+ shr 15, r6
+ mov r6, r13
+ and r10, r13
+ shr 15, r7
+ mov r7, r12
+ and r10, r12
+ shr 15, r6
+ shr 15, r7
+ mov r14, r10
+ mulh r15, r10
+ mov r14, r11
+ mulh r12, r11
+ mov r13, r16
+ mulh r15, r16
+ mulh r14, r7
+ mulh r15, r6
+ add r16, r11
+ mulh r13, r12
+ shl 15, r11
+ add r11, r10
+ add r12, r7
+ add r6, r7
+ shl 30, r7
+ add r7, r10
+ jmp [r31]
+#endif /* __v850__ */
+#if defined(__v850e__) || defined(__v850ea__)
+ /* This routine is almost unneccesarry because gcc
+ generates the MUL instruction for the RTX mulsi3.
+ But if someone wants to link his application with
+ previsously compiled v850 objects then they will
+ need this function. */
+
+ /* It isn't good to put the inst sequence as below;
+ mul r7, r6,
+ mov r6, r10, r0
+ In this case, there is a RAW hazard between them.
+ MUL inst takes 2 cycle in EX stage, then MOV inst
+ must wait 1cycle. */
+ mov r7, r10
+ mul r6, r10, r0
+ jmp [r31]
+#endif /* __v850e__ */
.size ___mulsi3,.-___mulsi3
-#endif
+#endif /* L_mulsi3 */
+
#ifdef L_udivsi3
.text
.global ___udivsi3
.type ___udivsi3,@function
___udivsi3:
+#ifdef __v850__
mov 1,r12
mov 0,r10
cmp r6,r7
@@ -126,6 +143,16 @@ ___udivsi3:
bne .L9
.L8:
jmp [r31]
+
+#else /* defined(__v850e__) */
+
+ /* See comments at end of __mulsi3. */
+ mov r6, r10
+ divu r7, r10, r0
+ jmp [r31]
+
+#endif /* __v850e__ */
+
.size ___udivsi3,.-___udivsi3
#endif
@@ -134,6 +161,7 @@ ___udivsi3:
.globl ___divsi3
.type ___divsi3,@function
___divsi3:
+#ifdef __v850__
add -8,sp
st.w r31,4[sp]
st.w r22,0[sp]
@@ -157,6 +185,16 @@ ___divsi3:
ld.w 4[sp],r31
add 8,sp
jmp [r31]
+
+#else /* defined(__v850e__) */
+
+ /* See comments at end of __mulsi3. */
+ mov r6, r10
+ div r7, r10, r0
+ jmp [r31]
+
+#endif /* __v850e__ */
+
.size ___divsi3,.-___divsi3
#endif
@@ -165,6 +203,7 @@ ___divsi3:
.globl ___umodsi3
.type ___umodsi3,@function
___umodsi3:
+#ifdef __v850__
add -12,sp
st.w r31,8[sp]
st.w r7,4[sp]
@@ -178,6 +217,15 @@ ___umodsi3:
ld.w 8[sp],r31
add 12,sp
jmp [r31]
+
+#else /* defined(__v850e__) */
+
+ /* See comments at end of __mulsi3. */
+ divu r7, r6, r10
+ jmp [r31]
+
+#endif /* __v850e__ */
+
.size ___umodsi3,.-___umodsi3
#endif /* L_umodsi3 */
@@ -186,6 +234,7 @@ ___umodsi3:
.globl ___modsi3
.type ___modsi3,@function
___modsi3:
+#ifdef __v850__
add -12,sp
st.w r31,8[sp]
st.w r7,4[sp]
@@ -199,6 +248,15 @@ ___modsi3:
ld.w 8[sp],r31
add 12,sp
jmp [r31]
+
+#else /* defined(__v850e__) */
+
+ /* See comments at end of __mulsi3. */
+ div r7, r6, r10
+ jmp [r31]
+
+#endif /* __v850e__ */
+
.size ___modsi3,.-___modsi3
#endif /* L_modsi3 */
@@ -1114,7 +1172,7 @@ __return_r29_r31:
.type __save_r31,@function
/* Allocate space and save register 31 on the stack */
/* Also allocate space for the argument save area */
- /* Called via: jalr __save_r29_r31,r10 */
+ /* Called via: jalr __save_r31,r10 */
__save_r31:
addi -20,sp,sp
st.w r31,16[sp]
@@ -1130,7 +1188,7 @@ __return_r31:
ld.w 16[sp],r31
addi 20,sp,sp
jmp [r31]
- .size __return_r29_r31,.-__return_r29_r31
+ .size __return_r31,.-__return_r31
#endif /* L_save_31c */
#ifdef L_save_varargs
@@ -1267,3 +1325,561 @@ __restore_all_interrupt:
jmp [r10]
.size __restore_all_interrupt,.-__restore_all_interrupt
#endif /* L_save_all_interrupt */
+
+
+#if defined __v850e__
+#ifdef L_callt_save_r2_r29
+ /* Put these functions into the call table area. */
+ .call_table_text
+
+ /* Allocate space and save registers 2, 20 .. 29 on the stack. */
+ /* Called via: callt ctoff(__callt_save_r2_r29). */
+ .align 2
+.L_save_r2_r29:
+ add -4, sp
+ st.w r2, 0[sp]
+ prepare {r20 - r29}, 0
+ ctret
+
+ /* Restore saved registers, deallocate stack and return to the user. */
+ /* Called via: callt ctoff(__callt_return_r2_r29). */
+ .align 2
+.L_return_r2_r29:
+ dispose 0, {r20-r29}
+ ld.w 0[sp], r2
+ add 4, sp
+ jmp [r31]
+
+ /* Place the offsets of the start of these routines into the call table. */
+ .call_table_data
+
+ .global __callt_save_r2_r29
+ .type __callt_save_r2_r29,@function
+__callt_save_r2_r29: .short ctoff(.L_save_r2_r29)
+
+ .global __callt_return_r2_r29
+ .type __callt_return_r2_r29,@function
+__callt_return_r2_r29: .short ctoff(.L_return_r2_r29)
+
+#endif /* L_callt_save_r2_r29 */
+
+#ifdef L_callt_save_r2_r31
+ /* Put these functions into the call table area. */
+ .call_table_text
+
+ /* Allocate space and save registers 2 and 20 .. 29, 31 on the stack. */
+ /* Also allocate space for the argument save area. */
+ /* Called via: callt ctoff(__callt_save_r2_r31). */
+ .align 2
+.L_save_r2_r31:
+ add -4, sp
+ st.w r2, 0[sp]
+ prepare {r20 - r29, r31}, 4
+ ctret
+
+ /* Restore saved registers, deallocate stack and return to the user. */
+ /* Called via: callt ctoff(__callt_return_r2_r31). */
+ .align 2
+.L_return_r2_r31:
+ dispose 4, {r20 - r29, r31}
+ ld.w 0[sp], r2
+ addi 4, sp, sp
+ jmp [r31]
+
+ /* Place the offsets of the start of these routines into the call table. */
+ .call_table_data
+
+ .global __callt_save_r2_r31
+ .type __callt_save_r2_r31,@function
+__callt_save_r2_r31: .short ctoff(.L_save_r2_r31)
+
+ .global __callt_return_r2_r31
+ .type __callt_return_r2_r31,@function
+__callt_return_r2_r31: .short ctoff(.L_return_r2_r31)
+
+#endif /* L_callt_save_r2_r31 */
+
+
+#ifdef L_callt_save_r6_r9
+ /* Put these functions into the call table area. */
+ .call_table_text
+
+ /* Save registers r6 - r9 onto the stack in the space reserved for them.
+ Use by variable argument functions.
+ Called via: callt ctoff(__callt_save_r6_r9). */
+ .align 2
+.L_save_r6_r9:
+ mov ep,r1
+ mov sp,ep
+ sst.w r6,0[ep]
+ sst.w r7,4[ep]
+ sst.w r8,8[ep]
+ sst.w r9,12[ep]
+ mov r1,ep
+ ctret
+
+ /* Place the offsets of the start of this routines into the call table. */
+ .call_table_data
+
+ .global __callt_save_r6_r9
+ .type __callt_save_r6_r9,@function
+__callt_save_r6_r9: .short ctoff(.L_save_r6_r9)
+#endif /* L_callt_save_r6_r9 */
+
+
+#ifdef L_callt_save_interrupt
+ /* Put this functions into the call table area */
+ .call_table_text
+
+ /* Save registers r1, ep, gp, r10 on stack and load up with expected values. */
+ /* Called via: callt ctoff(__callt_save_interrupt). */
+ .align 2
+.L_save_interrupt:
+ /* SP has already been moved before callt ctoff(_save_interrupt). */
+ /* addi -24, sp, sp */
+ st.w ep, 0[sp]
+ st.w gp, 4[sp]
+ st.w r1, 8[sp]
+ /* R10 has alread been saved bofore callt ctoff(_save_interrupt). */
+ /* st.w r10, 12[sp] */
+ mov hilo(__ep),ep
+ mov hilo(__gp),gp
+ ctret
+
+ /* Place the offsets of the start of the routine into the call table. */
+ .call_table_data
+ .global __callt_save_interrupt
+ .type __callt_save_interrupt,@function
+__callt_save_interrupt: .short ctoff(.L_save_interrupt)
+
+ .call_table_text
+
+ /* Restore saved registers, deallocate stack and return from the interrupt. */
+ /* Called via: callt ctoff(__callt_restore_itnerrupt). */
+ .text
+ .align 2
+ .globl __return_interrupt
+ .type __return_interrupt,@function
+.L_return_interrupt:
+ ld.w 20[sp], r1
+ ldsr r1, ctpsw
+ ld.w 16[sp], r1
+ ldsr r1, ctpc
+ ld.w 12[sp], r10
+ ld.w 8[sp], r1
+ ld.w 4[sp], gp
+ ld.w 0[sp], ep
+ addi 24, sp, sp
+ reti
+
+ /* Place the offsets of the start of the routine into the call table. */
+ .call_table_data
+
+ .global __callt_return_interrupt
+ .type __callt_return_interrupt,@function
+__callt_return_interrupt: .short ctoff(.L_return_interrupt)
+
+#endif /* L_callt_save_interrupt */
+
+#ifdef L_callt_save_all_interrupt
+ /* Put this functions into the call table area. */
+ .call_table_text
+
+ /* Save all registers except for those saved in __save_interrupt. */
+ /* Allocate enough stack for all of the registers & 16 bytes of space. */
+ /* Called via: callt ctoff(__callt_save_all_interrupt). */
+ .align 2
+.L_save_all_interrupt:
+ addi -60, sp, sp
+ mov ep, r1
+ mov sp, ep
+ sst.w r2, 56[ep]
+ sst.w r5, 52[ep]
+ sst.w r6, 48[ep]
+ sst.w r7, 44[ep]
+ sst.w r8, 40[ep]
+ sst.w r9, 36[ep]
+ sst.w r11, 32[ep]
+ sst.w r12, 28[ep]
+ sst.w r13, 24[ep]
+ sst.w r14, 20[ep]
+ sst.w r15, 16[ep]
+ sst.w r16, 12[ep]
+ sst.w r17, 8[ep]
+ sst.w r18, 4[ep]
+ sst.w r19, 0[ep]
+ mov r1, ep
+
+ prepare {r20 - r29, r31}, 4
+ ctret
+
+ /* Restore all registers saved in __save_all_interrupt. */
+ /* & deallocate the stack space. */
+ /* Called via: callt ctoff(__callt_restore_all_interrupt). */
+ .align 2
+.L_restore_all_interrupt:
+ dispose 4, {r20 - r29, r31}
+
+ mov ep, r1
+ mov sp, ep
+ sld.w 0 [ep], r19
+ sld.w 4 [ep], r18
+ sld.w 8 [ep], r17
+ sld.w 12[ep], r16
+ sld.w 16[ep], r15
+ sld.w 20[ep], r14
+ sld.w 24[ep], r13
+ sld.w 28[ep], r12
+ sld.w 32[ep], r11
+ sld.w 36[ep], r9
+ sld.w 40[ep], r8
+ sld.w 44[ep], r7
+ sld.w 48[ep], r6
+ sld.w 52[ep], r5
+ sld.w 56[ep], r2
+ mov r1, ep
+ addi 60, sp, sp
+ ctret
+
+ /* Place the offsets of the start of these routines into the call table. */
+ .call_table_data
+
+ .global __callt_save_all_interrupt
+ .type __callt_save_all_interrupt,@function
+__callt_save_all_interrupt: .short ctoff(.L_save_all_interrupt)
+
+ .global __callt_restore_all_interrupt
+ .type __callt_restore_all_interrupt,@function
+__callt_restore_all_interrupt: .short ctoff(.L_restore_all_interrupt)
+
+#endif /* L_callt_save_all_interrupt */
+
+
+#define MAKE_CALLT_FUNCS( START ) \
+ .call_table_text ;\
+ .align 2 ;\
+ /* Allocate space and save registers START .. r29 on the stack. */ ;\
+ /* Called via: callt ctoff(__callt_save_START_r29). */ ;\
+.L_save_##START##_r29: ;\
+ prepare { START - r29 }, 0 ;\
+ ctret ;\
+ ;\
+ /* Restore saved registers, deallocate stack and return. */ ;\
+ /* Called via: callt ctoff(__return_START_r29) */ ;\
+ .align 2 ;\
+.L_return_##START##_r29: ;\
+ dispose 0, { START - r29 }, r31 ;\
+ ;\
+ /* Place the offsets of the start of these funcs into the call table. */;\
+ .call_table_data ;\
+ ;\
+ .global __callt_save_##START##_r29 ;\
+ .type __callt_save_##START##_r29,@function ;\
+__callt_save_##START##_r29: .short ctoff(.L_save_##START##_r29 ) ;\
+ ;\
+ .global __callt_return_##START##_r29 ;\
+ .type __callt_return_##START##_r29,@function ;\
+__callt_return_##START##_r29: .short ctoff(.L_return_##START##_r29 )
+
+
+#define MAKE_CALLT_CFUNCS( START ) \
+ .call_table_text ;\
+ .align 2 ;\
+ /* Allocate space and save registers START .. r31 on the stack. */ ;\
+ /* Called via: callt ctoff(__callt_save_START_r31c). */ ;\
+.L_save_##START##_r31c: ;\
+ prepare { START - r29, r31}, 4 ;\
+ ctret ;\
+ ;\
+ /* Restore saved registers, deallocate stack and return. */ ;\
+ /* Called via: callt ctoff(__return_START_r31c). */ ;\
+ .align 2 ;\
+.L_return_##START##_r31c: ;\
+ dispose 4, { START - r29, r31}, r31 ;\
+ ;\
+ /* Place the offsets of the start of these funcs into the call table. */;\
+ .call_table_data ;\
+ ;\
+ .global __callt_save_##START##_r31c ;\
+ .type __callt_save_##START##_r31c,@function ;\
+__callt_save_##START##_r31c: .short ctoff(.L_save_##START##_r31c ) ;\
+ ;\
+ .global __callt_return_##START##_r31c ;\
+ .type __callt_return_##START##_r31c,@function ;\
+__callt_return_##START##_r31c: .short ctoff(.L_return_##START##_r31c )
+
+
+#ifdef L_callt_save_20
+ MAKE_CALLT_FUNCS (r20)
+#endif
+#ifdef L_callt_save_21
+ MAKE_CALLT_FUNCS (r21)
+#endif
+#ifdef L_callt_save_22
+ MAKE_CALLT_FUNCS (r22)
+#endif
+#ifdef L_callt_save_23
+ MAKE_CALLT_FUNCS (r23)
+#endif
+#ifdef L_callt_save_24
+ MAKE_CALLT_FUNCS (r24)
+#endif
+#ifdef L_callt_save_25
+ MAKE_CALLT_FUNCS (r25)
+#endif
+#ifdef L_callt_save_26
+ MAKE_CALLT_FUNCS (r26)
+#endif
+#ifdef L_callt_save_27
+ MAKE_CALLT_FUNCS (r27)
+#endif
+#ifdef L_callt_save_28
+ MAKE_CALLT_FUNCS (r28)
+#endif
+#ifdef L_callt_save_29
+ MAKE_CALLT_FUNCS (r29)
+#endif
+
+#ifdef L_callt_save_20c
+ MAKE_CALLT_CFUNCS (r20)
+#endif
+#ifdef L_callt_save_21c
+ MAKE_CALLT_CFUNCS (r21)
+#endif
+#ifdef L_callt_save_22c
+ MAKE_CALLT_CFUNCS (r22)
+#endif
+#ifdef L_callt_save_23c
+ MAKE_CALLT_CFUNCS (r23)
+#endif
+#ifdef L_callt_save_24c
+ MAKE_CALLT_CFUNCS (r24)
+#endif
+#ifdef L_callt_save_25c
+ MAKE_CALLT_CFUNCS (r25)
+#endif
+#ifdef L_callt_save_26c
+ MAKE_CALLT_CFUNCS (r26)
+#endif
+#ifdef L_callt_save_27c
+ MAKE_CALLT_CFUNCS (r27)
+#endif
+#ifdef L_callt_save_28c
+ MAKE_CALLT_CFUNCS (r28)
+#endif
+#ifdef L_callt_save_29c
+ MAKE_CALLT_CFUNCS (r29)
+#endif
+
+
+#ifdef L_callt_save_31c
+ .call_table_text
+ .align 2
+ /* Allocate space and save register r31 on the stack. */
+ /* Called via: callt ctoff(__callt_save_r31c). */
+.L_callt_save_r31c:
+ prepare {r31}, 4
+ ctret
+
+ /* Restore saved registers, deallocate stack and return. */
+ /* Called via: callt ctoff(__return_r31c). */
+ .align 2
+.L_callt_return_r31c:
+ dispose 4, {r31}, r31
+
+ /* Place the offsets of the start of these funcs into the call table. */
+ .call_table_data
+
+ .global __callt_save_r31c
+ .type __callt_save_r31c,@function
+__callt_save_r31c: .short ctoff(.L_callt_save_r31c)
+
+ .global __callt_return_r31c
+ .type __callt_return_r31c,@function
+__callt_return_r31c: .short ctoff(.L_callt_return_r31c)
+#endif
+
+#endif /* __v850e__ */
+
+/* libgcc2 routines for NEC V850. */
+/* Double Integer Arithmetical Operation. */
+
+#ifdef L_negdi2
+ .text
+ .global ___negdi2
+ .type ___negdi2, @function
+___negdi2:
+ not r6, r10
+ add 1, r10
+ setf l, r6
+ not r7, r11
+ add r6, r11
+ jmp [lp]
+
+ .size ___negdi2,.-___negdi2
+#endif
+
+#ifdef L_cmpdi2
+ .text
+ .global ___cmpdi2
+ .type ___cmpdi2,@function
+___cmpdi2:
+ # Signed comparison bitween each high word.
+ cmp r9, r7
+ be .L_cmpdi_cmp_low
+ setf ge, r10
+ setf gt, r6
+ add r6, r10
+ jmp [lp]
+.L_cmpdi_cmp_low:
+ # Unsigned comparigon bitween each low word.
+ cmp r8, r6
+ setf nl, r10
+ setf h, r6
+ add r6, r10
+ jmp [lp]
+ .size ___cmpdi2, . - ___cmpdi2
+#endif
+
+#ifdef L_ucmpdi2
+ .text
+ .global ___ucmpdi2
+ .type ___ucmpdi2,@function
+___ucmpdi2:
+ cmp r9, r7 # Check if each high word are same.
+ be .L_ucmpdi_check_psw
+ cmp r8, r6 # Compare the word.
+.L_ucmpdi_check_psw:
+ setf nl, r10 #
+ setf h, r6 #
+ add r6, r10 # Add the result of comparison NL and comparison H.
+ jmp [lp]
+ .size ___ucmpdi2, . - ___ucmpdi2
+#endif
+
+#ifdef L_muldi3
+ .text
+ .global ___muldi3
+ .type ___muldi3,@function
+___muldi3:
+#ifdef __v850__
+ jarl __save_r26_r31, r10
+ addi 16, sp, sp
+ mov r6, r28
+ shr 15, r28
+ movea lo(32767), r0, r14
+ and r14, r28
+ mov r8, r10
+ shr 15, r10
+ and r14, r10
+ mov r6, r19
+ shr 30, r19
+ mov r7, r12
+ shl 2, r12
+ or r12, r19
+ and r14, r19
+ mov r8, r13
+ shr 30, r13
+ mov r9, r12
+ shl 2, r12
+ or r12, r13
+ and r14, r13
+ mov r7, r11
+ shr 13, r11
+ and r14, r11
+ mov r9, r31
+ shr 13, r31
+ and r14, r31
+ mov r7, r29
+ shr 28, r29
+ and r14, r29
+ mov r9, r12
+ shr 28, r12
+ and r14, r12
+ and r14, r6
+ and r14, r8
+ mov r6, r14
+ mulh r8, r14
+ mov r6, r16
+ mulh r10, r16
+ mov r6, r18
+ mulh r13, r18
+ mov r6, r15
+ mulh r31, r15
+ mulh r12, r6
+ mov r28, r17
+ mulh r10, r17
+ add -16, sp
+ mov r28, r12
+ mulh r8, r12
+ add r17, r18
+ mov r28, r17
+ mulh r31, r17
+ add r12, r16
+ mov r28, r12
+ mulh r13, r12
+ add r17, r6
+ mov r19, r17
+ add r12, r15
+ mov r19, r12
+ mulh r8, r12
+ mulh r10, r17
+ add r12, r18
+ mov r19, r12
+ mulh r13, r12
+ add r17, r15
+ mov r11, r13
+ mulh r8, r13
+ add r12, r6
+ mov r11, r12
+ mulh r10, r12
+ add r13, r15
+ mulh r29, r8
+ add r12, r6
+ mov r16, r13
+ shl 15, r13
+ add r14, r13
+ mov r18, r12
+ shl 30, r12
+ mov r13, r26
+ add r12, r26
+ shr 15, r14
+ movhi hi(131071), r0, r12
+ movea lo(131071), r12, r13
+ and r13, r14
+ mov r16, r12
+ and r13, r12
+ add r12, r14
+ mov r18, r12
+ shl 15, r12
+ and r13, r12
+ add r12, r14
+ shr 17, r14
+ shr 17, r16
+ add r14, r16
+ shl 13, r15
+ shr 2, r18
+ add r18, r15
+ add r15, r16
+ mov r16, r27
+ add r8, r6
+ shl 28, r6
+ add r6, r27
+ mov r26, r10
+ mov r27, r11
+ jr __return_r26_r31
+#endif /* __v850__ */
+#if defined(__v850e__) || defined(__v850ea__)
+ /* (Ahi << 32 + Alo) * (Bhi << 32 + Blo) */
+ /* r7 r6 r9 r8 */
+ mov r8, r10
+ mulu r7, r8, r0 /* Ahi * Blo */
+ mulu r6, r9, r0 /* Alo * Bhi */
+ mulu r6, r10, r11 /* Alo * Blo */
+ add r8, r11
+ add r9, r11
+ jmp [r31]
+
+#endif /* defined(__v850e__) || defined(__v850ea__) */
+ .size ___muldi3, . - ___muldi3
+#endif
diff --git a/gcc/config/v850/t-v850 b/gcc/config/v850/t-v850
index 2452969f267..bd07abead75 100644
--- a/gcc/config/v850/t-v850
+++ b/gcc/config/v850/t-v850
@@ -29,7 +29,38 @@ LIB1ASMFUNCS = _mulsi3 \
_save_31c \
_save_varargs \
_save_interrupt \
- _save_all_interrupt
+ _save_all_interrupt \
+ _callt_save_20 \
+ _callt_save_21 \
+ _callt_save_22 \
+ _callt_save_23 \
+ _callt_save_24 \
+ _callt_save_25 \
+ _callt_save_26 \
+ _callt_save_27 \
+ _callt_save_28 \
+ _callt_save_29 \
+ _callt_save_20c \
+ _callt_save_21c \
+ _callt_save_22c \
+ _callt_save_23c \
+ _callt_save_24c \
+ _callt_save_25c \
+ _callt_save_26c \
+ _callt_save_27c \
+ _callt_save_28c \
+ _callt_save_29c \
+ _callt_save_31c \
+ _callt_save_varargs \
+ _callt_save_interrupt \
+ _callt_save_all_interrupt \
+ _callt_save_r2_r29 \
+ _callt_save_r2_r31 \
+ _callt_save_r6_r9 \
+ _negdi2 \
+ _cmpdi2 \
+ _ucmpdi2 \
+ _muldi3
# We want fine grained libraries, so use the new code to build the
# floating point emulation libraries.
@@ -49,8 +80,13 @@ fp-bit.c: $(srcdir)/config/fp-bit.c
echo '#endif' >> fp-bit.c
cat $(srcdir)/config/fp-bit.c >> fp-bit.c
-TCFLAGS = -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow
+# Create target-specific versions of the libraries
+MULTILIB_OPTIONS = mv850/mv850e
+MULTILIB_DIRNAMES = v850 v850e
+INSTALL_LIBGCC = install-multilib
-v850-c.o: $(srcdir)/config/v850/v850-c.c $(RTL_H) $(TREE_H) $(CONFIG_H)
+TCFLAGS = -mno-app-regs -msmall-sld -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow
+
+v850-c.o: $(srcdir)/config/v850/v850-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_P_H)
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
diff --git a/gcc/config/v850/v850-protos.h b/gcc/config/v850/v850-protos.h
index 05b740adfd0..a381a3eee7e 100644
--- a/gcc/config/v850/v850-protos.h
+++ b/gcc/config/v850/v850-protos.h
@@ -1,22 +1,22 @@
/* Prototypes for v850.c functions used in the md file & elsewhere.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
-This file is part of GNU CC.
+ 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 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.
+ 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. */
+ 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. */
/* Function prototypes that cannot exist in v850.h due to dependency
complications. */
@@ -42,6 +42,7 @@ extern int compute_frame_size PARAMS ((int, long *));
extern void v850_init_expanders PARAMS ((void));
#ifdef RTX_CODE
+extern int v850_output_addr_const_extra PARAMS ((FILE *, rtx));
extern rtx v850_return_addr PARAMS ((int));
extern void print_operand PARAMS ((FILE *, rtx, int ));
extern void print_operand_address PARAMS ((FILE *, rtx));
@@ -53,6 +54,12 @@ extern void notice_update_cc PARAMS ((rtx, rtx));
extern char * construct_save_jarl PARAMS ((rtx));
extern char * construct_restore_jr PARAMS ((rtx));
#ifdef HAVE_MACHINE_MODES
+extern int reg_or_int9_operand PARAMS ((rtx, Mmode));
+extern int reg_or_const_operand PARAMS ((rtx, Mmode));
+extern char * construct_dispose_instruction PARAMS ((rtx));
+extern char * construct_prepare_instruction PARAMS ((rtx));
+extern int pattern_is_ok_for_prepare PARAMS ((rtx, Mmode));
+extern int pattern_is_ok_for_dispose PARAMS ((rtx, Mmode));
extern int ep_memory_operand PARAMS ((rtx, Mmode, int));
extern int reg_or_0_operand PARAMS ((rtx, Mmode));
extern int reg_or_int5_operand PARAMS ((rtx, Mmode));
diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c
index 80096781ae6..8029ecfd021 100644
--- a/gcc/config/v850/v850.c
+++ b/gcc/config/v850/v850.c
@@ -3,22 +3,22 @@
Free Software Foundation, Inc.
Contributed by Jeff Law (law@cygnus.com).
-This file is part of GNU CC.
+ 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 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.
+ 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. */
+ 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. */
#include "config.h"
#include "system.h"
@@ -61,9 +61,6 @@ static void v850_encode_data_area PARAMS ((tree));
static void v850_encode_section_info PARAMS ((tree, int));
static const char *v850_strip_name_encoding PARAMS ((const char *));
-/* True if the current function has anonymous arguments. */
-int current_function_anonymous_args;
-
/* Information about the various small memory areas. */
struct small_memory_info small_memory[ (int)SMALL_MEMORY_max ] =
{
@@ -142,6 +139,13 @@ override_options ()
}
}
}
+
+ /* Make sure that the US_BIT_SET mask has been correctly initialized. */
+ if ((target_flags & MASK_US_MASK_SET) == 0)
+ {
+ target_flags |= MASK_US_MASK_SET;
+ target_flags &= ~MASK_US_BIT_SET;
+ }
}
@@ -176,6 +180,9 @@ function_arg (cum, mode, type, named)
else
size = GET_MODE_SIZE (mode);
+ if (size < 1)
+ return 0;
+
if (type)
align = TYPE_ALIGN (type) / BITS_PER_UNIT;
else
@@ -696,6 +703,38 @@ print_operand_address (file, addr)
}
}
+/* When assemble_integer is used to emit the offsets for a switch
+ table it can encounter (TRUNCATE:HI (MINUS:SI (LABEL_REF:SI) (LABEL_REF:SI))).
+ output_addr_const will normally barf at this, but it is OK to omit
+ the truncate and just emit the difference of the two labels. The
+ .hword directive will automatically handle the truncation for us.
+
+ Returns 1 if rtx was handled, 0 otherwise. */
+
+int
+v850_output_addr_const_extra (file, x)
+ FILE * file;
+ rtx x;
+{
+ if (GET_CODE (x) != TRUNCATE)
+ return 0;
+
+ x = XEXP (x, 0);
+
+ /* We must also handle the case where the switch table was passed a
+ constant value and so has been collapsed. In this case the first
+ label will have been deleted. In such a case it is OK to emit
+ nothing, since the table will not be used.
+ (cf gcc.c-torture/compile/990801-1.c). */
+ if (GET_CODE (x) == MINUS
+ && GET_CODE (XEXP (x, 0)) == LABEL_REF
+ && GET_CODE (XEXP (XEXP (x, 0), 0)) == CODE_LABEL
+ && INSN_DELETED_P (XEXP (XEXP (x, 0), 0)))
+ return 1;
+
+ output_addr_const (file, x);
+ return 1;
+}
/* Return appropriate code to load up a 1, 2, or 4 integer/floating
point value. */
@@ -716,16 +755,19 @@ output_move_single (operands)
{
HOST_WIDE_INT value = INTVAL (src);
- if (CONST_OK_FOR_J (value)) /* signed 5 bit immediate */
+ if (CONST_OK_FOR_J (value)) /* Signed 5 bit immediate. */
return "mov %1,%0";
- else if (CONST_OK_FOR_K (value)) /* signed 16 bit immediate */
+ else if (CONST_OK_FOR_K (value)) /* Signed 16 bit immediate. */
return "movea lo(%1),%.,%0";
- else if (CONST_OK_FOR_L (value)) /* upper 16 bits were set */
+ else if (CONST_OK_FOR_L (value)) /* Upper 16 bits were set. */
return "movhi hi(%1),%.,%0";
- else /* random constant */
+ /* A random constant. */
+ else if (TARGET_V850E)
+ return "mov %1,%0";
+ else
return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
}
@@ -734,16 +776,21 @@ output_move_single (operands)
HOST_WIDE_INT high, low;
const_double_split (src, &high, &low);
- if (CONST_OK_FOR_J (high)) /* signed 5 bit immediate */
+
+ if (CONST_OK_FOR_J (high)) /* Signed 5 bit immediate. */
return "mov %F1,%0";
- else if (CONST_OK_FOR_K (high)) /* signed 16 bit immediate */
+ else if (CONST_OK_FOR_K (high)) /* Signed 16 bit immediate. */
return "movea lo(%F1),%.,%0";
- else if (CONST_OK_FOR_L (high)) /* upper 16 bits were set */
+ else if (CONST_OK_FOR_L (high)) /* Upper 16 bits were set. */
return "movhi hi(%F1),%.,%0";
- else /* random constant */
+ /* A random constant. */
+ else if (TARGET_V850E)
+ return "mov %F1,%0";
+
+ else
return "movhi hi(%F1),%.,%0\n\tmovea lo(%F1),%0,%0";
}
@@ -757,7 +804,10 @@ output_move_single (operands)
|| GET_CODE (src) == SYMBOL_REF
|| GET_CODE (src) == CONST)
{
- return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
+ if (TARGET_V850E)
+ return "mov hilo(%1),%0";
+ else
+ return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
}
else if (GET_CODE (src) == HIGH)
@@ -881,11 +931,25 @@ ep_memory_offset (mode, unsignedp)
switch (mode)
{
case QImode:
- max_offset = (1 << 7);
+ if (TARGET_SMALL_SLD)
+ max_offset = (1 << 4);
+ else if (TARGET_V850E
+ && ( ( unsignedp && ! TARGET_US_BIT_SET)
+ || (! unsignedp && TARGET_US_BIT_SET)))
+ max_offset = (1 << 4);
+ else
+ max_offset = (1 << 7);
break;
case HImode:
- max_offset = (1 << 8);
+ if (TARGET_SMALL_SLD)
+ max_offset = (1 << 5);
+ else if (TARGET_V850E
+ && ( ( unsignedp && ! TARGET_US_BIT_SET)
+ || (! unsignedp && TARGET_US_BIT_SET)))
+ max_offset = (1 << 5);
+ else
+ max_offset = (1 << 8);
break;
case SImode:
@@ -985,6 +1049,32 @@ reg_or_int5_operand (op, mode)
return register_operand (op, mode);
}
+/* Return true if OP is either a register or a signed nine bit integer. */
+
+int
+reg_or_int9_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ if (GET_CODE (op) == CONST_INT)
+ return CONST_OK_FOR_O (INTVAL (op));
+
+ return register_operand (op, mode);
+}
+
+/* Return true if OP is either a register or a const integer. */
+
+int
+reg_or_const_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ if (GET_CODE (op) == CONST_INT)
+ return TRUE;
+
+ return register_operand (op, mode);
+}
+
/* Return true if OP is a valid call operand. */
int
@@ -1129,6 +1219,16 @@ Saved %d bytes (%d uses of register %s) in function %s, starting as insn %d, end
else if (GET_CODE (SET_SRC (pattern)) == MEM)
p_mem = &SET_SRC (pattern);
+ else if (GET_CODE (SET_SRC (pattern)) == SIGN_EXTEND
+ && GET_CODE (XEXP (SET_SRC (pattern), 0)) == MEM)
+ p_mem = &XEXP (SET_SRC (pattern), 0);
+
+ else if (GET_CODE (SET_SRC (pattern)) == ZERO_EXTEND
+ && GET_CODE (XEXP (SET_SRC (pattern), 0)) == MEM)
+ {
+ p_mem = &XEXP (SET_SRC (pattern), 0);
+ unsignedp = TRUE;
+ }
else
p_mem = (rtx *)0;
@@ -1278,6 +1378,16 @@ void v850_reorg (start_insn)
else if (GET_CODE (src) == MEM)
mem = src;
+ else if (GET_CODE (src) == SIGN_EXTEND
+ && GET_CODE (XEXP (src, 0)) == MEM)
+ mem = XEXP (src, 0);
+
+ else if (GET_CODE (src) == ZERO_EXTEND
+ && GET_CODE (XEXP (src, 0)) == MEM)
+ {
+ mem = XEXP (src, 0);
+ unsignedp = TRUE;
+ }
else
mem = NULL_RTX;
@@ -1531,8 +1641,11 @@ expand_prologue ()
/* Save/setup global registers for interrupt functions right now. */
if (interrupt_handler)
{
+ if (TARGET_V850E && ! TARGET_DISABLE_CALLT)
+ emit_insn (gen_callt_save_interrupt ());
+ else
emit_insn (gen_save_interrupt ());
-
+
actual_fsize -= INTERRUPT_FIXED_SAVE_SIZE;
if (((1L << LINK_POINTER_REGNUM) & reg_saved) != 0)
@@ -1540,11 +1653,14 @@ expand_prologue ()
}
/* Save arg registers to the stack if necessary. */
- else if (current_function_anonymous_args)
+ else if (current_function_args_info.anonymous_args)
{
if (TARGET_PROLOG_FUNCTION)
{
- emit_insn (gen_save_r6_r9 ());
+ if (TARGET_V850E && ! TARGET_DISABLE_CALLT)
+ emit_insn (gen_save_r6_r9_v850e ());
+ else
+ emit_insn (gen_save_r6_r9 ());
}
else
{
@@ -1656,7 +1772,10 @@ Saved %d bytes via prologue function (%d vs. %d) for function %s\n",
/* Special case interrupt functions that save all registers for a call. */
if (interrupt_handler && ((1L << LINK_POINTER_REGNUM) & reg_saved) != 0)
{
- emit_insn (gen_save_all_interrupt ());
+ if (TARGET_V850E && ! TARGET_DISABLE_CALLT)
+ emit_insn (gen_callt_save_all_interrupt ());
+ else
+ emit_insn (gen_save_all_interrupt ());
}
else
{
@@ -1888,7 +2007,10 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n",
for a call. */
if (interrupt_handler && ((1L << LINK_POINTER_REGNUM) & reg_saved) != 0)
{
- emit_insn (gen_restore_all_interrupt ());
+ if (TARGET_V850E && ! TARGET_DISABLE_CALLT)
+ emit_insn (gen_callt_restore_all_interrupt ());
+ else
+ emit_insn (gen_restore_all_interrupt ());
}
else
{
@@ -1926,14 +2048,18 @@ Saved %d bytes via epilogue function (%d vs. %d) in function %s\n",
/* And return or use reti for interrupt handlers. */
if (interrupt_handler)
- emit_jump_insn (gen_restore_interrupt ());
+ {
+ if (TARGET_V850E && ! TARGET_DISABLE_CALLT)
+ emit_insn (gen_callt_return_interrupt ());
+ else
+ emit_jump_insn (gen_return_interrupt ());
+ }
else if (actual_fsize)
emit_jump_insn (gen_return_internal ());
else
emit_jump_insn (gen_return ());
}
- current_function_anonymous_args = 0;
v850_interrupt_cache_p = FALSE;
v850_interrupt_p = FALSE;
}
@@ -2233,13 +2359,12 @@ register_is_ok_for_epilogue (op, mode)
rtx op;
enum machine_mode ATTRIBUTE_UNUSED mode;
{
- /* The save/restore routines can only cope with registers 2, and 20 - 31 */
- return (GET_CODE (op) == REG)
- && (((REGNO (op) >= 20) && REGNO (op) <= 31)
- || REGNO (op) == 2);
+ /* The save/restore routines can only cope with registers 20 - 31. */
+ return ((GET_CODE (op) == REG)
+ && (((REGNO (op) >= 20) && REGNO (op) <= 31)));
}
-/* Return non-zero if the given RTX is suitable for collapsing into
+/* Return nonzero if the given RTX is suitable for collapsing into
jump to a function epilogue. */
int
pattern_is_ok_for_epilogue (op, mode)
@@ -2418,7 +2543,7 @@ construct_restore_jr (op)
}
-/* Return non-zero if the given RTX is suitable for collapsing into
+/* Return nonzero if the given RTX is suitable for collapsing into
a jump to a function prologue. */
int
pattern_is_ok_for_prologue (op, mode)
@@ -2633,7 +2758,7 @@ v850_output_aligned_bss (file, decl, name, size, align)
int align;
{
(*targetm.asm_out.globalize_label) (file, name);
-
+
switch (v850_get_data_area (decl))
{
case DATA_AREA_ZDA:
@@ -2732,7 +2857,7 @@ v850_insert_attributes (decl, attr_ptr)
&& v850_get_data_area (decl) == DATA_AREA_NORMAL)
v850_set_data_area (decl, data_area_stack->data_area);
- /* Initialise the default names of the v850 specific sections,
+ /* Initialize the default names of the v850 specific sections,
if this has not been done before. */
if (GHS_default_section_names [(int) GHS_SECTION_KIND_SDATA] == NULL)
@@ -2817,6 +2942,392 @@ v850_insert_attributes (decl, attr_ptr)
}
}
}
+
+/* Return nonzero if the given RTX is suitable
+ for collapsing into a DISPOSE instruction. */
+
+int
+pattern_is_ok_for_dispose (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ int count = XVECLEN (op, 0);
+ int i;
+
+ /* If there are no registers to restore then
+ the dispose instruction is not suitable. */
+ if (count <= 2)
+ return 0;
+
+ /* The pattern matching has already established that we are performing a
+ function epilogue and that we are popping at least one register. We must
+ now check the remaining entries in the vector to make sure that they are
+ also register pops. There is no good reason why there should ever be
+ anything else in this vector, but being paranoid always helps...
+
+ The test below performs the C equivalent of this machine description
+ pattern match:
+
+ (set (match_operand:SI n "register_is_ok_for_epilogue" "r")
+ (mem:SI (plus:SI (reg:SI 3)
+ (match_operand:SI n "immediate_operand" "i"))))
+ */
+
+ for (i = 3; i < count; i++)
+ {
+ rtx vector_element = XVECEXP (op, 0, i);
+ rtx dest;
+ rtx src;
+ rtx plus;
+
+ if (GET_CODE (vector_element) != SET)
+ return 0;
+
+ dest = SET_DEST (vector_element);
+ src = SET_SRC (vector_element);
+
+ if ( GET_CODE (dest) != REG
+ || GET_MODE (dest) != SImode
+ || ! register_is_ok_for_epilogue (dest, SImode)
+ || GET_CODE (src) != MEM
+ || GET_MODE (src) != SImode)
+ return 0;
+
+ plus = XEXP (src, 0);
+
+ if ( GET_CODE (plus) != PLUS
+ || GET_CODE (XEXP (plus, 0)) != REG
+ || GET_MODE (XEXP (plus, 0)) != SImode
+ || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
+ || GET_CODE (XEXP (plus, 1)) != CONST_INT)
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Construct a DISPOSE instruction that is the equivalent of
+ the given RTX. We have already verified that this should
+ be possible. */
+
+char *
+construct_dispose_instruction (op)
+ rtx op;
+{
+ int count = XVECLEN (op, 0);
+ int stack_bytes;
+ unsigned long int mask;
+ int i;
+ static char buff[ 100 ]; /* XXX */
+ int use_callt = 0;
+
+ if (count <= 2)
+ {
+ error ("Bogus DISPOSE construction: %d\n", count);
+ return NULL;
+ }
+
+ /* Work out how many bytes to pop off the
+ stack before retrieving registers. */
+ if (GET_CODE (XVECEXP (op, 0, 1)) != SET)
+ abort ();
+ if (GET_CODE (SET_SRC (XVECEXP (op, 0, 1))) != PLUS)
+ abort ();
+ if (GET_CODE (XEXP (SET_SRC (XVECEXP (op, 0, 1)), 1)) != CONST_INT)
+ abort ();
+
+ stack_bytes = INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 1)), 1));
+
+ /* Each pop will remove 4 bytes from the stack... */
+ stack_bytes -= (count - 2) * 4;
+
+ /* Make sure that the amount we are popping
+ will fit into the DISPOSE instruction. */
+ if (stack_bytes > 128)
+ {
+ error ("Too much stack space to dispose of: %d", stack_bytes);
+ return NULL;
+ }
+
+ /* Now compute the bit mask of registers to push. */
+ mask = 0;
+
+ for (i = 2; i < count; i++)
+ {
+ rtx vector_element = XVECEXP (op, 0, i);
+
+ if (GET_CODE (vector_element) != SET)
+ abort ();
+ if (GET_CODE (SET_DEST (vector_element)) != REG)
+ abort ();
+ if (! register_is_ok_for_epilogue (SET_DEST (vector_element), SImode))
+ abort ();
+
+ if (REGNO (SET_DEST (vector_element)) == 2)
+ use_callt = 1;
+ else
+ mask |= 1 << REGNO (SET_DEST (vector_element));
+ }
+
+ if (! TARGET_DISABLE_CALLT
+ && (use_callt || stack_bytes == 0 || stack_bytes == 16))
+ {
+ if (use_callt)
+ {
+ sprintf (buff, "callt ctoff(__callt_return_r2_r%d)", (mask & (1 << 31)) ? 31 : 29);
+ return buff;
+ }
+ else
+ {
+ for (i = 20; i < 32; i++)
+ if (mask & (1 << i))
+ break;
+
+ if (i == 31)
+ sprintf (buff, "callt ctoff(__callt_return_r31c)");
+ else
+ sprintf (buff, "callt ctoff(__callt_return_r%d_r%d%s)",
+ i, (mask & (1 << 31)) ? 31 : 29, stack_bytes ? "c" : "");
+ }
+ }
+ else
+ {
+ static char regs [100]; /* XXX */
+ int done_one;
+
+ /* Generate the DISPOSE instruction. Note we could just issue the
+ bit mask as a number as the assembler can cope with this, but for
+ the sake of our readers we turn it into a textual description. */
+ regs[0] = 0;
+ done_one = 0;
+
+ for (i = 20; i < 32; i++)
+ {
+ if (mask & (1 << i))
+ {
+ int first;
+
+ if (done_one)
+ strcat (regs, ", ");
+ else
+ done_one = 1;
+
+ first = i;
+ strcat (regs, reg_names[ first ]);
+
+ for (i++; i < 32; i++)
+ if ((mask & (1 << i)) == 0)
+ break;
+
+ if (i > first + 1)
+ {
+ strcat (regs, " - ");
+ strcat (regs, reg_names[ i - 1 ] );
+ }
+ }
+ }
+
+ sprintf (buff, "dispose %d {%s}, r31", stack_bytes / 4, regs);
+ }
+
+ return buff;
+}
+
+/* Return nonzero if the given RTX is suitable
+ for collapsing into a PREPARE instruction. */
+
+int
+pattern_is_ok_for_prepare (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ int count = XVECLEN (op, 0);
+ int i;
+
+ /* If there are no registers to restore then the prepare instruction
+ is not suitable. */
+ if (count <= 1)
+ return 0;
+
+ /* The pattern matching has already established that we are adjusting the
+ stack and pushing at least one register. We must now check that the
+ remaining entries in the vector to make sure that they are also register
+ pushes.
+
+ The test below performs the C equivalent of this machine description
+ pattern match:
+
+ (set (mem:SI (plus:SI (reg:SI 3)
+ (match_operand:SI 2 "immediate_operand" "i")))
+ (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))
+
+ */
+
+ for (i = 2; i < count; i++)
+ {
+ rtx vector_element = XVECEXP (op, 0, i);
+ rtx dest;
+ rtx src;
+ rtx plus;
+
+ if (GET_CODE (vector_element) != SET)
+ return 0;
+
+ dest = SET_DEST (vector_element);
+ src = SET_SRC (vector_element);
+
+ if ( GET_CODE (dest) != MEM
+ || GET_MODE (dest) != SImode
+ || GET_CODE (src) != REG
+ || GET_MODE (src) != SImode
+ || ! register_is_ok_for_epilogue (src, SImode)
+ )
+ return 0;
+
+ plus = XEXP (dest, 0);
+
+ if ( GET_CODE (plus) != PLUS
+ || GET_CODE (XEXP (plus, 0)) != REG
+ || GET_MODE (XEXP (plus, 0)) != SImode
+ || REGNO (XEXP (plus, 0)) != STACK_POINTER_REGNUM
+ || GET_CODE (XEXP (plus, 1)) != CONST_INT)
+ return 0;
+
+ /* If the register is being pushed somewhere other than the stack
+ space just aquired by the first operand then abandon this quest.
+ Note: the test is <= becuase both values are negative. */
+ if (INTVAL (XEXP (plus, 1))
+ <= INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)))
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Construct a PREPARE instruction that is the equivalent of
+ the given RTL. We have already verified that this should
+ be possible. */
+
+char *
+construct_prepare_instruction (op)
+ rtx op;
+{
+ int count = XVECLEN (op, 0);
+ int stack_bytes;
+ unsigned long int mask;
+ int i;
+ static char buff[ 100 ]; /* XXX */
+ int use_callt = 0;
+
+ if (count <= 1)
+ {
+ error ("Bogus PREPEARE construction: %d\n", count);
+ return NULL;
+ }
+
+ /* Work out how many bytes to push onto
+ the stack after storing the registers. */
+ if (GET_CODE (XVECEXP (op, 0, 0)) != SET)
+ abort ();
+ if (GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != PLUS)
+ abort ();
+ if (GET_CODE (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)) != CONST_INT)
+ abort ();
+
+ stack_bytes = INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1));
+
+ /* Each push will put 4 bytes from the stack. */
+ stack_bytes += (count - 1) * 4;
+
+ /* Make sure that the amount we are popping
+ will fit into the DISPOSE instruction. */
+ if (stack_bytes < -128)
+ {
+ error ("Too much stack space to prepare: %d", stack_bytes);
+ return NULL;
+ }
+
+ /* Now compute the bit mask of registers to push. */
+ mask = 0;
+ for (i = 1; i < count; i++)
+ {
+ rtx vector_element = XVECEXP (op, 0, i);
+
+ if (GET_CODE (vector_element) != SET)
+ abort ();
+ if (GET_CODE (SET_SRC (vector_element)) != REG)
+ abort ();
+ if (! register_is_ok_for_epilogue (SET_SRC (vector_element), SImode))
+ abort ();
+
+ if (REGNO (SET_SRC (vector_element)) == 2)
+ use_callt = 1;
+ else
+ mask |= 1 << REGNO (SET_SRC (vector_element));
+ }
+
+ if ((! TARGET_DISABLE_CALLT)
+ && (use_callt || stack_bytes == 0 || stack_bytes == -16))
+ {
+ if (use_callt)
+ {
+ sprintf (buff, "callt ctoff(__callt_save_r2_r%d)", (mask & (1 << 31)) ? 31 : 29 );
+ return buff;
+ }
+
+ for (i = 20; i < 32; i++)
+ if (mask & (1 << i))
+ break;
+
+ if (i == 31)
+ sprintf (buff, "callt ctoff(__callt_save_r31c)");
+ else
+ sprintf (buff, "callt ctoff(__callt_save_r%d_r%d%s)",
+ i, (mask & (1 << 31)) ? 31 : 29, stack_bytes ? "c" : "");
+ }
+ else
+ {
+ static char regs [100]; /* XXX */
+ int done_one;
+
+
+ /* Generate the PREPARE instruction. Note we could just issue the
+ bit mask as a number as the assembler can cope with this, but for
+ the sake of our readers we turn it into a textual description. */
+ regs[0] = 0;
+ done_one = 0;
+
+ for (i = 20; i < 32; i++)
+ {
+ if (mask & (1 << i))
+ {
+ int first;
+
+ if (done_one)
+ strcat (regs, ", ");
+ else
+ done_one = 1;
+
+ first = i;
+ strcat (regs, reg_names[ first ]);
+
+ for (i++; i < 32; i++)
+ if ((mask & (1 << i)) == 0)
+ break;
+
+ if (i > first + 1)
+ {
+ strcat (regs, " - ");
+ strcat (regs, reg_names[ i - 1 ] );
+ }
+ }
+ }
+
+ sprintf (buff, "prepare {%s}, %d", regs, (- stack_bytes) / 4);
+ }
+
+ return buff;
+}
/* Implement `va_arg'. */
diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h
index aff42cb319e..aab4dd94d0b 100644
--- a/gcc/config/v850/v850.h
+++ b/gcc/config/v850/v850.h
@@ -3,22 +3,22 @@
Free Software Foundation, Inc.
Contributed by Jeff Law (law@cygnus.com).
-This file is part of GNU CC.
+ 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 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.
+ 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. */
+ 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. */
#ifndef GCC_V850_H
#define GCC_V850_H
@@ -31,8 +31,8 @@ Boston, MA 02111-1307, USA. */
#undef STARTFILE_SPEC
#undef ASM_SPEC
-
#define TARGET_CPU_generic 1
+#define TARGET_CPU_v850e 2
#ifndef TARGET_CPU_DEFAULT
#define TARGET_CPU_DEFAULT TARGET_CPU_generic
@@ -43,9 +43,22 @@ Boston, MA 02111-1307, USA. */
#define SUBTARGET_CPP_SPEC "%{!mv*:-D__v850__}"
#define TARGET_VERSION fprintf (stderr, " (NEC V850)");
+/* Choose which processor will be the default.
+ We must pass a -mv850xx option to the assembler if no explicit -mv* option
+ is given, because the assembler's processor default may not be correct. */
+#if TARGET_CPU_DEFAULT == TARGET_CPU_v850e
+#undef MASK_DEFAULT
+#define MASK_DEFAULT MASK_V850E
+#undef SUBTARGET_ASM_SPEC
+#define SUBTARGET_ASM_SPEC "%{!mv*:-mv850e}"
+#undef SUBTARGET_CPP_SPEC
+#define SUBTARGET_CPP_SPEC "%{!mv*:-D__v850e__}"
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (NEC V850E)");
+#endif
#define ASM_SPEC "%{mv*:-mv%*}"
-#define CPP_SPEC "%{mv850ea:-D__v850ea__} %{mv850e:-D__v850e__} %{mv850:-D__v850__} %(subtarget_cpp_spec)"
+#define CPP_SPEC "%{mv850e:-D__v850e__} %{mv850:-D__v850__} %(subtarget_cpp_spec)"
#define EXTRA_SPECS \
{ "subtarget_asm_spec", SUBTARGET_ASM_SPEC }, \
@@ -67,8 +80,16 @@ extern int target_flags;
#define MASK_CPU 0x00000030
#define MASK_V850 0x00000010
+#define MASK_V850E 0x00000020
+#define MASK_SMALL_SLD 0x00000040
#define MASK_BIG_SWITCH 0x00000100
+#define MASK_NO_APP_REGS 0x00000200
+#define MASK_DISABLE_CALLT 0x00000400
+#define MASK_STRICT_ALIGN 0x00000800
+
+#define MASK_US_BIT_SET 0x00001000
+#define MASK_US_MASK_SET 0x00002000
/* Macros used in the machine description to test the flags. */
@@ -107,8 +128,25 @@ extern int target_flags;
/* Whether to emit 2 byte per entry or 4 byte per entry switch tables. */
#define TARGET_BIG_SWITCH (target_flags & MASK_BIG_SWITCH)
-/* General debug flag */
-#define TARGET_DEBUG (target_flags & MASK_DEBUG)
+/* General debug flag. */
+#define TARGET_DEBUG (target_flags & MASK_DEBUG)
+#define TARGET_V850E ((target_flags & MASK_V850E) == MASK_V850E)
+
+#define TARGET_US_BIT_SET (target_flags & MASK_US_BIT_SET)
+
+/* Whether to assume that the SLD.B and SLD.H instructions only have small
+ displacement fields, thus allowing the generated code to run on any of
+ the V850 range of processors. */
+#define TARGET_SMALL_SLD (target_flags & MASK_SMALL_SLD)
+
+/* True if callt will not be used for function prolog & epilog. */
+#define TARGET_DISABLE_CALLT (target_flags & MASK_DISABLE_CALLT)
+
+/* False if r2 and r5 can be used by the compiler. True if r2
+ and r5 are to be fixed registers (for compatibility with GHS). */
+#define TARGET_NO_APP_REGS (target_flags & MASK_NO_APP_REGS)
+
+#define TARGET_STRICT_ALIGN (target_flags & MASK_STRICT_ALIGN)
/* Macro to define tables used to set the flags.
This is a list in braces of pairs in braces,
@@ -134,6 +172,22 @@ extern int target_flags;
{ "v850", MASK_V850, \
N_("Compile for the v850 processor") }, \
{ "v850", -(MASK_V850 ^ MASK_CPU), "" }, \
+ { "v850e", MASK_V850E, N_("Compile for v850e processor") }, \
+ { "v850e", -(MASK_V850E ^ MASK_CPU), "" }, /* Make sure that the other bits are cleared. */ \
+ { "small-sld", MASK_SMALL_SLD, N_("Enable the use of the short load instructions") }, \
+ { "no-small-sld", -MASK_SMALL_SLD, "" }, \
+ { "disable-callt", MASK_DISABLE_CALLT, \
+ N_("Do not use the callt instruction") }, \
+ { "no-disable-callt", -MASK_DISABLE_CALLT, "" }, \
+ { "US-bit-set", (MASK_US_BIT_SET | MASK_US_MASK_SET), "" }, \
+ { "no-US-bit-set", -MASK_US_BIT_SET, "" }, \
+ { "no-US-bit-set", MASK_US_MASK_SET, "" }, \
+ { "app-regs", -MASK_NO_APP_REGS, "" }, \
+ { "no-app-regs", MASK_NO_APP_REGS, \
+ N_("Do not use registers r2 and r5") }, \
+ { "strict-align", MASK_STRICT_ALIGN, \
+ N_("Enfore strict alignment") }, \
+ { "no-strict-align", -MASK_STRICT_ALIGN, "" }, \
{ "big-switch", MASK_BIG_SWITCH, \
N_("Use 4 byte entries in switch tables") },\
{ "", MASK_DEFAULT, ""}}
@@ -195,7 +249,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
LEVEL is the optimization level specified; 2 if `-O2' is
specified, 1 if `-O' is specified, and 0 if neither is specified.
- SIZE is non-zero if `-Os' is specified, 0 otherwise.
+ SIZE is nonzero if `-Os' is specified, 0 otherwise.
You should not use this macro to change options that are not
machine-specific. These should uniformly selected by the same
@@ -207,6 +261,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
#define OPTIMIZATION_OPTIONS(LEVEL,SIZE) \
{ \
+ target_flags |= MASK_STRICT_ALIGN; \
if (LEVEL) \
target_flags |= (MASK_EP | MASK_PROLOG_FUNCTION); \
}
@@ -266,7 +321,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
/* Define this if move instructions will actually fail to work
when given unaligned data. */
-#define STRICT_ALIGNMENT 1
+#define STRICT_ALIGNMENT TARGET_STRICT_ALIGN
/* Define this as 1 if `char' should by default be signed; else as 0.
@@ -327,6 +382,17 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
0, 1, 3, 4, 5, 30, 32, 33 /* fixed registers */ \
}
+/* If TARGET_NO_APP_REGS is not defined then add r2 and r5 to
+ the pool of fixed registers. See PR 14505. */
+#define CONDITIONAL_REGISTER_USAGE \
+{ \
+ if (TARGET_NO_APP_REGS) \
+ { \
+ fixed_regs[2] = 1; call_used_regs[2] = 1; \
+ fixed_regs[5] = 1; call_used_regs[5] = 1; \
+ } \
+}
+
/* Return number of consecutive hard regs needed starting at reg REGNO
to hold something of mode MODE.
@@ -457,11 +523,11 @@ enum reg_class
#define CONST_OK_FOR_M(VALUE) ((unsigned)(VALUE) < 0x10000)
/* 5 bit unsigned immediate in shift instructions */
#define CONST_OK_FOR_N(VALUE) ((unsigned) (VALUE) <= 31)
+/* 9 bit signed immediate for word multiply instruction. */
+#define CONST_OK_FOR_O(VALUE) ((unsigned) (VALUE) + 0x100 < 0x200)
-#define CONST_OK_FOR_O(VALUE) 0
#define CONST_OK_FOR_P(VALUE) 0
-
#define CONST_OK_FOR_LETTER_P(VALUE, C) \
((C) == 'I' ? CONST_OK_FOR_I (VALUE) : \
(C) == 'J' ? CONST_OK_FOR_J (VALUE) : \
@@ -598,7 +664,7 @@ enum reg_class
{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \
{ ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }} \
-/* A C expression that returns non-zero if the compiler is allowed to
+/* A C expression that returns nonzero if the compiler is allowed to
try to replace register number FROM-REG with register number
TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is
defined, and will usually be the constant 1, since most of the
@@ -647,7 +713,7 @@ enum reg_class
such as FUNCTION_ARG to determine where the next arg should go. */
#define CUMULATIVE_ARGS struct cum_arg
-struct cum_arg { int nbytes; };
+struct cum_arg { int nbytes; int anonymous_args; };
/* Define where to put the arguments to a function.
Value is zero to push the argument on the stack,
@@ -673,7 +739,7 @@ struct cum_arg { int nbytes; };
For a library call, FNTYPE is 0. */
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \
- ((CUM).nbytes = 0)
+ ((CUM).nbytes = 0, (CUM).anonymous_args = 0)
/* Update the data in CUM to advance over an argument
of mode MODE and data type TYPE.
@@ -692,10 +758,9 @@ struct cum_arg { int nbytes; };
space allocated by the caller. */
#define OUTGOING_REG_PARM_STACK_SPACE
-extern int current_function_anonymous_args;
/* Do any setup necessary for varargs/stdargs functions. */
#define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PAS, SECOND) \
- current_function_anonymous_args = (!TARGET_GHS ? 1 : 0);
+ (CUM).anonymous_args = (!TARGET_GHS ? 1 : 0);
/* Implement `va_arg'. */
#define EXPAND_BUILTIN_VA_ARG(valist, type) \
@@ -747,6 +812,12 @@ extern int current_function_anonymous_args;
#define EXIT_IGNORE_STACK 1
+/* Define this macro as a C expression that is nonzero for registers
+ used by the epilogue or the `return' pattern. */
+
+#define EPILOGUE_USES(REGNO) \
+ (reload_completed && (REGNO) == LINK_POINTER_REGNUM)
+
/* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */
@@ -851,7 +922,7 @@ extern int current_function_anonymous_args;
((C) == 'Q' ? ep_memory_operand (OP, GET_MODE (OP), 0) \
: (C) == 'R' ? special_symbolref_operand (OP, VOIDmode) \
: (C) == 'S' ? (GET_CODE (OP) == SYMBOL_REF && ! ZDA_NAME_P (XSTR (OP, 0))) \
- : (C) == 'T' ? 0 \
+ : (C) == 'T' ? ep_memory_operand(OP,GET_MODE(OP),TRUE) \
: (C) == 'U' ? ((GET_CODE (OP) == SYMBOL_REF && ZDA_NAME_P (XSTR (OP, 0))) \
|| (GET_CODE (OP) == CONST \
&& GET_CODE (XEXP (OP, 0)) == PLUS \
@@ -989,8 +1060,27 @@ do { \
#define RTX_COSTS(RTX,CODE,OUTER_CODE) \
case MOD: \
case DIV: \
+ case UMOD: \
+ case UDIV: \
+ if (TARGET_V850E && optimize_size) \
+ return 6; \
return 60; \
case MULT: \
+ if (TARGET_V850E \
+ && ( GET_MODE (RTX) == SImode \
+ || GET_MODE (RTX) == HImode \
+ || GET_MODE (RTX) == QImode)) \
+ { \
+ if (GET_CODE (XEXP (RTX, 1)) == REG) \
+ return 4; \
+ else if (GET_CODE (XEXP (RTX, 1)) == CONST_INT) \
+ { \
+ if (CONST_OK_FOR_O (INTVAL (XEXP (RTX, 1)))) \
+ return 6; \
+ else if (CONST_OK_FOR_K (INTVAL (XEXP (RTX, 1)))) \
+ return 10; \
+ } \
+ } \
return 20;
/* All addressing modes have the same cost on the V850 series. */
@@ -1136,17 +1226,9 @@ zbss_section () \
#undef USER_LABEL_PREFIX
#define USER_LABEL_PREFIX "_"
-/* When assemble_integer is used to emit the offsets for a switch
- table it can encounter (TRUNCATE:HI (MINUS:SI (LABEL_REF:SI) (LABEL_REF:SI))).
- output_addr_const will normally barf at this, but it is OK to omit
- the truncate and just emit the difference of the two labels. The
- .hword directive will automatically handle the truncation for us. */
-
-#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL) \
- if (GET_CODE (x) == TRUNCATE) \
- output_addr_const (FILE, XEXP (X, 0)); \
- else \
- goto FAIL;
+#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL) \
+ if (! v850_output_addr_const_extra (FILE, X)) \
+ goto FAIL
/* This says how to output the assembler to define a global
uninitialized but not common symbol. */
@@ -1182,13 +1264,7 @@ zbss_section () \
#define ASM_OUTPUT_LABELREF(FILE, NAME) \
asm_fprintf (FILE, "%U%s", (*targetm.strip_name_encoding) (NAME))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
+#define ASM_PN_FORMAT "%s___%lu"
/* This is how we tell the assembler that two symbols have the same value. */
@@ -1243,10 +1319,12 @@ zbss_section () \
/* This is how to output an element of a case-vector that is relative. */
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
- fprintf (FILE, "\t%s .L%d-.L%d\n", \
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
+ fprintf (FILE, "\t%s %s.L%d-.L%d%s\n", \
(TARGET_BIG_SWITCH ? ".long" : ".short"), \
- VALUE, REL)
+ (! TARGET_BIG_SWITCH && TARGET_V850E ? "(" : ""), \
+ VALUE, REL, \
+ (! TARGET_BIG_SWITCH && TARGET_V850E ? ")>>1" : ""))
#define ASM_OUTPUT_ALIGN(FILE, LOG) \
if ((LOG) != 0) \
@@ -1307,6 +1385,23 @@ zbss_section () \
#define STORE_FLAG_VALUE 1
+#define MULDI3_LIBCALL "__muldi3"
+#define UCMPDI2_LIBCALL "__ucmpdi2"
+#define CMPDI2_LIBCALL "__cmpdi2"
+#define NEGDI2_LIBCALL "__negdi2"
+
+#define INIT_TARGET_OPTABS \
+ do \
+ { \
+ cmp_optab->handlers[(int) DImode].libfunc \
+ = init_one_libfunc (CMPDI2_LIBCALL); \
+ ucmp_optab->handlers[(int) DImode].libfunc \
+ = init_one_libfunc (UCMPDI2_LIBCALL); \
+ neg_optab->handlers[(int) DImode].libfunc \
+ = init_one_libfunc (NEGDI2_LIBCALL); \
+ } \
+ while (0)
+
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction
between pointers and any other objects of this machine mode. */
@@ -1417,6 +1512,8 @@ extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_K
#define PREDICATE_CODES \
{ "reg_or_0_operand", { REG, SUBREG, CONST_INT, CONST_DOUBLE }}, \
{ "reg_or_int5_operand", { REG, SUBREG, CONST_INT }}, \
+{ "reg_or_int9_operand", { REG, SUBREG, CONST_INT }}, \
+{ "reg_or_const_operand", { REG, CONST_INT }}, \
{ "call_address_operand", { REG, SYMBOL_REF }}, \
{ "movsi_source_operand", { LABEL_REF, SYMBOL_REF, CONST_INT, \
CONST_DOUBLE, CONST, HIGH, MEM, \
@@ -1426,6 +1523,9 @@ extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_K
{ "pattern_is_ok_for_prologue", { PARALLEL }}, \
{ "pattern_is_ok_for_epilogue", { PARALLEL }}, \
{ "register_is_ok_for_epilogue",{ REG }}, \
+{ "pattern_is_ok_for_dispose", { PARALLEL }}, \
+{ "pattern_is_ok_for_prepare", { PARALLEL }}, \
+{ "register_is_ok_for_dispose", { REG }}, \
{ "not_power_of_two_operand", { CONST_INT }},
#endif /* ! GCC_V850_H */
diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md
index 354dc111ba4..5acbb855f81 100644
--- a/gcc/config/v850/v850.md
+++ b/gcc/config/v850/v850.md
@@ -1,5 +1,5 @@
;; GCC machine description for NEC V850
-;; Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc.
;; Contributed by Jeff Law (law@cygnus.com).
;; This file is part of GNU CC.
@@ -33,7 +33,7 @@
;; The size of instructions in bytes.
(define_attr "length" ""
- (const_int 200))
+ (const_int 4))
(define_attr "long_calls" "yes,no"
(const (if_then_else (symbol_ref "TARGET_LONG_CALLS")
@@ -153,6 +153,7 @@
must be done with HIGH & LO_SUM patterns. */
if (CONSTANT_P (operands[1])
&& GET_CODE (operands[1]) != HIGH
+ && ! TARGET_V850E
&& !special_symbolref_operand (operands[1], VOIDmode)
&& !(GET_CODE (operands[1]) == CONST_INT
&& (CONST_OK_FOR_J (INTVAL (operands[1]))
@@ -174,6 +175,24 @@
}
}")
+;; This is the same as the following pattern, except that it includes
+;; support for arbitrary 32 bit immediates.
+
+;; ??? This always loads addresses using hilo. If the only use of this address
+;; was in a load/store, then we would get smaller code if we only loaded the
+;; upper part with hi, and then put the lower part in the load/store insn.
+
+(define_insn "*movsi_internal_v850e"
+ [(set (match_operand:SI 0 "general_operand" "=r,r,r,r,Q,r,r,m,m,r")
+ (match_operand:SI 1 "general_operand" "Jr,K,L,Q,Ir,m,R,r,I,i"))]
+ "TARGET_V850E
+ && (register_operand (operands[0], SImode)
+ || reg_or_0_operand (operands[1], SImode))"
+ "* return output_move_single (operands);"
+ [(set_attr "length" "2,4,4,2,2,4,4,4,4,6")
+ (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit")
+ (set_attr "type" "other,other,other,load,other,load,other,other,other,other")])
+
(define_insn "*movsi_internal"
[(set (match_operand:SI 0 "general_operand" "=r,r,r,r,Q,r,r,m,m")
(match_operand:SI 1 "movsi_source_operand" "Jr,K,L,Q,Ir,m,R,r,I"))]
@@ -377,6 +396,93 @@
(set_attr "cc" "none_0hit,none_0hit")
(set_attr "type" "mult")])
+;; ??? The scheduling info is probably wrong.
+
+;; ??? This instruction can also generate the 32 bit highpart, but using it
+;; may increase code size counter to the desired result.
+
+;; ??? This instructions can also give a DImode result.
+
+;; ??? There is unsigned version, but it matters only for the DImode/highpart
+;; results.
+
+(define_insn "mulsi3"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "reg_or_int9_operand" "rO")))]
+ "TARGET_V850E"
+ "mul %2,%1,%."
+ [(set_attr "length" "4")
+ (set_attr "cc" "none_0hit")
+ (set_attr "type" "mult")])
+
+;; ----------------------------------------------------------------------
+;; DIVIDE INSTRUCTIONS
+;; ----------------------------------------------------------------------
+
+;; ??? These insns do set the Z/N condition codes, except that they are based
+;; on only one of the two results, so it doesn't seem to make sense to use
+;; them.
+
+;; ??? The scheduling info is probably wrong.
+
+(define_insn "divmodsi4"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (div:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "register_operand" "r")))
+ (set (match_operand:SI 3 "register_operand" "=r")
+ (mod:SI (match_dup 1)
+ (match_dup 2)))]
+ "TARGET_V850E"
+ "div %2,%0,%3"
+ [(set_attr "length" "4")
+ (set_attr "cc" "clobber")
+ (set_attr "type" "other")])
+
+(define_insn "udivmodsi4"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (udiv:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "register_operand" "r")))
+ (set (match_operand:SI 3 "register_operand" "=r")
+ (umod:SI (match_dup 1)
+ (match_dup 2)))]
+ "TARGET_V850E"
+ "divu %2,%0,%3"
+ [(set_attr "length" "4")
+ (set_attr "cc" "clobber")
+ (set_attr "type" "other")])
+
+;; ??? There is a 2 byte instruction for generating only the quotient.
+;; However, it isn't clear how to compute the length field correctly.
+
+(define_insn "divmodhi4"
+ [(set (match_operand:HI 0 "register_operand" "=r")
+ (div:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "register_operand" "r")))
+ (set (match_operand:HI 3 "register_operand" "=r")
+ (mod:HI (match_dup 1)
+ (match_dup 2)))]
+ "TARGET_V850E"
+ "divh %2,%0,%3"
+ [(set_attr "length" "4")
+ (set_attr "cc" "clobber")
+ (set_attr "type" "other")])
+
+;; Half-words are sign-extended by default, so we must zero extend to a word
+;; here before doing the divide.
+
+(define_insn "udivmodhi4"
+ [(set (match_operand:HI 0 "register_operand" "=r")
+ (udiv:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "register_operand" "r")))
+ (set (match_operand:HI 3 "register_operand" "=r")
+ (umod:HI (match_dup 1)
+ (match_dup 2)))]
+ "TARGET_V850E"
+ "zxh %0 ; divhu %2,%0,%3"
+ [(set_attr "length" "4")
+ (set_attr "cc" "clobber")
+ (set_attr "type" "other")])
;; ----------------------------------------------------------------------
;; AND INSTRUCTIONS
@@ -734,6 +840,243 @@
[(set_attr "length" "4")
(set_attr "cc" "none_0hit")])
+;; ----------------------------------------------------------------------
+;; CONDITIONAL MOVE INSTRUCTIONS
+;; ----------------------------------------------------------------------
+
+;; Instructions using cc0 aren't allowed to have input reloads, so we must
+;; hide the fact that this instruction uses cc0. We do so by including the
+;; compare instruction inside it.
+
+;; ??? This is very ugly. The right way to do this is to modify cmpsi so
+;; that it doesn't emit RTL, and then modify the bcc/scc patterns so that
+;; they emit RTL for the compare instruction. Unfortunately, this requires
+;; lots of changes that will be hard to sanitize. So for now, cmpsi still
+;; emits RTL, and I get the compare operands here from the previous insn.
+
+(define_expand "movsicc"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (if_then_else:SI
+ (match_operator 1 "comparison_operator"
+ [(match_dup 4) (match_dup 5)])
+ (match_operand:SI 2 "reg_or_const_operand" "rJ")
+ (match_operand:SI 3 "reg_or_const_operand" "rI")))]
+ "TARGET_V850E"
+ "
+{
+ rtx insn = get_last_insn_anywhere ();
+
+ if ( (GET_CODE (operands[2]) == CONST_INT
+ && GET_CODE (operands[3]) == CONST_INT))
+ {
+ int o2 = INTVAL (operands[2]);
+ int o3 = INTVAL (operands[3]);
+
+ if (o2 == 1 && o3 == 0)
+ FAIL; /* setf */
+ if (o3 == 1 && o2 == 0)
+ FAIL; /* setf */
+ if (o2 == 0 && (o3 < -16 || o3 > 15) && exact_log2 (o3) >= 0)
+ FAIL; /* setf + shift */
+ if (o3 == 0 && (o2 < -16 || o2 > 15) && exact_log2 (o2) >=0)
+ FAIL; /* setf + shift */
+ if (o2 != 0)
+ operands[2] = copy_to_mode_reg (SImode, operands[2]);
+ if (o3 !=0 )
+ operands[3] = copy_to_mode_reg (SImode, operands[3]);
+ }
+ else
+ {
+ if (GET_CODE (operands[2]) != REG)
+ operands[2] = copy_to_mode_reg (SImode,operands[2]);
+ if (GET_CODE (operands[3]) != REG)
+ operands[3] = copy_to_mode_reg (SImode, operands[3]);
+ }
+ if (GET_CODE (insn) == INSN
+ && GET_CODE (PATTERN (insn)) == SET
+ && SET_DEST (PATTERN (insn)) == cc0_rtx)
+ {
+ rtx src = SET_SRC (PATTERN (insn));
+
+ if (GET_CODE (src) == COMPARE)
+ {
+ operands[4] = XEXP (src, 0);
+ operands[5] = XEXP (src, 1);
+ }
+ else if (GET_CODE (src) == REG
+ || GET_CODE (src) == SUBREG)
+ {
+ operands[4] = src;
+ operands[5] = const0_rtx;
+ }
+ else
+ abort ();
+ }
+ else
+ abort ();
+}")
+
+;; ??? Clobbering the condition codes is overkill.
+
+;; ??? We sometimes emit an unnecessary compare instruction because the
+;; condition codes may have already been set by an earlier instruction,
+;; but we have no code here to avoid the compare if it is unnecessary.
+
+(define_insn "*movsicc_normal"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (if_then_else:SI
+ (match_operator 1 "comparison_operator"
+ [(match_operand:SI 4 "register_operand" "r")
+ (match_operand:SI 5 "reg_or_int5_operand" "rJ")])
+ (match_operand:SI 2 "reg_or_int5_operand" "rJ")
+ (match_operand:SI 3 "reg_or_0_operand" "rI")))]
+ "TARGET_V850E"
+ "cmp %5,%4 ; cmov %c1,%2,%z3,%0"
+ [(set_attr "length" "6")
+ (set_attr "cc" "clobber")])
+
+(define_insn "*movsicc_reversed"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (if_then_else:SI
+ (match_operator 1 "comparison_operator"
+ [(match_operand:SI 4 "register_operand" "r")
+ (match_operand:SI 5 "reg_or_int5_operand" "rJ")])
+ (match_operand:SI 2 "reg_or_0_operand" "rI")
+ (match_operand:SI 3 "reg_or_int5_operand" "rJ")))]
+ "TARGET_V850E"
+ "cmp %5,%4 ; cmov %C1,%3,%z2,%0"
+ [(set_attr "length" "6")
+ (set_attr "cc" "clobber")])
+
+(define_insn "*movsicc_tst1"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (if_then_else:SI
+ (match_operator 1 "comparison_operator"
+ [(zero_extract:SI
+ (match_operand:QI 2 "memory_operand" "m")
+ (const_int 1)
+ (match_operand 3 "const_int_operand" "n"))
+ (const_int 0)])
+ (match_operand:SI 4 "reg_or_int5_operand" "rJ")
+ (match_operand:SI 5 "reg_or_0_operand" "rI")))]
+ "TARGET_V850E"
+ "tst1 %3,%2 ; cmov %c1,%4,%z5,%0"
+ [(set_attr "length" "8")
+ (set_attr "cc" "clobber")])
+
+(define_insn "*movsicc_tst1_reversed"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (if_then_else:SI
+ (match_operator 1 "comparison_operator"
+ [(zero_extract:SI
+ (match_operand:QI 2 "memory_operand" "m")
+ (const_int 1)
+ (match_operand 3 "const_int_operand" "n"))
+ (const_int 0)])
+ (match_operand:SI 4 "reg_or_0_operand" "rI")
+ (match_operand:SI 5 "reg_or_int5_operand" "rJ")))]
+ "TARGET_V850E"
+ "tst1 %3,%2 ; cmov %C1,%5,%z4,%0"
+ [(set_attr "length" "8")
+ (set_attr "cc" "clobber")])
+
+;; Matching for sasf requires combining 4 instructions, so we provide a
+;; dummy pattern to match the first 3, which will always be turned into the
+;; second pattern by subsequent combining. As above, we must include the
+;; comparison to avoid input reloads in an insn using cc0.
+
+(define_insn "*sasf_1"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (ior:SI (match_operator 1 "comparison_operator" [(cc0) (const_int 0)])
+ (ashift:SI (match_operand:SI 2 "register_operand" "")
+ (const_int 1))))]
+ "TARGET_V850E"
+ "* abort ();")
+
+(define_insn "*sasf_2"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (ior:SI
+ (match_operator 1 "comparison_operator"
+ [(match_operand:SI 3 "register_operand" "r")
+ (match_operand:SI 4 "reg_or_int5_operand" "rJ")])
+ (ashift:SI (match_operand:SI 2 "register_operand" "0")
+ (const_int 1))))]
+ "TARGET_V850E"
+ "cmp %4,%3 ; sasf %c1,%0"
+ [(set_attr "length" "6")
+ (set_attr "cc" "clobber")])
+
+(define_split
+ [(set (match_operand:SI 0 "register_operand" "")
+ (if_then_else:SI
+ (match_operator 1 "comparison_operator"
+ [(match_operand:SI 4 "register_operand" "")
+ (match_operand:SI 5 "reg_or_int5_operand" "")])
+ (match_operand:SI 2 "const_int_operand" "")
+ (match_operand:SI 3 "const_int_operand" "")))]
+ "TARGET_V850E
+ && ((INTVAL (operands[2]) ^ INTVAL (operands[3])) == 1)
+ && ((INTVAL (operands[2]) + INTVAL (operands[3])) != 1)
+ && (GET_CODE (operands[5]) == CONST_INT
+ || REGNO (operands[0]) != REGNO (operands[5]))
+ && REGNO (operands[0]) != REGNO (operands[4])"
+ [(set (match_dup 0) (match_dup 6))
+ (set (match_dup 0)
+ (ior:SI (match_op_dup 7 [(match_dup 4) (match_dup 5)])
+ (ashift:SI (match_dup 0) (const_int 1))))]
+ "
+{
+ operands[6] = GEN_INT (INTVAL (operands[2]) >> 1);
+ if (INTVAL (operands[2]) & 0x1)
+ operands[7] = operands[1];
+ else
+ operands[7] = gen_rtx (reverse_condition (GET_CODE (operands[1])),
+ GET_MODE (operands[1]), XEXP (operands[1], 0),
+ XEXP (operands[1], 1));
+}")
+;; ---------------------------------------------------------------------
+;; BYTE SWAP INSTRUCTIONS
+;; ---------------------------------------------------------------------
+
+(define_expand "rotlhi3"
+ [(set (match_operand:HI 0 "register_operand" "")
+ (rotate:HI (match_operand:HI 1 "register_operand" "")
+ (match_operand:HI 2 "const_int_operand" "")))]
+ "TARGET_V850E"
+ "
+{
+ if (INTVAL (operands[2]) != 8)
+ FAIL;
+}")
+
+(define_insn "*rotlhi3_8"
+ [(set (match_operand:HI 0 "register_operand" "=r")
+ (rotate:HI (match_operand:HI 1 "register_operand" "r")
+ (const_int 8)))]
+ "TARGET_V850E"
+ "bsh %1,%0"
+ [(set_attr "length" "4")
+ (set_attr "cc" "clobber")])
+
+(define_expand "rotlsi3"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (rotate:SI (match_operand:SI 1 "register_operand" "")
+ (match_operand:SI 2 "const_int_operand" "")))]
+ "TARGET_V850E"
+ "
+{
+ if (INTVAL (operands[2]) != 16)
+ FAIL;
+}")
+
+(define_insn "*rotlsi3_16"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (rotate:SI (match_operand:SI 1 "register_operand" "r")
+ (const_int 16)))]
+ "TARGET_V850E"
+ "hsw %1,%0"
+ [(set_attr "length" "4")
+ (set_attr "cc" "clobber")])
;; ----------------------------------------------------------------------
;; JUMP INSTRUCTIONS
@@ -921,6 +1264,20 @@
[(set_attr "length" "2")
(set_attr "cc" "none")])
+(define_insn "switch"
+ [(set (pc)
+ (plus:SI
+ (sign_extend:SI
+ (mem:HI
+ (plus:SI (ashift:SI (match_operand:SI 0 "register_operand" "r")
+ (const_int 1))
+ (label_ref (match_operand 1 "" "")))))
+ (label_ref (match_dup 1))))]
+ "TARGET_V850E"
+ "switch %0"
+ [(set_attr "length" "2")
+ (set_attr "cc" "none")])
+
(define_expand "casesi"
[(match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "register_operand" "")
@@ -940,6 +1297,12 @@
/* Branch to the default label if out of range of the table. */
emit_jump_insn (gen_bgtu (operands[4]));
+ if (! TARGET_BIG_SWITCH && TARGET_V850E)
+ {
+ emit_jump_insn (gen_switch (reg, operands[3]));
+ DONE;
+ }
+
/* Shift index for the table array access. */
emit_insn (gen_ashlsi3 (reg, reg, GEN_INT (TARGET_BIG_SWITCH ? 2 : 1)));
/* Load the table address into a pseudo. */
@@ -1084,6 +1447,18 @@
;; EXTEND INSTRUCTIONS
;; ----------------------------------------------------------------------
+(define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
+ (zero_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "0,r,T,m")))]
+ "TARGET_V850E"
+ "@
+ zxh %0
+ andi 65535,%1,%0
+ sld.hu %1,%0
+ ld.hu %1,%0"
+ [(set_attr "length" "2,4,2,4")
+ (set_attr "cc" "none_0hit,set_znv,none_0hit,none_0hit")])
(define_insn "zero_extendhisi2"
[(set (match_operand:SI 0 "register_operand" "=r")
@@ -1094,6 +1469,18 @@
[(set_attr "length" "4")
(set_attr "cc" "set_znv")])
+(define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
+ (zero_extend:SI
+ (match_operand:QI 1 "nonimmediate_operand" "0,r,T,m")))]
+ "TARGET_V850E"
+ "@
+ zxb %0
+ andi 255,%1,%0
+ sld.bu %1,%0
+ ld.bu %1,%0"
+ [(set_attr "length" "2,4,2,4")
+ (set_attr "cc" "none_0hit,set_znv,none_0hit,none_0hit")])
(define_insn "zero_extendqisi2"
[(set (match_operand:SI 0 "register_operand" "=r")
@@ -1106,6 +1493,18 @@
;;- sign extension instructions
+;; ??? The extendhisi2 pattern should not emit shifts for v850e?
+
+(define_insn "*extendhisi_insn"
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r")
+ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,Q,m")))]
+ "TARGET_V850E"
+ "@
+ sxh %0
+ sld.h %1,%0
+ ld.h %1,%0"
+ [(set_attr "length" "2,2,4")
+ (set_attr "cc" "none_0hit,none_0hit,none_0hit")])
;; ??? This is missing a sign extend from memory pattern to match the ld.h
;; instruction.
@@ -1124,6 +1523,18 @@
operands[2] = gen_reg_rtx (SImode);
}")
+;; ??? The extendqisi2 pattern should not emit shifts for v850e?
+
+(define_insn "*extendqisi_insn"
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r")
+ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,Q,m")))]
+ "TARGET_V850E"
+ "@
+ sxb %0
+ sld.b %1,%0
+ ld.b %1,%0"
+ [(set_attr "length" "2,2,4")
+ (set_attr "cc" "none_0hit,none_0hit,none_0hit")])
;; ??? This is missing a sign extend from memory pattern to match the ld.b
;; instruction.
@@ -1229,6 +1640,21 @@
;; RTXs. These RTXs will then be turned into a suitable call to a worker
;; function.
+;;
+;; Actually, convert the RTXs into a PREPARE instruction.
+;;
+(define_insn ""
+ [(match_parallel 0 "pattern_is_ok_for_prepare"
+ [(set (reg:SI 3)
+ (plus:SI (reg:SI 3) (match_operand:SI 1 "immediate_operand" "i")))
+ (set (mem:SI (plus:SI (reg:SI 3)
+ (match_operand:SI 2 "immediate_operand" "i")))
+ (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))])]
+ "TARGET_PROLOG_FUNCTION && TARGET_V850E"
+ "* return construct_prepare_instruction (operands[0]);
+ "
+ [(set_attr "length" "4")
+ (set_attr "cc" "none")])
(define_insn ""
[(match_parallel 0 "pattern_is_ok_for_prologue"
@@ -1245,6 +1671,23 @@
(const_string "4")))
(set_attr "cc" "clobber")])
+;;
+;; Actually, turn the RTXs into a DISPOSE instruction.
+;;
+(define_insn ""
+ [(match_parallel 0 "pattern_is_ok_for_dispose"
+ [(return)
+ (set (reg:SI 3)
+ (plus:SI (reg:SI 3) (match_operand:SI 1 "immediate_operand" "i")))
+ (set (match_operand:SI 2 "register_is_ok_for_epilogue" "=r")
+ (mem:SI (plus:SI (reg:SI 3)
+ (match_operand:SI 3 "immediate_operand" "i"))))])]
+ "TARGET_PROLOG_FUNCTION && TARGET_V850E"
+ "* return construct_dispose_instruction (operands[0]);
+ "
+ [(set_attr "length" "4")
+ (set_attr "cc" "none")])
+
;; This pattern will match a return RTX followed by any number of pop RTXs
;; and possible a stack adjustment as well. These RTXs will be turned into
;; a suitable call to a worker function.
@@ -1266,31 +1709,95 @@
(set_attr "cc" "clobber")])
;; Initialize an interrupt function. Do not depend on TARGET_PROLOG_FUNCTION.
+(define_insn "callt_save_interrupt"
+ [(unspec_volatile [(const_int 0)] 2)]
+ "TARGET_V850E && !TARGET_DISABLE_CALLT"
+ ;; The CALLT instruction stores the next address of CALLT to CTPC register
+ ;; without saving its previous value. So if the interrupt handler
+ ;; or its caller could possibily execute the CALLT insn, save_interrupt
+ ;; MUST NOT be called via CALLT.
+ "*
+{
+ output_asm_insn (\"addi -24, sp, sp\", operands);
+ output_asm_insn (\"st.w r10, 12[sp]\", operands);
+ output_asm_insn (\"stsr ctpc, r10\", operands);
+ output_asm_insn (\"st.w r10, 16[sp]\", operands);
+ output_asm_insn (\"stsr ctpsw, r10\", operands);
+ output_asm_insn (\"st.w r10, 20[sp]\", operands);
+ output_asm_insn (\"callt ctoff(__callt_save_interrupt)\", operands);
+ return \"\";
+}"
+ [(set_attr "length" "26")
+ (set_attr "cc" "none")])
+
+(define_insn "callt_return_interrupt"
+ [(unspec_volatile [(const_int 0)] 3)]
+ "TARGET_V850E && !TARGET_DISABLE_CALLT"
+ "callt ctoff(__callt_return_interrupt)"
+ [(set_attr "length" "2")
+ (set_attr "cc" "clobber")])
+
(define_insn "save_interrupt"
[(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -16)))
- (set (mem:SI (reg:SI 3)) (reg:SI 30))
- (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 10))
- (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 4))
- (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 1))]
- "TARGET_V850 && ! TARGET_LONG_CALLS"
- "add -16, sp ; st.w r10, 12[sp] ; jarl __save_interrupt, r10"
- [(set_attr "length" "12")
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 30))
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 4))
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 1))
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 10))]
+ ""
+ "*
+{
+ if (TARGET_PROLOG_FUNCTION && !TARGET_LONG_CALLS)
+ return \"add -16,sp\;st.w r10,12[sp]\;jarl __save_interrupt,r10\";
+ else
+ {
+ output_asm_insn (\"add -16, sp\", operands);
+ output_asm_insn (\"st.w r10, 12[sp]\", operands);
+ output_asm_insn (\"st.w ep, 0[sp]\", operands);
+ output_asm_insn (\"st.w gp, 4[sp]\", operands);
+ output_asm_insn (\"st.w r1, 8[sp]\", operands);
+ output_asm_insn (\"movhi hi(__ep), r0, ep\", operands);
+ output_asm_insn (\"movea lo(__ep), ep, ep\", operands);
+ output_asm_insn (\"movhi hi(__gp), r0, gp\", operands);
+ output_asm_insn (\"movea lo(__gp), gp, gp\", operands);
+ return \"\";
+ }
+}"
+ [(set (attr "length")
+ (if_then_else (ne (symbol_ref "TARGET_LONG_CALLS") (const_int 0))
+ (const_int 10)
+ (const_int 34)))
(set_attr "cc" "clobber")])
-
+
;; Restore r1, r4, r10, and return from the interrupt
-(define_insn "restore_interrupt"
+(define_insn "return_interrupt"
[(return)
- (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 16)))
- (set (reg:SI 30) (mem:SI (plus:SI (reg:SI 3) (const_int 12))))
- (set (reg:SI 10) (mem:SI (plus:SI (reg:SI 3) (const_int 8))))
- (set (reg:SI 4) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))
- (set (reg:SI 1) (mem:SI (reg:SI 3)))]
+ (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 16)))
+ (set (reg:SI 10) (mem:SI (plus:SI (reg:SI 3) (const_int 12))))
+ (set (reg:SI 1) (mem:SI (plus:SI (reg:SI 3) (const_int 8))))
+ (set (reg:SI 4) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))
+ (set (reg:SI 30) (mem:SI (reg:SI 3)))]
""
- "jr __return_interrupt"
- [(set_attr "length" "4")
+ "*
+{
+ if (TARGET_PROLOG_FUNCTION && !TARGET_LONG_CALLS)
+ return \"jr __return_interrupt\";
+ else
+ {
+ output_asm_insn (\"ld.w 0[sp], ep\", operands);
+ output_asm_insn (\"ld.w 4[sp], gp\", operands);
+ output_asm_insn (\"ld.w 8[sp], r1\", operands);
+ output_asm_insn (\"ld.w 12[sp], r10\", operands);
+ output_asm_insn (\"addi 16, sp, sp\", operands);
+ output_asm_insn (\"reti\", operands);
+ return \"\";
+ }
+}"
+ [(set (attr "length")
+ (if_then_else (ne (symbol_ref "TARGET_LONG_CALLS") (const_int 0))
+ (const_int 4)
+ (const_int 24)))
(set_attr "cc" "clobber")])
-
;; Save all registers except for the registers saved in save_interrupt when
;; an interrupt function makes a call.
;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
@@ -1298,28 +1805,148 @@
;; This is needed because the rest of the compiler is not ready to handle
;; insns this complicated.
+(define_insn "callt_save_all_interrupt"
+ [(unspec_volatile [(const_int 0)] 0)]
+ "TARGET_V850E && !TARGET_DISABLE_CALLT"
+ "callt ctoff(__callt_save_all_interrupt)"
+ [(set_attr "length" "2")
+ (set_attr "cc" "none")])
+
(define_insn "save_all_interrupt"
[(unspec_volatile [(const_int 0)] 0)]
+ ""
+ "*
+{
+ if (TARGET_PROLOG_FUNCTION && !TARGET_LONG_CALLS)
+ return \"jarl __save_all_interrupt,r10\";
+
+ output_asm_insn (\"addi -120, sp, sp\", operands);
+ output_asm_insn (\"mov ep, r1\", operands);
+ output_asm_insn (\"mov sp, ep\", operands);
+ output_asm_insn (\"sst.w r31, 116[ep]\", operands);
+ output_asm_insn (\"sst.w r2, 112[ep]\", operands);
+ output_asm_insn (\"sst.w gp, 108[ep]\", operands);
+ output_asm_insn (\"sst.w r6, 104[ep]\", operands);
+ output_asm_insn (\"sst.w r7, 100[ep]\", operands);
+ output_asm_insn (\"sst.w r8, 96[ep]\", operands);
+ output_asm_insn (\"sst.w r9, 92[ep]\", operands);
+ output_asm_insn (\"sst.w r11, 88[ep]\", operands);
+ output_asm_insn (\"sst.w r12, 84[ep]\", operands);
+ output_asm_insn (\"sst.w r13, 80[ep]\", operands);
+ output_asm_insn (\"sst.w r14, 76[ep]\", operands);
+ output_asm_insn (\"sst.w r15, 72[ep]\", operands);
+ output_asm_insn (\"sst.w r16, 68[ep]\", operands);
+ output_asm_insn (\"sst.w r17, 64[ep]\", operands);
+ output_asm_insn (\"sst.w r18, 60[ep]\", operands);
+ output_asm_insn (\"sst.w r19, 56[ep]\", operands);
+ output_asm_insn (\"sst.w r20, 52[ep]\", operands);
+ output_asm_insn (\"sst.w r21, 48[ep]\", operands);
+ output_asm_insn (\"sst.w r22, 44[ep]\", operands);
+ output_asm_insn (\"sst.w r23, 40[ep]\", operands);
+ output_asm_insn (\"sst.w r24, 36[ep]\", operands);
+ output_asm_insn (\"sst.w r25, 32[ep]\", operands);
+ output_asm_insn (\"sst.w r26, 28[ep]\", operands);
+ output_asm_insn (\"sst.w r27, 24[ep]\", operands);
+ output_asm_insn (\"sst.w r28, 20[ep]\", operands);
+ output_asm_insn (\"sst.w r29, 16[ep]\", operands);
+ output_asm_insn (\"mov r1, ep\", operands);
+ return \"\";
+}"
+ [(set (attr "length")
+ (if_then_else (ne (symbol_ref "TARGET_LONG_CALLS") (const_int 0))
+ (const_int 4)
+ (const_int 62)
+ ))
+ (set_attr "cc" "clobber")])
+
+(define_insn "_save_all_interrupt"
+ [(unspec_volatile [(const_int 0)] 0)]
"TARGET_V850 && ! TARGET_LONG_CALLS"
"jarl __save_all_interrupt,r10"
[(set_attr "length" "4")
(set_attr "cc" "clobber")])
-
;; Restore all registers saved when an interrupt function makes a call.
;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and
;; all of memory. This blocks insns from being moved across this point.
;; This is needed because the rest of the compiler is not ready to handle
;; insns this complicated.
+(define_insn "callt_restore_all_interrupt"
+ [(unspec_volatile [(const_int 0)] 1)]
+ "TARGET_V850E && !TARGET_DISABLE_CALLT"
+ "callt ctoff(__callt_restore_all_interrupt)"
+ [(set_attr "length" "2")
+ (set_attr "cc" "none")])
+
(define_insn "restore_all_interrupt"
[(unspec_volatile [(const_int 0)] 1)]
+ ""
+ "*
+{
+ if (TARGET_PROLOG_FUNCTION && !TARGET_LONG_CALLS)
+ return \"jarl __restore_all_interrupt,r10\";
+ else
+ {
+ output_asm_insn (\"mov ep, r1\", operands);
+ output_asm_insn (\"mov sp, ep\", operands);
+ output_asm_insn (\"sld.w 116[ep], r31\", operands);
+ output_asm_insn (\"sld.w 112[ep], r2\", operands);
+ output_asm_insn (\"sld.w 108[ep], gp\", operands);
+ output_asm_insn (\"sld.w 104[ep], r6\", operands);
+ output_asm_insn (\"sld.w 100[ep], r7\", operands);
+ output_asm_insn (\"sld.w 96[ep], r8\", operands);
+ output_asm_insn (\"sld.w 92[ep], r9\", operands);
+ output_asm_insn (\"sld.w 88[ep], r11\", operands);
+ output_asm_insn (\"sld.w 84[ep], r12\", operands);
+ output_asm_insn (\"sld.w 80[ep], r13\", operands);
+ output_asm_insn (\"sld.w 76[ep], r14\", operands);
+ output_asm_insn (\"sld.w 72[ep], r15\", operands);
+ output_asm_insn (\"sld.w 68[ep], r16\", operands);
+ output_asm_insn (\"sld.w 64[ep], r17\", operands);
+ output_asm_insn (\"sld.w 60[ep], r18\", operands);
+ output_asm_insn (\"sld.w 56[ep], r19\", operands);
+ output_asm_insn (\"sld.w 52[ep], r20\", operands);
+ output_asm_insn (\"sld.w 48[ep], r21\", operands);
+ output_asm_insn (\"sld.w 44[ep], r22\", operands);
+ output_asm_insn (\"sld.w 40[ep], r23\", operands);
+ output_asm_insn (\"sld.w 36[ep], r24\", operands);
+ output_asm_insn (\"sld.w 32[ep], r25\", operands);
+ output_asm_insn (\"sld.w 28[ep], r26\", operands);
+ output_asm_insn (\"sld.w 24[ep], r27\", operands);
+ output_asm_insn (\"sld.w 20[ep], r28\", operands);
+ output_asm_insn (\"sld.w 16[ep], r29\", operands);
+ output_asm_insn (\"mov r1, ep\", operands);
+ output_asm_insn (\"addi 120, sp, sp\", operands);
+ return \"\";
+ }
+}"
+ [(set (attr "length")
+ (if_then_else (ne (symbol_ref "TARGET_LONG_CALLS") (const_int 0))
+ (const_int 4)
+ (const_int 62)
+ ))
+ (set_attr "cc" "clobber")])
+
+(define_insn "_restore_all_interrupt"
+ [(unspec_volatile [(const_int 0)] 1)]
"TARGET_V850 && ! TARGET_LONG_CALLS"
"jarl __restore_all_interrupt,r10"
[(set_attr "length" "4")
(set_attr "cc" "clobber")])
;; Save r6-r9 for a variable argument function
+(define_insn "save_r6_r9_v850e"
+ [(set (mem:SI (reg:SI 3)) (reg:SI 6))
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int 4))) (reg:SI 7))
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int 8))) (reg:SI 8))
+ (set (mem:SI (plus:SI (reg:SI 3) (const_int 12))) (reg:SI 9))
+ ]
+ "TARGET_PROLOG_FUNCTION && TARGET_V850E && !TARGET_DISABLE_CALLT"
+ "callt ctoff(__callt_save_r6_r9)"
+ [(set_attr "length" "2")
+ (set_attr "cc" "none")])
+
(define_insn "save_r6_r9"
[(set (mem:SI (reg:SI 3)) (reg:SI 6))
(set (mem:SI (plus:SI (reg:SI 3) (const_int 4))) (reg:SI 7))
diff --git a/gcc/config/vax/elf.h b/gcc/config/vax/elf.h
new file mode 100644
index 00000000000..fe00d22336c
--- /dev/null
+++ b/gcc/config/vax/elf.h
@@ -0,0 +1,95 @@
+/* Target definitions for GNU compiler for VAX using ELF
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Contributed by Matt Thomas (matt@3am-software.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. */
+
+#undef REGISTER_PREFIX
+#undef REGISTER_NAMES
+#define REGISTER_PREFIX "%"
+#define REGISTER_NAMES \
+{"%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", \
+ "%r8", "%r9", "%r10", "%r11", "%ap", "%fp", "%sp", "%pc"}
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+/* Profiling routine. */
+#undef VAX_FUNCTION_PROFILER_NAME
+#define VAX_FUNCTION_PROFILER_NAME "__mcount"
+
+/* Let's be re-entrant. */
+#undef PCC_STATIC_STRUCT_RETURN
+
+/* Make sure .stabs for a function are always the same section. */
+#define DBX_OUTPUT_FUNCTION_END(file,decl) function_section(decl)
+
+/* Before the prologue, the top of the frame is below the argument
+ count pushed by the CALLS and before the start of the saved registers. */
+#define INCOMING_FRAME_SP_OFFSET 0
+
+/* We use R2-R5 (call-clobbered) registers for exceptions. */
+#define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 2 : INVALID_REGNUM)
+
+/* Place the top of the stack for the DWARF2 EH stackadj value. */
+#define EH_RETURN_STACKADJ_RTX \
+ gen_rtx_MEM (SImode, \
+ plus_constant (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM), \
+ -4))
+
+/* Simple store the return handler into the call frame. */
+#define EH_RETURN_HANDLER_RTX \
+ gen_rtx_MEM (Pmode, \
+ plus_constant (gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM), \
+ 16))
+
+
+/* Reserve the top of the stack for exception handler stackadj value. */
+#undef STARTING_FRAME_OFFSET
+#define STARTING_FRAME_OFFSET -4
+
+/* The VAX wants no space between the case instruction and the jump table. */
+#undef ASM_OUTPUT_BEFORE_CASE_LABEL
+#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE)
+
+/* Get the udiv/urem calls out of the user's namespace. */
+#undef UDIVSI3_LIBCALL
+#define UDIVSI3_LIBCALL "*__udiv"
+#undef UMODSI3_LIBCALL
+#define UMODSI3_LIBCALL "*__urem"
+
+#undef OVERRIDE_OPTIONS
+#define OVERRIDE_OPTIONS \
+ do \
+ { \
+ /* Do generic VAX overrides. */ \
+ override_options (); \
+ \
+ /* Turn off function CSE if we're \
+ doing PIC. */ \
+ if (flag_pic) flag_no_function_cse = 1; \
+ } \
+ while (0)
+
+/* VAX ELF is always gas; override the generic VAX ASM_SPEC. */
+
+#undef ASM_SPEC
+#define ASM_SPEC ""
diff --git a/gcc/config/vax/netbsd-elf.h b/gcc/config/vax/netbsd-elf.h
new file mode 100644
index 00000000000..e28d1a15743
--- /dev/null
+++ b/gcc/config/vax/netbsd-elf.h
@@ -0,0 +1,61 @@
+/* Definitions of target machine for GNU compiler,
+ for NetBSD/vax ELF systems.
+ Copyright (C) 2002 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+/* Names to predefine in the preprocessor for this target OS. */
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+ NETBSD_OS_CPP_BUILTINS_ELF(); \
+ } \
+ while (0)
+
+#undef CPP_SPEC
+#define CPP_SPEC NETBSD_CPP_SPEC
+
+#define NETBSD_ENTRY_POINT "__start"
+
+#undef LINK_SPEC
+#if 1
+/* FIXME: We must link all executables statically until PIC support
+ is added to the compiler. */
+#define LINK_SPEC \
+ "%{assert*} %{R*} %{rpath*} \
+ %{shared:%eThe -shared option is not currently supported for VAX ELF.} \
+ %{!shared: \
+ -dc -dp \
+ %{!nostdlib: \
+ %{!r*: \
+ %{!e*:-e %(netbsd_entry_point)}}} \
+ %{!static:-static} \
+ %{static:-static}}"
+#else
+#define LINK_SPEC NETBSD_LINK_SPEC_ELF
+#endif
+
+#define EXTRA_SPECS \
+ { "netbsd_entry_point", NETBSD_ENTRY_POINT },
+
+/* We use gas, not the UNIX assembler. */
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT 0
+
+#undef ASM_FINAL_SPEC
diff --git a/gcc/config/vax/vax-protos.h b/gcc/config/vax/vax-protos.h
index f3a239d76c6..307f5eb40ef 100644
--- a/gcc/config/vax/vax-protos.h
+++ b/gcc/config/vax/vax-protos.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. VAX version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -18,6 +18,8 @@ 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. */
+extern void override_options PARAMS ((void));
+
#ifdef RTX_CODE
extern const char *rev_cond_name PARAMS ((rtx));
extern void split_quadword_operands PARAMS ((rtx *, rtx *, int));
@@ -33,8 +35,7 @@ extern int check_float_value PARAMS ((enum machine_mode, REAL_VALUE_TYPE *, int)
#endif /* REAL_VALUE_TYPE */
#ifdef TREE_CODE
-extern void vms_check_external PARAMS ((tree, const char *, int));
+extern void vax_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
#endif /* TREE_CODE */
-extern void vms_flush_pending_externals PARAMS ((FILE *));
extern void const_section PARAMS ((void));
diff --git a/gcc/config/vax/vax.c b/gcc/config/vax/vax.c
index 9c929cc4d9f..131d3cbd4ab 100644
--- a/gcc/config/vax/vax.c
+++ b/gcc/config/vax/vax.c
@@ -22,6 +22,7 @@ Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "rtl.h"
+#include "tree.h"
#include "regs.h"
#include "hard-reg-set.h"
#include "real.h"
@@ -30,23 +31,16 @@ Boston, MA 02111-1307, USA. */
#include "function.h"
#include "output.h"
#include "insn-attr.h"
-#include "tree.h"
#include "recog.h"
#include "expr.h"
#include "flags.h"
+#include "debug.h"
#include "tm_p.h"
#include "target.h"
#include "target-def.h"
static int follows_p PARAMS ((rtx, rtx));
static void vax_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
-#if VMS_TARGET
-static void vms_asm_out_constructor PARAMS ((rtx, int));
-static void vms_asm_out_destructor PARAMS ((rtx, int));
-static void vms_select_section PARAMS ((tree, int, unsigned HOST_WIDE_INT));
-static void vms_encode_section_info PARAMS ((tree, int));
-static void vms_globalize_label PARAMS ((FILE *, const char *));
-#endif
/* Initialize the GCC target structure. */
#undef TARGET_ASM_ALIGNED_HI_OP
@@ -55,17 +49,20 @@ static void vms_globalize_label PARAMS ((FILE *, const char *));
#undef TARGET_ASM_FUNCTION_PROLOGUE
#define TARGET_ASM_FUNCTION_PROLOGUE vax_output_function_prologue
-#if VMS_TARGET
-#undef TARGET_ASM_SELECT_SECTION
-#define TARGET_ASM_SELECT_SECTION vms_select_section
-#undef TARGET_ENCODE_SECTION_INFO
-#define TARGET_ENCODE_SECTION_INFO vms_encode_section_info
-#undef TARGET_ASM_GLOBALIZE_LABEL
-#define TARGET_ASM_GLOBALIZE_LABEL vms_globalize_label
-#endif
-
struct gcc_target targetm = TARGET_INITIALIZER;
+/* Set global variables as needed for the options enabled. */
+
+void
+override_options ()
+{
+ /* We're VAX floating point, not IEEE floating point. */
+ memset (real_format_for_mode, 0, sizeof real_format_for_mode);
+ real_format_for_mode[SFmode - QFmode] = &vax_f_format;
+ real_format_for_mode[DFmode - QFmode]
+ = (TARGET_G_FLOAT ? &vax_g_format : &vax_d_format);
+}
+
/* Generate the assembly code for function entry. FILE is a stdio
stream to output the code to. SIZE is an int: how many units of
temporary storage to allocate.
@@ -89,50 +86,26 @@ vax_output_function_prologue (file, size)
fprintf (file, "\t.word 0x%x\n", mask);
- if (VMS_TARGET)
+ if (dwarf2out_do_frame ())
{
- /*
- * This works for both gcc and g++. It first checks to see if
- * the current routine is "main", which will only happen for
- * GCC, and add the jsb if it is. If is not the case then try
- * and see if __MAIN_NAME is part of current_function_name,
- * which will only happen if we are running g++, and add the jsb
- * if it is. In gcc there should never be a paren in the
- * function name, and in g++ there is always a "(" in the
- * function name, thus there should never be any confusion.
- *
- * Adjusting the stack pointer by 4 before calling C$MAIN_ARGS
- * is required when linking with the VMS POSIX version of the C
- * run-time library; using `subl2 $4,r0' is adequate but we use
- * `clrl -(sp)' instead. The extra 4 bytes could be removed
- * after the call because STARTING_FRAME_OFFSET's setting of -4
- * will end up adding them right back again, but don't bother.
- */
-
- const char *p = current_function_name;
- int is_main = strcmp ("main", p) == 0;
-# define __MAIN_NAME " main("
-
- while (!is_main && *p != '\0')
- {
- if (*p == *__MAIN_NAME
- && strncmp (p, __MAIN_NAME, sizeof __MAIN_NAME - sizeof "") == 0)
- is_main = 1;
- else
- p++;
- }
+ const char *label = dwarf2out_cfi_label ();
+ int offset = 0;
+
+ for (regno = FIRST_PSEUDO_REGISTER-1; regno >= 0; --regno)
+ if (regs_ever_live[regno] && !call_used_regs[regno])
+ dwarf2out_reg_save (label, regno, offset -= 4);
- if (is_main)
- fprintf (file, "\tclrl -(%ssp)\n\tjsb _C$MAIN_ARGS\n",
- REGISTER_PREFIX);
+ dwarf2out_reg_save (label, PC_REGNUM, offset -= 4);
+ dwarf2out_reg_save (label, FRAME_POINTER_REGNUM, offset -= 4);
+ dwarf2out_reg_save (label, ARG_POINTER_REGNUM, offset -= 4);
+ dwarf2out_def_cfa (label, FRAME_POINTER_REGNUM, -(offset - 4));
}
size -= STARTING_FRAME_OFFSET;
if (size >= 64)
- fprintf (file, "\tmovab %d(%ssp),%ssp\n", -size, REGISTER_PREFIX,
- REGISTER_PREFIX);
+ asm_fprintf (file, "\tmovab %d(%Rsp),%Rsp\n", -size);
else if (size)
- fprintf (file, "\tsubl2 $%d,%ssp\n", size, REGISTER_PREFIX);
+ asm_fprintf (file, "\tsubl2 $%d,%Rsp\n", size);
}
/* This is like nonimmediate_operand with a restriction on the type of MEM. */
@@ -318,7 +291,7 @@ print_operand_address (file, addr)
else
abort ();
- /* If REG1 is non-zero, figure out if it is a base or index register. */
+ /* If REG1 is nonzero, figure out if it is a base or index register. */
if (reg1)
{
if (breg != 0 || (offset && GET_CODE (offset) == MEM))
@@ -696,335 +669,7 @@ vax_rtx_cost (x)
}
return c;
}
-
-/* Check a `double' value for validity for a particular machine mode. */
-
-static const char *const float_strings[] =
-{
- "1.70141173319264430e+38", /* 2^127 (2^24 - 1) / 2^24 */
- "-1.70141173319264430e+38",
- "2.93873587705571877e-39", /* 2^-128 */
- "-2.93873587705571877e-39"
-};
-
-static REAL_VALUE_TYPE float_values[4];
-
-static int inited_float_values = 0;
-
-
-int
-check_float_value (mode, d, overflow)
- enum machine_mode mode;
- REAL_VALUE_TYPE *d;
- int overflow;
-{
- if (inited_float_values == 0)
- {
- int i;
- for (i = 0; i < 4; i++)
- {
- float_values[i] = REAL_VALUE_ATOF (float_strings[i], DFmode);
- }
-
- inited_float_values = 1;
- }
-
- if (overflow)
- {
- memcpy (d, &float_values[0], sizeof (REAL_VALUE_TYPE));
- return 1;
- }
-
- if ((mode) == SFmode)
- {
- REAL_VALUE_TYPE r;
- memcpy (&r, d, sizeof (REAL_VALUE_TYPE));
- if (REAL_VALUES_LESS (float_values[0], r))
- {
- memcpy (d, &float_values[0], sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- else if (REAL_VALUES_LESS (r, float_values[1]))
- {
- memcpy (d, &float_values[1], sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- else if (REAL_VALUES_LESS (dconst0, r)
- && REAL_VALUES_LESS (r, float_values[2]))
- {
- memcpy (d, &dconst0, sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- else if (REAL_VALUES_LESS (r, dconst0)
- && REAL_VALUES_LESS (float_values[3], r))
- {
- memcpy (d, &dconst0, sizeof (REAL_VALUE_TYPE));
- return 1;
- }
- }
-
- return 0;
-}
-#if VMS_TARGET
-/* Additional support code for VMS target. */
-
-/* Linked list of all externals that are to be emitted when optimizing
- for the global pointer if they haven't been declared by the end of
- the program with an appropriate .comm or initialization. */
-
-static
-struct extern_list {
- struct extern_list *next; /* next external */
- const char *name; /* name of the external */
- int size; /* external's actual size */
- int in_const; /* section type flag */
-} *extern_head = 0, *pending_head = 0;
-
-/* Check whether NAME is already on the external definition list. If not,
- add it to either that list or the pending definition list. */
-
-void
-vms_check_external (decl, name, pending)
- tree decl;
- const char *name;
- int pending;
-{
- register struct extern_list *p, *p0;
-
- for (p = extern_head; p; p = p->next)
- if (!strcmp (p->name, name))
- return;
-
- for (p = pending_head, p0 = 0; p; p0 = p, p = p->next)
- if (!strcmp (p->name, name))
- {
- if (pending)
- return;
-
- /* Was pending, but has now been defined; move it to other list. */
- if (p == pending_head)
- pending_head = p->next;
- else
- p0->next = p->next;
- p->next = extern_head;
- extern_head = p;
- return;
- }
-
- /* Not previously seen; create a new list entry. */
- p = (struct extern_list *) xmalloc (sizeof (struct extern_list));
- p->name = name;
-
- if (pending)
- {
- /* Save the size and section type and link to `pending' list. */
- p->size = (DECL_SIZE (decl) == 0) ? 0 :
- TREE_INT_CST_LOW (size_binop (CEIL_DIV_EXPR, DECL_SIZE (decl),
- size_int (BITS_PER_UNIT)));
- p->in_const = (TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl));
-
- p->next = pending_head;
- pending_head = p;
- }
- else
- {
- /* Size and section type don't matter; link to `declared' list. */
- p->size = p->in_const = 0; /* arbitrary init */
-
- p->next = extern_head;
- extern_head = p;
- }
- return;
-}
-
-void
-vms_flush_pending_externals (file)
- FILE *file;
-{
- register struct extern_list *p;
-
- while (pending_head)
- {
- /* Move next pending declaration to the "done" list. */
- p = pending_head;
- pending_head = p->next;
- p->next = extern_head;
- extern_head = p;
-
- /* Now output the actual declaration. */
- if (p->in_const)
- const_section ();
- else
- data_section ();
- fputs (".comm ", file);
- assemble_name (file, p->name);
- fprintf (file, ",%d\n", p->size);
- }
-}
-
-static void
-vms_asm_out_constructor (symbol, priority)
- rtx symbol;
- int priority ATTRIBUTE_UNUSED;
-{
- fprintf (asm_out_file,".globl $$PsectAttributes_NOOVR$$__gxx_init_1\n");
- data_section();
- fprintf (asm_out_file,"$$PsectAttributes_NOOVR$$__gxx_init_1:\n\t.long\t");
- assemble_name (asm_out_file, XSTR (symbol, 0));
- fputc ('\n', asm_out_file);
-}
-
-static void
-vms_asm_out_destructor (symbol, priority)
- rtx symbol;
- int priority ATTRIBUTE_UNUSED;
-{
- fprintf (asm_out_file,".globl $$PsectAttributes_NOOVR$$__gxx_clean_1\n");
- data_section();
- fprintf (asm_out_file,"$$PsectAttributes_NOOVR$$__gxx_clean_1:\n\t.long\t");
- assemble_name (asm_out_file, XSTR (symbol, 0));
- fputc ('\n', asm_out_file);
-}
-
-static void
-vms_select_section (exp, reloc, align)
- tree exp;
- int reloc ATTRIBUTE_UNUSED;
- unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
-{
- if (TREE_CODE (exp) == VAR_DECL)
- {
- if (TREE_READONLY (exp) && ! TREE_THIS_VOLATILE (exp)
- && DECL_INITIAL (exp)
- && (DECL_INITIAL (exp) == error_mark_node
- || TREE_CONSTANT (DECL_INITIAL (exp))))
- {
- if (TREE_PUBLIC (exp))
- const_section ();
- else
- text_section ();
- }
- else
- data_section ();
- }
- if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
- {
- if (TREE_CODE (exp) == STRING_CST && flag_writable_strings)
- data_section ();
- else
- text_section ();
- }
-}
-
-/* Make sure that external variables are correctly addressed. Under VMS
- there is some brain damage in the linker that requires us to do this. */
-
-static void
-vms_encode_section_info (decl, first)
- tree decl;
- int first ATTRIBUTE_UNUSED;
-{
- if (DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
- SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
-}
-
-/* This is how to output a command to make the user-level label named NAME
- defined for reference from other files. */
-static void
-vms_globalize_label (stream, name)
- FILE *stream;
- const char *name;
-{
- default_globalize_label (stream, name);
- vms_check_external (NULL_TREE, name, 0);
-}
-#endif /* VMS_TARGET */
-
-/* Additional support code for VMS host. */
-/* ??? This should really be in libiberty; vax.c is a target file. */
-#ifdef QSORT_WORKAROUND
- /*
- Do not use VAXCRTL's qsort() due to a severe bug: once you've
- sorted something which has a size that's an exact multiple of 4
- and is longword aligned, you cannot safely sort anything which
- is either not a multiple of 4 in size or not longword aligned.
- A static "move-by-longword" optimization flag inside qsort() is
- never reset. This is known to affect VMS V4.6 through VMS V5.5-1,
- and was finally fixed in VMS V5.5-2.
-
- In this work-around an insertion sort is used for simplicity.
- The qsort code from glibc should probably be used instead.
- */
-void
-not_qsort (array, count, size, compare)
- void *array;
- unsigned count, size;
- int (*compare)();
-{
-
- if (size == sizeof (short))
- {
- register int i;
- register short *next, *prev;
- short tmp, *base = array;
-
- for (next = base, i = count - 1; i > 0; i--)
- {
- prev = next++;
- if ((*compare)(next, prev) < 0)
- {
- tmp = *next;
- do *(prev + 1) = *prev;
- while (--prev >= base ? (*compare)(&tmp, prev) < 0 : 0);
- *(prev + 1) = tmp;
- }
- }
- }
- else if (size == sizeof (long))
- {
- register int i;
- register long *next, *prev;
- long tmp, *base = array;
-
- for (next = base, i = count - 1; i > 0; i--)
- {
- prev = next++;
- if ((*compare)(next, prev) < 0)
- {
- tmp = *next;
- do *(prev + 1) = *prev;
- while (--prev >= base ? (*compare)(&tmp, prev) < 0 : 0);
- *(prev + 1) = tmp;
- }
- }
- }
- else /* arbitrary size */
- {
- register int i;
- register char *next, *prev, *tmp = alloca (size), *base = array;
-
- for (next = base, i = count - 1; i > 0; i--)
- { /* count-1 forward iterations */
- prev = next, next += size; /* increment front pointer */
- if ((*compare)(next, prev) < 0)
- { /* found element out of order; move others up then re-insert */
- memcpy (tmp, next, size); /* save smaller element */
- do { memcpy (prev + size, prev, size); /* move larger elem. up */
- prev -= size; /* decrement back pointer */
- } while (prev >= base ? (*compare)(tmp, prev) < 0 : 0);
- memcpy (prev + size, tmp, size); /* restore small element */
- }
- }
-#ifdef USE_C_ALLOCA
- alloca (0);
-#endif
- }
-
- return;
-}
-#endif /* QSORT_WORKAROUND */
-
/* Return 1 if insn A follows B. */
static int
@@ -1059,3 +704,19 @@ reg_was_0_p (insn, op)
/* Make sure the reg hasn't been clobbered. */
&& ! reg_set_between_p (op, XEXP (link, 0), insn));
}
+
+void
+vax_output_mi_thunk (file, thunk, delta, function)
+ FILE *file;
+ tree thunk ATTRIBUTE_UNUSED;
+ HOST_WIDE_INT delta;
+ tree function;
+{
+ fprintf (file, "\t.word 0x0ffc\n");
+ fprintf (file, "\taddl2 $");
+ fprintf (file, HOST_WIDE_INT_PRINT_DEC, delta);
+ asm_fprintf (file, ",4(%Rap)\n");
+ fprintf (file, "\tjmp ");
+ assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+ fprintf (file, "+2\n");
+}
diff --git a/gcc/config/vax/vax.h b/gcc/config/vax/vax.h
index 80fbd4770a8..ed780a7c615 100644
--- a/gcc/config/vax/vax.h
+++ b/gcc/config/vax/vax.h
@@ -106,6 +106,9 @@ extern int target_flags;
#ifndef TARGET_DEFAULT
#define TARGET_DEFAULT (MASK_UNIX_ASM)
#endif
+
+#define OVERRIDE_OPTIONS override_options ()
+
/* Target machine storage layout */
@@ -138,7 +141,7 @@ extern int target_flags;
/* Every structure's size must be a multiple of this. */
#define STRUCTURE_SIZE_BOUNDARY 8
-/* A bitfield declared as `int' forces `int' alignment for the struct. */
+/* A bit-field declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS (! TARGET_VAXC_ALIGNMENT)
/* No data type wants to be aligned rounder than this. */
@@ -285,16 +288,28 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
#define REG_CLASS_FROM_LETTER(C) NO_REGS
-/* The letters I, J, K, L and M in a register constraint string
+/* The letters I, J, K, L, M, N, and O in a register constraint string
can be used to stand for particular ranges of immediate operands.
This macro defines what the ranges are.
C is the letter, and VALUE is a constant value.
Return 1 if VALUE is in the range specified by C.
- `I' is the constant zero. */
+ `I' is the constant zero.
+ `J' is a value between 0 .. 63 (inclusive)
+ `K' is a value between -128 and 127 (inclusive)
+ 'L' is a value between -32768 and 32767 (inclusive)
+ `M' is a value between 0 and 255 (inclusive)
+ 'N' is a value between 0 and 65535 (inclusive)
+ `O' is a value between -63 and -1 (inclusive) */
#define CONST_OK_FOR_LETTER_P(VALUE, C) \
- ((C) == 'I' ? (VALUE) == 0 \
+ ( (C) == 'I' ? (VALUE) == 0 \
+ : (C) == 'J' ? 0 <= (VALUE) && (VALUE) < 64 \
+ : (C) == 'O' ? -63 <= (VALUE) && (VALUE) < 0 \
+ : (C) == 'K' ? -128 <= (VALUE) && (VALUE) < 128 \
+ : (C) == 'M' ? 0 <= (VALUE) && (VALUE) < 256 \
+ : (C) == 'L' ? -32768 <= (VALUE) && (VALUE) < 32768 \
+ : (C) == 'N' ? 0 <= (VALUE) && (VALUE) < 65536 \
: 0)
/* Similar, but for floating constants, and defining letters G and H.
@@ -455,9 +470,18 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
/* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */
-#define FUNCTION_PROFILER(FILE, LABELNO) \
- fprintf (FILE, "\tmovab LP%d,%s\n\tjsb mcount\n", (LABELNO), \
- reg_names[0]);
+#define VAX_FUNCTION_PROFILER_NAME "mcount"
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+ do \
+ { \
+ char label[256]; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "LP", (LABELNO)); \
+ fprintf (FILE, "\tmovab "); \
+ assemble_name (FILE, label); \
+ asm_fprintf (FILE, ",%Rr0\n\tjsb %s\n", \
+ VAX_FUNCTION_PROFILER_NAME); \
+ } \
+ while (0)
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
the stack pointer does not matter. The value is tested only in
@@ -502,9 +526,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
FNADDR is an RTX for the address of the function's pure code.
CXT is an RTX for the static chain value for the function. */
-/* Allow this be overriden with the correct register prefixes. */
-#define VAX_ISTREAM_SYNC "movpsl -(sp)\n\tpushal 1(pc)\n\trei"
-
/* We copy the register-mask from the function's pure code
to the start of the trampoline. */
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
@@ -514,7 +535,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 4)), CXT); \
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 11)), \
plus_constant (FNADDR, 2)); \
- emit_insn (gen_rtx_ASM_INPUT (VOIDmode, VAX_ISTREAM_SYNC)); \
+ emit_insn (gen_sync_istream ()); \
}
/* Byte offset of return address in a stack frame. The "saved PC" field
@@ -536,10 +557,8 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
/* Addressing modes, and classification of registers for them. */
#define HAVE_POST_INCREMENT 1
-/* #define HAVE_POST_DECREMENT 0 */
#define HAVE_PRE_DECREMENT 1
-/* #define HAVE_PRE_INCREMENT 0 */
/* Macros to check register numbers against specific register classes. */
@@ -630,7 +649,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
|| GET_CODE (X) == CONST_INT)
-/* Non-zero if X is an address which can be indirected. External symbols
+/* Nonzero if X is an address which can be indirected. External symbols
could be in a sharable image library, so we disallow those. */
#define INDIRECTABLE_ADDRESS_P(X) \
@@ -645,7 +664,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
#define INDIRECTABLE_CONSTANT_ADDRESS_P(X) CONSTANT_ADDRESS_P(X)
-/* Non-zero if X is an address which can be indirected. */
+/* Nonzero if X is an address which can be indirected. */
#define INDIRECTABLE_ADDRESS_P(X) \
(CONSTANT_ADDRESS_P (X) \
|| (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \
@@ -784,6 +803,10 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
jumps to the default label instead. */
#define CASE_DROPS_THROUGH
+/* Indicate that jump tables go in the text section. This is
+ necessary when compiling PIC code. */
+#define JUMP_TABLES_IN_TEXT_SECTION 1
+
/* Define this as 1 if `char' should by default be signed; else as 0. */
#define DEFAULT_SIGNED_CHAR 1
@@ -885,32 +908,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
#define UDIVSI3_LIBCALL "*udiv"
#define UMODSI3_LIBCALL "*urem"
-
-/* Check a `double' value for validity for a particular machine mode. */
-
-/* note that it is very hard to accidentally create a number that fits in a
- double but not in a float, since their ranges are almost the same */
-
-#define CHECK_FLOAT_VALUE(MODE, D, OVERFLOW) \
- ((OVERFLOW) = check_float_value (MODE, &D, OVERFLOW))
-
-/* For future reference:
- D Float: 9 bit, sign magnitude, excess 128 binary exponent
- normalized 56 bit fraction, redundant bit not represented
- approximately 16 decimal digits of precision
-
- The values to use if we trust decimal to binary conversions:
-#define MAX_D_FLOAT 1.7014118346046923e+38
-#define MIN_D_FLOAT .29387358770557188e-38
-
- G float: 12 bit, sign magnitude, excess 1024 binary exponent
- normalized 53 bit fraction, redundant bit not represented
- approximately 15 decimal digits precision
-
- The values to use if we trust decimal to binary conversions:
-#define MAX_G_FLOAT .898846567431157e+308
-#define MIN_G_FLOAT .556268464626800e-308
-*/
/* Tell final.c how to eliminate redundant test instructions. */
@@ -1028,7 +1025,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
/* This is BSD, so it wants DBX format. */
-#define DBX_DEBUGGING_INFO
+#define DBX_DEBUGGING_INFO 1
/* Do not break .stabs pseudos into continuations. */
@@ -1061,12 +1058,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
#define USER_LABEL_PREFIX "_"
-/* This is how to output an internal numbered label where
- PREFIX is the class of label and NUM is the number within the class. */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
- fprintf (FILE, "%s%d:\n", 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.
@@ -1085,19 +1076,39 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
It need not be very fast code. */
#define ASM_OUTPUT_REG_POP(FILE,REGNO) \
- fprintf (FILE, "\tmovl (sp)+,%s\n", reg_names[REGNO])
+ fprintf (FILE, "\tmovl (%s)+,%s\n", reg_names[STACK_POINTER_REGNUM], \
+ reg_names[REGNO])
/* This is how to output an element of a case-vector that is absolute.
(The VAX does not use such vectors,
but we must define this macro anyway.) */
-#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
- fprintf (FILE, "\t.long L%d\n", VALUE)
+#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
+ do \
+ { \
+ char label[256]; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));\
+ fprintf (FILE, "\t.long "); \
+ assemble_name (FILE, label); \
+ fprintf (FILE, "\n"); \
+ } \
+ while (0)
/* This is how to output an element of a case-vector that is relative. */
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
- fprintf (FILE, "\t.word L%d-L%d\n", VALUE, REL)
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
+ do \
+ { \
+ char label[256]; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE)); \
+ fprintf (FILE, "\t.word "); \
+ assemble_name (FILE, label); \
+ ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL)); \
+ fprintf (FILE, "-"); \
+ assemble_name (FILE, label); \
+ fprintf (FILE, "\n"); \
+ } \
+ while (0)
/* This is how to output an assembler line
that says to advance the location counter
@@ -1128,28 +1139,13 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
assemble_name ((FILE), (NAME)), \
fprintf ((FILE), ",%u\n", (ROUNDED)))
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
- sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
-
/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
Used for C++ multiple inheritance.
.mask ^m<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11> #conservative entry mask
addl2 $DELTA, 4(ap) #adjust first argument
jmp FUNCTION+2 #jump beyond FUNCTION's entry mask
*/
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
-do { \
- fprintf (FILE, "\t.word 0x0ffc\n"); \
- fprintf (FILE, "\taddl2 $%d,4(%sap)\n", DELTA, REGISTER_PREFIX); \
- fprintf (FILE, "\tjmp "); \
- assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
- fprintf (FILE, "+2\n"); \
-} while (0)
+#define ASM_OUTPUT_MI_THUNK vax_output_mi_thunk
/* Print an instruction operand X on file FILE.
CODE is the code from the %-spec that requested printing this operand;
@@ -1168,17 +1164,20 @@ VAX operand formatting codes:
R 32 - constant operand
b the low 8 bits of a negated constant operand
h the low 16 bits of a negated constant operand
- # 'd' or 'g' depending on whether dfloat or gfloat is used */
+ # 'd' or 'g' depending on whether dfloat or gfloat is used
+ | register prefix */
/* The purpose of D is to get around a quirk or bug in VAX assembler
whereby -1 in a 64-bit immediate operand means 0x00000000ffffffff,
which is not a 64-bit minus one. */
#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
- ((CODE) == '#')
+ ((CODE) == '#' || (CODE) == '|')
#define PRINT_OPERAND(FILE, X, CODE) \
{ if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE); \
+ else if (CODE == '|') \
+ fputs (REGISTER_PREFIX, FILE); \
else if (CODE == 'C') \
fputs (rev_cond_name (X), FILE); \
else if (CODE == 'D' && GET_CODE (X) == CONST_INT && INTVAL (X) < 0) \
@@ -1205,14 +1204,14 @@ VAX operand formatting codes:
else if (GET_CODE (X) == MEM) \
output_address (XEXP (X, 0)); \
else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \
- { REAL_VALUE_TYPE r; char dstr[30]; \
- REAL_VALUE_FROM_CONST_DOUBLE (r, X); \
- REAL_VALUE_TO_DECIMAL (r, "%.20e", dstr); \
+ { char dstr[30]; \
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \
+ sizeof (dstr), 0, 1); \
fprintf (FILE, "$0f%s", dstr); } \
else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \
- { REAL_VALUE_TYPE r; char dstr[30]; \
- REAL_VALUE_FROM_CONST_DOUBLE (r, X); \
- REAL_VALUE_TO_DECIMAL (r, "%.20e", dstr); \
+ { char dstr[30]; \
+ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \
+ sizeof (dstr), 0, 1); \
fprintf (FILE, "$0%c%s", ASM_DOUBLE_CHAR, dstr); } \
else { putc ('$', FILE); output_addr_const (FILE, X); }}
@@ -1221,3 +1220,8 @@ VAX operand formatting codes:
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
print_operand_address (FILE, ADDR)
+
+/* This is a blatent lie. However, it's good enough, since we don't
+ actually have any code whatsoever for which this isn't overridden
+ by the proper FDE definition. */
+#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PC_REGNUM)
diff --git a/gcc/config/vax/vax.md b/gcc/config/vax/vax.md
index 56e18a06391..1a163ad7763 100644
--- a/gcc/config/vax/vax.md
+++ b/gcc/config/vax/vax.md
@@ -28,6 +28,15 @@
;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
;;- updates for most instructions.
+;; UNSPEC_VOLATILE usage:
+
+(define_constants
+ [(VUNSPEC_BLOCKAGE 0) ; `blockage' insn to prevent scheduling across an
+ ; insn in the code.
+ (VUNSPEC_SYNC_ISTREAM 1) ; sequence of insns to sync the I-stream
+ ]
+)
+
;; We don't want to allow a constant operand for test insns because
;; (set (cc0) (const_int foo)) has no mode information. Such insns will
;; be folded while optimizing anyway.
@@ -1798,11 +1807,6 @@
""
"decl %0\;jgequ %l1")
-;; Note that operand 1 is total size of args, in bytes,
-;; and what the call insn wants is the number of words.
-;; It is used in the call instruction as a byte, but in the addl2 as
-;; a word. Since the only time we actually use it in the call instruction
-;; is when it is a constant, SImode (for addl2) is the proper mode.
(define_expand "call_pop"
[(parallel [(call (match_operand:QI 0 "memory_operand" "")
(match_operand:SI 1 "const_int_operand" ""))
@@ -1810,12 +1814,15 @@
(plus:SI (reg:SI 14)
(match_operand:SI 3 "immediate_operand" "")))])]
""
- "
{
- if (INTVAL (operands[1]) > 255 * 4)
+ if (INTVAL (operands[3]) > 255 * 4 || INTVAL (operands[3]) % 4)
abort ();
- operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
-}")
+
+ /* Operand 1 is the number of bytes to be popped by DW_CFA_GNU_args_size
+ during EH unwinding. We must include the argument count pushed by
+ the calls instruction. */
+ operands[1] = GEN_INT (INTVAL (operands[3]) + 4);
+})
(define_insn "*call_pop"
[(call (match_operand:QI 0 "memory_operand" "m")
@@ -1823,7 +1830,10 @@
(set (reg:SI 14) (plus:SI (reg:SI 14)
(match_operand:SI 2 "immediate_operand" "i")))]
""
- "calls %1,%0")
+{
+ operands[1] = GEN_INT ((INTVAL (operands[1]) - 4) / 4);
+ return "calls %1,%0";
+})
(define_expand "call_value_pop"
[(parallel [(set (match_operand 0 "" "")
@@ -1833,12 +1843,15 @@
(plus:SI (reg:SI 14)
(match_operand:SI 4 "immediate_operand" "")))])]
""
- "
{
- if (INTVAL (operands[2]) > 255 * 4)
- abort ();
- operands[2] = GEN_INT ((INTVAL (operands[2]) + 3)/ 4);
-}")
+ if (INTVAL (operands[4]) > 255 * 4 || INTVAL (operands[4]) % 4)
+ abort ();
+
+ /* Operand 2 is the number of bytes to be popped by DW_CFA_GNU_args_size
+ during EH unwinding. We must include the argument count pushed by
+ the calls instruction. */
+ operands[2] = GEN_INT (INTVAL (operands[4]) + 4);
+})
(define_insn "*call_value_pop"
[(set (match_operand 0 "" "")
@@ -1847,20 +1860,47 @@
(set (reg:SI 14) (plus:SI (reg:SI 14)
(match_operand:SI 3 "immediate_operand" "i")))]
""
- "calls %2,%1")
+ "*
+{
+ operands[2] = GEN_INT ((INTVAL (operands[2]) - 4) / 4);
+ return \"calls %2,%1\";
+}")
+
+(define_expand "call"
+ [(call (match_operand:QI 0 "memory_operand" "")
+ (match_operand:SI 1 "const_int_operand" ""))]
+ ""
+ "
+{
+ /* Operand 1 is the number of bytes to be popped by DW_CFA_GNU_args_size
+ during EH unwinding. We must include the argument count pushed by
+ the calls instruction. */
+ operands[1] = GEN_INT (INTVAL (operands[1]) + 4);
+}")
-;; Define another set of these for the case of functions with no operands.
-;; These will allow the optimizers to do a slightly better job.
-(define_insn "call"
- [(call (match_operand:QI 0 "memory_operand" "m")
- (const_int 0))]
+(define_insn "*call"
+ [(call (match_operand:QI 0 "memory_operand" "m")
+ (match_operand:SI 1 "const_int_operand" ""))]
""
"calls $0,%0")
-(define_insn "call_value"
+(define_expand "call_value"
+ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "memory_operand" "")
+ (match_operand:SI 2 "const_int_operand" "")))]
+ ""
+ "
+{
+ /* Operand 2 is the number of bytes to be popped by DW_CFA_GNU_args_size
+ during EH unwinding. We must include the argument count pushed by
+ the calls instruction. */
+ operands[2] = GEN_INT (INTVAL (operands[2]) + 4);
+}")
+
+(define_insn "*call_value"
[(set (match_operand 0 "" "")
(call (match_operand:QI 1 "memory_operand" "m")
- (const_int 0)))]
+ (match_operand:SI 2 "const_int_operand" "")))]
""
"calls $0,%1")
@@ -1897,7 +1937,7 @@
;; all of memory. This blocks insns from being moved across this point.
(define_insn "blockage"
- [(unspec_volatile [(const_int 0)] 0)]
+ [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)]
""
"")
@@ -2121,3 +2161,9 @@
= GEN_INT (INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1));
return \"rotl %2,%1,%0\;bicl2 %N3,%0\";
}")
+
+;; Instruction sequence to sync the VAX instruction stream.
+(define_insn "sync_istream"
+ [(unspec_volatile [(const_int 0)] VUNSPEC_SYNC_ISTREAM)]
+ ""
+ "movpsl -(%|sp)\;pushal 1(%|pc)\;rei")
diff --git a/gcc/config/vax/vaxv.h b/gcc/config/vax/vaxv.h
index 7b8e7fff5ff..7b322307ba0 100644
--- a/gcc/config/vax/vaxv.h
+++ b/gcc/config/vax/vaxv.h
@@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */
#define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
#undef DBX_DEBUGGING_INFO
-#define SDB_DEBUGGING_INFO
+#define SDB_DEBUGGING_INFO 1
#undef LIB_SPEC
diff --git a/gcc/config/vax/vms.h b/gcc/config/vax/vms.h
deleted file mode 100644
index 870ebaf04eb..00000000000
--- a/gcc/config/vax/vms.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/* Output variables, constants and external declarations, for GNU compiler.
- Copyright (C) 1988, 1994, 1995, 1996, 1997, 1999, 2001, 2002
- 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. */
-
-#define TARGET_EXECUTABLE_SUFFIX ".exe"
-#define TARGET_OBJECT_SUFFIX ".obj"
-
-/* This enables certain macros in vax.h, which will make an indirect
- reference to an external symbol an invalid address. This needs to be
- defined before we include vax.h, since it determines which macros
- are used for GO_IF_*. */
-
-#define NO_EXTERNAL_INDIRECT_ADDRESS
-
-#include "vax/vax.h"
-
-#undef VMS_TARGET
-#define VMS_TARGET 1
-
-#undef LIB_SPEC
-#undef TARGET_NAME
-#undef TARGET_DEFAULT
-#undef CALL_USED_REGISTERS
-#undef STARTING_FRAME_OFFSET
-
-#define TARGET_OS_CPP_BUILTINS() \
- do \
- { \
- builtin_define_std ("vms"); \
- builtin_define_std ("VMS"); \
- builtin_assert ("system=vms"); \
- \
- builtin_define_std ("vax"); \
- if (TARGET_G_FLOAT) \
- builtin_define_std ("GFLOAT"); \
- } \
- while (0)
-
-/* These match the definitions used in VAXCRTL, the VMS C run-time library */
-
-#define SIZE_TYPE "unsigned int"
-#define PTRDIFF_TYPE "int"
-#define WCHAR_TYPE "unsigned int"
-#define WCHAR_TYPE_SIZE 32 /* in bits */
-
-/* Use memcpy for structure copying, and so forth. */
-#define TARGET_MEM_FUNCTIONS
-
-/* Strictly speaking, VMS does not use DBX at all, but the interpreter built
- into gas only speaks straight DBX. */
-
-#define DEFAULT_GDB_EXTENSIONS 0
-
-#define TARGET_DEFAULT 1
-#define TARGET_NAME "vax/vms"
-
-/* The structure return address arrives as an "argument" on VMS. */
-#undef STRUCT_VALUE_REGNUM
-#define STRUCT_VALUE 0
-#undef PCC_STATIC_STRUCT_RETURN
-
-#define CALL_USED_REGISTERS {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}
-
-/* The run-time library routine VAXC$ESTABLISH (necessary when mixing
- VMS exception handling and setjmp/longjmp in the same program) requires
- that a hidden automatic variable at the top of the stack be reserved
- for its use. We accomplish this by simply adding 4 bytes to the local
- stack for all functions, and making sure that normal local variables
- are 4 bytes lower on the stack then they would otherwise have been. */
-
-#define STARTING_FRAME_OFFSET -4
-
-/* This macro definition sets up a default value for `main' to return. */
-#define DEFAULT_MAIN_RETURN c_expand_return (integer_one_node)
-
-/* Globalizing directive for a label. */
-#define GLOBAL_ASM_OP ".globl "
-
-/* Under VMS we write the actual size of the storage to be allocated even
- though the symbol is external. Although it is possible to give external
- symbols a size of 0 (as unix does), the VMS linker does not make the
- distinction between a variable definition and an external reference of a
- variable, and thus the linker will not complain about a missing definition.
- If we followed the unix example of giving external symbols a size of
- zero, you tried to link a program where a given variable was externally
- defined but none of the object modules contained a non-extern definition,
- the linker would allocate 0 bytes for the variable, and any attempt to
- use that variable would use the storage allocated to some other variable.
-
- We must also select either const_section or data_section: this will indicate
- whether or not the variable will get the readonly bit set. Since the
- VMS linker does not distinguish between a variable's definition and an
- external reference, all usages of a given variable must have the readonly
- bit set the same way, or the linker will get confused and give warning
- messages. */
-
-/* We used to round the size up to a multiple of 4,
- but that causes linker errors sometimes when the variable was initialized
- since the size of its definition was not likewise rounded up. */
-
-/* Note: the original ASM_OUTPUT_EXTERNAL code has been moved into
- vms_check_external and vms_flush_pending_externals. */
-
-#define ASM_OUTPUT_EXTERNAL(FILE,DECL,NAME) \
-{ if (DECL_INITIAL (DECL) == 0 && TREE_CODE (DECL) != FUNCTION_DECL) \
- vms_check_external ((DECL), (NAME), 1); \
-}
-
-/* ASM_OUTPUT_EXTERNAL will have wait until after an initializer is
- completed in order to switch sections for an external object, so
- use the DECLARE_OBJECT hooks to manage deferred declarations. */
-
-/* This is the default action for ASM_DECLARE_OBJECT_NAME, but if it
- is explicitly defined, then ASM_FINISH_DECLARE_OBJECT will be used. */
-
-#define ASM_DECLARE_OBJECT_NAME(ASM_OUT_FILE,NAME,DECL) \
- ASM_OUTPUT_LABEL ((ASM_OUT_FILE), (NAME))
-
-/* We don't need to do anything special to finish the current object, but it
- should now be safe to output any deferred external global declarations. */
-
-#define ASM_FINISH_DECLARE_OBJECT(FILE,DECL,TOPLVL,ATEND) \
- vms_flush_pending_externals(FILE)
-
-/* Anything still pending must be flushed at the very end. */
-
-#define ASM_FILE_END(STREAM) \
- vms_flush_pending_externals(STREAM)
-
-/* Here we redefine ASM_OUTPUT_COMMON to select the data_section or the
- const_section before writing the ".const" assembler directive.
- If we were specifying a size of zero for external variables, we would
- not have to select a section, since the assembler can assume that
- when the size > 0, the storage is for a non-external, uninitialized
- variable (for which a "const" declaration would be senseless),
- and the assembler can make the storage read/write.
-
- Since the ".const" directive specifies the actual size of the storage used
- for both external and non-external variables, the assembler cannot
- make this assumption, and thus it has no way of deciding if storage should
- be read/write or read-only. To resolve this, we give the assembler some
- assistance, in the form of a ".const" or a ".data" directive.
-
- Under GCC 1.40, external variables were declared with a size of zero.
- The GNU assembler, GAS, will recognize the "-2" switch when built for VMS;
- when compiling programs with GCC 2.n this switch should be used or the
- assembler will not give the read-only attribute to external constants.
- Failure to use this switch will result in linker warning messages about
- mismatched psect attributes. */
-
-#undef ASM_OUTPUT_COMMON
-
-#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
-( ((TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl)) \
- ? (const_section (), 0) : (data_section (), 0)), \
- fputs (".comm ", (FILE)), \
- assemble_name ((FILE), (NAME)), \
- fprintf ((FILE), ",%u\n", (SIZE)))
-
-/* We define this to prevent the name mangler from putting dollar signs into
- function names. This isn't really needed, but it has been here for
- some time and removing it would cause the object files generated by the
- compiler to be incompatible with the object files from a compiler that
- had this defined. Since it does no harm, we leave it in. */
-
-#define NO_DOLLAR_IN_LABEL
-
-/* Add a "const" section. This is viewed by the assembler as being nearly
- the same as the "data" section, with the only difference being that a
- flag is set for variables declared while in the const section. This
- flag is used to determine whether or not the read/write bit should be
- set in the Psect definition. */
-
-#define EXTRA_SECTIONS in_const
-
-#define EXTRA_SECTION_FUNCTIONS \
-void \
-const_section () \
-{ \
- if (in_section != in_const) { \
- fprintf(asm_out_file,".const\n"); \
- in_section = in_const; \
- } \
-}
-
-/* This is used by a hook in varasm.c to write the assembler directives
- that are needed to tell the startup code which constructors need to
- be run. */
-
-#define TARGET_ASM_CONSTRUCTOR vms_asm_out_constructor
-#define TARGET_ASM_DESTRUCTOR vms_asm_out_destructor
-
-/* The following definitions are used in libgcc2.c with the __main
- function. The _SHR symbol is used when the sharable image library
- for the C++ library is used - this is picked up automatically by the linker
- and this symbol points to the start of __CTOR_LIST__ from the C++ library.
- If the C++ library is not used, then __CTOR_LIST_SHR__ occurs just after
- __CTOR_LIST__, and essentially points to the same list as __CTOR_LIST. */
-
-#ifdef L__main
-
-#define __CTOR_LIST__ __gxx_init_0
-#define __CTOR_LIST_END__ __gxx_init_2
-
-#define __CTOR_LIST_SHR__ $$PsectAttributes_NOSHR$$__gxx_init_0_shr
-#define __CTOR_LIST_SHR_END__ $$PsectAttributes_NOSHR$$__gxx_init_2_shr
-
-#define DO_GLOBAL_CTORS_BODY \
-do { \
- func_ptr *p; \
- extern func_ptr __CTOR_LIST__[1], __CTOR_LIST_END__[1]; \
- extern func_ptr __CTOR_LIST_SHR__[1], __CTOR_LIST_SHR_END__[1]; \
- if (&__CTOR_LIST_SHR__[0] != &__CTOR_LIST__[1]) \
- for (p = __CTOR_LIST_SHR__ + 1; p < __CTOR_LIST_SHR_END__ ; p++ ) \
- if (*p) (*p) (); \
- for (p = __CTOR_LIST__ + 1; p < __CTOR_LIST_END__ ; p++ ) \
- if (*p) (*p) (); \
- do { /* arrange for `return' from main() to pass through exit() */ \
- __label__ foo; \
- int *callers_caller_fp = (int *) __builtin_frame_address (3); \
- register int retval asm ("r0"); \
- callers_caller_fp[4] = (int) && foo; \
- break; /* out of do-while block */ \
- foo: \
- exit (retval); \
- } while (0); \
-} while (0)
-
-#define __DTOR_LIST__ __gxx_clean_0
-#define __DTOR_LIST_END__ __gxx_clean_2
-
-#define __DTOR_LIST_SHR__ $$PsectAttributes_NOSHR$$__gxx_clean_0_shr
-#define __DTOR_LIST_SHR_END__ $$PsectAttributes_NOSHR$$__gxx_clean_2_shr
-
-#define DO_GLOBAL_DTORS_BODY \
-do { \
- func_ptr *p; \
- extern func_ptr __DTOR_LIST__[1], __DTOR_LIST_END__[1]; \
- extern func_ptr __DTOR_LIST_SHR__[1], __DTOR_LIST_SHR_END__[1]; \
- for (p = __DTOR_LIST__ + 1; p < __DTOR_LIST_END__ ; p++ ) \
- if (*p) (*p) (); \
- if (&__DTOR_LIST_SHR__[0] != &__DTOR_LIST__[1]) \
- for (p = __DTOR_LIST_SHR__ + 1; p < __DTOR_LIST_SHR_END__ ; p++ ) \
- if (*p) (*p) (); \
-} while (0)
-
-#endif /* L__main */
-
-/* Specify the list of include file directories. */
-#define INCLUDE_DEFAULTS \
-{ \
- { "GNU_GXX_INCLUDE:", "G++", 1, 1 }, \
- { "GNU_CC_INCLUDE:", "GCC", 0, 0 }, /* GNU includes */ \
- { "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0 }, /* VAX-11 "C" includes */ \
- { ".", 0, 0, 1 }, /* Make normal VMS filespecs work. */ \
- { 0, 0, 0, 0 } \
-}
diff --git a/gcc/config/vax/xm-vms.h b/gcc/config/vax/xm-vms.h
deleted file mode 100644
index eaf5f3bf510..00000000000
--- a/gcc/config/vax/xm-vms.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Configuration for GNU C-compiler for VAX.
- Copyright (C) 1987, 1994, 1995, 1996, 1997, 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. */
-
-/* Other configurations get these via autoconfig. */
-#define STDC_HEADERS 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRING_H 1
-#ifdef __DECC
-#define HAVE_UNISTD_H 1
-#endif
-
-#if defined(VAXC) || defined(__DECC)
-/* if compiling with VAXC, need to fix problem with <stdio.h>
- which defines a macro called FILE_TYPE that breaks "tree.h".
- Fortunately it uses #ifndef to suppress multiple inclusions.
- Three possible cases:
- 1) <stdio.h> has already been included -- ours will be no-op;
- 2) <stdio.h> will be included after us -- "theirs" will be no-op;
- 3) <stdio.h> isn't needed -- including it here shouldn't hurt.
- In all three cases, the problem macro will be removed here. */
-#include <stdio.h>
-#undef FILE_TYPE
-#endif
-
-#define SUCCESS_EXIT_CODE 1
-#define FATAL_EXIT_CODE (44 | 0x10000000) /* Abort, and no DCL message. */
-
-/* A couple of conditionals for execution machine are controlled here. */
-#ifndef VMS
-#define VMS
-#endif
-
-#define GCC_INCLUDE_DIR "///not used with VMS///" /* nonsense string for now */
-
-/* and define a local equivalent (sort of) for unlink */
-#define unlink remove
-
-/* Under VMS a directory specification can be enclosed either in square
- brackets or in angle brackets. Thus we need to check both. This
- macro is used to help compare filenames in cp-lex.c.
-
- We also need to make sure that the names are all lower case, because
- we must be able to compare filenames to determine if a file implements
- a class. */
-
-#define FILE_NAME_NONDIRECTORY(C) \
-({ \
- char * pnt_ = (C), * pnt1_; \
- pnt1_ = pnt_ - 1; \
- while (*++pnt1_) \
- if (ISUPPER (*pnt1_)) *pnt1_ = TOLOWER (*pnt1_); \
- pnt1_ = strrchr (pnt_, ']'); \
- pnt1_ = (pnt1_ == 0 ? strrchr (pnt_, '>') : pnt1_); \
- pnt1_ = (pnt1_ == 0 ? strrchr (pnt_, ':') : pnt1_); \
- (pnt1_ == 0 ? pnt_ : pnt1_ + 1); \
- })
-
-/* Macro to generate the name of the cross reference file. The standard
- one does not work, since it was written assuming that the conventions
- of a unix style filesystem will work on the host system. */
-
-#define XREF_FILE_NAME(BUFF, NAME) \
- s = FILE_NAME_NONDIRECTORY (NAME); \
- if (s == NAME) sprintf(BUFF, "%s_gxref", NAME); \
- else { \
- strcpy(BUFF, NAME); \
- strcat(BUFF, "_gxref"); \
- }
-
-/* Macro that is used in cp-xref.c to determine whether a file name is
- absolute or not. */
-
-#define FILE_NAME_ABSOLUTE_P(NAME) \
- (FILE_NAME_NONDIRECTORY (NAME) != (&NAME[1]))
-
-/* FILE_NAME_JOINER is defined to be the characters that are inserted between
- a directory name and a filename in order to make an absolute file
- specification. Under VMS the directory specification contains all of the
- required characters, so we define this to be a null string. */
-
-#define FILE_NAME_JOINER ""
-
-/* vprintf() has been available since VMS V4.6. */
-
-#define HAVE_VPRINTF
-
-/* Early versions of VAX C for VMS do not have putenv. Comment out
- the following define if your system doesn't have putenv. */
-#define HAVE_PUTENV
-
-#ifndef HAVE_PUTENV
-#define putenv(x)
-#endif
-
-#if defined(VAXC) || defined(__DECC)
-
-/* Customizations/kludges for building with DEC's VAX C compiler
- rather than GCC. */
-
-#define QSORT_WORKAROUND /* do not use VAXCRTL's qsort */
-
-/* use ANSI/SYSV style byte manipulation routines instead of BSD ones */
-/* rename all too-long external symbol names to avoid warnings */
-#define check_for_full_enumeration_handling check_for_full_enum_handling
-#define current_function_contains_functions curfunc_contains_functions
-#define current_function_epilogue_delay_list curfunc_epilogue_delay_list
-#define current_function_has_nonlocal_goto curfunc_has_nonlocal_goto
-#define current_function_has_nonlocal_label curfunc_has_nonlocal_label
-#define current_function_internal_arg_pointer curfunc_internal_arg_pointer
-#define current_function_outgoing_args_size curfunc_outgoing_args_size
-#define current_function_pretend_args_size curfunc_pretend_args_size
-#define current_function_returns_pcc_struct curfunc_returns_pcc_struct
-#define current_function_returns_pointer curfunc_returns_pointer
-#define current_function_uses_const_pool curfunc_uses_const_pool
-#define current_function_uses_pic_offset_table curfunc_uses_pic_offset_table
-#define dbxout_resume_previous_source_file dbxout_resume_previous_src_file
-#define expand_builtin_extract_return_addr expand_builtin_extract_ret_addr
-#define expand_builtin_set_return_addr_reg expand_builtin_set_ret_addr_reg
-#define expand_start_loop_continue_elsewhere expnd_start_loop_cont_elsewhere
-#define flag_schedule_insns_after_reload flag_sched_insns_after_reload
-#define get_dynamic_handler_chain_libfunc get_dynamic_hndlr_chain_libfunc
-#define lookup_name_current_level_global lookup_name_current_level_gbl
-#define maybe_building_objc_message_expr maybe_building_objc_msg_expr
-#define mesg_implicit_function_declaration mesg_implicit_func_declaration
-#define output_deferred_addressed_constants output_deferred_addr_constants
-#define protect_cleanup_actions_with_terminate protect_cleanup_act_w_terminate
-#define reg_overlap_mentioned_for_reload_p reg_overlap_mtnd_for_reload_p
-#define reposition_prologue_and_epilogue_notes repos_prolog_and_epilog_notes
-#define rtx_equal_function_value_matters rtx_equal_func_value_matters
-#define set_new_first_and_last_label_num set_new_first_and_last_lbl_num
-#define thread_prologue_and_epilogue_insns thread_prolog_and_epilog_insns
-#endif
-
-/* We need to avoid the library qsort routine, due to a serious bug
- in VAXCRTL. (Sorting anything with size that's not a multiple of 4
- after having previously sorted something that was a multiple of 4
- can produce wrong results and result in data corruption.) We'll
- use our own substitute (in vax.c) instead. */
-#ifdef QSORT_WORKAROUND
-#define qsort not_qsort
-#endif
-
-#ifdef __DECC
-/* DECC$SHR doesn't have VAXCRTL's bugs. */
-#undef QSORT_WORKAROUND
-#undef qsort
-/* Avoid a lot of informational level diagnostics about implicitly
- declared functions. */
-#include <stdlib.h>
-#include <string.h>
-/* this is for genopinit.c */
- #pragma message disable (undefescap)
-#endif
-
-#define HOST_EXECUTABLE_SUFFIX ".exe"
-#define HOST_OBJECT_SUFFIX ".obj"
diff --git a/gcc/config/xtensa/elf.h b/gcc/config/xtensa/elf.h
index 7d1ba00e637..866c463c8dd 100644
--- a/gcc/config/xtensa/elf.h
+++ b/gcc/config/xtensa/elf.h
@@ -24,6 +24,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
builtin_define ("__ELF__"); \
} while (0)
+#define TARGET_SECTION_TYPE_FLAGS xtensa_multibss_section_type_flags
+
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
diff --git a/gcc/config/xtensa/xtensa-protos.h b/gcc/config/xtensa/xtensa-protos.h
index ddeb5f35f16..051c81e6939 100644
--- a/gcc/config/xtensa/xtensa-protos.h
+++ b/gcc/config/xtensa/xtensa-protos.h
@@ -1,5 +1,5 @@
/* Prototypes of target machine for GNU compiler for Xtensa.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright 2001,2002 Free Software Foundation, Inc.
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This file is part of GCC.
@@ -89,7 +89,7 @@ extern void xtensa_reorg PARAMS ((rtx));
extern rtx xtensa_return_addr PARAMS ((int, rtx));
extern rtx xtensa_builtin_saveregs PARAMS ((void));
extern enum reg_class xtensa_preferred_reload_class
- PARAMS ((rtx, enum reg_class));
+ PARAMS ((rtx, enum reg_class, int));
extern enum reg_class xtensa_secondary_reload_class
PARAMS ((enum reg_class, enum machine_mode, rtx, int));
extern int a7_overlap_mentioned_p PARAMS ((rtx x));
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 8bab197c688..ae7c994d9a8 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -1,5 +1,5 @@
/* Subroutines for insn-output.c for Tensilica's Xtensa architecture.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright 2001,2002 Free Software Foundation, Inc.
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This file is part of GCC.
@@ -107,10 +107,10 @@ const char xtensa_leaf_regs[FIRST_PSEUDO_REGISTER] =
/* Map hard register number to register class */
const enum reg_class xtensa_regno_to_class[FIRST_PSEUDO_REGISTER] =
{
- GR_REGS, SP_REG, GR_REGS, GR_REGS,
- GR_REGS, GR_REGS, GR_REGS, GR_REGS,
- GR_REGS, GR_REGS, GR_REGS, GR_REGS,
- GR_REGS, GR_REGS, GR_REGS, GR_REGS,
+ RL_REGS, SP_REG, RL_REGS, RL_REGS,
+ RL_REGS, RL_REGS, RL_REGS, GR_REGS,
+ RL_REGS, RL_REGS, RL_REGS, RL_REGS,
+ RL_REGS, RL_REGS, RL_REGS, RL_REGS,
AR_REGS, AR_REGS, BR_REGS,
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
@@ -197,8 +197,10 @@ static rtx fixup_subreg_mem PARAMS ((rtx x));
static enum machine_mode xtensa_find_mode_for_size PARAMS ((unsigned));
static struct machine_function * xtensa_init_machine_status PARAMS ((void));
static void printx PARAMS ((FILE *, signed int));
-static void xtensa_select_rtx_section PARAMS ((enum machine_mode, rtx,
- unsigned HOST_WIDE_INT));
+static unsigned int xtensa_multibss_section_type_flags
+ PARAMS ((tree, const char *, int));
+static void xtensa_select_rtx_section
+ PARAMS ((enum machine_mode, rtx, unsigned HOST_WIDE_INT));
static void xtensa_encode_section_info PARAMS ((tree, int));
static rtx frame_size_const;
@@ -2612,16 +2614,22 @@ xtensa_va_arg (valist, type)
enum reg_class
-xtensa_preferred_reload_class (x, class)
+xtensa_preferred_reload_class (x, class, isoutput)
rtx x;
enum reg_class class;
+ int isoutput;
{
- if (CONSTANT_P (x) && GET_CODE (x) == CONST_DOUBLE)
+ if (!isoutput && CONSTANT_P (x) && GET_CODE (x) == CONST_DOUBLE)
return NO_REGS;
- /* Don't use sp for reloads! */
- if (class == AR_REGS)
- return GR_REGS;
+ /* Don't use the stack pointer or hard frame pointer for reloads!
+ The hard frame pointer would normally be OK except that it may
+ briefly hold an incoming argument in the prologue, and reload
+ won't know that it is live because the hard frame pointer is
+ treated specially. */
+
+ if (class == AR_REGS || class == GR_REGS)
+ return RL_REGS;
return class;
}
@@ -2643,13 +2651,13 @@ xtensa_secondary_reload_class (class, mode, x, isoutput)
if (!isoutput)
{
if (class == FP_REGS && constantpool_mem_p (x))
- return GR_REGS;
+ return RL_REGS;
}
if (ACC_REG_P (regno))
- return (class == GR_REGS ? NO_REGS : GR_REGS);
+ return ((class == GR_REGS || class == RL_REGS) ? NO_REGS : RL_REGS);
if (class == ACC_REG)
- return (GP_REG_P (regno) ? NO_REGS : GR_REGS);
+ return (GP_REG_P (regno) ? NO_REGS : RL_REGS);
return NO_REGS;
}
@@ -2746,6 +2754,34 @@ a7_overlap_mentioned_p (x)
return 0;
}
+
+/* Some Xtensa targets support multiple bss sections. If the section
+ name ends with ".bss", add SECTION_BSS to the flags. */
+
+static unsigned int
+xtensa_multibss_section_type_flags (decl, name, reloc)
+ tree decl;
+ const char *name;
+ int reloc;
+{
+ unsigned int flags = default_section_type_flags (decl, name, reloc);
+ const char *suffix;
+
+ suffix = strrchr (name, '.');
+ if (suffix && strcmp (suffix, ".bss") == 0)
+ {
+ if (!decl || (TREE_CODE (decl) == VAR_DECL
+ && DECL_INITIAL (decl) == NULL_TREE))
+ flags |= SECTION_BSS; /* @nobits */
+ else
+ warning ("only uninitialized variables can be placed in a "
+ ".bss section");
+ }
+
+ return flags;
+}
+
+
/* The literal pool stays with the function. */
static void
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 3acf5b0fdf3..a84ebf36d8d 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -1,5 +1,5 @@
/* Definitions of Tensilica's Xtensa target machine for GNU compiler.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright 2001,2002 Free Software Foundation, Inc.
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This file is part of GCC.
@@ -554,6 +554,7 @@ enum reg_class
FP_REGS, /* floating point registers */
ACC_REG, /* MAC16 accumulator */
SP_REG, /* sp register (aka a1) */
+ RL_REGS, /* preferred reload regs (not sp or fp) */
GR_REGS, /* integer registers except sp */
AR_REGS, /* all integer registers */
ALL_REGS, /* all registers */
@@ -574,6 +575,7 @@ enum reg_class
"FP_REGS", \
"ACC_REG", \
"SP_REG", \
+ "RL_REGS", \
"GR_REGS", \
"AR_REGS", \
"ALL_REGS" \
@@ -589,6 +591,7 @@ enum reg_class
{ 0xfff80000, 0x00000007 }, /* floating-point registers */ \
{ 0x00000000, 0x00000008 }, /* MAC16 accumulator */ \
{ 0x00000002, 0x00000000 }, /* stack pointer register */ \
+ { 0x0000ff7d, 0x00000000 }, /* preferred reload registers */ \
{ 0x0000fffd, 0x00000000 }, /* general-purpose registers */ \
{ 0x0003ffff, 0x00000000 }, /* integer registers */ \
{ 0xffffffff, 0x0000000f } /* all registers */ \
@@ -704,10 +707,10 @@ extern enum reg_class xtensa_char_to_class[256];
: FALSE)
#define PREFERRED_RELOAD_CLASS(X, CLASS) \
- xtensa_preferred_reload_class (X, CLASS)
+ xtensa_preferred_reload_class (X, CLASS, 0)
#define PREFERRED_OUTPUT_RELOAD_CLASS(X, CLASS) \
- (CLASS)
+ xtensa_preferred_reload_class (X, CLASS, 1)
#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
xtensa_secondary_reload_class (CLASS, MODE, X, 0)
@@ -855,9 +858,6 @@ extern enum reg_class xtensa_char_to_class[256];
#define FUNCTION_ARG_REGNO_P(N) \
((N) >= GP_OUTGOING_ARG_FIRST && (N) <= GP_OUTGOING_ARG_LAST)
-/* Use IEEE floating-point format. */
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-
/* Define a data type for recording info about an argument list
during the scan of that argument list. This data type should
hold all necessary information about the function itself
@@ -1287,11 +1287,6 @@ typedef struct xtensa_args {
indexing purposes) so give the MEM rtx a words's mode. */
#define FUNCTION_MODE SImode
-/* A C expression that evaluates to true if it is ok to perform a
- sibling call to DECL. */
-/* TODO: fix this up to allow at least some sibcalls */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) 0
-
/* Xtensa constant costs. */
#define CONST_COSTS(X, CODE, OUTER_CODE) \
case CONST_INT: \
@@ -1640,15 +1635,6 @@ typedef struct xtensa_args {
goto JUMPTO; \
} while (0)
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable named NAME.
- LABELNO is an integer which is different for each call. */
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- do { \
- (OUTPUT) = (char *) alloca (strlen (NAME) + 10); \
- sprintf ((OUTPUT), "%s.%u", (NAME), (LABELNO)); \
- } while (0)
-
/* How to start an assembler comment. */
#define ASM_COMMENT_START "#"
diff --git a/gcc/configure b/gcc/configure
index dfe5dd8b95c..f5cb3e95906 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -62,8 +62,15 @@ ac_help="$ac_help
ac_help="$ac_help
--disable-shared don't provide a shared libgcc"
ac_help="$ac_help
+ --with-sysroot[=DIR] Search for usr/lib, usr/include, et al, within DIR."
+ac_help="$ac_help
--with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib"
ac_help="$ac_help
+ --enable-sjlj-exceptions
+ arrange to use setjmp/longjmp exception handling"
+ac_help="$ac_help
+ --enable-libunwind-exceptions force use libunwind for exceptions"
+ac_help="$ac_help
--enable-nls use Native Language Support (default)"
ac_help="$ac_help
--with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib"
@@ -89,11 +96,6 @@ ac_help="$ac_help
enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer"
ac_help="$ac_help
- --enable-sjlj-exceptions
- arrange to use setjmp/longjmp exception handling"
-ac_help="$ac_help
- --enable-libunwind-exceptions force use libunwind for exceptions"
-ac_help="$ac_help
--enable-version-specific-runtime-libs
specify that runtime libraries should be
installed in a compiler-specific directory"
@@ -625,7 +627,7 @@ copy=cp
# - two terminals occur directly after each other
# - the path contains an element with a dot in it
echo $ac_n "checking LIBRARY_PATH variable""... $ac_c" 1>&6
-echo "configure:629: checking LIBRARY_PATH variable" >&5
+echo "configure:631: checking LIBRARY_PATH variable" >&5
case ${LIBRARY_PATH} in
[:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
library_path_setting="contains current directory"
@@ -650,7 +652,7 @@ fi
# - two terminals occur directly after each other
# - the path contains an element with a dot in it
echo $ac_n "checking GCC_EXEC_PREFIX variable""... $ac_c" 1>&6
-echo "configure:654: checking GCC_EXEC_PREFIX variable" >&5
+echo "configure:656: checking GCC_EXEC_PREFIX variable" >&5
case ${GCC_EXEC_PREFIX} in
[:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
gcc_exec_prefix_setting="contains current directory"
@@ -1015,6 +1017,45 @@ fi
+# Check whether --with-sysroot or --without-sysroot was given.
+if test "${with_sysroot+set}" = set; then
+ withval="$with_sysroot"
+
+ case ${exec_prefix} in
+ NONE)
+ case ${prefix} in
+ NONE) real_exec_prefix=/usr/local ;;
+ *) real_exec_prefix=${prefix} ;;
+ esac ;;
+ *) real_exec_prefix=${exec_prefix} ;;
+ esac
+
+ case ${with_sysroot} in
+ yes) TARGET_SYSTEM_ROOT='$(gcc_tooldir)/sys-root' ;;
+ '${gcc_tooldir}'*) TARGET_SYSTEM_ROOT=$with_sysroot ;;
+ '${exec_prefix}'*) TARGET_SYSTEM_ROOT='$(gcc_tooldir)/..'`echo ${with_sysroot} | sed 's,\${exec_prefix},,'` ;;
+ "${real_exec_prefix}"*)
+ real_exec_prefix_len_in_dots=`echo ${real_exec_prefix} | sed s,.,.,g`
+ TARGET_SYSTEM_ROOT='$(gcc_tooldir)/..'`echo ${with_sysroot} | sed "s,^$real_exec_prefix_len_in_dots,,"`
+ ;;
+ *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
+ esac
+
+ TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'
+ CROSS_SYSTEM_HEADER_DIR='$(TARGET_SYSTEM_ROOT)$(NATIVE_SYSTEM_HEADER_DIR)'
+
+else
+
+ TARGET_SYSTEM_ROOT=
+ TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=0'
+ CROSS_SYSTEM_HEADER_DIR='$(gcc_tooldir)/sys-include'
+
+fi
+
+
+
+
+
# Determine the host, build, and target systems
ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
@@ -1063,7 +1104,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:1067: checking host system type" >&5
+echo "configure:1108: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@@ -1084,7 +1125,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:1088: checking target system type" >&5
+echo "configure:1129: checking target system type" >&5
target_alias=$target
case "$target_alias" in
@@ -1102,7 +1143,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:1106: checking build system type" >&5
+echo "configure:1147: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -1150,7 +1191,7 @@ test "$program_transform_name" = "" && program_transform_name="s,x,x,"
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1154: checking for $ac_word" >&5
+echo "configure:1195: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1180,7 +1221,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1184: checking for $ac_word" >&5
+echo "configure:1225: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1231,7 +1272,7 @@ fi
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1235: checking for $ac_word" >&5
+echo "configure:1276: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1263,7 +1304,7 @@ fi
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1267: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1308: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1274,12 +1315,12 @@ cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF
-#line 1278 "configure"
+#line 1319 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:1283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
@@ -1305,12 +1346,12 @@ if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1309: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1350: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1314: checking whether we are using GNU C" >&5
+echo "configure:1355: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1319,7 +1360,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1323: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1364: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -1338,7 +1379,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1342: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1383: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1371,10 +1412,10 @@ fi
if test "x$CC" != xcc; then
echo $ac_n "checking whether $CC and cc understand -c and -o together""... $ac_c" 1>&6
-echo "configure:1375: checking whether $CC and cc understand -c and -o together" >&5
+echo "configure:1416: checking whether $CC and cc understand -c and -o together" >&5
else
echo $ac_n "checking whether cc understands -c and -o together""... $ac_c" 1>&6
-echo "configure:1378: checking whether cc understands -c and -o together" >&5
+echo "configure:1419: checking whether cc understands -c and -o together" >&5
fi
set dummy $CC; ac_cc="`echo $2 |
sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`"
@@ -1386,16 +1427,16 @@ else
# We do the test twice because some compilers refuse to overwrite an
# existing .o file with -o, though they will create one.
ac_try='${CC-cc} -c conftest.c -o conftest.o 1>&5'
-if { (eval echo configure:1390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
- test -f conftest.o && { (eval echo configure:1391: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
+if { (eval echo configure:1431: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
+ test -f conftest.o && { (eval echo configure:1432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
then
eval ac_cv_prog_cc_${ac_cc}_c_o=yes
if test "x$CC" != xcc; then
# Test first that cc exists at all.
- if { ac_try='cc -c conftest.c 1>&5'; { (eval echo configure:1396: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+ if { ac_try='cc -c conftest.c 1>&5'; { (eval echo configure:1437: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
ac_try='cc -c conftest.c -o conftest.o 1>&5'
- if { (eval echo configure:1398: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
- test -f conftest.o && { (eval echo configure:1399: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
+ if { (eval echo configure:1439: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
+ test -f conftest.o && { (eval echo configure:1440: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
then
# cc works too.
:
@@ -1441,7 +1482,7 @@ fi
# Extract the first word of "${ac_tool_prefix}gnatbind", so it can be a program name with args.
set dummy ${ac_tool_prefix}gnatbind; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1445: checking for $ac_word" >&5
+echo "configure:1486: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1473,7 +1514,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "gnatbind", so it can be a program name with args.
set dummy gnatbind; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1477: checking for $ac_word" >&5
+echo "configure:1518: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1506,7 +1547,7 @@ fi
fi
echo $ac_n "checking for compiler driver that understands Ada""... $ac_c" 1>&6
-echo "configure:1510: checking for compiler driver that understands Ada" >&5
+echo "configure:1551: checking for compiler driver that understands Ada" >&5
if eval "test \"`echo '$''{'gcc_cv_prog_adac'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1551,21 +1592,21 @@ fi
echo $ac_n "checking whether ${CC-cc} accepts -Wno-long-long""... $ac_c" 1>&6
-echo "configure:1555: checking whether ${CC-cc} accepts -Wno-long-long" >&5
+echo "configure:1596: checking whether ${CC-cc} accepts -Wno-long-long" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_no_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
save_CFLAGS="$CFLAGS"
CFLAGS="-Wno-long-long"
cat > conftest.$ac_ext <<EOF
-#line 1562 "configure"
+#line 1603 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:1569: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1610: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_prog_cc_no_long_long=yes
else
@@ -1582,7 +1623,7 @@ echo "$ac_t""$ac_cv_prog_cc_no_long_long" 1>&6
if test x$have_gnat != xno ; then
echo $ac_n "checking whether ${ADAC} accepts -Wno-long-long""... $ac_c" 1>&6
-echo "configure:1586: checking whether ${ADAC} accepts -Wno-long-long" >&5
+echo "configure:1627: checking whether ${ADAC} accepts -Wno-long-long" >&5
if eval "test \"`echo '$''{'ac_cv_prog_adac_no_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1610,7 +1651,7 @@ fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1614: checking how to run the C preprocessor" >&5
+echo "configure:1655: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -1625,13 +1666,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1629 "configure"
+#line 1670 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1635: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1676: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1642,13 +1683,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1646 "configure"
+#line 1687 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1652: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1659,13 +1700,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1663 "configure"
+#line 1704 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1669: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1710: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1690,21 +1731,21 @@ fi
echo "$ac_t""$CPP" 1>&6
echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:1694: checking for inline" >&5
+echo "configure:1735: checking for inline" >&5
if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF
-#line 1701 "configure"
+#line 1742 "configure"
#include "confdefs.h"
int main() {
} $ac_kw foo() {
; return 0; }
EOF
-if { (eval echo configure:1708: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1749: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_inline=$ac_kw; break
else
@@ -1730,19 +1771,19 @@ EOF
esac
echo $ac_n "checking for volatile""... $ac_c" 1>&6
-echo "configure:1734: checking for volatile" >&5
+echo "configure:1775: checking for volatile" >&5
if eval "test \"`echo '$''{'gcc_cv_c_volatile'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1739 "configure"
+#line 1780 "configure"
#include "confdefs.h"
int main() {
volatile int foo;
; return 0; }
EOF
-if { (eval echo configure:1746: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1787: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_c_volatile=yes
else
@@ -1764,7 +1805,7 @@ fi
echo $ac_n "checking for long double""... $ac_c" 1>&6
-echo "configure:1768: checking for long double" >&5
+echo "configure:1809: checking for long double" >&5
if eval "test \"`echo '$''{'gcc_cv_c_long_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1772,7 +1813,7 @@ else
gcc_cv_c_long_double=yes
else
cat > conftest.$ac_ext <<EOF
-#line 1776 "configure"
+#line 1817 "configure"
#include "confdefs.h"
int main() {
@@ -1782,7 +1823,7 @@ long double foo = 0.0;
switch (0) case 0: case (sizeof(long double) >= sizeof(double)):;
; return 0; }
EOF
-if { (eval echo configure:1786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1827: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_c_long_double=yes
else
@@ -1804,19 +1845,19 @@ EOF
fi
echo $ac_n "checking for long long int""... $ac_c" 1>&6
-echo "configure:1808: checking for long long int" >&5
+echo "configure:1849: checking for long long int" >&5
if eval "test \"`echo '$''{'ac_cv_c_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1813 "configure"
+#line 1854 "configure"
#include "confdefs.h"
int main() {
long long int i;
; return 0; }
EOF
-if { (eval echo configure:1820: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1861: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_long_long=yes
else
@@ -1836,19 +1877,19 @@ EOF
fi
echo $ac_n "checking for __int64""... $ac_c" 1>&6
-echo "configure:1840: checking for __int64" >&5
+echo "configure:1881: checking for __int64" >&5
if eval "test \"`echo '$''{'ac_cv_c___int64'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1845 "configure"
+#line 1886 "configure"
#include "confdefs.h"
int main() {
__int64 i;
; return 0; }
EOF
-if { (eval echo configure:1852: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c___int64=yes
else
@@ -1869,19 +1910,19 @@ EOF
fi
echo $ac_n "checking for built-in _Bool""... $ac_c" 1>&6
-echo "configure:1873: checking for built-in _Bool" >&5
+echo "configure:1914: checking for built-in _Bool" >&5
if eval "test \"`echo '$''{'gcc_cv_c__bool'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1878 "configure"
+#line 1919 "configure"
#include "confdefs.h"
int main() {
_Bool foo;
; return 0; }
EOF
-if { (eval echo configure:1885: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1926: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_c__bool=yes
else
@@ -1905,13 +1946,13 @@ fi
# sizeof(char) is 1 by definition.
echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:1909: checking size of short" >&5
+echo "configure:1950: checking size of short" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1915 "configure"
+#line 1956 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1921,7 +1962,7 @@ int main() {
switch (0) case 0: case (sizeof (short) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1925: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1966: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_short=$ac_size
else
@@ -1944,13 +1985,13 @@ EOF
echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:1948: checking size of int" >&5
+echo "configure:1989: checking size of int" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1954 "configure"
+#line 1995 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1960,7 +2001,7 @@ int main() {
switch (0) case 0: case (sizeof (int) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:1964: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2005: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_int=$ac_size
else
@@ -1983,13 +2024,13 @@ EOF
echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:1987: checking size of long" >&5
+echo "configure:2028: checking size of long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 1993 "configure"
+#line 2034 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -1999,7 +2040,7 @@ int main() {
switch (0) case 0: case (sizeof (long) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:2003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2044: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long=$ac_size
else
@@ -2023,13 +2064,13 @@ EOF
if test $ac_cv_c_long_long = yes; then
echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:2027: checking size of long long" >&5
+echo "configure:2068: checking size of long long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 2033 "configure"
+#line 2074 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -2039,7 +2080,7 @@ int main() {
switch (0) case 0: case (sizeof (long long) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:2043: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2084: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long_long=$ac_size
else
@@ -2064,13 +2105,13 @@ EOF
fi
if test $ac_cv_c___int64 = yes; then
echo $ac_n "checking size of __int64""... $ac_c" 1>&6
-echo "configure:2068: checking size of __int64" >&5
+echo "configure:2109: checking size of __int64" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof___int64'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 2074 "configure"
+#line 2115 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -2080,7 +2121,7 @@ int main() {
switch (0) case 0: case (sizeof (__int64) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:2084: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2125: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof___int64=$ac_size
else
@@ -2105,12 +2146,12 @@ EOF
fi
echo $ac_n "checking execution character set""... $ac_c" 1>&6
-echo "configure:2109: checking execution character set" >&5
+echo "configure:2150: checking execution character set" >&5
if eval "test \"`echo '$''{'ac_cv_c_charset'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2114 "configure"
+#line 2155 "configure"
#include "confdefs.h"
#if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
&& 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21
@@ -2126,7 +2167,7 @@ rm -f conftest*
if test x${ac_cv_c_charset+set} != xset; then
cat > conftest.$ac_ext <<EOF
-#line 2130 "configure"
+#line 2171 "configure"
#include "confdefs.h"
#if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \
&& 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A
@@ -2187,7 +2228,7 @@ esac
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:2191: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:2232: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2215,7 +2256,7 @@ fi
echo $ac_n "checking whether a default assembler was specified""... $ac_c" 1>&6
-echo "configure:2219: checking whether a default assembler was specified" >&5
+echo "configure:2260: checking whether a default assembler was specified" >&5
if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
if test x"$gas_flag" = x"no"; then
echo "$ac_t""yes ($DEFAULT_ASSEMBLER)" 1>&6
@@ -2227,7 +2268,7 @@ else
fi
echo $ac_n "checking whether a default linker was specified""... $ac_c" 1>&6
-echo "configure:2231: checking whether a default linker was specified" >&5
+echo "configure:2272: checking whether a default linker was specified" >&5
if test x"${DEFAULT_LINKER+set}" = x"set"; then
if test x"$gnu_ld_flag" = x"no"; then
echo "$ac_t""yes ($DEFAULT_LINKER)" 1>&6
@@ -2239,12 +2280,12 @@ else
fi
echo $ac_n "checking for GNU C library""... $ac_c" 1>&6
-echo "configure:2243: checking for GNU C library" >&5
+echo "configure:2284: checking for GNU C library" >&5
if eval "test \"`echo '$''{'gcc_cv_glibc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2248 "configure"
+#line 2289 "configure"
#include "confdefs.h"
#include <features.h>
int main() {
@@ -2254,7 +2295,7 @@ int main() {
#endif
; return 0; }
EOF
-if { (eval echo configure:2258: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2299: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_glibc=yes
else
@@ -2280,7 +2321,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2284: checking for $ac_word" >&5
+echo "configure:2325: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2310,7 +2351,7 @@ test -n "$AWK" && break
done
echo $ac_n "checking whether ln works""... $ac_c" 1>&6
-echo "configure:2314: checking whether ln works" >&5
+echo "configure:2355: checking whether ln works" >&5
if eval "test \"`echo '$''{'gcc_cv_prog_LN'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2342,7 +2383,7 @@ else
fi
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:2346: checking whether ln -s works" >&5
+echo "configure:2387: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'gcc_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2376,7 +2417,7 @@ fi
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2380: checking for $ac_word" >&5
+echo "configure:2421: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2414,7 +2455,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:2418: checking for a BSD compatible install" >&5
+echo "configure:2459: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2465,12 +2506,12 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:2469: checking for ANSI C header files" >&5
+echo "configure:2510: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2474 "configure"
+#line 2515 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -2478,7 +2519,7 @@ else
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2482: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2523: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2495,7 +2536,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 2499 "configure"
+#line 2540 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@@ -2513,7 +2554,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 2517 "configure"
+#line 2558 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@@ -2534,7 +2575,7 @@ if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
-#line 2538 "configure"
+#line 2579 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -2545,7 +2586,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
-if { (eval echo configure:2549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
@@ -2569,12 +2610,12 @@ EOF
fi
echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:2573: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:2614: checking whether time.h and sys/time.h may both be included" >&5
if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2578 "configure"
+#line 2619 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
@@ -2583,7 +2624,7 @@ int main() {
struct tm *tp;
; return 0; }
EOF
-if { (eval echo configure:2587: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2628: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_time=yes
else
@@ -2604,19 +2645,19 @@ EOF
fi
echo $ac_n "checking for working stdbool.h""... $ac_c" 1>&6
-echo "configure:2608: checking for working stdbool.h" >&5
+echo "configure:2649: checking for working stdbool.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdbool_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2613 "configure"
+#line 2654 "configure"
#include "confdefs.h"
#include <stdbool.h>
int main() {
bool foo = false;
; return 0; }
EOF
-if { (eval echo configure:2620: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2661: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_stdbool_h=yes
else
@@ -2637,12 +2678,12 @@ EOF
fi
echo $ac_n "checking whether string.h and strings.h may both be included""... $ac_c" 1>&6
-echo "configure:2641: checking whether string.h and strings.h may both be included" >&5
+echo "configure:2682: checking whether string.h and strings.h may both be included" >&5
if eval "test \"`echo '$''{'gcc_cv_header_string'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2646 "configure"
+#line 2687 "configure"
#include "confdefs.h"
#include <string.h>
#include <strings.h>
@@ -2650,7 +2691,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:2654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2695: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_header_string=yes
else
@@ -2671,12 +2712,12 @@ EOF
fi
echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:2675: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:2716: checking for sys/wait.h that is POSIX.1 compatible" >&5
if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2680 "configure"
+#line 2721 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
@@ -2692,7 +2733,7 @@ wait (&s);
s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
; return 0; }
EOF
-if { (eval echo configure:2696: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2737: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_sys_wait_h=yes
else
@@ -2719,17 +2760,17 @@ for ac_hdr in limits.h stddef.h string.h strings.h stdlib.h time.h \
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2723: checking for $ac_hdr" >&5
+echo "configure:2764: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2728 "configure"
+#line 2769 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2774: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2759,17 +2800,17 @@ done
# Check for thread headers.
ac_safe=`echo "thread.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for thread.h""... $ac_c" 1>&6
-echo "configure:2763: checking for thread.h" >&5
+echo "configure:2804: checking for thread.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2768 "configure"
+#line 2809 "configure"
#include "confdefs.h"
#include <thread.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2773: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2814: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2793,17 +2834,17 @@ fi
ac_safe=`echo "pthread.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for pthread.h""... $ac_c" 1>&6
-echo "configure:2797: checking for pthread.h" >&5
+echo "configure:2838: checking for pthread.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2802 "configure"
+#line 2843 "configure"
#include "confdefs.h"
#include <pthread.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2807: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2848: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2828,12 +2869,12 @@ fi
# These tests can't be done till we know if we have limits.h.
echo $ac_n "checking for CHAR_BIT""... $ac_c" 1>&6
-echo "configure:2832: checking for CHAR_BIT" >&5
+echo "configure:2873: checking for CHAR_BIT" >&5
if eval "test \"`echo '$''{'gcc_cv_decl_char_bit'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2837 "configure"
+#line 2878 "configure"
#include "confdefs.h"
#ifdef HAVE_LIMITS_H
#include <limits.h>
@@ -2858,7 +2899,7 @@ fi
echo "$ac_t""$gcc_cv_decl_char_bit" 1>&6
if test $gcc_cv_decl_char_bit = no; then
echo $ac_n "checking number of bits in a byte""... $ac_c" 1>&6
-echo "configure:2862: checking number of bits in a byte" >&5
+echo "configure:2903: checking number of bits in a byte" >&5
if eval "test \"`echo '$''{'gcc_cv_c_nbby'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2866,7 +2907,7 @@ else
gcc_cv_c_nbby=
while test $i -lt 65; do
cat > conftest.$ac_ext <<EOF
-#line 2870 "configure"
+#line 2911 "configure"
#include "confdefs.h"
int main() {
@@ -2876,7 +2917,7 @@ switch(0) {
; }
; return 0; }
EOF
-if { (eval echo configure:2880: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2921: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_c_nbby=$i; break
else
@@ -2901,7 +2942,7 @@ EOF
fi
fi
echo $ac_n "checking byte ordering""... $ac_c" 1>&6
-echo "configure:2905: checking byte ordering" >&5
+echo "configure:2946: checking byte ordering" >&5
if eval "test \"`echo '$''{'ac_cv_c_compile_endian'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2915,7 +2956,7 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
-#line 2919 "configure"
+#line 2960 "configure"
#include "confdefs.h"
#ifdef HAVE_LIMITS_H
@@ -2935,7 +2976,7 @@ cat > conftest.$ac_ext <<EOF
'X', '\n'
};
EOF
-if { (eval echo configure:2939: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2980: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
od -c conftest.o |
sed 's/^[0-7]*[ ]*/ /
s/\*/./g
@@ -2974,7 +3015,7 @@ EOF
fi
echo $ac_n "checking floating point format""... $ac_c" 1>&6
-echo "configure:2978: checking floating point format" >&5
+echo "configure:3019: checking floating point format" >&5
if eval "test \"`echo '$''{'ac_cv_c_float_format'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2987,7 +3028,7 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
-#line 2991 "configure"
+#line 3032 "configure"
#include "confdefs.h"
/* This will not work unless sizeof(double) == 8. */
extern char sizeof_double_must_be_8 [sizeof(double) == 8 ? 1 : -1];
@@ -3009,7 +3050,7 @@ struct possibility table [] =
C(-5.22995989424860458374e+10) /* IBMHEXFP - s/390 format, EBCDIC */
};
EOF
-if { (eval echo configure:3013: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3054: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
od -c conftest.o |
sed 's/^[0-7]*[ ]*/ /
s/\*/./g
@@ -3098,7 +3139,7 @@ fi
# Extract the first word of "mktemp", so it can be a program name with args.
set dummy mktemp; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3102: checking for $ac_word" >&5
+echo "configure:3143: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_have_mktemp_command'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3137,7 +3178,7 @@ else
# Extract the first word of "makeinfo", so it can be a program name with args.
set dummy makeinfo; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3141: checking for $ac_word" >&5
+echo "configure:3182: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3166,13 +3207,13 @@ fi
if test -n "$MAKEINFO"; then
# Found it, now check the version.
echo $ac_n "checking for modern makeinfo""... $ac_c" 1>&6
-echo "configure:3170: checking for modern makeinfo" >&5
+echo "configure:3211: checking for modern makeinfo" >&5
if eval "test \"`echo '$''{'gcc_cv_prog_makeinfo_modern'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_prog_version=`$MAKEINFO --version 2>&1 |
sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`
- echo "configure:3176: version of makeinfo is $ac_prog_version" >&5
+ echo "configure:3217: version of makeinfo is $ac_prog_version" >&5
case $ac_prog_version in
'') gcc_cv_prog_makeinfo_modern=no;;
4.[1-9]*)
@@ -3200,7 +3241,7 @@ fi
# Is pod2man recent enough to regenerate manpages?
echo $ac_n "checking for recent Pod::Man""... $ac_c" 1>&6
-echo "configure:3204: checking for recent Pod::Man" >&5
+echo "configure:3245: checking for recent Pod::Man" >&5
if (perl -e 'use 1.10 Pod::Man') >/dev/null 2>&1; then
echo "$ac_t""yes" 1>&6
GENERATED_MANPAGES=generated-manpages
@@ -3216,7 +3257,7 @@ else
# Extract the first word of "flex", so it can be a program name with args.
set dummy flex; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3220: checking for $ac_word" >&5
+echo "configure:3261: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_FLEX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3253,7 +3294,7 @@ else
# Extract the first word of "bison", so it can be a program name with args.
set dummy bison; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3257: checking for $ac_word" >&5
+echo "configure:3298: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_BISON'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3285,7 +3326,7 @@ fi
# These libraries may be used by collect2.
# We may need a special search path to get them linked.
echo $ac_n "checking for collect2 libraries""... $ac_c" 1>&6
-echo "configure:3289: checking for collect2 libraries" >&5
+echo "configure:3330: checking for collect2 libraries" >&5
if eval "test \"`echo '$''{'gcc_cv_collect2_libs'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3296,7 +3337,7 @@ for libs in '' -lld -lmld \
do
LIBS="$libs"
cat > conftest.$ac_ext <<EOF
-#line 3300 "configure"
+#line 3341 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3307,7 +3348,7 @@ int main() {
ldopen()
; return 0; }
EOF
-if { (eval echo configure:3311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
gcc_cv_collect2_libs="$libs"; break
else
@@ -3333,14 +3374,14 @@ save_LIBS="$LIBS"
LIBS=
echo $ac_n "checking for library containing exc_resume""... $ac_c" 1>&6
-echo "configure:3337: checking for library containing exc_resume" >&5
+echo "configure:3378: checking for library containing exc_resume" >&5
if eval "test \"`echo '$''{'ac_cv_search_exc_resume'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_func_search_save_LIBS="$LIBS"
ac_cv_search_exc_resume="no"
cat > conftest.$ac_ext <<EOF
-#line 3344 "configure"
+#line 3385 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3351,7 +3392,7 @@ int main() {
exc_resume()
; return 0; }
EOF
-if { (eval echo configure:3355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_exc_resume="none required"
else
@@ -3362,7 +3403,7 @@ rm -f conftest*
test "$ac_cv_search_exc_resume" = "no" && for i in exc; do
LIBS="-l$i $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3366 "configure"
+#line 3407 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3373,7 +3414,7 @@ int main() {
exc_resume()
; return 0; }
EOF
-if { (eval echo configure:3377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_exc_resume="-l$i"
break
@@ -3402,12 +3443,12 @@ LIBS="$save_LIBS"
echo $ac_n "checking for preprocessor stringizing operator""... $ac_c" 1>&6
-echo "configure:3406: checking for preprocessor stringizing operator" >&5
+echo "configure:3447: checking for preprocessor stringizing operator" >&5
if eval "test \"`echo '$''{'ac_cv_c_stringize'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3411 "configure"
+#line 3452 "configure"
#include "confdefs.h"
#define x(y) #y
@@ -3440,12 +3481,12 @@ echo "$ac_t""${ac_cv_c_stringize}" 1>&6
# Use <inttypes.h> only if it exists,
# doesn't clash with <sys/types.h>, and declares intmax_t.
echo $ac_n "checking for inttypes.h""... $ac_c" 1>&6
-echo "configure:3444: checking for inttypes.h" >&5
+echo "configure:3485: checking for inttypes.h" >&5
if eval "test \"`echo '$''{'gcc_cv_header_inttypes_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3449 "configure"
+#line 3490 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <inttypes.h>
@@ -3453,7 +3494,7 @@ int main() {
intmax_t i = -1;
; return 0; }
EOF
-if { (eval echo configure:3457: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3498: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_header_inttypes_h=yes
else
@@ -3480,12 +3521,12 @@ for ac_func in times clock dup2 kill getrlimit setrlimit atoll atoq \
scandir alphasort
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3484: checking for $ac_func" >&5
+echo "configure:3525: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3489 "configure"
+#line 3530 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3508,7 +3549,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3534,12 +3575,12 @@ done
echo $ac_n "checking for ssize_t""... $ac_c" 1>&6
-echo "configure:3538: checking for ssize_t" >&5
+echo "configure:3579: checking for ssize_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3543 "configure"
+#line 3584 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -3570,12 +3611,12 @@ fi
# Try to determine the array type of the second argument of getgroups
# for the target system (int or gid_t).
echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:3574: checking for uid_t in sys/types.h" >&5
+echo "configure:3615: checking for uid_t in sys/types.h" >&5
if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3579 "configure"
+#line 3620 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
@@ -3604,7 +3645,7 @@ EOF
fi
echo $ac_n "checking type of array argument to getgroups""... $ac_c" 1>&6
-echo "configure:3608: checking type of array argument to getgroups" >&5
+echo "configure:3649: checking type of array argument to getgroups" >&5
if eval "test \"`echo '$''{'ac_cv_type_getgroups'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3612,7 +3653,7 @@ else
ac_cv_type_getgroups=cross
else
cat > conftest.$ac_ext <<EOF
-#line 3616 "configure"
+#line 3657 "configure"
#include "confdefs.h"
/* Thanks to Mike Rendell for this test. */
@@ -3637,7 +3678,7 @@ main()
}
EOF
-if { (eval echo configure:3641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_type_getgroups=gid_t
else
@@ -3651,7 +3692,7 @@ fi
if test $ac_cv_type_getgroups = cross; then
cat > conftest.$ac_ext <<EOF
-#line 3655 "configure"
+#line 3696 "configure"
#include "confdefs.h"
#include <unistd.h>
EOF
@@ -3692,7 +3733,7 @@ fi
echo $ac_n "checking whether the printf functions support %p""... $ac_c" 1>&6
-echo "configure:3696: checking whether the printf functions support %p" >&5
+echo "configure:3737: checking whether the printf functions support %p" >&5
if eval "test \"`echo '$''{'gcc_cv_func_printf_ptr'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3700,7 +3741,7 @@ else
gcc_cv_func_printf_ptr=no
else
cat > conftest.$ac_ext <<EOF
-#line 3704 "configure"
+#line 3745 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -3713,7 +3754,7 @@ int main()
return (p != q);
}
EOF
-if { (eval echo configure:3717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3758: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
gcc_cv_func_printf_ptr=yes
else
@@ -3751,12 +3792,12 @@ case "${host}" in
;;
esac
echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:3755: checking for pid_t" >&5
+echo "configure:3796: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3760 "configure"
+#line 3801 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -3785,17 +3826,17 @@ fi
ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:3789: checking for vfork.h" >&5
+echo "configure:3830: checking for vfork.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3794 "configure"
+#line 3835 "configure"
#include "confdefs.h"
#include <vfork.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -3820,18 +3861,18 @@ else
fi
echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:3824: checking for working vfork" >&5
+echo "configure:3865: checking for working vfork" >&5
if eval "test \"`echo '$''{'ac_cv_func_vfork_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$cross_compiling" = yes; then
echo $ac_n "checking for vfork""... $ac_c" 1>&6
-echo "configure:3830: checking for vfork" >&5
+echo "configure:3871: checking for vfork" >&5
if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3835 "configure"
+#line 3876 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char vfork(); below. */
@@ -3854,7 +3895,7 @@ vfork();
; return 0; }
EOF
-if { (eval echo configure:3858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_vfork=yes"
else
@@ -3876,7 +3917,7 @@ fi
ac_cv_func_vfork_works=$ac_cv_func_vfork
else
cat > conftest.$ac_ext <<EOF
-#line 3880 "configure"
+#line 3921 "configure"
#include "confdefs.h"
/* Thanks to Paul Eggert for this test. */
#include <stdio.h>
@@ -3971,7 +4012,7 @@ main() {
}
}
EOF
-if { (eval echo configure:3975: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_vfork_works=yes
else
@@ -3996,12 +4037,12 @@ fi
for ac_func in getpagesize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4000: checking for $ac_func" >&5
+echo "configure:4041: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4005 "configure"
+#line 4046 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4024,7 +4065,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4295,7 +4336,7 @@ main ()
EOF
echo $ac_n "checking for working mmap from /dev/zero""... $ac_c" 1>&6
-echo "configure:4299: checking for working mmap from /dev/zero" >&5
+echo "configure:4340: checking for working mmap from /dev/zero" >&5
if eval "test \"`echo '$''{'ac_cv_func_mmap_dev_zero'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4311,11 +4352,11 @@ else
esac
else
cat > conftest.$ac_ext <<EOF
-#line 4315 "configure"
+#line 4356 "configure"
#include "confdefs.h"
#include "ct-mmap.inc"
EOF
-if { (eval echo configure:4319: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4360: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_mmap_dev_zero=yes
else
@@ -4342,7 +4383,7 @@ EOF
fi
echo $ac_n "checking for working mmap with MAP_ANON(YMOUS)""... $ac_c" 1>&6
-echo "configure:4346: checking for working mmap with MAP_ANON(YMOUS)" >&5
+echo "configure:4387: checking for working mmap with MAP_ANON(YMOUS)" >&5
if eval "test \"`echo '$''{'ac_cv_func_mmap_anon'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4352,12 +4393,12 @@ else
ac_cv_func_mmap_anon=no
else
cat > conftest.$ac_ext <<EOF
-#line 4356 "configure"
+#line 4397 "configure"
#include "confdefs.h"
#define USE_MAP_ANON
#include "ct-mmap.inc"
EOF
-if { (eval echo configure:4361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4402: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_mmap_anon=yes
else
@@ -4385,7 +4426,7 @@ fi
rm -f ct-mmap.inc
echo $ac_n "checking for working mmap of a file""... $ac_c" 1>&6
-echo "configure:4389: checking for working mmap of a file" >&5
+echo "configure:4430: checking for working mmap of a file" >&5
if eval "test \"`echo '$''{'ac_cv_func_mmap_file'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4400,7 +4441,7 @@ if test "$cross_compiling" = yes; then
ac_cv_func_mmap_file=no
else
cat > conftest.$ac_ext <<EOF
-#line 4404 "configure"
+#line 4445 "configure"
#include "confdefs.h"
/* Test by Zack Weinberg. Modified from MMAP_ANYWHERE test by
@@ -4437,7 +4478,7 @@ int main()
exit(0);
}
EOF
-if { (eval echo configure:4441: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4482: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_mmap_file=yes
else
@@ -4476,7 +4517,7 @@ fi
echo $ac_n "checking for iconv""... $ac_c" 1>&6
-echo "configure:4480: checking for iconv" >&5
+echo "configure:4521: checking for iconv" >&5
if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4484,7 +4525,7 @@ else
am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no
cat > conftest.$ac_ext <<EOF
-#line 4488 "configure"
+#line 4529 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <iconv.h>
@@ -4494,7 +4535,7 @@ iconv_t cd = iconv_open("","");
iconv_close(cd);
; return 0; }
EOF
-if { (eval echo configure:4498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_func_iconv=yes
else
@@ -4506,7 +4547,7 @@ rm -f conftest*
am_save_LIBS="$LIBS"
LIBS="$LIBS $am_cv_libiconv_ldpath -liconv"
cat > conftest.$ac_ext <<EOF
-#line 4510 "configure"
+#line 4551 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <iconv.h>
@@ -4516,7 +4557,7 @@ iconv_t cd = iconv_open("","");
iconv_close(cd);
; return 0; }
EOF
-if { (eval echo configure:4520: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_lib_iconv=yes
am_cv_func_iconv=yes
@@ -4537,13 +4578,13 @@ echo "$ac_t""$am_cv_func_iconv" 1>&6
EOF
echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6
-echo "configure:4541: checking for iconv declaration" >&5
+echo "configure:4582: checking for iconv declaration" >&5
if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4547 "configure"
+#line 4588 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -4562,7 +4603,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:4566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4607: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
am_cv_proto_iconv_arg1=""
else
@@ -4600,12 +4641,12 @@ for ac_func in getenv atol sbrk abort atof getcwd getwd \
do
ac_tr_decl=HAVE_DECL_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
echo $ac_n "checking whether $ac_func is declared""... $ac_c" 1>&6
-echo "configure:4604: checking whether $ac_func is declared" >&5
+echo "configure:4645: checking whether $ac_func is declared" >&5
if eval "test \"`echo '$''{'gcc_cv_have_decl_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4609 "configure"
+#line 4650 "configure"
#include "confdefs.h"
#undef $ac_tr_decl
#define $ac_tr_decl 1
@@ -4619,7 +4660,7 @@ char *(*pfn) = (char *(*)) $ac_func ;
#endif
; return 0; }
EOF
-if { (eval echo configure:4623: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4664: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
eval "gcc_cv_have_decl_$ac_func=yes"
else
@@ -4718,12 +4759,12 @@ for ac_func in getrlimit setrlimit getrusage
do
ac_tr_decl=HAVE_DECL_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
echo $ac_n "checking whether $ac_func is declared""... $ac_c" 1>&6
-echo "configure:4722: checking whether $ac_func is declared" >&5
+echo "configure:4763: checking whether $ac_func is declared" >&5
if eval "test \"`echo '$''{'gcc_cv_have_decl_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4727 "configure"
+#line 4768 "configure"
#include "confdefs.h"
#undef $ac_tr_decl
#define $ac_tr_decl 1
@@ -4741,7 +4782,7 @@ char *(*pfn) = (char *(*)) $ac_func ;
#endif
; return 0; }
EOF
-if { (eval echo configure:4745: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
eval "gcc_cv_have_decl_$ac_func=yes"
else
@@ -4783,12 +4824,12 @@ for ac_func in times
do
ac_tr_decl=HAVE_DECL_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
echo $ac_n "checking whether $ac_func is declared""... $ac_c" 1>&6
-echo "configure:4787: checking whether $ac_func is declared" >&5
+echo "configure:4828: checking whether $ac_func is declared" >&5
if eval "test \"`echo '$''{'gcc_cv_have_decl_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4792 "configure"
+#line 4833 "configure"
#include "confdefs.h"
#undef $ac_tr_decl
#define $ac_tr_decl 1
@@ -4806,7 +4847,7 @@ char *(*pfn) = (char *(*)) $ac_func ;
#endif
; return 0; }
EOF
-if { (eval echo configure:4810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4851: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
eval "gcc_cv_have_decl_$ac_func=yes"
else
@@ -4840,13 +4881,13 @@ fi
# More time-related stuff.
echo $ac_n "checking for struct tms""... $ac_c" 1>&6
-echo "configure:4844: checking for struct tms" >&5
+echo "configure:4885: checking for struct tms" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tms'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4850 "configure"
+#line 4891 "configure"
#include "confdefs.h"
#include "ansidecl.h"
@@ -4859,7 +4900,7 @@ int main() {
struct tms tms;
; return 0; }
EOF
-if { (eval echo configure:4863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4904: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tms=yes
else
@@ -4882,13 +4923,13 @@ fi
# use gcc_cv_* here because this doesn't match the behavior of AC_CHECK_TYPE.
# revisit after autoconf 2.50.
echo $ac_n "checking for clock_t""... $ac_c" 1>&6
-echo "configure:4886: checking for clock_t" >&5
+echo "configure:4927: checking for clock_t" >&5
if eval "test \"`echo '$''{'gcc_cv_type_clock_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4892 "configure"
+#line 4933 "configure"
#include "confdefs.h"
#include "ansidecl.h"
@@ -4898,7 +4939,7 @@ int main() {
clock_t x;
; return 0; }
EOF
-if { (eval echo configure:4902: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4943: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_type_clock_t=yes
else
@@ -4923,12 +4964,12 @@ CFLAGS="$saved_CFLAGS"
# mkdir takes a single argument on some systems.
echo $ac_n "checking if mkdir takes one argument""... $ac_c" 1>&6
-echo "configure:4927: checking if mkdir takes one argument" >&5
+echo "configure:4968: checking if mkdir takes one argument" >&5
if eval "test \"`echo '$''{'gcc_cv_mkdir_takes_one_arg'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4932 "configure"
+#line 4973 "configure"
#include "confdefs.h"
#include <sys/types.h>
@@ -4945,7 +4986,7 @@ int main() {
mkdir ("foo", 0);
; return 0; }
EOF
-if { (eval echo configure:4949: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4990: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gcc_cv_mkdir_takes_one_arg=no
else
@@ -4972,6 +5013,71 @@ objext='.o'
+# With Setjmp/Longjmp based exception handling.
+# Check whether --enable-sjlj-exceptions or --disable-sjlj-exceptions was given.
+if test "${enable_sjlj_exceptions+set}" = set; then
+ enableval="$enable_sjlj_exceptions"
+ sjlj=`if test $enableval = yes; then echo 1; else echo 0; fi`
+cat >> confdefs.h <<EOF
+#define CONFIG_SJLJ_EXCEPTIONS $sjlj
+EOF
+
+fi
+
+
+echo $ac_n "checking for main in -lunwind""... $ac_c" 1>&6
+echo "configure:5030: checking for main in -lunwind" >&5
+ac_lib_var=`echo unwind'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lunwind $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5038 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:5045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ use_libunwind_default=yes
+else
+ echo "$ac_t""no" 1>&6
+use_libunwind_default=no
+fi
+
+# Use libunwind based exception handling.
+# Check whether --enable-libunwind-exceptions or --disable-libunwind-exceptions was given.
+if test "${enable_libunwind_exceptions+set}" = set; then
+ enableval="$enable_libunwind_exceptions"
+ use_libunwind_exceptions=$enableval
+else
+ use_libunwind_exceptions=$use_libunwind_default
+fi
+
+if test x"$use_libunwind_exceptions" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define USE_LIBUNWIND_EXCEPTIONS 1
+EOF
+
+fi
+
target_gtfiles=
build_xm_file=
build_xm_defines=
@@ -5014,15 +5120,6 @@ if test x"$dwarf2" = xyes
then tm_file="$tm_file tm-dwarf2.h"
fi
-if test x$float_format = x
-then float_format=i64
-fi
-
-if test $float_format = none
-then float_h_file=Makefile.in
-else float_h_file=float-$float_format.h
-fi
-
# Say what files are being used for the output code and MD file.
echo "Using \`$srcdir/config/$out_file' for machine-specific logic."
echo "Using \`$srcdir/config/$md_file' as machine description file."
@@ -5222,14 +5319,14 @@ fi
echo $ac_n "checking for library containing strerror""... $ac_c" 1>&6
-echo "configure:5226: checking for library containing strerror" >&5
+echo "configure:5323: checking for library containing strerror" >&5
if eval "test \"`echo '$''{'ac_cv_search_strerror'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_func_search_save_LIBS="$LIBS"
ac_cv_search_strerror="no"
cat > conftest.$ac_ext <<EOF
-#line 5233 "configure"
+#line 5330 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -5240,7 +5337,7 @@ int main() {
strerror()
; return 0; }
EOF
-if { (eval echo configure:5244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_strerror="none required"
else
@@ -5251,7 +5348,7 @@ rm -f conftest*
test "$ac_cv_search_strerror" = "no" && for i in cposix; do
LIBS="-l$i $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5255 "configure"
+#line 5352 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -5262,7 +5359,7 @@ int main() {
strerror()
; return 0; }
EOF
-if { (eval echo configure:5266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5363: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_strerror="-l$i"
break
@@ -5285,12 +5382,12 @@ fi
echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:5289: checking for working const" >&5
+echo "configure:5386: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5294 "configure"
+#line 5391 "configure"
#include "confdefs.h"
int main() {
@@ -5339,7 +5436,7 @@ ccp = (char const *const *) p;
; return 0; }
EOF
-if { (eval echo configure:5343: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5440: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
@@ -5360,12 +5457,12 @@ EOF
fi
echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:5364: checking for off_t" >&5
+echo "configure:5461: checking for off_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5369 "configure"
+#line 5466 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -5393,12 +5490,12 @@ EOF
fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:5397: checking for size_t" >&5
+echo "configure:5494: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5402 "configure"
+#line 5499 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -5428,19 +5525,19 @@ fi
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:5432: checking for working alloca.h" >&5
+echo "configure:5529: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5437 "configure"
+#line 5534 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:5444: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5541: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
@@ -5461,12 +5558,12 @@ EOF
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:5465: checking for alloca" >&5
+echo "configure:5562: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5470 "configure"
+#line 5567 "configure"
#include "confdefs.h"
#ifdef __GNUC__
@@ -5494,7 +5591,7 @@ int main() {
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:5498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
@@ -5526,12 +5623,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:5530: checking whether alloca needs Cray hooks" >&5
+echo "configure:5627: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5535 "configure"
+#line 5632 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -5556,12 +5653,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5560: checking for $ac_func" >&5
+echo "configure:5657: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5565 "configure"
+#line 5662 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5584,7 +5681,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5685: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5611,7 +5708,7 @@ done
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:5615: checking stack direction for C alloca" >&5
+echo "configure:5712: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -5619,7 +5716,7 @@ else
ac_cv_c_stack_direction=0
else
cat > conftest.$ac_ext <<EOF
-#line 5623 "configure"
+#line 5720 "configure"
#include "confdefs.h"
find_stack_direction ()
{
@@ -5638,7 +5735,7 @@ main ()
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:5642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_stack_direction=1
else
@@ -5661,12 +5758,12 @@ fi
echo $ac_n "checking whether we are using the GNU C Library 2.1 or newer""... $ac_c" 1>&6
-echo "configure:5665: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo "configure:5762: checking whether we are using the GNU C Library 2.1 or newer" >&5
if eval "test \"`echo '$''{'ac_cv_gnu_library_2_1'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5670 "configure"
+#line 5767 "configure"
#include "confdefs.h"
#include <features.h>
@@ -5702,17 +5799,17 @@ stdlib.h string.h unistd.h sys/param.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5706: checking for $ac_hdr" >&5
+echo "configure:5803: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5711 "configure"
+#line 5808 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5716: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5813: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5743,12 +5840,12 @@ getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
strdup strtoul tsearch __argz_count __argz_stringify __argz_next
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5747: checking for $ac_func" >&5
+echo "configure:5844: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5752 "configure"
+#line 5849 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5771,7 +5868,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5812,7 +5909,7 @@ fi
echo $ac_n "checking for iconv""... $ac_c" 1>&6
-echo "configure:5816: checking for iconv" >&5
+echo "configure:5913: checking for iconv" >&5
if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -5820,7 +5917,7 @@ else
am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no
cat > conftest.$ac_ext <<EOF
-#line 5824 "configure"
+#line 5921 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <iconv.h>
@@ -5830,7 +5927,7 @@ iconv_t cd = iconv_open("","");
iconv_close(cd);
; return 0; }
EOF
-if { (eval echo configure:5834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_func_iconv=yes
else
@@ -5842,7 +5939,7 @@ rm -f conftest*
am_save_LIBS="$LIBS"
LIBS="$LIBS $am_cv_libiconv_ldpath -liconv"
cat > conftest.$ac_ext <<EOF
-#line 5846 "configure"
+#line 5943 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <iconv.h>
@@ -5852,7 +5949,7 @@ iconv_t cd = iconv_open("","");
iconv_close(cd);
; return 0; }
EOF
-if { (eval echo configure:5856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_lib_iconv=yes
am_cv_func_iconv=yes
@@ -5873,13 +5970,13 @@ echo "$ac_t""$am_cv_func_iconv" 1>&6
EOF
echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6
-echo "configure:5877: checking for iconv declaration" >&5
+echo "configure:5974: checking for iconv declaration" >&5
if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5883 "configure"
+#line 5980 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5898,7 +5995,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:5902: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5999: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
am_cv_proto_iconv_arg1=""
else
@@ -5927,19 +6024,19 @@ EOF
echo $ac_n "checking for nl_langinfo and CODESET""... $ac_c" 1>&6
-echo "configure:5931: checking for nl_langinfo and CODESET" >&5
+echo "configure:6028: checking for nl_langinfo and CODESET" >&5
if eval "test \"`echo '$''{'am_cv_langinfo_codeset'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5936 "configure"
+#line 6033 "configure"
#include "confdefs.h"
#include <langinfo.h>
int main() {
char* cs = nl_langinfo(CODESET);
; return 0; }
EOF
-if { (eval echo configure:5943: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_langinfo_codeset=yes
else
@@ -5962,19 +6059,19 @@ EOF
if test $ac_cv_header_locale_h = yes; then
echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:5966: checking for LC_MESSAGES" >&5
+echo "configure:6063: checking for LC_MESSAGES" >&5
if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5971 "configure"
+#line 6068 "configure"
#include "confdefs.h"
#include <locale.h>
int main() {
return LC_MESSAGES
; return 0; }
EOF
-if { (eval echo configure:5978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_val_LC_MESSAGES=yes
else
@@ -5995,7 +6092,7 @@ EOF
fi
fi
echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
-echo "configure:5999: checking whether NLS is requested" >&5
+echo "configure:6096: checking whether NLS is requested" >&5
# Check whether --enable-nls or --disable-nls was given.
if test "${enable_nls+set}" = set; then
enableval="$enable_nls"
@@ -6018,7 +6115,7 @@ fi
EOF
echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
-echo "configure:6022: checking whether included gettext is requested" >&5
+echo "configure:6119: checking whether included gettext is requested" >&5
# Check whether --with-included-gettext or --without-included-gettext was given.
if test "${with_included_gettext+set}" = set; then
withval="$with_included_gettext"
@@ -6038,17 +6135,17 @@ fi
ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
-echo "configure:6042: checking for libintl.h" >&5
+echo "configure:6139: checking for libintl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6047 "configure"
+#line 6144 "configure"
#include "confdefs.h"
#include <libintl.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6052: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6069,12 +6166,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
EOF
echo $ac_n "checking for GNU gettext in libc""... $ac_c" 1>&6
-echo "configure:6073: checking for GNU gettext in libc" >&5
+echo "configure:6170: checking for GNU gettext in libc" >&5
if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6078 "configure"
+#line 6175 "configure"
#include "confdefs.h"
#include <libintl.h>
extern int _nl_msg_cat_cntr;
@@ -6083,7 +6180,7 @@ bindtextdomain ("", "");
return (int) gettext ("") + _nl_msg_cat_cntr
; return 0; }
EOF
-if { (eval echo configure:6087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
gt_cv_func_gnugettext1_libc=yes
else
@@ -6099,14 +6196,14 @@ echo "$ac_t""$gt_cv_func_gnugettext1_libc" 1>&6
if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
echo $ac_n "checking for GNU gettext in libintl""... $ac_c" 1>&6
-echo "configure:6103: checking for GNU gettext in libintl" >&5
+echo "configure:6200: checking for GNU gettext in libintl" >&5
if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libintl'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
gt_save_LIBS="$LIBS"
LIBS="$LIBS -lintl $LIBICONV"
cat > conftest.$ac_ext <<EOF
-#line 6110 "configure"
+#line 6207 "configure"
#include "confdefs.h"
#include <libintl.h>
extern int _nl_msg_cat_cntr;
@@ -6115,7 +6212,7 @@ bindtextdomain ("", "");
return (int) gettext ("") + _nl_msg_cat_cntr
; return 0; }
EOF
-if { (eval echo configure:6119: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6216: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
gt_cv_func_gnugettext1_libintl=yes
else
@@ -6148,12 +6245,12 @@ EOF
for ac_func in dcgettext
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6152: checking for $ac_func" >&5
+echo "configure:6249: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6157 "configure"
+#line 6254 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6176,7 +6273,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6205,7 +6302,7 @@ done
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6209: checking for $ac_word" >&5
+echo "configure:6306: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6239,7 +6336,7 @@ fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6243: checking for $ac_word" >&5
+echo "configure:6340: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6276,7 +6373,7 @@ fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6280: checking for $ac_word" >&5
+echo "configure:6377: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6326,7 +6423,7 @@ fi
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6330: checking for $ac_word" >&5
+echo "configure:6427: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6360,7 +6457,7 @@ fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6364: checking for $ac_word" >&5
+echo "configure:6461: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6396,7 +6493,7 @@ fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6400: checking for $ac_word" >&5
+echo "configure:6497: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6468,7 +6565,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6472: checking for $ac_word" >&5
+echo "configure:6569: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_INTLBISON'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6501,7 +6598,7 @@ done
ac_verc_fail=yes
else
echo $ac_n "checking version of bison""... $ac_c" 1>&6
-echo "configure:6505: checking version of bison" >&5
+echo "configure:6602: checking version of bison" >&5
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -6546,7 +6643,7 @@ EOF
if test "x$CATOBJEXT" != x; then
echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
-echo "configure:6550: checking for catalogs to be installed" >&5
+echo "configure:6647: checking for catalogs to be installed" >&5
# Look for .po and .gmo files in the source directory.
CATALOGS=
XLINGUAS=
@@ -6604,7 +6701,7 @@ fi
case $host_os in
win32 | pe | cygwin* | mingw32* | uwin*)
echo $ac_n "checking whether windows registry support is requested""... $ac_c" 1>&6
-echo "configure:6608: checking whether windows registry support is requested" >&5
+echo "configure:6705: checking whether windows registry support is requested" >&5
if test "x$enable_win32_registry" != xno; then
cat >> confdefs.h <<\EOF
#define ENABLE_WIN32_REGISTRY 1
@@ -6613,14 +6710,14 @@ EOF
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for library containing RegOpenKeyExA""... $ac_c" 1>&6
-echo "configure:6617: checking for library containing RegOpenKeyExA" >&5
+echo "configure:6714: checking for library containing RegOpenKeyExA" >&5
if eval "test \"`echo '$''{'ac_cv_search_RegOpenKeyExA'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_func_search_save_LIBS="$LIBS"
ac_cv_search_RegOpenKeyExA="no"
cat > conftest.$ac_ext <<EOF
-#line 6624 "configure"
+#line 6721 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -6631,7 +6728,7 @@ int main() {
RegOpenKeyExA()
; return 0; }
EOF
-if { (eval echo configure:6635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_RegOpenKeyExA="none required"
else
@@ -6642,7 +6739,7 @@ rm -f conftest*
test "$ac_cv_search_RegOpenKeyExA" = "no" && for i in advapi32; do
LIBS="-l$i $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6646 "configure"
+#line 6743 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -6653,7 +6750,7 @@ int main() {
RegOpenKeyExA()
; return 0; }
EOF
-if { (eval echo configure:6657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_RegOpenKeyExA="-l$i"
break
@@ -6695,7 +6792,7 @@ esac
if test "x$enable_win32_registry" != xno; then
echo $ac_n "checking registry key on windows hosts""... $ac_c" 1>&6
-echo "configure:6699: checking registry key on windows hosts" >&5
+echo "configure:6796: checking registry key on windows hosts" >&5
cat >> confdefs.h <<EOF
#define WIN32_REGISTRY_KEY "$gcc_cv_win32_registry_key"
EOF
@@ -6831,12 +6928,9 @@ fi
# This prevents libgcc2 from containing any code which requires libc
# support.
inhibit_libc=
-if test x$host != x$target && test x$with_headers = x; then
+if { test x$host != x$target && test "x$with_headers" = x &&
+ test "x$with_sysroot" = x ; } || test x$with_newlib = xyes ; then
inhibit_libc=-Dinhibit_libc
-else
- if test x$with_newlib = xyes; then
- inhibit_libc=-Dinhibit_libc
- fi
fi
@@ -6909,7 +7003,7 @@ fi
# Figure out what assembler we will be using.
echo $ac_n "checking what assembler to use""... $ac_c" 1>&6
-echo "configure:6913: checking what assembler to use" >&5
+echo "configure:7007: checking what assembler to use" >&5
gcc_cv_as=
gcc_cv_gas_major_version=
gcc_cv_gas_minor_version=
@@ -7003,7 +7097,7 @@ fi
# Figure out what linker we will be using.
echo $ac_n "checking what linker to use""... $ac_c" 1>&6
-echo "configure:7007: checking what linker to use" >&5
+echo "configure:7101: checking what linker to use" >&5
gcc_cv_ld=
gcc_cv_gld_major_version=
gcc_cv_gld_minor_version=
@@ -7096,7 +7190,7 @@ fi
# Figure out what nm we will be using.
echo $ac_n "checking what nm to use""... $ac_c" 1>&6
-echo "configure:7100: checking what nm to use" >&5
+echo "configure:7194: checking what nm to use" >&5
if test -x nm$host_exeext; then
gcc_cv_nm=./nm$host_exeext
elif test "x$program_prefix" != xNONE; then
@@ -7108,7 +7202,7 @@ echo "$ac_t""$gcc_cv_nm" 1>&6
# Figure out what objdump we will be using.
echo $ac_n "checking what objdump to use""... $ac_c" 1>&6
-echo "configure:7112: checking what objdump to use" >&5
+echo "configure:7206: checking what objdump to use" >&5
if test -x objdump$host_exeext; then
gcc_cv_objdump=./objdump$host_exeext
elif test "x$program_prefix" != xNONE; then
@@ -7120,7 +7214,7 @@ echo "$ac_t""$gcc_cv_objdump" 1>&6
# Figure out what assembler alignment features are present.
echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
-echo "configure:7124: checking assembler alignment features" >&5
+echo "configure:7218: checking assembler alignment features" >&5
gcc_cv_as_alignment_features=none
if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x; then
# Gas version 2.6 and later support for .balign and .p2align.
@@ -7168,7 +7262,7 @@ fi
echo "$ac_t""$gcc_cv_as_alignment_features" 1>&6
echo $ac_n "checking assembler subsection support""... $ac_c" 1>&6
-echo "configure:7172: checking assembler subsection support" >&5
+echo "configure:7266: checking assembler subsection support" >&5
gcc_cv_as_subsections=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 9 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
@@ -7208,7 +7302,7 @@ fi
echo "$ac_t""$gcc_cv_as_subsections" 1>&6
echo $ac_n "checking assembler weak support""... $ac_c" 1>&6
-echo "configure:7212: checking assembler weak support" >&5
+echo "configure:7306: checking assembler weak support" >&5
gcc_cv_as_weak=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 2 -o "$gcc_cv_gas_major_version" -gt 2; then
@@ -7231,7 +7325,7 @@ fi
echo "$ac_t""$gcc_cv_as_weak" 1>&6
echo $ac_n "checking assembler hidden support""... $ac_c" 1>&6
-echo "configure:7235: checking assembler hidden support" >&5
+echo "configure:7329: checking assembler hidden support" >&5
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 \
@@ -7303,7 +7397,7 @@ esac
echo $ac_n "checking assembler leb128 support""... $ac_c" 1>&6
-echo "configure:7307: checking assembler leb128 support" >&5
+echo "configure:7401: checking assembler leb128 support" >&5
gcc_cv_as_leb128=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 11 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
@@ -7348,7 +7442,7 @@ fi
echo "$ac_t""$gcc_cv_as_leb128" 1>&6
echo $ac_n "checking assembler eh_frame optimization""... $ac_c" 1>&6
-echo "configure:7352: checking assembler eh_frame optimization" >&5
+echo "configure:7446: checking assembler eh_frame optimization" >&5
gcc_cv_as_eh_frame=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 12 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
@@ -7429,7 +7523,7 @@ fi
echo "$ac_t""$gcc_cv_as_eh_frame" 1>&6
echo $ac_n "checking assembler section merging support""... $ac_c" 1>&6
-echo "configure:7433: checking assembler section merging support" >&5
+echo "configure:7527: checking assembler section merging support" >&5
gcc_cv_as_shf_merge=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 12 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
@@ -7452,7 +7546,7 @@ fi
echo "$ac_t""$gcc_cv_as_shf_merge" 1>&6
echo $ac_n "checking assembler thread-local storage support""... $ac_c" 1>&6
-echo "configure:7456: checking assembler thread-local storage support" >&5
+echo "configure:7550: checking assembler thread-local storage support" >&5
gcc_cv_as_tls=no
conftest_s=
tls_first_major=
@@ -7544,7 +7638,7 @@ case "$target" in
# All TARGET_ABI_OSF targets.
alpha*-*-osf* | alpha*-*-linux* | alpha*-*-*bsd*)
echo $ac_n "checking assembler supports explicit relocations""... $ac_c" 1>&6
-echo "configure:7548: checking assembler supports explicit relocations" >&5
+echo "configure:7642: checking assembler supports explicit relocations" >&5
if eval "test \"`echo '$''{'gcc_cv_as_explicit_relocs'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -7594,7 +7688,7 @@ EOF
;;
sparc*-*-*)
echo $ac_n "checking assembler .register pseudo-op support""... $ac_c" 1>&6
-echo "configure:7598: checking assembler .register pseudo-op support" >&5
+echo "configure:7692: checking assembler .register pseudo-op support" >&5
if eval "test \"`echo '$''{'gcc_cv_as_register_pseudo_op'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -7622,7 +7716,7 @@ EOF
fi
echo $ac_n "checking assembler supports -relax""... $ac_c" 1>&6
-echo "configure:7626: checking assembler supports -relax" >&5
+echo "configure:7720: checking assembler supports -relax" >&5
if eval "test \"`echo '$''{'gcc_cv_as_relax_opt'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -7650,7 +7744,7 @@ EOF
fi
echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
-echo "configure:7654: checking assembler and linker support unaligned pc related relocs" >&5
+echo "configure:7748: checking assembler and linker support unaligned pc related relocs" >&5
if eval "test \"`echo '$''{'gcc_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -7677,7 +7771,7 @@ EOF
fi
echo $ac_n "checking assembler and linker support unaligned pc related relocs against hidden symbols""... $ac_c" 1>&6
-echo "configure:7681: checking assembler and linker support unaligned pc related relocs against hidden symbols" >&5
+echo "configure:7775: checking assembler and linker support unaligned pc related relocs against hidden symbols" >&5
if eval "test \"`echo '$''{'gcc_cv_as_sparc_ua_pcrel_hidden'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -7716,49 +7810,47 @@ EOF
fi
- if test "x$gcc_cv_as_flags64" != xno; then
- echo $ac_n "checking for assembler offsetable %lo() support""... $ac_c" 1>&6
-echo "configure:7722: checking for assembler offsetable %lo() support" >&5
+ echo $ac_n "checking for assembler offsetable %lo() support""... $ac_c" 1>&6
+echo "configure:7815: checking for assembler offsetable %lo() support" >&5
if eval "test \"`echo '$''{'gcc_cv_as_offsetable_lo10'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
- gcc_cv_as_offsetable_lo10=unknown
- if test "x$gcc_cv_as" != x; then
- # Check if assembler has offsetable %lo()
- echo "or %g1, %lo(ab) + 12, %g1" > conftest.s
- echo "or %g1, %lo(ab + 12), %g1" > conftest1.s
- if $gcc_cv_as $gcc_cv_as_flags64 -o conftest.o conftest.s \
- > /dev/null 2>&1 &&
- $gcc_cv_as $gcc_cv_as_flags64 -o conftest1.o conftest1.s \
- > /dev/null 2>&1; then
- if cmp conftest.o conftest1.o > /dev/null 2>&1; then
- gcc_cv_as_offsetable_lo10=no
- else
- gcc_cv_as_offsetable_lo10=yes
- fi
- else
+ gcc_cv_as_offsetable_lo10=unknown
+ if test "x$gcc_cv_as" != x; then
+ # Check if assembler has offsetable %lo()
+ echo "or %g1, %lo(ab) + 12, %g1" > conftest.s
+ echo "or %g1, %lo(ab + 12), %g1" > conftest1.s
+ if $gcc_cv_as -xarch=v9 -o conftest.o conftest.s \
+ > /dev/null 2>&1 &&
+ $gcc_cv_as -xarch=v9 -o conftest1.o conftest1.s \
+ > /dev/null 2>&1; then
+ if cmp conftest.o conftest1.o > /dev/null 2>&1; then
gcc_cv_as_offsetable_lo10=no
+ else
+ gcc_cv_as_offsetable_lo10=yes
fi
- rm -f conftest.s conftest.o conftest1.s conftest1.o
+ else
+ gcc_cv_as_offsetable_lo10=no
fi
-
+ rm -f conftest.s conftest.o conftest1.s conftest1.o
+ fi
+
fi
echo "$ac_t""$gcc_cv_as_offsetable_lo10" 1>&6
- if test "x$gcc_cv_as_offsetable_lo10" = xyes; then
- cat >> confdefs.h <<\EOF
+ if test "x$gcc_cv_as_offsetable_lo10" = xyes; then
+ cat >> confdefs.h <<\EOF
#define HAVE_AS_OFFSETABLE_LO10 1
EOF
- fi
fi
;;
i[34567]86-*-* | x86_64-*-*)
echo $ac_n "checking assembler instructions""... $ac_c" 1>&6
-echo "configure:7762: checking assembler instructions" >&5
+echo "configure:7854: checking assembler instructions" >&5
gcc_cv_as_instructions=
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 9 -o "$gcc_cv_gas_major_version" -gt 2; then
@@ -7785,7 +7877,7 @@ EOF
echo "$ac_t""$gcc_cv_as_instructions" 1>&6
echo $ac_n "checking assembler GOTOFF in data directives""... $ac_c" 1>&6
-echo "configure:7789: checking assembler GOTOFF in data directives" >&5
+echo "configure:7881: checking assembler GOTOFF in data directives" >&5
gcc_cv_as_gotoff_in_data=no
if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x
then
@@ -7815,7 +7907,7 @@ EOF
esac
echo $ac_n "checking assembler dwarf2 debug_line support""... $ac_c" 1>&6
-echo "configure:7819: checking assembler dwarf2 debug_line support" >&5
+echo "configure:7911: checking assembler dwarf2 debug_line support" >&5
gcc_cv_as_dwarf2_debug_line=no
# ??? Not all targets support dwarf2 debug_line, even within a version
# of gas. Moreover, we need to emit a valid instruction to trigger any
@@ -7871,7 +7963,7 @@ fi
echo "$ac_t""$gcc_cv_as_dwarf2_debug_line" 1>&6
echo $ac_n "checking assembler --gdwarf2 support""... $ac_c" 1>&6
-echo "configure:7875: checking assembler --gdwarf2 support" >&5
+echo "configure:7967: checking assembler --gdwarf2 support" >&5
gcc_cv_as_gdwarf2_flag=no
if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x;
then
@@ -7900,7 +7992,7 @@ fi
echo "$ac_t""$gcc_cv_as_gdwarf2_flag" 1>&6
echo $ac_n "checking assembler --gstabs support""... $ac_c" 1>&6
-echo "configure:7904: checking assembler --gstabs support" >&5
+echo "configure:7996: checking assembler --gstabs support" >&5
gcc_cv_as_gstabs_flag=no
if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x;
then
@@ -7928,7 +8020,7 @@ fi
echo "$ac_t""$gcc_cv_as_gstabs_flag" 1>&6
echo $ac_n "checking linker PT_GNU_EH_FRAME support""... $ac_c" 1>&6
-echo "configure:7932: checking linker PT_GNU_EH_FRAME support" >&5
+echo "configure:8024: checking linker PT_GNU_EH_FRAME support" >&5
gcc_cv_ld_eh_frame_hdr=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 12 -o "$gcc_cv_gld_major_version" -gt 2 && grep 'EMUL = elf' ../ld/Makefile > /dev/null; then
@@ -7952,7 +8044,7 @@ echo "$ac_t""$gcc_cv_ld_eh_frame_hdr" 1>&6
case "$target" in
mips*-*-*)
echo $ac_n "checking whether libgloss uses STARTUP directives consistently""... $ac_c" 1>&6
-echo "configure:7956: checking whether libgloss uses STARTUP directives consistently" >&5
+echo "configure:8048: checking whether libgloss uses STARTUP directives consistently" >&5
gcc_cv_mips_libgloss_startup=no
gcc_cv_libgloss_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/libgloss
if test "x$exec_prefix" = xNONE; then
@@ -8156,7 +8248,7 @@ fi
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:8160: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:8252: checking whether to enable maintainer-specific portions of Makefiles" >&5
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
@@ -8174,34 +8266,6 @@ else
MAINT='#'
fi
-# With Setjmp/Longjmp based exception handling.
-# Check whether --enable-sjlj-exceptions or --disable-sjlj-exceptions was given.
-if test "${enable_sjlj_exceptions+set}" = set; then
- enableval="$enable_sjlj_exceptions"
- sjlj=`if test $enableval = yes; then echo 1; else echo 0; fi`
-cat >> confdefs.h <<EOF
-#define CONFIG_SJLJ_EXCEPTIONS $sjlj
-EOF
-
-fi
-
-
-# Use libunwind based exception handling.
-# Check whether --enable-libunwind-exceptions or --disable-libunwind-exceptions was given.
-if test "${enable_libunwind_exceptions+set}" = set; then
- enableval="$enable_libunwind_exceptions"
- use_libunwind_exceptions=$enableval
-else
- use_libunwind_exceptions=no
-fi
-
-if test x"$use_libunwind_exceptions" = xyes; then
- cat >> confdefs.h <<\EOF
-#define USE_LIBUNWIND_EXCEPTIONS 1
-EOF
-
-fi
-
# Make empty files to contain the specs and options for each language.
# Then add #include lines to for a compiler that has specs and/or options.
@@ -8422,7 +8486,6 @@ fi
-# Nothing to do for FLOAT_H, float_format already handled.
objdir=`${PWDCMD-pwd}`
@@ -8670,6 +8733,9 @@ s%@enable_multilib@%$enable_multilib%g
s%@nocommon_flag@%$nocommon_flag%g
s%@coverage_flags@%$coverage_flags%g
s%@enable_shared@%$enable_shared%g
+s%@TARGET_SYSTEM_ROOT@%$TARGET_SYSTEM_ROOT%g
+s%@TARGET_SYSTEM_ROOT_DEFINE@%$TARGET_SYSTEM_ROOT_DEFINE%g
+s%@CROSS_SYSTEM_HEADER_DIR@%$CROSS_SYSTEM_HEADER_DIR%g
s%@host@%$host%g
s%@host_alias@%$host_alias%g
s%@host_cpu@%$host_cpu%g
diff --git a/gcc/configure.in b/gcc/configure.in
index 8316af5ca26..478f9e3e59f 100644
--- a/gcc/configure.in
+++ b/gcc/configure.in
@@ -373,6 +373,25 @@ AC_ARG_ENABLE(shared,
], [enable_shared=yes])
AC_SUBST(enable_shared)
+AC_ARG_WITH(sysroot,
+[ --with-sysroot[=DIR] Search for usr/lib, usr/include, et al, within DIR.],
+[
+ case ${with_sysroot} in
+ yes) TARGET_SYSTEM_ROOT='${gcc_tooldir}/sys-root' ;;
+ *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
+ esac
+
+ TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'
+ CROSS_SYSTEM_HEADER_DIR='$(TARGET_SYSTEM_ROOT)$(NATIVE_SYSTEM_HEADER_DIR)'
+], [
+ TARGET_SYSTEM_ROOT=
+ TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=0'
+ CROSS_SYSTEM_HEADER_DIR='$(gcc_tooldir)/sys-include'
+])
+AC_SUBST(TARGET_SYSTEM_ROOT)
+AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)
+AC_SUBST(CROSS_SYSTEM_HEADER_DIR)
+
# Determine the host, build, and target systems
AC_CANONICAL_SYSTEM
@@ -756,6 +775,25 @@ objext='.o'
AC_SUBST(manext)
AC_SUBST(objext)
+# With Setjmp/Longjmp based exception handling.
+AC_ARG_ENABLE(sjlj-exceptions,
+[ --enable-sjlj-exceptions
+ arrange to use setjmp/longjmp exception handling],
+[sjlj=`if test $enableval = yes; then echo 1; else echo 0; fi`
+AC_DEFINE_UNQUOTED(CONFIG_SJLJ_EXCEPTIONS, $sjlj,
+ [Define 0/1 to force the choice for exception handling model.])])
+
+AC_CHECK_LIB(unwind, main, use_libunwind_default=yes, use_libunwind_default=no)
+# Use libunwind based exception handling.
+AC_ARG_ENABLE(libunwind-exceptions,
+[ --enable-libunwind-exceptions force use libunwind for exceptions],
+use_libunwind_exceptions=$enableval,
+use_libunwind_exceptions=$use_libunwind_default)
+if test x"$use_libunwind_exceptions" = xyes; then
+ AC_DEFINE(USE_LIBUNWIND_EXCEPTIONS, 1,
+ [Define if gcc should use -lunwind.])
+fi
+
target_gtfiles=
build_xm_file=
build_xm_defines=
@@ -798,15 +836,6 @@ if test x"$dwarf2" = xyes
then tm_file="$tm_file tm-dwarf2.h"
fi
-if test x$float_format = x
-then float_format=i64
-fi
-
-if test $float_format = none
-then float_h_file=Makefile.in
-else float_h_file=float-$float_format.h
-fi
-
# Say what files are being used for the output code and MD file.
echo "Using \`$srcdir/config/$out_file' for machine-specific logic."
echo "Using \`$srcdir/config/$md_file' as machine description file."
@@ -1173,12 +1202,9 @@ fi
# This prevents libgcc2 from containing any code which requires libc
# support.
inhibit_libc=
-if [test x$host != x$target] && [test x$with_headers = x]; then
+if { test x$host != x$target && test "x$with_headers" = x &&
+ test "x$with_sysroot" = x ; } || test x$with_newlib = xyes ; then
inhibit_libc=-Dinhibit_libc
-else
- if [test x$with_newlib = xyes]; then
- inhibit_libc=-Dinhibit_libc
- fi
fi
AC_SUBST(inhibit_libc)
@@ -1989,33 +2015,31 @@ EOF
[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],
- gcc_cv_as_offsetable_lo10, [
- gcc_cv_as_offsetable_lo10=unknown
- if test "x$gcc_cv_as" != x; then
- # Check if assembler has offsetable %lo()
- echo "or %g1, %lo(ab) + 12, %g1" > conftest.s
- echo "or %g1, %lo(ab + 12), %g1" > conftest1.s
- if $gcc_cv_as $gcc_cv_as_flags64 -o conftest.o conftest.s \
- > /dev/null 2>&1 &&
- $gcc_cv_as $gcc_cv_as_flags64 -o conftest1.o conftest1.s \
- > /dev/null 2>&1; then
- if cmp conftest.o conftest1.o > /dev/null 2>&1; then
- gcc_cv_as_offsetable_lo10=no
- else
- gcc_cv_as_offsetable_lo10=yes
- fi
- else
+ AC_CACHE_CHECK([for assembler offsetable %lo() support],
+ gcc_cv_as_offsetable_lo10, [
+ gcc_cv_as_offsetable_lo10=unknown
+ if test "x$gcc_cv_as" != x; then
+ # Check if assembler has offsetable %lo()
+ echo "or %g1, %lo(ab) + 12, %g1" > conftest.s
+ echo "or %g1, %lo(ab + 12), %g1" > conftest1.s
+ if $gcc_cv_as -xarch=v9 -o conftest.o conftest.s \
+ > /dev/null 2>&1 &&
+ $gcc_cv_as -xarch=v9 -o conftest1.o conftest1.s \
+ > /dev/null 2>&1; then
+ if cmp conftest.o conftest1.o > /dev/null 2>&1; then
gcc_cv_as_offsetable_lo10=no
+ else
+ gcc_cv_as_offsetable_lo10=yes
fi
- rm -f conftest.s conftest.o conftest1.s conftest1.o
+ else
+ gcc_cv_as_offsetable_lo10=no
fi
- ])
- if test "x$gcc_cv_as_offsetable_lo10" = xyes; then
- AC_DEFINE(HAVE_AS_OFFSETABLE_LO10, 1,
- [Define if your assembler supports offsetable %lo().])
+ rm -f conftest.s conftest.o conftest1.s conftest1.o
fi
+ ])
+ if test "x$gcc_cv_as_offsetable_lo10" = xyes; then
+ AC_DEFINE(HAVE_AS_OFFSETABLE_LO10, 1,
+ [Define if your assembler supports offsetable %lo().])
fi
;;
@@ -2415,24 +2439,6 @@ else
fi
AC_SUBST(MAINT)dnl
-# With Setjmp/Longjmp based exception handling.
-AC_ARG_ENABLE(sjlj-exceptions,
-[ --enable-sjlj-exceptions
- arrange to use setjmp/longjmp exception handling],
-[sjlj=`if test $enableval = yes; then echo 1; else echo 0; fi`
-AC_DEFINE_UNQUOTED(CONFIG_SJLJ_EXCEPTIONS, $sjlj,
- [Define 0/1 to force the choice for exception handling model.])])
-
-# Use libunwind based exception handling.
-AC_ARG_ENABLE(libunwind-exceptions,
-[ --enable-libunwind-exceptions force use libunwind for exceptions],
-use_libunwind_exceptions=$enableval,
-use_libunwind_exceptions=no)
-if test x"$use_libunwind_exceptions" = xyes; then
- AC_DEFINE(USE_LIBUNWIND_EXCEPTIONS, 1,
- [Define if gcc should use -lunwind.])
-fi
-
# Make empty files to contain the specs and options for each language.
# Then add #include lines to for a compiler that has specs and/or options.
@@ -2649,7 +2655,6 @@ else
fi)
AC_SUBST(slibdir)
-# Nothing to do for FLOAT_H, float_format already handled.
objdir=`${PWDCMD-pwd}`
AC_SUBST(objdir)
diff --git a/gcc/conflict.c b/gcc/conflict.c
index 9851fade3de..a6d755499bb 100644
--- a/gcc/conflict.c
+++ b/gcc/conflict.c
@@ -112,7 +112,7 @@ struct conflict_graph_def
R1 and R2. R1 is assumed to be smaller or equal to R2. */
#define CONFLICT_HASH_FN(R1, R2) ((R2) * ((R2) - 1) / 2 + (R1))
-static unsigned arc_hash PARAMS ((const void *));
+static hashval_t arc_hash PARAMS ((const void *));
static int arc_eq PARAMS ((const void *, const void *));
static int print_conflict PARAMS ((int, int, void *));
static void mark_reg PARAMS ((rtx, rtx, void *));
@@ -120,7 +120,7 @@ static void mark_reg PARAMS ((rtx, rtx, void *));
/* Callback function to compute the hash value of an arc. Uses
current_graph to locate the graph to which the arc belongs. */
-static unsigned
+static hashval_t
arc_hash (arcp)
const void *arcp;
{
@@ -183,7 +183,7 @@ conflict_graph_delete (graph)
}
/* Adds a conflict to GRAPH between regs REG1 and REG2, which must be
- distinct. Returns non-zero, unless the conflict is already present
+ distinct. Returns nonzero, unless the conflict is already present
in GRAPH, in which case it does nothing and returns zero. */
int
@@ -232,7 +232,7 @@ conflict_graph_add (graph, reg1, reg2)
return 1;
}
-/* Returns non-zero if a conflict exists in GRAPH between regs REG1
+/* Returns nonzero if a conflict exists in GRAPH between regs REG1
and REG2. */
int
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b6a81715e9d..9e843af6079 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,631 @@
+2002-10-20 Mark Mitchell <mark@codesourcery.com>
+
+ * method.c (use_thunk): Compute the vcall index as a HOST_WIDE_INT.
+ * optimize.c (optimize_function): Replace ASM_OUTPUT_MI_THUNK with
+ TARGET_ASM_OUTPUT_MI_THUNK in comments.
+
+2002-10-18 Zack Weinberg <zack@codesourcery.com>
+
+ * decl.c (start_decl): Point users of the old initialized-
+ typedef extension at __typeof__.
+
+2002-10-18 Mark Mitchell <mark@codesourcery.com>
+
+ * Make-lang.in (method.o): Depend on TARGET_H.
+ * method.c (target.h): Include it.
+ (use_thunk): Use target hooks. Use vcall thunks, if available.
+
+2002-10-18 Mark Mitchell <mark@codesourcery.com>
+
+ * class.c (base_derived_from): Make sure return value is a bool.
+
+2002-10-18 Mark Mitchell <mark@codesourcery.com>
+
+ * class.c (find_final_overrider_data_s): Remove overriding_fn and
+ overriding_base.
+ (dfs_base_derived_from): New function.
+ (base_derived_from): Likewise.
+ (dfs_find_final_overrider): Use base_derived_from.
+ (find_final_overrider): Adjust.
+
+2002-10-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/8080
+ * semantics.c (finish_for_cond, finish_while_cond): Don't mess
+ with condition decls in a template.
+
+2002-10-17 Nathan Sidwell <nathan@codesourcery.com>
+
+ * class.c (add_method): Compare template parms too.
+
+2002-10-17 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7584
+ * class.c (handle_using_decl): Allow the declaration used to be
+ from an ambiguous base.
+
+ * pt.c (convert_template_argument): Revert this change:
+ 2002-10-16 Mark Mitchell <mark@codesourcery.com>
+ * pt.c (convert_template_argument): Do not fold non-type
+ template rguments when inside a template.
+
+ * init.c (expand_default_init): Handle brace-enclosed initializers
+ correctly.
+
+2002-10-16 Mark Mitchell <mark@codesourcery.com>
+
+ * mangle.c (write_expression): Correct handling of enumeration
+ constants.
+ (write_template_arg): Likewise.
+ * pt.c (convert_template_argument): Do not fold non-type template
+ arguments when inside a template.
+
+ PR c++/7478
+ * cvt.c (convert_to_reference): Allow references as the incoming
+ type.
+
+2002-10-16 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7524
+ * method.c (do_build_assign_ref): Use cp_build_qualified_type, not
+ build_qualified_type.
+
+2002-10-15 Richard Henderson <rth@redhat.com>
+
+ * error.c (dump_expr): Use real_to_decimal directly, and with
+ the new arguments.
+
+2002-10-15 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (reshape_init): Fix typo.
+
+ * cp-tree.h (operator_name_info_t): Add arity.
+ * lex.c (init_operators): Initialize it.
+ * mangle.c (write_conversion_operator_name): New function.
+ (write_unqualified_name): Use it.
+ (write_template_args): Accept template arguments as a TREE_LIST.
+ (write_expression): Adjust handling of qualified names to match
+ specification.
+
+2002-10-15 Jason Merrill <jason@redhat.com>
+
+ * call.c (call_builtin_trap): New fn.
+ (convert_arg_to_ellipsis): Use it. Downgrade error to warning.
+ (build_call): Don't set current_function_returns_abnormally outside
+ a function.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ * class.c (check_field_decls): Remove empty_p parameter. Instead,
+ clear CLASSTYPE_EMPTY_P.
+ (build_base_field): Likewise.
+ (build_base_fields): Likewise.
+ (check_bases_and_members): Likewise.
+ (create_vtbl_ptr): Likewise.
+ (layout_class_type): Likewise. Ensure that empty classes have
+ size zero when used as base classes in the 3.2 ABI.
+ (finish_struct_1): Initialize CLASSTYPE_EMPTY_P and
+ CLASSTYPE_NEARLY_EMPTY_P. Adjust calls to avoid passing empty_p
+ parameter.
+ (is_empty_class): Correct definition when using post-3.2 ABI.
+ * cp-tree.h (lang_type_class): Add empty_p.
+ (CLASSTYPE_EMPTY_P): New macro.
+
+2002-10-12 Nathan Sidwell <nathan@codesourcery.com>
+
+ * init.c (build_delete): Do not apply save_expr for arrays.
+ (build_vec_delete): Likewise.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (layout_var_decl): Call layout_decl even for variables
+ whose type is an array with unspecified bounds.
+
+ PR c++/7176
+ * lex.c (do_identifier): Add another option for the parsing
+ parameter.
+ * parse.y (do_id): Use it.
+
+2002-10-11 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ PRs C++/6803, C++/7721 and C++/7803
+ * decl.c (grokdeclarator): Gracefully handle template-name as
+ decl-specifier.
+
+2002-10-11 Jason Molenda <jmolenda@apple.com>
+
+ * init.c (build_field_list): Provide uses_unions_p with a default
+ value.
+
+2002-10-11 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/5661
+ * cp-tree.h (variably_modified_type_p): New function.
+ (grokdeclarator) Tighten check for variably modified types as
+ fields.
+ * pt.c (convert_template_argument): Do not allow variably modified
+ types as template arguments.
+ * tree.c (variably_modified_type_p): New function.
+
+ * NEWS: Document removal of "new X = ..." extension.
+ * class.c (initialize_array): Set TREE_HAS_CONSTRUCTOR on
+ brace-enclosed initializers.
+ * cp-tree.h (CP_AGGREGATE_TYPE_P): New macro.
+ (initialize_local_var): Remove declaration.
+ (expand_static_init): Likewise.
+ * decl.c (next_initializable_field): New function.
+ (reshape_init): Likewise.
+ (check_initializer): Use them. Build dynamic initializer for
+ aggregates here too.
+ (initialize_local_var): Simplify, and incorporate cleanup
+ insertion code as well.
+ (destroy_local_var): Remove.
+ (cp_finish_decl): Tidy.
+ (expand_static_init): Fold checks for whether or not a variable
+ needs initialization into this function. Simplify.
+ * decl2.c (do_static_initialization): Simplify.
+ * init.c (build_init): Do not set TREE_SIDE_EFFECTS when it will
+ be done for us automatically.
+ (expand_default_init): Handle brace-enclosed initializers
+ correctly.
+ (expand_aggr_init_1): Remove RTL-generation code.
+ (build_vec_init): Remove "new X = ..." support.
+ * parse.y (new_initializer): Likewise.
+ * rtti.c (get_pseudo_ti_init): Set TREE_HAS_CONSTRUCTOR on
+ brace-enclosed initializer.
+ (create_pseudo_type_info): Likewise.
+ * typeck2.c (store_init_value): Don't try to handle digest_init
+ being called more than once.
+ (digest_init): Tidy handling of brace-enclosed initializers.
+
+2002-10-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * decl.c (typename_hash): Use htab_hash_pointer.
+
+2002-10-10 Jim Wilson <wilson@redhat.com>
+
+ * decl.c (duplicate_decls): Don't call decl_attributes.
+
+2002-10-09 Zack Weinberg <zack@codesourcery.com>
+
+ PR c/7353
+ * decl.c (start_decl): Unconditionally issue error for
+ 'typedef foo = bar'.
+ (cp_finish_decl): Remove special case for TYPE_DECL with initializer.
+ (grokdeclarator): Remove redundant error for 'typedef foo = bar'.
+
+2002-10-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * decl2.c (prune_vtable_vardecl): Delete unused function.
+
+2002-10-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7754
+ * decl2.c (finish_anon_union): Do not expand anonymous unions when
+ procesing template functions.
+ * pt.c (tsubst_decl, case VAR_DECL): Try to complete the variable
+ type. Call layout_decl.
+ (tsubst_expr, case DECL_STMT): Handle anonymous unions.
+
+2002-10-07 Richard Henderson <rth@redhat.com>
+
+ * decl2.c, pt.c: Revert c++/7754 fix.
+
+2002-10-05 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/7804
+ * error.c (dump_expr) [REAL_CST]: Output in decimal format.
+
+2002-10-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7931
+ * pt.c (for_each_template_parm_r): Handle BASELINKs.
+
+ PR c++/7754
+ * decl2.c (finish_anon_union): Do not expand anonymous unions when
+ procesing template functions.
+ * pt.c (tsubst_decl, case VAR_DECL): Try to complete the variable
+ type. Call layout_decl.
+ (tsubst_expr, case DECL_STMT): Handle anonymous unions.
+
+2002-10-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/8006
+ * mangle.c (CLASSTYPE_TEMPLATE_ID_P): Handle instances of template
+ template parameters.
+ (globals): Add entity and need_abi_warning.
+ (decl_is_template_id): Use TYPE_TEMPLATE_INFO, not
+ CLASSTYPE_TEMPLATE_INFO.
+ (is_std_substitution): Use CLASSTYPE_TI_TEMPLATE, not
+ TYPE_TI_TEMPLATE.
+ (write_prefix): Handle typename types correctly.
+ (write_template_prefix): Handle template template parameters
+ correctly.
+ (start_mangling): Add entity parameter.
+ (finish_mangling): Warn about names whose mangling will change.
+ (mangle_decl_string): Adjust.
+ (mangle_type_string): Likewise.
+ (mangle_special_for_type): Likewise.
+ (mangle_ctor_vtbl_for_type): Likewise.
+ (mangle_thunk): Likewise.
+ (mangle_guard_variable): Likewise.
+ (mangle_ref_init_variable): Likewise.
+
+2002-10-02 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7188.
+ * cp-tree.def (CTOR_INITIALIZER): Use one slot, not two.
+ * cp-tree.h (emit_base_init): Rename to ....
+ (emit_mem_initializers): ... this.
+ (expand_member_init): Change prototype.
+ * init.c (perform_member_init): Compute explicit, rather than
+ requiring it as a parameter.
+ (sort_member_init): Rename to ...
+ (sort_mem_initializers): ... this. Process bases and data members
+ together.
+ (sort_base_init): Remove.
+ (emit_base_init): Rename to ...
+ (emit_mem_initializers): ... this.
+ (expand_aggr_vbase_init_1): Remove.
+ (construct_virtual_bases): Rename to ...
+ (construct_virtual_base): ... this.
+ (expand_member_init): Rework handling of base initializers.
+ * method.c (do_build_copy_constructor): Use
+ finish_mem_initializers.
+ * parse.y (member_init): Adjust calls to expand_member_init.
+ * pt.c (tsubst_expr): Simplify CTOR_INITIALIZER case.
+ (tsubst_initializer_list): Use expand_member_init.
+ * semantics.c (finish_mem_intiailizers): Simplify.
+
+2002-10-02 Matt Austern <austern@apple.com>
+ * decl.c (walk_vtables_r): Fixed typo that caused result to
+ never get a nonzero value.
+
+2002-10-02 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6627
+ * cp-tree.h (enum ptrmemfunc_vbit_where_t): Delete definition
+ from here, and move it to tree.h.
+ * decl.c (cxx_init_decl_processing): If storing the vbit
+ in function pointers, ensure that force_align_functions_log
+ is atleast one.
+
+2002-10-02 Matt Austern <austern@apple.com>
+
+ * class.c (check_field_decls): Changed warning about const member
+ variables so that it doesn't get issued for a class aggregate.
+
+2002-10-01 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (cp_finish_decl): Make sure array types are laid out,
+ even if the array bounds are unknown.
+
+2002-10-01 Steve Ellcey <sje@cup.hp.com>
+
+ * class.c (build_vtbl_initializer): Change build_c_cast
+ to build1.
+
+2002-10-01 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (cp_finish_decl): Make sure array types are laid out,
+ even if the array bounds are unknown.
+
+ * decl.c (cp_finish_decl): Correct check for dynamic
+ initialization of thread-local storage.
+
+2002-09-30 Nathan Sidwell <nathan@codesourcery.com>
+
+ * tree.c (really_overloaded_fn): TEMPLATE_ID_EXPRs are also
+ overloaded.
+
+2002-09-30 Steve Ellcey <sje@cup.hp.com>
+
+ * class.c (build_vtbl_initializer): Add cast.
+ (add_vcall_offset_vtbl_entries_1):
+ Use TARGET_VTABLE_DATA_ENTRY_DISTANCE for offset.
+
+2002-09-30 Mark Mitchell <mark@codesourcery.com>
+
+ * class.c (walk_subobject_offsets): Correct the calculation of
+ offsets for virtual bases. Correct the counting of array
+ elements.
+ (layout_nonempty_base_or_field): Simplify. Correct the
+ calculation of offsets to be propagated through the binfo
+ hierarchy.
+ (build_base_field): Avoid creating a FIELD_DECL for empty bases.
+ Add the FIELD_DECL to TYPE_FIELDS.
+ (build_base_fields): Adjust accordingly.
+ (layout_virtual_bases): Use build_base_field.
+ (end_of_class): Return a tree, not an integer.
+ (warn_about_ambiguous_direct_bases): Rename to ...
+ (warn_about_ambiguous_bases): ... this.
+ (include_empty_classes): New function.
+ (layout_class_type): Create an alternative version of the type to
+ be used when as a base class type. Do not call
+ finish_record_layout until we are done laying out the class.
+ * cp-tree.h (lang_type_class): Remove size, size_unit. Add
+ as_base.
+ (CLASSTYPE_SIZE): Reimplement.
+ (CLASSTYPE_SIZE_UNIT): Likewise.
+ (CLASSTYPE_ALIGN): Likweise.
+ (CLASSTYPE_USER_ALIGN): Likewise.
+ (CLASSTYPE_AS_BASE): New macro.
+ (DECL_INITIALIZED_P): Likewise.
+ (extract_init): Remove prototype.
+ (build_forced_zero_init): Rename to ...
+ (build_zero_init): ... this.
+ (force_store_init_value): Remove.
+ * decl.c (obscure_complex_init): Remove.
+ (duplicate_decls): Copy DECL_INITIALIZED_P.
+ (check_initializer): Do not leave junk in DECL_INITIAL.
+ (cp_finish_decl): Handle zero-initialization of entities with
+ static storage duration.
+ * expr.c (extract_init): Remove.
+ * init.c (build_forced_zero_init): Remove.
+ (build_zero_init): New function.
+ (build_default_init): Use it.
+ (build_field_list): Skip FIELD_DECLs for base subobjects.
+ (push_base_cleanups): Likewise.
+ * method.c (do_build_assign_ref): Likewise.
+ (synthesize_exception_spec): Likewise.
+ * pt.c (tsubst_decl): Clear DECL_INITIALIZED_P.
+ (regenerate_decl_from_template): To not set DECL_INITIAL for a
+ static data member whose initialization took place in its class.
+ (instantiate_decl): Do not pass an initializer to cp_finish_decl
+ in that situation.
+ * search.c (dfs_push_decls): Skip FIELD_DECLs for base subobjects.
+ (dfs_unuse_fields): Likewise.
+ * tree.c (pod_type_p): Handle error_mark_node.
+ (zero_init_p): Likewise.
+ * typeck.c (lookup_anon_field): Skip FIELD_DECLs for base
+ subobjects.
+ * typeck2.c (store_init_value): Remove #if 0'd code.
+ (force_store_init_value): Remove.
+ (process_init_constructor): Use build_zero_init.
+
+2002-09-29 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/7788
+ * rtti.c (unemitted_tinfo_decl_p): Check it has a field.
+
+2002-09-29 Kazu Hirata <kazu@cs.umass.edu>
+
+ * cp-tree.h: Fix comment typos.
+ * decl.c: Likewise.
+ * pt.c: Likewise.
+
+2002-09-25 Mark Mitchell <mark@codesourcery.com>
+
+ * cp/class.c (contains_empty_class_p): New method.
+ (walk_subobject_offsets): Correct computation of field offset.
+ (layout_empty_base): Correct placement of emtpy base classes.
+ (layout_class_type): Warn about ABI changes.
+
+2002-09-23 Mark Mitchell <mark@codesourcery.com>
+
+ * cp/class.c (layout_virtual_bases): Do not round the size of the
+ type to a multiple of the alignment before laying out virtual bases.
+ (layout_class_type): Correct handling of bit-fields that are wider
+ than their type inside unions. Round the size of the type to a
+ even number of bytes when computing the size without virtual
+ bases.
+ * cp/cp-tree.h (abi_version_at_least): New macro.
+
+2002-09-21 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.2: Likewise.
+ * call.c: Likewise.
+ * class.c: Likewise.
+ * cp-tree.h: Likewise.
+ * cvt.c: Likewise.
+ * decl.c: Likewise.
+ * decl2.c: Likewise.
+ * except.c: Likewise.
+ * friend.c: Likewise.
+ * g++spec.c: Likewise.
+ * init.c: Likewise.
+ * lex.c: Likewise.
+ * mangle.c: Likewise.
+ * method.c: Likewise.
+ * operators.def: Likewise.
+ * optimize.c: Likewise.
+ * pt.c: Likewise.
+ * rtti.c: Likewise.
+ * search.c: Likewise.
+ * semantics.c: Likewise.
+ * spew.c: Likewise.
+ * tree.c: Likewise.
+ * typeck.c: Likewise.
+
+2002-09-18 Devang Patel <dpatel@apple.com>
+
+ * cp/cp-tree.h: New prototype for walk_vtabls().
+ * cp/decl.c (walk_vtables_r): New function.
+ (struct cp_binding_level): Add new members, namespaces,
+ names_size and vtables.
+ (add_decl_to_level): Add decl in namespaces or vtables
+ chain, if conditions match.
+ (walk_vtables): New function.
+ (walk_namespaces_r): Travers separate namespace chain
+ for namespace decls.
+ (wrapup_globals_for_namespace): Use names_size instead
+ of list_length().
+ * cp/decl2.c (finish_file): Use walk_vtables() instead of
+ walk_globals() to walk vtable decls.
+
+2002-09-18 Nathan Sidwell <nathan@codesourcery.com>
+
+ * decl.c (grokdeclarator): Use assert, not internal_error. Don't
+ ICE with invalid pointers & references.
+
+2002-09-17 Zack Weinberg <zack@codesourcery.com>
+
+ * Make-lang.in: Remove all references to the demangler.
+ * cxxfilt.c: Moved to binutils.
+
+2002-09-16 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/7718
+ * pt.c (tsubst_decl): Remove assert.
+
+ Remove DR 295 implementation.
+ * pt.c (check_cv_quals_for_unify): Disable function & method cases.
+ * tree.c (cp_build_qualified_type_real): Likewise. Don't warn
+ about ignoring volatile qualifiers.
+
+ * search.c (lookup_member): Correct documentation.
+
+2002-09-16 Geoffrey Keating <geoffk@apple.com>
+
+ * cp-tree.h (union lang_tree_node): Add chain_next option.
+
+2002-09-16 Nathan Sidwell <nathan@codesourcery.com>
+
+ * parse.y (parse_finish_call_expr): Check lookup_member result.
+
+ PR c++/7015
+ * semantic.c (finish_asm_stmt): Fix operand/output_operands
+ thinko.
+ * typeck.c (c_expand_asm_operands): Protect from error_mark_node.
+
+2002-09-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/7919
+ * call.c (build_over_call): Convert this pointer for fns found by
+ using decls.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.1: Likewise.
+
+2002-09-14 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/7768
+ * pt.c (build_template_decl): Copy DECL_DESTRUCTOR_P.
+
+2002-09-14 Kazu Hirata <kazu@cs.umass.edu>
+
+ * error.c: Fix comment formatting.
+ * except.c: Likewise.
+ * expr.c: Likewise.
+ * friend.c: Likewise.
+ * g++spec.c: Likewise.
+ * init.c: Likewise.
+ * lex.c: Likewise.
+ * mangle.c: Likewise.
+ * method.c: Likewise.
+ * optimize.c: Likewise.
+ * pt.c: Likewise.
+ * rtti.c: Likewise.
+ * search.c: Likewise.
+ * semantics.c: Likewise.
+ * spew.c: Likewise.
+ * tree.c: Likewise.
+ * typeck.c: Likewise.
+ * typeck2.c: Likewise.
+
+2002-09-13 Matt Austern <austern@apple.com>
+
+ PR C++/7828
+ * cp/cp-tree.h, cp/tree.c: New function non_cast_lvalue_p.
+ * cp/call.c: Change call-by-const-reference mechanism to use
+ non_cast_lvalue_p when deciding whether the create a temporary.
+ We need a temporary when passing, e.g. (long) x by const ref.
+
+2002-09-13 Nathan Sidwell <nathan@codesourcery.com>
+
+ * pt.c (unify, ARRAY_TYPE): Element type can be more qualified.
+
+2002-09-13 Kazu Hirata <kazu@cs.umass.edu>
+
+ * decl.c: Fix comment formatting.
+ * decl2.c: Likewise.
+
+2002-09-12 Kazu Hirata <kazu@cs.umass.edu>
+
+ * call.c: Fix comment formatting.
+ * class.c: Likewise.
+ * cp-lang.c: Likewise.
+ * cp-tree.h: Likewise.
+ * cvt.c: Likewise.
+
+2002-09-11 Zack Weinberg <zack@codesourcery.com>
+
+ * Make-lang.in: Build cp/cxxfilt.o from $(srcdir)/cp/cxxfilt.c,
+ and c++filt from cxxfilt.o + version.o + $(LIBDEPS).
+ * cxxfilt.c: New file: split from libiberty/cplus-dem.c, with
+ minor adjustments (use version_string, eliminate yet another
+ duplicate of xmalloc)
+
+2002-09-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * cp-tree.h (require_complete_eh_spec_types): Add prototype.
+
+2002-09-05 Jason Merrill <jason@redhat.com>
+
+ * typeck2.c (add_exception_specifier): Only pedwarn for an
+ incomplete type.
+ (require_complete_eh_spec_types): New fn.
+ (cxx_incomplete_type_diagnostic): Also support pedwarning.
+ * typeck.c (complete_type_or_diagnostic): Likewise.
+ * call.c (build_call): Call require_complete_eh_spec_types.
+ * rtti.c (get_pseudo_ti_desc): Give an error rather than aborting
+ on an incomplete type.
+
+2002-09-04 Jakub Jelinek <jakub@redhat.com>
+
+ * decl.c (start_cleanup_fn): Clear interface_only before
+ start_function, restore it afterwards.
+
+2002-09-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ * cp-tree.h (finish_builtin_type): Remove.
+ * decl2.c (finish_builtin_type): Move to common code.
+ * decl.c (build_ptrmemfunc_type): Adjust.
+ * rtti.c (create_pseudo_type_info): Adjust.
+ (create_tinfo_types): Adjust.
+
+2002-08-31 Jason Merrill <jason@redhat.com>
+
+ * cp-lang.c (cp_expr_size): Allow initialization from a
+ CONSTRUCTOR.
+
+2002-08-30 Richard Henderson <rth@redhat.com>
+
+ PR opt/7515
+ * tree.c: Include target.h.
+ (cp_cannot_inline_tree_fn): Don't auto-inline functions that
+ don't bind locally.
+ * Makefile.in (tree.o): Update.
+
+2002-08-27 Mark Mitchell <mark@codesourcery.com>
+
+ * class.c (layout_virtual_bases): Warn about bugs in G++ that
+ result in incorrect object layouts.
+ (layout_class_type): Likewise.
+
+2002-08-24 Matt Austern <austern@apple.com>
+
+ * tree.c (lvalue_p_1): Add argument for whether casts of lvalues
+ are allowable.
+ (real_lvalue_p): Update caller.
+ (lvalue_p): Ditto.
+ (non_cast_lvalue_or_else): New.
+ * tree.h: Declare it.
+ * typeck.c (build_unary_op): Use non_cast_lvalue_or_else.
+
+2002-08-22 Mark Mitchell <mark@codesourcery.com>
+
+ * typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR
+ and COND_EXPR specially; fix error message output.
+
+2002-08-22 Jason Merrill <jason@redhat.com>
+
+ * pt.c (tsubst_expr): RETURN_EXPR is now RETURN_STMT_EXPR.
+ * semantics.c (nullify_returns_r): Likewise.
+
2002-08-17 Gabriel Dos Reis <gdr@integrable-solutions.net>
Fix PR/7621
@@ -75,7 +703,7 @@
* search.c (adjust_result_of_qualified_name_lookup): New function.
* typeck.c (qualify_type_recursive): Use TYPE_PTRMEM_* rather than
accessing OFFSET_TYPEs directly.
-
+
2002-08-08 Mike Stump <mrs@apple.com>
* call.c (add_builtin_candidate): legal -> valid, illegal -> invalid.
@@ -395,8 +1023,8 @@
* call.c (build_over_call): Likewise.
(cp_convert_parm_for_inlining): New fn.
- (convert_for_arg_passing): New fn.
- (convert_default_arg, build_over_call): Use it.
+ (convert_for_arg_passing): New fn.
+ (convert_default_arg, build_over_call): Use it.
(type_passed_as): New fn.
* pt.c (tsubst_decl): Use it.
* decl2.c (cp_build_parm_decl): New fn.
@@ -798,8 +1426,8 @@
2002-06-20 Richard Henderson <rth@redhat.com>
PR c++/6747
- * typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early.
- Call put_var_into_stack.
+ * typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early.
+ Call put_var_into_stack.
2002-06-20 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@@ -1034,7 +1662,7 @@
(processing_these_inlines): Likewise.
(token_obstack): Make static.
(first_token): Likewise.
- (init_spew): Don't initialise deleted things; use gengtype for roots.
+ (init_spew): Don't initialize deleted things; use gengtype for roots.
(clear_inline_text_obstack): Delete.
(feed_input): Use GC for struct feed. Update for changes to
struct unparsed_text.
@@ -2127,7 +2755,7 @@
* 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
+ (check_cv_quals_for_unify): Cope with allowing bad qualifications
on template type parms.
(instantiate_decl): Recheck substitutions to give warnings on bad
qualifications.
@@ -4105,7 +4733,7 @@ Fri Sep 21 08:16:19 2001 J"orn Rennecke <amylaar@redhat.com>
PR c++/3621
* spew.c (yylex): Only copy the token's lineno, if it is
- non-zero.
+ nonzero.
2001-07-26 Nathan Sidwell <nathan@codesourcery.com>
@@ -4196,7 +4824,7 @@ Fri Sep 21 08:16:19 2001 J"orn Rennecke <amylaar@redhat.com>
2001-07-23 Graham Stott <grahams@redhat.com>
- * cp/class.c (type_requires_array_cookie): Fix use of uninitialised
+ * cp/class.c (type_requires_array_cookie): Fix use of uninitialized
variable has_two_argument_delete_p.
2001-07-21 Nathan Sidwell <nathan@codesourcery.com>
@@ -4243,7 +4871,7 @@ Fri Sep 21 08:16:19 2001 J"orn Rennecke <amylaar@redhat.com>
2001-07-20 Nathan Sidwell <nathan@codesourcery.com>
Remove old-abi remnants. Remove comments about old abi
- behaviour. Remove references to 'new-abi' in comments.
+ behavior. Remove references to 'new-abi' in comments.
* cp-tree.h: Adjust comments.
(vbase_offsets_in_vtable_p): Delete.
(vcall_offsets_in_vtable_p): Delete.
@@ -5445,7 +6073,7 @@ Thu Apr 5 16:54:29 2001 J"orn Rennecke <amylaar@redhat.com>
(maybe_commonize_var): Allow inlining functions even if they have
static local variables, use comdat_linkage for them if flag_weak.
(check_initializer): Call obscure_complex_init if
- grok_reference_init returned non-zero.
+ grok_reference_init returned nonzero.
(save_function_data): Clear x_local_names.
(pop_cp_function_context): Free x_local_names.
(mark_inlined_fns): Remove.
@@ -7184,7 +7812,7 @@ Thu Nov 23 02:16:47 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-17 Nathan Sidwell <nathan@codesourcery.com>
- * typeck2.c (incomplete_type_error): Reorganise to avoid
+ * typeck2.c (incomplete_type_error): Reorganize to avoid
excessive diagnostics.
2000-11-16 Zack Weinberg <zack@wolery.stanford.edu>
@@ -12592,7 +13220,7 @@ Sun Feb 27 16:40:33 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
(add_method): Used functions are hidden by local functions.
(check_bases_and_members): Handle using-decls before finalizing
CLASSTYPE_METHOD_VEC.
- * call.c (add_function_candidate): Add ctype parm; if non-zero,
+ * call.c (add_function_candidate): Add ctype parm; if nonzero,
override the type of 'this' accordingly.
(add_template_candidate, add_template_candidate_real): Add ctype parm.
(convert_class_to_reference, build_user_type_conversion_1,
diff --git a/gcc/cp/ChangeLog.1 b/gcc/cp/ChangeLog.1
index b411f18ef05..4b4afd31526 100644
--- a/gcc/cp/ChangeLog.1
+++ b/gcc/cp/ChangeLog.1
@@ -5729,7 +5729,7 @@ Tue May 17 13:34:46 1994 Jason Merrill <jason@deneb.cygnus.com>
Mon May 16 23:04:01 1994 Stephen R. van den Berg <berg@pool.informatik.rwth-aachen.de>
* cp/typeck.c (common_type): Attribute merging.
- (comp_types): Utilise COMP_TYPE_ATTRIBUTES macro.
+ (comp_types): Utilize COMP_TYPE_ATTRIBUTES macro.
* cp/parse.y: Revamp attribute parsing.
@@ -6168,7 +6168,7 @@ Wed May 4 11:19:45 1994 Jason Merrill <jason@deneb.cygnus.com>
Tue May 3 16:02:53 1994 Per Bothner <bothner@kalessin.cygnus.com>
Give a vtable entries a unique named type, for the sake of gdb.
- * class.c (build_vtable_entry): The addres of a thunk now has
+ * class.c (build_vtable_entry): The address of a thunk now has
type vtable_entry_type, not ptr_type_node.
* method.c (make_thunk): Fix type of THUNK_DECL.
* class.c (add_virtual_function, override_one_vtable): Use
diff --git a/gcc/cp/ChangeLog.2 b/gcc/cp/ChangeLog.2
index 179d6d7b136..26dc387a37e 100644
--- a/gcc/cp/ChangeLog.2
+++ b/gcc/cp/ChangeLog.2
@@ -1264,7 +1264,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
1999-10-06 Brendan Kehoe <brendan@cygnus.com>
- * decl.c (grokdeclarator): Only warn about non-zero arrays if
+ * decl.c (grokdeclarator): Only warn about nonzero arrays if
!in_system_header (linux socketbits.h can give this for
__cmsg_data, which is using a GNU extension).
@@ -19205,7 +19205,7 @@ Mon Mar 4 22:38:39 1996 Gerald Baumgartner <gb@alexander.cs.purdue.edu>
* sig.c (build_signature_pointer_or_reference_type): Align
signature pointers/references on 8-byte boundaries so they can be
- grabbed 2 words at a time on a Sparc.
+ grabbed 2 words at a time on a SPARC.
Tue Mar 5 10:21:01 1996 Jason Merrill <jason@yorick.cygnus.com>
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index d174691e54e..42656e7933d 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -40,17 +40,12 @@
# Actual names to use when installing a native compiler.
CXX_INSTALL_NAME = `echo c++|sed '$(program_transform_name)'`
GXX_INSTALL_NAME = `echo g++|sed '$(program_transform_name)'`
-DEMANGLER_INSTALL_NAME = `echo c++filt|sed '$(program_transform_name)'`
CXX_TARGET_INSTALL_NAME = $(target_alias)-`echo c++|sed '$(program_transform_name)'`
GXX_TARGET_INSTALL_NAME = $(target_alias)-`echo g++|sed '$(program_transform_name)'`
# Actual names to use when installing a cross-compiler.
CXX_CROSS_NAME = `echo c++|sed '$(program_transform_cross_name)'`
GXX_CROSS_NAME = `echo g++|sed '$(program_transform_cross_name)'`
-DEMANGLER_CROSS_NAME = `echo c++filt|sed '$(program_transform_cross_name)'`
-
-# The name to use for the demangler program.
-DEMANGLER_PROG = c++filt$(exeext)
#
# Define the names for selecting c++ in LANGUAGES.
@@ -81,18 +76,6 @@ g++-cross$(exeext): g++$(exeext)
-rm -f g++-cross$(exeext)
cp g++$(exeext) g++-cross$(exeext)
-# The demangler.
-cxxmain.o: $(srcdir)/../libiberty/cplus-dem.c $(DEMANGLE_H) $(CONFIG_H)
- rm -f cxxmain.c
- $(LN_S) $(srcdir)/../libiberty/cplus-dem.c cxxmain.c
- $(CC) -c -DMAIN $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
- -DVERSION=\"$(version)\" cxxmain.c
-
-# Apparently OpenVM needs the -o to be at the beginning of the link line.
-$(DEMANGLER_PROG): cxxmain.o underscore.o $(LIBDEPS)
- $(CC) -o $@ $(ALL_CFLAGS) $(LDFLAGS) \
- cxxmain.o underscore.o $(LIBS)
-
# The compiler itself.
# Shared with C front end:
CXX_C_OBJS = attribs.o c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o \
@@ -139,9 +122,9 @@ gt-cp-tree.h : s-gtype; @true
# Build hooks:
c++.all.build: g++$(exeext)
-c++.all.cross: g++-cross$(exeext) $(DEMANGLER_PROG)
+c++.all.cross: g++-cross$(exeext)
c++.start.encap: g++$(exeext)
-c++.rest.encap: $(DEMANGLER_PROG)
+c++.rest.encap:
c++.info:
c++.dvi:
@@ -181,17 +164,6 @@ c++.install-common: installdirs
rm -f $(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \
$(LN) $(bindir)/$(CXX_INSTALL_NAME)$(exeext) $(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \
fi ; \
- if [ x$(DEMANGLER_PROG) != x ] && [ -x "$(DEMANGLER_PROG)" ]; then \
- if [ -f g++-cross$(exeext) ] ; then \
- rm -f $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \
- $(INSTALL_PROGRAM) $(DEMANGLER_PROG) $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \
- chmod a+x $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \
- else \
- rm -f $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \
- $(INSTALL_PROGRAM) $(DEMANGLER_PROG) $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \
- chmod a+x $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \
- fi ; \
- fi ; \
fi
c++.install-info:
@@ -214,8 +186,6 @@ c++.uninstall:
-rm -rf $(bindir)/$(CXX_CROSS_NAME)$(exeext)
-rm -rf $(bindir)/$(GXX_INSTALL_NAME)$(exeext)
-rm -rf $(bindir)/$(GXX_CROSS_NAME)$(exeext)
- -rm -rf $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext)
- -rm -rf $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext)
-rm -rf $(man1dir)/$(GXX_INSTALL_NAME)$(man1ext)
-rm -rf $(man1dir)/$(GXX_CROSS_NAME)$(man1ext)
#
@@ -224,7 +194,7 @@ c++.uninstall:
# We just have to delete files specific to us.
c++.mostlyclean:
- -rm -f cp/*$(objext) $(DEMANGLER_PROG)
+ -rm -f cp/*$(objext)
-rm -f cp/*$(coverageexts)
c++.clean:
c++.distclean:
@@ -276,11 +246,11 @@ cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H)
cp/init.o: cp/init.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
$(GGC_H) except.h
cp/method.o: cp/method.c $(CXX_TREE_H) toplev.h $(GGC_H) $(RTL_H) $(EXPR_H) \
- $(TM_P_H)
+ $(TM_P_H) $(TARGET_H)
cp/cvt.o: cp/cvt.c $(CXX_TREE_H) cp/decl.h flags.h toplev.h convert.h
cp/search.o: cp/search.c $(CXX_TREE_H) stack.h flags.h toplev.h $(RTL_H)
cp/tree.o: cp/tree.c $(CXX_TREE_H) flags.h toplev.h $(GGC_H) $(RTL_H) \
- insn-config.h integrate.h tree-inline.h real.h gt-cp-tree.h
+ insn-config.h integrate.h tree-inline.h real.h gt-cp-tree.h $(TARGET_H)
cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(SYSTEM_H)
cp/rtti.o: cp/rtti.c $(CXX_TREE_H) flags.h toplev.h
cp/except.o: cp/except.c $(CXX_TREE_H) flags.h $(RTL_H) except.h toplev.h \
diff --git a/gcc/cp/NEWS b/gcc/cp/NEWS
index caee3fb48b0..85642b587d9 100644
--- a/gcc/cp/NEWS
+++ b/gcc/cp/NEWS
@@ -1,3 +1,7 @@
+*** Changes in GCC 3.3:
+
+* The "new X = 3" extension has been removed; you must now use "new X(3)".
+
*** Changes in GCC 3.1:
* -fhonor-std and -fno-honor-std have been removed. -fno-honor-std was
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index cbd7faf31a9..1b79ac48250 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -101,6 +101,7 @@ static tree convert_class_to_reference PARAMS ((tree, tree, tree));
static tree direct_reference_binding PARAMS ((tree, tree));
static int promoted_arithmetic_type_p PARAMS ((tree));
static tree conditional_conversion PARAMS ((tree, tree));
+static tree call_builtin_trap PARAMS ((void));
tree
build_vfield_ref (datum, type)
@@ -356,6 +357,7 @@ build_call (function, parms)
tree tmp;
tree decl;
tree result_type;
+ tree fntype;
function = build_addr_func (function);
@@ -365,7 +367,8 @@ build_call (function, parms)
return error_mark_node;
}
- result_type = TREE_TYPE (TREE_TYPE (TREE_TYPE (function)));
+ fntype = TREE_TYPE (TREE_TYPE (function));
+ result_type = TREE_TYPE (fntype);
if (TREE_CODE (function) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL)
@@ -378,11 +381,12 @@ build_call (function, parms)
nothrow = ((decl && TREE_NOTHROW (decl))
|| TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function))));
- if (decl && TREE_THIS_VOLATILE (decl))
+ if (decl && TREE_THIS_VOLATILE (decl) && cfun)
current_function_returns_abnormally = 1;
if (decl && TREE_DEPRECATED (decl))
warn_deprecated_use (decl);
+ require_complete_eh_spec_types (fntype, decl);
if (decl && DECL_CONSTRUCTOR_P (decl))
is_constructor = 1;
@@ -644,8 +648,8 @@ null_ptr_cst_p (t)
}
-/* Returns non-zero if PARMLIST consists of only default parms and/or
- ellipsis. */
+/* Returns nonzero if PARMLIST consists of only default parms and/or
+ ellipsis. */
int
sufficient_parms_p (parmlist)
@@ -935,7 +939,7 @@ standard_conversion (to, from, expr)
return conv;
}
-/* Returns non-zero if T1 is reference-related to T2. */
+/* Returns nonzero if T1 is reference-related to T2. */
static int
reference_related_p (t1, t2)
@@ -955,7 +959,7 @@ reference_related_p (t1, t2)
&& DERIVED_FROM_P (t1, t2)));
}
-/* Returns non-zero if T1 is reference-compatible with T2. */
+/* Returns nonzero if T1 is reference-compatible with T2. */
static int
reference_compatible_p (t1, t2)
@@ -1620,7 +1624,7 @@ is_complete (t)
return COMPLETE_TYPE_P (complete_type (t));
}
-/* Returns non-zero if TYPE is a promoted arithmetic type. */
+/* Returns nonzero if TYPE is a promoted arithmetic type. */
static int
promoted_arithmetic_type_p (type)
@@ -2761,7 +2765,7 @@ build_new_function_call (fn, args)
return build_over_call (cand, args, LOOKUP_NORMAL);
}
- /* This is not really overloaded. */
+ /* This is not really overloaded. */
fn = OVL_CURRENT (fn);
return build_function_call (fn, args);
@@ -3050,7 +3054,7 @@ build_conditional_expr (arg1, arg2, arg3)
type of the other and is an rvalue.
--Both the second and the third operands have type void; the
- result is of type void and is an rvalue. */
+ result is of type void and is an rvalue. */
if ((TREE_CODE (arg2) == THROW_EXPR)
^ (TREE_CODE (arg3) == THROW_EXPR))
result_type = ((TREE_CODE (arg2) == THROW_EXPR)
@@ -3272,7 +3276,7 @@ build_conditional_expr (arg1, arg2, arg3)
qualification conversions (_conv.qual_) are performed to bring
them to a common type, whose cv-qualification shall match the
cv-qualification of either the second or the third operand.
- The result is of the common type. */
+ The result is of the common type. */
else if ((null_ptr_cst_p (arg2)
&& (TYPE_PTR_P (arg3_type) || TYPE_PTRMEM_P (arg3_type)
|| TYPE_PTRMEMFUNC_P (arg3_type)))
@@ -3357,7 +3361,7 @@ build_new_op (code, flags, arg1, arg2, arg3)
case VEC_NEW_EXPR:
case VEC_DELETE_EXPR:
case DELETE_EXPR:
- /* Use build_op_new_call and build_op_delete_call instead. */
+ /* Use build_op_new_call and build_op_delete_call instead. */
abort ();
case CALL_EXPR:
@@ -3455,7 +3459,7 @@ build_new_op (code, flags, arg1, arg2, arg3)
if (TREE_CODE (fn) == TEMPLATE_DECL)
{
- /* A member template. */
+ /* A member template. */
templates = tree_cons (NULL_TREE, fn, templates);
candidates
= add_template_candidate (candidates, fn,
@@ -3749,10 +3753,10 @@ build_op_delete_call (code, addr, size, flags, placement)
tree alloc_fn;
tree call_expr;
- /* Find the allocation function that is being called. */
+ /* Find the allocation function that is being called. */
call_expr = placement;
/* Sometimes we have a COMPOUND_EXPR, rather than a simple
- CALL_EXPR. */
+ CALL_EXPR. */
while (TREE_CODE (call_expr) == COMPOUND_EXPR)
call_expr = TREE_OPERAND (call_expr, 1);
/* Extract the function. */
@@ -3871,9 +3875,9 @@ enforce_access (basetype_path, decl)
/* Perform the conversions in CONVS on the expression EXPR.
FN and ARGNUM are used for diagnostics. ARGNUM is zero based, -1
- indicates the `this' argument of a method. INNER is non-zero when
+ indicates the `this' argument of a method. INNER is nonzero when
being called to continue a conversion chain. It is negative when a
- reference binding will be applied, positive otherwise. */
+ reference binding will be applied, positive otherwise. */
static tree
convert_like_real (convs, expr, fn, argnum, inner)
@@ -4056,7 +4060,7 @@ convert_like_real (convs, expr, fn, argnum, inner)
tree ref_type = totype;
/* If necessary, create a temporary. */
- if (NEED_TEMPORARY_P (convs) || !lvalue_p (expr))
+ if (NEED_TEMPORARY_P (convs) || !non_cast_lvalue_p (expr))
{
tree type = TREE_TYPE (TREE_OPERAND (convs, 0));
expr = build_target_expr_with_type (expr, type);
@@ -4094,6 +4098,22 @@ convert_like_real (convs, expr, fn, argnum, inner)
LOOKUP_NORMAL|LOOKUP_NO_CONVERSION);
}
+/* Build a call to __builtin_trap which can be used in an expression. */
+
+static tree
+call_builtin_trap ()
+{
+ tree fn = get_identifier ("__builtin_trap");
+ if (IDENTIFIER_GLOBAL_VALUE (fn))
+ fn = IDENTIFIER_GLOBAL_VALUE (fn);
+ else
+ abort ();
+
+ fn = build_call (fn, NULL_TREE);
+ fn = build (COMPOUND_EXPR, integer_type_node, fn, integer_zero_node);
+ return fn;
+}
+
/* ARG is being passed to a varargs function. Perform any conversions
required. Array/function to pointer decay must have already happened.
Return the converted value. */
@@ -4115,12 +4135,13 @@ convert_arg_to_ellipsis (arg)
if (arg != error_mark_node && ! pod_type_p (TREE_TYPE (arg)))
{
- /* Undefined behaviour [expr.call] 5.2.2/7. We used to just warn
+ /* Undefined behavior [expr.call] 5.2.2/7. We used to just warn
here and do a bitwise copy, but now cp_expr_size will abort if we
try to do that. */
- error ("cannot pass objects of non-POD type `%#T' through `...'",
- TREE_TYPE (arg));
- arg = error_mark_node;
+ warning ("cannot pass objects of non-POD type `%#T' through `...'; \
+call will abort at runtime",
+ TREE_TYPE (arg));
+ arg = call_builtin_trap ();
}
return arg;
@@ -4143,7 +4164,7 @@ build_x_va_arg (expr, type)
if (! pod_type_p (type))
{
- /* Undefined behaviour [expr.call] 5.2.2/7. */
+ /* Undefined behavior [expr.call] 5.2.2/7. */
warning ("cannot receive objects of non-POD type `%#T' through `...'",
type);
}
@@ -4333,7 +4354,8 @@ build_over_call (cand, args, flags)
tree parmtype = TREE_VALUE (parm);
tree argtype = TREE_TYPE (TREE_VALUE (arg));
tree converted_arg;
-
+ tree base_binfo;
+
if (ICS_BAD_FLAG (TREE_VEC_ELT (convs, i)))
pedwarn ("passing `%T' as `this' argument of `%#D' discards qualifiers",
TREE_TYPE (argtype), fn);
@@ -4351,6 +4373,15 @@ build_over_call (cand, args, flags)
TREE_VALUE (arg),
cand->conversion_path,
1);
+ /* If fn was found by a using declaration, the conversion path
+ will be to the derived class, not the base declaring fn. We
+ must convert from derived to base. */
+ base_binfo = lookup_base (TREE_TYPE (TREE_TYPE (converted_arg)),
+ TREE_TYPE (parmtype), ba_ignore, NULL);
+
+ converted_arg = build_base_path (PLUS_EXPR, converted_arg,
+ base_binfo, 1);
+
converted_args = tree_cons (NULL_TREE, converted_arg, converted_args);
parm = TREE_CHAIN (parm);
arg = TREE_CHAIN (arg);
@@ -4550,11 +4581,11 @@ build_java_interface_fn_ref (fn, instance)
}
/* Look up the pointer to the runtime java.lang.Class object for `instance'.
- This is the first entry in the vtable. */
+ This is the first entry in the vtable. */
klass_ref = build_vtbl_ref (build_indirect_ref (instance, 0),
integer_zero_node);
- /* Get the java.lang.Class pointer for the interface being called. */
+ /* Get the java.lang.Class pointer for the interface being called. */
iface = DECL_CONTEXT (fn);
iface_ref = lookup_field (iface, get_identifier ("class$"), 0, 0);
if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL
@@ -4566,7 +4597,7 @@ build_java_interface_fn_ref (fn, instance)
}
iface_ref = build1 (ADDR_EXPR, build_pointer_type (iface), iface_ref);
- /* Determine the itable index of FN. */
+ /* Determine the itable index of FN. */
i = 1;
for (method = TYPE_METHODS (iface); method; method = TREE_CHAIN (method))
{
@@ -4811,7 +4842,7 @@ build_new_method_call (tree instance, tree fns, tree args,
if (TREE_CODE (t) == TEMPLATE_DECL)
{
- /* A member template. */
+ /* A member template. */
templates = tree_cons (NULL_TREE, t, templates);
candidates =
add_template_candidate (candidates, t,
@@ -4893,7 +4924,7 @@ build_new_method_call (tree instance, tree fns, tree args,
return call;
}
-/* Returns non-zero iff standard conversion sequence ICS1 is a proper
+/* Returns nonzero iff standard conversion sequence ICS1 is a proper
subsequence of ICS2. */
static int
@@ -4933,7 +4964,7 @@ is_subseq (ics1, ics2)
}
}
-/* Returns non-zero iff DERIVED is derived from BASE. The inputs may
+/* Returns nonzero iff DERIVED is derived from BASE. The inputs may
be any _TYPE nodes. */
int
@@ -5031,7 +5062,7 @@ compare_ics (ics1, ics2)
tree deref_to_type2 = NULL_TREE;
int rank1, rank2;
- /* REF_BINDING is non-zero if the result of the conversion sequence
+ /* REF_BINDING is nonzero if the result of the conversion sequence
is a reference type. In that case TARGET_TYPE is the
type referred to by the reference. */
tree target_type1;
@@ -5730,7 +5761,7 @@ tourney (candidates)
return champ;
}
-/* Returns non-zero if things of type FROM can be converted to TO. */
+/* Returns nonzero if things of type FROM can be converted to TO. */
int
can_convert (to, from)
@@ -5739,7 +5770,7 @@ can_convert (to, from)
return can_convert_arg (to, from, NULL_TREE);
}
-/* Returns non-zero if ARG (of type FROM) can be converted to TO. */
+/* Returns nonzero if ARG (of type FROM) can be converted to TO. */
int
can_convert_arg (to, from, arg)
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index db8cfa75920..7afe27317c6 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -115,7 +115,6 @@ static void delete_duplicate_fields PARAMS ((tree));
static void finish_struct_bits PARAMS ((tree));
static int alter_access PARAMS ((tree, tree, tree));
static void handle_using_decl PARAMS ((tree, tree));
-static int strictly_overrides PARAMS ((tree, tree));
static void check_for_override PARAMS ((tree, tree));
static tree dfs_modify_vtables PARAMS ((tree, void *));
static tree modify_all_vtables PARAMS ((tree, int *, tree));
@@ -134,24 +133,22 @@ static tree build_vtbl_initializer PARAMS ((tree, tree, tree, tree, int *));
static int count_fields PARAMS ((tree));
static int add_fields_to_vec PARAMS ((tree, tree, int));
static void check_bitfield_decl PARAMS ((tree));
-static void check_field_decl PARAMS ((tree, tree, int *, int *, int *, int *));
-static void check_field_decls PARAMS ((tree, tree *, int *, int *, int *,
- int *));
-static bool build_base_field PARAMS ((record_layout_info, tree, int *,
- splay_tree, tree));
-static bool build_base_fields PARAMS ((record_layout_info, int *,
- splay_tree, tree));
+static void check_field_decl (tree, tree, int *, int *, int *, int *);
+static void check_field_decls (tree, tree *, int *, int *, int *);
+static tree *build_base_field (record_layout_info, tree, splay_tree, tree *);
+static void build_base_fields (record_layout_info, splay_tree, tree *);
static void check_methods PARAMS ((tree));
static void remove_zero_width_bit_fields PARAMS ((tree));
static void check_bases PARAMS ((tree, int *, int *, int *));
-static void check_bases_and_members PARAMS ((tree, int *));
-static tree create_vtable_ptr PARAMS ((tree, int *, tree *));
-static void layout_class_type PARAMS ((tree, int *, int *, tree *));
+static void check_bases_and_members (tree);
+static tree create_vtable_ptr (tree, tree *);
+static void include_empty_classes (record_layout_info);
+static void layout_class_type (tree, int *, tree *);
static void fixup_pending_inline PARAMS ((tree));
static void fixup_inline_methods PARAMS ((tree));
static void set_primary_base PARAMS ((tree, tree, int *));
static void propagate_binfo_offsets PARAMS ((tree, tree, tree));
-static void layout_virtual_bases PARAMS ((tree, splay_tree));
+static void layout_virtual_bases (record_layout_info, splay_tree);
static tree dfs_set_offset_for_unshared_vbases PARAMS ((tree, void *));
static void build_vbase_offset_vtbl_entries PARAMS ((tree, vtbl_init_data *));
static void add_vcall_offset_vtbl_entries_r PARAMS ((tree, vtbl_init_data *));
@@ -171,9 +168,8 @@ static tree build_vtable PARAMS ((tree, tree, tree));
static void initialize_vtable PARAMS ((tree, tree));
static void initialize_array PARAMS ((tree, tree));
static void layout_nonempty_base_or_field PARAMS ((record_layout_info,
- tree, tree,
- splay_tree, tree));
-static unsigned HOST_WIDE_INT end_of_class PARAMS ((tree, int));
+ tree, tree, splay_tree));
+static tree end_of_class PARAMS ((tree, int));
static bool layout_empty_base PARAMS ((tree, tree, splay_tree, tree));
static void accumulate_vtbl_inits PARAMS ((tree, tree, tree, tree, tree));
static tree dfs_accumulate_vtbl_inits PARAMS ((tree, tree, tree, tree,
@@ -208,8 +204,11 @@ static void record_subobject_offsets PARAMS ((tree, tree, splay_tree, int));
static int layout_conflict_p PARAMS ((tree, tree, splay_tree, int));
static int splay_tree_compare_integer_csts PARAMS ((splay_tree_key k1,
splay_tree_key k2));
-static void warn_about_ambiguous_direct_bases PARAMS ((tree));
+static void warn_about_ambiguous_bases PARAMS ((tree));
static bool type_requires_array_cookie PARAMS ((tree));
+static bool contains_empty_class_p (tree);
+static tree dfs_base_derived_from (tree, void *);
+static bool base_derived_from (tree, tree);
/* Macros for dfs walking during vtt construction. See
dfs_ctor_vtable_bases_queue_p, dfs_build_secondary_vptr_vtt_inits
@@ -532,7 +531,7 @@ build_vtable (class_type, name, vtable_type)
/* Get the VAR_DECL of the vtable for TYPE. TYPE need not be polymorphic,
or even complete. If this does not exist, create it. If COMPLETE is
- non-zero, then complete the definition of it -- that will render it
+ nonzero, then complete the definition of it -- that will render it
impossible to actually build the vtable, but is useful to get at those
which are known to exist in the runtime. */
@@ -593,7 +592,7 @@ copy_virtuals (binfo)
/* Build the primary virtual function table for TYPE. If BINFO is
non-NULL, build the vtable starting with the initial approximation
that it is the same as the one which is the head of the association
- list. Returns a non-zero value if a new vtable is actually
+ list. Returns a nonzero value if a new vtable is actually
created. */
static int
@@ -645,7 +644,7 @@ build_primary_vtable (binfo, type)
FOR_TYPE is the most derived type which caused this table to
be needed.
- Returns non-zero if we haven't met BINFO before.
+ Returns nonzero if we haven't met BINFO before.
The order in which vtables are built (by calling this function) for
an object must remain the same, otherwise a binary incompatibility
@@ -676,7 +675,7 @@ build_secondary_vtable (binfo, for_type)
}
/* Create a new vtable for BINFO which is the hierarchy dominated by
- T. Return non-zero if we actually created a new vtable. */
+ T. Return nonzero if we actually created a new vtable. */
static int
make_new_vtable (t, binfo)
@@ -828,7 +827,7 @@ add_method (type, method, error_p)
&& DECL_TEMPLATE_CONV_FN_P (m));
/* If we need to move things up, see if there's
- space. */
+ space. */
if (!have_template_convs_p)
{
slot = len - 1;
@@ -952,6 +951,13 @@ add_method (type, method, error_p)
&& (TYPE_QUALS (TREE_TYPE (TREE_VALUE (parms1)))
!= TYPE_QUALS (TREE_TYPE (TREE_VALUE (parms2)))))
same = 0;
+
+ /* For templates, the template parms must be identical. */
+ if (TREE_CODE (fn) == TEMPLATE_DECL
+ && !comp_template_parms (DECL_TEMPLATE_PARMS (fn),
+ DECL_TEMPLATE_PARMS (method)))
+ same = 0;
+
if (! DECL_STATIC_FUNCTION_P (fn))
parms1 = TREE_CHAIN (parms1);
if (! DECL_STATIC_FUNCTION_P (method))
@@ -1157,9 +1163,12 @@ handle_using_decl (using_decl, t)
tree flist = NULL_TREE;
tree old_value;
- binfo = binfo_or_else (ctype, t);
+ binfo = lookup_base (t, ctype, ba_any, NULL);
if (! binfo)
- return;
+ {
+ error_not_base_type (t, ctype);
+ return;
+ }
if (constructor_name_p (name, ctype))
{
@@ -1181,7 +1190,7 @@ handle_using_decl (using_decl, t)
}
if (BASELINK_P (fdecl))
- /* Ignore base type this came from. */
+ /* Ignore base type this came from. */
fdecl = BASELINK_FUNCTIONS (fdecl);
old_value = IDENTIFIER_CLASS_VALUE (name);
@@ -1314,7 +1323,7 @@ check_bases (t, cant_have_default_ctor_p, cant_have_const_ctor_p,
}
if (TREE_VIA_VIRTUAL (base_binfo))
- /* A virtual base does not effect nearly emptiness. */
+ /* A virtual base does not effect nearly emptiness. */
;
else if (CLASSTYPE_NEARLY_EMPTY_P (basetype))
{
@@ -1323,7 +1332,7 @@ check_bases (t, cant_have_default_ctor_p, cant_have_const_ctor_p,
derived class is not nearly empty either. */
CLASSTYPE_NEARLY_EMPTY_P (t) = 0;
else
- /* Remember we've seen one. */
+ /* Remember we've seen one. */
seen_non_virtual_nearly_empty_base_p = 1;
}
else if (!is_empty_class (basetype))
@@ -1470,7 +1479,7 @@ mark_primary_virtual_base (base_binfo, type)
/* If BINFO is an unmarked virtual binfo for a class with a primary virtual
base, then BINFO has no primary base in this graph. Called from
- mark_primary_bases. DATA is the most derived type. */
+ mark_primary_bases. DATA is the most derived type. */
static tree dfs_unshared_virtual_bases (binfo, data)
tree binfo;
@@ -1503,11 +1512,11 @@ static tree dfs_unshared_virtual_bases (binfo, data)
if (binfo != TYPE_BINFO (t))
/* The vtable fields will have been copied when duplicating the
base binfos. That information is bogus, make sure we don't try
- and use it. */
+ and use it. */
BINFO_VTABLE (binfo) = NULL_TREE;
/* If this is a virtual primary base, make sure its offset matches
- that which it is primary for. */
+ that which it is primary for. */
if (BINFO_PRIMARY_P (binfo) && TREE_VIA_VIRTUAL (binfo) &&
binfo_for_vbase (BINFO_TYPE (binfo), t) == binfo)
{
@@ -1536,7 +1545,7 @@ mark_primary_bases (type)
tree base_binfo;
if (!CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (binfo)))
- /* Not a dynamic base. */
+ /* Not a dynamic base. */
continue;
base_binfo = get_primary_binfo (binfo);
@@ -2158,7 +2167,7 @@ layout_vtable_decl (binfo, n)
layout_decl (vtable, 0);
/* At one time the vtable info was grabbed 2 words at a time. This
- fails on Sparc unless you have 8-byte alignment. */
+ fails on SPARC unless you have 8-byte alignment. */
DECL_ALIGN (vtable) = MAX (TYPE_ALIGN (double_type_node),
DECL_ALIGN (vtable));
}
@@ -2196,6 +2205,29 @@ same_signature_p (fndecl, base_fndecl)
return 0;
}
+/* Called from base_derived_from via dfs_walk. */
+
+static tree
+dfs_base_derived_from (tree binfo, void *data)
+{
+ tree base = (tree) data;
+
+ if (same_type_p (TREE_TYPE (base), TREE_TYPE (binfo))
+ && tree_int_cst_equal (BINFO_OFFSET (base), BINFO_OFFSET (binfo)))
+ return error_mark_node;
+
+ return NULL_TREE;
+}
+
+/* Returns TRUE if DERIVED is a binfo containing the binfo BASE as a
+ subobject. */
+
+static bool
+base_derived_from (tree derived, tree base)
+{
+ return dfs_walk (derived, dfs_base_derived_from, NULL, base) != NULL_TREE;
+}
+
typedef struct find_final_overrider_data_s {
/* The function for which we are trying to find a final overrider. */
tree fn;
@@ -2203,14 +2235,8 @@ typedef struct find_final_overrider_data_s {
tree declaring_base;
/* The most derived class in the hierarchy. */
tree most_derived_type;
- /* The final overriding function. */
- tree overriding_fn;
- /* The functions that we thought might be final overriders, but
- aren't. */
+ /* The candidate overriders. */
tree candidates;
- /* The BINFO for the class in which the final overriding function
- appears. */
- tree overriding_base;
} find_final_overrider_data;
/* Called from find_final_overrider via dfs_walk. */
@@ -2235,118 +2261,41 @@ dfs_find_final_overrider (binfo, data)
/* We've found a path to the declaring base. Walk down the path
looking for an overrider for FN. */
for (path = reverse_path (binfo);
- path;
+ path;
path = TREE_CHAIN (path))
{
method = look_for_overrides_here (BINFO_TYPE (TREE_VALUE (path)),
ffod->fn);
if (method)
- break;
+ {
+ path = TREE_VALUE (path);
+ break;
+ }
}
/* If we found an overrider, record the overriding function, and
the base from which it came. */
if (path)
{
- tree base;
-
- /* Assume the path is non-virtual. See if there are any
- virtual bases from (but not including) the overrider up
- to and including the base where the function is
- defined. */
- for (base = TREE_CHAIN (path); base; base = TREE_CHAIN (base))
- if (TREE_VIA_VIRTUAL (TREE_VALUE (base)))
- {
- base = ffod->declaring_base;
- break;
- }
+ tree *candidate;
- /* If we didn't already have an overrider, or any
- candidates, then this function is the best candidate so
- far. */
- if (!ffod->overriding_fn && !ffod->candidates)
- {
- ffod->overriding_fn = method;
- ffod->overriding_base = TREE_VALUE (path);
- }
- else if (ffod->overriding_fn)
+ /* Remove any candidates overridden by this new function. */
+ candidate = &ffod->candidates;
+ while (*candidate)
{
- /* We had a best overrider; let's see how this compares. */
-
- if (ffod->overriding_fn == method
- && (tree_int_cst_equal
- (BINFO_OFFSET (TREE_VALUE (path)),
- BINFO_OFFSET (ffod->overriding_base))))
- /* We found the same overrider we already have, and in the
- same place; it's still the best. */;
- else if (strictly_overrides (ffod->overriding_fn, method))
- /* The old function overrides this function; it's still the
- best. */;
- else if (strictly_overrides (method, ffod->overriding_fn))
- {
- /* The new function overrides the old; it's now the
- best. */
- ffod->overriding_fn = method;
- ffod->overriding_base = TREE_VALUE (path);
- }
+ /* If *CANDIDATE overrides METHOD, then METHOD
+ cannot override anything else on the list. */
+ if (base_derived_from (TREE_VALUE (*candidate), path))
+ return NULL_TREE;
+ /* If METHOD overrides *CANDIDATE, remove *CANDIDATE. */
+ if (base_derived_from (path, TREE_VALUE (*candidate)))
+ *candidate = TREE_CHAIN (*candidate);
else
- {
- /* Ambiguous. */
- ffod->candidates
- = build_tree_list (NULL_TREE,
- ffod->overriding_fn);
- if (method != ffod->overriding_fn)
- ffod->candidates
- = tree_cons (NULL_TREE, method, ffod->candidates);
- ffod->overriding_fn = NULL_TREE;
- ffod->overriding_base = NULL_TREE;
- }
+ candidate = &TREE_CHAIN (*candidate);
}
- else
- {
- /* We had a list of ambiguous overrides; let's see how this
- new one compares. */
-
- tree candidates;
- bool incomparable = false;
-
- /* If there were previous candidates, and this function
- overrides all of them, then it is the new best
- candidate. */
- for (candidates = ffod->candidates;
- candidates;
- candidates = TREE_CHAIN (candidates))
- {
- /* If the candidate overrides the METHOD, then we
- needn't worry about it any further. */
- if (strictly_overrides (TREE_VALUE (candidates),
- method))
- {
- method = NULL_TREE;
- break;
- }
-
- /* If the METHOD doesn't override the candidate,
- then it is incomporable. */
- if (!strictly_overrides (method,
- TREE_VALUE (candidates)))
- incomparable = true;
- }
- /* If METHOD overrode all the candidates, then it is the
- new best candidate. */
- if (!candidates && !incomparable)
- {
- ffod->overriding_fn = method;
- ffod->overriding_base = TREE_VALUE (path);
- ffod->candidates = NULL_TREE;
- }
- /* If METHOD didn't override all the candidates, then it
- is another candidate. */
- else if (method && incomparable)
- ffod->candidates
- = tree_cons (NULL_TREE, method, ffod->candidates);
- }
+ /* Add the new function. */
+ ffod->candidates = tree_cons (method, path, ffod->candidates);
}
}
@@ -2387,8 +2336,6 @@ find_final_overrider (t, binfo, fn)
ffod.fn = fn;
ffod.declaring_base = binfo;
ffod.most_derived_type = t;
- ffod.overriding_fn = NULL_TREE;
- ffod.overriding_base = NULL_TREE;
ffod.candidates = NULL_TREE;
dfs_walk (TYPE_BINFO (t),
@@ -2397,13 +2344,13 @@ find_final_overrider (t, binfo, fn)
&ffod);
/* If there was no winner, issue an error message. */
- if (!ffod.overriding_fn)
+ if (!ffod.candidates || TREE_CHAIN (ffod.candidates))
{
error ("no unique final overrider for `%D' in `%T'", fn, t);
return error_mark_node;
}
- return build_tree_list (ffod.overriding_fn, ffod.overriding_base);
+ return ffod.candidates;
}
/* Returns the function from the BINFO_VIRTUALS entry in T which matches
@@ -2642,24 +2589,6 @@ modify_all_vtables (t, vfuns_p, virtuals)
return virtuals;
}
-/* Here, we already know that they match in every respect.
- All we have to check is where they had their declarations.
-
- Return non-zero iff FNDECL1 is declared in a class which has a
- proper base class containing FNDECL2. We don't care about
- ambiguity or accessibility. */
-
-static int
-strictly_overrides (fndecl1, fndecl2)
- tree fndecl1, fndecl2;
-{
- base_kind kind;
-
- return (lookup_base (DECL_CONTEXT (fndecl1), DECL_CONTEXT (fndecl2),
- ba_ignore | ba_quiet, &kind)
- && kind != bk_same_type);
-}
-
/* Get the base virtual function declarations in T that have the
indicated NAME. */
@@ -2756,11 +2685,11 @@ warn_hidden (t)
base_fndecls);
}
- /* If there are no functions to hide, continue. */
+ /* If there are no functions to hide, continue. */
if (!base_fndecls)
continue;
- /* Remove any overridden functions. */
+ /* Remove any overridden functions. */
for (fns = TREE_VEC_ELT (method_vec, i); fns; fns = OVL_NEXT (fns))
{
fndecl = OVL_CURRENT (fns);
@@ -3200,15 +3129,10 @@ check_field_decl (field, t, cant_have_const_ctor,
fields can be added by adding to this chain. */
static void
-check_field_decls (t, access_decls, empty_p,
- cant_have_default_ctor_p, cant_have_const_ctor_p,
- no_const_asn_ref_p)
- tree t;
- tree *access_decls;
- int *empty_p;
- int *cant_have_default_ctor_p;
- int *cant_have_const_ctor_p;
- int *no_const_asn_ref_p;
+check_field_decls (tree t, tree *access_decls,
+ int *cant_have_default_ctor_p,
+ int *cant_have_const_ctor_p,
+ int *no_const_asn_ref_p)
{
tree *field;
tree *next;
@@ -3244,7 +3168,7 @@ check_field_decls (t, access_decls, empty_p,
else
{
/* The class is non-empty. */
- *empty_p = 0;
+ CLASSTYPE_EMPTY_P (t) = 0;
/* The class is not even nearly empty. */
CLASSTYPE_NEARLY_EMPTY_P (t) = 0;
}
@@ -3337,7 +3261,8 @@ check_field_decls (t, access_decls, empty_p,
*cant_have_default_ctor_p = 1;
TYPE_HAS_COMPLEX_ASSIGN_REF (t) = 1;
- if (! TYPE_HAS_CONSTRUCTOR (t) && extra_warnings)
+ if (! TYPE_HAS_CONSTRUCTOR (t) && CLASSTYPE_NON_AGGREGATE (t)
+ && extra_warnings)
cp_warning_at ("non-static reference `%#D' in class without a constructor", x);
}
@@ -3371,7 +3296,8 @@ check_field_decls (t, access_decls, empty_p,
*cant_have_default_ctor_p = 1;
TYPE_HAS_COMPLEX_ASSIGN_REF (t) = 1;
- if (! TYPE_HAS_CONSTRUCTOR (t) && extra_warnings)
+ if (! TYPE_HAS_CONSTRUCTOR (t) && CLASSTYPE_NON_AGGREGATE (t)
+ && extra_warnings)
cp_warning_at ("non-static const member `%#D' in class without a constructor", x);
}
/* A field that is pseudo-const makes the structure likewise. */
@@ -3454,7 +3380,7 @@ record_subobject_offset (type, offset, offsets)
return 0;
}
-/* Returns non-zero if TYPE is an empty class type and there is
+/* Returns nonzero if TYPE is an empty class type and there is
already an entry in OFFSETS for the same TYPE as the same OFFSET. */
static int
@@ -3483,13 +3409,13 @@ check_subobject_offset (type, offset, offsets)
/* Walk through all the subobjects of TYPE (located at OFFSET). Call
F for every subobject, passing it the type, offset, and table of
- OFFSETS. If VBASES_P is non-zero, then even virtual non-primary
+ OFFSETS. If VBASES_P is nonzero, then even virtual non-primary
bases should be traversed; otherwise, they are ignored.
If MAX_OFFSET is non-NULL, then subobjects with an offset greater
than MAX_OFFSET will not be walked.
- If F returns a non-zero value, the traversal ceases, and that value
+ If F returns a nonzero value, the traversal ceases, and that value
is returned. Otherwise, returns zero. */
static int
@@ -3511,6 +3437,7 @@ walk_subobject_offsets (type, f, offset, offsets, max_offset, vbases_p)
if (CLASS_TYPE_P (type))
{
tree field;
+ tree binfo;
int i;
/* Record the location of TYPE. */
@@ -3521,7 +3448,11 @@ walk_subobject_offsets (type, f, offset, offsets, max_offset, vbases_p)
/* Iterate through the direct base classes of TYPE. */
for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); ++i)
{
- tree binfo = BINFO_BASETYPE (TYPE_BINFO (type), i);
+ binfo = BINFO_BASETYPE (TYPE_BINFO (type), i);
+
+ if (abi_version_at_least (2)
+ && TREE_VIA_VIRTUAL (binfo))
+ continue;
if (!vbases_p
&& TREE_VIA_VIRTUAL (binfo)
@@ -3535,20 +3466,54 @@ walk_subobject_offsets (type, f, offset, offsets, max_offset, vbases_p)
BINFO_OFFSET (binfo)),
offsets,
max_offset,
- vbases_p);
+ (abi_version_at_least (2)
+ ? /*vbases_p=*/0 : vbases_p));
if (r)
return r;
}
+ /* Iterate through the virtual base classes of TYPE. In G++
+ 3.2, we included virtual bases in the direct base class loop
+ above, which results in incorrect results; the correct
+ offsets for virtual bases are only known when working with
+ the most derived type. */
+ if (abi_version_at_least (2) && vbases_p)
+ {
+ tree vbase;
+
+ for (vbase = CLASSTYPE_VBASECLASSES (type);
+ vbase;
+ vbase = TREE_CHAIN (vbase))
+ {
+ binfo = TREE_VALUE (vbase);
+ r = walk_subobject_offsets (BINFO_TYPE (binfo),
+ f,
+ size_binop (PLUS_EXPR,
+ offset,
+ BINFO_OFFSET (binfo)),
+ offsets,
+ max_offset,
+ /*vbases_p=*/0);
+ }
+ }
+
/* Iterate through the fields of TYPE. */
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
- if (TREE_CODE (field) == FIELD_DECL)
+ if (TREE_CODE (field) == FIELD_DECL && !DECL_ARTIFICIAL (field))
{
+ tree field_offset;
+
+ if (abi_version_at_least (2))
+ field_offset = byte_position (field);
+ else
+ /* In G++ 3.2, DECL_FIELD_OFFSET was used. */
+ field_offset = DECL_FIELD_OFFSET (field);
+
r = walk_subobject_offsets (TREE_TYPE (field),
f,
size_binop (PLUS_EXPR,
offset,
- DECL_FIELD_OFFSET (field)),
+ field_offset),
offsets,
max_offset,
/*vbases_p=*/1);
@@ -3562,8 +3527,11 @@ walk_subobject_offsets (type, f, offset, offsets, max_offset, vbases_p)
tree index;
/* Step through each of the elements in the array. */
- for (index = size_zero_node;
- INT_CST_LT (index, TYPE_MAX_VALUE (domain));
+ for (index = size_zero_node;
+ /* G++ 3.2 had an off-by-one error here. */
+ (abi_version_at_least (2)
+ ? !INT_CST_LT (TYPE_MAX_VALUE (domain), index)
+ : INT_CST_LT (index, TYPE_MAX_VALUE (domain)));
index = size_binop (PLUS_EXPR, index, size_one_node))
{
r = walk_subobject_offsets (TREE_TYPE (type),
@@ -3588,7 +3556,7 @@ walk_subobject_offsets (type, f, offset, offsets, max_offset, vbases_p)
}
/* Record all of the empty subobjects of TYPE (located at OFFSET) in
- OFFSETS. If VBASES_P is non-zero, virtual bases of TYPE are
+ OFFSETS. If VBASES_P is nonzero, virtual bases of TYPE are
examined. */
static void
@@ -3602,8 +3570,8 @@ record_subobject_offsets (type, offset, offsets, vbases_p)
offsets, /*max_offset=*/NULL_TREE, vbases_p);
}
-/* Returns non-zero if any of the empty subobjects of TYPE (located at
- OFFSET) conflict with entries in OFFSETS. If VBASES_P is non-zero,
+/* Returns nonzero if any of the empty subobjects of TYPE (located at
+ OFFSET) conflict with entries in OFFSETS. If VBASES_P is nonzero,
virtual bases of TYPE are examined. */
static int
@@ -3631,22 +3599,34 @@ layout_conflict_p (type, offset, offsets, vbases_p)
/* DECL is a FIELD_DECL corresponding either to a base subobject of a
non-static data member of the type indicated by RLI. BINFO is the
binfo corresponding to the base subobject, OFFSETS maps offsets to
- types already located at those offsets. T is the most derived
- type. This function determines the position of the DECL. */
+ types already located at those offsets. This function determines
+ the position of the DECL. */
static void
-layout_nonempty_base_or_field (rli, decl, binfo, offsets, t)
- record_layout_info rli;
- tree decl;
- tree binfo;
- splay_tree offsets;
- tree t;
+layout_nonempty_base_or_field (record_layout_info rli,
+ tree decl,
+ tree binfo,
+ splay_tree offsets)
{
+ tree t = rli->t;
tree offset = NULL_TREE;
- tree type = TREE_TYPE (decl);
- /* If we are laying out a base class, rather than a field, then
- DECL_ARTIFICIAL will be set on the FIELD_DECL. */
- int field_p = !DECL_ARTIFICIAL (decl);
+ bool field_p;
+ tree type;
+
+ if (binfo)
+ {
+ /* For the purposes of determining layout conflicts, we want to
+ use the class type of BINFO; TREE_TYPE (DECL) will be the
+ CLASSTYPE_AS_BASE version, which does not contain entries for
+ zero-sized bases. */
+ type = TREE_TYPE (binfo);
+ field_p = false;
+ }
+ else
+ {
+ type = TREE_TYPE (decl);
+ field_p = true;
+ }
/* Try to place the field. It may take more than one try if we have
a hard time placing the field without putting two objects of the
@@ -3671,13 +3651,10 @@ layout_nonempty_base_or_field (rli, decl, binfo, offsets, t)
offset zero -- its S component would be at the same address
as the S we already allocated. So, we have to skip ahead.
Since all data members, including those whose type is an
- empty class, have non-zero size, any overlap can happen only
+ empty class, have nonzero size, any overlap can happen only
with a direct or indirect base-class -- it can't happen with
a data member. */
- if (layout_conflict_p (TREE_TYPE (decl),
- offset,
- offsets,
- field_p))
+ if (layout_conflict_p (type, offset, offsets, field_p))
{
/* Strip off the size allocated to this field. That puts us
at the first place we could have put the field with
@@ -3700,15 +3677,22 @@ layout_nonempty_base_or_field (rli, decl, binfo, offsets, t)
/* Now that we know where it will be placed, update its
BINFO_OFFSET. */
if (binfo && CLASS_TYPE_P (BINFO_TYPE (binfo)))
+ /* Indirect virtual bases may have a non-zero BINFO_OFFSET at
+ this point because their BINFO_OFFSET is copied from another
+ hierarchy. Therefore, we may not need to add the entire
+ OFFSET. */
propagate_binfo_offsets (binfo,
- convert (ssizetype, offset), t);
+ size_diffop (convert (ssizetype, offset),
+ convert (ssizetype,
+ BINFO_OFFSET (binfo))),
+ t);
}
/* Layout the empty base BINFO. EOC indicates the byte currently just
past the end of the class, and should be correctly aligned for a
class of the type indicated by BINFO; OFFSETS gives the offsets of
the empty bases allocated so far. T is the most derived
- type. Return non-zero iff we added it at the end. */
+ type. Return nonzero iff we added it at the end. */
static bool
layout_empty_base (binfo, eoc, offsets, t)
@@ -3720,10 +3704,17 @@ layout_empty_base (binfo, eoc, offsets, t)
tree alignment;
tree basetype = BINFO_TYPE (binfo);
bool atend = false;
-
+
/* This routine should only be used for empty classes. */
my_friendly_assert (is_empty_class (basetype), 20000321);
alignment = ssize_int (CLASSTYPE_ALIGN_UNIT (basetype));
+
+ if (abi_version_at_least (2))
+ BINFO_OFFSET (binfo) = size_zero_node;
+ if (warn_abi && !integer_zerop (BINFO_OFFSET (binfo)))
+ warning ("offset of empty base `%T' may not be ABI-compliant and may"
+ "change in a future version of GCC",
+ BINFO_TYPE (binfo));
/* This is an empty base class. We first try to put it at offset
zero. */
@@ -3752,60 +3743,77 @@ layout_empty_base (binfo, eoc, offsets, t)
return atend;
}
-/* Build a FIELD_DECL for the base given by BINFO in the class
- indicated by RLI. If the new object is non-empty, clear *EMPTY_P.
- *BASE_ALIGN is a running maximum of the alignments of any base
- class. OFFSETS gives the location of empty base subobjects. T is
- the most derived type. Return non-zero if the new object cannot be
- nearly-empty. */
+/* Layout the the base given by BINFO in the class indicated by RLI.
+ *BASE_ALIGN is a running maximum of the alignments of
+ any base class. OFFSETS gives the location of empty base
+ subobjects. T is the most derived type. Return nonzero if the new
+ object cannot be nearly-empty. A new FIELD_DECL is inserted at
+ *NEXT_FIELD, unless BINFO is for an empty base class.
-static bool
-build_base_field (rli, binfo, empty_p, offsets, t)
- record_layout_info rli;
- tree binfo;
- int *empty_p;
- splay_tree offsets;
- tree t;
+ Returns the location at which the next field should be inserted. */
+
+static tree *
+build_base_field (record_layout_info rli, tree binfo,
+ splay_tree offsets, tree *next_field)
{
+ tree t = rli->t;
tree basetype = BINFO_TYPE (binfo);
- tree decl;
- bool atend = false;
if (!COMPLETE_TYPE_P (basetype))
/* This error is now reported in xref_tag, thus giving better
location information. */
- return atend;
-
- decl = build_decl (FIELD_DECL, NULL_TREE, basetype);
- DECL_ARTIFICIAL (decl) = 1;
- DECL_FIELD_CONTEXT (decl) = rli->t;
- DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
- DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype);
- DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
- DECL_USER_ALIGN (decl) = CLASSTYPE_USER_ALIGN (basetype);
- /* Tell the backend not to round up to TYPE_ALIGN. */
- DECL_PACKED (decl) = 1;
+ return next_field;
- if (!integer_zerop (DECL_SIZE (decl)))
+ /* Place the base class. */
+ if (!is_empty_class (basetype))
{
+ tree decl;
+
/* The containing class is non-empty because it has a non-empty
base class. */
- *empty_p = 0;
-
+ CLASSTYPE_EMPTY_P (t) = 0;
+
+ /* Create the FIELD_DECL. */
+ decl = build_decl (FIELD_DECL, NULL_TREE, CLASSTYPE_AS_BASE (basetype));
+ DECL_ARTIFICIAL (decl) = 1;
+ DECL_FIELD_CONTEXT (decl) = t;
+ DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
+ DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype);
+ DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
+ DECL_USER_ALIGN (decl) = CLASSTYPE_USER_ALIGN (basetype);
+ /* Tell the backend not to round up to TYPE_ALIGN. */
+ DECL_PACKED (decl) = 1;
+
/* Try to place the field. It may take more than one try if we
have a hard time placing the field without putting two
objects of the same type at the same address. */
- layout_nonempty_base_or_field (rli, decl, binfo, offsets, t);
+ layout_nonempty_base_or_field (rli, decl, binfo, offsets);
+ /* Add the new FIELD_DECL to the list of fields for T. */
+ TREE_CHAIN (decl) = *next_field;
+ *next_field = decl;
+ next_field = &TREE_CHAIN (decl);
}
else
{
- unsigned HOST_WIDE_INT eoc;
+ tree eoc;
/* On some platforms (ARM), even empty classes will not be
byte-aligned. */
- eoc = tree_low_cst (rli_size_unit_so_far (rli), 0);
- eoc = CEIL (eoc, DECL_ALIGN_UNIT (decl)) * DECL_ALIGN_UNIT (decl);
- atend |= layout_empty_base (binfo, size_int (eoc), offsets, t);
+ eoc = round_up (rli_size_unit_so_far (rli),
+ CLASSTYPE_ALIGN_UNIT (basetype));
+ if (layout_empty_base (binfo, eoc, offsets, t))
+ CLASSTYPE_NEARLY_EMPTY_P (t) = 0;
+
+ /* We do not create a FIELD_DECL for empty base classes because
+ it might overlap some other field. We want to be able to
+ create CONSTRUCTORs for the class by iterating over the
+ FIELD_DECLs, and the back end does not handle overlapping
+ FIELD_DECLs. */
+
+ /* An empty virtual base causes a class to be non-empty
+ -- but in that case we do not need to clear CLASSTYPE_EMPTY_P
+ here because that was already done when the virtual table
+ pointer was created. */
}
/* Record the offsets of BINFO and its base subobjects. */
@@ -3813,42 +3821,41 @@ build_base_field (rli, binfo, empty_p, offsets, t)
BINFO_OFFSET (binfo),
offsets,
/*vbases_p=*/0);
- return atend;
+
+ return next_field;
}
/* Layout all of the non-virtual base classes. Record empty
- subobjects in OFFSETS. T is the most derived type. Return
- non-zero if the type cannot be nearly empty. */
+ subobjects in OFFSETS. T is the most derived type. Return nonzero
+ if the type cannot be nearly empty. The fields created
+ corresponding to the base classes will be inserted at
+ *NEXT_FIELD. */
-static bool
-build_base_fields (rli, empty_p, offsets, t)
- record_layout_info rli;
- int *empty_p;
- splay_tree offsets;
- tree t;
+static void
+build_base_fields (record_layout_info rli,
+ splay_tree offsets, tree *next_field)
{
/* Chain to hold all the new FIELD_DECLs which stand in for base class
subobjects. */
- tree rec = rli->t;
- int n_baseclasses = CLASSTYPE_N_BASECLASSES (rec);
+ tree t = rli->t;
+ int n_baseclasses = CLASSTYPE_N_BASECLASSES (t);
int i;
- bool atend = 0;
/* The primary base class is always allocated first. */
- if (CLASSTYPE_HAS_PRIMARY_BASE_P (rec))
- build_base_field (rli, CLASSTYPE_PRIMARY_BINFO (rec),
- empty_p, offsets, t);
+ if (CLASSTYPE_HAS_PRIMARY_BASE_P (t))
+ next_field = build_base_field (rli, CLASSTYPE_PRIMARY_BINFO (t),
+ offsets, next_field);
/* Now allocate the rest of the bases. */
for (i = 0; i < n_baseclasses; ++i)
{
tree base_binfo;
- base_binfo = BINFO_BASETYPE (TYPE_BINFO (rec), i);
+ base_binfo = BINFO_BASETYPE (TYPE_BINFO (t), i);
/* The primary base was already allocated above, so we don't
need to allocate it again here. */
- if (base_binfo == CLASSTYPE_PRIMARY_BINFO (rec))
+ if (base_binfo == CLASSTYPE_PRIMARY_BINFO (t))
continue;
/* A primary virtual base class is allocated just like any other
@@ -3858,9 +3865,9 @@ build_base_fields (rli, empty_p, offsets, t)
&& !BINFO_PRIMARY_P (base_binfo))
continue;
- atend |= build_base_field (rli, base_binfo, empty_p, offsets, t);
+ next_field = build_base_field (rli, base_binfo,
+ offsets, next_field);
}
- return atend;
}
/* Go through the TYPE_METHODS of T issuing any appropriate
@@ -4018,7 +4025,7 @@ build_clone (fn, name)
}
/* Produce declarations for all appropriate clones of FN. If
- UPDATE_METHOD_VEC_P is non-zero, the clones are added to the
+ UPDATE_METHOD_VEC_P is nonzero, the clones are added to the
CLASTYPE_METHOD_VEC as well. */
void
@@ -4080,7 +4087,7 @@ clone_function_decl (fn, update_method_vec_p)
declared. An out-of-class definition can specify additional default
arguments. As it is the clones that are involved in overload
resolution, we must propagate the information from the DECL to its
- clones. */
+ clones. */
void
adjust_clone_args (decl)
@@ -4097,7 +4104,7 @@ adjust_clone_args (decl)
clone_parms = orig_clone_parms;
- /* Skip the 'this' parameter. */
+ /* Skip the 'this' parameter. */
orig_clone_parms = TREE_CHAIN (orig_clone_parms);
orig_decl_parms = TREE_CHAIN (orig_decl_parms);
@@ -4120,7 +4127,7 @@ adjust_clone_args (decl)
if (TREE_PURPOSE (decl_parms) && !TREE_PURPOSE (clone_parms))
{
/* A default parameter has been added. Adjust the
- clone's parameters. */
+ clone's parameters. */
tree exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (clone));
tree basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (clone));
tree type;
@@ -4249,9 +4256,7 @@ type_requires_array_cookie (type)
level: i.e., independently of the ABI in use. */
static void
-check_bases_and_members (t, empty_p)
- tree t;
- int *empty_p;
+check_bases_and_members (tree t)
{
/* Nonzero if we are not allowed to generate a default constructor
for this case. */
@@ -4270,16 +4275,12 @@ check_bases_and_members (t, empty_p)
cant_have_const_ctor = 0;
no_const_asn_ref = 0;
- /* Assume that the class is nearly empty; we'll clear this flag if
- it turns out not to be nearly empty. */
- CLASSTYPE_NEARLY_EMPTY_P (t) = 1;
-
- /* Check all the base-classes. */
+ /* Check all the base-classes. */
check_bases (t, &cant_have_default_ctor, &cant_have_const_ctor,
&no_const_asn_ref);
/* Check all the data member declarations. */
- check_field_decls (t, &access_decls, empty_p,
+ check_field_decls (t, &access_decls,
&cant_have_default_ctor,
&cant_have_const_ctor,
&no_const_asn_ref);
@@ -4342,9 +4343,8 @@ check_bases_and_members (t, empty_p)
on VIRTUALS_P. */
static tree
-create_vtable_ptr (t, empty_p, virtuals_p)
+create_vtable_ptr (t, virtuals_p)
tree t;
- int *empty_p;
tree *virtuals_p;
{
tree fn;
@@ -4402,7 +4402,7 @@ create_vtable_ptr (t, empty_p, virtuals_p)
TYPE_VFIELD (t) = field;
/* This class is non-empty. */
- *empty_p = 0;
+ CLASSTYPE_EMPTY_P (t) = 0;
if (CLASSTYPE_N_BASECLASSES (t))
/* If there were any baseclasses, they can't possibly be at
@@ -4551,32 +4551,41 @@ dfs_set_offset_for_unshared_vbases (binfo, data)
return NULL_TREE;
}
-/* Set BINFO_OFFSET for all of the virtual bases for T. Update
+/* Set BINFO_OFFSET for all of the virtual bases for RLI->T. Update
TYPE_ALIGN and TYPE_SIZE for T. OFFSETS gives the location of
empty subobjects of T. */
static void
-layout_virtual_bases (t, offsets)
- tree t;
- splay_tree offsets;
+layout_virtual_bases (record_layout_info rli, splay_tree offsets)
{
- tree vbases, dsize;
- unsigned HOST_WIDE_INT eoc;
+ tree vbases;
+ tree t = rli->t;
+ bool first_vbase = true;
+ tree *next_field;
if (CLASSTYPE_N_BASECLASSES (t) == 0)
return;
+ if (!abi_version_at_least(2))
+ {
+ /* In G++ 3.2, we incorrectly rounded the size before laying out
+ the virtual bases. */
+ finish_record_layout (rli, /*free_p=*/false);
#ifdef STRUCTURE_SIZE_BOUNDARY
- /* Packed structures don't need to have minimum size. */
- if (! TYPE_PACKED (t))
- TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), STRUCTURE_SIZE_BOUNDARY);
+ /* Packed structures don't need to have minimum size. */
+ if (! TYPE_PACKED (t))
+ TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), STRUCTURE_SIZE_BOUNDARY);
#endif
+ rli->offset = TYPE_SIZE_UNIT (t);
+ rli->bitpos = bitsize_zero_node;
+ rli->record_align = TYPE_ALIGN (t);
+ }
- /* DSIZE is the size of the class without the virtual bases. */
- dsize = TYPE_SIZE (t);
-
- /* Make every class have alignment of at least one. */
- TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), BITS_PER_UNIT);
+ /* Find the last field. The artificial fields created for virtual
+ bases will go after the last extant field to date. */
+ next_field = &TYPE_FIELDS (t);
+ while (*next_field)
+ next_field = &TREE_CHAIN (*next_field);
/* Go through the virtual bases, allocating space for each virtual
base that is not already a primary base class. These are
@@ -4589,56 +4598,37 @@ layout_virtual_bases (t, offsets)
if (!TREE_VIA_VIRTUAL (vbases))
continue;
+
vbase = binfo_for_vbase (BINFO_TYPE (vbases), t);
if (!BINFO_PRIMARY_P (vbase))
{
+ tree basetype = TREE_TYPE (vbase);
+
/* This virtual base is not a primary base of any class in the
hierarchy, so we have to add space for it. */
- tree basetype, usize;
- unsigned int desired_align;
-
- basetype = BINFO_TYPE (vbase);
-
- desired_align = CLASSTYPE_ALIGN (basetype);
- TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), desired_align);
-
- /* Add padding so that we can put the virtual base class at an
- appropriately aligned offset. */
- 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,
- convert (sizetype, usize),
- offsets, t);
- else
- {
- tree offset;
-
- offset = convert (ssizetype, usize);
- offset = size_diffop (offset,
- convert (ssizetype,
- BINFO_OFFSET (vbase)));
-
- /* And compute the offset of the virtual base. */
- propagate_binfo_offsets (vbase, offset, t);
- /* Every virtual baseclass takes a least a UNIT, so that
- we can take it's address and get something different
- for each base. */
- 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. */
- record_subobject_offsets (BINFO_TYPE (vbase),
- BINFO_OFFSET (vbase),
- offsets,
- /*vbases_p=*/0);
+ next_field = build_base_field (rli, vbase,
+ offsets, next_field);
+
+ /* If the first virtual base might have been placed at a
+ lower address, had we started from CLASSTYPE_SIZE, rather
+ than TYPE_SIZE, issue a warning. There can be both false
+ positives and false negatives from this warning in rare
+ cases; to deal with all the possibilities would probably
+ require performing both layout algorithms and comparing
+ the results which is not particularly tractable. */
+ if (warn_abi
+ && first_vbase
+ && (tree_int_cst_lt
+ (size_binop (CEIL_DIV_EXPR,
+ round_up (CLASSTYPE_SIZE (t),
+ CLASSTYPE_ALIGN (basetype)),
+ bitsize_unit_node),
+ BINFO_OFFSET (vbase))))
+ warning ("offset of virtual base `%T' is not ABI-compliant and may change in a future version of GCC",
+ basetype);
+
+ first_vbase = false;
}
}
@@ -4648,45 +4638,18 @@ layout_virtual_bases (t, offsets)
in lookup_base depend on the BINFO_OFFSETs being set
correctly. */
dfs_walk (TYPE_BINFO (t), dfs_set_offset_for_unshared_vbases, NULL, t);
-
- /* If we had empty base classes that protruded beyond the end of the
- 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);
- 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 = 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));
-
- /* Check for ambiguous virtual bases. */
- if (extra_warnings)
- for (vbases = CLASSTYPE_VBASECLASSES (t);
- vbases;
- vbases = TREE_CHAIN (vbases))
- {
- tree basetype = BINFO_TYPE (TREE_VALUE (vbases));
-
- if (!lookup_base (t, basetype, ba_ignore | ba_quiet, NULL))
- warning ("virtual base `%T' inaccessible in `%T' due to ambiguity",
- basetype, t);
- }
}
/* Returns the offset of the byte just past the end of the base class
with the highest offset in T. If INCLUDE_VIRTUALS_P is zero, then
only non-virtual bases are included. */
-static unsigned HOST_WIDE_INT
+static tree
end_of_class (t, include_virtuals_p)
tree t;
int include_virtuals_p;
{
- unsigned HOST_WIDE_INT result = 0;
+ tree result = size_zero_node;
int i;
for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); ++i)
@@ -4694,7 +4657,6 @@ end_of_class (t, include_virtuals_p)
tree base_binfo;
tree offset;
tree size;
- unsigned HOST_WIDE_INT end_of_base;
base_binfo = BINFO_BASETYPE (TYPE_BINFO (t), i);
@@ -4713,15 +4675,14 @@ end_of_class (t, include_virtuals_p)
offset = size_binop (PLUS_EXPR,
BINFO_OFFSET (base_binfo),
size);
- end_of_base = tree_low_cst (offset, /*pos=*/1);
- if (end_of_base > result)
- result = end_of_base;
+ if (INT_CST_LT_UNSIGNED (result, offset))
+ result = offset;
}
return result;
}
-/* Warn about direct bases of T that are inaccessible because they are
+/* Warn about bases of T that are inaccessible because they are
ambiguous. For example:
struct S {};
@@ -4732,19 +4693,35 @@ end_of_class (t, include_virtuals_p)
subobjects of U. */
static void
-warn_about_ambiguous_direct_bases (t)
+warn_about_ambiguous_bases (t)
tree t;
{
int i;
+ tree vbases;
+ tree basetype;
+ /* Check direct bases. */
for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); ++i)
{
- tree basetype = TYPE_BINFO_BASETYPE (t, i);
+ basetype = TYPE_BINFO_BASETYPE (t, i);
if (!lookup_base (t, basetype, ba_ignore | ba_quiet, NULL))
warning ("direct base `%T' inaccessible in `%T' due to ambiguity",
- basetype, t);
+ basetype, t);
}
+
+ /* Check for ambiguous virtual bases. */
+ if (extra_warnings)
+ for (vbases = CLASSTYPE_VBASECLASSES (t);
+ vbases;
+ vbases = TREE_CHAIN (vbases))
+ {
+ basetype = BINFO_TYPE (TREE_VALUE (vbases));
+
+ if (!lookup_base (t, basetype, ba_ignore | ba_quiet, NULL))
+ warning ("virtual base `%T' inaccessible in `%T' due to ambiguity",
+ basetype, t);
+ }
}
/* Compare two INTEGER_CSTs K1 and K2. */
@@ -4757,25 +4734,49 @@ splay_tree_compare_integer_csts (k1, k2)
return tree_int_cst_compare ((tree) k1, (tree) k2);
}
+/* Increase the size indicated in RLI to account for empty classes
+ that are "off the end" of the class. */
+
+static void
+include_empty_classes (record_layout_info rli)
+{
+ tree eoc;
+
+ /* It might be the case that we grew the class to allocate a
+ zero-sized base class. That won't be reflected in RLI, yet,
+ because we are willing to overlay multiple bases at the same
+ offset. However, now we need to make sure that RLI is big enough
+ to reflect the entire class. */
+ eoc = end_of_class (rli->t,
+ CLASSTYPE_AS_BASE (rli->t) != NULL_TREE);
+ if (TREE_CODE (rli_size_unit_so_far (rli)) == INTEGER_CST
+ && INT_CST_LT_UNSIGNED (rli_size_unit_so_far (rli), eoc))
+ {
+ rli->offset = size_binop (MAX_EXPR, rli->offset, eoc);
+ rli->bitpos = bitsize_zero_node;
+ }
+}
+
/* Calculate the TYPE_SIZE, TYPE_ALIGN, etc for T. Calculate
BINFO_OFFSETs for all of the base-classes. Position the vtable
- pointer. Accumulate declared virtual functions on VIRTUALS_P. */
+ pointer. Accumulate declared virtual functions on VIRTUALS_P. */
static void
-layout_class_type (t, empty_p, vfuns_p, virtuals_p)
- tree t;
- int *empty_p;
- int *vfuns_p;
- tree *virtuals_p;
+layout_class_type (tree t, int *vfuns_p, tree *virtuals_p)
{
tree non_static_data_members;
tree field;
tree vptr;
record_layout_info rli;
- unsigned HOST_WIDE_INT eoc;
/* Maps offsets (represented as INTEGER_CSTs) to a TREE_LIST of
types that appear at that offset. */
splay_tree empty_base_offsets;
+ /* True if the last field layed out was a bit-field. */
+ bool last_field_was_bitfield = false;
+ /* The location at which the next field should be inserted. */
+ tree *next_field;
+ /* T, as a base class. */
+ tree base_t;
/* Keep track of the first non-static data member. */
non_static_data_members = TYPE_FIELDS (t);
@@ -4788,20 +4789,23 @@ layout_class_type (t, empty_p, vfuns_p, virtuals_p)
determine_primary_base (t, vfuns_p);
/* Create a pointer to our virtual function table. */
- vptr = create_vtable_ptr (t, empty_p, virtuals_p);
+ vptr = create_vtable_ptr (t, virtuals_p);
/* The vptr is always the first thing in the class. */
if (vptr)
{
- TYPE_FIELDS (t) = chainon (vptr, TYPE_FIELDS (t));
+ TREE_CHAIN (vptr) = TYPE_FIELDS (t);
+ TYPE_FIELDS (t) = vptr;
+ next_field = &TREE_CHAIN (vptr);
place_field (rli, vptr);
}
+ else
+ next_field = &TYPE_FIELDS (t);
/* Build FIELD_DECLs for all of the non-virtual base-types. */
empty_base_offsets = splay_tree_new (splay_tree_compare_integer_csts,
NULL, NULL);
- if (build_base_fields (rli, empty_p, empty_base_offsets, t))
- CLASSTYPE_NEARLY_EMPTY_P (t) = 0;
+ build_base_fields (rli, empty_base_offsets, next_field);
/* Layout the non-static data members. */
for (field = non_static_data_members; field; field = TREE_CHAIN (field))
@@ -4853,8 +4857,21 @@ layout_class_type (t, empty_p, vfuns_p, virtuals_p)
field. We have to back up by one to find the largest
type that fits. */
integer_type = integer_types[itk - 1];
- padding = size_binop (MINUS_EXPR, DECL_SIZE (field),
- TYPE_SIZE (integer_type));
+
+ if (abi_version_at_least (2) && TREE_CODE (t) == UNION_TYPE)
+ /* In a union, the padding field must have the full width
+ of the bit-field; all fields start at offset zero. */
+ padding = DECL_SIZE (field);
+ else
+ {
+ if (warn_abi && TREE_CODE (t) == UNION_TYPE)
+ warning ("size assigned to `%T' may not be "
+ "ABI-compliant and may change in a future "
+ "version of GCC",
+ t);
+ padding = size_binop (MINUS_EXPR, DECL_SIZE (field),
+ TYPE_SIZE (integer_type));
+ }
DECL_SIZE (field) = TYPE_SIZE (integer_type);
DECL_ALIGN (field) = TYPE_ALIGN (integer_type);
DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (integer_type);
@@ -4863,7 +4880,30 @@ layout_class_type (t, empty_p, vfuns_p, virtuals_p)
padding = NULL_TREE;
layout_nonempty_base_or_field (rli, field, NULL_TREE,
- empty_base_offsets, t);
+ empty_base_offsets);
+
+ /* If a bit-field does not immediately follow another bit-field,
+ and yet it starts in the middle of a byte, we have failed to
+ comply with the ABI. */
+ if (warn_abi
+ && DECL_C_BIT_FIELD (field)
+ && !last_field_was_bitfield
+ && !integer_zerop (size_binop (TRUNC_MOD_EXPR,
+ DECL_FIELD_BIT_OFFSET (field),
+ bitsize_unit_node)))
+ cp_warning_at ("offset of `%D' is not ABI-compliant and may change in a future version of GCC",
+ field);
+
+ /* G++ used to use DECL_FIELD_OFFSET as if it were the byte
+ offset of the field. */
+ if (warn_abi
+ && !tree_int_cst_equal (DECL_FIELD_OFFSET (field),
+ byte_position (field))
+ && contains_empty_class_p (TREE_TYPE (field)))
+ cp_warning_at ("`%D' contains empty classes which may cause base "
+ "classes to be placed at different locations in a "
+ "future version of GCC",
+ field);
/* If we needed additional padding after this field, add it
now. */
@@ -4880,68 +4920,73 @@ layout_class_type (t, empty_p, vfuns_p, virtuals_p)
DECL_USER_ALIGN (padding_field) = 0;
layout_nonempty_base_or_field (rli, padding_field,
NULL_TREE,
- empty_base_offsets, t);
+ empty_base_offsets);
}
- }
- /* It might be the case that we grew the class to allocate a
- zero-sized base class. That won't be reflected in RLI, yet,
- because we are willing to overlay multiple bases at the same
- offset. However, now we need to make sure that RLI is big enough
- to reflect the entire class. */
- eoc = end_of_class (t, /*include_virtuals_p=*/0);
- if (TREE_CODE (rli_size_unit_so_far (rli)) == INTEGER_CST
- && compare_tree_int (rli_size_unit_so_far (rli), eoc) < 0)
- {
- rli->offset = size_binop (MAX_EXPR, rli->offset, size_int (eoc));
- rli->bitpos = bitsize_zero_node;
+ last_field_was_bitfield = DECL_C_BIT_FIELD (field);
}
- /* We make all structures have at least one element, so that they
- have non-zero size. The class may be empty even if it has
- basetypes. Therefore, we add the fake field after all the other
- fields; if there are already FIELD_DECLs on the list, their
- offsets will not be disturbed. */
- if (!eoc && *empty_p)
- {
- tree padding;
-
- padding = build_decl (FIELD_DECL, NULL_TREE, char_type_node);
- place_field (rli, padding);
- }
+ if (abi_version_at_least (2) && !integer_zerop (rli->bitpos))
+ /* Make sure that we are on a byte boundary so that the size of
+ the class without virtual bases will always be a round number
+ of bytes. */
+ rli->bitpos = round_up (rli->bitpos, BITS_PER_UNIT);
- /* Let the back-end lay out the type. Note that at this point we
- have only included non-virtual base-classes; we will lay out the
- virtual base classes later. So, the TYPE_SIZE/TYPE_ALIGN after
- this call are not necessarily correct; they are just the size and
- alignment when no virtual base clases are used. */
- finish_record_layout (rli);
+ /* Make sure that empty classes are reflected in RLI at this
+ point. */
+ include_empty_classes(rli);
/* Delete all zero-width bit-fields from the list of fields. Now
that the type is laid out they are no longer important. */
remove_zero_width_bit_fields (t);
- /* Remember the size and alignment of the class before adding
- the virtual bases. */
- if (*empty_p)
+ /* Create the version of T used for virtual bases. We do not use
+ make_aggr_type for this version; this is an artificial type. For
+ a POD type, we just reuse T. */
+ if (CLASSTYPE_NON_POD_P (t) || CLASSTYPE_EMPTY_P (t))
{
- CLASSTYPE_SIZE (t) = bitsize_zero_node;
- CLASSTYPE_SIZE_UNIT (t) = size_zero_node;
- }
- /* If this is a POD, we can't reuse its tail padding. */
- else if (!CLASSTYPE_NON_POD_P (t))
- {
- CLASSTYPE_SIZE (t) = TYPE_SIZE (t);
- CLASSTYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (t);
+ base_t = make_node (TREE_CODE (t));
+
+ /* Set the size and alignment for the new type. In G++ 3.2, all
+ empty classes were considered to have size zero when used as
+ base classes. */
+ if (!abi_version_at_least (2) && CLASSTYPE_EMPTY_P (t))
+ {
+ TYPE_SIZE (base_t) = bitsize_zero_node;
+ TYPE_SIZE_UNIT (base_t) = size_zero_node;
+ if (warn_abi && !integer_zerop (rli_size_unit_so_far (rli)))
+ warning ("layout of classes derived from empty class `%T' "
+ "may change in a future version of GCC",
+ t);
+ }
+ else
+ {
+ TYPE_SIZE (base_t) = rli_size_so_far (rli);
+ TYPE_SIZE_UNIT (base_t) = rli_size_unit_so_far (rli);
+ }
+ TYPE_ALIGN (base_t) = rli->record_align;
+ TYPE_USER_ALIGN (base_t) = TYPE_USER_ALIGN (t);
+
+ /* Copy the fields from T. */
+ next_field = &TYPE_FIELDS (base_t);
+ for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
+ if (TREE_CODE (field) == FIELD_DECL)
+ {
+ *next_field = build_decl (FIELD_DECL,
+ DECL_NAME (field),
+ TREE_TYPE (field));
+ DECL_CONTEXT (*next_field) = base_t;
+ DECL_FIELD_OFFSET (*next_field) = DECL_FIELD_OFFSET (field);
+ DECL_FIELD_BIT_OFFSET (*next_field)
+ = DECL_FIELD_BIT_OFFSET (field);
+ next_field = &TREE_CHAIN (*next_field);
+ }
+
+ /* Record the base version of the type. */
+ CLASSTYPE_AS_BASE (t) = base_t;
}
else
- {
- CLASSTYPE_SIZE (t) = TYPE_BINFO_SIZE (t);
- CLASSTYPE_SIZE_UNIT (t) = TYPE_BINFO_SIZE_UNIT (t);
- }
-
- CLASSTYPE_ALIGN (t) = TYPE_ALIGN (t);
- CLASSTYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (t);
+ CLASSTYPE_AS_BASE (t) = t;
/* Set the TYPE_DECL for this type to contain the right
value for DECL_OFFSET, so that we can use it as part
@@ -4952,11 +4997,22 @@ layout_class_type (t, empty_p, vfuns_p, virtuals_p)
around. We must get these done before we try to lay out the
virtual function table. As a side-effect, this will remove the
base subobject fields. */
- layout_virtual_bases (t, empty_base_offsets);
+ layout_virtual_bases (rli, empty_base_offsets);
+
+ /* Make sure that empty classes are reflected in RLI at this
+ point. */
+ include_empty_classes(rli);
+
+ /* Make sure not to create any structures with zero size. */
+ if (integer_zerop (rli_size_unit_so_far (rli)) && CLASSTYPE_EMPTY_P (t))
+ place_field (rli,
+ build_decl (FIELD_DECL, NULL_TREE, char_type_node));
- /* Warn about direct bases that can't be talked about due to
- ambiguity. */
- warn_about_ambiguous_direct_bases (t);
+ /* Let the back-end lay out the type. */
+ finish_record_layout (rli, /*free_p=*/true);
+
+ /* Warn about bases that can't be talked about due to ambiguity. */
+ warn_about_ambiguous_bases (t);
/* Clean up. */
splay_tree_delete (empty_base_offsets);
@@ -4995,11 +5051,10 @@ finish_struct_1 (t)
{
tree x;
int vfuns;
- /* A TREE_LIST. The TREE_VALUE of each node is a FUNCTION_DECL. */
+ /* A TREE_LIST. The TREE_VALUE of each node is a FUNCTION_DECL. */
tree virtuals = NULL_TREE;
int n_fields = 0;
tree vfield;
- int empty = 1;
if (COMPLETE_TYPE_P (t))
{
@@ -5021,12 +5076,17 @@ finish_struct_1 (t)
fixup_inline_methods (t);
+ /* Assume that the class is both empty and nearly empty; we'll clear
+ these flag if necessary. */
+ CLASSTYPE_EMPTY_P (t) = 1;
+ CLASSTYPE_NEARLY_EMPTY_P (t) = 1;
+
/* Do end-of-class semantic processing: checking the validity of the
bases and members and add implicitly generated methods. */
- check_bases_and_members (t, &empty);
+ check_bases_and_members (t);
/* Layout the class itself. */
- layout_class_type (t, &empty, &vfuns, &virtuals);
+ layout_class_type (t, &vfuns, &virtuals);
/* Make sure that we get our own copy of the vfield FIELD_DECL. */
vfield = TYPE_VFIELD (t);
@@ -5037,7 +5097,7 @@ finish_struct_1 (t)
my_friendly_assert (same_type_p (DECL_FIELD_CONTEXT (vfield),
BINFO_TYPE (primary)),
20010726);
- /* The vtable better be at the start. */
+ /* The vtable better be at the start. */
my_friendly_assert (integer_zerop (DECL_FIELD_OFFSET (vfield)),
20010726);
my_friendly_assert (integer_zerop (BINFO_OFFSET (primary)),
@@ -5336,7 +5396,7 @@ fixed_type_or_null (instance, nonnull, cdtorp)
if (nonnull)
*nonnull = 1;
- /* if we're in a ctor or dtor, we know our type. */
+ /* if we're in a ctor or dtor, we know our type. */
if (DECL_LANG_SPECIFIC (current_function_decl)
&& (DECL_CONSTRUCTOR_P (current_function_decl)
|| DECL_DESTRUCTOR_P (current_function_decl)))
@@ -5364,7 +5424,7 @@ fixed_type_or_null (instance, nonnull, cdtorp)
}
}
-/* Return non-zero if the dynamic type of INSTANCE is known, and
+/* Return nonzero if the dynamic type of INSTANCE is known, and
equivalent to the static type. We also handle the case where
INSTANCE is really a pointer. Return negative if this is a
ctor/dtor. There the dynamic type is known, but this might not be
@@ -5678,7 +5738,7 @@ push_lang_context (name)
/* DECL_IGNORED_P is initially set for these types, to avoid clutter.
(See record_builtin_java_type in decl.c.) However, that causes
incorrect debug entries if these types are actually used.
- So we re-enable debug output after extern "Java". */
+ So we re-enable debug output after extern "Java". */
DECL_IGNORED_P (TYPE_NAME (java_byte_type_node)) = 0;
DECL_IGNORED_P (TYPE_NAME (java_short_type_node)) = 0;
DECL_IGNORED_P (TYPE_NAME (java_int_type_node)) = 0;
@@ -5710,7 +5770,7 @@ pop_lang_context ()
/* Given an OVERLOAD and a TARGET_TYPE, return the function that
matches the TARGET_TYPE. If there is no satisfactory match, return
error_mark_node, and issue an error message if COMPLAIN is
- non-zero. Permit pointers to member function if PTRMEM is non-zero.
+ nonzero. Permit pointers to member function if PTRMEM is nonzero.
If TEMPLATE_ONLY, the name of the overloaded function
was a template-id, and EXPLICIT_TARGS are the explicitly provided
template arguments. */
@@ -6102,7 +6162,7 @@ instantiate_type (lhstype, rhs, flags)
/*explicit_targs=*/NULL_TREE);
case TREE_LIST:
- /* Now we should have a baselink. */
+ /* Now we should have a baselink. */
my_friendly_assert (BASELINK_P (rhs), 990412);
return instantiate_type (lhstype, BASELINK_FUNCTIONS (rhs), flags);
@@ -6310,7 +6370,38 @@ is_empty_class (type)
if (! IS_AGGR_TYPE (type))
return 0;
- return integer_zerop (CLASSTYPE_SIZE (type));
+ /* In G++ 3.2, whether or not a class was empty was determined by
+ looking at its size. */
+ if (abi_version_at_least (2))
+ return CLASSTYPE_EMPTY_P (type);
+ else
+ return integer_zerop (CLASSTYPE_SIZE (type));
+}
+
+/* Returns true if TYPE contains an empty class. */
+
+static bool
+contains_empty_class_p (tree type)
+{
+ if (is_empty_class (type))
+ return true;
+ if (CLASS_TYPE_P (type))
+ {
+ tree field;
+ int i;
+
+ for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); ++i)
+ if (contains_empty_class_p (TYPE_BINFO_BASETYPE (type, i)))
+ return true;
+ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
+ if (TREE_CODE (field) == FIELD_DECL
+ && !DECL_ARTIFICIAL (field)
+ && is_empty_class (TREE_TYPE (field)))
+ return true;
+ }
+ else if (TREE_CODE (type) == ARRAY_TYPE)
+ return contains_empty_class_p (TREE_TYPE (type));
+ return false;
}
/* Find the enclosing class of the given NODE. NODE can be a *_DECL or
@@ -6444,7 +6535,7 @@ get_vtbl_decl_for_binfo (binfo)
/* Called from get_primary_binfo via dfs_walk. DATA is a TREE_LIST
who's TREE_PURPOSE is the TYPE of the required primary base and
- who's TREE_VALUE is a list of candidate binfos that we fill in. */
+ who's TREE_VALUE is a list of candidate binfos that we fill in. */
static tree
dfs_get_primary_binfo (binfo, data)
@@ -6551,7 +6642,7 @@ get_primary_binfo (binfo)
return result;
}
-/* If INDENTED_P is zero, indent to INDENT. Return non-zero. */
+/* If INDENTED_P is zero, indent to INDENT. Return nonzero. */
static int
maybe_indent_hierarchy (stream, indent, indented_p)
@@ -6841,6 +6932,7 @@ initialize_array (decl, inits)
context = DECL_CONTEXT (decl);
DECL_CONTEXT (decl) = NULL_TREE;
DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE, inits);
+ TREE_HAS_CONSTRUCTOR (DECL_INITIAL (decl)) = 1;
cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0);
DECL_CONTEXT (decl) = context;
}
@@ -6918,7 +7010,7 @@ get_original_base (base_binfo, binfo)
/* When building a secondary VTT, BINFO_VTABLE is set to a TREE_LIST with
PURPOSE the RTTI_BINFO, VALUE the real vtable pointer for this binfo,
and CHAIN the vtable pointer for this binfo after construction is
- complete. VALUE can also be another BINFO, in which case we recurse. */
+ complete. VALUE can also be another BINFO, in which case we recurse. */
static tree
binfo_ctor_vtable (binfo)
@@ -7109,7 +7201,7 @@ dfs_build_secondary_vptr_vtt_inits (binfo, data)
{
/* It's a primary virtual base, and this is not the construction
vtable. Find the base this is primary of in the inheritance graph,
- and use that base's vtable now. */
+ and use that base's vtable now. */
while (BINFO_PRIMARY_BASE_OF (binfo))
binfo = BINFO_PRIMARY_BASE_OF (binfo);
}
@@ -7248,7 +7340,7 @@ accumulate_vtbl_inits (binfo, orig_binfo, rtti_binfo, t, inits)
BINFO_TYPE (orig_binfo)),
20000517);
- /* If it doesn't have a vptr, we don't do anything. */
+ /* If it doesn't have a vptr, we don't do anything. */
if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
return;
@@ -7465,7 +7557,10 @@ build_vtbl_initializer (binfo, orig_binfo, t, rtti_binfo, non_fn_entries_p)
int i;
for (i = 1; i < TARGET_VTABLE_DATA_ENTRY_DISTANCE; ++i)
- add = tree_cons (NULL_TREE, null_pointer_node, add);
+ add = tree_cons (NULL_TREE,
+ build1 (NOP_EXPR, vtable_entry_type,
+ null_pointer_node),
+ add);
*prev = add;
}
}
@@ -7910,7 +8005,8 @@ add_vcall_offset_vtbl_entries_1 (binfo, vid)
/* The next vcall offset will be found at a more negative
offset. */
- vid->index = size_binop (MINUS_EXPR, vid->index, ssize_int (1));
+ vid->index = size_binop (MINUS_EXPR, vid->index,
+ ssize_int (TARGET_VTABLE_DATA_ENTRY_DISTANCE));
/* Keep track of this function. */
VARRAY_PUSH_TREE (vid->fns, derived_virtuals);
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index f2689b5da97..51239a5d1e0 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -157,7 +157,7 @@ static tree cp_expr_size PARAMS ((tree));
/* Each front end provides its own hooks, for toplev.c. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
-/* Tree code classes. */
+/* Tree code classes. */
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
@@ -298,7 +298,9 @@ cp_expr_size (exp)
of a type with both of these set; all copies of such types must go
through a constructor or assignment op. */
if (TYPE_HAS_COMPLEX_INIT_REF (TREE_TYPE (exp))
- && TYPE_HAS_COMPLEX_ASSIGN_REF (TREE_TYPE (exp)))
+ && TYPE_HAS_COMPLEX_ASSIGN_REF (TREE_TYPE (exp))
+ /* But storing a CONSTRUCTOR isn't a copy. */
+ && TREE_CODE (exp) != CONSTRUCTOR)
abort ();
/* This would be wrong for a type with virtual bases, but they are
caught by the abort above. */
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index 90685af50d4..1aae797a4c2 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -251,7 +251,7 @@ DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3)
/* 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)
+DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 1)
DEFTREECODE (RETURN_INIT, "return_init", 'e', 2)
DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2)
DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2)
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 44a52fc8e78..57cec36b440 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -59,6 +59,7 @@ struct diagnostic_context;
INHERITED_VALUE_BINDING_P (in CPLUS_BINDING)
ICS_ELLIPSIS_FLAG (in _CONV)
BINFO_ACCESS (in BINFO)
+ DECL_INITIALIZED_P (in VAR_DECL)
2: IDENTIFIER_OPNAME_P.
TYPE_POLYMORPHIC_P (in _TYPE)
ICS_THIS_FLAG (in _CONV)
@@ -96,11 +97,10 @@ struct diagnostic_context;
DECL_MUTABLE_P (in FIELD_DECL)
1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
- DECL_C_BITFIELD (in FIELD_DECL)
2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL).
DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
3: DECL_IN_AGGR_P.
- 4: DECL_C_BIT_FIELD
+ 4: DECL_C_BIT_FIELD (in a FIELD_DECL)
5: DECL_INTERFACE_KNOWN.
6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
@@ -153,7 +153,7 @@ struct diagnostic_context;
the virtual function this one overrides, and whose TREE_CHAIN is
the old DECL_VINDEX. */
-/* Language-specific tree checkers. */
+/* Language-specific tree checkers. */
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
@@ -212,6 +212,12 @@ struct diagnostic_context;
#endif
+/* Returns TRUE if generated code should match ABI version N or
+ greater is in use. */
+
+#define abi_version_at_least(N) \
+ (flag_abi_version == 0 || flag_abi_version >= (N))
+
/* Language-dependent contents of an identifier. */
@@ -318,11 +324,11 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
#define same_type_ignoring_top_level_qualifiers_p(TYPE1, TYPE2) \
same_type_p (TYPE_MAIN_VARIANT (TYPE1), TYPE_MAIN_VARIANT (TYPE2))
-/* Non-zero if we are presently building a statement tree, rather
+/* Nonzero if we are presently building a statement tree, rather
than expanding each statement as we encounter it. */
#define building_stmt_tree() (last_tree != NULL_TREE)
-/* Returns non-zero iff NODE is a declaration for the global function
+/* Returns nonzero iff NODE is a declaration for the global function
`main'. */
#define DECL_MAIN_P(NODE) \
(DECL_EXTERN_C_FUNCTION_P (NODE) \
@@ -340,18 +346,18 @@ struct tree_binding GTY(())
tree value;
};
-/* The overloaded FUNCTION_DECL. */
+/* The overloaded FUNCTION_DECL. */
#define OVL_FUNCTION(NODE) \
(((struct tree_overload*)OVERLOAD_CHECK (NODE))->function)
#define OVL_CHAIN(NODE) TREE_CHAIN (NODE)
-/* Polymorphic access to FUNCTION and CHAIN. */
+/* Polymorphic access to FUNCTION and CHAIN. */
#define OVL_CURRENT(NODE) \
((TREE_CODE (NODE) == OVERLOAD) ? OVL_FUNCTION (NODE) : (NODE))
#define OVL_NEXT(NODE) \
((TREE_CODE (NODE) == OVERLOAD) ? TREE_CHAIN (NODE) : NULL_TREE)
/* If set, this was imported in a using declaration.
This is not to confuse with being used somewhere, which
- is not important for this node. */
+ is not important for this node. */
#define OVL_USED(NODE) TREE_USED (NODE)
struct tree_overload GTY(())
@@ -435,7 +441,7 @@ struct tree_srcloc GTY(())
/* TREE_TYPE only indicates on local and class scope the current
type. For namespace scope, the presence of a type in any namespace
is indicated with global_type_node, and the real type behind must
- be found through lookup. */
+ be found through lookup. */
#define IDENTIFIER_TYPE_VALUE(NODE) identifier_type_value (NODE)
#define REAL_IDENTIFIER_TYPE_VALUE(NODE) TREE_TYPE (NODE)
#define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE))
@@ -505,7 +511,8 @@ enum cp_tree_node_structure_enum {
};
/* The resulting tree type. */
-union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)")))
+union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"),
+ chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
{
struct tree_common GTY ((tag ("TS_CP_COMMON"))) common;
union tree_node GTY ((tag ("TS_CP_GENERIC"),
@@ -708,7 +715,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
/* The node for `__null'. */
#define null_node cp_global_trees[CPTI_NULL]
-/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
+/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
#define jclass_node cp_global_trees[CPTI_JCLASS]
/* The declaration for `std::terminate'. */
@@ -770,7 +777,7 @@ struct saved_scope GTY(())
#define current_namespace scope_chain->old_namespace
-/* The stack for namespaces of current declarations. */
+/* The stack for namespaces of current declarations. */
#define decl_namespace_list scope_chain->decl_ns_list
@@ -900,13 +907,13 @@ struct language_function GTY(())
#define current_function_returns_abnormally \
cp_function_chain->returns_abnormally
-/* Non-zero if we should generate RTL for functions that we process.
+/* Nonzero 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. */
#define expanding_p cp_function_chain->x_expanding_p
-/* Non-zero if we are in the semantic analysis phase for the current
+/* Nonzero if we are in the semantic analysis phase for the current
function. */
#define doing_semantic_analysis_p() (!expanding_p)
@@ -996,7 +1003,7 @@ enum languages { lang_c, lang_cplusplus, lang_java };
/* In a *_TYPE, nonzero means a built-in type. */
#define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6 (NODE)
-/* True if this a "Java" type, defined in 'extern "Java"'. */
+/* True if this a "Java" type, defined in 'extern "Java"'. */
#define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3 (NODE)
/* Nonzero if this type is const-qualified. */
@@ -1127,6 +1134,7 @@ struct lang_type_class GTY(())
unsigned anon_aggr : 1;
unsigned non_zero_init : 1;
+ unsigned empty_p : 1;
/* When adding a flag here, consider whether or not it ought to
apply to a template instance if it applies to the template. If
@@ -1135,7 +1143,7 @@ struct lang_type_class GTY(())
/* There are some bits left to fill out a 32-bit word. Keep track
of this by updating the size of this bitfield whenever you add or
remove a flag. */
- unsigned dummy : 6;
+ unsigned dummy : 5;
int vsize;
@@ -1143,8 +1151,7 @@ struct lang_type_class GTY(())
tree vfields;
tree vbases;
tree tags;
- tree size;
- tree size_unit;
+ tree as_base;
tree pure_virtuals;
tree friend_classes;
tree rtti;
@@ -1389,19 +1396,24 @@ struct lang_type GTY(())
#define CLASSTYPE_N_BASECLASSES(NODE) \
(BINFO_N_BASETYPES (TYPE_BINFO (NODE)))
+/* The type corresponding to NODE when NODE is used as a base class,
+ i.e., NODE without virtual base classes. */
+
+#define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base)
+
/* These are the size and alignment of the type without its virtual
base classes, for when we use this type as a base itself. */
-#define CLASSTYPE_SIZE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->size)
-#define CLASSTYPE_SIZE_UNIT(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->size_unit)
-#define CLASSTYPE_ALIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->align)
-#define CLASSTYPE_USER_ALIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->user_align)
+#define CLASSTYPE_SIZE(NODE) TYPE_SIZE (CLASSTYPE_AS_BASE (NODE))
+#define CLASSTYPE_SIZE_UNIT(NODE) TYPE_SIZE_UNIT (CLASSTYPE_AS_BASE (NODE))
+#define CLASSTYPE_ALIGN(NODE) TYPE_ALIGN (CLASSTYPE_AS_BASE (NODE))
+#define CLASSTYPE_USER_ALIGN(NODE) TYPE_USER_ALIGN (CLASSTYPE_AS_BASE (NODE))
/* The alignment of NODE, without its virtual bases, in bytes. */
#define CLASSTYPE_ALIGN_UNIT(NODE) \
(CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT)
/* True if this a Java interface type, declared with
- '__attribute__ ((java_interface))'. */
+ '__attribute__ ((java_interface))'. */
#define TYPE_JAVA_INTERFACE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->java_interface)
/* A cons list of virtual functions which cannot be inherited by
@@ -1436,6 +1448,10 @@ struct lang_type GTY(())
#define CLASSTYPE_NON_ZERO_INIT_P(NODE) \
(LANG_TYPE_CLASS_CHECK (NODE)->non_zero_init)
+/* Nonzero if this class is "empty" in the sense of the C++ ABI. */
+#define CLASSTYPE_EMPTY_P(NODE) \
+ (LANG_TYPE_CLASS_CHECK (NODE)->empty_p)
+
/* Nonzero if this class is "nearly empty", i.e., contains only a
virtual function table pointer. */
#define CLASSTYPE_NEARLY_EMPTY_P(NODE) \
@@ -1614,11 +1630,11 @@ struct lang_type GTY(())
non-NULL). */
#define VF_BASETYPE_VALUE(NODE) TREE_VALUE (NODE)
-/* Accessor macros for the BINFO_VIRTUALS list. */
+/* Accessor macros for the BINFO_VIRTUALS list. */
/* The number of bytes by which to adjust the `this' pointer when
calling this virtual function. Subtract this value from the this
- pointer. Always non-NULL, might be constant zero though. */
+ pointer. Always non-NULL, might be constant zero though. */
#define BV_DELTA(NODE) (TREE_PURPOSE (NODE))
/* If non-NULL, the vtable index at which to find the vcall offset
@@ -1788,7 +1804,7 @@ struct lang_decl GTY(())
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL))) \
|| (flag_syntax_only && TREE_USED (DECL)))
-/* Non-zero iff DECL is memory-based. The DECL_RTL of
+/* Nonzero iff DECL is memory-based. The DECL_RTL of
certain const variables might be a CONST_INT, or a REG
in some cases. We cannot use `memory_operand' as a test
here because on most RISC machines, a variable's address
@@ -1890,22 +1906,22 @@ struct lang_decl GTY(())
/* Discriminator for name mangling. */
#define DECL_DISCRIMINATOR(NODE) (LANG_DECL_U2_CHECK (NODE, 1)->discriminator)
-/* Non-zero if the VTT parm has been added to NODE. */
+/* Nonzero if the VTT parm has been added to NODE. */
#define DECL_HAS_VTT_PARM_P(NODE) \
(DECL_LANG_SPECIFIC (NODE)->decl_flags.has_vtt_parm_p)
-/* Non-zero if NODE is a FUNCTION_DECL for which a VTT parameter is
+/* Nonzero if NODE is a FUNCTION_DECL for which a VTT parameter is
required. */
#define DECL_NEEDS_VTT_PARM_P(NODE) \
(TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (NODE)) \
&& (DECL_BASE_CONSTRUCTOR_P (NODE) \
|| DECL_BASE_DESTRUCTOR_P (NODE)))
-/* Non-zero if NODE is a user-defined conversion operator. */
+/* Nonzero if NODE is a user-defined conversion operator. */
#define DECL_CONV_FN_P(NODE) \
(IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)))
-/* Non-zero if NODE, which is a TEMPLATE_DECL, is a template
+/* Nonzero if NODE, which is a TEMPLATE_DECL, is a template
conversion operator to a type dependent on the innermost template
args. */
#define DECL_TEMPLATE_CONV_FN_P(NODE) \
@@ -1926,7 +1942,7 @@ struct lang_decl GTY(())
(IDENTIFIER_OPNAME_P (DECL_NAME (NODE)) \
? DECL_LANG_SPECIFIC (NODE)->u.f.operator_code : ERROR_MARK)
-/* Non-zero if NODE is an assignment operator. */
+/* Nonzero if NODE is an assignment operator. */
#define DECL_ASSIGNMENT_OPERATOR_P(NODE) \
(DECL_LANG_SPECIFIC (NODE)->decl_flags.assignment_operator_p)
@@ -1947,6 +1963,11 @@ struct lang_decl GTY(())
should be allocated. */
#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE))
+/* Nonzero for a VAR_DECL means that the variable's initialization has
+ been processed. */
+#define DECL_INITIALIZED_P(NODE) \
+ (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE)))
+
/* Nonzero if the DECL was initialized in the class definition itself,
rather than outside the class. */
#define DECL_INITIALIZED_IN_CLASS_P(DECL) \
@@ -2043,7 +2064,7 @@ struct lang_decl GTY(())
(TREE_LANG_FLAG_0 (NODE))
/* The _TYPE context in which this _DECL appears. This field holds the
- class where a virtual function instance is actually defined. */
+ class where a virtual function instance is actually defined. */
#define DECL_CLASS_CONTEXT(NODE) \
(DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE)
@@ -2062,7 +2083,7 @@ struct lang_decl GTY(())
#define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \
(DECL_LANG_SPECIFIC (NODE)->u.f.context = (CONTEXT))
-/* NULL_TREE in DECL_CONTEXT represents the global namespace. */
+/* NULL_TREE in DECL_CONTEXT represents the global namespace. */
#define CP_DECL_CONTEXT(NODE) \
(DECL_CONTEXT (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
#define FROB_CONTEXT(NODE) ((NODE) == global_namespace ? NULL_TREE : (NODE))
@@ -2092,11 +2113,11 @@ struct lang_decl GTY(())
/* For a NAMESPACE_DECL: the list of using namespace directives
The PURPOSE is the used namespace, the value is the namespace
- that is the common ancestor. */
+ that is the common ancestor. */
#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX (NAMESPACE_DECL_CHECK (NODE))
/* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users
- of a namespace, to record the transitive closure of using namespace. */
+ of a namespace, to record the transitive closure of using namespace. */
#define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NAMESPACE_DECL_CHECK (NODE))
/* In a NAMESPACE_DECL, points to the original namespace if this is
@@ -2106,7 +2127,7 @@ struct lang_decl GTY(())
#define ORIGINAL_NAMESPACE(NODE) \
(DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE))
-/* Non-zero if NODE is the std namespace. */
+/* Nonzero if NODE is the std namespace. */
#define DECL_NAMESPACE_STD_P(NODE) \
(TREE_CODE (NODE) == NAMESPACE_DECL \
&& CP_DECL_CONTEXT (NODE) == global_namespace \
@@ -2137,7 +2158,7 @@ struct lang_decl GTY(())
(DECL_LANG_SPECIFIC (NODE)->u.f.u.pending_inline_info)
/* For a TYPE_DECL: if this function has many fields, we'll sort them
- and put them into a TREE_VEC. */
+ and put them into a TREE_VEC. */
#define DECL_SORTED_FIELDS(NODE) \
(DECL_LANG_SPECIFIC (TYPE_DECL_CHECK (NODE))->u.f.u.sorted_fields)
@@ -2199,7 +2220,7 @@ struct lang_decl GTY(())
only one level of arguments, but which is a TREE_VEC containing as
its only entry the TREE_VEC for that level. */
-/* Non-zero if the template arguments is actually a vector of vectors,
+/* Nonzero if the template arguments is actually a vector of vectors,
rather than just a vector. */
#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \
((NODE) != NULL_TREE \
@@ -2216,7 +2237,7 @@ struct lang_decl GTY(())
#define TMPL_ARGS_DEPTH(NODE) \
(TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE) : 1)
-/* The LEVELth level of the template ARGS. The outermost level of of
+/* The LEVELth level of the template ARGS. The outermost level of
args is level 1, not level 0. */
#define TMPL_ARGS_LEVEL(ARGS, LEVEL) \
(TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS) \
@@ -2382,7 +2403,7 @@ struct lang_decl GTY(())
/* Record whether a typedef for type `int' was actually `signed int'. */
#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
-/* Returns non-zero if DECL has external linkage, as specified by the
+/* Returns nonzero if DECL has external linkage, as specified by the
language standard. (This predicate may hold even when the
corresponding entity is not actually given external linkage in the
object file; see decl_linkage for details.) */
@@ -2421,8 +2442,18 @@ struct lang_decl GTY(())
|| TYPE_PTRMEM_P (TYPE) \
|| TYPE_PTRMEMFUNC_P (TYPE))
-/* Nonzero for _TYPE means that the _TYPE defines
- at least one constructor. */
+/* [dcl.init.aggr]
+
+ An aggregate is an array or a class with no user-declared
+ constructors, no private or protected non-static data members, no
+ base classes, and no virtual functions. */
+#define CP_AGGREGATE_TYPE_P(TYPE) \
+ (TREE_CODE (TYPE) == ARRAY_TYPE \
+ || (CLASS_TYPE_P (TYPE) \
+ && !CLASSTYPE_NON_AGGREGATE (TYPE)))
+
+/* Nonzero for a class type means that the class type has a
+ user-declared constructor. */
#define TYPE_HAS_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE))
/* When appearing in an INDIRECT_REF, it means that the tree structure
@@ -2524,32 +2555,6 @@ struct lang_decl GTY(())
member function. [expr.unary.op]/3 */
#define PTRMEM_OK_P(NODE) TREE_LANG_FLAG_0 (NODE)
-/* A pointer-to-function member type looks like:
-
- struct {
- __P __pfn;
- ptrdiff_t __delta;
- };
-
- If __pfn is NULL, it is a NULL pointer-to-member-function.
-
- (Because the vtable is always the first thing in the object, we
- don't need its offset.) If the function is virtual, then PFN is
- one plus twice the index into the vtable; otherwise, it is just a
- pointer to the function.
-
- Unfortunately, using the lowest bit of PFN doesn't work in
- architectures that don't impose alignment requirements on function
- addresses, or that use the lowest bit to tell one ISA from another,
- for example. For such architectures, we use the lowest bit of
- DELTA instead of the lowest bit of the PFN, and DELTA will be
- multiplied by 2. */
-enum ptrmemfunc_vbit_where_t
-{
- ptrmemfunc_vbit_in_pfn,
- ptrmemfunc_vbit_in_delta
-};
-
/* Get the POINTER_TYPE to the METHOD_TYPE associated with this
pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true,
before using this macro. */
@@ -2800,7 +2805,7 @@ enum ptrmemfunc_vbit_where_t
#define DECL_PRIMARY_TEMPLATE(NODE) \
(TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
-/* Returns non-zero if NODE is a primary template. */
+/* Returns nonzero if NODE is a primary template. */
#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE))
#define CLASSTYPE_TEMPLATE_LEVEL(NODE) \
@@ -2839,7 +2844,7 @@ enum ptrmemfunc_vbit_where_t
#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
(CLASSTYPE_USE_TEMPLATE (NODE) = 3)
-/* Non-zero if DECL is a friend function which is an instantiation
+/* Nonzero if DECL is a friend function which is an instantiation
from the point of view of the compiler, but not from the point of
view of the language. For example given:
template <class T> struct S { friend void f(T) {}; };
@@ -2849,13 +2854,13 @@ enum ptrmemfunc_vbit_where_t
#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
(DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL))
-/* Non-zero if TYPE is a partial instantiation of a template class,
+/* Nonzero if TYPE is a partial instantiation of a template class,
i.e., an instantiation whose instantiation arguments involve
template types. */
#define PARTIAL_INSTANTIATION_P(TYPE) \
(LANG_TYPE_CLASS_CHECK (TYPE)->is_partial_instantiation)
-/* Non-zero iff we are currently processing a declaration for an
+/* Nonzero iff we are currently processing a declaration for an
entity with its own template parameter list, and which is not a
full specialization. */
#define PROCESSING_REAL_TEMPLATE_DECL_P() \
@@ -3053,19 +3058,19 @@ typedef enum tsubst_flags_t {
(make_typename_type use) */
} tsubst_flags_t;
-/* The kind of checking we can do looking in a class hierarchy. */
+/* The kind of checking we can do looking in a class hierarchy. */
typedef enum base_access {
ba_any = 0, /* Do not check access, allow an ambiguous base,
prefer a non-virtual base */
ba_ignore = 1, /* Do not check access */
ba_check = 2, /* Check access */
ba_not_special = 3, /* Do not consider special privilege
- current_class_type might give. */
+ current_class_type might give. */
ba_quiet = 4, /* Do not issue error messages (bit mask). */
} base_access;
/* The kind of base we can find, looking in a class hierarchy.
- Values <0 indicate we failed. */
+ Values <0 indicate we failed. */
typedef enum base_kind {
bk_inaccessible = -3, /* The base is inaccessible */
bk_ambig = -2, /* The base is ambiguous */
@@ -3074,7 +3079,7 @@ typedef enum base_kind {
bk_proper_base = 1, /* It is a proper base */
bk_via_virtual = 2 /* It is a proper base, but via a virtual
path. This might not be the canonical
- binfo. */
+ binfo. */
} base_kind;
/* Set by add_implicitly_declared_members() to keep those members from
@@ -3248,7 +3253,7 @@ extern GTY(()) varray_type local_classes;
&& IDENTIFIER_POINTER (ID_NODE)[1] == '_')
#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
-/* Returns non-zero iff NODE is a declaration for the global function
+/* Returns nonzero iff NODE is a declaration for the global function
`main'. */
#define DECL_MAIN_P(NODE) \
(DECL_EXTERN_C_FUNCTION_P (NODE) \
@@ -3476,6 +3481,8 @@ typedef struct operator_name_info_t
const char *name;
/* The mangled name of the operator. */
const char *mangled_name;
+ /* The arity of the operator. */
+ int arity;
} operator_name_info_t;
/* A mapping from tree codes to operator name information. */
@@ -3677,8 +3684,6 @@ extern void start_decl_1 PARAMS ((tree));
extern void cp_finish_decl PARAMS ((tree, tree, tree, int));
extern void finish_decl PARAMS ((tree, tree, tree));
extern void maybe_inject_for_scope_var PARAMS ((tree));
-extern void initialize_local_var PARAMS ((tree, tree, int));
-extern void expand_static_init PARAMS ((tree, tree));
extern tree start_handler_parms PARAMS ((tree, tree));
extern int complete_array_type PARAMS ((tree, tree, int));
extern tree build_ptrmemfunc_type PARAMS ((tree));
@@ -3723,6 +3728,9 @@ typedef int (*walk_globals_fn) PARAMS ((tree *, void *));
extern int walk_globals PARAMS ((walk_globals_pred,
walk_globals_fn,
void *));
+extern int walk_vtables PARAMS ((walk_globals_pred,
+ walk_globals_fn,
+ void *));
typedef int (*walk_namespaces_fn) PARAMS ((tree, void *));
extern int walk_namespaces PARAMS ((walk_namespaces_fn,
void *));
@@ -3762,8 +3770,6 @@ extern bool constructor_name_p (tree, tree);
extern void defer_fn PARAMS ((tree));
extern void finish_anon_union PARAMS ((tree));
extern tree finish_table PARAMS ((tree, tree, tree, int));
-extern void finish_builtin_type PARAMS ((tree, const char *,
- tree *, int, tree));
extern tree coerce_new_type PARAMS ((tree));
extern tree coerce_delete_type PARAMS ((tree));
extern void comdat_linkage PARAMS ((tree));
@@ -3840,7 +3846,6 @@ extern void check_handlers PARAMS ((tree));
extern void choose_personality_routine PARAMS ((enum languages));
/* in expr.c */
-extern int extract_init PARAMS ((tree, tree));
extern rtx cxx_expand_expr PARAMS ((tree, rtx,
enum machine_mode,
int));
@@ -3853,14 +3858,14 @@ extern void add_friend PARAMS ((tree, tree));
extern tree do_friend PARAMS ((tree, tree, tree, tree, tree, enum overload_flags, tree, int));
/* in init.c */
-extern void emit_base_init PARAMS ((tree, tree));
-extern tree expand_member_init PARAMS ((tree, tree, tree));
+extern tree expand_member_init (tree, tree);
+extern void emit_mem_initializers (tree);
extern tree build_aggr_init PARAMS ((tree, tree, int));
extern tree build_init PARAMS ((tree, tree, int));
extern int is_aggr_type PARAMS ((tree, int));
extern tree get_aggr_from_typedef PARAMS ((tree, int));
extern tree get_type_value PARAMS ((tree));
-extern tree build_forced_zero_init PARAMS ((tree));
+extern tree build_zero_init (tree, bool);
extern tree build_member_call PARAMS ((tree, tree, tree));
extern tree build_offset_ref PARAMS ((tree, tree));
extern tree resolve_offset_ref PARAMS ((tree));
@@ -4179,11 +4184,14 @@ extern tree cxx_unsave_expr_now PARAMS ((tree));
extern tree cxx_maybe_build_cleanup PARAMS ((tree));
extern void init_tree PARAMS ((void));
extern int pod_type_p PARAMS ((tree));
+extern bool variably_modified_type_p (tree);
extern int zero_init_p PARAMS ((tree));
extern tree canonical_type_variant PARAMS ((tree));
extern void unshare_base_binfos PARAMS ((tree));
extern int member_p PARAMS ((tree));
extern cp_lvalue_kind real_lvalue_p PARAMS ((tree));
+extern int non_cast_lvalue_p PARAMS ((tree));
+extern int non_cast_lvalue_or_else PARAMS ((tree, const char *));
extern tree build_min PARAMS ((enum tree_code, tree,
...));
extern tree build_min_nt PARAMS ((enum tree_code, ...));
@@ -4321,6 +4329,7 @@ extern tree check_return_expr PARAMS ((tree));
extern tree build_ptrmemfunc_access_expr (tree, tree);
/* in typeck2.c */
+extern void require_complete_eh_spec_types PARAMS ((tree, tree));
extern void cxx_incomplete_type_diagnostic PARAMS ((tree, tree, int));
#undef cxx_incomplete_type_error
extern void cxx_incomplete_type_error PARAMS ((tree, tree));
@@ -4331,7 +4340,6 @@ extern tree binfo_or_else PARAMS ((tree, tree));
extern void readonly_error PARAMS ((tree, const char *, int));
extern int abstract_virtuals_error PARAMS ((tree, tree));
-extern tree force_store_init_value PARAMS ((tree, tree));
extern tree store_init_value PARAMS ((tree, tree));
extern tree digest_init PARAMS ((tree, tree, tree *));
extern tree build_scoped_ref PARAMS ((tree, tree, tree *));
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 26af72fd900..7e31045a485 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -149,12 +149,12 @@ cp_convert_to_pointer (type, expr, force)
enum tree_code code = PLUS_EXPR;
tree binfo;
- /* Try derived to base conversion. */
+ /* Try derived to base conversion. */
binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
ba_check, NULL);
if (!binfo)
{
- /* Try base to derived conversion. */
+ /* Try base to derived conversion. */
binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
ba_check, NULL);
code = MINUS_EXPR;
@@ -164,7 +164,7 @@ cp_convert_to_pointer (type, expr, force)
if (binfo)
{
expr = build_base_path (code, expr, binfo, 0);
- /* Add any qualifier conversions. */
+ /* Add any qualifier conversions. */
if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
TREE_TYPE (type)))
{
@@ -322,7 +322,7 @@ convert_to_pointer_force (type, expr)
if (binfo)
{
expr = build_base_path (code, expr, binfo, 0);
- /* Add any qualifier conversions. */
+ /* Add any qualifier conversions. */
if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
TREE_TYPE (type)))
{
@@ -473,12 +473,13 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
tree decl;
{
register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
- register tree intype = TREE_TYPE (expr);
+ register tree intype;
tree rval = NULL_TREE;
tree rval_as_conversion = NULL_TREE;
int i;
- if (TREE_CODE (type) == FUNCTION_TYPE && intype == unknown_type_node)
+ if (TREE_CODE (type) == FUNCTION_TYPE
+ && TREE_TYPE (expr) == unknown_type_node)
{
expr = instantiate_type (type, expr,
(flags & LOOKUP_COMPLAIN)
@@ -488,6 +489,11 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
intype = TREE_TYPE (expr);
}
+ else
+ {
+ expr = convert_from_reference (expr);
+ intype = TREE_TYPE (expr);
+ }
my_friendly_assert (TREE_CODE (intype) != REFERENCE_TYPE, 364);
@@ -857,7 +863,7 @@ convert_to_void (expr, implicit)
case NON_LVALUE_EXPR:
case NOP_EXPR:
- /* These have already decayed to rvalue. */
+ /* These have already decayed to rvalue. */
break;
case CALL_EXPR: /* we have a special meaning for volatile void fn() */
@@ -1014,7 +1020,7 @@ convert_force (type, expr, convtype)
allowed (references private members, etc).
If no conversion exists, NULL_TREE is returned.
- If (FOR_SURE & 1) is non-zero, then we allow this type conversion
+ If (FOR_SURE & 1) is nonzero, then we allow this type conversion
to take place immediately. Otherwise, we build a SAVE_EXPR
which can be evaluated if the results are ever needed.
diff --git a/gcc/cp/cxxfilt.c b/gcc/cp/cxxfilt.c
new file mode 100644
index 00000000000..c9ae0e49025
--- /dev/null
+++ b/gcc/cp/cxxfilt.c
@@ -0,0 +1,302 @@
+/* Demangler for GNU C++ - main program
+ Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002 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
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+
+#include "config.h"
+#include "system.h"
+#include "demangle.h"
+#include "getopt.h"
+#include "version.h"
+
+static const char *program_name;
+static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
+
+static void demangle_it 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)
+ char *mangled_name;
+{
+ char *result;
+
+ /* 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);
+ }
+ else
+ {
+ printf ("%s\n", result);
+ free (result);
+ }
+}
+
+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] [--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);
+}
+
+#define MBUF_SIZE 32767
+char mbuffer[MBUF_SIZE];
+
+int strip_underscore = 0;
+
+static const struct option long_options[] = {
+ {"strip-underscores", no_argument, 0, '_'},
+ {"format", required_argument, 0, 's'},
+ {"help", no_argument, 0, 'h'},
+ {"no-strip-underscores", no_argument, 0, 'n'},
+ {"version", no_argument, 0, 'v'},
+ {0, no_argument, 0, 0}
+};
+
+static const char *
+standard_symbol_characters PARAMS ((void));
+
+static const char *
+hp_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. */
+
+static const char *
+standard_symbol_characters ()
+{
+ return "_$.";
+}
+
+
+/* Return the string of non-alnum characters that may occur
+ as a valid symbol name component in an HP object file.
+
+ Note that, since HP's compiler generates object code straight from
+ C++ source, without going through an assembler, its mangled
+ identifiers can use all sorts of characters that no assembler would
+ tolerate, so the alphabet this function creates is a little odd.
+ Here are some sample mangled identifiers offered by HP:
+
+ typeid*__XT24AddressIndExpClassMember_
+ [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
+ __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
+
+ This still seems really weird to me, since nowhere else in this
+ file is there anything to recognize curly brackets, parens, etc.
+ I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me
+ this is right, but I still strongly suspect that there's a
+ misunderstanding here.
+
+ If we decide it's better for c++filt to use HP's assembler syntax
+ to scrape identifiers out of its input, here's the definition of
+ the symbol name syntax from the HP assembler manual:
+
+ Symbols are composed of uppercase and lowercase letters, decimal
+ digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
+ underscore (_). A symbol can begin with a letter, digit underscore or
+ dollar sign. If a symbol begins with a digit, it must contain a
+ non-digit character.
+
+ So have fun. */
+static const char *
+hp_symbol_characters ()
+{
+ return "_$.<>#,*&[]:(){}";
+}
+
+extern int main PARAMS ((int, char **));
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *result;
+ int c;
+ const char *valid_symbols;
+ enum demangling_styles style = auto_demangling;
+
+ program_name = argv[0];
+
+ strip_underscore = (USER_LABEL_PREFIX[0] == '_');
+
+ while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF)
+ {
+ switch (c)
+ {
+ case '?':
+ usage (stderr, 1);
+ break;
+ case 'h':
+ usage (stdout, 0);
+ case 'n':
+ strip_underscore = 0;
+ break;
+ case 'v':
+ printf ("GNU %s (C++ demangler), version %s\n",
+ program_name, version_string);
+ return (0);
+ case '_':
+ strip_underscore = 1;
+ break;
+ case 's':
+ {
+ 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;
+ }
+ }
+
+ if (optind < argc)
+ {
+ for ( ; optind < argc; optind++)
+ {
+ demangle_it (argv[optind]);
+ }
+ }
+ else
+ {
+ switch (current_demangling_style)
+ {
+ case gnu_demangling:
+ case lucid_demangling:
+ case arm_demangling:
+ case java_demangling:
+ case edg_demangling:
+ case gnat_demangling:
+ case gnu_v3_demangling:
+ case auto_demangling:
+ valid_symbols = standard_symbol_characters ();
+ break;
+ case hp_demangling:
+ valid_symbols = hp_symbol_characters ();
+ break;
+ default:
+ /* Folks should explicitly indicate the appropriate alphabet for
+ each demangling. Providing a default would allow the
+ question to go unconsidered. */
+ fatal ("Internal error: no symbol alphabet for current style");
+ }
+
+ for (;;)
+ {
+ int i = 0;
+ c = getchar ();
+ /* Try to read a label. */
+ while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
+ {
+ if (i >= MBUF_SIZE-1)
+ break;
+ mbuffer[i++] = c;
+ c = getchar ();
+ }
+ if (i > 0)
+ {
+ int skip_first = 0;
+
+ mbuffer[i] = 0;
+ if (mbuffer[0] == '.' || mbuffer[0] == '$')
+ ++skip_first;
+ if (strip_underscore && mbuffer[skip_first] == '_')
+ ++skip_first;
+
+ if (skip_first > i)
+ skip_first = i;
+
+ flags |= (int) style;
+ result = cplus_demangle (mbuffer + skip_first, flags);
+ if (result)
+ {
+ if (mbuffer[0] == '.')
+ putc ('.', stdout);
+ fputs (result, stdout);
+ free (result);
+ }
+ else
+ fputs (mbuffer, stdout);
+
+ fflush (stdout);
+ }
+ if (c == EOF)
+ break;
+ putchar (c);
+ fflush (stdout);
+ }
+ }
+
+ return (0);
+}
+
+static void
+fatal (str)
+ const char *str;
+{
+ fprintf (stderr, "%s: %s\n", program_name, str);
+ exit (1);
+}
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index bb0abbdf83f..cc954f5b76b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -67,7 +67,6 @@ static int ambi_op_p PARAMS ((enum tree_code));
static int unary_op_p PARAMS ((enum tree_code));
static tree store_bindings PARAMS ((tree, tree));
static tree lookup_tag_reverse PARAMS ((tree, tree));
-static tree obscure_complex_init PARAMS ((tree, tree));
static tree lookup_name_real PARAMS ((tree, int, int, int));
static void push_local_name PARAMS ((tree));
static void warn_extern_redeclared_static PARAMS ((tree, tree));
@@ -108,6 +107,7 @@ static struct cp_binding_level *innermost_nonclass_level PARAMS ((void));
static void warn_about_implicit_typename_lookup PARAMS ((tree, tree));
static int walk_namespaces_r PARAMS ((tree, walk_namespaces_fn, void *));
static int walk_globals_r PARAMS ((tree, void *));
+static int walk_vtables_r PARAMS ((tree, void*));
static void add_decl_to_level PARAMS ((tree, struct cp_binding_level *));
static tree make_label_decl PARAMS ((tree, int));
static void use_label PARAMS ((tree));
@@ -121,11 +121,10 @@ static void pop_labels PARAMS ((tree));
static void maybe_deduce_size_from_array_init PARAMS ((tree, tree));
static void layout_var_decl PARAMS ((tree));
static void maybe_commonize_var PARAMS ((tree));
-static tree check_initializer PARAMS ((tree, tree));
+static tree check_initializer (tree, tree, int);
static void make_rtl_for_nonlocal_decl PARAMS ((tree, tree, const char *));
static void save_function_data PARAMS ((tree));
static void check_function_type PARAMS ((tree, tree));
-static void destroy_local_var PARAMS ((tree));
static void begin_constructor_body PARAMS ((void));
static void finish_constructor_body PARAMS ((void));
static void begin_destructor_body PARAMS ((void));
@@ -143,6 +142,10 @@ static tree push_cp_library_fn PARAMS ((enum tree_code, tree));
static tree build_cp_library_fn PARAMS ((tree, enum tree_code, tree));
static void store_parm_decls PARAMS ((tree));
static int cp_missing_noreturn_ok_p PARAMS ((tree));
+static void initialize_local_var (tree, tree);
+static void expand_static_init (tree, tree);
+static tree next_initializable_field (tree);
+static tree reshape_init (tree, tree *);
#if defined (DEBUG_BINDING_LEVELS)
static void indent PARAMS ((void));
@@ -203,7 +206,7 @@ tree cp_global_trees[CPTI_MAX];
static GTY(()) tree global_type_node;
-/* Expect only namespace names now. */
+/* Expect only namespace names now. */
static int only_namespace_names;
/* Used only for jumps to as-yet undefined labels, since jumps to
@@ -319,6 +322,15 @@ struct cp_binding_level GTY(())
are wrapped in TREE_LISTs; the TREE_VALUE is the OVERLOAD. */
tree names;
+ /* Count of elements in names chain. */
+ size_t names_size;
+
+ /* A chain of NAMESPACE_DECL nodes. */
+ tree namespaces;
+
+ /* A chain of VTABLE_DECL nodes. */
+ tree vtables;
+
/* A list of structure, union and enum definitions, for looking up
tag names.
It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
@@ -329,11 +341,11 @@ struct cp_binding_level GTY(())
component_bindings. */
tree tags;
- /* A list of USING_DECL nodes. */
+ /* A list of USING_DECL nodes. */
tree usings;
/* A list of used namespaces. PURPOSE is the namespace,
- VALUE the common ancestor with this binding_level's namespace. */
+ VALUE the common ancestor with this binding_level's namespace. */
tree using_directives;
/* If this binding level is the binding level for a class, then
@@ -576,7 +588,7 @@ resume_binding_level (b)
struct cp_binding_level *b;
{
/* Resuming binding levels is meant only for namespaces,
- and those cannot nest into classes. */
+ and those cannot nest into classes. */
my_friendly_assert(!class_binding_level, 386);
/* Also, resuming a non-directly nested namespace is a no-no. */
my_friendly_assert(b->level_chain == current_binding_level, 386);
@@ -649,7 +661,7 @@ namespace_bindings_p ()
return b->namespace_p;
}
-/* If KEEP is non-zero, make a BLOCK node for the next binding level,
+/* If KEEP is nonzero, make a BLOCK node for the next binding level,
unconditionally. Otherwise, use the normal logic to decide whether
or not to create a BLOCK. */
@@ -678,7 +690,7 @@ declare_namespace_level ()
current_binding_level->namespace_p = 1;
}
-/* Returns non-zero if this scope was created to store template
+/* Returns nonzero if this scope was created to store template
parameters. */
int
@@ -1007,10 +1019,25 @@ add_decl_to_level (decl, b)
tree decl;
struct cp_binding_level *b;
{
- /* We build up the list in reverse order, and reverse it later if
- necessary. */
- TREE_CHAIN (decl) = b->names;
- b->names = decl;
+ if (TREE_CODE (decl) == NAMESPACE_DECL
+ && !DECL_NAMESPACE_ALIAS (decl))
+ {
+ TREE_CHAIN (decl) = b->namespaces;
+ b->namespaces = decl;
+ }
+ else if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
+ {
+ TREE_CHAIN (decl) = b->vtables;
+ b->vtables = decl;
+ }
+ else
+ {
+ /* We build up the list in reverse order, and reverse it later if
+ necessary. */
+ TREE_CHAIN (decl) = b->names;
+ b->names = decl;
+ b->names_size++;
+ }
}
/* Bind DECL to ID in the current_binding_level, assumed to be a local
@@ -1715,7 +1742,7 @@ clear_identifier_class_values ()
IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (t)) = NULL_TREE;
}
-/* Returns non-zero if T is a virtual function table. */
+/* Returns nonzero if T is a virtual function table. */
int
vtable_decl_p (t, data)
@@ -1725,7 +1752,7 @@ vtable_decl_p (t, data)
return (TREE_CODE (t) == VAR_DECL && DECL_VIRTUAL_P (t));
}
-/* Returns non-zero if T is a TYPE_DECL for a type with virtual
+/* Returns nonzero if T is a TYPE_DECL for a type with virtual
functions. */
int
@@ -1747,6 +1774,50 @@ cp_namespace_decls (ns)
return NAMESPACE_LEVEL (ns)->names;
}
+struct walk_globals_data {
+ walk_globals_pred p;
+ walk_globals_fn f;
+ void *data;
+};
+
+/* Walk the vtable declarations in NAMESPACE. Whenever one is found
+ for which P returns nonzero, call F with its address. If any call
+ to F returns a nonzero value, return a nonzero value. */
+
+static int
+walk_vtables_r (namespace, data)
+ tree namespace;
+ void *data;
+{
+ struct walk_globals_data* wgd = (struct walk_globals_data *) data;
+ walk_globals_fn f = wgd->f;
+ void *d = wgd->data;
+ tree decl = NAMESPACE_LEVEL (namespace)->vtables;
+ int result = 0;
+
+ for (; decl ; decl = TREE_CHAIN (decl))
+ result |= (*f) (&decl, d);
+
+ return result;
+}
+
+/* Walk the vtable declarations. Whenever one is found for which P
+ returns nonzero, call F with its address. If any call to F
+ returns a nonzero value, return a nonzero value. */
+int
+walk_vtables (p, f, data)
+ walk_globals_pred p;
+ walk_globals_fn f;
+ void *data;
+{
+ struct walk_globals_data wgd;
+ wgd.p = p;
+ wgd.f = f;
+ wgd.data = data;
+
+ return walk_namespaces (walk_vtables_r, &wgd);
+}
+
/* Walk all the namespaces contained NAMESPACE, including NAMESPACE
itself, calling F for each. The DATA is passed to F as well. */
@@ -1756,22 +1827,13 @@ walk_namespaces_r (namespace, f, data)
walk_namespaces_fn f;
void *data;
{
- tree current;
int result = 0;
+ tree current = NAMESPACE_LEVEL (namespace)->namespaces;
result |= (*f) (namespace, data);
- for (current = cp_namespace_decls (namespace);
- current;
- current = TREE_CHAIN (current))
- {
- if (TREE_CODE (current) != NAMESPACE_DECL
- || DECL_NAMESPACE_ALIAS (current))
- continue;
-
- /* We found a namespace. */
- result |= walk_namespaces_r (current, f, data);
- }
+ for (; current; current = TREE_CHAIN (current))
+ result |= walk_namespaces_r (current, f, data);
return result;
}
@@ -1787,15 +1849,9 @@ walk_namespaces (f, data)
return walk_namespaces_r (global_namespace, f, data);
}
-struct walk_globals_data {
- walk_globals_pred p;
- walk_globals_fn f;
- void *data;
-};
-
/* Walk the global declarations in NAMESPACE. Whenever one is found
- for which P returns non-zero, call F with its address. If any call
- to F returns a non-zero value, return a non-zero value. */
+ for which P returns nonzero, call F with its address. If any call
+ to F returns a nonzero value, return a nonzero value. */
static int
walk_globals_r (namespace, data)
@@ -1828,8 +1884,8 @@ walk_globals_r (namespace, data)
}
/* Walk the global declarations. Whenever one is found for which P
- returns non-zero, call F with its address. If any call to F
- returns a non-zero value, return a non-zero value. */
+ returns nonzero, call F with its address. If any call to F
+ returns a nonzero value, return a nonzero value. */
int
walk_globals (p, f, data)
@@ -1855,7 +1911,7 @@ wrapup_globals_for_namespace (namespace, data)
void *data;
{
tree globals = cp_namespace_decls (namespace);
- int len = list_length (globals);
+ int len = NAMESPACE_LEVEL (namespace)->names_size;
tree *vec = (tree *) alloca (sizeof (tree) * len);
int i;
int result;
@@ -1867,7 +1923,7 @@ wrapup_globals_for_namespace (namespace, data)
return 0;
/* Process the decls in reverse order--earliest first.
- Put them into VEC from back to front, then take out from front. */
+ Put them into VEC from back to front, then take out from front. */
for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
vec[len - i - 1] = decl;
@@ -1877,28 +1933,9 @@ wrapup_globals_for_namespace (namespace, data)
return 0;
}
- /* Temporarily mark vtables as external. That prevents
- wrapup_global_declarations from writing them out; we must process
- them ourselves in finish_vtable_vardecl. */
- for (i = 0; i < len; ++i)
- if (vtable_decl_p (vec[i], /*data=*/0) && !DECL_EXTERNAL (vec[i]))
- {
- DECL_NOT_REALLY_EXTERN (vec[i]) = 1;
- DECL_EXTERNAL (vec[i]) = 1;
- }
-
/* Write out any globals that need to be output. */
result = wrapup_global_declarations (vec, len);
- /* Undo the hack to DECL_EXTERNAL above. */
- for (i = 0; i < len; ++i)
- if (vtable_decl_p (vec[i], /*data=*/0)
- && DECL_NOT_REALLY_EXTERN (vec[i]))
- {
- DECL_NOT_REALLY_EXTERN (vec[i]) = 0;
- DECL_EXTERNAL (vec[i]) = 0;
- }
-
return result;
}
@@ -2053,11 +2090,11 @@ print_binding_stack ()
/* Namespace binding access routines: The namespace_bindings field of
the identifier is polymorphic, with three possible values:
NULL_TREE, a list of CPLUS_BINDINGS, or any other tree_node
- indicating the BINDING_VALUE of global_namespace. */
+ indicating the BINDING_VALUE of global_namespace. */
/* Check whether the a binding for the name to scope is known.
Assumes that the bindings of the name are already a list
- of bindings. Returns the binding found, or NULL_TREE. */
+ of bindings. Returns the binding found, or NULL_TREE. */
static tree
find_binding (name, scope)
@@ -2075,7 +2112,7 @@ find_binding (name, scope)
if (BINDING_SCOPE (iter) == scope)
{
/* Move binding found to the front of the list, so
- subsequent lookups will find it faster. */
+ subsequent lookups will find it faster. */
if (prev)
{
TREE_CHAIN (prev) = TREE_CHAIN (iter);
@@ -2091,7 +2128,7 @@ find_binding (name, scope)
/* Always returns a binding for name in scope. If the
namespace_bindings is not a list, convert it to one first.
- If no binding is found, make a new one. */
+ If no binding is found, make a new one. */
tree
binding_for_name (name, scope)
@@ -2105,14 +2142,14 @@ binding_for_name (name, scope)
if (b && TREE_CODE (b) != CPLUS_BINDING)
{
- /* Get rid of optimization for global scope. */
+ /* Get rid of optimization for global scope. */
IDENTIFIER_NAMESPACE_BINDINGS (name) = NULL_TREE;
BINDING_VALUE (binding_for_name (name, global_namespace)) = b;
b = IDENTIFIER_NAMESPACE_BINDINGS (name);
}
if (b && (result = find_binding (name, scope)))
return result;
- /* Not found, make a new one. */
+ /* Not found, make a new one. */
result = make_node (CPLUS_BINDING);
TREE_CHAIN (result) = b;
IDENTIFIER_NAMESPACE_BINDINGS (name) = result;
@@ -2123,7 +2160,7 @@ binding_for_name (name, scope)
}
/* Return the binding value for name in scope, considering that
- namespace_binding may or may not be a list of CPLUS_BINDINGS. */
+ namespace_binding may or may not be a list of CPLUS_BINDINGS. */
tree
namespace_binding (name, scope)
@@ -2144,7 +2181,7 @@ namespace_binding (name, scope)
}
/* Set the binding value for name in scope. If modifying the binding
- of global_namespace is attempted, try to optimize it. */
+ of global_namespace is attempted, try to optimize it. */
void
set_namespace_binding (name, scope, val)
@@ -2183,7 +2220,7 @@ push_namespace (name)
int global = 0;
if (!global_namespace)
{
- /* This must be ::. */
+ /* This must be ::. */
my_friendly_assert (name == get_identifier ("::"), 377);
global = 1;
}
@@ -2202,7 +2239,7 @@ push_namespace (name)
}
else
{
- /* Check whether this is an extended namespace definition. */
+ /* Check whether this is an extended namespace definition. */
d = IDENTIFIER_NAMESPACE_VALUE (name);
if (d != NULL_TREE && TREE_CODE (d) == NAMESPACE_DECL)
{
@@ -2218,7 +2255,7 @@ push_namespace (name)
if (need_new)
{
- /* Make a new namespace, binding the name to it. */
+ /* Make a new namespace, binding the name to it. */
d = build_lang_decl (NAMESPACE_DECL, name, void_type_node);
/* The global namespace is not pushed, and the global binding
level is set elsewhere. */
@@ -2236,7 +2273,7 @@ push_namespace (name)
if (implicit_use)
do_using_directive (d);
- /* Enter the name space. */
+ /* Enter the name space. */
current_namespace = d;
}
@@ -2455,7 +2492,7 @@ set_identifier_type_value_with_scope (id, type, b)
if (!b->namespace_p)
{
/* Shadow the marker, not the real thing, so that the marker
- gets restored later. */
+ gets restored later. */
tree old_type_value = REAL_IDENTIFIER_TYPE_VALUE (id);
b->type_shadowed
= tree_cons (id, old_type_value, b->type_shadowed);
@@ -2464,7 +2501,7 @@ set_identifier_type_value_with_scope (id, type, b)
{
tree binding = binding_for_name (id, current_namespace);
BINDING_TYPE (binding) = type;
- /* Store marker instead of real type. */
+ /* Store marker instead of real type. */
type = global_type_node;
}
SET_IDENTIFIER_TYPE_VALUE (id, type);
@@ -2480,20 +2517,20 @@ set_identifier_type_value (id, type)
set_identifier_type_value_with_scope (id, type, current_binding_level);
}
-/* Return the type associated with id. */
+/* Return the type associated with id. */
tree
identifier_type_value (id)
tree id;
{
- /* There is no type with that name, anywhere. */
+ /* There is no type with that name, anywhere. */
if (REAL_IDENTIFIER_TYPE_VALUE (id) == NULL_TREE)
return NULL_TREE;
- /* This is not the type marker, but the real thing. */
+ /* This is not the type marker, but the real thing. */
if (REAL_IDENTIFIER_TYPE_VALUE (id) != global_type_node)
return REAL_IDENTIFIER_TYPE_VALUE (id);
/* Have to search for it. It must be on the global level, now.
- Ask lookup_name not to return non-types. */
+ Ask lookup_name not to return non-types. */
id = lookup_name_real (id, 2, 1, 0);
if (id)
return TREE_TYPE (id);
@@ -2524,7 +2561,7 @@ pop_everything ()
/* The type TYPE is being declared. If it is a class template, or a
specialization of a class template, do any processing required and
- perform error-checking. If IS_FRIEND is non-zero, this TYPE is
+ perform error-checking. If IS_FRIEND is nonzero, this TYPE is
being declared a friend. B is the binding level at which this TYPE
should be bound.
@@ -2666,7 +2703,7 @@ pushtag (name, type, globalize)
/* We may be defining a new type in the initializer
of a static member variable. We allow this when
not pedantic, and it is particularly useful for
- type punning via an anonymous union. */
+ type punning via an anonymous union. */
|| COMPLETE_TYPE_P (b->this_class))))
b = b->level_chain;
@@ -3025,7 +3062,7 @@ duplicate_decls (newdecl, olddecl)
}
}
- /* Check for redeclaration and other discrepancies. */
+ /* Check for redeclaration and other discrepancies. */
if (TREE_CODE (olddecl) == FUNCTION_DECL
&& DECL_ARTIFICIAL (olddecl))
{
@@ -3227,7 +3264,7 @@ duplicate_decls (newdecl, olddecl)
else if (TREE_CODE (newdecl) == NAMESPACE_DECL
&& DECL_NAMESPACE_ALIAS (newdecl)
&& DECL_NAMESPACE_ALIAS (newdecl) == DECL_NAMESPACE_ALIAS (olddecl))
- /* Redeclaration of namespace alias, ignore it. */
+ /* Redeclaration of namespace alias, ignore it. */
return 1;
else
{
@@ -3357,9 +3394,9 @@ duplicate_decls (newdecl, olddecl)
definition. */
if (warn_redundant_decls && ! DECL_ARTIFICIAL (olddecl)
&& !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE)
- /* Don't warn about extern decl followed by definition. */
+ /* Don't warn about extern decl followed by definition. */
&& !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl))
- /* Don't warn about friends, let add_friend take care of it. */
+ /* Don't warn about friends, let add_friend take care of it. */
&& ! (DECL_FRIEND_P (newdecl) || DECL_FRIEND_P (olddecl)))
{
warning ("redundant redeclaration of `%D' in same scope", newdecl);
@@ -3388,7 +3425,6 @@ duplicate_decls (newdecl, olddecl)
except for any that we copy here from the old type. */
DECL_ATTRIBUTES (newdecl)
= (*targetm.merge_decl_attributes) (olddecl, newdecl);
- decl_attributes (&newdecl, DECL_ATTRIBUTES (newdecl), 0);
if (TREE_CODE (newdecl) == TEMPLATE_DECL)
{
@@ -3425,7 +3461,11 @@ duplicate_decls (newdecl, olddecl)
newtype = oldtype;
if (TREE_CODE (newdecl) == VAR_DECL)
- DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl);
+ {
+ DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl);
+ DECL_INITIALIZED_P (newdecl) |= DECL_INITIALIZED_P (olddecl);
+ }
+
/* Do this after calling `merge_types' so that default
parameters don't confuse us. */
else if (TREE_CODE (newdecl) == FUNCTION_DECL
@@ -3860,7 +3900,7 @@ pushdecl (x)
else if ((DECL_EXTERN_C_FUNCTION_P (x)
|| DECL_FUNCTION_TEMPLATE_P (x))
&& is_overloaded_fn (t))
- /* Don't do anything just yet. */;
+ /* Don't do anything just yet. */;
else if (t == wchar_decl_node)
{
if (pedantic && ! DECL_IN_SYSTEM_HEADER (x))
@@ -3931,7 +3971,7 @@ pushdecl (x)
/* If declaring a type as a typedef, copy the type (unless we're
at line 0), and install this TYPE_DECL as the new type's typedef
- name. See the extensive comment in ../c-decl.c (pushdecl). */
+ name. See the extensive comment in ../c-decl.c (pushdecl). */
if (TREE_CODE (x) == TYPE_DECL)
{
tree type = TREE_TYPE (x);
@@ -4301,7 +4341,7 @@ maybe_push_decl (decl)
|| (TREE_CODE (decl) != PARM_DECL
&& DECL_CONTEXT (decl) != NULL_TREE
/* Definitions of namespace members outside their namespace are
- possible. */
+ possible. */
&& TREE_CODE (DECL_CONTEXT (decl)) != NAMESPACE_DECL)
|| (TREE_CODE (decl) == TEMPLATE_DECL && !namespace_bindings_p ())
|| TREE_CODE (type) == UNKNOWN_TYPE
@@ -4431,11 +4471,11 @@ push_using_directive (used)
tree ud = current_binding_level->using_directives;
tree iter, ancestor;
- /* Check if we already have this. */
+ /* Check if we already have this. */
if (purpose_member (used, ud) != NULL_TREE)
return NULL_TREE;
- /* Recursively add all namespaces used. */
+ /* Recursively add all namespaces used. */
for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter))
push_using_directive (TREE_PURPOSE (iter));
@@ -4643,7 +4683,7 @@ redeclaration_error_message (newdecl, olddecl)
return 0;
/* If both functions come from different namespaces, this is not
- a redeclaration - this is a conflict with a used function. */
+ a redeclaration - this is a conflict with a used function. */
if (DECL_NAMESPACE_SCOPE_P (olddecl)
&& DECL_CONTEXT (olddecl) != DECL_CONTEXT (newdecl))
return "`%D' conflicts with used function";
@@ -5257,7 +5297,7 @@ lookup_tag (form, name, binding_level, thislevel_only)
int thislevel_only;
{
register struct cp_binding_level *level;
- /* Non-zero if, we should look past a template parameter level, even
+ /* Nonzero if, we should look past a template parameter level, even
if THISLEVEL_ONLY. */
int allow_template_parms_p = 1;
@@ -5273,7 +5313,7 @@ lookup_tag (form, name, binding_level, thislevel_only)
return TREE_VALUE (tail);
}
else if (level->namespace_p)
- /* Do namespace lookup. */
+ /* Do namespace lookup. */
for (tail = current_namespace; 1; tail = CP_DECL_CONTEXT (tail))
{
tree old = binding_for_name (name, tail);
@@ -5340,7 +5380,7 @@ lookup_tag (form, name, binding_level, thislevel_only)
are in the pseudo-global level created for the
template parameters, rather than the (surrounding)
namespace level. Thus, we keep going one more level,
- even though THISLEVEL_ONLY is non-zero. */
+ even though THISLEVEL_ONLY is nonzero. */
allow_template_parms_p = 0;
continue;
}
@@ -5364,7 +5404,7 @@ set_current_level_tags_transparency (tags_transparent)
Otherwise return 0. However, the value can never be 0
in the cases in which this is used.
- C++: If NAME is non-zero, this is the new name to install. This is
+ C++: If NAME is nonzero, this is the new name to install. This is
done when replacing anonymous tags with real tag names. */
static tree
@@ -5402,7 +5442,7 @@ lookup_namespace_name (namespace, name)
my_friendly_assert (TREE_CODE (namespace) == NAMESPACE_DECL, 370);
if (TREE_CODE (name) == NAMESPACE_DECL)
- /* This happens for A::B<int> when B is a namespace. */
+ /* This happens for A::B<int> when B is a namespace. */
return name;
else if (TREE_CODE (name) == TEMPLATE_DECL)
{
@@ -5479,8 +5519,8 @@ typename_hash (k)
hashval_t hash;
tree t = (tree) k;
- hash = (((hashval_t) TYPE_CONTEXT (t))
- ^ ((hashval_t) DECL_NAME (TYPE_NAME (t))));
+ hash = (htab_hash_pointer (TYPE_CONTEXT (t))
+ ^ htab_hash_pointer (DECL_NAME (TYPE_NAME (t))));
return hash;
}
@@ -5750,7 +5790,7 @@ make_unbound_class_template (context, name, complain)
return t;
}
-/* Select the right _DECL from multiple choices. */
+/* Select the right _DECL from multiple choices. */
static tree
select_decl (binding, flags)
@@ -5762,7 +5802,7 @@ select_decl (binding, flags)
if (LOOKUP_NAMESPACES_ONLY (flags))
{
- /* We are not interested in types. */
+ /* We are not interested in types. */
if (val && TREE_CODE (val) == NAMESPACE_DECL)
return val;
return NULL_TREE;
@@ -5774,7 +5814,7 @@ select_decl (binding, flags)
&& (!val || ((flags & LOOKUP_PREFER_TYPES)
&& TREE_CODE (val) != TYPE_DECL)))
val = TYPE_STUB_DECL (BINDING_TYPE (binding));
- /* Don't return non-types if we really prefer types. */
+ /* Don't return non-types if we really prefer types. */
else if (val && LOOKUP_TYPES_ONLY (flags) && TREE_CODE (val) != TYPE_DECL
&& (TREE_CODE (val) != TEMPLATE_DECL
|| !DECL_CLASS_TEMPLATE_P (val)))
@@ -5820,28 +5860,28 @@ unqualified_namespace_lookup (name, flags, spacesp)
}
else
{
- /* Initialize binding for this context. */
+ /* Initialize binding for this context. */
BINDING_VALUE (b) = BINDING_VALUE (val);
BINDING_TYPE (b) = BINDING_TYPE (val);
}
- /* Add all _DECLs seen through local using-directives. */
+ /* Add all _DECLs seen through local using-directives. */
for (level = current_binding_level;
!level->namespace_p;
level = level->level_chain)
if (!lookup_using_namespace (name, b, level->using_directives,
scope, flags, spacesp))
- /* Give up because of error. */
+ /* Give up because of error. */
return error_mark_node;
- /* Add all _DECLs seen through global using-directives. */
- /* XXX local and global using lists should work equally. */
+ /* Add all _DECLs seen through global using-directives. */
+ /* XXX local and global using lists should work equally. */
siter = initial;
while (1)
{
if (!lookup_using_namespace (name, b, DECL_NAMESPACE_USING (siter),
scope, flags, spacesp))
- /* Give up because of error. */
+ /* Give up because of error. */
return error_mark_node;
if (siter == scope) break;
siter = CP_DECL_CONTEXT (siter);
@@ -5987,7 +6027,7 @@ check_for_out_of_scope_variable (tree decl)
If PREFER_TYPE is -2, we're being called from yylex(). (UGLY)
Otherwise we prefer non-TYPE_DECLs.
- If NONCLASS is non-zero, we don't look for the NAME in class scope,
+ If NONCLASS is nonzero, we don't look for the NAME in class scope,
using IDENTIFIER_CLASS_VALUE. */
static tree
@@ -6002,7 +6042,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
int flags;
int val_is_implicit_typename = 0;
- /* Hack: copy flag set by parser, if set. */
+ /* Hack: copy flag set by parser, if set. */
if (only_namespace_names)
namespaces_only = 1;
@@ -6015,7 +6055,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
prefer_type = looking_for_typename;
flags = lookup_flags (prefer_type, namespaces_only);
- /* If the next thing is '<', class templates are types. */
+ /* If the next thing is '<', class templates are types. */
if (looking_for_template)
flags |= LOOKUP_TEMPLATES_EXPECTED;
@@ -6086,7 +6126,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
else
{
flags = lookup_flags (prefer_type, namespaces_only);
- /* If we're not parsing, we need to complain. */
+ /* If we're not parsing, we need to complain. */
flags |= LOOKUP_COMPLAIN;
}
@@ -6310,7 +6350,7 @@ record_builtin_type (rid_index, name, type)
tdecl = pushdecl (build_decl (TYPE_DECL, tname, type));
set_identifier_type_value (tname, NULL_TREE);
if ((int) rid_index < (int) RID_MAX)
- /* Built-in types live in the global namespace. */
+ /* Built-in types live in the global namespace. */
SET_IDENTIFIER_GLOBAL_VALUE (tname, tdecl);
}
if (rname != NULL_TREE)
@@ -6342,12 +6382,12 @@ record_builtin_java_type (name, size)
if (size > 0)
type = make_signed_type (size);
else if (size > -32)
- { /* "__java_char" or ""__java_boolean". */
+ { /* "__java_char" or ""__java_boolean". */
type = make_unsigned_type (-size);
/*if (size == -1) TREE_SET_CODE (type, BOOLEAN_TYPE);*/
}
else
- { /* "__java_float" or ""__java_double". */
+ { /* "__java_float" or ""__java_double". */
type = make_node (REAL_TYPE);
TYPE_PRECISION (type) = - size;
layout_type (type);
@@ -6357,14 +6397,14 @@ record_builtin_java_type (name, size)
/* Suppress generate debug symbol entries for these types,
since for normal C++ they are just clutter.
- However, push_lang_context undoes this if extern "Java" is seen. */
+ However, push_lang_context undoes this if extern "Java" is seen. */
DECL_IGNORED_P (decl) = 1;
TYPE_FOR_JAVA (type) = 1;
return type;
}
-/* Push a type into the namespace so that the back-ends ignore it. */
+/* Push a type into the namespace so that the back-ends ignore it. */
static void
record_unknown_type (type, name)
@@ -6390,7 +6430,7 @@ typedef struct predefined_identifier
const char *const name;
/* The place where the IDENTIFIER_NODE should be stored. */
tree *const node;
- /* Non-zero if this is the name of a constructor or destructor. */
+ /* Nonzero if this is the name of a constructor or destructor. */
const int ctor_or_dtor_p;
} predefined_identifier;
@@ -6452,7 +6492,7 @@ cxx_init_decl_processing ()
/* Create the global variables. */
push_to_top_level ();
- /* Enter the global namespace. */
+ /* Enter the global namespace. */
my_friendly_assert (global_namespace == NULL_TREE, 375);
push_namespace (get_identifier ("::"));
global_namespace = current_namespace;
@@ -6472,6 +6512,12 @@ cxx_init_decl_processing ()
flag_inline_functions = 0;
}
+ /* Force minimum function alignment if using the least significant
+ bit of function pointers to store the virtual bit. */
+ if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
+ && force_align_functions_log < 1)
+ force_align_functions_log = 1;
+
/* Initially, C. */
current_lang_name = lang_name_c;
@@ -6637,7 +6683,7 @@ cxx_init_decl_processing ()
/* Generate an initializer for a function naming variable from
NAME. NAME may be NULL, in which case we generate a special
- ERROR_MARK node which should be replaced later. */
+ ERROR_MARK node which should be replaced later. */
tree
cp_fname_init (name)
@@ -6662,7 +6708,7 @@ cp_fname_init (name)
TREE_TYPE (init) = type;
else
/* We don't know the value until instantiation time. Make
- something which will be digested now, but replaced later. */
+ something which will be digested now, but replaced later. */
init = build (ERROR_MARK, type);
return init;
@@ -6684,7 +6730,7 @@ cp_make_fname_decl (id, type_dep)
tree init = cp_fname_init (name);
tree decl = build_decl (VAR_DECL, id, TREE_TYPE (init));
- /* As we don't push the decl here, we must set the context. */
+ /* As we don't push the decl here, we must set the context. */
DECL_CONTEXT (decl) = current_function_decl;
DECL_PRETTY_FUNCTION_P (decl) = type_dep;
@@ -7231,11 +7277,11 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
&& context != current_namespace && TREE_CODE (decl) == VAR_DECL)
{
/* When parsing the initializer, lookup should use the object's
- namespace. */
+ namespace. */
push_decl_namespace (context);
}
- /* We are only interested in class contexts, later. */
+ /* We are only interested in class contexts, later. */
if (context && TREE_CODE (context) == NAMESPACE_DECL)
context = NULL_TREE;
@@ -7246,14 +7292,8 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
switch (TREE_CODE (decl))
{
case TYPE_DECL:
- /* typedef foo = bar means give foo the same type as bar.
- We haven't parsed bar yet, so `cp_finish_decl' will fix that up.
- Any other case of an initialization in a TYPE_DECL is an error. */
- if (pedantic || list_length (declspecs) > 1)
- {
- error ("typedef `%D' is initialized", decl);
- initialized = 0;
- }
+ error ("typedef `%D' is initialized (use __typeof__ instead)", decl);
+ initialized = 0;
break;
case FUNCTION_DECL:
@@ -7513,45 +7553,6 @@ grok_reference_init (decl, type, init)
return NULL_TREE;
}
-/* Fill in DECL_INITIAL with some magical value to prevent expand_decl from
- mucking with forces it does not comprehend (i.e. initialization with a
- constructor). If we are at global scope and won't go into COMMON, fill
- it in with a dummy CONSTRUCTOR to force the variable into .data;
- otherwise we can use error_mark_node. */
-
-static tree
-obscure_complex_init (decl, init)
- tree decl, init;
-{
- if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
- {
- error ("run-time initialization of thread-local storage");
- return NULL_TREE;
- }
-
- if (! flag_no_inline && TREE_STATIC (decl))
- {
- if (extract_init (decl, init))
- return NULL_TREE;
- }
-
-#if ! defined (ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS)
- if (toplevel_bindings_p () && ! DECL_COMMON (decl))
- DECL_INITIAL (decl) = build (CONSTRUCTOR, TREE_TYPE (decl), NULL_TREE,
- NULL_TREE);
- else
-#endif
- {
- if (zero_init_p (TREE_TYPE (decl)))
- DECL_INITIAL (decl) = error_mark_node;
- /* Otherwise, force_store_init_value will have already stored a
- zero-init initializer in DECL_INITIAL, that should be
- retained. */
- }
-
- return init;
-}
-
/* When parsing `int a[] = {1, 2};' we don't know the size of the
array until we finish parsing the initializer. If that's the
situation we're in, update DECL accordingly. */
@@ -7616,7 +7617,11 @@ layout_var_decl (decl)
`extern X x' for some incomplete type `X'.) */
if (!DECL_EXTERNAL (decl))
complete_type (type);
- if (!DECL_SIZE (decl) && COMPLETE_TYPE_P (type))
+ if (!DECL_SIZE (decl)
+ && (COMPLETE_TYPE_P (type)
+ || (TREE_CODE (type) == ARRAY_TYPE
+ && !TYPE_DOMAIN (type)
+ && COMPLETE_TYPE_P (TREE_TYPE (type)))))
layout_decl (decl, 0);
if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
@@ -7729,26 +7734,233 @@ check_for_uninitialized_const_var (decl)
error ("uninitialized const `%D'", decl);
}
-/* Verify INIT (the initializer for DECL), and record the
- initialization in DECL_INITIAL, if appropriate. Returns a new
- value for INIT. */
+/* FIELD is a FIELD_DECL or NULL. In the former case, the value
+ returned is the next FIELD_DECL (possibly FIELD itself) that can be
+ initialized. If there are no more such fields, the return value
+ will be NULL. */
static tree
-check_initializer (decl, init)
- tree decl;
- tree init;
+next_initializable_field (tree field)
{
- tree type;
+ while (field
+ && (TREE_CODE (field) != FIELD_DECL
+ || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field))
+ || DECL_ARTIFICIAL (field)))
+ field = TREE_CHAIN (field);
- if (TREE_CODE (decl) == FIELD_DECL)
- return init;
+ return field;
+}
- type = TREE_TYPE (decl);
+/* Undo the brace-elision allowed by [dcl.init.aggr] in a
+ brace-enclosed aggregate initializer.
+
+ *INITP is one of a list of initializers describing a brace-enclosed
+ initializer for an entity of the indicated aggregate TYPE. It may
+ not presently match the shape of the TYPE; for example:
+
+ struct S { int a; int b; };
+ struct S a[] = { 1, 2, 3, 4 };
+
+ Here *INITP will point to TREE_LIST of four elements, rather than a
+ list of two elements, each itself a list of two elements. This
+ routine transforms INIT from the former form into the latter. The
+ revised initializer is returned. */
+
+static tree
+reshape_init (tree type, tree *initp)
+{
+ tree inits;
+ tree old_init;
+ tree old_init_value;
+ tree new_init;
+ bool brace_enclosed_p;
+
+ old_init = *initp;
+ old_init_value = (TREE_CODE (*initp) == TREE_LIST
+ ? TREE_VALUE (*initp) : old_init);
+
+ /* If the initializer is brace-enclosed, pull initializers from the
+ enclosed elements. Advance past the brace-enclosed initializer
+ now. */
+ if (TREE_CODE (old_init_value) == CONSTRUCTOR
+ && TREE_HAS_CONSTRUCTOR (old_init_value))
+ {
+ *initp = TREE_CHAIN (old_init);
+ TREE_CHAIN (old_init) = NULL_TREE;
+ inits = CONSTRUCTOR_ELTS (old_init_value);
+ initp = &inits;
+ brace_enclosed_p = true;
+ }
+ else
+ {
+ inits = NULL_TREE;
+ brace_enclosed_p = false;
+ }
+
+ /* A non-aggregate type is always initialized with a single
+ initializer. */
+ if (!CP_AGGREGATE_TYPE_P (type))
+ {
+ *initp = TREE_CHAIN (old_init);
+ TREE_CHAIN (old_init) = NULL_TREE;
+ /* It is invalid to initialize a non-aggregate type with a
+ brace-enclosed initializer. */
+ if (brace_enclosed_p)
+ {
+ error ("brace-enclosed initializer used to initialize `%T'",
+ type);
+ if (TREE_CODE (old_init) == TREE_LIST)
+ TREE_VALUE (old_init) = error_mark_node;
+ else
+ old_init = error_mark_node;
+ }
+
+ return old_init;
+ }
+
+ /* [dcl.init.aggr]
+
+ All implicit type conversions (clause _conv_) are considered when
+ initializing the aggregate member with an initializer from an
+ initializer-list. If the initializer can initialize a member,
+ the member is initialized. Otherwise, if the member is itself a
+ non-empty subaggregate, brace elision is assumed and the
+ initializer is considered for the initialization of the first
+ member of the subaggregate. */
+ if (CLASS_TYPE_P (type)
+ && !brace_enclosed_p
+ && can_convert_arg (type, TREE_TYPE (old_init_value), old_init_value))
+ {
+ *initp = TREE_CHAIN (old_init);
+ TREE_CHAIN (old_init) = NULL_TREE;
+ return old_init;
+ }
+
+ if (TREE_CODE (old_init_value) == STRING_CST
+ && TREE_CODE (type) == ARRAY_TYPE
+ && char_type_p (TREE_TYPE (type)))
+ {
+ /* [dcl.init.string]
+
+ A char array (whether plain char, signed char, or unsigned char)
+ can be initialized by a string-literal (optionally enclosed in
+ braces); a wchar_t array can be initialized by a wide
+ string-literal (optionally enclosed in braces). */
+ new_init = old_init;
+ /* Move past the initializer. */
+ *initp = TREE_CHAIN (old_init);
+ TREE_CHAIN (old_init) = NULL_TREE;
+ }
+ else
+ {
+ /* Build a CONSTRUCTOR to hold the contents of the aggregate. */
+ new_init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
+ TREE_HAS_CONSTRUCTOR (new_init) = 1;
+
+ if (CLASS_TYPE_P (type))
+ {
+ tree field;
+
+ field = next_initializable_field (TYPE_FIELDS (type));
+
+ if (!field)
+ {
+ /* [dcl.init.aggr]
+
+ An initializer for an aggregate member that is an
+ empty class shall have the form of an empty
+ initializer-list {}. */
+ if (!brace_enclosed_p)
+ error ("initializer for `%T' must be brace-enclosed",
+ type);
+ }
+ else
+ {
+ /* Loop through the initializable fields, gathering
+ initializers. */
+ while (*initp && field)
+ {
+ tree field_init;
+
+ field_init = reshape_init (TREE_TYPE (field), initp);
+ TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init);
+ CONSTRUCTOR_ELTS (new_init) = field_init;
+ /* [dcl.init.aggr]
+
+ When a union is initialized with a brace-enclosed
+ initializer, the braces shall only contain an
+ initializer for the first member of the union. */
+ if (TREE_CODE (type) == UNION_TYPE)
+ break;
+ if (TREE_PURPOSE (field_init))
+ field = TREE_PURPOSE (field_init);
+ field = next_initializable_field (TREE_CHAIN (field));
+ }
+ }
+ }
+ else if (TREE_CODE (type) == ARRAY_TYPE)
+ {
+ tree index;
+ tree max_index;
+
+ /* If the bound of the array is known, take no more initializers
+ than are allowed. */
+ max_index = (TYPE_DOMAIN (type)
+ ? array_type_nelts (type) : NULL_TREE);
+ /* Loop through the array elements, gathering initializers. */
+ for (index = size_zero_node;
+ *initp && (!max_index || !tree_int_cst_lt (max_index, index));
+ index = size_binop (PLUS_EXPR, index, size_one_node))
+ {
+ tree element_init;
+
+ element_init = reshape_init (TREE_TYPE (type), initp);
+ TREE_CHAIN (element_init) = CONSTRUCTOR_ELTS (new_init);
+ CONSTRUCTOR_ELTS (new_init) = element_init;
+ if (TREE_PURPOSE (element_init))
+ index = TREE_PURPOSE (element_init);
+ }
+ }
+ else
+ abort ();
+
+ /* The initializers were placed in reverse order in the
+ CONSTRUCTOR. */
+ CONSTRUCTOR_ELTS (new_init) = nreverse (CONSTRUCTOR_ELTS (new_init));
+
+ if (TREE_CODE (old_init) == TREE_LIST)
+ new_init = build_tree_list (TREE_PURPOSE (old_init), new_init);
+ }
+
+ /* If this was a brace-enclosed initializer and all of the
+ initializers were not used up, there is a problem. */
+ if (brace_enclosed_p && *initp)
+ error ("too many initializers for `%T'", type);
+
+ return new_init;
+}
+
+/* Verify INIT (the initializer for DECL), and record the
+ initialization in DECL_INITIAL, if appropriate.
+
+ If the return value is non-NULL, it is an expression that must be
+ evaluated dynamically to initialize DECL. */
+
+static tree
+check_initializer (tree decl, tree init, int flags)
+{
+ tree type = TREE_TYPE (decl);
/* If `start_decl' didn't like having an initialization, ignore it now. */
if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE)
init = NULL_TREE;
+ /* If an initializer is present, DECL_INITIAL has been
+ error_mark_node, to indicate that an as-of-yet unevaluated
+ initialization will occur. From now on, DECL_INITIAL reflects
+ the static initialization -- if any -- of DECL. */
+ DECL_INITIAL (decl) = NULL_TREE;
+
/* Check the initializer. */
if (init)
{
@@ -7788,37 +8000,52 @@ check_initializer (decl, init)
init = NULL_TREE;
}
else if (!DECL_EXTERNAL (decl) && TREE_CODE (type) == REFERENCE_TYPE)
- {
- init = grok_reference_init (decl, type, init);
- if (init)
- init = obscure_complex_init (decl, init);
- }
- else if (!DECL_EXTERNAL (decl) && !zero_init_p (type))
- {
- force_store_init_value (decl, build_forced_zero_init (type));
-
- if (init)
- goto process_init;
- }
+ init = grok_reference_init (decl, type, init);
else if (init)
{
- process_init:
+ if (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init))
+ init = reshape_init (type, &init);
+
+ /* If DECL has an array type without a specific bound, deduce the
+ array size from the initializer. */
+ maybe_deduce_size_from_array_init (decl, init);
+ type = TREE_TYPE (decl);
+ if (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init))
+ TREE_TYPE (init) = type;
+
if (TYPE_HAS_CONSTRUCTOR (type) || TYPE_NEEDS_CONSTRUCTING (type))
{
if (TREE_CODE (type) == ARRAY_TYPE)
- init = digest_init (type, init, (tree *) 0);
+ goto initialize_aggr;
else if (TREE_CODE (init) == CONSTRUCTOR
&& TREE_HAS_CONSTRUCTOR (init))
{
if (TYPE_NON_AGGREGATE_CLASS (type))
{
error ("`%D' must be initialized by constructor, not by `{...}'",
- decl);
+ decl);
init = error_mark_node;
}
else
goto dont_use_constructor;
}
+ else
+ {
+ int saved_stmts_are_full_exprs_p;
+
+ initialize_aggr:
+ saved_stmts_are_full_exprs_p = 0;
+ if (building_stmt_tree ())
+ {
+ saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
+ current_stmt_tree ()->stmts_are_full_exprs_p = 1;
+ }
+ init = build_aggr_init (decl, init, flags);
+ if (building_stmt_tree ())
+ current_stmt_tree ()->stmts_are_full_exprs_p =
+ saved_stmts_are_full_exprs_p;
+ return init;
+ }
}
else
{
@@ -7826,37 +8053,29 @@ check_initializer (decl, init)
if (TREE_CODE (init) != TREE_VEC)
init = store_init_value (decl, init);
}
-
- if (init)
- /* We must hide the initializer so that expand_decl
- won't try to do something it does not understand. */
- init = obscure_complex_init (decl, init);
}
else if (DECL_EXTERNAL (decl))
;
- else if (TYPE_P (type)
- && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type)))
+ else if (TYPE_P (type) && TYPE_NEEDS_CONSTRUCTING (type))
+ goto initialize_aggr;
+ else if (IS_AGGR_TYPE (type))
{
tree core_type = strip_array_types (type);
- if (! TYPE_NEEDS_CONSTRUCTING (core_type))
- {
- if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type))
- error ("structure `%D' with uninitialized const members", decl);
- if (CLASSTYPE_REF_FIELDS_NEED_INIT (core_type))
- error ("structure `%D' with uninitialized reference members",
- decl);
- }
+ if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type))
+ error ("structure `%D' with uninitialized const members", decl);
+ if (CLASSTYPE_REF_FIELDS_NEED_INIT (core_type))
+ error ("structure `%D' with uninitialized reference members",
+ decl);
check_for_uninitialized_const_var (decl);
-
- if (COMPLETE_TYPE_P (type) && TYPE_NEEDS_CONSTRUCTING (type))
- init = obscure_complex_init (decl, NULL_TREE);
-
}
else
check_for_uninitialized_const_var (decl);
+ if (init && init != error_mark_node)
+ init = build (INIT_EXPR, type, decl, init);
+
return init;
}
@@ -7990,35 +8209,25 @@ maybe_inject_for_scope_var (decl)
/* Generate code to initialize DECL (a local variable). */
-void
-initialize_local_var (decl, init, flags)
+static void
+initialize_local_var (decl, init)
tree decl;
tree init;
- int flags;
{
tree type = TREE_TYPE (decl);
- /* If the type is bogus, don't bother initializing the variable. */
- if (type == error_mark_node)
- return;
+ my_friendly_assert (TREE_CODE (decl) == VAR_DECL
+ || TREE_CODE (decl) == RESULT_DECL,
+ 20021010);
+ my_friendly_assert (!TREE_STATIC (decl), 20021010);
- if (DECL_SIZE (decl) == NULL_TREE && !TREE_STATIC (decl))
+ if (DECL_SIZE (decl) == NULL_TREE)
{
/* If we used it already as memory, it must stay in memory. */
DECL_INITIAL (decl) = NULL_TREE;
TREE_ADDRESSABLE (decl) = TREE_USED (decl);
}
- /* Local statics are handled differently from ordinary automatic
- variables. */
- if (TREE_STATIC (decl))
- {
- if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE
- || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
- expand_static_init (decl, init);
- return;
- }
-
if (DECL_SIZE (decl) && type != error_mark_node)
{
int already_used;
@@ -8026,14 +8235,15 @@ initialize_local_var (decl, init, flags)
/* Compute and store the initial value. */
already_used = TREE_USED (decl) || TREE_USED (type);
- if (init || TYPE_NEEDS_CONSTRUCTING (type))
+ /* Perform the initialization. */
+ if (init)
{
int saved_stmts_are_full_exprs_p;
my_friendly_assert (building_stmt_tree (), 20000906);
saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
current_stmt_tree ()->stmts_are_full_exprs_p = 1;
- finish_expr_stmt (build_aggr_init (decl, init, flags));
+ finish_expr_stmt (init);
current_stmt_tree ()->stmts_are_full_exprs_p =
saved_stmts_are_full_exprs_p;
}
@@ -8052,39 +8262,19 @@ initialize_local_var (decl, init, flags)
else if (already_used)
TREE_USED (decl) = 1;
}
-}
-
-/* Generate code to destroy DECL (a local variable). */
-
-static void
-destroy_local_var (decl)
- tree decl;
-{
- tree type = TREE_TYPE (decl);
- tree cleanup;
- /* Only variables get cleaned up. */
- if (TREE_CODE (decl) != VAR_DECL)
- return;
-
- /* And only things with destructors need cleaning up. */
- if (type == error_mark_node
- || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
- return;
-
- if (TREE_CODE (decl) == VAR_DECL &&
- (DECL_EXTERNAL (decl) || TREE_STATIC (decl)))
- /* We don't clean up things that aren't defined in this
- translation unit, or that need a static cleanup. The latter
- are handled by finish_file. */
- return;
-
- /* Compute the cleanup. */
- cleanup = cxx_maybe_build_cleanup (decl);
+ /* Generate a cleanup, if necessary. */
+ if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
+ {
+ tree cleanup;
- /* Record the cleanup required for this declaration. */
- if (DECL_SIZE (decl) && cleanup)
- finish_decl_cleanup (decl, cleanup);
+ /* Compute the cleanup. */
+ cleanup = cxx_maybe_build_cleanup (decl);
+
+ /* Record the cleanup required for this declaration. */
+ if (DECL_SIZE (decl) && cleanup)
+ finish_decl_cleanup (decl, cleanup);
+ }
}
/* Finish processing of a declaration;
@@ -8141,7 +8331,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
&& DECL_CONTEXT (decl) != current_namespace
&& init)
{
- /* Leave the namespace of the object. */
+ /* Leave the namespace of the object. */
pop_decl_namespace ();
}
@@ -8171,12 +8361,6 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
/* Take care of TYPE_DECLs up front. */
if (TREE_CODE (decl) == TYPE_DECL)
{
- if (init && DECL_INITIAL (decl))
- {
- /* typedef foo = bar; store the type of bar as the type of foo. */
- TREE_TYPE (decl) = type = TREE_TYPE (init);
- DECL_INITIAL (decl) = init = NULL_TREE;
- }
if (type != error_mark_node
&& IS_AGGR_TYPE (type) && DECL_NAME (decl))
{
@@ -8220,10 +8404,58 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
make_decl_rtl (decl, asmspec);
}
-
- /* Deduce size of array from initialization, if not already known. */
- init = check_initializer (decl, init);
- maybe_deduce_size_from_array_init (decl, init);
+ else if (TREE_CODE (decl) == RESULT_DECL)
+ init = check_initializer (decl, init, flags);
+ else if (TREE_CODE (decl) == VAR_DECL)
+ {
+ /* Only PODs can have thread-local storage. Other types may require
+ various kinds of non-trivial initialization. */
+ if (DECL_THREAD_LOCAL (decl) && !pod_type_p (TREE_TYPE (decl)))
+ error ("`%D' cannot be thread-local because it has non-POD type `%T'",
+ decl, TREE_TYPE (decl));
+ /* Convert the initializer to the type of DECL, if we have not
+ already initialized DECL. */
+ if (!DECL_INITIALIZED_P (decl)
+ /* If !DECL_EXTERNAL then DECL is being defined. In the
+ case of a static data member initialized inside the
+ class-specifier, there can be an initializer even if DECL
+ is *not* defined. */
+ && (!DECL_EXTERNAL (decl) || init))
+ {
+ init = check_initializer (decl, init, flags);
+ /* Thread-local storage cannot be dynamically initialized. */
+ if (DECL_THREAD_LOCAL (decl) && init)
+ {
+ error ("`%D' is thread-local and so cannot be dynamically "
+ "initialized", decl);
+ init = NULL_TREE;
+ }
+ /* Handle:
+
+ [dcl.init]
+
+ The memory occupied by any object of static storage
+ duration is zero-initialized at program startup before
+ any other initialization takes place.
+
+ We cannot create an appropriate initializer until after
+ the type of DECL is finalized. If DECL_INITIAL is set,
+ then the DECL is statically initialized, and any
+ necessary zero-initialization has already been performed. */
+ if (TREE_STATIC (decl) && !DECL_INITIAL (decl))
+ DECL_INITIAL (decl) = build_zero_init (TREE_TYPE (decl),
+ /*static_storage_p=*/true);
+ /* Remember that the initialization for this variable has
+ taken place. */
+ DECL_INITIALIZED_P (decl) = 1;
+ }
+ /* If the variable has an array type, lay out the type, even if
+ there is no initializer. It is valid to index through the
+ array, and we must get TYPE_ALIGN set correctly on the array
+ type. */
+ else if (TREE_CODE (type) == ARRAY_TYPE)
+ layout_type (type);
+ }
/* Add this declaration to the statement-tree. This needs to happen
after the call to check_initializer so that the DECL_STMT for a
@@ -8254,7 +8486,9 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
else
abstract_virtuals_error (decl, strip_array_types (type));
- if (TREE_CODE (decl) == FUNCTION_DECL)
+ if (TREE_CODE (decl) == FUNCTION_DECL
+ || TREE_TYPE (decl) == error_mark_node)
+ /* No initialization required. */
;
else if (DECL_EXTERNAL (decl)
&& ! (DECL_LANG_SPECIFIC (decl)
@@ -8263,35 +8497,25 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
if (init)
DECL_INITIAL (decl) = init;
}
- else if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL)
+ else
{
- /* This is a local declaration. */
- if (doing_semantic_analysis_p ())
- maybe_inject_for_scope_var (decl);
- /* Initialize the local variable. But, if we're building a
- statement-tree, we'll do the initialization when we
- expand the tree. */
- if (processing_template_decl)
+ /* A variable definition. */
+ if (DECL_FUNCTION_SCOPE_P (decl))
{
- if (init || DECL_INITIAL (decl) == error_mark_node)
- DECL_INITIAL (decl) = init;
- }
- else
- {
- /* If we're not building RTL, then we need to do so
- now. */
- my_friendly_assert (building_stmt_tree (), 20000906);
- /* Initialize the variable. */
- initialize_local_var (decl, init, flags);
- /* Clean up the variable. */
- destroy_local_var (decl);
+ /* This is a local declaration. */
+ if (doing_semantic_analysis_p ())
+ maybe_inject_for_scope_var (decl);
+ /* Initialize the local variable. */
+ if (processing_template_decl)
+ {
+ if (init || DECL_INITIAL (decl) == error_mark_node)
+ DECL_INITIAL (decl) = init;
+ }
+ else if (!TREE_STATIC (decl))
+ initialize_local_var (decl, init);
}
- }
- else if (TREE_STATIC (decl) && type != error_mark_node)
- {
- /* Cleanups for static variables are handled by `finish_file'. */
- if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE
- || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
+
+ if (TREE_STATIC (decl))
expand_static_init (decl, init);
}
finish_end0:
@@ -8359,7 +8583,7 @@ declare_global_var (name, type)
}
/* Returns a pointer to the `atexit' function. Note that if
- FLAG_USE_CXA_ATEXIT is non-zero, then this will actually be the new
+ FLAG_USE_CXA_ATEXIT is nonzero, then this will actually be the new
`__cxa_atexit' function specified in the IA64 C++ ABI. */
static tree
@@ -8445,6 +8669,7 @@ static tree
start_cleanup_fn ()
{
static int counter = 0;
+ int old_interface_only = interface_only;
int old_interface_unknown = interface_unknown;
char name[32];
tree parmtypes;
@@ -8456,6 +8681,7 @@ start_cleanup_fn ()
/* No need to mangle this. */
push_lang_context (lang_name_c);
+ interface_only = 0;
interface_unknown = 1;
/* Build the parameter-types. */
@@ -8496,6 +8722,7 @@ start_cleanup_fn ()
start_function (/*specs=*/NULL_TREE, fndecl, NULL_TREE, SF_PRE_PARSED);
interface_unknown = old_interface_unknown;
+ interface_only = old_interface_only;
pop_lang_context ();
@@ -8568,12 +8795,27 @@ register_dtor_fn (decl)
finish_expr_stmt (build_function_call (get_atexit_node (), args));
}
-void
+/* DECL is a VAR_DECL with static storage duration. INIT, if present,
+ is its initializer. Generate code to handle the construction
+ and destruction of DECL. */
+
+static void
expand_static_init (decl, init)
tree decl;
tree init;
{
- tree oldstatic = value_member (decl, static_aggregates);
+ tree oldstatic;
+
+ my_friendly_assert (TREE_CODE (decl) == VAR_DECL, 20021010);
+ my_friendly_assert (TREE_STATIC (decl), 20021010);
+
+ /* Some variables require no initialization. */
+ if (!init
+ && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))
+ && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))
+ return;
+
+ oldstatic = value_member (decl, static_aggregates);
if (oldstatic)
{
@@ -8623,15 +8865,7 @@ expand_static_init (decl, init)
then_clause = begin_compound_stmt (/*has_no_scope=*/0);
/* Do the initialization itself. */
- if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))
- || (init && TREE_CODE (init) == TREE_LIST))
- assignment = build_aggr_init (decl, init, 0);
- else if (init)
- /* The initialization we're doing here is just a bitwise
- copy. */
- assignment = build (INIT_EXPR, TREE_TYPE (decl), decl, init);
- else
- assignment = NULL_TREE;
+ assignment = init ? init : NULL_TREE;
/* Once the assignment is complete, set TEMP to 1. Since the
construction of the static object is complete at this point,
@@ -8871,7 +9105,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
type = build_exception_variant (type, raises);
decl = build_lang_decl (FUNCTION_DECL, declarator, type);
- /* Propagate volatile out from type to decl. */
+ /* Propagate volatile out from type to decl. */
if (TYPE_VOLATILE (type))
TREE_THIS_VOLATILE (decl) = 1;
@@ -9022,7 +9256,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
/* Due to bison parser ickiness, we will have already looked
up an operator_name or PFUNCNAME within the current class
(see template_id in parse.y). If the current class contains
- such a name, we'll get a COMPONENT_REF here. Undo that. */
+ such a name, we'll get a COMPONENT_REF here. Undo that. */
my_friendly_assert (TREE_TYPE (TREE_OPERAND (fns, 0))
== current_class_type, 20001120);
@@ -9264,7 +9498,7 @@ tree
build_ptrmemfunc_type (type)
tree type;
{
- tree fields[4];
+ tree field, fields;
tree t;
tree unqualified_variant = NULL_TREE;
@@ -9290,10 +9524,14 @@ build_ptrmemfunc_type (type)
/* ... and not really an aggregate. */
SET_IS_AGGR_TYPE (t, 0);
- fields[0] = build_decl (FIELD_DECL, pfn_identifier, type);
- fields[1] = build_decl (FIELD_DECL, delta_identifier,
- delta_type_node);
- finish_builtin_type (t, "__ptrmemfunc_type", fields, 1, ptr_type_node);
+ field = build_decl (FIELD_DECL, pfn_identifier, type);
+ fields = field;
+
+ field = build_decl (FIELD_DECL, delta_identifier, delta_type_node);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+
+ finish_builtin_struct (t, "__ptrmemfunc_type", fields, ptr_type_node);
/* Zap out the name so that the back-end will give us the debugging
information for this anonymous RECORD_TYPE. */
@@ -9397,7 +9635,7 @@ compute_array_index_type (name, size)
size, integer_one_node));
}
- /* The size might be the result of a cast. */
+ /* The size might be the result of a cast. */
STRIP_TYPE_NOPS (size);
/* It might be a const variable or enumeration constant. */
@@ -9802,7 +10040,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
break;
case ADDR_EXPR: /* C++ reference declaration */
- /* Fall through. */
+ /* Fall through. */
case ARRAY_REF:
case INDIRECT_REF:
ctype = NULL_TREE;
@@ -9890,7 +10128,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
dname = DECL_NAME (get_first_fn (dname));
}
}
- /* Fall through. */
+ /* Fall through. */
case IDENTIFIER_NODE:
if (TREE_CODE (decl) == IDENTIFIER_NODE)
@@ -10019,9 +10257,18 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
case BASELINK:
next = &BASELINK_FUNCTIONS (decl);
break;
+
+ case TEMPLATE_DECL:
+ /* Sometimes, we see a template-name used as part of a
+ decl-specifier like in
+ std::allocator alloc;
+ Handle that gracefully. */
+ error ("invalid use of template-name '%E' in a declarator", decl);
+ return error_mark_node;
+ break;
default:
- internal_error ("`%D' as declarator", decl);
+ my_friendly_assert (0, 20020917);
}
}
}
@@ -10689,19 +10936,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
type = create_array_type_for_decl (dname, type, size);
- /* VLAs never work as fields. */
- if (decl_context == FIELD && !processing_template_decl
- && TREE_CODE (type) == ARRAY_TYPE
- && TYPE_DOMAIN (type) != NULL_TREE
- && !TREE_CONSTANT (TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
- {
- error ("size of member `%D' is not constant", dname);
- /* Proceed with arbitrary constant size, so that offset
- computations don't get confused. */
- type = create_array_type_for_decl (dname, TREE_TYPE (type),
- integer_one_node);
- }
-
ctype = NULL_TREE;
}
break;
@@ -10900,21 +11134,15 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (TREE_CODE (type) == REFERENCE_TYPE)
{
- error ("cannot declare %s to references",
- TREE_CODE (declarator) == ADDR_EXPR
- ? "references" : "pointers");
- declarator = TREE_OPERAND (declarator, 0);
- continue;
- }
-
- if (ctype
- && (TREE_CODE (type) == VOID_TYPE
- || TREE_CODE (type) == REFERENCE_TYPE))
- {
- error ("cannot declare pointer to `%#T' member",
- TREE_TYPE (type));
+ error (TREE_CODE (declarator) == ADDR_EXPR
+ ? "cannot declare reference to `%#T'"
+ : "cannot declare pointer to `%#T'", type);
type = TREE_TYPE (type);
}
+ else if (VOID_TYPE_P (type)
+ && (ctype || TREE_CODE (declarator) == ADDR_EXPR))
+ error (ctype ? "cannot declare pointer to `%#T' member"
+ : "cannot declare reference to `%#T'", type);
/* Merge any constancy or volatility into the target type
for the pointer. */
@@ -10925,9 +11153,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (TREE_CODE (declarator) == ADDR_EXPR)
{
- if (TREE_CODE (type) == VOID_TYPE)
- error ("invalid type: `void &'");
- else
+ if (!VOID_TYPE_P (type))
type = build_reference_type (type);
}
else if (TREE_CODE (type) == METHOD_TYPE)
@@ -11006,7 +11232,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* This needs to be here, in case we are called
multiple times. */ ;
else if (TREE_COMPLEXITY (declarator) == -1)
- /* Namespace member. */
+ /* Namespace member. */
pop_decl_namespace ();
else if (friendp && (TREE_COMPLEXITY (declarator) < 2))
/* Don't fall out into global scope. Hides real bug? --eichin */ ;
@@ -11189,6 +11415,14 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
type = error_mark_node;
}
+ if (decl_context == FIELD
+ && !processing_template_decl
+ && variably_modified_type_p (type))
+ {
+ error ("data member may not have variably modified type `%T'", type);
+ type = error_mark_node;
+ }
+
if (explicitp == 1 || (explicitp && friendp))
{
/* [dcl.fct.spec] The explicit specifier shall only be used in
@@ -11328,9 +11562,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
bad_specifiers (decl, "type", virtualp, quals != NULL_TREE,
inlinep, friendp, raises != NULL_TREE);
- if (initialized)
- error ("typedef declaration includes an initializer");
-
return decl;
}
@@ -11955,7 +12186,7 @@ require_complete_types_for_parms (parms)
}
}
-/* Returns non-zero if T is a local variable. */
+/* Returns nonzero if T is a local variable. */
int
local_variable_p (t)
@@ -11973,7 +12204,7 @@ local_variable_p (t)
return 0;
}
-/* Returns non-zero if T is an automatic local variable or a label.
+/* Returns nonzero if T is an automatic local variable or a label.
(These are the declarations that need to be remapped when the code
containing them is duplicated.) */
@@ -12165,7 +12396,7 @@ grokparms (first_parm)
TREE_TYPE (decl) = type;
}
else if (abstract_virtuals_error (decl, type))
- any_error = 1; /* Seems like a good idea. */
+ any_error = 1; /* Seems like a good idea. */
else if (POINTER_TYPE_P (type))
{
/* [dcl.fct]/6, parameter types cannot contain pointers
@@ -12223,7 +12454,7 @@ grokparms (first_parm)
first parameter is a reference to non-const qualified T.
This function can be used as a predicate. Positive values indicate
- a copy constructor and non-zero values indicate a copy assignment
+ a copy constructor and nonzero values indicate a copy assignment
operator. */
int
@@ -12528,7 +12759,7 @@ grok_op_properties (decl, friendp)
}
if (operator_code == CALL_EXPR)
- return; /* No restrictions on args. */
+ return; /* No restrictions on args. */
if (IDENTIFIER_TYPENAME_P (name) && ! DECL_TEMPLATE_INFO (decl))
{
@@ -12792,7 +13023,7 @@ xref_tag (enum tag_types tag_code, tree name, tree attributes,
TYPE_IDENTIFIER (t));
/* We need to remove the class scope binding for the
- TYPENAME_TYPE as otherwise poplevel_class gets confused. */
+ TYPENAME_TYPE as otherwise poplevel_class gets confused. */
for (shadowed = b->class_shadowed;
shadowed;
shadowed = TREE_CHAIN (shadowed))
@@ -12860,7 +13091,7 @@ xref_tag (enum tag_types tag_code, tree name, tree attributes,
&& template_class_depth (current_class_type)
&& PROCESSING_REAL_TEMPLATE_DECL_P ())
{
- /* Since GLOBALIZE is non-zero, we are not looking at a
+ /* Since GLOBALIZE is nonzero, we are not looking at a
definition of this tag. Since, in addition, we are currently
processing a (member) template declaration of a template
class, we must be very careful; consider:
@@ -13215,7 +13446,7 @@ finish_enum (enumtype)
for (pair = TYPE_VALUES (enumtype); pair; pair = TREE_CHAIN (pair))
TREE_TYPE (TREE_VALUE (pair)) = enumtype;
- /* For a enum defined in a template, all further processing is
+ /* For an enum defined in a template, all further processing is
postponed until the template is instantiated. */
if (processing_template_decl)
{
@@ -13353,7 +13584,7 @@ build_enumerator (name, value, enumtype)
if (TYPE_VALUES (enumtype))
{
- /* The next value is the previous value ... */
+ /* The next value is the previous value ... */
prev_value = DECL_INITIAL (TREE_VALUE (TYPE_VALUES (enumtype)));
/* ... plus one. */
value = cp_build_binary_op (PLUS_EXPR,
@@ -13403,7 +13634,7 @@ build_enumerator (name, value, enumtype)
initializing value.
In finish_enum we will reset the type. Of course, if we're
- processing a template, there may be no value. */
+ processing a template, there may be no value. */
type = value ? TREE_TYPE (value) : NULL_TREE;
if (context && context == current_class_type)
@@ -13712,7 +13943,7 @@ start_function (declspecs, declarator, attrs, flags)
decl1 = pushdecl (decl1);
else
{
- /* We need to set the DECL_CONTEXT. */
+ /* We need to set the DECL_CONTEXT. */
if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1))
DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1));
/* And make sure we have enough default args. */
@@ -14290,7 +14521,7 @@ finish_function (flags)
free_after_compilation (cfun);
cfun = NULL;
- /* If this is a in-class inline definition, we may have to pop the
+ /* If this is an in-class inline definition, we may have to pop the
bindings for the template parameters that we added in
maybe_begin_member_template_processing when start_function was
called. */
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 960dff3338e..a39e4fb2a59 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -50,10 +50,10 @@ extern cpp_reader *parse_in;
/* This structure contains information about the initializations
and/or destructions required for a particular priority level. */
typedef struct priority_info_s {
- /* Non-zero if there have been any initializations at this priority
+ /* Nonzero if there have been any initializations at this priority
throughout the translation unit. */
int initializations_p;
- /* Non-zero if there have been any destructions at this priority
+ /* Nonzero if there have been any destructions at this priority
throughout the translation unit. */
int destructions_p;
} *priority_info;
@@ -61,7 +61,6 @@ typedef struct priority_info_s {
static void mark_vtable_entries PARAMS ((tree));
static void grok_function_init PARAMS ((tree, tree));
static int finish_vtable_vardecl PARAMS ((tree *, void *));
-static int prune_vtable_vardecl PARAMS ((tree *, void *));
static int is_namespace_ancestor PARAMS ((tree, tree));
static void add_using_namespace PARAMS ((tree, tree, int));
static tree ambiguous_decl PARAMS ((tree, tree, tree,int));
@@ -117,7 +116,7 @@ int at_eof;
tree static_ctors;
tree static_dtors;
-/* The :: namespace. */
+/* The :: namespace. */
tree global_namespace;
@@ -536,7 +535,7 @@ delete_sanity (exp, size, doing_vec, use_global_delete)
return error_mark_node;
}
- /* Deleting ptr to void is undefined behaviour [expr.delete/3]. */
+ /* Deleting ptr to void is undefined behavior [expr.delete/3]. */
if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
{
warning ("deleting `%T' is undefined", type);
@@ -580,7 +579,7 @@ check_member_template (tmpl)
if (current_function_decl)
/* 14.5.2.2 [temp.mem]
- A local class shall not have member templates. */
+ A local class shall not have member templates. */
error ("invalid declaration of member template `%#D' in local class",
decl);
@@ -603,7 +602,7 @@ check_member_template (tmpl)
error ("template declaration of `%#D'", decl);
}
-/* Return true iff TYPE is a valid Java parameter or return type. */
+/* Return true iff TYPE is a valid Java parameter or return type. */
static int
acceptable_java_type (type)
@@ -1370,7 +1369,7 @@ finish_anon_union (anon_union_decl)
int static_p = TREE_STATIC (anon_union_decl);
int external_p = DECL_EXTERNAL (anon_union_decl);
- /* The VAR_DECL's context is the same as the TYPE's context. */
+ /* The VAR_DECL's context is the same as the TYPE's context. */
DECL_CONTEXT (anon_union_decl) = DECL_CONTEXT (TYPE_NAME (type));
if (TYPE_FIELDS (type) == NULL_TREE)
@@ -1382,63 +1381,31 @@ finish_anon_union (anon_union_decl)
return;
}
- main_decl = build_anon_union_vars (anon_union_decl,
- &DECL_ANON_UNION_ELEMS (anon_union_decl),
- static_p, external_p);
-
- if (main_decl == NULL_TREE)
+ if (!processing_template_decl)
{
- warning ("anonymous aggregate with no members");
- return;
- }
+ main_decl
+ = build_anon_union_vars (anon_union_decl,
+ &DECL_ANON_UNION_ELEMS (anon_union_decl),
+ static_p, external_p);
+
+ if (main_decl == NULL_TREE)
+ {
+ warning ("anonymous aggregate with no members");
+ return;
+ }
- if (static_p)
- {
- make_decl_rtl (main_decl, 0);
- COPY_DECL_RTL (main_decl, anon_union_decl);
- expand_anon_union_decl (anon_union_decl,
- NULL_TREE,
- DECL_ANON_UNION_ELEMS (anon_union_decl));
+ if (static_p)
+ {
+ make_decl_rtl (main_decl, 0);
+ COPY_DECL_RTL (main_decl, anon_union_decl);
+ expand_anon_union_decl (anon_union_decl,
+ NULL_TREE,
+ DECL_ANON_UNION_ELEMS (anon_union_decl));
+ return;
+ }
}
- else
- add_decl_stmt (anon_union_decl);
-}
-
-/* Finish processing a builtin type TYPE. It's name is NAME,
- its fields are in the array FIELDS. LEN is the number of elements
- in FIELDS minus one, or put another way, it is the maximum subscript
- used in FIELDS.
-
- It is given the same alignment as ALIGN_TYPE. */
-
-void
-finish_builtin_type (type, name, fields, len, align_type)
- tree type;
- const char *name;
- tree fields[];
- int len;
- tree align_type;
-{
- register int i;
- TYPE_FIELDS (type) = fields[0];
- for (i = 0; i < len; i++)
- {
- layout_type (TREE_TYPE (fields[i]));
- DECL_FIELD_CONTEXT (fields[i]) = type;
- TREE_CHAIN (fields[i]) = fields[i+1];
- }
- DECL_FIELD_CONTEXT (fields[i]) = type;
- TYPE_ALIGN (type) = TYPE_ALIGN (align_type);
- TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (align_type);
- layout_type (type);
-#if 0 /* not yet, should get fixed properly later */
- TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
-#else
- TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type);
-#endif
- TYPE_STUB_DECL (type) = TYPE_NAME (type);
- layout_decl (TYPE_NAME (type), 0);
+ add_decl_stmt (anon_union_decl);
}
/* Auxiliary functions to make type signatures for
@@ -1611,7 +1578,7 @@ maybe_make_one_only (decl)
one. However, that's not actually the case in SVR4; a strong definition
after a weak one is an error. Also, not making explicit
instantiations one_only means that we can end up with two copies of
- some template instantiations. */
+ some template instantiations. */
if (! flag_weak)
return;
@@ -1874,15 +1841,6 @@ finish_vtable_vardecl (t, data)
return 0;
}
-static int
-prune_vtable_vardecl (t, data)
- tree *t;
- void *data ATTRIBUTE_UNUSED;
-{
- *t = TREE_CHAIN (*t);
- return 1;
-}
-
/* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
inline function or template instantiation at end-of-file. */
@@ -1950,7 +1908,7 @@ import_export_decl (decl)
}
/* Here, we only decide whether or not the tinfo node should be
- emitted with the vtable. IS_IN_LIBRARY is non-zero iff the
+ emitted with the vtable. IS_IN_LIBRARY is nonzero iff the
typeinfo for TYPE should be in the runtime library. */
void
@@ -1981,7 +1939,7 @@ import_export_tinfo (decl, type, is_in_library)
DECL_COMDAT (decl) = 1;
}
- /* Now override some cases. */
+ /* Now override some cases. */
if (flag_weak)
DECL_COMDAT (decl) = 1;
else if (is_in_library)
@@ -2031,7 +1989,7 @@ get_guard (decl)
guard_type = long_long_integer_type_node;
guard = build_decl (VAR_DECL, sname, guard_type);
- /* The guard should have the same linkage as what it guards. */
+ /* The guard should have the same linkage as what it guards. */
TREE_PUBLIC (guard) = TREE_PUBLIC (decl);
TREE_STATIC (guard) = TREE_STATIC (decl);
DECL_COMMON (guard) = DECL_COMMON (decl);
@@ -2226,7 +2184,7 @@ static splay_tree priority_info_map;
initialization and destruction of objects with static storage
duration. The function generated takes two parameters of type
`int': __INITIALIZE_P and __PRIORITY. If __INITIALIZE_P is
- non-zero, it performs initializations. Otherwise, it performs
+ nonzero, it performs initializations. Otherwise, it performs
destructions. It only performs those initializations or
destructions with the indicated __PRIORITY. The generated function
returns no value.
@@ -2275,7 +2233,7 @@ start_static_storage_duration_function ()
VARRAY_TREE_INIT (ssdf_decls, 32, "ssdf_decls");
/* Take this opportunity to initialize the map from priority
- numbers to information about that priority level. */
+ numbers to information about that priority level. */
priority_info_map = splay_tree_new (splay_tree_compare_ints,
/*delete_key_fn=*/0,
/*delete_value_fn=*/
@@ -2373,7 +2331,7 @@ get_priority_info (priority)
}
/* Set up to handle the initialization or destruction of DECL. If
- INITP is non-zero, we are initializing the variable. Otherwise, we
+ INITP is nonzero, we are initializing the variable. Otherwise, we
are destroying it. */
static tree
@@ -2513,34 +2471,24 @@ finish_static_initialization_or_destruction (guard_if_stmt)
DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
}
-/* Generate code to do the static initialization of DECL. The
- initialization is INIT. If DECL may be initialized more than once
- in different object files, GUARD is the guard variable to
- check. PRIORITY is the priority for the initialization. */
+/* Generate code to do the initialization of DECL, a VAR_DECL with
+ static storage duration. The initialization is INIT. */
static void
do_static_initialization (decl, init)
tree decl;
tree init;
{
- tree expr;
tree guard_if_stmt;
/* Set up for the initialization. */
guard_if_stmt
= start_static_initialization_or_destruction (decl,
/*initp=*/1);
-
- /* Do the initialization itself. */
- if (IS_AGGR_TYPE (TREE_TYPE (decl))
- || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
- expr = build_aggr_init (decl, init, 0);
- else
- {
- expr = build (INIT_EXPR, TREE_TYPE (decl), decl, init);
- TREE_SIDE_EFFECTS (expr) = 1;
- }
- finish_expr_stmt (expr);
+
+ /* Perform the initialization. */
+ if (init)
+ finish_expr_stmt (init);
/* If we're using __cxa_atexit, register a a function that calls the
destructor for the object. */
@@ -2572,7 +2520,7 @@ do_static_destruction (decl)
/* Actually do the destruction. */
guard_if_stmt = start_static_initialization_or_destruction (decl,
- /*initp=*/0);
+ /*initp=*/0);
finish_expr_stmt (build_cleanup (decl));
finish_static_initialization_or_destruction (guard_if_stmt);
}
@@ -2774,7 +2722,7 @@ finish_file ()
/* Write out virtual tables as required. Note that writing out
the virtual table for a template class may cause the
instantiation of members of that class. */
- if (walk_globals (vtable_decl_p,
+ if (walk_vtables (vtable_decl_p,
finish_vtable_vardecl,
/*data=*/0))
reconsider = 1;
@@ -2868,7 +2816,7 @@ finish_file ()
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. */
+ 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);
@@ -2955,13 +2903,6 @@ finish_file ()
linkage now. */
pop_lang_context ();
- /* Now delete from the chain of variables all virtual function tables.
- We output them all ourselves, because each will be treated
- specially. We don't do this if we're just doing semantic
- analysis, and not code-generation. */
- if (!flag_syntax_only)
- walk_globals (vtable_decl_p, prune_vtable_vardecl, /*data=*/0);
-
/* Now, issue warnings about static, but not defined, functions,
etc., and emit debugging information. */
walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
@@ -2972,7 +2913,7 @@ finish_file ()
finish_repo ();
/* The entire file is now complete. If requested, dump everything
- to a file. */
+ to a file. */
{
int flags;
FILE *stream = dump_begin (TDI_all, &flags);
@@ -3317,7 +3258,7 @@ build_expr_from_tree (t)
&& (!current_class_type
|| !lookup_member (current_class_type, id, 0, 0)))
{
- /* Do Koenig lookup if there are no class members. */
+ /* Do Koenig lookup if there are no class members. */
name = do_identifier (id, 0, args);
}
else if (TREE_CODE (name) == TEMPLATE_ID_EXPR
@@ -3588,7 +3529,7 @@ finish_decl_parsing (decl)
}
}
-/* Return 1 if root encloses child. */
+/* Return 1 if root encloses child. */
static int
is_namespace_ancestor (root, child)
@@ -3605,7 +3546,7 @@ is_namespace_ancestor (root, child)
/* Return the namespace that is the common ancestor
- of two given namespaces. */
+ of two given namespaces. */
tree
namespace_ancestor (ns1, ns2)
@@ -3626,38 +3567,38 @@ add_using_namespace (user, used, indirect)
int indirect;
{
tree t;
- /* Using oneself is a no-op. */
+ /* Using oneself is a no-op. */
if (user == used)
return;
my_friendly_assert (TREE_CODE (user) == NAMESPACE_DECL, 380);
my_friendly_assert (TREE_CODE (used) == NAMESPACE_DECL, 380);
- /* Check if we already have this. */
+ /* Check if we already have this. */
t = purpose_member (used, DECL_NAMESPACE_USING (user));
if (t != NULL_TREE)
{
if (!indirect)
- /* Promote to direct usage. */
+ /* Promote to direct usage. */
TREE_INDIRECT_USING (t) = 0;
return;
}
- /* Add used to the user's using list. */
+ /* Add used to the user's using list. */
DECL_NAMESPACE_USING (user)
= tree_cons (used, namespace_ancestor (user, used),
DECL_NAMESPACE_USING (user));
TREE_INDIRECT_USING (DECL_NAMESPACE_USING (user)) = indirect;
- /* Add user to the used's users list. */
+ /* Add user to the used's users list. */
DECL_NAMESPACE_USERS (used)
= tree_cons (user, 0, DECL_NAMESPACE_USERS (used));
- /* Recursively add all namespaces used. */
+ /* Recursively add all namespaces used. */
for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t))
/* indirect usage */
add_using_namespace (user, TREE_PURPOSE (t), 1);
- /* Tell everyone using us about the new used namespaces. */
+ /* Tell everyone using us about the new used namespaces. */
for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t))
add_using_namespace (TREE_PURPOSE (t), used, 1);
}
@@ -3717,14 +3658,14 @@ ambiguous_decl (name, old, new, flags)
{
tree val, type;
my_friendly_assert (old != NULL_TREE, 393);
- /* Copy the value. */
+ /* Copy the value. */
val = BINDING_VALUE (new);
if (val)
switch (TREE_CODE (val))
{
case TEMPLATE_DECL:
/* If we expect types or namespaces, and not templates,
- or this is not a template class. */
+ or this is not a template class. */
if (LOOKUP_QUALIFIERS_ONLY (flags)
&& !DECL_CLASS_TEMPLATE_P (val))
val = NULL_TREE;
@@ -3759,7 +3700,7 @@ ambiguous_decl (name, old, new, flags)
}
else
{
- /* Some declarations are functions, some are not. */
+ /* Some declarations are functions, some are not. */
if (flags & LOOKUP_COMPLAIN)
{
/* If we've already given this error for this lookup,
@@ -3776,7 +3717,7 @@ ambiguous_decl (name, old, new, flags)
BINDING_VALUE (old) = error_mark_node;
}
}
- /* ... and copy the type. */
+ /* ... and copy the type. */
type = BINDING_TYPE (new);
if (LOOKUP_NAMESPACES_ONLY (flags))
type = NULL_TREE;
@@ -3799,7 +3740,7 @@ ambiguous_decl (name, old, new, flags)
We are currently looking for names in namespace SCOPE, so we
look through USINGS for using-directives of namespaces
which have SCOPE as a common ancestor with the current scope.
- Returns zero on errors. */
+ Returns zero on errors. */
int
lookup_using_namespace (name, val, usings, scope, flags, spacesp)
@@ -3810,7 +3751,7 @@ lookup_using_namespace (name, val, usings, scope, flags, spacesp)
tree iter;
tree val1;
/* Iterate over all used namespaces in current, searching for using
- directives of scope. */
+ directives of scope. */
for (iter = usings; iter; iter = TREE_CHAIN (iter))
if (TREE_VALUE (iter) == scope)
{
@@ -3818,7 +3759,7 @@ lookup_using_namespace (name, val, usings, scope, flags, spacesp)
*spacesp = tree_cons (TREE_PURPOSE (iter), NULL_TREE,
*spacesp);
val1 = binding_for_name (name, TREE_PURPOSE (iter));
- /* Resolve ambiguities. */
+ /* Resolve ambiguities. */
val = ambiguous_decl (name, val, val1, flags);
}
return BINDING_VALUE (val) != error_mark_node;
@@ -3827,7 +3768,7 @@ lookup_using_namespace (name, val, usings, scope, flags, spacesp)
/* [namespace.qual]
Accepts the NAME to lookup and its qualifying SCOPE.
Returns the name/type pair found into the CPLUS_BINDING RESULT,
- or 0 on error. */
+ or 0 on error. */
int
qualified_lookup_using_namespace (name, scope, result, flags)
@@ -3836,9 +3777,9 @@ qualified_lookup_using_namespace (name, scope, result, flags)
tree result;
int flags;
{
- /* Maintain a list of namespaces visited... */
+ /* Maintain a list of namespaces visited... */
tree seen = NULL_TREE;
- /* ... and a list of namespace yet to see. */
+ /* ... and a list of namespace yet to see. */
tree todo = NULL_TREE;
tree usings;
/* Look through namespace aliases. */
@@ -3849,10 +3790,10 @@ qualified_lookup_using_namespace (name, scope, result, flags)
result = ambiguous_decl (name, result,
binding_for_name (name, scope), flags);
if (!BINDING_VALUE (result) && !BINDING_TYPE (result))
- /* Consider using directives. */
+ /* Consider using directives. */
for (usings = DECL_NAMESPACE_USING (scope); usings;
usings = TREE_CHAIN (usings))
- /* If this was a real directive, and we have not seen it. */
+ /* If this was a real directive, and we have not seen it. */
if (!TREE_INDIRECT_USING (usings)
&& !purpose_member (TREE_PURPOSE (usings), seen))
todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo);
@@ -3862,7 +3803,7 @@ qualified_lookup_using_namespace (name, scope, result, flags)
todo = TREE_CHAIN (todo);
}
else
- scope = NULL_TREE; /* If there never was a todo list. */
+ scope = NULL_TREE; /* If there never was a todo list. */
}
return result != error_mark_node;
}
@@ -3870,7 +3811,7 @@ qualified_lookup_using_namespace (name, scope, result, flags)
/* [namespace.memdef]/2 */
/* Set the context of a declaration to scope. Complain if we are not
- outside scope. */
+ outside scope. */
void
set_decl_namespace (decl, scope, friendp)
@@ -3880,7 +3821,7 @@ set_decl_namespace (decl, scope, friendp)
{
tree old;
- /* Get rid of namespace aliases. */
+ /* Get rid of namespace aliases. */
scope = ORIGINAL_NAMESPACE (scope);
/* It is ok for friends to be qualified in parallel space. */
@@ -3890,10 +3831,10 @@ set_decl_namespace (decl, scope, friendp)
DECL_CONTEXT (decl) = FROB_CONTEXT (scope);
if (scope != current_namespace)
{
- /* See whether this has been declared in the namespace. */
+ /* See whether this has been declared in the namespace. */
old = namespace_binding (DECL_NAME (decl), scope);
if (!old)
- /* No old declaration at all. */
+ /* No old declaration at all. */
goto complain;
/* A template can be explicitly specialized in any namespace. */
if (processing_explicit_instantiation)
@@ -3903,7 +3844,7 @@ set_decl_namespace (decl, scope, friendp)
since it can't check for the correct constness at this
point. pushdecl will find those errors later. */
return;
- /* Since decl is a function, old should contain a function decl. */
+ /* Since decl is a function, old should contain a function decl. */
if (!is_overloaded_fn (old))
goto complain;
if (processing_template_decl || processing_specialization)
@@ -3923,7 +3864,7 @@ set_decl_namespace (decl, scope, friendp)
decl, scope);
}
-/* Compute the namespace where a declaration is defined. */
+/* Compute the namespace where a declaration is defined. */
static tree
decl_namespace (decl)
@@ -3944,13 +3885,13 @@ decl_namespace (decl)
return global_namespace;
}
-/* Return the namespace where the current declaration is declared. */
+/* Return the namespace where the current declaration is declared. */
tree
current_decl_namespace ()
{
tree result;
- /* If we have been pushed into a different namespace, use it. */
+ /* If we have been pushed into a different namespace, use it. */
if (decl_namespace_list)
return TREE_PURPOSE (decl_namespace_list);
@@ -3963,7 +3904,7 @@ current_decl_namespace ()
return result;
}
-/* Temporarily set the namespace for the current declaration. */
+/* Temporarily set the namespace for the current declaration. */
void
push_decl_namespace (decl)
@@ -3981,7 +3922,7 @@ pop_decl_namespace ()
decl_namespace_list = TREE_CHAIN (decl_namespace_list);
}
-/* Enter a class or namespace scope. */
+/* Enter a class or namespace scope. */
void
push_scope (t)
@@ -3993,7 +3934,7 @@ push_scope (t)
pushclass (t, 2);
}
-/* Leave scope pushed by push_scope. */
+/* Leave scope pushed by push_scope. */
void
pop_scope (t)
@@ -4006,7 +3947,7 @@ pop_scope (t)
}
/* [basic.lookup.koenig] */
-/* A non-zero return value in the functions below indicates an error. */
+/* A nonzero return value in the functions below indicates an error. */
struct arg_lookup
{
@@ -4039,7 +3980,7 @@ add_function (k, fn)
total number of functions being compared, which should usually be the
case. */
- /* We must find only functions, or exactly one non-function. */
+ /* We must find only functions, or exactly one non-function. */
if (!k->functions)
k->functions = fn;
else if (is_overloaded_fn (k->functions) && is_overloaded_fn (fn))
@@ -4153,19 +4094,19 @@ arg_assoc_class (k, type)
if (arg_assoc_namespace (k, context))
return 1;
- /* Process baseclasses. */
+ /* Process baseclasses. */
for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); i++)
if (arg_assoc_class (k, TYPE_BINFO_BASETYPE (type, i)))
return 1;
- /* Process friends. */
+ /* Process friends. */
for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list;
list = TREE_CHAIN (list))
if (k->name == TREE_PURPOSE (list))
for (friends = TREE_VALUE (list); friends;
friends = TREE_CHAIN (friends))
/* Only interested in global functions with potentially hidden
- (i.e. unqualified) declarations. */
+ (i.e. unqualified) declarations. */
if (TREE_PURPOSE (friends) == error_mark_node && TREE_VALUE (friends)
&& decl_namespace (TREE_VALUE (friends)) == context)
if (add_function (k, TREE_VALUE (friends)))
@@ -4212,7 +4153,7 @@ arg_assoc_type (k, type)
case ENUMERAL_TYPE:
return arg_assoc_namespace (k, decl_namespace (TYPE_MAIN_DECL (type)));
case OFFSET_TYPE:
- /* Pointer to member: associate class type and value type. */
+ /* Pointer to member: associate class type and value type. */
if (arg_assoc_type (k, TYPE_OFFSET_BASETYPE (type)))
return 1;
return arg_assoc_type (k, TREE_TYPE (type));
@@ -4220,10 +4161,10 @@ arg_assoc_type (k, type)
/* The basetype is referenced in the first arg type, so just
fall through. */
case FUNCTION_TYPE:
- /* Associate the parameter types. */
+ /* Associate the parameter types. */
if (arg_assoc_args (k, TYPE_ARG_TYPES (type)))
return 1;
- /* Associate the return type. */
+ /* Associate the return type. */
return arg_assoc_type (k, TREE_TYPE (type));
case TEMPLATE_TYPE_PARM:
case BOUND_TEMPLATE_TEMPLATE_PARM:
@@ -4332,7 +4273,7 @@ arg_assoc (k, n)
}
/* Performs Koenig lookup depending on arguments, where fns
- are the functions found in normal lookup. */
+ are the functions found in normal lookup. */
tree
lookup_arg_dependent (name, fns, args)
@@ -4360,7 +4301,7 @@ lookup_arg_dependent (name, fns, args)
return k.functions;
}
-/* Process a namespace-alias declaration. */
+/* Process a namespace-alias declaration. */
void
do_namespace_alias (alias, namespace)
@@ -4368,21 +4309,21 @@ do_namespace_alias (alias, namespace)
{
if (TREE_CODE (namespace) != NAMESPACE_DECL)
{
- /* The parser did not find it, so it's not there. */
+ /* The parser did not find it, so it's not there. */
error ("unknown namespace `%D'", namespace);
return;
}
namespace = ORIGINAL_NAMESPACE (namespace);
- /* Build the alias. */
+ /* Build the alias. */
alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);
DECL_NAMESPACE_ALIAS (alias) = namespace;
pushdecl (alias);
}
/* Check a non-member using-declaration. Return the name and scope
- being used, and the USING_DECL, or NULL_TREE on failure. */
+ being used, and the USING_DECL, or NULL_TREE on failure. */
static tree
validate_nonmember_using_decl (decl, scope, name)
@@ -4435,11 +4376,11 @@ validate_nonmember_using_decl (decl, scope, name)
abort ();
if (DECL_P (*name))
*name = DECL_NAME (*name);
- /* Make a USING_DECL. */
+ /* Make a USING_DECL. */
return push_using_decl (*scope, *name);
}
-/* Process local and global using-declarations. */
+/* Process local and global using-declarations. */
static void
do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype)
@@ -4461,7 +4402,7 @@ do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype)
return;
}
- /* Check for using functions. */
+ /* Check for using functions. */
if (BINDING_VALUE (decls) && is_overloaded_fn (BINDING_VALUE (decls)))
{
tree tmp, tmp1;
@@ -4541,7 +4482,7 @@ do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype)
}
}
-/* Process a using-declaration not appearing in class or local scope. */
+/* Process a using-declaration not appearing in class or local scope. */
void
do_toplevel_using_decl (decl)
@@ -4561,7 +4502,7 @@ do_toplevel_using_decl (decl)
do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype);
- /* Copy declarations found. */
+ /* Copy declarations found. */
if (newval)
BINDING_VALUE (binding) = newval;
if (newtype)
@@ -4658,7 +4599,7 @@ do_class_using_decl (decl)
return value;
}
-/* Process a using-directive. */
+/* Process a using-directive. */
void
do_using_directive (namespace)
@@ -4672,7 +4613,7 @@ do_using_directive (namespace)
namespace = TREE_OPERAND (namespace, 1);
if (TREE_CODE (namespace) == IDENTIFIER_NODE)
{
- /* Lookup in lexer did not find a namespace. */
+ /* Lookup in lexer did not find a namespace. */
if (!processing_template_decl)
error ("namespace `%T' undeclared", namespace);
return;
@@ -4749,7 +4690,7 @@ mark_used (decl)
nonterminals. AGGR is the class, union or struct tag. SCOPE is the
explicit scope used (NULL for no scope resolution). ID is the
name. DEFN_P is true, if this is a definition of the class and
- NEW_TYPE_P is set to non-zero, if we push into the scope containing
+ NEW_TYPE_P is set to nonzero, if we push into the scope containing
the to be defined aggregate.
Return a TYPE_DECL for the type declared by ID in SCOPE. */
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index b0c06399680..872a55677a2 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -410,7 +410,7 @@ dump_type (t, flags)
break;
case TEMPLATE_TEMPLATE_PARM:
- /* For parameters inside template signature. */
+ /* For parameters inside template signature. */
if (TYPE_IDENTIFIER (t))
print_tree_identifier (scratch_buffer, TYPE_IDENTIFIER (t));
else
@@ -472,7 +472,7 @@ dump_type (t, flags)
default:
sorry_for_unsupported_tree (t);
- /* Fall through to error. */
+ /* Fall through to error. */
case ERROR_MARK:
print_identifier (scratch_buffer, "<type error>");
@@ -848,7 +848,7 @@ dump_decl (t, flags)
{
if ((flags & TFF_DECL_SPECIFIERS)
&& TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
- /* Say `class T' not just `T'. */
+ /* Say `class T' not just `T'. */
output_add_string (scratch_buffer, "class ");
dump_type (TREE_TYPE (t), flags);
@@ -1043,7 +1043,7 @@ dump_template_decl (t, flags)
nreverse(orig_parms);
if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
- /* Say `template<arg> class TT' not just `template<arg> TT'. */
+ /* Say `template<arg> class TT' not just `template<arg> TT'. */
output_add_string (scratch_buffer, "class ");
}
@@ -1073,7 +1073,7 @@ dump_template_decl (t, flags)
/* Pretty print a function decl. There are several ways we want to print a
function declaration. The TFF_ bits in FLAGS tells us how to behave.
As error can only apply the '#' flag once to give 0 and 1 for V, there
- is %D which doesn't print the throw specs, and %F which does. */
+ is %D which doesn't print the throw specs, and %F which does. */
static void
dump_function_decl (t, flags)
@@ -1167,7 +1167,7 @@ dump_function_decl (t, flags)
/* Print a parameter list. If this is for a member function, the
member object ptr (and any other hidden args) should have
- already been removed. */
+ already been removed. */
static void
dump_parameters (parmtypes, flags)
@@ -1201,7 +1201,7 @@ dump_parameters (parmtypes, flags)
print_right_paren (scratch_buffer);
}
-/* Print an exception specification. T is the exception specification. */
+/* Print an exception specification. T is the exception specification. */
static void
dump_exception_spec (t, flags)
@@ -1417,7 +1417,7 @@ dump_expr_list (l, flags)
}
}
-/* Print out an expression E under control of FLAGS. */
+/* Print out an expression E under control of FLAGS. */
static void
dump_expr (t, flags)
@@ -1508,13 +1508,8 @@ dump_expr (t, flags)
break;
case REAL_CST:
- {
- const unsigned char *p = (const unsigned char *) &TREE_REAL_CST (t);
- size_t i;
- strcpy (digit_buffer, "0x");
- for (i = 0; i < sizeof TREE_REAL_CST (t); i++)
- sprintf (digit_buffer + 2 + 2*i, "%02x", *p++);
- }
+ real_to_decimal (digit_buffer, &TREE_REAL_CST (t),
+ sizeof (digit_buffer), 0, 1);
output_add_string (scratch_buffer, digit_buffer);
break;
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 4b8b5ee8503..afe4bbd3967 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -117,7 +117,7 @@ prepare_eh_type (type)
}
/* Build the address of a typeinfo decl for use in the runtime
- matching field of the exception model. */
+ matching field of the exception model. */
static tree
build_eh_type_type (type)
@@ -796,7 +796,7 @@ build_throw (exp)
/* Make sure TYPE is complete, pointer to complete, reference to
complete, or pointer to cv void. Issue diagnostic on failure.
- Return the zero on failure and non-zero on success. FROM can be
+ Return the zero on failure and nonzero on success. FROM can be
the expr or decl from whence TYPE came, if available. */
static int
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 1bb3869ecb4..e5b0439c93d 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -102,7 +102,7 @@ cxx_expand_expr (exp, target, tmode, modifier)
target, tmode, modifier);
case OFFSET_REF:
- /* Offset refs should not make it through to here. */
+ /* Offset refs should not make it through to here. */
abort ();
return const0_rtx;
@@ -127,11 +127,3 @@ cxx_expand_expr (exp, target, tmode, modifier)
/* NOTREACHED */
return NULL;
}
-
-int
-extract_init (decl, init)
- tree decl ATTRIBUTE_UNUSED, init ATTRIBUTE_UNUSED;
-{
- return 0;
-}
-
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 441be67cfb0..b71baa57282 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -30,7 +30,7 @@ Boston, MA 02111-1307, USA. */
/* Friend data structures are described in cp-tree.h. */
-/* Returns non-zero if SUPPLICANT is a friend of TYPE. */
+/* Returns nonzero if SUPPLICANT is a friend of TYPE. */
int
is_friend (type, supplicant)
@@ -114,7 +114,7 @@ is_friend (type, supplicant)
else
context = NULL_TREE;
- /* A namespace is not friend to anybody. */
+ /* A namespace is not friend to anybody. */
if (context && TREE_CODE (context) == NAMESPACE_DECL)
context = NULL_TREE;
@@ -230,7 +230,7 @@ make_friend_class (type, friend_type)
A friend of a class or class template can be a function or
class template, a specialization of a function template or
class template, or an ordinary (nontemplate) function or
- class. */
+ class. */
if (!is_template_friend)
;/* ok */
else if (TREE_CODE (friend_type) == TYPENAME_TYPE)
@@ -396,14 +396,14 @@ do_friend (ctype, declarator, decl, parmdecls, attrlist,
/* This must be a local class, so pushdecl will be ok, and
insert an unqualified friend into the local scope
(rather than the containing namespace scope, which the
- next choice will do). */
+ next choice will do). */
decl = pushdecl (decl);
else
{
/* We can't use pushdecl, as we might be in a template
class specialization, and pushdecl will insert an
unqualified friend decl into the template parameter
- scope, rather than the namespace containing it. */
+ scope, rather than the namespace containing it. */
tree ns = decl_namespace_context (decl);
push_nested_namespace (ns);
diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c
index 706b9697ca3..6e5de08e031 100644
--- a/gcc/cp/g++spec.c
+++ b/gcc/cp/g++spec.c
@@ -51,10 +51,10 @@ 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. */
+ /* If nonzero, the user gave us the `-p' or `-pg' flag. */
int saw_profile_flag = 0;
- /* If non-zero, the user gave us the `-v' flag. */
+ /* If nonzero, the user gave us the `-v' flag. */
int saw_verbose_flag = 0;
/* This will be 0 if we encounter a situation where we should not
@@ -73,7 +73,7 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
/* The new argument list will be contained in this. */
const char **arglist;
- /* Non-zero if we saw a `-xfoo' language specification on the
+ /* Nonzero if we saw a `-xfoo' language specification on the
command line. Used to avoid adding our own -xc++ if the user
already gave a language for the file. */
int saw_speclang = 0;
@@ -299,11 +299,11 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
*in_added_libraries = added_libraries;
}
-/* Called before linking. Returns 0 on success and -1 on failure. */
-int lang_specific_pre_link () /* Not used for C++. */
+/* Called before linking. Returns 0 on success and -1 on failure. */
+int lang_specific_pre_link () /* Not used for C++. */
{
return 0;
}
-/* Number of extra output files that lang_specific_pre_link may generate. */
-int lang_specific_extra_outfiles = 0; /* Not used for C++. */
+/* Number of extra output files that lang_specific_pre_link may generate. */
+int lang_specific_extra_outfiles = 0; /* Not used for C++. */
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index b50f85fc4b9..a7db6267853 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -34,17 +34,15 @@ Boston, MA 02111-1307, USA. */
#include "toplev.h"
#include "ggc.h"
-static void expand_aggr_vbase_init_1 PARAMS ((tree, tree, tree, tree));
-static void construct_virtual_bases PARAMS ((tree, tree, tree, tree, tree));
+static void construct_virtual_base (tree, tree);
static void expand_aggr_init_1 PARAMS ((tree, tree, tree, tree, int));
static void expand_default_init PARAMS ((tree, tree, tree, tree, int));
static tree build_vec_delete_1 PARAMS ((tree, tree, tree, special_function_kind, int));
-static void perform_member_init PARAMS ((tree, tree, int));
-static void sort_base_init PARAMS ((tree, tree, tree *, tree *));
+static void perform_member_init (tree, tree);
static tree build_builtin_delete_call PARAMS ((tree));
static int member_init_ok_or_else PARAMS ((tree, tree, tree));
static void expand_virtual_init PARAMS ((tree, tree));
-static tree sort_member_init PARAMS ((tree, tree));
+static tree sort_mem_initializers (tree, tree);
static tree initializing_context PARAMS ((tree));
static void expand_cleanup_for_base PARAMS ((tree, tree));
static tree get_temp_regvar PARAMS ((tree, tree));
@@ -156,82 +154,177 @@ initialize_vtbl_ptrs (addr)
dfs_marked_real_bases_queue_p, type);
}
-/* Types containing pointers to data members cannot be
- zero-initialized with zeros, because the NULL value for such
- pointers is -1.
-
- TYPE is a type that requires such zero initialization. The
- returned value is the initializer. */
+/* Return an expression for the zero-initialization of an object with
+ type T. This expression will either be a constant (in the case
+ that T is a scalar), or a CONSTRUCTOR (in the case that T is an
+ aggregate). In either case, the value can be used as DECL_INITIAL
+ for a decl of the indicated TYPE; it is a valid static initializer.
+ If STATIC_STORAGE_P is TRUE, initializers are only generated for
+ entities for which zero-initialization does not simply mean filling
+ the storage with zero bytes. */
tree
-build_forced_zero_init (type)
- tree type;
+build_zero_init (tree type, bool static_storage_p)
{
- tree init = NULL;
+ tree init = NULL_TREE;
+
+ /* [dcl.init]
+
+ To zero-initialization storage for an object of type T means:
+
+ -- if T is a scalar type, the storage is set to the value of zero
+ converted to T.
+
+ -- if T is a non-union class type, the storage for each nonstatic
+ data member and each base-class subobject is zero-initialized.
+
+ -- if T is a union type, the storage for its first data member is
+ zero-initialized.
+
+ -- if T is an array type, the storage for each element is
+ zero-initialized.
+
+ -- if T is a reference type, no initialization is performed. */
+
+ if (type == error_mark_node)
+ ;
+ else if (static_storage_p && zero_init_p (type))
+ /* In order to save space, we do not explicitly build initializers
+ for items that do not need them. GCC's semantics are that
+ items with static storage duration that are not otherwise
+ initialized are initialized to zero. */
+ ;
+ else if (SCALAR_TYPE_P (type))
+ init = convert (type, integer_zero_node);
+ else if (CLASS_TYPE_P (type))
+ {
+ tree field;
+ tree inits;
+
+ /* Build a constructor to contain the initializations. */
+ init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
+ /* Iterate over the fields, building initializations. */
+ inits = NULL_TREE;
+ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
+ {
+ if (TREE_CODE (field) != FIELD_DECL)
+ continue;
- if (AGGREGATE_TYPE_P (type) && !TYPE_PTRMEMFUNC_P (type))
+ /* Note that for class types there will be FIELD_DECLs
+ corresponding to base classes as well. Thus, iterating
+ over TYPE_FIELDs will result in correct initialization of
+ all of the subobjects. */
+ if (static_storage_p && !zero_init_p (TREE_TYPE (field)))
+ inits = tree_cons (field,
+ build_zero_init (TREE_TYPE (field),
+ static_storage_p),
+ inits);
+
+ /* For unions, only the first field is initialized. */
+ if (TREE_CODE (type) == UNION_TYPE)
+ break;
+ }
+ CONSTRUCTOR_ELTS (init) = nreverse (inits);
+ }
+ else if (TREE_CODE (type) == ARRAY_TYPE)
{
- /* This is a default initialization of an aggregate, but not one of
- non-POD class type. We cleverly notice that the initialization
- rules in such a case are the same as for initialization with an
- empty brace-initialization list. */
- init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, NULL_TREE);
+ tree index;
+ tree max_index;
+ tree inits;
+
+ /* Build a constructor to contain the initializations. */
+ init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
+ /* Iterate over the array elements, building initializations. */
+ inits = NULL_TREE;
+ for (index = size_zero_node, max_index = array_type_nelts (type);
+ !tree_int_cst_lt (max_index, index);
+ index = size_binop (PLUS_EXPR, index, size_one_node))
+ inits = tree_cons (index,
+ build_zero_init (TREE_TYPE (type),
+ static_storage_p),
+ inits);
+ CONSTRUCTOR_ELTS (init) = nreverse (inits);
}
else if (TREE_CODE (type) == REFERENCE_TYPE)
- /* --if T is a reference type, no initialization is performed. */
- return NULL_TREE;
+ ;
else
- {
- init = integer_zero_node;
-
- if (TREE_CODE (type) == ENUMERAL_TYPE)
- /* We must make enumeral types the right type. */
- init = fold (build1 (NOP_EXPR, type, init));
- }
+ abort ();
- init = digest_init (type, init, 0);
+ /* In all cases, the initializer is a constant. */
+ if (init)
+ TREE_CONSTANT (init) = 1;
return init;
}
-/* [dcl.init]:
+/* Build an expression for the default-initialization of an object
+ with type T. If initialization T requires calling constructors,
+ this function returns NULL_TREE; the caller is responsible for
+ arranging for the constructors to be called. */
- To default-initialize an object of type T means:
+static tree
+build_default_init (type)
+ tree type;
+{
+ /* [dcl.init]:
- --if T is a non-POD class type (clause _class_), the default construc-
- tor for T is called (and the initialization is ill-formed if T has
- no accessible default constructor);
+ To default-initialize an object of type T means:
- --if T is an array type, each element is default-initialized;
+ --if T is a non-POD class type (clause _class_), the default construc-
+ tor for T is called (and the initialization is ill-formed if T has
+ no accessible default constructor);
- --otherwise, the storage for the object is zero-initialized.
+ --if T is an array type, each element is default-initialized;
- A program that calls for default-initialization of an entity of refer-
- ence type is ill-formed. */
+ --otherwise, the storage for the object is zero-initialized.
-static tree
-build_default_init (type)
- tree type;
-{
+ A program that calls for default-initialization of an entity of refer-
+ ence type is ill-formed. */
+
+ /* If TYPE_NEEDS_CONSTRUCTING is true, the caller is responsible for
+ performing the initialization. This is confusing in that some
+ non-PODs do not have TYPE_NEEDS_CONSTRUCTING set. (For example,
+ a class with a pointer-to-data member as a non-static data member
+ does not have TYPE_NEEDS_CONSTRUCTING set.) Therefore, we end up
+ passing non-PODs to build_zero_init below, which is contrary to
+ the semantics quoted above from [dcl.init].
+
+ It happens, however, that the behavior of the constructor the
+ standard says we should have generated would be precisely the
+ same as that obtained by calling build_zero_init below, so things
+ work out OK. */
if (TYPE_NEEDS_CONSTRUCTING (type))
- /* Other code will handle running the default constructor. We can't do
- anything with a CONSTRUCTOR for arrays here, as that would imply
- copy-initialization. */
return NULL_TREE;
-
- return build_forced_zero_init (type);
+
+ /* At this point, TYPE is either a POD class type, an array of POD
+ classes, or something even more inoccuous. */
+ return build_zero_init (type, /*static_storage_p=*/false);
}
-/* Subroutine of emit_base_init. */
+/* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
+ arguments. If TREE_LIST is void_type_node, an empty initializer
+ list was given; if NULL_TREE no initializer was given. */
static void
-perform_member_init (member, init, explicit)
- tree member, init;
- int explicit;
+perform_member_init (tree member, tree init)
{
tree decl;
tree type = TREE_TYPE (member);
+ bool explicit;
+
+ explicit = (init != NULL_TREE);
+
+ /* Effective C++ rule 12 requires that all data members be
+ initialized. */
+ if (warn_ecpp && !explicit && TREE_CODE (type) != ARRAY_TYPE)
+ warning ("`%D' should be initialized in the member initialization "
+ "list",
+ member);
+
+ if (init == void_type_node)
+ init = NULL_TREE;
+ /* Get an lvalue for the data member. */
decl = build_class_member_access_expr (current_class_ref, member,
/*access_path=*/NULL_TREE,
/*preserve_reference=*/true);
@@ -252,11 +345,6 @@ perform_member_init (member, init, explicit)
else if (TYPE_NEEDS_CONSTRUCTING (type)
|| (init && TYPE_HAS_CONSTRUCTOR (type)))
{
- /* Since `init' is already a TREE_LIST on the member_init_list,
- only build it into one if we aren't already a list. */
- if (init != NULL_TREE && TREE_CODE (init) != TREE_LIST)
- init = build_tree_list (NULL_TREE, init);
-
if (explicit
&& TREE_CODE (type) == ARRAY_TYPE
&& init != NULL_TREE
@@ -328,6 +416,8 @@ build_field_list (t, list, uses_unions_p)
{
tree fields;
+ *uses_unions_p = 0;
+
/* Note whether or not T is a union. */
if (TREE_CODE (t) == UNION_TYPE)
*uses_unions_p = 1;
@@ -335,7 +425,7 @@ build_field_list (t, list, uses_unions_p)
for (fields = TYPE_FIELDS (t); fields; fields = TREE_CHAIN (fields))
{
/* Skip CONST_DECLs for enumeration constants and so forth. */
- if (TREE_CODE (fields) != FIELD_DECL)
+ if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
continue;
/* Keep track of whether or not any fields are unions. */
@@ -362,79 +452,107 @@ build_field_list (t, list, uses_unions_p)
return list;
}
-/* The MEMBER_INIT_LIST is a TREE_LIST. The TREE_PURPOSE of each list
- gives a FIELD_DECL in T that needs initialization. The TREE_VALUE
- gives the initializer, or list of initializer arguments. Sort the
- MEMBER_INIT_LIST, returning a version that contains the same
- information but in the order that the fields should actually be
- initialized. Perform error-checking in the process. */
+/* The MEM_INITS are a TREE_LIST. The TREE_PURPOSE of each list gives
+ a FIELD_DECL or BINFO in T that needs initialization. The
+ TREE_VALUE gives the initializer, or list of initializer arguments.
+
+ Return a TREE_LIST containing all of the initializations required
+ for T, in the order in which they should be performed. The output
+ list has the same format as the input. */
static tree
-sort_member_init (t, member_init_list)
- tree t;
- tree member_init_list;
+sort_mem_initializers (tree t, tree mem_inits)
{
- tree init_list;
- tree last_field;
tree init;
+ tree base;
+ tree sorted_inits;
+ tree next_subobject;
+ int i;
int uses_unions_p;
- /* Build up a list of the various fields, in sorted order. */
- init_list = nreverse (build_field_list (t, NULL_TREE, &uses_unions_p));
-
- /* Go through the explicit initializers, adding them to the
- INIT_LIST. */
- last_field = init_list;
- for (init = member_init_list; init; init = TREE_CHAIN (init))
- {
- tree f;
- tree initialized_field;
-
- initialized_field = TREE_PURPOSE (init);
- my_friendly_assert (TREE_CODE (initialized_field) == FIELD_DECL,
- 20000516);
-
- /* If the explicit initializers are in sorted order, then the
- INITIALIZED_FIELD will be for a field following the
- LAST_FIELD. */
- for (f = last_field; f; f = TREE_CHAIN (f))
- if (TREE_PURPOSE (f) == initialized_field)
+ /* Build up a list of initializations. The TREE_PURPOSE of entry
+ will be the subobject (a FIELD_DECL or BINFO) to initialize. The
+ TREE_VALUE will be the constructor arguments, or NULL if no
+ explicit initialization was provided. */
+ sorted_inits = NULL_TREE;
+ /* Process the virtual bases. */
+ for (base = CLASSTYPE_VBASECLASSES (t); base; base = TREE_CHAIN (base))
+ sorted_inits = tree_cons (TREE_VALUE (base), NULL_TREE, sorted_inits);
+ /* Process the direct bases. */
+ for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); ++i)
+ {
+ base = BINFO_BASETYPE (TYPE_BINFO (t), i);
+ if (!TREE_VIA_VIRTUAL (base))
+ sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
+ }
+ /* Process the non-static data members. */
+ sorted_inits = build_field_list (t, sorted_inits, &uses_unions_p);
+ /* Reverse the entire list of initializations, so that they are in
+ the order that they will actually be performed. */
+ sorted_inits = nreverse (sorted_inits);
+
+ /* If the user presented the initializers in an order different from
+ that in which they will actually occur, we issue a warning. Keep
+ track of the next subobject which can be explicitly initialized
+ without issuing a warning. */
+ next_subobject = sorted_inits;
+
+ /* Go through the explicit initializers, filling in TREE_PURPOSE in
+ the SORTED_INITS. */
+ for (init = mem_inits; init; init = TREE_CHAIN (init))
+ {
+ tree subobject;
+ tree subobject_init;
+
+ subobject = TREE_PURPOSE (init);
+
+ /* If the explicit initializers are in sorted order, then
+ SUBOBJECT will be NEXT_SUBOBJECT, or something following
+ it. */
+ for (subobject_init = next_subobject;
+ subobject_init;
+ subobject_init = TREE_CHAIN (subobject_init))
+ if (TREE_PURPOSE (subobject_init) == subobject)
break;
- /* Give a warning, if appropriate. */
- if (warn_reorder && !f)
+ /* Issue a warning if the explicit initializer order does not
+ match that which will actually occur. */
+ if (warn_reorder && !subobject_init)
{
- cp_warning_at ("member initializers for `%#D'",
- TREE_PURPOSE (last_field));
- cp_warning_at (" and `%#D'", initialized_field);
- warning (" will be re-ordered to match declaration order");
+ if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
+ cp_warning_at ("`%D' will be initialized after",
+ TREE_PURPOSE (next_subobject));
+ else
+ warning ("base `%T' will be initialized after",
+ TREE_PURPOSE (next_subobject));
+ if (TREE_CODE (subobject) == FIELD_DECL)
+ cp_warning_at (" `%#D'", subobject);
+ else
+ warning (" base `%T'", subobject);
}
- /* Look again, from the beginning of the list. We must find the
- field on this loop. */
- if (!f)
+ /* Look again, from the beginning of the list. */
+ if (!subobject_init)
{
- f = init_list;
- while (TREE_PURPOSE (f) != initialized_field)
- f = TREE_CHAIN (f);
+ subobject_init = sorted_inits;
+ while (TREE_PURPOSE (subobject_init) != subobject)
+ subobject_init = TREE_CHAIN (subobject_init);
}
-
- /* If there was already an explicit initializer for this field,
- issue an error. */
- if (TREE_TYPE (f))
- error ("multiple initializations given for member `%D'",
- initialized_field);
- else
+
+ /* It is invalid to initialize the same subobject more than
+ once. */
+ if (TREE_VALUE (subobject_init))
{
- /* Mark the field as explicitly initialized. */
- TREE_TYPE (f) = error_mark_node;
- /* And insert the initializer. */
- TREE_VALUE (f) = TREE_VALUE (init);
+ if (TREE_CODE (subobject) == FIELD_DECL)
+ error ("multiple initializations given for `%D'", subobject);
+ else
+ error ("multiple initializations given for base `%T'",
+ subobject);
}
- /* Remember the location of the last explicitly initialized
- field. */
- last_field = f;
+ /* Record the initialization. */
+ TREE_VALUE (subobject_init) = TREE_VALUE (init);
+ next_subobject = subobject_init;
}
/* [class.base.init]
@@ -444,15 +562,16 @@ sort_member_init (t, member_init_list)
anonymous unions), the ctor-initializer is ill-formed. */
if (uses_unions_p)
{
- last_field = NULL_TREE;
- for (init = init_list; init; init = TREE_CHAIN (init))
+ tree last_field = NULL_TREE;
+ for (init = sorted_inits; init; init = TREE_CHAIN (init))
{
tree field;
tree field_type;
int done;
- /* Skip uninitialized members. */
- if (!TREE_TYPE (init))
+ /* Skip uninitialized members and base classes. */
+ if (!TREE_VALUE (init)
+ || TREE_CODE (TREE_PURPOSE (init)) != FIELD_DECL)
continue;
/* See if this field is a member of a union, or a member of a
structure contained in a union, etc. */
@@ -519,231 +638,73 @@ sort_member_init (t, member_init_list)
}
}
- return init_list;
+ return sorted_inits;
}
-/* Like sort_member_init, but used for initializers of base classes.
- *RBASE_PTR is filled in with the initializers for non-virtual bases;
- vbase_ptr gets the virtual bases. */
-
-static void
-sort_base_init (t, base_init_list, rbase_ptr, vbase_ptr)
- tree t;
- tree base_init_list;
- tree *rbase_ptr, *vbase_ptr;
-{
- tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
- int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
-
- int i;
- tree x;
- tree last;
-
- /* For warn_reorder. */
- int last_pos = 0;
- tree last_base = NULL_TREE;
-
- tree rbases = NULL_TREE;
- tree vbases = NULL_TREE;
-
- /* First walk through and splice out vbase and invalid initializers.
- Also replace types with binfos. */
-
- last = tree_cons (NULL_TREE, NULL_TREE, base_init_list);
- for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x))
- {
- tree basetype = TREE_PURPOSE (x);
- tree binfo = (TREE_CODE (basetype) == TREE_VEC
- ? basetype : binfo_or_else (basetype, t));
-
- if (binfo == NULL_TREE)
- /* BASETYPE might be an inaccessible direct base (because it
- is also an indirect base). */
- continue;
-
- if (TREE_VIA_VIRTUAL (binfo))
- {
- /* Virtual base classes are special cases. Their
- initializers are recorded with this constructor, and they
- are used when this constructor is the top-level
- constructor called. */
- tree v = binfo_for_vbase (BINFO_TYPE (binfo), t);
- vbases = tree_cons (v, TREE_VALUE (x), vbases);
- }
- else
- {
- /* Otherwise, it must be an immediate base class. */
- my_friendly_assert
- (same_type_p (BINFO_TYPE (BINFO_INHERITANCE_CHAIN (binfo)),
- t), 20011113);
-
- TREE_PURPOSE (x) = binfo;
- TREE_CHAIN (last) = x;
- last = x;
- }
- }
- TREE_CHAIN (last) = NULL_TREE;
-
- /* Now walk through our regular bases and make sure they're initialized. */
-
- for (i = 0; i < n_baseclasses; ++i)
- {
- /* The base for which we're currently initializing. */
- tree base_binfo = TREE_VEC_ELT (binfos, i);
- /* The initializer for BASE_BINFO. */
- tree init;
- int pos;
-
- if (TREE_VIA_VIRTUAL (base_binfo))
- continue;
-
- /* We haven't found the BASE_BINFO yet. */
- init = NULL_TREE;
- /* Loop through all the explicitly initialized bases, looking
- for an appropriate initializer. */
- for (x = base_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos)
- {
- tree binfo = TREE_PURPOSE (x);
-
- if (binfo == base_binfo && !init)
- {
- if (warn_reorder)
- {
- if (pos < last_pos)
- {
- cp_warning_at ("base initializers for `%#T'", last_base);
- cp_warning_at (" and `%#T'", BINFO_TYPE (binfo));
- warning (" will be re-ordered to match inheritance order");
- }
- last_pos = pos;
- last_base = BINFO_TYPE (binfo);
- }
-
- /* Make sure we won't try to work on this init again. */
- TREE_PURPOSE (x) = NULL_TREE;
- init = build_tree_list (binfo, TREE_VALUE (x));
- }
- else if (binfo == base_binfo)
- {
- error ("base class `%T' already initialized",
- BINFO_TYPE (binfo));
- break;
- }
- }
-
- /* If we didn't find BASE_BINFO in the list, create a dummy entry
- so the two lists (RBASES and the list of bases) will be
- symmetrical. */
- if (!init)
- init = build_tree_list (NULL_TREE, NULL_TREE);
- rbases = chainon (rbases, init);
- }
-
- *rbase_ptr = rbases;
- *vbase_ptr = vbases;
-}
-
-/* Perform whatever initializations have yet to be done on the base
- class, and non-static data members, of the CURRENT_CLASS_TYPE.
- These actions are given by the BASE_INIT_LIST and MEM_INIT_LIST,
- respectively.
-
- If there is a need for a call to a constructor, we must surround
- that call with a pushlevel/poplevel pair, since we are technically
- at the PARM level of scope. */
+/* Initialize all bases and members of CURRENT_CLASS_TYPE. MEM_INITS
+ is a TREE_LIST giving the explicit mem-initializer-list for the
+ constructor. The TREE_PURPOSE of each entry is a subobject (a
+ FIELD_DECL or a BINFO) of the CURRENT_CLASS_TYPE. The TREE_VALUE
+ is a TREE_LIST giving the arguments to the constructor or
+ void_type_node for an empty list of arguments. */
void
-emit_base_init (mem_init_list, base_init_list)
- tree mem_init_list;
- tree base_init_list;
+emit_mem_initializers (tree mem_inits)
{
- tree member;
- tree rbase_init_list, vbase_init_list;
- tree t = current_class_type;
- tree t_binfo = TYPE_BINFO (t);
- tree binfos = BINFO_BASETYPES (t_binfo);
- int i;
- int n_baseclasses = BINFO_N_BASETYPES (t_binfo);
-
- mem_init_list = sort_member_init (t, mem_init_list);
- sort_base_init (t, base_init_list, &rbase_init_list, &vbase_init_list);
-
- /* First, initialize the virtual base classes, if we are
- constructing the most-derived object. */
- if (TYPE_USES_VIRTUAL_BASECLASSES (t))
- {
- tree first_arg = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
- construct_virtual_bases (t, current_class_ref, current_class_ptr,
- vbase_init_list, first_arg);
- }
-
- /* Now, perform initialization of non-virtual base classes. */
- for (i = 0; i < n_baseclasses; i++)
- {
- tree base_binfo = TREE_VEC_ELT (binfos, i);
- tree init = void_list_node;
-
- if (TREE_VIA_VIRTUAL (base_binfo))
- continue;
-
- my_friendly_assert (BINFO_INHERITANCE_CHAIN (base_binfo) == t_binfo,
- 999);
-
- if (TREE_PURPOSE (rbase_init_list))
- init = TREE_VALUE (rbase_init_list);
- else if (TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (base_binfo)))
- {
- init = NULL_TREE;
- if (extra_warnings
- && DECL_COPY_CONSTRUCTOR_P (current_function_decl))
- warning ("base class `%#T' should be explicitly initialized in the copy constructor",
- BINFO_TYPE (base_binfo));
- }
-
- if (init != void_list_node)
+ /* Sort the mem-initializers into the order in which the
+ initializations should be performed. */
+ mem_inits = sort_mem_initializers (current_class_type, mem_inits);
+
+ /* Initialize base classes. */
+ while (mem_inits
+ && TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL)
+ {
+ tree subobject = TREE_PURPOSE (mem_inits);
+ tree arguments = TREE_VALUE (mem_inits);
+
+ /* If these initializations are taking place in a copy
+ constructor, the base class should probably be explicitly
+ initialized. */
+ if (extra_warnings && !arguments
+ && DECL_COPY_CONSTRUCTOR_P (current_function_decl)
+ && TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (subobject)))
+ warning ("base class `%#T' should be explicitly initialized in the "
+ "copy constructor",
+ BINFO_TYPE (subobject));
+
+ /* If an explicit -- but empty -- initializer list was present,
+ treat it just like default initialization at this point. */
+ if (arguments == void_type_node)
+ arguments = NULL_TREE;
+
+ /* Initialize the base. */
+ if (TREE_VIA_VIRTUAL (subobject))
+ construct_virtual_base (subobject, arguments);
+ else
{
- member = build_base_path (PLUS_EXPR, current_class_ptr,
- base_binfo, 1);
- expand_aggr_init_1 (base_binfo, NULL_TREE,
- build_indirect_ref (member, NULL), init,
+ tree base_addr;
+
+ base_addr = build_base_path (PLUS_EXPR, current_class_ptr,
+ subobject, 1);
+ expand_aggr_init_1 (subobject, NULL_TREE,
+ build_indirect_ref (base_addr, NULL),
+ arguments,
LOOKUP_NORMAL);
+ expand_cleanup_for_base (subobject, NULL_TREE);
}
- expand_cleanup_for_base (base_binfo, NULL_TREE);
- rbase_init_list = TREE_CHAIN (rbase_init_list);
+ mem_inits = TREE_CHAIN (mem_inits);
}
- /* Initialize the vtable pointers for the class. */
+ /* Initialize the vptrs. */
initialize_vtbl_ptrs (current_class_ptr);
- while (mem_init_list)
+ /* Initialize the data members. */
+ while (mem_inits)
{
- tree init;
- tree member;
- int from_init_list;
-
- member = TREE_PURPOSE (mem_init_list);
-
- /* See if we had a user-specified member initialization. */
- if (TREE_TYPE (mem_init_list))
- {
- init = TREE_VALUE (mem_init_list);
- from_init_list = 1;
- }
- else
- {
- init = DECL_INITIAL (member);
- from_init_list = 0;
-
- /* Effective C++ rule 12. */
- if (warn_ecpp && init == NULL_TREE
- && !DECL_ARTIFICIAL (member)
- && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE)
- warning ("`%D' should be initialized in the member initialization list", member);
- }
-
- perform_member_init (member, init, from_init_list);
- mem_init_list = TREE_CHAIN (mem_init_list);
+ perform_member_init (TREE_PURPOSE (mem_inits),
+ TREE_VALUE (mem_inits));
+ mem_inits = TREE_CHAIN (mem_inits);
}
}
@@ -840,7 +801,7 @@ expand_virtual_init (binfo, decl)
/* If an exception is thrown in a constructor, those base classes already
constructed must be destroyed. This function creates the cleanup
for BINFO, which has just been constructed. If FLAG is non-NULL,
- it is a DECL which is non-zero when this base needs to be
+ it is a DECL which is nonzero when this base needs to be
destroyed. */
static void
@@ -867,89 +828,57 @@ expand_cleanup_for_base (binfo, flag)
finish_eh_cleanup (expr);
}
-/* Subroutine of `expand_aggr_vbase_init'.
- BINFO is the binfo of the type that is being initialized.
- INIT_LIST is the list of initializers for the virtual baseclass. */
+/* Construct the virtual base-class VBASE passing the ARGUMENTS to its
+ constructor. */
static void
-expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
- tree binfo, exp, addr, init_list;
+construct_virtual_base (tree vbase, tree arguments)
{
- tree init = purpose_member (binfo, init_list);
- tree ref = build_indirect_ref (addr, NULL);
-
- if (init)
- init = TREE_VALUE (init);
- /* Call constructors, but don't set up vtables. */
- expand_aggr_init_1 (binfo, exp, ref, init, LOOKUP_COMPLAIN);
-}
-
-/* Construct the virtual base-classes of THIS_REF (whose address is
- THIS_PTR). The object has the indicated TYPE. The construction
- actually takes place only if FLAG is non-zero. INIT_LIST is list
- of initializations for constructors to perform. */
-
-static void
-construct_virtual_bases (type, this_ref, this_ptr, init_list, flag)
- tree type;
- tree this_ref;
- tree this_ptr;
- tree init_list;
- tree flag;
-{
- tree vbases;
-
- /* If there are no virtual baseclasses, we shouldn't even be here. */
- my_friendly_assert (TYPE_USES_VIRTUAL_BASECLASSES (type), 19990621);
-
- /* Now, run through the baseclasses, initializing each. */
- for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
- vbases = TREE_CHAIN (vbases))
- {
- tree inner_if_stmt;
- tree compound_stmt;
- tree exp;
- tree vbase;
-
- /* If there are virtual base classes with destructors, we need to
- emit cleanups to destroy them if an exception is thrown during
- the construction process. These exception regions (i.e., the
- period during which the cleanups must occur) begin from the time
- the construction is complete to the end of the function. If we
- create a conditional block in which to initialize the
- base-classes, then the cleanup region for the virtual base begins
- inside a block, and ends outside of that block. This situation
- confuses the sjlj exception-handling code. Therefore, we do not
- create a single conditional block, but one for each
- initialization. (That way the cleanup regions always begin
- in the outer block.) We trust the back-end to figure out
- that the FLAG will not change across initializations, and
- avoid doing multiple tests. */
- inner_if_stmt = begin_if_stmt ();
- finish_if_stmt_cond (flag, inner_if_stmt);
- compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
-
- /* Compute the location of the virtual base. If we're
- constructing virtual bases, then we must be the most derived
- class. Therefore, we don't have to look up the virtual base;
- we already know where it is. */
- vbase = TREE_VALUE (vbases);
- exp = build (PLUS_EXPR,
- TREE_TYPE (this_ptr),
- this_ptr,
- fold (build1 (NOP_EXPR, TREE_TYPE (this_ptr),
- BINFO_OFFSET (vbase))));
- exp = build1 (NOP_EXPR,
- build_pointer_type (BINFO_TYPE (vbase)),
- exp);
-
- expand_aggr_vbase_init_1 (vbase, this_ref, exp, init_list);
- finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
- finish_then_clause (inner_if_stmt);
- finish_if_stmt ();
-
- expand_cleanup_for_base (vbase, flag);
- }
+ tree inner_if_stmt;
+ tree compound_stmt;
+ tree exp;
+ tree flag;
+
+ /* If there are virtual base classes with destructors, we need to
+ emit cleanups to destroy them if an exception is thrown during
+ the construction process. These exception regions (i.e., the
+ period during which the cleanups must occur) begin from the time
+ the construction is complete to the end of the function. If we
+ create a conditional block in which to initialize the
+ base-classes, then the cleanup region for the virtual base begins
+ inside a block, and ends outside of that block. This situation
+ confuses the sjlj exception-handling code. Therefore, we do not
+ create a single conditional block, but one for each
+ initialization. (That way the cleanup regions always begin
+ in the outer block.) We trust the back-end to figure out
+ that the FLAG will not change across initializations, and
+ avoid doing multiple tests. */
+ flag = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
+ inner_if_stmt = begin_if_stmt ();
+ finish_if_stmt_cond (flag, inner_if_stmt);
+ compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
+
+ /* Compute the location of the virtual base. If we're
+ constructing virtual bases, then we must be the most derived
+ class. Therefore, we don't have to look up the virtual base;
+ we already know where it is. */
+ exp = build (PLUS_EXPR,
+ TREE_TYPE (current_class_ptr),
+ current_class_ptr,
+ fold (build1 (NOP_EXPR, TREE_TYPE (current_class_ptr),
+ BINFO_OFFSET (vbase))));
+ exp = build1 (NOP_EXPR,
+ build_pointer_type (BINFO_TYPE (vbase)),
+ exp);
+ exp = build1 (INDIRECT_REF, BINFO_TYPE (vbase), exp);
+
+ expand_aggr_init_1 (vbase, current_class_ref, exp,
+ arguments, LOOKUP_COMPLAIN);
+ finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
+ finish_then_clause (inner_if_stmt);
+ finish_if_stmt ();
+
+ expand_cleanup_for_base (vbase, flag);
}
/* Find the context in which this FIELD can be initialized. */
@@ -998,46 +927,41 @@ member_init_ok_or_else (field, type, member_name)
return 1;
}
-/* EXP is an expression of aggregate type. NAME is an IDENTIFIER_NODE
- which names a field, or it is a _TYPE node or TYPE_DECL which names
- a base for that type. INIT is a parameter list for that field's or
- base's constructor. Check the validity of NAME, and return a
- TREE_LIST of the base _TYPE or FIELD_DECL and the INIT. EXP is used
- only to get its type. If NAME is invalid, return NULL_TREE and
- issue a diagnostic.
+/* NAME is a FIELD_DECL, an IDENTIFIER_NODE which names a field, or it
+ is a _TYPE node or TYPE_DECL which names a base for that type.
+ INIT is a parameter list for that field's or base's constructor.
+ Check the validity of NAME, and return a TREE_LIST of the base
+ _TYPE or FIELD_DECL and the INIT. If NAME is invalid, return
+ NULL_TREE and issue a diagnostic.
An old style unnamed direct single base construction is permitted,
where NAME is NULL. */
tree
-expand_member_init (exp, name, init)
- tree exp, name, init;
+expand_member_init (tree name, tree init)
{
- tree basetype = NULL_TREE, field;
- tree type;
+ tree basetype;
+ tree field;
- if (exp == NULL_TREE)
+ if (!current_class_ref)
return NULL_TREE;
- type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
- my_friendly_assert (IS_AGGR_TYPE (type), 20011113);
-
if (!name)
{
/* This is an obsolete unnamed base class initializer. The
parser will already have warned about its use. */
- switch (CLASSTYPE_N_BASECLASSES (type))
+ switch (CLASSTYPE_N_BASECLASSES (current_class_type))
{
case 0:
error ("unnamed initializer for `%T', which has no base classes",
- type);
+ current_class_type);
return NULL_TREE;
case 1:
- basetype = TYPE_BINFO_BASETYPE (type, 0);
+ basetype = TYPE_BINFO_BASETYPE (current_class_type, 0);
break;
default:
error ("unnamed initializer for `%T', which uses multiple inheritance",
- type);
+ current_class_type);
return NULL_TREE;
}
}
@@ -1048,44 +972,54 @@ expand_member_init (exp, name, init)
}
else if (TREE_CODE (name) == TYPE_DECL)
basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name));
+ else
+ basetype = NULL_TREE;
my_friendly_assert (init != NULL_TREE, 0);
- if (init == void_type_node)
- init = NULL_TREE;
-
if (basetype)
{
+ tree binfo;
+
if (current_template_parms)
- ;
- else if (vec_binfo_member (basetype, TYPE_BINFO_BASETYPES (type)))
- /* A direct base. */;
- else if (binfo_for_vbase (basetype, type))
- /* A virtual base. */;
- else
+ return build_tree_list (basetype, init);
+
+ binfo = lookup_base (current_class_type, basetype,
+ ba_ignore, NULL);
+ if (binfo)
+ {
+ if (TREE_VIA_VIRTUAL (binfo))
+ binfo = binfo_for_vbase (basetype, current_class_type);
+ else if (BINFO_INHERITANCE_CHAIN (binfo)
+ != TYPE_BINFO (current_class_type))
+ binfo = NULL_TREE;
+ }
+ if (!binfo)
{
- if (TYPE_USES_VIRTUAL_BASECLASSES (type))
+ if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
error ("type `%D' is not a direct or virtual base of `%T'",
- name, type);
+ name, current_class_type);
else
error ("type `%D' is not a direct base of `%T'",
- name, type);
+ name, current_class_type);
return NULL_TREE;
}
- init = build_tree_list (basetype, init);
+ if (binfo)
+ return build_tree_list (binfo, init);
}
else
{
- field = lookup_field (type, name, 1, 0);
-
- if (! member_init_ok_or_else (field, type, name))
- return NULL_TREE;
+ if (TREE_CODE (name) == IDENTIFIER_NODE)
+ field = lookup_field (current_class_type, name, 1, 0);
+ else
+ field = name;
- init = build_tree_list (field, init);
+ if (member_init_ok_or_else (field, current_class_type, name))
+ return build_tree_list (field, init);
}
- return init;
+ return NULL_TREE;
}
/* This is like `expand_member_init', only it stores one aggregate
@@ -1109,8 +1043,6 @@ expand_member_init (exp, name, init)
The virtual function table pointer cannot be set up here, because
we do not really know its type.
- Virtual baseclass pointers are also set up here.
-
This never calls operator=().
When initializing, nothing is CONST.
@@ -1212,10 +1144,8 @@ build_init (decl, init, flags)
|| TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
expr = build_aggr_init (decl, init, flags);
else
- {
- expr = build (INIT_EXPR, TREE_TYPE (decl), decl, init);
- TREE_SIDE_EFFECTS (expr) = 1;
- }
+ expr = build (INIT_EXPR, TREE_TYPE (decl), decl, init);
+
return expr;
}
@@ -1251,10 +1181,13 @@ expand_default_init (binfo, true_exp, exp, init, flags)
to run a new constructor; and catching an exception, where we
have already built up the constructor call so we could wrap it
in an exception region. */;
- else if (TREE_CODE (init) == CONSTRUCTOR)
- /* A brace-enclosed initializer has whatever type is
- required. There's no need to convert it. */
- ;
+ else if (TREE_CODE (init) == CONSTRUCTOR
+ && TREE_HAS_CONSTRUCTOR (init))
+ {
+ /* A brace-enclosed initializer for an aggregate. */
+ my_friendly_assert (CP_AGGREGATE_TYPE_P (type), 20021016);
+ init = digest_init (type, init, (tree *)NULL);
+ }
else
init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
@@ -1327,6 +1260,7 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, flags)
tree type = TREE_TYPE (exp);
my_friendly_assert (init != error_mark_node && type != error_mark_node, 211);
+ my_friendly_assert (building_stmt_tree (), 20021010);
/* Use a function returning the desired type to initialize EXP for us.
If the function is a constructor, and its first argument is
@@ -1341,12 +1275,7 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, flags)
/* If store_init_value returns NULL_TREE, the INIT has been
record in the DECL_INITIAL for EXP. That means there's
nothing more we have to do. */
- if (!store_init_value (exp, init))
- {
- if (!building_stmt_tree ())
- expand_decl_init (exp);
- }
- else
+ if (store_init_value (exp, init))
finish_expr_stmt (build (INIT_EXPR, type, exp, init));
return;
}
@@ -2126,7 +2055,7 @@ build_new (placement, decl, init, use_global_new)
return rval;
}
-/* Given a Java class, return a decl for the corresponding java.lang.Class. */
+/* Given a Java class, return a decl for the corresponding java.lang.Class. */
tree
build_java_class_ref (type)
@@ -2793,10 +2722,6 @@ build_vec_init (base, init, from_array)
if (maxindex == error_mark_node)
return error_mark_node;
- /* For g++.ext/arrnew.C. */
- if (init && TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == NULL_TREE)
- init = digest_init (atype, init, 0);
-
if (init
&& (from_array == 2
? (!CLASS_TYPE_P (type) || !TYPE_HAS_COMPLEX_ASSIGN_REF (type))
@@ -2813,7 +2738,6 @@ build_vec_init (base, init, from_array)
store_constructor will handle the semantics for us. */
stmt_expr = build (INIT_EXPR, atype, base, init);
- TREE_SIDE_EFFECTS (stmt_expr) = 1;
return stmt_expr;
}
@@ -3170,8 +3094,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
else if (TREE_CODE (type) == ARRAY_TYPE)
{
handle_array:
- if (TREE_SIDE_EFFECTS (addr))
- addr = save_expr (addr);
+
if (TYPE_DOMAIN (type) == NULL_TREE)
{
error ("unknown array size in delete");
@@ -3218,7 +3141,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
{
/* We will use ADDR multiple times so we must save it. */
addr = save_expr (addr);
- /* Delete the object. */
+ /* Delete the object. */
do_delete = build_builtin_delete_call (addr);
/* Otherwise, treat this like a complete object destructor
call. */
@@ -3337,7 +3260,7 @@ push_base_cleanups ()
for (member = TYPE_FIELDS (current_class_type); member;
member = TREE_CHAIN (member))
{
- if (TREE_CODE (member) != FIELD_DECL)
+ if (TREE_CODE (member) != FIELD_DECL || DECL_ARTIFICIAL (member))
continue;
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
{
@@ -3413,15 +3336,13 @@ build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
base = stabilize_reference (base);
- /* Since we can use base many times, save_expr it. */
- if (TREE_SIDE_EFFECTS (base))
- base = save_expr (base);
-
if (TREE_CODE (type) == POINTER_TYPE)
{
/* Step back one from start of vector, and read dimension. */
tree cookie_addr;
+ if (TREE_SIDE_EFFECTS (base))
+ base = save_expr (base);
type = strip_array_types (TREE_TYPE (type));
cookie_addr = build (MINUS_EXPR,
build_pointer_type (sizetype),
@@ -3435,6 +3356,8 @@ build_vec_delete (base, maxindex, auto_delete_vec, use_global_delete)
maxindex = array_type_nelts_total (type);
type = strip_array_types (type);
base = build_unary_op (ADDR_EXPR, base, 1);
+ if (TREE_SIDE_EFFECTS (base))
+ base = save_expr (base);
}
else
{
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 183efd72ca5..4558940d675 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -263,7 +263,8 @@ init_operators ()
: &operator_name_info[(int) CODE]); \
oni->identifier = identifier; \
oni->name = NAME; \
- oni->mangled_name = MANGLING;
+ oni->mangled_name = MANGLING; \
+ oni->arity = ARITY;
#include "operators.def"
#undef DEF_OPERATOR
@@ -540,7 +541,7 @@ const short rid_to_yy[RID_MAX] =
/* RID_REINTCAST */ REINTERPRET_CAST,
/* RID_STATCAST */ STATIC_CAST,
- /* Objective C */
+ /* Objective-C */
/* RID_ID */ 0,
/* RID_AT_ENCODE */ 0,
/* RID_AT_END */ 0,
@@ -1073,7 +1074,7 @@ do_pending_lang_change ()
pop_lang_context ();
}
-/* Return true if d is in a global scope. */
+/* Return true if d is in a global scope. */
static int
is_global (d)
@@ -1135,7 +1136,7 @@ do_identifier (token, parsing, args)
tree args;
{
register tree id;
- int lexing = (parsing == 1);
+ int lexing = (parsing == 1 || parsing == 3);
if (! lexing)
id = lookup_name (token, 0);
@@ -1157,7 +1158,7 @@ do_identifier (token, parsing, args)
/* Remember that this name has been used in the class definition, as per
[class.scope0] */
- if (id && parsing)
+ if (id && parsing && parsing != 3)
maybe_note_name_used_in_class (token, id);
if (id == error_mark_node)
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index ed6c547f475..bc7e970cdd9 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -75,15 +75,16 @@
# define MANGLE_TRACE_TREE(FN, NODE)
#endif
-/* Non-zero if NODE is a class template-id. We can't rely on
+/* Nonzero if NODE is a class template-id. We can't rely on
CLASSTYPE_USE_TEMPLATE here because of tricky bugs in the parser
that hard to distinguish A<T> from A, where A<T> is the type as
instantiated outside of the template, and A is the type used
without parameters inside the template. */
-#define CLASSTYPE_TEMPLATE_ID_P(NODE) \
- (TYPE_LANG_SPECIFIC (NODE) != NULL \
- && CLASSTYPE_TEMPLATE_INFO (NODE) != NULL \
- && (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))
+#define CLASSTYPE_TEMPLATE_ID_P(NODE) \
+ (TYPE_LANG_SPECIFIC (NODE) != NULL \
+ && (TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM \
+ || (CLASSTYPE_TEMPLATE_INFO (NODE) != NULL \
+ && (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))))
/* Things we only need one of. This module is not reentrant. */
static struct globals
@@ -95,10 +96,17 @@ static struct globals
we've seen them. */
varray_type substitutions;
+ /* The entity that is being mangled. */
+ tree entity;
+
/* We are mangling an internal symbol. It is important to keep those
involving template parmeters distinct by distinguishing their level
and, for non-type parms, their type. */
bool internal_mangling_p;
+
+ /* True if the mangling will be different in a future version of the
+ ABI. */
+ bool need_abi_warning;
} G;
/* Indices into subst_identifiers. These are identifiers used in
@@ -158,6 +166,7 @@ static void write_nested_name PARAMS ((tree));
static void write_prefix PARAMS ((tree));
static void write_template_prefix PARAMS ((tree));
static void write_unqualified_name PARAMS ((tree));
+static void write_conversion_operator_name (tree);
static void write_source_name PARAMS ((tree));
static int hwint_to_ascii PARAMS ((unsigned HOST_WIDE_INT, unsigned int, char *, unsigned));
static void write_number PARAMS ((unsigned HOST_WIDE_INT, int,
@@ -192,11 +201,11 @@ static const char *mangle_decl_string PARAMS ((tree));
/* Control functions. */
-static inline void start_mangling PARAMS ((void));
-static inline const char *finish_mangling PARAMS ((void));
+static inline void start_mangling (tree);
+static inline const char *finish_mangling (bool);
static tree mangle_special_for_type PARAMS ((tree, const char *));
-/* Foreign language functions. */
+/* Foreign language functions. */
static void write_java_integer_type_codes PARAMS ((tree));
@@ -205,7 +214,7 @@ static void write_java_integer_type_codes PARAMS ((tree));
#define write_char(CHAR) \
obstack_1grow (&G.name_obstack, (CHAR))
-/* Append a sized buffer to the end of the mangled representation. */
+/* Append a sized buffer to the end of the mangled representation. */
#define write_chars(CHAR, LEN) \
obstack_grow (&G.name_obstack, (CHAR), (LEN))
@@ -214,7 +223,7 @@ static void write_java_integer_type_codes PARAMS ((tree));
#define write_string(STRING) \
obstack_grow (&G.name_obstack, (STRING), strlen (STRING))
-/* Non-zero if NODE1 and NODE2 are both TREE_LIST nodes and have the
+/* Nonzero if NODE1 and NODE2 are both TREE_LIST nodes and have the
same purpose (context, which may be a type) and value (template
decl). See write_template_prefix for more information on what this
is used for. */
@@ -230,7 +239,7 @@ static void write_java_integer_type_codes PARAMS ((tree));
#define write_unsigned_number(NUMBER) \
write_number ((NUMBER), /*unsigned_p=*/1, 10)
-/* If DECL is a template instance, return non-zero and, if
+/* If DECL is a template instance, return nonzero and, if
TEMPLATE_INFO is non-NULL, set *TEMPLATE_INFO to its template info.
Otherwise return zero. */
@@ -250,7 +259,7 @@ decl_is_template_id (decl, template_info)
if (template_info != NULL)
/* For a templated TYPE_DECL, the template info is hanging
off the type. */
- *template_info = CLASSTYPE_TEMPLATE_INFO (type);
+ *template_info = TYPE_TEMPLATE_INFO (type);
return 1;
}
}
@@ -370,7 +379,7 @@ add_substitution (node)
dump_substitution_candidates ();
}
-/* Helper function for find_substitution. Returns non-zero if NODE,
+/* Helper function for find_substitution. Returns nonzero if NODE,
which may be a decl or a CLASS_TYPE, is a template-id with template
name of substitution_index[INDEX] in the ::std namespace. */
@@ -398,12 +407,12 @@ is_std_substitution (node, index)
return (DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))
&& TYPE_LANG_SPECIFIC (type)
- && CLASSTYPE_TEMPLATE_INFO (type)
- && (DECL_NAME (CLASSTYPE_TI_TEMPLATE (type))
+ && TYPE_TEMPLATE_INFO (type)
+ && (DECL_NAME (TYPE_TI_TEMPLATE (type))
== subst_identifiers[index]));
}
-/* Helper function for find_substitution. Returns non-zero if NODE,
+/* Helper function for find_substitution. Returns nonzero if NODE,
which may be a decl or a CLASS_TYPE, is the template-id
::std::identifier<char>, where identifier is
substitution_index[INDEX]. */
@@ -463,7 +472,7 @@ is_std_substitution_char (node, index)
candidates for entities appearing earlier in the same mangling
If a substitution is found, write its mangled representation and
- return non-zero. If none is found, just return zero. */
+ return nonzero. If none is found, just return zero. */
static int
find_substitution (node)
@@ -575,7 +584,7 @@ find_substitution (node)
}
/* Now check the list of available substitutions for this mangling
- operation. */
+ operation. */
for (i = 0; i < size; ++i)
{
tree candidate = VARRAY_TREE (G.substitutions, i);
@@ -665,7 +674,7 @@ write_encoding (decl)
::= <nested-name>
::= <local-name>
- If IGNORE_LOCAL_SCOPE is non-zero, this production of <name> is
+ If IGNORE_LOCAL_SCOPE is nonzero, this production of <name> is
called from <local-name>, which mangles the enclosing scope
elsewhere and then uses this function to mangle just the part
underneath the function scope. So don't use the <local-name>
@@ -837,7 +846,8 @@ write_nested_name (decl)
write_char ('E');
}
-/* <prefix> ::= <prefix> <unqualified-name>>
+/* <prefix> ::= <prefix> <unqualified-name>
+ ::= <template-param>
::= <template-prefix> <template-args>
::= # empty
::= <substitution> */
@@ -860,7 +870,6 @@ write_prefix (node)
return;
if (DECL_P (node))
- /* Node is a decl. */
{
/* If this is a function decl, that means we've hit function
scope, so this prefix must be for a local name. In this
@@ -874,14 +883,22 @@ write_prefix (node)
decl_is_template_id (decl, &template_info);
}
else
- /* Node is a type. */
{
+ /* Node is a type. */
decl = TYPE_NAME (node);
if (CLASSTYPE_TEMPLATE_ID_P (node))
- template_info = CLASSTYPE_TEMPLATE_INFO (node);
+ template_info = TYPE_TEMPLATE_INFO (node);
}
- if (template_info != NULL)
+ /* In G++ 3.2, the name of the template parameter was used. */
+ if (TREE_CODE (node) == TEMPLATE_TYPE_PARM
+ && !abi_version_at_least (2))
+ G.need_abi_warning = true;
+
+ if (TREE_CODE (node) == TEMPLATE_TYPE_PARM
+ && abi_version_at_least (2))
+ write_template_param (node);
+ else if (template_info != NULL)
/* Templated. */
{
write_template_prefix (decl);
@@ -898,6 +915,7 @@ write_prefix (node)
}
/* <template-prefix> ::= <prefix> <template component>
+ ::= <template-param>
::= <substitution> */
static void
@@ -917,7 +935,7 @@ write_template_prefix (node)
if (decl_is_template_id (decl, &template_info))
template = TI_TEMPLATE (template_info);
else if (CLASSTYPE_TEMPLATE_ID_P (type))
- template = CLASSTYPE_TI_TEMPLATE (type);
+ template = TYPE_TI_TEMPLATE (type);
else
/* Oops, not a template. */
abort ();
@@ -952,8 +970,19 @@ write_template_prefix (node)
if (find_substitution (substitution))
return;
- write_prefix (context);
- write_unqualified_name (decl);
+ /* In G++ 3.2, the name of the template template parameter was used. */
+ if (TREE_CODE (TREE_TYPE (template)) == TEMPLATE_TEMPLATE_PARM
+ && !abi_version_at_least (2))
+ G.need_abi_warning = true;
+
+ if (TREE_CODE (TREE_TYPE (template)) == TEMPLATE_TEMPLATE_PARM
+ && abi_version_at_least (2))
+ write_template_param (TREE_TYPE (template));
+ else
+ {
+ write_prefix (context);
+ write_unqualified_name (decl);
+ }
add_substitution (substitution);
}
@@ -988,8 +1017,7 @@ write_unqualified_name (decl)
}
else
type = TREE_TYPE (DECL_NAME (decl));
- write_string ("cv");
- write_type (type);
+ write_conversion_operator_name (type);
}
else if (DECL_OVERLOADED_OPERATOR_P (decl))
{
@@ -1005,6 +1033,15 @@ write_unqualified_name (decl)
write_source_name (DECL_NAME (decl));
}
+/* Write the unqualified-name for a conversion operator to TYPE. */
+
+static void
+write_conversion_operator_name (tree type)
+{
+ write_string ("cv");
+ write_type (type);
+}
+
/* Non-termial <source-name>. IDENTIFIER is an IDENTIFIER_NODE.
<source-name> ::= </length/ number> <identifier> */
@@ -1080,7 +1117,7 @@ write_number (number, unsigned_p, base)
/* Write out an integral CST in decimal. Most numbers are small, and
representable in a HOST_WIDE_INT. Occasionally we'll have numbers
- bigger than that, which we must deal with. */
+ bigger than that, which we must deal with. */
static inline void
write_integer_cst (cst)
@@ -1091,7 +1128,7 @@ write_integer_cst (cst)
if (TREE_INT_CST_HIGH (cst) + (sign < 0))
{
/* A bignum. We do this in chunks, each of which fits in a
- HOST_WIDE_INT. */
+ HOST_WIDE_INT. */
char buffer[sizeof (HOST_WIDE_INT) * 8 * 2];
unsigned HOST_WIDE_INT chunk;
unsigned chunk_digits;
@@ -1101,13 +1138,13 @@ write_integer_cst (cst)
int done;
/* HOST_WIDE_INT must be at least 32 bits, so 10^9 is
- representable. */
+ representable. */
chunk = 1000000000;
chunk_digits = 9;
if (sizeof (HOST_WIDE_INT) >= 8)
{
- /* It is at least 64 bits, so 10^18 is representable. */
+ /* It is at least 64 bits, so 10^18 is representable. */
chunk_digits = 18;
chunk *= chunk;
}
@@ -1275,7 +1312,7 @@ static void
write_discriminator (discriminator)
int discriminator;
{
- /* If discriminator is zero, don't write anything. Otherwise... */
+ /* If discriminator is zero, don't write anything. Otherwise... */
if (discriminator > 0)
{
write_char ('_');
@@ -1341,7 +1378,7 @@ static void
write_type (type)
tree type;
{
- /* This gets set to non-zero if TYPE turns out to be a (possibly
+ /* This gets set to nonzero if TYPE turns out to be a (possibly
CV-qualified) builtin type. */
int is_builtin_type = 0;
@@ -1645,7 +1682,7 @@ write_function_type (type)
}
/* Non-terminal <bare-function-type>. TYPE is a FUNCTION_TYPE or
- METHOD_TYPE. If INCLUDE_RETURN_TYPE is non-zero, the return value
+ METHOD_TYPE. If INCLUDE_RETURN_TYPE is nonzero, the return value
is mangled before the parameter types. If non-NULL, DECL is
FUNCTION_DECL for the function whose type is being emitted.
@@ -1670,7 +1707,7 @@ write_bare_function_type (type, include_return_type_p, decl)
}
/* Write the mangled representation of a method parameter list of
- types given in PARM_TYPES. If METHOD_P is non-zero, the function is
+ types given in PARM_TYPES. If METHOD_P is nonzero, the function is
considered a non-static method, and the this parameter is omitted.
If non-NULL, DECL is the FUNCTION_DECL for the function whose
parameters are being emitted. */
@@ -1752,24 +1789,37 @@ static void
write_template_args (args)
tree args;
{
- int i;
- int length = TREE_VEC_LENGTH (args);
-
MANGLE_TRACE_TREE ("template-args", args);
- my_friendly_assert (length > 0, 20000422);
+ write_char ('I');
+
+ if (TREE_CODE (args) == TREE_VEC)
+ {
+ int i;
+ int length = TREE_VEC_LENGTH (args);
+ my_friendly_assert (length > 0, 20000422);
- if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
+ if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
+ {
+ /* We have nested template args. We want the innermost template
+ argument list. */
+ args = TREE_VEC_ELT (args, length - 1);
+ length = TREE_VEC_LENGTH (args);
+ }
+ for (i = 0; i < length; ++i)
+ write_template_arg (TREE_VEC_ELT (args, i));
+ }
+ else
{
- /* We have nested template args. We want the innermost template
- argument list. */
- args = TREE_VEC_ELT (args, length - 1);
- length = TREE_VEC_LENGTH (args);
+ my_friendly_assert (TREE_CODE (args) == TREE_LIST, 20021014);
+
+ while (args)
+ {
+ write_template_arg (TREE_VALUE (args));
+ args = TREE_CHAIN (args);
+ }
}
- write_char ('I');
- for (i = 0; i < length; ++i)
- write_template_arg (TREE_VEC_ELT (args, i));
write_char ('E');
}
@@ -1779,7 +1829,9 @@ write_template_args (args)
<expr-primary> ::= <template-param>
::= L <type> <value number> E # literal
- ::= L <mangled-name> E # external name */
+ ::= L <mangled-name> E # external name
+ ::= sr <type> <unqualified-name>
+ ::= sr <type> <unqualified-name> <template-args> */
static void
write_expression (expr)
@@ -1810,17 +1862,22 @@ write_expression (expr)
code = TREE_CODE (expr);
}
- /* Handle template parameters. */
+ /* Handle template parameters. */
if (code == TEMPLATE_TYPE_PARM
|| code == TEMPLATE_TEMPLATE_PARM
|| code == BOUND_TEMPLATE_TEMPLATE_PARM
|| code == TEMPLATE_PARM_INDEX)
write_template_param (expr);
/* Handle literals. */
- else if (TREE_CODE_CLASS (code) == 'c')
+ else if (TREE_CODE_CLASS (code) == 'c'
+ || (abi_version_at_least (2) && code == CONST_DECL))
write_template_arg_literal (expr);
else if (DECL_P (expr))
{
+ /* G++ 3.2 incorrectly mangled non-type template arguments of
+ enumeration type using their names. */
+ if (code == CONST_DECL)
+ G.need_abi_warning = 1;
write_char ('L');
write_mangled_name (expr);
write_char ('E');
@@ -1831,6 +1888,75 @@ write_expression (expr)
write_string ("st");
write_type (TREE_OPERAND (expr, 0));
}
+ else if (abi_version_at_least (2) && TREE_CODE (expr) == SCOPE_REF)
+ {
+ tree scope = TREE_OPERAND (expr, 0);
+ tree member = TREE_OPERAND (expr, 1);
+
+ /* If the MEMBER is a real declaration, then the qualifying
+ scope was not dependent. Ideally, we would not have a
+ SCOPE_REF in those cases, but sometimes we do. If the second
+ argument is a DECL, then the name must not have been
+ dependent. */
+ if (DECL_P (member))
+ write_expression (member);
+ else
+ {
+ tree template_args;
+
+ write_string ("sr");
+ write_type (scope);
+ /* If MEMBER is a template-id, separate the template
+ from the arguments. */
+ if (TREE_CODE (member) == TEMPLATE_ID_EXPR)
+ {
+ template_args = TREE_OPERAND (member, 1);
+ member = TREE_OPERAND (member, 0);
+ if (TREE_CODE (member) == LOOKUP_EXPR)
+ member = TREE_OPERAND (member, 0);
+ }
+ else
+ template_args = NULL_TREE;
+ /* Write out the name of the MEMBER. */
+ if (IDENTIFIER_TYPENAME_P (member))
+ write_conversion_operator_name (TREE_TYPE (member));
+ else if (IDENTIFIER_OPNAME_P (member))
+ {
+ int i;
+ const char *mangled_name = NULL;
+
+ /* Unfortunately, there is no easy way to go from the
+ name of the operator back to the corresponding tree
+ code. */
+ for (i = 0; i < LAST_CPLUS_TREE_CODE; ++i)
+ if (operator_name_info[i].identifier == member)
+ {
+ /* The ABI says that we prefer binary operator
+ names to unary operator names. */
+ if (operator_name_info[i].arity == 2)
+ {
+ mangled_name = operator_name_info[i].mangled_name;
+ break;
+ }
+ else if (!mangled_name)
+ mangled_name = operator_name_info[i].mangled_name;
+ }
+ else if (assignment_operator_name_info[i].identifier
+ == member)
+ {
+ mangled_name
+ = assignment_operator_name_info[i].mangled_name;
+ break;
+ }
+ write_string (mangled_name);
+ }
+ else
+ write_source_name (member);
+ /* Write out the template arguments. */
+ if (template_args)
+ write_template_args (template_args);
+ }
+ }
else
{
int i;
@@ -1852,7 +1978,7 @@ write_expression (expr)
code = TREE_CODE (expr);
}
-
+
/* If it wasn't any of those, recursively expand the expression. */
write_string (operator_name_info[(int) code].mangled_name);
@@ -1876,7 +2002,12 @@ write_expression (expr)
if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE)
write_source_name (TREE_OPERAND (expr, 1));
else
- write_encoding (TREE_OPERAND (expr, 1));
+ {
+ /* G++ 3.2 incorrectly put out both the "sr" code and
+ the nested name of the qualified name. */
+ G.need_abi_warning = 1;
+ write_encoding (TREE_OPERAND (expr, 1));
+ }
break;
default:
@@ -1979,15 +2110,20 @@ write_template_arg (node)
else if (code == TEMPLATE_DECL)
/* A template appearing as a template arg is a template template arg. */
write_template_template_arg (node);
+ else if ((TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
+ || (abi_version_at_least (2) && code == CONST_DECL))
+ write_template_arg_literal (node);
else if (DECL_P (node))
{
+ /* G++ 3.2 incorrectly mangled non-type template arguments of
+ enumeration type using their names. */
+ if (code == CONST_DECL)
+ G.need_abi_warning = 1;
write_char ('L');
write_char ('Z');
write_encoding (node);
write_char ('E');
}
- else if (TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
- write_template_arg_literal (node);
else
{
/* Template arguments may be expressions. */
@@ -2168,20 +2304,29 @@ write_substitution (seq_id)
write_char ('_');
}
-/* Start mangling a new name or type. */
+/* Start mangling ENTITY. */
static inline void
-start_mangling ()
+start_mangling (tree entity)
{
+ G.entity = entity;
+ G.need_abi_warning = false;
VARRAY_TREE_INIT (G.substitutions, 1, "mangling substitutions");
obstack_free (&G.name_obstack, obstack_base (&G.name_obstack));
}
-/* Done with mangling. Return the generated mangled name. */
+/* Done with mangling. Return the generated mangled name. If WARN is
+ true, and the name of G.entity will be mangled differently in a
+ future version of the ABI, issue a warning. */
static inline const char *
-finish_mangling ()
+finish_mangling (bool warn)
{
+ if (warn_abi && warn && G.need_abi_warning)
+ warning ("the mangled name of `%D' will change in a future "
+ "version of GCC",
+ G.entity);
+
/* Clear all the substitutions. */
G.substitutions = 0;
@@ -2216,7 +2361,7 @@ mangle_decl_string (decl)
{
const char *result;
- start_mangling ();
+ start_mangling (decl);
if (TREE_CODE (decl) == TYPE_DECL)
write_type (TREE_TYPE (decl));
@@ -2243,7 +2388,7 @@ mangle_decl_string (decl)
write_string (" *INTERNAL* ");
}
- result = finish_mangling ();
+ result = finish_mangling (/*warn=*/true);
if (DEBUG_MANGLE)
fprintf (stderr, "mangle_decl_string = '%s'\n\n", result);
return result;
@@ -2268,9 +2413,9 @@ mangle_type_string (type)
{
const char *result;
- start_mangling ();
+ start_mangling (type);
write_type (type);
- result = finish_mangling ();
+ result = finish_mangling (/*warn=*/false);
if (DEBUG_MANGLE)
fprintf (stderr, "mangle_type_string = '%s'\n\n", result);
return result;
@@ -2298,7 +2443,7 @@ mangle_special_for_type (type, code)
/* We don't have an actual decl here for the special component, so
we can't just process the <encoded-name>. Instead, fake it. */
- start_mangling ();
+ start_mangling (type);
/* Start the mangling. */
write_string ("_Z");
@@ -2306,7 +2451,7 @@ mangle_special_for_type (type, code)
/* Add the type. */
write_type (type);
- result = finish_mangling ();
+ result = finish_mangling (/*warn=*/false);
if (DEBUG_MANGLE)
fprintf (stderr, "mangle_special_for_type = %s\n\n", result);
@@ -2373,7 +2518,7 @@ mangle_ctor_vtbl_for_type (type, binfo)
{
const char *result;
- start_mangling ();
+ start_mangling (type);
write_string ("_Z");
write_string ("TC");
@@ -2382,7 +2527,7 @@ mangle_ctor_vtbl_for_type (type, binfo)
write_char ('_');
write_type (BINFO_TYPE (binfo));
- result = finish_mangling ();
+ result = finish_mangling (/*warn=*/false);
if (DEBUG_MANGLE)
fprintf (stderr, "mangle_ctor_vtbl_for_type = %s\n\n", result);
return get_identifier (result);
@@ -2406,7 +2551,7 @@ mangle_thunk (fn_decl, offset, vcall_offset)
{
const char *result;
- start_mangling ();
+ start_mangling (fn_decl);
write_string ("_Z");
/* The <special-name> for virtual thunks is Tv, for non-virtual
@@ -2432,7 +2577,7 @@ mangle_thunk (fn_decl, offset, vcall_offset)
/* Scoped name. */
write_encoding (fn_decl);
- result = finish_mangling ();
+ result = finish_mangling (/*warn=*/false);
if (DEBUG_MANGLE)
fprintf (stderr, "mangle_thunk = %s\n\n", result);
return get_identifier (result);
@@ -2484,7 +2629,7 @@ tree
mangle_guard_variable (variable)
tree variable;
{
- start_mangling ();
+ start_mangling (variable);
write_string ("_ZGV");
if (strncmp (IDENTIFIER_POINTER (DECL_NAME (variable)), "_ZGR", 4) == 0)
/* The name of a guard variable for a reference temporary should refer
@@ -2492,7 +2637,7 @@ mangle_guard_variable (variable)
write_string (IDENTIFIER_POINTER (DECL_NAME (variable)) + 4);
else
write_name (variable, /*ignore_local_scope=*/0);
- return get_identifier (finish_mangling ());
+ return get_identifier (finish_mangling (/*warn=*/false));
}
/* Return an identifier for the name of a temporary variable used to
@@ -2503,10 +2648,10 @@ tree
mangle_ref_init_variable (variable)
tree variable;
{
- start_mangling ();
+ start_mangling (variable);
write_string ("_ZGR");
write_name (variable, /*ignore_local_scope=*/0);
- return get_identifier (finish_mangling ());
+ return get_identifier (finish_mangling (/*warn=*/false));
}
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 5fa7433c860..cb88833ab23 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA. */
#include "toplev.h"
#include "ggc.h"
#include "tm_p.h"
+#include "target.h"
/* Various flags to control the mangling process. */
@@ -350,7 +351,7 @@ make_thunk (function, delta, vcall_index)
}
/* Emit the definition of a C++ multiple inheritance vtable thunk. If
- EMIT_P is non-zero, the thunk is emitted immediately. */
+ EMIT_P is nonzero, the thunk is emitted immediately. */
void
use_thunk (thunk_fndecl, emit_p)
@@ -408,8 +409,8 @@ use_thunk (thunk_fndecl, emit_p)
BLOCK_VARS (DECL_INITIAL (thunk_fndecl))
= DECL_ARGUMENTS (thunk_fndecl);
-#ifdef ASM_OUTPUT_MI_THUNK
- if (!vcall_offset)
+ if (targetm.asm_out.output_mi_vcall_thunk
+ || (targetm.asm_out.output_mi_thunk && !vcall_offset))
{
const char *fnname;
current_function_decl = thunk_fndecl;
@@ -419,18 +420,32 @@ use_thunk (thunk_fndecl, emit_p)
init_function_start (thunk_fndecl, input_filename, lineno);
current_function_is_thunk = 1;
assemble_start_function (thunk_fndecl, fnname);
- ASM_OUTPUT_MI_THUNK (asm_out_file, thunk_fndecl, delta, function);
+ if (targetm.asm_out.output_mi_vcall_thunk)
+ {
+ HOST_WIDE_INT vcall_value;
+
+ if (vcall_offset)
+ vcall_value = tree_low_cst (vcall_offset, /*pos=*/0);
+ else
+ vcall_value = 0;
+ targetm.asm_out.output_mi_vcall_thunk (asm_out_file,
+ thunk_fndecl, delta,
+ vcall_value,
+ function);
+ }
+ else
+ targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
+ delta, function);
assemble_end_function (thunk_fndecl, fnname);
current_function_decl = 0;
cfun = 0;
TREE_ASM_WRITTEN (thunk_fndecl) = 1;
}
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. */
+ /* If we don't have the necessary code 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;
@@ -536,7 +551,6 @@ do_build_copy_constructor (fndecl)
int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
tree member_init_list = NULL_TREE;
- tree base_init_list = NULL_TREE;
int cvquals = cp_type_quals (TREE_TYPE (parm));
int i;
@@ -550,10 +564,12 @@ do_build_copy_constructor (fndecl)
{
tree binfo = TREE_VALUE (t);
- base_init_list = tree_cons (binfo,
- build_base_path (PLUS_EXPR, parm,
- binfo, 1),
- base_init_list);
+ member_init_list
+ = tree_cons (binfo,
+ build_tree_list (NULL_TREE,
+ build_base_path (PLUS_EXPR, parm,
+ binfo, 1)),
+ member_init_list);
}
for (i = 0; i < n_bases; ++i)
@@ -562,10 +578,12 @@ do_build_copy_constructor (fndecl)
if (TREE_VIA_VIRTUAL (binfo))
continue;
- base_init_list = tree_cons (binfo,
- build_base_path (PLUS_EXPR, parm,
- binfo, 1),
- base_init_list);
+ member_init_list
+ = tree_cons (binfo,
+ build_tree_list (NULL_TREE,
+ build_base_path (PLUS_EXPR, parm,
+ binfo, 1)),
+ member_init_list);
}
for (; fields; fields = TREE_CHAIN (fields))
@@ -609,9 +627,7 @@ do_build_copy_constructor (fndecl)
member_init_list
= tree_cons (field, init, member_init_list);
}
- member_init_list = nreverse (member_init_list);
- base_init_list = nreverse (base_init_list);
- emit_base_init (member_init_list, base_init_list);
+ finish_mem_initializers (member_init_list);
}
}
@@ -668,7 +684,7 @@ do_build_assign_ref (fndecl)
tree comp, init, t;
tree field = fields;
- if (TREE_CODE (field) != FIELD_DECL)
+ if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
continue;
if (CP_TYPE_CONST_P (TREE_TYPE (field)))
@@ -704,7 +720,7 @@ do_build_assign_ref (fndecl)
comp = build (COMPONENT_REF, TREE_TYPE (field), comp, field);
init = build (COMPONENT_REF,
- build_qualified_type (TREE_TYPE (field), cvquals),
+ cp_build_qualified_type (TREE_TYPE (field), cvquals),
init, field);
if (DECL_NAME (field))
@@ -749,7 +765,7 @@ synthesize_method (fndecl)
during the generation of the implicit body points at the place
where the attempt to generate the function occurs, giving the
user a hint as to why we are attempting to generate the
- function. */
+ function. */
DECL_SOURCE_LINE (fndecl) = lineno;
DECL_SOURCE_FILE (fndecl) = input_filename;
@@ -824,7 +840,7 @@ synthesize_exception_spec (type, extractor, client)
tree type = TREE_TYPE (fields);
tree fn;
- if (TREE_CODE (fields) != FIELD_DECL)
+ if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
continue;
while (TREE_CODE (type) == ARRAY_TYPE)
type = TREE_TYPE (type);
diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def
index 85043803f4d..b3e20d66239 100644
--- a/gcc/cp/operators.def
+++ b/gcc/cp/operators.def
@@ -54,7 +54,7 @@ Boston, MA 02111-1307, USA. */
ASSN_P
- A boolean value. If non-zero, this is an assignment operator.
+ A boolean value. If nonzero, this is an assignment operator.
Before including this file, you should define DEFOPERATOR
to take these arguments.
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 177b74232c5..6fbcc2be192 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -1,5 +1,5 @@
/* Perform optimizations on tree structure.
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Written by Mark Michell (mark@codesourcery.com).
This file is part of GNU CC.
@@ -41,7 +41,7 @@ static tree calls_setjmp_r PARAMS ((tree *, int *, void *));
static void update_cloned_parm PARAMS ((tree, tree));
static void dump_function PARAMS ((enum tree_dump_index, tree));
-/* Optimize the body of FN. */
+/* Optimize the body of FN. */
void
optimize_function (fn)
@@ -64,7 +64,7 @@ optimize_function (fn)
/* We do not inline thunks, as (a) the backend tries to optimize
the call to the thunkee, (b) tree based inlining breaks that
optimization, (c) virtual functions are rarely inlineable,
- and (d) ASM_OUTPUT_MI_THUNK is there to DTRT anyway. */
+ and (d) TARGET_ASM_OUTPUT_MI_THUNK is there to DTRT anyway. */
&& !DECL_THUNK_P (fn))
{
optimize_inline_calls (fn);
@@ -93,9 +93,9 @@ calls_setjmp_r (tp, walk_subtrees, data)
return setjmp_call_p (*tp) ? *tp : NULL_TREE;
}
-/* Returns non-zero if FN calls `setjmp' or some other function that
+/* Returns nonzero if FN calls `setjmp' or some other function that
can return more than once. This function is conservative; it may
- occasionally return a non-zero value even when FN does not actually
+ occasionally return a nonzero value even when FN does not actually
call `setjmp'. */
int
@@ -119,21 +119,21 @@ update_cloned_parm (parm, cloned_parm)
{
DECL_ABSTRACT_ORIGIN (cloned_parm) = parm;
- /* We may have taken its address. */
+ /* We may have taken its address. */
TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm);
- /* The definition might have different constness. */
+ /* The definition might have different constness. */
TREE_READONLY (cloned_parm) = TREE_READONLY (parm);
TREE_USED (cloned_parm) = TREE_USED (parm);
- /* The name may have changed from the declaration. */
+ /* The name may have changed from the declaration. */
DECL_NAME (cloned_parm) = DECL_NAME (parm);
DECL_SOURCE_LOCATION (cloned_parm) = DECL_SOURCE_LOCATION (parm);
}
/* FN is a function that has a complete body. Clone the body as
- necessary. Returns non-zero if there's no longer any need to
+ necessary. Returns nonzero if there's no longer any need to
process the main body. */
int
@@ -176,7 +176,7 @@ maybe_clone_body (fn)
DECL_NOT_REALLY_EXTERN (clone) = DECL_NOT_REALLY_EXTERN (fn);
TREE_PUBLIC (clone) = TREE_PUBLIC (fn);
- /* Adjust the parameter names and locations. */
+ /* Adjust the parameter names and locations. */
parm = DECL_ARGUMENTS (fn);
clone_parm = DECL_ARGUMENTS (clone);
/* Update the `this' parameter, which is always first. */
@@ -194,7 +194,7 @@ maybe_clone_body (fn)
{
/* Update this parameter. */
update_cloned_parm (parm, clone_parm);
- /* We should only give unused information for one clone. */
+ /* We should only give unused information for one clone. */
if (!first)
TREE_USED (clone_parm) = 1;
}
@@ -275,7 +275,7 @@ maybe_clone_body (fn)
return 1;
}
-/* Dump FUNCTION_DECL FN as tree dump PHASE. */
+/* Dump FUNCTION_DECL FN as tree dump PHASE. */
static void
dump_function (phase, fn)
diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y
index 8fe244e6147..78cf991f192 100644
--- a/gcc/cp/parse.y
+++ b/gcc/cp/parse.y
@@ -981,31 +981,27 @@ member_init:
{
if (current_class_name)
pedwarn ("anachronistic old style base class initializer");
- $$ = expand_member_init (current_class_ref, NULL_TREE, $2);
+ $$ = expand_member_init (NULL_TREE, $2);
}
| LEFT_RIGHT
{
if (current_class_name)
pedwarn ("anachronistic old style base class initializer");
- $$ = expand_member_init (current_class_ref,
- NULL_TREE,
+ $$ = expand_member_init (NULL_TREE,
void_type_node);
}
| notype_identifier '(' nonnull_exprlist ')'
- { $$ = expand_member_init (current_class_ref, $1, $3); }
+ { $$ = expand_member_init ($1, $3); }
| notype_identifier LEFT_RIGHT
- { $$ = expand_member_init (current_class_ref, $1,
- void_type_node); }
+ { $$ = expand_member_init ($1, void_type_node); }
| nonnested_type '(' nonnull_exprlist ')'
- { $$ = expand_member_init (current_class_ref, $1, $3); }
+ { $$ = expand_member_init ($1, $3); }
| nonnested_type LEFT_RIGHT
- { $$ = expand_member_init (current_class_ref, $1,
- void_type_node); }
+ { $$ = expand_member_init ($1, void_type_node); }
| typename_sub '(' nonnull_exprlist ')'
- { $$ = expand_member_init (current_class_ref, $1, $3); }
+ { $$ = expand_member_init ($1, $3); }
| typename_sub LEFT_RIGHT
- { $$ = expand_member_init (current_class_ref, $1,
- void_type_node); }
+ { $$ = expand_member_init ($1, void_type_node); }
| error
{ $$ = NULL_TREE; }
;
@@ -1355,21 +1351,12 @@ new_initializer:
error ("`%T' is not a valid expression", $2.t);
$$ = error_mark_node;
}
- /* GNU extension so people can use initializer lists. Note that
- this alters the meaning of `new int = 1', which was previously
- syntactically valid but semantically invalid.
- This feature is now deprecated and will be removed in a future
- release. */
| '=' init
{
- if (pedantic)
- pedwarn ("ISO C++ forbids initialization of new expression with `='");
- cp_deprecated ("new initializer lists extension");
- if (TREE_CODE ($2) != TREE_LIST
- && TREE_CODE ($2) != CONSTRUCTOR)
- $$ = build_tree_list (NULL_TREE, $2);
- else
- $$ = $2;
+ /* This was previously allowed as an extension, but
+ was removed in G++ 3.3. */
+ error ("initialization of new expression with `='");
+ $$ = error_mark_node;
}
;
@@ -1529,7 +1516,7 @@ do_id:
do_identifier; we only do that for unqualified
identifiers. */
if (!lastiddecl || !BASELINK_P (lastiddecl))
- $$ = do_identifier ($<ttype>-1, 1, NULL_TREE);
+ $$ = do_identifier ($<ttype>-1, 3, NULL_TREE);
else
$$ = $<ttype>-1;
}
@@ -4177,6 +4164,12 @@ parse_finish_call_expr (tree fn, tree args, int koenig)
name = DECL_NAME (get_first_fn (name));
fn = lookup_member (scope, name, /*protect=*/1,
/*prefer_type=*/0);
+ if (!fn)
+ {
+ error ("'%D' has no member named '%E'", scope, name);
+ return error_mark_node;
+ }
+
if (BASELINK_P (fn) && template_id)
BASELINK_FUNCTIONS (fn)
= build_nt (TEMPLATE_ID_EXPR,
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 42218eb3150..ceff84f0a06 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -51,7 +51,7 @@ typedef int (*tree_fn_t) PARAMS ((tree, void*));
instantiations have been deferred, either because their definitions
were not yet available, or because we were putting off doing the
work. The TREE_PURPOSE of each entry is a SRCLOC indicating where
- the instantiate request occurred; the TREE_VALUE is a either a DECL
+ the instantiate request occurred; the TREE_VALUE is either a DECL
(for a function or static data member), or a TYPE (for a class)
indicating what we are hoping to instantiate. */
static GTY(()) tree pending_templates;
@@ -381,7 +381,7 @@ maybe_begin_member_template_processing (decl)
++inline_parm_levels_used;
}
-/* Undo the effects of begin_member_template_processing. */
+/* Undo the effects of begin_member_template_processing. */
void
maybe_end_member_template_processing ()
@@ -402,7 +402,7 @@ maybe_end_member_template_processing ()
}
}
-/* Returns non-zero iff T is a member template function. We must be
+/* Returns nonzero iff T is a member template function. We must be
careful as in
template <class T> class C { void f(); }
@@ -439,7 +439,7 @@ is_member_template (t)
}
#if 0 /* UNUSED */
-/* Returns non-zero iff T is a member template class. See
+/* Returns nonzero iff T is a member template class. See
is_member_template for a description of what precisely constitutes
a member template. */
@@ -617,7 +617,7 @@ check_specialization_scope ()
error ("enclosing class templates are not explicitly specialized");
}
-/* We've just seen template <>. */
+/* We've just seen template <>. */
void
begin_specialization ()
@@ -638,7 +638,7 @@ end_specialization ()
}
/* Any template <>'s that we have seen thus far are not referring to a
- function specialization. */
+ function specialization. */
void
reset_specialization ()
@@ -647,7 +647,7 @@ reset_specialization ()
template_header_count = 0;
}
-/* We've just seen a template header. If SPECIALIZATION is non-zero,
+/* We've just seen a template header. If SPECIALIZATION is nonzero,
it was of the form template <>. */
static void
@@ -744,7 +744,7 @@ retrieve_local_specialization (tmpl)
return (tree) htab_find (local_specializations, tmpl);
}
-/* Returns non-zero iff DECL is a specialization of TMPL. */
+/* Returns nonzero iff DECL is a specialization of TMPL. */
int
is_specialization_of (decl, tmpl)
@@ -947,7 +947,7 @@ print_candidates (fns)
NULL_TREE if none is available. In that case, the functions in
TEMPLATE_ID are non-members.
- If NEED_MEMBER_TEMPLATE is non-zero the function is known to be a
+ If NEED_MEMBER_TEMPLATE is nonzero the function is known to be a
specialization of a member template.
The template args (those explicitly specified and those deduced)
@@ -981,7 +981,7 @@ determine_specialization (template_id, decl, targs_out,
if (fns == error_mark_node)
return error_mark_node;
- /* Check for baselinks. */
+ /* Check for baselinks. */
if (BASELINK_P (fns))
fns = BASELINK_FUNCTIONS (fns);
@@ -1141,7 +1141,7 @@ determine_specialization (template_id, decl, targs_out,
return error_mark_node;
}
- /* We have one, and exactly one, match. */
+ /* We have one, and exactly one, match. */
if (candidates)
{
/* It was a specialization of an ordinary member function in a
@@ -2110,6 +2110,7 @@ build_template_decl (decl, parms)
DECL_VIRTUAL_CONTEXT (tmpl) = DECL_VIRTUAL_CONTEXT (decl);
DECL_STATIC_FUNCTION_P (tmpl) = DECL_STATIC_FUNCTION_P (decl);
DECL_CONSTRUCTOR_P (tmpl) = DECL_CONSTRUCTOR_P (decl);
+ DECL_DESTRUCTOR_P (tmpl) = DECL_DESTRUCTOR_P (decl);
DECL_NONCONVERTING_P (tmpl) = DECL_NONCONVERTING_P (decl);
DECL_ASSIGNMENT_OPERATOR_P (tmpl) = DECL_ASSIGNMENT_OPERATOR_P (decl);
if (DECL_OVERLOADED_OPERATOR_P (decl))
@@ -2131,12 +2132,12 @@ struct template_parm_data
int current_arg;
/* An array whose size is the number of template parameters. The
- elements are non-zero if the parameter has been used in any one
+ elements are nonzero if the parameter has been used in any one
of the arguments processed so far. */
int* parms;
/* An array whose size is the number of template arguments. The
- elements are non-zero if the argument makes use of template
+ elements are nonzero if the argument makes use of template
parameters of this level. */
int* arg_uses_template_parms;
};
@@ -2354,8 +2355,8 @@ process_partial_specialization (decl)
/* Check that a template declaration's use of default arguments is not
invalid. Here, PARMS are the template parameters. IS_PRIMARY is
- non-zero if DECL is the thing declared by a primary template.
- IS_PARTIAL is non-zero if DECL is a partial specialization. */
+ nonzero if DECL is the thing declared by a primary template.
+ IS_PARTIAL is nonzero if DECL is a partial specialization. */
static void
check_default_tmpl_args (decl, parms, is_primary, is_partial)
@@ -2502,7 +2503,7 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial)
/* Worker for push_template_decl_real, called via
for_each_template_parm. DATA is really an int, indicating the
level of the parameters we are interested in. If T is a template
- parameter of that level, return non-zero. */
+ parameter of that level, return nonzero. */
static int
template_parm_this_level_p (t, data)
@@ -2524,7 +2525,7 @@ template_parm_this_level_p (t, data)
previously existing one, if appropriate. Returns the DECL, or an
equivalent one, if it is replaced via a call to duplicate_decls.
- If IS_FRIEND is non-zero, DECL is a friend declaration. */
+ If IS_FRIEND is nonzero, DECL is a friend declaration. */
tree
push_template_decl_real (decl, is_friend)
@@ -2631,7 +2632,7 @@ push_template_decl_real (decl, is_friend)
&& DECL_TEMPLATE_SPECIALIZATION (decl))
{
/* A specialization of a member template of a template
- class. */
+ class. */
SET_DECL_TEMPLATE_SPECIALIZATION (tmpl);
DECL_TEMPLATE_INFO (tmpl) = DECL_TEMPLATE_INFO (decl);
DECL_TEMPLATE_INFO (decl) = NULL_TREE;
@@ -2998,7 +2999,7 @@ convert_nontype_argument (type, expr)
case ENUMERAL_TYPE:
/* For a non-type template-parameter of integral or enumeration
type, integral promotions (_conv.prom_) and integral
- conversions (_conv.integral_) are applied. */
+ conversions (_conv.integral_) are applied. */
if (!INTEGRAL_TYPE_P (expr_type))
return error_mark_node;
@@ -3466,6 +3467,16 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
val, t);
return error_mark_node;
}
+
+ /* In order to avoid all sorts of complications, we do
+ not allow variably-modified types as template
+ arguments. */
+ if (variably_modified_type_p (val))
+ {
+ error ("template-argument `%T' is a variably modified type",
+ val);
+ return error_mark_node;
+ }
}
}
}
@@ -3511,7 +3522,7 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
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
+ If REQUIRE_ALL_ARGUMENTS is nonzero, all arguments must be
provided in ARGLIST, or else trailing parameters must have default
values. If REQUIRE_ALL_ARGUMENTS is zero, we will attempt argument
deduction for any unspecified trailing arguments. */
@@ -3884,7 +3895,7 @@ maybe_get_template_decl_from_type_decl (decl)
IN_DECL, if non-NULL, is the template declaration we are trying to
instantiate.
- If ENTERING_SCOPE is non-zero, we are about to enter the scope of
+ If ENTERING_SCOPE is nonzero, we are about to enter the scope of
the class we are looking up.
Issue error and warning messages under control of COMPLAIN.
@@ -4468,6 +4479,15 @@ for_each_template_parm_r (tp, walk_subtrees, d)
return error_mark_node;
break;
+ case BASELINK:
+ /* If we do not handle this case specially, we end up walking
+ the BINFO hierarchy, which is circular, and therefore
+ confuses walk_tree. */
+ *walk_subtrees = 0;
+ if (for_each_template_parm (BASELINK_FUNCTIONS (*tp), fn, data))
+ return error_mark_node;
+ break;
+
default:
break;
}
@@ -4479,9 +4499,9 @@ for_each_template_parm_r (tp, walk_subtrees, d)
/* For each TEMPLATE_TYPE_PARM, TEMPLATE_TEMPLATE_PARM,
BOUND_TEMPLATE_TEMPLATE_PARM or TEMPLATE_PARM_INDEX in T,
call FN with the parameter and the DATA.
- If FN returns non-zero, the iteration is terminated, and
+ If FN returns nonzero, the iteration is terminated, and
for_each_template_parm returns 1. Otherwise, the iteration
- continues. If FN never returns a non-zero value, the value
+ continues. If FN never returns a nonzero value, the value
returned by for_each_template_parm is 0. If FN is NULL, it is
considered to be the function which always returns 1. */
@@ -4726,7 +4746,7 @@ tsubst_friend_function (decl, args)
/* Inside pushdecl_namespace_level, we will push into the
current namespace. However, the friend function should go
- into the namespace of the template. */
+ into the namespace of the template. */
ns = decl_namespace_context (new_friend);
push_nested_namespace (ns);
old_decl = pushdecl_namespace_level (new_friend);
@@ -5073,7 +5093,7 @@ instantiate_class_template (type)
if (t)
{
- /* This TYPE is actually a instantiation of of a partial
+ /* This TYPE is actually an instantiation of a partial
specialization. We replace the innermost set of ARGS with
the arguments appropriate for substitution. For example,
given:
@@ -5545,7 +5565,7 @@ tsubst_template_parms (parms, args, complain)
/* Substitute the ARGS into the indicated aggregate (or enumeration)
type T. If T is not an aggregate or enumeration type, it is
handled as if by tsubst. IN_DECL is as for tsubst. If
- ENTERING_SCOPE is non-zero, T is the context for a template which
+ ENTERING_SCOPE is nonzero, T is the context for a template which
we are presently tsubst'ing. Return the substituted value. */
static tree
@@ -5693,8 +5713,6 @@ tsubst_decl (t, args, type, complain)
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;
@@ -5789,7 +5807,7 @@ tsubst_decl (t, args, type, complain)
/* The template parameters for this new template are all the
template parameters for the old template, except the
- outermost level of parameters. */
+ outermost level of parameters. */
DECL_TEMPLATE_PARMS (r)
= tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args,
complain);
@@ -6126,6 +6144,8 @@ tsubst_decl (t, args, type, complain)
}
r = copy_decl (t);
+ if (TREE_CODE (r) == VAR_DECL)
+ type = complete_type (type);
TREE_TYPE (r) = type;
c_apply_type_quals_to_decl (cp_type_quals (type), r);
DECL_CONTEXT (r) = ctx;
@@ -6142,7 +6162,10 @@ tsubst_decl (t, args, type, complain)
/* Even if the original location is out of scope, the newly
substituted one is not. */
if (TREE_CODE (r) == VAR_DECL)
- DECL_DEAD_FOR_LOCAL (r) = 0;
+ {
+ DECL_DEAD_FOR_LOCAL (r) = 0;
+ DECL_INITIALIZED_P (r) = 0;
+ }
if (!local_p)
{
@@ -6162,6 +6185,8 @@ tsubst_decl (t, args, type, complain)
TREE_CHAIN (r) = NULL_TREE;
if (TREE_CODE (r) == VAR_DECL && VOID_TYPE_P (type))
cp_error_at ("instantiation of `%D' as type `%T'", r, type);
+ /* Compute the size, alignment, etc. of R. */
+ layout_decl (r, 0);
}
break;
@@ -6774,7 +6799,7 @@ tsubst (t, args, complain, in_decl)
if (fntype == error_mark_node)
return error_mark_node;
- /* Substitue the exception specification. */
+ /* Substitue the exception specification. */
raises = TYPE_RAISES_EXCEPTIONS (t);
if (raises)
{
@@ -7367,22 +7392,14 @@ tsubst_expr (t, args, complain, in_decl)
break;
case CTOR_INITIALIZER:
- {
- tree member_init_list;
- tree base_init_list;
-
- prep_stmt (t);
- member_init_list
- = tsubst_initializer_list (TREE_OPERAND (t, 0), args);
- base_init_list
- = tsubst_initializer_list (TREE_OPERAND (t, 1), args);
- emit_base_init (member_init_list, base_init_list);
- break;
- }
+ prep_stmt (t);
+ finish_mem_initializers (tsubst_initializer_list
+ (TREE_OPERAND (t, 0), args));
+ break;
case RETURN_STMT:
prep_stmt (t);
- finish_return_stmt (tsubst_expr (RETURN_EXPR (t),
+ finish_return_stmt (tsubst_expr (RETURN_STMT_EXPR (t),
args, complain, in_decl));
break;
@@ -7421,9 +7438,6 @@ tsubst_expr (t, args, complain, in_decl)
decl = tsubst (decl, args, complain, in_decl);
if (decl != error_mark_node)
{
- if (TREE_CODE (decl) != TYPE_DECL)
- /* Make sure the type is instantiated now. */
- complete_type (TREE_TYPE (decl));
if (init)
DECL_INITIAL (decl) = error_mark_node;
/* By marking the declaration as instantiated, we avoid
@@ -7433,24 +7447,31 @@ tsubst_expr (t, args, complain, in_decl)
do. */
if (TREE_CODE (decl) == VAR_DECL)
DECL_TEMPLATE_INSTANTIATED (decl) = 1;
- maybe_push_decl (decl);
- if (DECL_PRETTY_FUNCTION_P (decl))
+ if (TREE_CODE (decl) == VAR_DECL
+ && ANON_AGGR_TYPE_P (TREE_TYPE (decl)))
+ /* Anonymous aggregates are a special case. */
+ finish_anon_union (decl);
+ else
{
- /* For __PRETTY_FUNCTION__ we have to adjust the
- initializer. */
- const char *const name
- = cxx_printable_name (current_function_decl, 2);
- init = cp_fname_init (name);
- TREE_TYPE (decl) = TREE_TYPE (init);
+ maybe_push_decl (decl);
+ if (DECL_PRETTY_FUNCTION_P (decl))
+ {
+ /* For __PRETTY_FUNCTION__ we have to adjust the
+ initializer. */
+ const char *const name
+ = cxx_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);
}
- else
- init = tsubst_expr (init, args, complain, in_decl);
- cp_finish_decl (decl, init, NULL_TREE, 0);
}
}
/* A DECL_STMT can also be used as an expression, in the condition
- clause of a if/for/while construct. If we aren't followed by
+ clause of an if/for/while construct. If we aren't followed by
another statement, return our decl. */
if (TREE_CHAIN (t) == NULL_TREE)
return decl;
@@ -7696,7 +7717,7 @@ instantiate_template (tmpl, targ_ptr)
tree spec = instantiate_template (DECL_CLONED_FUNCTION (tmpl), targ_ptr);
tree clone;
- /* Look for the clone. */
+ /* Look for the clone. */
for (clone = TREE_CHAIN (spec);
clone && DECL_CLONED_FUNCTION_P (clone);
clone = TREE_CHAIN (clone))
@@ -8554,7 +8575,7 @@ template_decl_level (decl)
/* Decide whether ARG can be unified with PARM, considering only the
cv-qualifiers of each type, given STRICT as documented for unify.
- Returns non-zero iff the unification is OK on that basis.*/
+ Returns nonzero iff the unification is OK on that basis.*/
static int
check_cv_quals_for_unify (strict, arg, parm)
@@ -8569,9 +8590,7 @@ check_cv_quals_for_unify (strict, arg, 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)
+ if (TREE_CODE (arg) == REFERENCE_TYPE)
parm_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
if (!POINTER_TYPE_P (arg) &&
TREE_CODE (arg) != TEMPLATE_TYPE_PARM)
@@ -8893,7 +8912,7 @@ unify (tparms, targs, parm, arg, strict)
{
/* Avoid getting confused about cv-quals; don't recurse here.
Pointers to members should really be just OFFSET_TYPE, not
- this two-level nonsense... */
+ this two-level nonsense... */
parm = TREE_TYPE (parm);
arg = TREE_TYPE (arg);
@@ -8921,7 +8940,7 @@ unify (tparms, targs, parm, arg, strict)
TYPE_DOMAIN (arg), UNIFY_ALLOW_NONE) != 0)
return 1;
return unify (tparms, targs, TREE_TYPE (parm), TREE_TYPE (arg),
- UNIFY_ALLOW_NONE);
+ strict & UNIFY_ALLOW_MORE_CV_QUAL);
case REAL_TYPE:
case COMPLEX_TYPE:
@@ -9656,7 +9675,7 @@ mark_class_instantiated (t, extern_p)
/* Perform an explicit instantiation of template class T. STORAGE, if
non-null, is the RID for extern, inline or static. COMPLAIN is
- non-zero if this is called from the parser, zero if called recursively,
+ nonzero if this is called from the parser, zero if called recursively,
since the standard is unclear (as detailed below). */
void
@@ -9863,9 +9882,10 @@ regenerate_decl_from_template (decl, tmpl)
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,
- tf_error, DECL_TI_TEMPLATE (decl));
+ if (!DECL_INITIALIZED_IN_CLASS_P (decl))
+ DECL_INITIAL (new_decl) =
+ tsubst_expr (DECL_INITIAL (code_pattern), args,
+ tf_error, DECL_TI_TEMPLATE (decl));
}
else if (TREE_CODE (decl) == FUNCTION_DECL)
{
@@ -9900,7 +9920,7 @@ regenerate_decl_from_template (decl, tmpl)
}
/* Produce the definition of D, a _DECL generated from a template. If
- DEFER_OK is non-zero, then we don't have to actually do the
+ DEFER_OK is nonzero, then we don't have to actually do the
instantiation now; we just have to do it sometime. */
tree
@@ -10074,7 +10094,7 @@ instantiate_decl (d, defer_ok)
/* 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. */
+ without the top level cv qualifiers. */
type = TREE_TYPE (type);
}
tsubst (type, args, tf_error | tf_warning, d);
@@ -10145,7 +10165,10 @@ instantiate_decl (d, defer_ok)
DECL_EXTERNAL (d) = 1;
DECL_NOT_REALLY_EXTERN (d) = 1;
}
- cp_finish_decl (d, DECL_INITIAL (d), NULL_TREE, 0);
+ cp_finish_decl (d,
+ (!DECL_INITIALIZED_IN_CLASS_P (d)
+ ? DECL_INITIAL (d) : NULL_TREE),
+ NULL_TREE, 0);
}
else if (TREE_CODE (d) == FUNCTION_DECL)
{
@@ -10289,8 +10312,7 @@ static tree
tsubst_initializer_list (t, argvec)
tree t, argvec;
{
- tree first = NULL_TREE;
- tree *p = &first;
+ tree inits = NULL_TREE;
for (; t; t = TREE_CHAIN (t))
{
@@ -10308,13 +10330,17 @@ tsubst_initializer_list (t, argvec)
else if (TREE_CODE (init) == TREE_LIST)
for (val = init; val; val = TREE_CHAIN (val))
TREE_VALUE (val) = convert_from_reference (TREE_VALUE (val));
- else
+ else if (init != void_type_node)
init = convert_from_reference (init);
- *p = build_tree_list (decl, init);
- p = &TREE_CHAIN (*p);
+ init = expand_member_init (decl, init);
+ if (init)
+ {
+ TREE_CHAIN (init) = inits;
+ inits = init;
+ }
}
- return first;
+ return inits;
}
/* Set CURRENT_ACCESS_SPECIFIER based on the protection of DECL. */
@@ -10461,7 +10487,7 @@ current_instantiation ()
}
/* [temp.param] Check that template non-type parm TYPE is of an allowable
- type. Return zero for ok, non-zero for disallowed. Issue error and
+ type. Return zero for ok, nonzero for disallowed. Issue error and
warning messages under control of COMPLAIN. */
static int
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index 0584d60785c..b40edfab763 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -62,13 +62,13 @@ Boston, MA 02111-1307, USA. */
/* Accessors for the type_info objects. We need to remember several things
about each of the type_info types. The global tree nodes such as
bltn_desc_type_node are TREE_LISTs, and these macros are used to access
- the required information. */
-/* The RECORD_TYPE of a type_info derived class. */
+ the required information. */
+/* The RECORD_TYPE of a type_info derived class. */
#define TINFO_PSEUDO_TYPE(NODE) TREE_TYPE (NODE)
/* The VAR_DECL of the vtable for the type_info derived class.
- This is only filled in at the end of the translation. */
+ This is only filled in at the end of the translation. */
#define TINFO_VTABLE_DECL(NODE) TREE_VALUE (NODE)
-/* The IDENTIFIER_NODE naming the real class. */
+/* The IDENTIFIER_NODE naming the real class. */
#define TINFO_REAL_NAME(NODE) TREE_PURPOSE (NODE)
static tree build_headof PARAMS((tree));
@@ -697,7 +697,7 @@ qualifier_flags (type)
return flags;
}
-/* Return non-zero, if the pointer chain TYPE ends at an incomplete type, or
+/* Return nonzero, if the pointer chain TYPE ends at an incomplete type, or
contains a pointer to member of an incomplete class. */
static int
@@ -923,7 +923,7 @@ dfs_class_hint_mark (binfo, data)
return NULL_TREE;
};
-/* Clear the base's dfs marks, after searching for duplicate bases. */
+/* Clear the base's dfs marks, after searching for duplicate bases. */
static tree
dfs_class_hint_unmark (binfo, data)
@@ -977,7 +977,7 @@ class_initializer (desc, target, trail)
return init;
}
-/* Returns non-zero if the typeinfo for type should be placed in
+/* Returns nonzero if the typeinfo for type should be placed in
the runtime library. */
static int
@@ -1006,7 +1006,7 @@ typeinfo_in_lib_p (type)
}
/* Generate the initializer for the type info describing
- TYPE. VAR_DESC is a . NON_PUBLIC_P is set non-zero, if the VAR_DECL
+ TYPE. VAR_DESC is a . NON_PUBLIC_P is set nonzero, if the VAR_DECL
should not be exported from this object file. This should only be
called at the end of translation, when we know that no further
types will be completed. */
@@ -1096,15 +1096,17 @@ get_pseudo_ti_init (type, var_desc, non_public_p)
base_init = tree_cons (NULL_TREE, offset, base_init);
base_init = tree_cons (NULL_TREE, tinfo, base_init);
base_init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, base_init);
+ TREE_HAS_CONSTRUCTOR (base_init) = 1;
base_inits = tree_cons (NULL_TREE, base_init, base_inits);
}
base_inits = build (CONSTRUCTOR,
NULL_TREE, NULL_TREE, base_inits);
+ TREE_HAS_CONSTRUCTOR (base_inits) = 1;
base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
/* Prepend the number of bases. */
base_inits = tree_cons (NULL_TREE,
build_int_2 (nbases, 0), base_inits);
- /* Prepend the hint flags. */
+ /* Prepend the hint flags. */
base_inits = tree_cons (NULL_TREE,
build_int_2 (hint, 0), base_inits);
@@ -1137,8 +1139,7 @@ create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...))
{
tree pseudo_type;
char *pseudo_name;
- int ix;
- tree fields[10];
+ tree fields;
tree field_decl;
tree result;
@@ -1146,24 +1147,27 @@ create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...))
VA_FIXEDARG (ap, const char *, real_name);
VA_FIXEDARG (ap, int, ident);
- /* Generate the pseudo type name. */
+ /* Generate the pseudo type name. */
pseudo_name = (char *)alloca (strlen (real_name) + 30);
strcpy (pseudo_name, real_name);
strcat (pseudo_name, "_pseudo");
if (ident)
sprintf (pseudo_name + strlen (pseudo_name), "%d", ident);
- /* First field is the pseudo type_info base class. */
- fields[0] = build_decl (FIELD_DECL, NULL_TREE, ti_desc_type_node);
+ /* First field is the pseudo type_info base class. */
+ fields = build_decl (FIELD_DECL, NULL_TREE, ti_desc_type_node);
/* Now add the derived fields. */
- for (ix = 0; (field_decl = va_arg (ap, tree));)
- fields[++ix] = field_decl;
+ while ((field_decl = va_arg (ap, tree)))
+ {
+ TREE_CHAIN (field_decl) = fields;
+ fields = field_decl;
+ }
- /* Create the pseudo type. */
+ /* Create the pseudo type. */
pseudo_type = make_aggr_type (RECORD_TYPE);
- finish_builtin_type (pseudo_type, pseudo_name, fields, ix, ptr_type_node);
- TYPE_HAS_CONSTRUCTOR (pseudo_type) = 1;
+ finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
+ CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
result = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
TINFO_REAL_NAME (result) = get_identifier (real_name);
@@ -1198,7 +1202,8 @@ get_pseudo_ti_desc (type)
return ptm_desc_type_node;
else if (!COMPLETE_TYPE_P (type))
{
- my_friendly_assert (at_eof, 20020609);
+ if (!at_eof)
+ cxx_incomplete_type_error (NULL_TREE, type);
return class_desc_type_node;
}
else if (!CLASSTYPE_N_BASECLASSES (type))
@@ -1213,7 +1218,7 @@ get_pseudo_ti_desc (type)
&& TREE_PUBLIC (base_binfo)
&& !TREE_VIA_VIRTUAL (base_binfo)
&& integer_zerop (BINFO_OFFSET (base_binfo)))
- /* single non-virtual public. */
+ /* single non-virtual public. */
return si_class_desc_type_node;
else
{
@@ -1271,13 +1276,18 @@ create_tinfo_types ()
/* Create the internal type_info structure. This is used as a base for
the other structures. */
{
- tree fields[2];
+ tree field, fields;
ti_desc_type_node = make_aggr_type (RECORD_TYPE);
- fields[0] = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
- fields[1] = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
- finish_builtin_type (ti_desc_type_node, "__type_info_pseudo",
- fields, 1, ptr_type_node);
+ field = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
+ fields = field;
+
+ field = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+
+ finish_builtin_struct (ti_desc_type_node, "__type_info_pseudo",
+ fields, NULL_TREE);
TYPE_HAS_CONSTRUCTOR (ti_desc_type_node) = 1;
}
@@ -1286,7 +1296,7 @@ create_tinfo_types ()
("__fundamental_type_info", 0,
NULL);
- /* Array, function and enum type_info. No additional fields. */
+ /* Array, function and enum type_info. No additional fields. */
ary_desc_type_node = create_pseudo_type_info
("__array_type_info", 0,
NULL);
@@ -1310,24 +1320,29 @@ create_tinfo_types ()
NULL);
/* Base class internal helper. Pointer to base type, offset to base,
- flags. */
+ flags. */
{
- tree fields[2];
+ tree field, fields;
+
+ field = build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type);
+ fields = field;
- fields[0] = build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type);
- fields[1] = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
+ field = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+
base_desc_type_node = make_aggr_type (RECORD_TYPE);
- finish_builtin_type (base_desc_type_node, "__base_class_type_info_pseudo",
- fields, 1, ptr_type_node);
+ finish_builtin_struct (base_desc_type_node, "__base_class_type_info_pseudo",
+ fields, NULL_TREE);
TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1;
}
- /* General hierarchy is created as necessary in this vector. */
+ /* General hierarchy is created as necessary in this vector. */
vmi_class_desc_type_node = make_tree_vec (10);
/* Pointer type_info. Adds two fields, qualification mask
and pointer to the pointed to type. This is really a descendant of
- __pbase_type_info. */
+ __pbase_type_info. */
ptr_desc_type_node = create_pseudo_type_info
("__pointer_type_info", 0,
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
@@ -1406,7 +1421,7 @@ emit_support_tinfos ()
}
}
-/* Return non-zero, iff T is a type_info variable which has not had a
+/* Return nonzero, iff T is a type_info variable which has not had a
definition emitted for it. */
int
@@ -1418,11 +1433,13 @@ unemitted_tinfo_decl_p (t, data)
TREE_CODE (t) == VAR_DECL
/* whos name points back to itself */
&& IDENTIFIER_GLOBAL_VALUE (DECL_NAME (t)) == t
- /* whos name's type is non-null */
+ /* whose name's type is non-null */
&& TREE_TYPE (DECL_NAME (t))
- /* and whos type is a struct */
+ /* and whose type is a struct */
&& TREE_CODE (TREE_TYPE (t)) == RECORD_TYPE
- /* with a first field of our pseudo type info */
+ /* with a field */
+ && TYPE_FIELDS (TREE_TYPE (t))
+ /* which is our pseudo type info */
&& TREE_TYPE (TYPE_FIELDS (TREE_TYPE (t))) == ti_desc_type_node)
return 1;
return 0;
@@ -1461,7 +1478,7 @@ emit_tinfo_decl (decl_ptr, data)
DECL_INITIAL (decl) = var_init;
cp_finish_decl (decl, var_init, NULL_TREE, 0);
- /* cp_finish_decl will have dealt with linkage. */
+ /* cp_finish_decl will have dealt with linkage. */
/* Say we've dealt with it. */
TREE_TYPE (DECL_NAME (decl)) = NULL_TREE;
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index e4e8baa9ad2..3b06a0a0cce 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -204,7 +204,7 @@ lookup_base_r (binfo, base, access, within_current_scope,
if (same_type_p (BINFO_TYPE (binfo), base))
{
/* We have found a base. Check against what we have found
- already. */
+ already. */
found = bk_same_type;
if (is_virtual)
found = bk_via_virtual;
@@ -311,7 +311,7 @@ lookup_base (t, base, access, kind_ptr)
base_access access;
base_kind *kind_ptr;
{
- tree binfo = NULL; /* The binfo we've found so far. */
+ tree binfo = NULL; /* The binfo we've found so far. */
tree t_binfo = NULL;
base_kind bk;
@@ -577,7 +577,7 @@ current_scope ()
return current_class_type;
}
-/* Returns non-zero if we are currently in a function scope. Note
+/* Returns nonzero if we are currently in a function scope. Note
that this function returns zero if we are within a local class, but
not within a member function body of the local class. */
@@ -862,7 +862,7 @@ dfs_accessible_p (binfo, data)
return NULL_TREE;
}
-/* Returns non-zero if it is OK to access DECL through an object
+/* Returns nonzero if it is OK to access DECL through an object
indiated by BINFO in the context of DERIVED. */
static int
@@ -925,7 +925,7 @@ protected_accessible_p (decl, derived, binfo)
return 1;
}
-/* Returns non-zero if SCOPE is a friend of a type which would be able
+/* Returns nonzero if SCOPE is a friend of a type which would be able
to access DECL through the object indicated by BINFO. */
static int
@@ -1014,7 +1014,7 @@ type_access_control (type, val)
}
/* DECL is a declaration from a base class of TYPE, which was the
- class used to name DECL. Return non-zero if, in the current
+ class used to name DECL. Return nonzero if, in the current
context, DECL is accessible. If TYPE is actually a BINFO node,
then we can tell in what context the access is occurring by looking
at the most derived class along the path indicated by BINFO. */
@@ -1028,7 +1028,7 @@ accessible_p (type, decl)
tree binfo;
tree t;
- /* Non-zero if it's OK to access DECL if it has protected
+ /* Nonzero if it's OK to access DECL if it has protected
accessibility in TYPE. */
int protected_ok = 0;
@@ -1146,15 +1146,15 @@ struct lookup_field_info {
/* If non-NULL, the lookup was ambiguous, and this is a list of the
candidates. */
tree ambiguous;
- /* If non-zero, we are looking for types, not data members. */
+ /* If nonzero, we are looking for types, not data members. */
int want_type;
- /* If non-zero, RVAL was found by looking through a dependent base. */
+ /* If nonzero, RVAL was found by looking through a dependent base. */
int from_dep_base_p;
/* If something went wrong, a message indicating what. */
const char *errstr;
};
-/* Returns non-zero if BINFO is not hidden by the value found by the
+/* Returns nonzero if BINFO is not hidden by the value found by the
lookup so far. If BINFO is hidden, then there's no need to look in
it. DATA is really a struct lookup_field_info. Called from
lookup_field via breadth_first_search. */
@@ -1185,7 +1185,7 @@ lookup_field_queue_p (binfo, data)
template <typename T> struct S { S* sp; }
- Returns non-zero if DECL is such a declaration in a class TYPE. */
+ Returns nonzero if DECL is such a declaration in a class TYPE. */
static int
template_self_reference_p (type, decl)
@@ -1400,15 +1400,16 @@ build_baselink (tree binfo, tree access_binfo, tree functions, tree optype)
}
/* Look for a member named NAME in an inheritance lattice dominated by
- XBASETYPE. If PROTECT is 0 or two, we do not check access. If it is
- 1, we enforce accessibility. If PROTECT is zero, then, for an
- ambiguous lookup, we return NULL. If PROTECT is 1, we issue an
- error message. If PROTECT is 2, we return a TREE_LIST whose
- TREE_TYPE is error_mark_node and whose TREE_VALUEs are the list of
- ambiguous candidates.
+ XBASETYPE. If PROTECT is 0 or two, we do not check access. If it
+ is 1, we enforce accessibility. If PROTECT is zero, then, for an
+ ambiguous lookup, we return NULL. If PROTECT is 1, we issue error
+ messages about inaccessible or ambiguous lookup. If PROTECT is 2,
+ we return a TREE_LIST whose TREE_TYPE is error_mark_node and whose
+ TREE_VALUEs are the list of ambiguous candidates.
- WANT_TYPE is 1 when we should only return TYPE_DECLs, if no
- TYPE_DECL can be found return NULL_TREE. */
+ WANT_TYPE is 1 when we should only return TYPE_DECLs.
+
+ If nothing can be found return NULL_TREE and do not issue an error. */
tree
lookup_member (xbasetype, name, protect, want_type)
@@ -1691,7 +1692,7 @@ adjust_result_of_qualified_name_lookup (tree decl,
returned and the walk is terminated. At each node, FN is passed a
BINFO indicating the path from the curently visited base-class to
TYPE. Before each base-class is walked QFN is called. If the
- value returned is non-zero, the base-class is walked; otherwise it
+ value returned is nonzero, the base-class is walked; otherwise it
is not. If QFN is NULL, it is treated as a function which always
returns 1. Both FN and QFN are passed the DATA whenever they are
called. */
@@ -1928,7 +1929,7 @@ check_final_overrider (overrider, basefn)
virtual functions in TYPE's hierarchy which FNDECL overrides.
We do not look in TYPE itself, only its bases.
- Returns non-zero, if we find any. Set FNDECL's DECL_VIRTUAL_P, if we
+ Returns nonzero, if we find any. Set FNDECL's DECL_VIRTUAL_P, if we
find that it overrides anything.
We check that every function which is overridden, is correctly
@@ -1995,7 +1996,7 @@ look_for_overrides_here (type, fndecl)
}
/* Look in TYPE for virtual functions overridden by FNDECL. Check both
- TYPE itself and its bases. */
+ TYPE itself and its bases. */
static int
look_for_overrides_r (type, fndecl)
@@ -2535,7 +2536,8 @@ dfs_push_decls (binfo, data)
for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
if (DECL_NAME (fields)
&& TREE_CODE (fields) != TYPE_DECL
- && TREE_CODE (fields) != USING_DECL)
+ && TREE_CODE (fields) != USING_DECL
+ && !DECL_ARTIFICIAL (fields))
setup_class_bindings (DECL_NAME (fields), /*type_binding_p=*/0);
else if (TREE_CODE (fields) == FIELD_DECL
&& ANON_AGGR_TYPE_P (TREE_TYPE (fields)))
@@ -2596,7 +2598,7 @@ dfs_unuse_fields (binfo, data)
for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
{
- if (TREE_CODE (fields) != FIELD_DECL)
+ if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
continue;
TREE_USED (fields) = 0;
@@ -2795,7 +2797,7 @@ binfo_for_vtable (var)
}
/* If no secondary base classes matched, return the primary base, if
- there is one. */
+ there is one. */
if (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (main_binfo)))
return get_primary_binfo (main_binfo);
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 9efc7de8570..c561a66898b 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -79,7 +79,7 @@ static tree clear_decl_rtl PARAMS ((tree *, int *, void *));
(SUBSTMT) = (COND); \
} while (0)
-/* Returns non-zero if the current statement is a full expression,
+/* Returns nonzero if the current statement is a full expression,
i.e. temporaries created during that statement should be destroyed
at the end of the statement. */
@@ -317,7 +317,10 @@ finish_while_stmt_cond (cond, while_stmt)
tree while_stmt;
{
cond = maybe_convert_cond (cond);
- if (getdecls () == NULL_TREE)
+ if (processing_template_decl)
+ /* Don't mess with condition decls in a template. */
+ FINISH_COND (cond, while_stmt, WHILE_COND (while_stmt));
+ else if (getdecls () == NULL_TREE)
/* It was a simple condition; install it. */
WHILE_COND (while_stmt) = cond;
else
@@ -452,7 +455,10 @@ finish_for_cond (cond, for_stmt)
tree for_stmt;
{
cond = maybe_convert_cond (cond);
- if (getdecls () == NULL_TREE)
+ if (processing_template_decl)
+ /* Don't mess with condition decls in a template. */
+ FINISH_COND (cond, for_stmt, FOR_COND (for_stmt));
+ else if (getdecls () == NULL_TREE)
/* It was a simple condition; install it. */
FOR_COND (for_stmt) = cond;
else
@@ -586,7 +592,7 @@ finish_switch_stmt (switch_stmt)
do_poplevel ();
}
-/* Generate the RTL for T, which is a TRY_BLOCK. */
+/* Generate the RTL for T, which is a TRY_BLOCK. */
static void
genrtl_try_block (t)
@@ -623,7 +629,7 @@ genrtl_try_block (t)
}
}
-/* Generate the RTL for T, which is an EH_SPEC_BLOCK. */
+/* Generate the RTL for T, which is an EH_SPEC_BLOCK. */
static void
genrtl_eh_spec_block (t)
@@ -732,7 +738,7 @@ finish_function_handler_sequence (try_block)
check_handlers (TRY_HANDLERS (try_block));
}
-/* Generate the RTL for T, which is a HANDLER. */
+/* Generate the RTL for T, which is a HANDLER. */
static void
genrtl_handler (t)
@@ -801,7 +807,7 @@ finish_handler (handler)
RECHAIN_STMTS (handler, HANDLER_BODY (handler));
}
-/* Begin a compound-statement. If HAS_NO_SCOPE is non-zero, the
+/* Begin a compound-statement. If HAS_NO_SCOPE is nonzero, the
compound-statement does not define a scope. Returns a new
COMPOUND_STMT if appropriate. */
@@ -840,7 +846,7 @@ begin_compound_stmt (has_no_scope)
}
/* Finish a compound-statement, which may be given by COMPOUND_STMT.
- If HAS_NO_SCOPE is non-zero, the compound statement does not define
+ If HAS_NO_SCOPE is nonzero, the compound statement does not define
a scope. */
tree
@@ -929,7 +935,7 @@ finish_asm_stmt (cv_qualifier, string, output_operands,
tree operand;
constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
- operand = TREE_VALUE (output_operands);
+ operand = TREE_VALUE (t);
if (!parse_output_constraint (&constraint,
i, ninputs, noutputs,
@@ -1003,7 +1009,7 @@ finish_eh_cleanup (cleanup)
add_stmt (r);
}
-/* Generate the RTL for a RETURN_INIT. */
+/* Generate the RTL for a RETURN_INIT. */
static void
genrtl_named_return_value ()
@@ -1094,67 +1100,21 @@ begin_mem_initializers ()
error ("only constructors take base initializers");
}
-/* The INIT_LIST is a list of mem-initializers, in the order they were
- written by the user. The TREE_VALUE of each node is a list of
- initializers for a particular subobject. The TREE_PURPOSE is a
- FIELD_DECL is the initializer is for a non-static data member, and
- a class type if the initializer is for a base class. */
+/* The MEM_INITS is a list of mem-initializers, in reverse of the
+ order they were written by the user. Each node is as for
+ emit_mem_initializers. */
void
-finish_mem_initializers (init_list)
- tree init_list;
+finish_mem_initializers (tree mem_inits)
{
- tree member_init_list;
- tree base_init_list;
- tree last_base_warned_about;
- tree next;
- tree init;
-
- member_init_list = NULL_TREE;
- base_init_list = NULL_TREE;
- last_base_warned_about = NULL_TREE;
-
- for (init = init_list; init; init = next)
- {
- next = TREE_CHAIN (init);
- if (TREE_CODE (TREE_PURPOSE (init)) == FIELD_DECL)
- {
- TREE_CHAIN (init) = member_init_list;
- member_init_list = init;
-
- /* We're running through the initializers from right to left
- as we process them here. So, if we see a data member
- initializer after we see a base initializer, that
- actually means that the base initializer preceded the
- data member initializer. */
- if (warn_reorder && last_base_warned_about != base_init_list)
- {
- tree base;
-
- for (base = base_init_list;
- base != last_base_warned_about;
- base = TREE_CHAIN (base))
- {
- warning ("base initializer for `%T'",
- TREE_PURPOSE (base));
- warning (" will be re-ordered to precede member initializations");
- }
-
- last_base_warned_about = base_init_list;
- }
- }
- else
- {
- TREE_CHAIN (init) = base_init_list;
- base_init_list = init;
- }
- }
+ /* Reorder the MEM_INITS so that they are in the order they appeared
+ in the source program. */
+ mem_inits = nreverse (mem_inits);
if (processing_template_decl)
- add_stmt (build_min_nt (CTOR_INITIALIZER,
- member_init_list, base_init_list));
+ add_stmt (build_min_nt (CTOR_INITIALIZER, mem_inits));
else
- emit_base_init (member_init_list, base_init_list);
+ emit_mem_initializers (mem_inits);
}
/* Returns the stack of SCOPE_STMTs for the current function. */
@@ -1572,7 +1532,7 @@ reset_type_access_control ()
}
/* Begin a function definition declared with DECL_SPECS, ATTRIBUTES,
- and DECLARATOR. Returns non-zero if the function-declaration is
+ and DECLARATOR. Returns nonzero if the function-declaration is
valid. */
int
@@ -1633,7 +1593,7 @@ finish_translation_unit ()
while (current_namespace != global_namespace)
pop_namespace ();
- /* Do file scope __FUNCTION__ et al. */
+ /* Do file scope __FUNCTION__ et al. */
finish_fname_decls ();
finish_file ();
@@ -1696,7 +1656,7 @@ check_template_template_default_arg (tree argument)
}
/* Finish a parameter list, indicated by PARMS. If ELLIPSIS is
- non-zero, the parameter list was terminated by a `...'. */
+ nonzero, the parameter list was terminated by a `...'. */
tree
finish_parmlist (parms, ellipsis)
@@ -1724,7 +1684,7 @@ begin_class_definition (t)
if (t == error_mark_node)
return error_mark_node;
- /* Check the bases are accessible. */
+ /* Check the bases are accessible. */
decl_type_access_control (TYPE_NAME (t));
reset_type_access_control ();
@@ -2022,7 +1982,7 @@ finish_template_decl (parms)
/* Finish processing a template-id (which names a type) of the form
NAME < ARGS >. Return the TYPE_DECL for the type named by the
- template-id. If ENTERING_SCOPE is non-zero we are about to enter
+ template-id. If ENTERING_SCOPE is nonzero we are about to enter
the scope of template-id indicated. */
tree
@@ -2506,7 +2466,7 @@ nullify_returns_r (tp, walk_subtrees, data)
if (TYPE_P (*tp))
*walk_subtrees = 0;
else if (TREE_CODE (*tp) == RETURN_STMT)
- RETURN_EXPR (*tp) = NULL_TREE;
+ RETURN_STMT_EXPR (*tp) = NULL_TREE;
else if (TREE_CODE (*tp) == CLEANUP_STMT
&& CLEANUP_DECL (*tp) == nrv)
CLEANUP_EH_ONLY (*tp) = 1;
diff --git a/gcc/cp/spew.c b/gcc/cp/spew.c
index efeae64a711..8633bb8c4c5 100644
--- a/gcc/cp/spew.c
+++ b/gcc/cp/spew.c
@@ -86,7 +86,7 @@ struct unparsed_text GTY(())
struct token_chunk *last_chunk; /* End of the token list. */
short last_pos; /* Number of tokens used in the last chunk of
- TOKENS. */
+ TOKENS. */
short cur_pos; /* Current token in 'cur_chunk', when rescanning. */
struct token_chunk *cur_chunk; /* Current chunk, when rescanning. */
@@ -185,7 +185,7 @@ static int first_token;
static GTY(()) tree defarg_fns;
/* current default parameter */
static GTY(()) tree defarg_parm;
-/* list of unprocessed fns met during current fn. */
+/* list of unprocessed fns met during current fn. */
static GTY(()) tree defarg_depfns;
/* list of fns with circular defargs */
static GTY(()) tree defarg_fnsdone;
@@ -668,7 +668,7 @@ do_aggr ()
void
see_typename ()
{
- /* Only types expected, not even namespaces. */
+ /* Only types expected, not even namespaces. */
looking_for_typename = 2;
if (yychar < 0)
if ((yychar = yylex ()) < 0) yychar = 0;
@@ -754,7 +754,7 @@ yylex ()
case PTYPENAME:
case PTYPENAME_DEFN:
/* If we see a SCOPE next, restore the old value.
- Otherwise, we got what we want. */
+ Otherwise, we got what we want. */
looking_for_typename = old_looking_for_typename;
looking_for_template = 0;
break;
@@ -832,7 +832,7 @@ yylex ()
}
/* Unget character CH from the input stream.
- If RESCAN is non-zero, then we want to `see' this
+ If RESCAN is nonzero, then we want to `see' this
character as the next input token. */
void
@@ -887,7 +887,7 @@ frob_id (yyc, peek, idp)
case NSNAME:
case PTYPENAME:
/* If this got special lookup, remember it. In these
- cases, we know it can't be a declarator-id. */
+ cases, we know it can't be a declarator-id. */
if (got_scope || got_object)
*idp = trrr;
/* FALLTHROUGH */
@@ -1372,7 +1372,7 @@ do_pending_defargs ()
/* No need to say what else is dependent, as they will be
picked up in another pass. */
- /* Immediately repeat, but marked so that we break the loop. */
+ /* Immediately repeat, but marked so that we break the loop. */
defarg_fns = current;
TREE_PURPOSE (current) = error_mark_node;
}
@@ -1384,7 +1384,7 @@ do_pending_defargs ()
}
/* After parsing all the default arguments, we must clear any that remain,
- which will be part of a circular dependency. */
+ which will be part of a circular dependency. */
void
done_pending_defargs ()
{
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 36305660372..ddc1ce1001a 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA. */
#include "insn-config.h"
#include "integrate.h"
#include "tree-inline.h"
+#include "target.h"
static tree bot_manip PARAMS ((tree *, int *, void *));
static tree bot_replace PARAMS ((tree *, int *, void *));
@@ -39,7 +40,7 @@ static tree build_cplus_array_type_1 PARAMS ((tree, tree));
static int list_hash_eq PARAMS ((const void *, const void *));
static hashval_t list_hash_pieces PARAMS ((tree, tree, tree));
static hashval_t list_hash PARAMS ((const void *));
-static cp_lvalue_kind lvalue_p_1 PARAMS ((tree, int));
+static cp_lvalue_kind lvalue_p_1 PARAMS ((tree, int, int));
static tree no_linkage_helper PARAMS ((tree *, int *, void *));
static tree build_srcloc PARAMS ((const char *, int));
static tree mark_local_for_remap_r PARAMS ((tree *, int *, void *));
@@ -56,12 +57,13 @@ static tree handle_init_priority_attribute PARAMS ((tree *, tree, tree, int, boo
/* If REF is an lvalue, returns the kind of lvalue that REF is.
Otherwise, returns clk_none. If TREAT_CLASS_RVALUES_AS_LVALUES is
- non-zero, rvalues of class type are considered lvalues. */
+ nonzero, rvalues of class type are considered lvalues. */
static cp_lvalue_kind
-lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
+lvalue_p_1 (ref, treat_class_rvalues_as_lvalues, allow_cast_as_lvalue)
tree ref;
int treat_class_rvalues_as_lvalues;
+ int allow_cast_as_lvalue;
{
cp_lvalue_kind op1_lvalue_kind = clk_none;
cp_lvalue_kind op2_lvalue_kind = clk_none;
@@ -84,16 +86,28 @@ lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
case WITH_CLEANUP_EXPR:
case REALPART_EXPR:
case IMAGPART_EXPR:
- /* This shouldn't be here, but there are lots of places in the compiler
- that are sloppy about tacking on NOP_EXPRs to the same type when
- no actual conversion is happening. */
- case NOP_EXPR:
return lvalue_p_1 (TREE_OPERAND (ref, 0),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
+
+ case NOP_EXPR:
+ /* If expression doesn't change the type, we consider it as an
+ lvalue even when cast_as_lvalue extension isn't selected.
+ That's because parts of the compiler are alleged to be sloppy
+ about sticking in NOP_EXPR node for no good reason. */
+ if (allow_cast_as_lvalue ||
+ same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (ref)),
+ TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (ref, 0)))))
+ return lvalue_p_1 (TREE_OPERAND (ref, 0),
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
+ else
+ return clk_none;
case COMPONENT_REF:
op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
if (op1_lvalue_kind
/* The "field" can be a FUNCTION_DECL or an OVERLOAD in some
situations. */
@@ -134,16 +148,20 @@ lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
case MAX_EXPR:
case MIN_EXPR:
op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
op2_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
break;
case COND_EXPR:
op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
op2_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 2),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
break;
case MODIFY_EXPR:
@@ -151,7 +169,8 @@ lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
case COMPOUND_EXPR:
return lvalue_p_1 (TREE_OPERAND (ref, 1),
- treat_class_rvalues_as_lvalues);
+ treat_class_rvalues_as_lvalues,
+ allow_cast_as_lvalue);
case TARGET_EXPR:
return treat_class_rvalues_as_lvalues ? clk_class : clk_none;
@@ -196,7 +215,7 @@ cp_lvalue_kind
real_lvalue_p (ref)
tree ref;
{
- return lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/0);
+ return lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/ 0, /*cast*/ 1);
}
/* This differs from real_lvalue_p in that class rvalues are
@@ -207,7 +226,15 @@ lvalue_p (ref)
tree ref;
{
return
- (lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/1) != clk_none);
+ (lvalue_p_1 (ref, /*class rvalue ok*/ 1, /*cast*/ 1) != clk_none);
+}
+
+int
+non_cast_lvalue_p (ref)
+ tree ref;
+{
+ return
+ (lvalue_p_1 (ref, /*class rvalue ok*/ 1, /*cast*/ 0) != clk_none);
}
/* Return nonzero if REF is an lvalue valid for this language;
@@ -218,7 +245,20 @@ lvalue_or_else (ref, string)
tree ref;
const char *string;
{
- int win = lvalue_p (ref);
+ int ret = lvalue_p_1 (ref, /* class rvalue ok */ 1, /* cast ok */ 1);
+ int win = (ret != clk_none);
+ if (! win)
+ error ("non-lvalue in %s", string);
+ return win;
+}
+
+int
+non_cast_lvalue_or_else (ref, string)
+ tree ref;
+ const char *string;
+{
+ int ret = lvalue_p_1 (ref, /* class rvalue ok */ 1, /* cast ok */ 0);
+ int win = (ret != clk_none);
if (! win)
error ("non-lvalue in %s", string);
return win;
@@ -537,6 +577,11 @@ cp_build_qualified_type_real (type, type_quals, complain)
{
tree result;
int bad_quals = TYPE_UNQUALIFIED;
+ /* We keep bad function qualifiers separate, so that we can decide
+ whether to implement DR 295 or not. DR 295 break existing code,
+ unfortunately. Remove this variable to implement the defect
+ report. */
+ int bad_func_quals = TYPE_UNQUALIFIED;
if (type == error_mark_node)
return type;
@@ -552,6 +597,8 @@ cp_build_qualified_type_real (type, type_quals, complain)
|| TREE_CODE (type) == METHOD_TYPE))
{
bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
+ if (TREE_CODE (type) != REFERENCE_TYPE)
+ bad_func_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
}
@@ -570,21 +617,23 @@ cp_build_qualified_type_real (type, type_quals, complain)
/*OK*/;
else if (!(complain & (tf_error | tf_ignore_bad_quals)))
return error_mark_node;
+ else if (bad_func_quals && !(complain & tf_error))
+ return error_mark_node;
else
{
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;
+ bad_quals |= bad_func_quals;
if (bad_quals)
{
tree bad_type = build_qualified_type (ptr_type_node, bad_quals);
- if (!(complain & tf_ignore_bad_quals))
+ if (!(complain & tf_ignore_bad_quals)
+ || bad_func_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);
}
}
@@ -963,9 +1012,10 @@ really_overloaded_fn (x)
x = TREE_OPERAND (x, 1);
if (BASELINK_P (x))
x = BASELINK_FUNCTIONS (x);
- return (TREE_CODE (x) == OVERLOAD
- && (OVL_CHAIN (x)
- || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
+
+ return ((TREE_CODE (x) == OVERLOAD && OVL_CHAIN (x))
+ || DECL_FUNCTION_TEMPLATE_P (OVL_CURRENT (x))
+ || TREE_CODE (x) == TEMPLATE_ID_EXPR);
}
/* Return the OVERLOAD or FUNCTION_DECL inside FNS. FNS can be an
@@ -987,7 +1037,7 @@ get_first_fn (from)
tree from;
{
my_friendly_assert (is_overloaded_fn (from), 9);
- /* A baselink is also considered an overloaded function. */
+ /* A baselink is also considered an overloaded function. */
if (BASELINK_P (from))
from = BASELINK_FUNCTIONS (from);
return OVL_CURRENT (from);
@@ -1004,7 +1054,7 @@ bound_pmf_p (t)
&& TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (t, 1))));
}
-/* Return a new OVL node, concatenating it with the old one. */
+/* Return a new OVL node, concatenating it with the old one. */
tree
ovl_cons (decl, chain)
@@ -1043,7 +1093,7 @@ is_aggr_type_2 (t1, t2)
return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
}
-/* Returns non-zero if CODE is the code for a statement. */
+/* Returns nonzero if CODE is the code for a statement. */
int
cp_statement_code_p (code)
@@ -1858,7 +1908,7 @@ maybe_dummy_object (type, binfop)
if (current_class_ref && context == current_class_type
/* Kludge: Make sure that current_class_type is actually
correct. It might not be if we're in the middle of
- tsubst_default_argument. */
+ tsubst_default_argument. */
&& same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref)),
current_class_type))
decl = current_class_ref;
@@ -1888,6 +1938,8 @@ pod_type_p (t)
{
t = strip_array_types (t);
+ if (t == error_mark_node)
+ return 1;
if (INTEGRAL_TYPE_P (t))
return 1; /* integral, character or enumeral type */
if (FLOAT_TYPE_P (t))
@@ -1906,6 +1958,72 @@ pod_type_p (t)
return 1;
}
+/* Returns true if T is a variably modified type, in the sense of
+ C99.
+
+ In C99, a struct type is never variably modified because a VLA may
+ not appear as a structure member. However, in GNU C code like:
+
+ struct S { int i[f()]; };
+
+ is valid. Even though GNU C++ does not allow that, this function
+ may sometimes be used in the C front end, so it treats any type
+ with variable size in the same way that C99 treats VLAs.
+
+ In particular, a variably modified type is one that involves a type
+ with variable size. */
+
+bool
+variably_modified_type_p (tree type)
+{
+ /* If TYPE itself has variable size, it is variably modified.
+
+ We do not yet have a representation of the C99 '[*]' syntax.
+ When a representation is chosen, this function should be modified
+ to test for that case as well. */
+ if (TYPE_SIZE (type)
+ && TYPE_SIZE (type) != error_mark_node
+ && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+ return true;
+
+ /* If TYPE is a pointer or reference, it is variably modified if and
+ only if the type pointed to is variably modified. */
+ if (TYPE_PTR_P (type)
+ || TREE_CODE (type) == REFERENCE_TYPE)
+ return variably_modified_type_p (TREE_TYPE (type));
+
+ /* If TYPE is an array, it is variably modified if the array
+ elements are. (Note that the VLA case has alredy been checked
+ above). */
+ if (TREE_CODE (type) == ARRAY_TYPE)
+ return variably_modified_type_p (TREE_TYPE (type));
+
+ /* If TYPE is a pointer-to-member, it is variably modified if either
+ the class or the member are variably modified. */
+ if (TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type))
+ return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type))
+ || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type)));
+
+ /* If TYPE Is a function type, it is variably modified if any of the
+ parameters or the return type are variably modified. */
+ if (TREE_CODE (type) == FUNCTION_TYPE
+ || TREE_CODE (type) == METHOD_TYPE)
+ {
+ tree parm;
+
+ if (variably_modified_type_p (TREE_TYPE (type)))
+ return true;
+ for (parm = TYPE_ARG_TYPES (type);
+ parm && parm != void_list_node;
+ parm = TREE_CHAIN (parm))
+ if (variably_modified_type_p (TREE_VALUE (parm)))
+ return true;
+ }
+
+ /* All other types are not variably modified. */
+ return false;
+}
+
/* Returns 1 iff zero initialization of type T means actually storing
zeros in it. */
@@ -1915,6 +2033,9 @@ zero_init_p (t)
{
t = strip_array_types (t);
+ if (t == error_mark_node)
+ return 1;
+
/* NULL pointers to data members are initialized with -1. */
if (TYPE_PTRMEM_P (t))
return 0;
@@ -2030,7 +2151,7 @@ handle_init_priority_attribute (node, name, args, flags, no_add_attrs)
/* Static objects in functions are initialized the
first time control passes through that
function. This is not precise enough to pin down an
- init_priority value, so don't allow it. */
+ init_priority value, so don't allow it. */
|| current_function_decl)
{
error ("can only use `%s' attribute on file-scope definitions of objects of class type",
@@ -2180,6 +2301,14 @@ cp_cannot_inline_tree_fn (fnp)
return 1;
}
+ /* Don't auto-inline anything that might not be bound within
+ this unit of translation. */
+ if (!DECL_DECLARED_INLINE_P (fn) && !(*targetm.binds_local_p) (fn))
+ {
+ DECL_UNINLINABLE (fn) = 1;
+ return 1;
+ }
+
if (varargs_function_p (fn))
{
DECL_UNINLINABLE (fn) = 1;
@@ -2305,7 +2434,7 @@ cp_copy_res_decl_for_inlining (result, fn, caller, decl_map_,
return var;
}
-/* Record that we're about to start inlining FN, and return non-zero if
+/* Record that we're about to start inlining FN, and return nonzero if
that's OK. Used for lang_hooks.tree_inlining.start_inlining. */
int
@@ -2492,7 +2621,7 @@ name_p (tree node)
|| TREE_CODE (node) == SCOPE_REF);
}
-/* Returns non-zero if TYPE is a character type, including wchar_t. */
+/* Returns nonzero if TYPE is a character type, including wchar_t. */
int
char_type_p (type)
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index eaa79a0da7e..ae78dbfee4e 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -155,16 +155,16 @@ complete_type (type)
return type;
}
-/* Like complete_type, but issue an error if the TYPE cannot be
- completed. VALUE is used for informative diagnostics. WARN_ONLY
- will cause a warning message to be printed, instead of an error.
+/* Like complete_type, but issue an error if the TYPE cannot be completed.
+ VALUE is used for informative diagnostics. DIAG_TYPE indicates the type
+ of diagnostic: 0 for an error, 1 for a warning, 2 for a pedwarn.
Returns NULL_TREE if the type cannot be made complete. */
tree
-complete_type_or_diagnostic (type, value, warn_only)
+complete_type_or_diagnostic (type, value, diag_type)
tree type;
tree value;
- int warn_only;
+ int diag_type;
{
type = complete_type (type);
if (type == error_mark_node)
@@ -172,7 +172,7 @@ complete_type_or_diagnostic (type, value, warn_only)
return NULL_TREE;
else if (!COMPLETE_TYPE_P (type))
{
- cxx_incomplete_type_diagnostic (value, type, warn_only);
+ cxx_incomplete_type_diagnostic (value, type, diag_type);
return NULL_TREE;
}
else
@@ -491,7 +491,7 @@ composite_pointer_type (t1, t2, arg1, arg2, location)
return t1;
/* Deal with pointer-to-member functions in the same way as we deal
- with pointers to functions. */
+ with pointers to functions. */
if (TYPE_PTRMEMFUNC_P (t1))
t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
if (TYPE_PTRMEMFUNC_P (t2))
@@ -800,11 +800,11 @@ comp_except_specs (t1, t2, exact)
if (t1 == t2)
return 1;
- if (t1 == NULL_TREE) /* T1 is ... */
+ if (t1 == NULL_TREE) /* T1 is ... */
return t2 == NULL_TREE || !exact;
if (!TREE_VALUE (t1)) /* t1 is EMPTY */
return t2 != NULL_TREE && !TREE_VALUE (t2);
- if (t2 == NULL_TREE) /* T2 is ... */
+ if (t2 == NULL_TREE) /* T2 is ... */
return 0;
if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
return !exact;
@@ -1811,7 +1811,7 @@ lookup_anon_field (t, type)
{
if (TREE_STATIC (field))
continue;
- if (TREE_CODE (field) != FIELD_DECL)
+ if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
continue;
/* If we find it directly, return the field. */
@@ -1859,6 +1859,27 @@ build_class_member_access_expr (tree object, tree member,
my_friendly_assert (DECL_P (member) || BASELINK_P (member),
20020801);
+ /* Transform `(a, b).x' into `a, b.x' and `(a ? b : c).x' into
+ `a ? b.x : c.x'. These transformations should not really be
+ necessary, but they are. */
+ if (TREE_CODE (object) == COMPOUND_EXPR)
+ {
+ result = build_class_member_access_expr (TREE_OPERAND (object, 1),
+ member, access_path,
+ preserve_reference);
+ return build (COMPOUND_EXPR, TREE_TYPE (result),
+ TREE_OPERAND (object, 0), result);
+ }
+ else if (TREE_CODE (object) == COND_EXPR)
+ return (build_conditional_expr
+ (TREE_OPERAND (object, 0),
+ build_class_member_access_expr (TREE_OPERAND (object, 1),
+ member, access_path,
+ preserve_reference),
+ build_class_member_access_expr (TREE_OPERAND (object, 2),
+ member, access_path,
+ preserve_reference)));
+
/* [expr.ref]
The type of the first expression shall be "class object" (of a
@@ -2135,7 +2156,7 @@ finish_class_member_access_expr (tree object, tree name)
if (TREE_CODE (scope) == NAMESPACE_DECL)
{
error ("`%D::%D' is not a member of `%T'",
- scope, member, object_type);
+ scope, name, object_type);
return error_mark_node;
}
@@ -2501,7 +2522,7 @@ build_array_ref (array, idx)
With the final ISO C++ rules, such an optimization is
incorrect: A pointer to a derived member can be static_cast
to pointer-to-base-member, as long as the dynamic object
- later has the right member. */
+ later has the right member. */
tree
get_member_function_from_ptrfunc (instance_ptrptr, function)
@@ -2523,7 +2544,7 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
{
/* Extracting the function address from a pmf is only
allowed with -Wno-pmf-conversions. It only works for
- pmf constants. */
+ pmf constants. */
e1 = build_addr_func (PTRMEM_CST_MEMBER (function));
e1 = convert (fntype, e1);
return e1;
@@ -2562,7 +2583,7 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
}
/* Convert down to the right base before using the instance. First
- use the type... */
+ use the type... */
basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
basetype, ba_check, NULL);
@@ -4247,7 +4268,7 @@ build_unary_op (code, xarg, noconvert)
is an error. */
else if (TREE_CODE (argtype) != FUNCTION_TYPE
&& TREE_CODE (argtype) != METHOD_TYPE
- && !lvalue_or_else (arg, "unary `&'"))
+ && !non_cast_lvalue_or_else (arg, "unary `&'"))
return error_mark_node;
if (argtype != error_mark_node)
@@ -4271,7 +4292,7 @@ build_unary_op (code, xarg, noconvert)
&& (TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg, 0), 0))
== INTEGER_CST))
{
- /* offsetof idiom, fold it. */
+ /* offsetof idiom, fold it. */
tree field = TREE_OPERAND (arg, 1);
tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)),
@@ -4562,7 +4583,7 @@ build_x_compound_expr (list)
if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)))
{
- /* FIXME: This test should be in the implicit cast to void of the LHS. */
+ /* FIXME: This test should be in the implicit cast to void of the LHS. */
/* the left-hand operand of a comma expression is like an expression
statement: we should warn if it doesn't have any side-effects,
unless it was explicitly cast to (void). */
@@ -4673,12 +4694,12 @@ build_static_cast (type, expr)
? can_convert_arg (type, intype, expr)
: can_convert_arg (strip_all_pointer_quals (type),
strip_all_pointer_quals (intype), expr))
- /* This is a standard conversion. */
+ /* This is a standard conversion. */
ok = 1;
else if (TYPE_PTROB_P (type) && TYPE_PTROB_P (intype))
{
/* They're pointers to objects. They must be aggregates that
- are related non-virtually. */
+ are related non-virtually. */
base_kind kind;
if (IS_AGGR_TYPE (TREE_TYPE (type)) && IS_AGGR_TYPE (TREE_TYPE (intype))
@@ -4691,7 +4712,7 @@ build_static_cast (type, expr)
{
/* 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. */
+ must be related non-virtually. */
base_kind kind;
if (same_type_p
@@ -5489,7 +5510,7 @@ get_delta_difference (from, to, force)
if (virt_binfo)
{
- /* This is a reinterpret cast, we choose to do nothing. */
+ /* This is a reinterpret cast, we choose to do nothing. */
warning ("pointer to member cast via virtual base `%T' of `%T'",
BINFO_TYPE (virt_binfo),
BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
@@ -5507,7 +5528,7 @@ get_delta_difference (from, to, force)
virt_binfo = binfo_from_vbase (binfo);
if (virt_binfo)
{
- /* This is a reinterpret cast, we choose to do nothing. */
+ /* This is a reinterpret cast, we choose to do nothing. */
if (force)
warning ("pointer to member cast via virtual base `%T' of `%T'",
BINFO_TYPE (virt_binfo),
@@ -5559,7 +5580,7 @@ build_ptrmemfunc1 (type, delta, pfn)
as a value in expressions. TYPE is the POINTER to METHOD_TYPE we
want to be.
- If FORCE is non-zero, then force this conversion, even if
+ If FORCE is nonzero, then force this conversion, even if
we would rather not do it. Usually set when using an explicit
cast.
@@ -5874,7 +5895,7 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
}
/* Convert RHS to be of type TYPE.
- If EXP is non-zero, it is the target of the initialization.
+ If EXP is nonzero, it is the target of the initialization.
ERRTYPE is a string to use in error messages.
Two major differences between the behavior of
@@ -6024,9 +6045,10 @@ c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
else
{
tree type = TREE_TYPE (o[i]);
- if (CP_TYPE_CONST_P (type)
- || (IS_AGGR_TYPE_CODE (TREE_CODE (type))
- && C_TYPE_FIELDS_READONLY (type)))
+ if (type != error_mark_node
+ && (CP_TYPE_CONST_P (type)
+ || (IS_AGGR_TYPE_CODE (TREE_CODE (type))
+ && C_TYPE_FIELDS_READONLY (type))))
readonly_error (o[i], "modification by `asm'", 1);
}
}
@@ -6128,7 +6150,7 @@ check_return_expr (retval)
{
if (in_function_try_handler)
/* If a return statement appears in a handler of the
- function-try-block of a constructor, the program is ill-formed. */
+ function-try-block of a constructor, the program is ill-formed. */
error ("cannot return from a handler of a function-try-block of a constructor");
else if (retval)
/* You can't return a value from a constructor. */
@@ -6249,7 +6271,7 @@ check_return_expr (retval)
/* First convert the value to the function's return type, then
to the type of return value's location to handle the
- case that functype is smaller than the valtype. */
+ case that functype is smaller than the valtype. */
retval = convert_for_initialization
(NULL_TREE, functype, retval, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING,
"return", NULL_TREE, 0);
@@ -6276,9 +6298,9 @@ check_return_expr (retval)
}
-/* Returns non-zero if the pointer-type FROM can be converted to the
+/* Returns nonzero if the pointer-type FROM can be converted to the
pointer-type TO via a qualification conversion. If CONSTP is -1,
- then we return non-zero if the pointers are similar, and the
+ then we return nonzero if the pointers are similar, and the
cv-qualification signature of FROM is a proper subset of that of TO.
If CONSTP is positive, then all outer pointers have been
@@ -6442,7 +6464,7 @@ cp_type_quals (type)
return TYPE_QUALS (type);
}
-/* Returns non-zero if the TYPE contains a mutable member */
+/* Returns nonzero if the TYPE contains a mutable member */
int
cp_has_mutable_p (type)
@@ -6515,7 +6537,7 @@ casts_away_constness_r (t1, t2)
*t2 = cp_build_qualified_type (*t2, quals2);
}
-/* Returns non-zero if casting from TYPE1 to TYPE2 casts away
+/* Returns nonzero if casting from TYPE1 to TYPE2 casts away
constness. */
static int
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index e4d7e3eb0a2..cc712b91bef 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -182,24 +182,30 @@ abstract_virtuals_error (decl, type)
/* Print an error message for invalid use of an incomplete type.
VALUE is the expression that was used (or 0 if that isn't known)
- and TYPE is the type that was invalid. If WARN_ONLY is nonzero, a
- warning is printed, otherwise an error is printed. */
+ and TYPE is the type that was invalid. DIAG_TYPE indicates the
+ type of diagnostic: 0 for an error, 1 for a warning, 2 for a
+ pedwarn. */
void
-cxx_incomplete_type_diagnostic (value, type, warn_only)
+cxx_incomplete_type_diagnostic (value, type, diag_type)
tree value;
tree type;
- int warn_only;
+ int diag_type;
{
int decl = 0;
void (*p_msg) PARAMS ((const char *, ...));
void (*p_msg_at) PARAMS ((const char *, ...));
- if (warn_only)
+ if (diag_type == 1)
{
p_msg = warning;
p_msg_at = cp_warning_at;
}
+ else if (diag_type == 2)
+ {
+ p_msg = pedwarn;
+ p_msg_at = cp_pedwarn_at;
+ }
else
{
p_msg = error;
@@ -314,12 +320,6 @@ store_init_value (decl, init)
if (TREE_CODE (type) == ERROR_MARK)
return NULL_TREE;
-#if 0
- /* This breaks arrays, and should not have any effect for other decls. */
- /* Take care of C++ business up here. */
- type = TYPE_MAIN_VARIANT (type);
-#endif
-
if (IS_AGGR_TYPE (type))
{
if (! TYPE_HAS_TRIVIAL_INIT_REF (type)
@@ -331,35 +331,6 @@ store_init_value (decl, init)
error ("constructor syntax used, but no constructor declared for type `%T'", type);
init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (init));
}
-#if 0
- if (TREE_CODE (init) == CONSTRUCTOR)
- {
- tree field;
-
- /* Check that we're really an aggregate as ARM 8.4.1 defines it. */
- if (CLASSTYPE_N_BASECLASSES (type))
- cp_error_at ("initializer list construction invalid for derived class object `%D'", decl);
- if (CLASSTYPE_VTBL_PTR (type))
- cp_error_at ("initializer list construction invalid for polymorphic class object `%D'", decl);
- if (TYPE_NEEDS_CONSTRUCTING (type))
- {
- cp_error_at ("initializer list construction invalid for `%D'", decl);
- error ("due to the presence of a constructor");
- }
- for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
- if (TREE_PRIVATE (field) || TREE_PROTECTED (field))
- {
- cp_error_at ("initializer list construction invalid for `%D'", decl);
- cp_error_at ("due to non-public access of member `%D'", field);
- }
- for (field = TYPE_METHODS (type); field; field = TREE_CHAIN (field))
- if (TREE_PRIVATE (field) || TREE_PROTECTED (field))
- {
- cp_error_at ("initializer list construction invalid for `%D'", decl);
- cp_error_at ("due to non-public access of member `%D'", field);
- }
- }
-#endif
}
else if (TREE_CODE (init) == TREE_LIST
&& TREE_TYPE (init) != unknown_type_node)
@@ -396,15 +367,8 @@ store_init_value (decl, init)
/* End of special C++ code. */
- /* We might have already run this bracketed initializer through
- digest_init. Don't do so again. */
- if (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init)
- && TREE_TYPE (init)
- && TYPE_MAIN_VARIANT (TREE_TYPE (init)) == TYPE_MAIN_VARIANT (type))
- value = init;
- else
- /* Digest the specified initializer into an expression. */
- value = digest_init (type, init, (tree *) 0);
+ /* Digest the specified initializer into an expression. */
+ value = digest_init (type, init, (tree *) 0);
/* Store the expression if valid; else report error. */
@@ -451,27 +415,6 @@ store_init_value (decl, init)
return NULL_TREE;
}
-/* Same as store_init_value, but used for known-to-be-valid static
- initializers. Used to introduce a static initializer even in data
- structures that may require dynamic initialization. */
-
-tree
-force_store_init_value (decl, init)
- tree decl, init;
-{
- tree type = TREE_TYPE (decl);
- int needs_constructing = TYPE_NEEDS_CONSTRUCTING (type);
-
- TYPE_NEEDS_CONSTRUCTING (type) = 0;
-
- init = store_init_value (decl, init);
- if (init)
- abort ();
-
- TYPE_NEEDS_CONSTRUCTING (type) = needs_constructing;
-
- return init;
-}
/* Digest the parser output INIT as an initializer for type TYPE.
Return a C expression of type TYPE to represent the initial value.
@@ -489,8 +432,7 @@ digest_init (type, init, tail)
enum tree_code code = TREE_CODE (type);
tree element = NULL_TREE;
tree old_tail_contents = NULL_TREE;
- /* Nonzero if INIT is a braced grouping, which comes in as a CONSTRUCTOR
- tree node which has no TREE_TYPE. */
+ /* Nonzero if INIT is a braced grouping. */
int raw_constructor;
/* By default, assume we use one element from a list.
@@ -508,7 +450,7 @@ digest_init (type, init, tail)
if (TREE_CODE (init) == ERROR_MARK)
/* __PRETTY_FUNCTION__'s initializer is a bogus expression inside
- a template function. This gets substituted during instantiation. */
+ a template function. This gets substituted during instantiation. */
return init;
/* We must strip the outermost array type when completing the type,
@@ -521,10 +463,8 @@ digest_init (type, init, tail)
if (TREE_CODE (init) == NON_LVALUE_EXPR)
init = TREE_OPERAND (init, 0);
- if (TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == type)
- return init;
-
- raw_constructor = TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == 0;
+ raw_constructor = (TREE_CODE (init) == CONSTRUCTOR
+ && TREE_HAS_CONSTRUCTOR (init));
if (raw_constructor
&& CONSTRUCTOR_ELTS (init) != 0
@@ -785,7 +725,8 @@ process_init_constructor (type, init, elts)
next1 = digest_init (TREE_TYPE (type), next1, 0);
}
else if (! zero_init_p (TREE_TYPE (type)))
- next1 = build_forced_zero_init (TREE_TYPE (type));
+ next1 = build_zero_init (TREE_TYPE (type),
+ /*static_storage_p=*/false);
else
/* The default zero-initialization is fine for us; don't
add anything to the CONSTRUCTOR. */
@@ -834,7 +775,7 @@ process_init_constructor (type, init, elts)
continue;
}
- if (TREE_CODE (field) != FIELD_DECL)
+ if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
continue;
if (tail)
@@ -903,7 +844,8 @@ process_init_constructor (type, init, elts)
warning ("missing initializer for member `%D'", field);
if (! zero_init_p (TREE_TYPE (field)))
- next1 = build_forced_zero_init (TREE_TYPE (field));
+ next1 = build_zero_init (TREE_TYPE (field),
+ /*static_storage_p=*/false);
else
/* The default zero-initialization is fine for us; don't
add anything to the CONSTRUCTOR. */
@@ -927,8 +869,7 @@ process_init_constructor (type, init, elts)
/* Find the first named field. ANSI decided in September 1990
that only named fields count here. */
- while (field && (DECL_NAME (field) == 0
- || TREE_CODE (field) != FIELD_DECL))
+ while (field && (!DECL_NAME (field) || TREE_CODE (field) != FIELD_DECL))
field = TREE_CHAIN (field);
/* If this element specifies a field, initialize via that field. */
@@ -1345,6 +1286,7 @@ add_exception_specifier (list, spec, complain)
int ok;
tree core = spec;
int is_ptr;
+ int diag_type = -1; /* none */
if (spec == error_mark_node)
return list;
@@ -1366,7 +1308,15 @@ add_exception_specifier (list, spec, complain)
else if (processing_template_decl)
ok = 1;
else
- ok = COMPLETE_TYPE_P (complete_type (core));
+ {
+ ok = 1;
+ /* 15.4/1 says that types in an exception specifier must be complete,
+ but it seems more reasonable to only require this on definitions
+ and calls. So just give a pedwarn at this point; we will give an
+ error later if we hit one of those two cases. */
+ if (!COMPLETE_TYPE_P (complete_type (core)))
+ diag_type = 2; /* pedwarn */
+ }
if (ok)
{
@@ -1378,13 +1328,17 @@ add_exception_specifier (list, spec, complain)
if (!probe)
list = tree_cons (NULL_TREE, spec, list);
}
- else if (complain)
- cxx_incomplete_type_error (NULL_TREE, core);
+ else
+ diag_type = 0; /* error */
+
+ if (diag_type >= 0 && complain)
+ cxx_incomplete_type_diagnostic (NULL_TREE, core, diag_type);
+
return list;
}
/* Combine the two exceptions specifier lists LIST and ADD, and return
- their union. */
+ their union. */
tree
merge_exception_specifiers (list, add)
@@ -1418,3 +1372,34 @@ merge_exception_specifiers (list, add)
}
return list;
}
+
+/* Subroutine of build_call. Ensure that each of the types in the
+ exception specification is complete. Technically, 15.4/1 says that
+ they need to be complete when we see a declaration of the function,
+ but we should be able to get away with only requiring this when the
+ function is defined or called. See also add_exception_specifier. */
+
+void
+require_complete_eh_spec_types (fntype, decl)
+ tree fntype, decl;
+{
+ tree raises;
+ /* Don't complain about calls to op new. */
+ if (decl && DECL_ARTIFICIAL (decl))
+ return;
+ for (raises = TYPE_RAISES_EXCEPTIONS (fntype); raises;
+ raises = TREE_CHAIN (raises))
+ {
+ tree type = TREE_VALUE (raises);
+ if (type && !COMPLETE_TYPE_P (type))
+ {
+ if (decl)
+ error
+ ("call to function `%D' which throws incomplete type `%#T'",
+ decl, type);
+ else
+ error ("call to function which throws incomplete type `%#T'",
+ decl);
+ }
+ }
+}
diff --git a/gcc/cppexp.c b/gcc/cppexp.c
index a3ef96538ef..d4ea2fc1854 100644
--- a/gcc/cppexp.c
+++ b/gcc/cppexp.c
@@ -383,7 +383,7 @@ cpp_interpret_integer (pfile, token, type)
"integer constant is too large for its type");
/* If too big to be signed, consider it unsigned. Only warn for
decimal numbers. Traditional numbers were always signed (but
- we still honour an explicit U suffix); but we only have
+ we still honor an explicit U suffix); but we only have
traditional semantics in directives. */
else if (!result.unsignedp
&& !(CPP_OPTION (pfile, traditional)
@@ -774,7 +774,7 @@ _cpp_parse_expr (pfile)
}
else if (want_value)
{
- /* Ordering here is subtle and intended to favour the
+ /* Ordering here is subtle and intended to favor the
missing parenthesis diagnostics over alternatives. */
if (op.op == CPP_CLOSE_PAREN)
{
@@ -1551,7 +1551,7 @@ num_div_op (pfile, lhs, rhs, op)
return lhs;
}
- /* First non-zero bit of RHS is bit I. Do naive division by
+ /* First nonzero bit of RHS is bit I. Do naive division by
shifting the RHS fully left, and subtracting from LHS if LHS is
at least as big, and then repeating but with one less shift.
This is not very efficient, but is easy to understand. */
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
index 892583e2329..ac6fa8ab7db 100644
--- a/gcc/cppfiles.c
+++ b/gcc/cppfiles.c
@@ -353,7 +353,7 @@ stack_include_file (pfile, inc)
fp->inc = inc;
fp->inc->refcnt++;
- /* Initialise controlling macro state. */
+ /* Initialize controlling macro state. */
pfile->mi_valid = true;
pfile->mi_cmacro = 0;
@@ -658,7 +658,7 @@ report_missing_guard (n, b)
}
/* Create a dependency for file FNAME, or issue an error message as
- appropriate. ANGLE_BRACKETS is non-zero if the file was bracketed
+ appropriate. ANGLE_BRACKETS is nonzero if the file was bracketed
like <..>. */
static void
handle_missing_header (pfile, fname, angle_brackets)
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
index 5b0f0e83267..16e8dfe08fe 100644
--- a/gcc/cpphash.h
+++ b/gcc/cpphash.h
@@ -99,7 +99,7 @@ struct cpp_macro
/* If macro defined in system header. */
unsigned int syshdr : 1;
- /* Non-zero if it has been expanded or had its existence tested. */
+ /* Nonzero if it has been expanded or had its existence tested. */
unsigned int used : 1;
};
@@ -141,7 +141,7 @@ struct search_path
of an earlier directory on the search path. */
ino_t ino;
dev_t dev;
- /* Non-zero if it is a system include directory. */
+ /* Nonzero if it is a system include directory. */
int sysp;
/* Mapping of file names for this directory. Only used on MS-DOS
and related platforms. */
@@ -166,10 +166,10 @@ struct tokenrun
};
/* Accessor macros for struct cpp_context. */
-#define FIRST(c) (c->u.iso.first)
-#define LAST(c) (c->u.iso.last)
-#define CUR(c) (c->u.trad.cur)
-#define RLIMIT(c) (c->u.trad.rlimit)
+#define FIRST(c) ((c)->u.iso.first)
+#define LAST(c) ((c)->u.iso.last)
+#define CUR(c) ((c)->u.trad.cur)
+#define RLIMIT(c) ((c)->u.trad.rlimit)
typedef struct cpp_context cpp_context;
struct cpp_context
@@ -372,7 +372,7 @@ struct cpp_reader
tokenrun base_run, *cur_run;
unsigned int lookaheads;
- /* Non-zero prevents the lexer from re-using the token runs. */
+ /* Nonzero prevents the lexer from re-using the token runs. */
unsigned int keep_tokens;
/* Error counter for exit code. */
diff --git a/gcc/cppinit.c b/gcc/cppinit.c
index 99dd9490646..82b3056b704 100644
--- a/gcc/cppinit.c
+++ b/gcc/cppinit.c
@@ -194,7 +194,7 @@ path_include (pfile, list, path)
/* Append DIR to include path PATH. DIR must be allocated on the
heap; this routine takes responsibility for freeing it. CXX_AWARE
- is non-zero if the header contains extern "C" guards for C++,
+ is nonzero if the header contains extern "C" guards for C++,
otherwise it is zero. */
static void
append_include_chain (pfile, dir, path, cxx_aware)
@@ -515,7 +515,7 @@ cpp_create_reader (lang)
{
cpp_reader *pfile;
- /* Initialise this instance of the library if it hasn't been already. */
+ /* Initialize this instance of the library if it hasn't been already. */
init_library ();
pfile = (cpp_reader *) xcalloc (1, sizeof (cpp_reader));
@@ -543,7 +543,7 @@ cpp_create_reader (lang)
CPP_OPTION (pfile, unsigned_char) = 0;
CPP_OPTION (pfile, unsigned_wchar) = 1;
- /* Initialise the line map. Start at logical line 1, so we can use
+ /* Initialize the line map. Start at logical line 1, so we can use
a line number of zero for special states. */
init_line_maps (&pfile->line_maps);
pfile->line = 1;
@@ -562,7 +562,7 @@ cpp_create_reader (lang)
pfile->cur_run = &pfile->base_run;
pfile->cur_token = pfile->base_run.base;
- /* Initialise the base context. */
+ /* Initialize the base context. */
pfile->context = &pfile->base_context;
pfile->base_context.macro = 0;
pfile->base_context.prev = pfile->base_context.next = 0;
@@ -574,7 +574,7 @@ cpp_create_reader (lang)
/* The expression parser stack. */
_cpp_expand_op_stack (pfile);
- /* Initialise the buffer obstack. */
+ /* Initialize the buffer obstack. */
gcc_obstack_init (&pfile->buffer_ob);
_cpp_init_includes (pfile);
@@ -583,7 +583,7 @@ cpp_create_reader (lang)
}
/* Free resources used by PFILE. Accessing PFILE after this function
- returns leads to undefined behaviour. Returns the error count. */
+ returns leads to undefined behavior. Returns the error count. */
void
cpp_destroy (pfile)
cpp_reader *pfile;
@@ -808,7 +808,7 @@ init_standard_includes (pfile)
&& !CPP_OPTION (pfile, no_standard_cplusplus_includes)))
{
/* Does this dir start with the prefix? */
- if (!memcmp (p->fname, default_prefix, default_len))
+ if (!strncmp (p->fname, default_prefix, default_len))
{
/* Yes; change prefix and add to search list. */
int flen = strlen (p->fname);
@@ -840,7 +840,7 @@ init_standard_includes (pfile)
}
/* Pushes a command line -imacro and -include file indicated by P onto
- the buffer stack. Returns non-zero if successful. */
+ the buffer stack. Returns nonzero if successful. */
static bool
push_include (pfile, p)
cpp_reader *pfile;
@@ -1229,7 +1229,7 @@ parse_option (input)
md = (mn + mx) / 2;
opt_len = cl_options[md].opt_len;
- comp = memcmp (input, cl_options[md].opt_text, opt_len);
+ comp = strncmp (input, cl_options[md].opt_text, opt_len);
if (comp > 0)
mn = md + 1;
@@ -1254,7 +1254,7 @@ parse_option (input)
for (; mn < (unsigned int) N_OPTS; mn++)
{
opt_len = cl_options[mn].opt_len;
- if (memcmp (input, cl_options[mn].opt_text, opt_len))
+ if (strncmp (input, cl_options[mn].opt_text, opt_len))
break;
if (input[opt_len] == '\0')
return mn;
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index 7942c96ad30..7db6b24b253 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -112,7 +112,7 @@ handle_newline (pfile)
cpp_buffer *buffer = pfile->buffer;
/* Handle CR-LF and LF-CR. Most other implementations (e.g. java)
- only accept CR-LF; maybe we should fall back to that behaviour? */
+ only accept CR-LF; maybe we should fall back to that behavior? */
if (buffer->cur[-1] + buffer->cur[0] == '\r' + '\n')
buffer->cur++;
@@ -126,7 +126,7 @@ handle_newline (pfile)
the second '?'.
Warn if necessary, and returns true if the sequence forms a
- trigraph and the trigraph should be honoured. */
+ trigraph and the trigraph should be honored. */
static bool
trigraph_p (pfile)
cpp_reader *pfile;
@@ -252,7 +252,7 @@ get_effective_char (pfile)
/* Skip a C-style block comment. We find the end of the comment by
seeing if an asterisk is before every '/' we encounter. Returns
- non-zero if comment terminated by EOF, zero otherwise. */
+ nonzero if comment terminated by EOF, zero otherwise. */
static int
skip_block_comment (pfile)
cpp_reader *pfile;
@@ -297,7 +297,7 @@ skip_block_comment (pfile)
}
/* Skip a C++ line comment, leaving buffer->cur pointing to the
- terminating newline. Handles escaped newlines. Returns non-zero
+ terminating newline. Handles escaped newlines. Returns nonzero
if a multiline comment. */
static int
skip_line_comment (pfile)
@@ -561,7 +561,7 @@ parse_slow (pfile, cur, number_p, plen)
}
/* Parse a number, beginning with character C, skipping embedded
- backslash-newlines. LEADING_PERIOD is non-zero if there was a "."
+ backslash-newlines. LEADING_PERIOD is nonzero if there was a "."
before C. Place the result in NUMBER. */
static void
parse_number (pfile, number, leading_period)
@@ -1329,7 +1329,7 @@ _cpp_lex_direct (pfile)
case '}': result->type = CPP_CLOSE_BRACE; break;
case ';': result->type = CPP_SEMICOLON; break;
- /* @ is a punctuator in Objective C. */
+ /* @ is a punctuator in Objective-C. */
case '@': result->type = CPP_ATSIGN; break;
case '$':
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 0e9c4a1263f..c954448cbd3 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -300,7 +300,7 @@ prepare_directive_trad (pfile)
pfile->state.prevent_expansion++;
}
-/* Output diagnostics for a directive DIR. INDENTED is non-zero if
+/* Output diagnostics for a directive DIR. INDENTED is nonzero if
the '#' was indented. */
static void
directive_diagnostics (pfile, dir, indented)
@@ -336,10 +336,10 @@ directive_diagnostics (pfile, dir, indented)
}
}
-/* Check if we have a known directive. INDENTED is non-zero if the
+/* Check if we have a known directive. INDENTED is nonzero if the
'#' of the directive was indented. This function is in this file
to save unnecessarily exporting dtable etc. to cpplex.c. Returns
- non-zero if the line of tokens has been handled, zero if we should
+ nonzero if the line of tokens has been handled, zero if we should
continue processing the line. */
int
_cpp_handle_directive (pfile, indented)
@@ -367,7 +367,7 @@ _cpp_handle_directive (pfile, indented)
if (dname->val.node->directive_index)
dir = &dtable[dname->val.node->directive_index - 1];
}
- /* We do not recognise the # followed by a number extension in
+ /* We do not recognize the # followed by a number extension in
assembler code. */
else if (dname->type == CPP_NUMBER && CPP_OPTION (pfile, lang) != CLK_ASM)
{
@@ -1277,6 +1277,9 @@ destringize_and_run (pfile, in)
{
const unsigned char *src, *limit;
char *dest, *result;
+ cpp_context saved_context;
+ cpp_context *saved_cur_context;
+ unsigned int saved_line;
dest = result = alloca (in->len + 1);
for (src = in->text, limit = src + in->len; src < limit;)
@@ -1288,7 +1291,40 @@ destringize_and_run (pfile, in)
}
*dest = '\0';
+ /* FIXME. All this saving is a horrible kludge to handle the case
+ when we're in a macro expansion.
+
+ A better strategy it to not convert _Pragma to #pragma if doing
+ preprocessed output, but to just pass it through as-is, unless it
+ is a CPP pragma in which case is should be processed normally.
+ When compiling the preprocessed output the _Pragma should be
+ handled. This will be become necessary when we move to
+ line-at-a-time lexing since we will be macro-expanding the line
+ before outputting / compiling it. */
+ saved_line = pfile->line;
+ saved_context = pfile->base_context;
+ saved_cur_context = pfile->context;
+ pfile->context = &pfile->base_context;
run_directive (pfile, T_PRAGMA, result, dest - result);
+ pfile->context = saved_cur_context;
+ pfile->base_context = saved_context;
+ pfile->line = saved_line;
+
+ /* See above comment. For the moment, we'd like
+
+ token1 _Pragma ("foo") token2
+
+ to be output as
+
+ token1
+ # 7 "file.c"
+ #pragma foo
+ # 7 "file.c"
+ token2
+
+ Getting the line markers is a little tricky. */
+ if (pfile->cb.line_change)
+ (*pfile->cb.line_change) (pfile, pfile->cur_token, false);
}
/* Handle the _Pragma operator. */
@@ -1298,26 +1334,11 @@ _cpp_do__Pragma (pfile)
{
const cpp_token *string = get__Pragma_string (pfile);
- if (!string)
+ if (string)
+ destringize_and_run (pfile, &string->val.str);
+ else
cpp_error (pfile, DL_ERROR,
"_Pragma takes a parenthesized string literal");
- else
- {
- /* Ideally, we'd like
- token1 _Pragma ("foo") token2
- to be output as
- token1
- # 7 "file.c"
- #pragma foo
- # 7 "file.c"
- token2
- Getting these correct line markers is a little tricky. */
-
- unsigned int orig_line = pfile->line;
- destringize_and_run (pfile, &string->val.str);
- pfile->line = orig_line;
- pfile->buffer->saved_flags = BOL;
- }
}
/* Just ignore #sccs on all systems. */
@@ -1665,7 +1686,7 @@ find_answer (node, candidate)
}
/* Test an assertion within a preprocessor conditional. Returns
- non-zero on failure, zero on success. On success, the result of
+ nonzero on failure, zero on success. On success, the result of
the test is written into VALUE. */
int
_cpp_test_assertion (pfile, value)
@@ -1963,7 +1984,7 @@ _cpp_pop_buffer (pfile)
}
}
-/* Enter all recognised directives in the hash table. */
+/* Enter all recognized directives in the hash table. */
void
_cpp_init_directives (pfile)
cpp_reader *pfile;
diff --git a/gcc/cpplib.h b/gcc/cpplib.h
index 3d2cac707b5..7b3a54a3576 100644
--- a/gcc/cpplib.h
+++ b/gcc/cpplib.h
@@ -123,7 +123,7 @@ struct file_name_map_list;
OP(CPP_SCOPE, "::") \
OP(CPP_DEREF_STAR, "->*") \
OP(CPP_DOT_STAR, ".*") \
- OP(CPP_ATSIGN, "@") /* used in Objective C */ \
+ OP(CPP_ATSIGN, "@") /* used in Objective-C */ \
\
TK(CPP_NAME, SPELL_IDENT) /* word */ \
TK(CPP_NUMBER, SPELL_NUMBER) /* 34_be+ta */ \
@@ -532,7 +532,7 @@ extern int cpp_handle_option PARAMS ((cpp_reader *, int, char **));
too. If there was an error opening the file, it returns NULL.
If you want cpplib to manage its own hashtable, pass in a NULL
- pointer. Otherise you should pass in an initialised hash table
+ pointer. Otherise you should pass in an initialized hash table
that cpplib will share; this technique is used by the C front
ends. */
extern const char *cpp_read_main_file PARAMS ((cpp_reader *, const char *,
@@ -659,7 +659,7 @@ cpp_num cpp_num_sign_extend PARAMS ((cpp_num, size_t));
#define DL_ICE 0x04
/* Extracts a diagnostic level from an int. */
#define DL_EXTRACT(l) (l & 0xf)
-/* Non-zero if a diagnostic level is one of the warnings. */
+/* Nonzero if a diagnostic level is one of the warnings. */
#define DL_WARNING_P(l) (DL_EXTRACT (l) >= DL_WARNING \
&& DL_EXTRACT (l) <= DL_PEDWARN)
diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c
index ead48f6429c..fe78993bc4d 100644
--- a/gcc/cppmacro.c
+++ b/gcc/cppmacro.c
@@ -409,12 +409,18 @@ stringify_arg (pfile, arg)
}
/* Commit the memory, including NUL, and return the token. */
+ if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < 1)
+ {
+ size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff);
+ _cpp_extend_buff (pfile, &pfile->u_buff, 1);
+ dest = BUFF_FRONT (pfile->u_buff) + len_so_far;
+ }
len = dest - BUFF_FRONT (pfile->u_buff);
BUFF_FRONT (pfile->u_buff) = dest + 1;
return new_string_token (pfile, dest - len, len);
}
-/* Try to paste two tokens. On success, return non-zero. In any
+/* Try to paste two tokens. On success, return nonzero. In any
case, PLHS is updated to point to the pasted token, which is
guaranteed to not have the PASTE_LEFT flag set. */
static bool
@@ -436,8 +442,7 @@ paste_tokens (pfile, plhs, rhs)
It is simpler to insert a space here, rather than modifying the
lexer to ignore comments in some circumstances. Simply returning
false doesn't work, since we want to clear the PASTE_LEFT flag. */
- if (lhs->type == CPP_DIV
- && (rhs->type == CPP_MULT || rhs->type == CPP_DIV))
+ if (lhs->type == CPP_DIV && rhs->type != CPP_EQ)
*end++ = ' ';
end = cpp_spell_token (pfile, rhs, end);
*end = '\0';
@@ -1032,10 +1037,15 @@ expand_arg (pfile, arg)
macro_arg *arg;
{
unsigned int capacity;
+ bool saved_warn_trad;
if (arg->count == 0)
return;
+ /* Don't warn about funlike macros when pre-expanding. */
+ saved_warn_trad = CPP_WTRADITIONAL (pfile);
+ CPP_WTRADITIONAL (pfile) = 0;
+
/* Loop, reading in the arguments. */
capacity = 256;
arg->expanded = (const cpp_token **)
@@ -1062,6 +1072,8 @@ expand_arg (pfile, arg)
}
_cpp_pop_context (pfile);
+
+ CPP_WTRADITIONAL (pfile) = saved_warn_trad;
}
/* Pop the current context off the stack, re-enabling the macro if the
@@ -1233,7 +1245,7 @@ _cpp_backup_tokens (pfile, count)
/* #define directive parsing and handling. */
-/* Returns non-zero if a macro redefinition warning is required. */
+/* Returns nonzero if a macro redefinition warning is required. */
static bool
warn_of_redefinition (pfile, node, macro2)
cpp_reader *pfile;
@@ -1287,7 +1299,7 @@ _cpp_free_definition (h)
}
/* Save parameter NODE to the parameter list of macro MACRO. Returns
- zero on success, non-zero if the parameter is a duplicate. */
+ zero on success, nonzero if the parameter is a duplicate. */
bool
_cpp_save_parameter (pfile, macro, node)
cpp_reader *pfile;
@@ -1527,7 +1539,7 @@ create_iso_definition (pfile, macro)
return true;
}
-/* Parse a macro and save its expansion. Returns non-zero on success. */
+/* Parse a macro and save its expansion. Returns nonzero on success. */
bool
_cpp_create_definition (pfile, node)
cpp_reader *pfile;
diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
index 041c810f6f4..125e236ee9c 100644
--- a/gcc/crtstuff.c
+++ b/gcc/crtstuff.c
@@ -545,64 +545,80 @@ __do_global_ctors (void)
#else /* OBJECT_FORMAT_MACHO */
-/* For Mach-O format executables, we assume that the system's runtime is
- smart enough to handle constructors and destructors, but doesn't have
- an init section (if it can't even handle constructors/destructors
- you should be using INVOKE__main, not crtstuff). All we need to do
- is install/deinstall the frame information for exceptions. We do this
- by putting a constructor in crtbegin.o and a destructor in crtend.o.
-
- crtend.o also puts in the terminating zero in the frame information
- segment. */
-
-/* The crtstuff for other object formats use the symbol __EH_FRAME_BEGIN__
- to figure out the start of the exception frame, but here we use
- getsectbynamefromheader to find this value. Either method would work,
- but this method avoids creating any global symbols, which seems
- cleaner. */
-
-#include <mach-o/ldsyms.h>
-extern const struct section *
- getsectbynamefromheader (const struct mach_header *,
- const char *, const char *);
+/* Crt stuff for Mach-O (NeXT and Darwin).
+
+ The theory of this is that each dynamically-loadable module,
+ including the main program itself, must have been positioned by
+ dyld before any frame info can be registered. So we set up the
+ registration functions as dyld hooks, using a "preregistration"
+ function that is called directly from the system crt1.o. */
#ifdef CRT_BEGIN
-static void __reg_frame_ctor (void) __attribute__ ((constructor));
+/* Homemade decls substituting for getsect.h and dyld.h, so cross
+ compilation works. */
+struct mach_header;
+extern char *getsectdatafromheader (struct mach_header *, const char *,
+ const char *, unsigned long *);
+extern void _dyld_register_func_for_add_image
+ (void (*) (struct mach_header *, unsigned long));
+extern void _dyld_register_func_for_remove_image
+ (void (*) (struct mach_header *, unsigned long));
+
+extern void __darwin_gcc3_preregister_frame_info (void);
static void
-__reg_frame_ctor (void)
+unwind_dyld_add_image_hook (struct mach_header *mh,
+ unsigned long vm_slide)
{
- static struct object object;
- const struct section *eh_frame;
+ unsigned long sz;
+ char *fde;
- eh_frame = getsectbynamefromheader (&_mh_execute_header,
- "__TEXT", "__eh_frame");
- __register_frame_info ((void *) eh_frame->addr, &object);
-}
-
-#elif defined(CRT_END)
+ fde = getsectdatafromheader (mh, "__TEXT", "__eh_frame", &sz);
+ if (fde)
+ {
+ struct object *ob = (struct object *) malloc (sizeof (struct object));
-static void __dereg_frame_dtor (void) __attribute__ ((destructor));
+ __register_frame_info (fde + vm_slide, ob);
+ }
+}
static void
-__dereg_frame_dtor (void)
+unwind_dyld_remove_image_hook (struct mach_header *mh,
+ unsigned long vm_slide)
{
- const struct section *eh_frame;
+ unsigned long sz;
+ char *fde;
+
+ fde = getsectdatafromheader (mh, "__TEXT", "__eh_frame", &sz);
- eh_frame = getsectbynamefromheader (&_mh_execute_header,
- "__TEXT", "__eh_frame");
- __deregister_frame_info ((void *) eh_frame->addr);
+ if (fde)
+ __deregister_frame_info (fde + vm_slide);
}
-/* Terminate the frame section with a final zero. */
-STATIC int __FRAME_END__[]
- __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
- aligned(4)))
- = { 0 };
+/* Call this routine from the system crt1.o. The call is standard in
+ Darwin 6.x (Mac OS X 10.2) and later; for earlier systems, you
+ would need to modify crt.c in the Csu project. (This isn't great,
+ but other alternatives run afoul of linker semantics. This
+ function is declared as common and tested before being called, so
+ that programs compiled by older GCCs still link and run.) */
+
+void
+__darwin_gcc3_preregister_frame_info ()
+{
+ _dyld_register_func_for_add_image (unwind_dyld_add_image_hook);
+ _dyld_register_func_for_remove_image (unwind_dyld_remove_image_hook);
+}
+
+#elif defined(CRT_END) /* ! CRT_BEGIN */
+
+/* Install a single zero word at the end of the __eh_frame section. */
+
+asm (".section __TEXT,__eh_frame");
+asm (".long 0");
#else /* ! CRT_BEGIN && ! CRT_END */
#error "One of CRT_BEGIN or CRT_END must be defined."
#endif
-#endif /* OBJECT_FORMAT_MACHO */
+#endif /* OBJECT_FORMAT_MACHO */
diff --git a/gcc/cse.c b/gcc/cse.c
index afdc8daa8b0..7aa9e66c515 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -266,11 +266,11 @@ static struct qty_table_elem *qty_table;
static rtx prev_insn_cc0;
static enum machine_mode prev_insn_cc0_mode;
-#endif
/* Previous actual insn. 0 if at first insn of basic block. */
static rtx prev_insn;
+#endif
/* Insn being scanned. */
@@ -316,6 +316,10 @@ struct cse_reg_info
reg_tick value, such expressions existing in the hash table are
invalid. */
int reg_in_table;
+
+ /* The SUBREG that was set when REG_TICK was last incremented. Set
+ to -1 if the last store was to the whole register, not a subreg. */
+ unsigned int subreg_ticked;
};
/* A free list of cse_reg_info entries. */
@@ -514,6 +518,11 @@ struct table_elt
#define REG_IN_TABLE(N) ((GET_CSE_REG_INFO (N))->reg_in_table)
+/* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
+ SUBREG). */
+
+#define SUBREG_TICKED(N) ((GET_CSE_REG_INFO (N))->subreg_ticked)
+
/* Get the quantity number for REG. */
#define REG_QTY(N) ((GET_CSE_REG_INFO (N))->reg_qty)
@@ -582,55 +591,7 @@ struct cse_basic_block_data
} path[PATHLENGTH];
};
-/* Nonzero if X has the form (PLUS frame-pointer integer). We check for
- virtual regs here because the simplify_*_operation routines are called
- by integrate.c, which is called before virtual register instantiation.
-
- ?!? FIXED_BASE_PLUS_P and NONZERO_BASE_PLUS_P need to move into
- a header file so that their definitions can be shared with the
- simplification routines in simplify-rtx.c. Until then, do not
- change these macros without also changing the copy in simplify-rtx.c. */
-
-#define FIXED_BASE_PLUS_P(X) \
- ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
- || ((X) == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])\
- || (X) == virtual_stack_vars_rtx \
- || (X) == virtual_incoming_args_rtx \
- || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
- && (XEXP (X, 0) == frame_pointer_rtx \
- || XEXP (X, 0) == hard_frame_pointer_rtx \
- || ((X) == arg_pointer_rtx \
- && fixed_regs[ARG_POINTER_REGNUM]) \
- || XEXP (X, 0) == virtual_stack_vars_rtx \
- || XEXP (X, 0) == virtual_incoming_args_rtx)) \
- || GET_CODE (X) == ADDRESSOF)
-
-/* Similar, but also allows reference to the stack pointer.
-
- This used to include FIXED_BASE_PLUS_P, however, we can't assume that
- arg_pointer_rtx by itself is nonzero, because on at least one machine,
- the i960, the arg pointer is zero when it is unused. */
-
-#define NONZERO_BASE_PLUS_P(X) \
- ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
- || (X) == virtual_stack_vars_rtx \
- || (X) == virtual_incoming_args_rtx \
- || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
- && (XEXP (X, 0) == frame_pointer_rtx \
- || XEXP (X, 0) == hard_frame_pointer_rtx \
- || ((X) == arg_pointer_rtx \
- && fixed_regs[ARG_POINTER_REGNUM]) \
- || XEXP (X, 0) == virtual_stack_vars_rtx \
- || XEXP (X, 0) == virtual_incoming_args_rtx)) \
- || (X) == stack_pointer_rtx \
- || (X) == virtual_stack_dynamic_rtx \
- || (X) == virtual_outgoing_args_rtx \
- || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
- && (XEXP (X, 0) == stack_pointer_rtx \
- || XEXP (X, 0) == virtual_stack_dynamic_rtx \
- || XEXP (X, 0) == virtual_outgoing_args_rtx)) \
- || GET_CODE (X) == ADDRESSOF)
-
+static bool fixed_base_plus_p PARAMS ((rtx x));
static int notreg_cost PARAMS ((rtx, enum rtx_code));
static int approx_reg_cost_1 PARAMS ((rtx *, void *));
static int approx_reg_cost PARAMS ((rtx));
@@ -693,6 +654,39 @@ static bool insn_live_p PARAMS ((rtx, int *));
static bool set_live_p PARAMS ((rtx, rtx, int *));
static bool dead_libcall_p PARAMS ((rtx, int *));
+/* Nonzero if X has the form (PLUS frame-pointer integer). We check for
+ virtual regs here because the simplify_*_operation routines are called
+ by integrate.c, which is called before virtual register instantiation. */
+
+static bool
+fixed_base_plus_p (x)
+ rtx x;
+{
+ switch (GET_CODE (x))
+ {
+ case REG:
+ if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
+ return true;
+ if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
+ return true;
+ if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
+ && REGNO (x) <= LAST_VIRTUAL_REGISTER)
+ return true;
+ return false;
+
+ case PLUS:
+ if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ return false;
+ return fixed_base_plus_p (XEXP (x, 0));
+
+ case ADDRESSOF:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
/* Dump the expressions in the equivalence class indicated by CLASSP.
This function is used only for debugging. */
void
@@ -957,6 +951,7 @@ get_cse_reg_info (regno)
/* Initialize it. */
p->reg_tick = 1;
p->reg_in_table = -1;
+ p->subreg_ticked = -1;
p->reg_qty = regno;
p->regno = regno;
p->next = cse_reg_info_used_list;
@@ -1022,9 +1017,8 @@ new_basic_block ()
}
}
- prev_insn = 0;
-
#ifdef HAVE_cc0
+ prev_insn = 0;
prev_insn_cc0 = 0;
#endif
}
@@ -1191,6 +1185,7 @@ mention_regs (x)
remove_invalid_refs (i);
REG_IN_TABLE (i) = REG_TICK (i);
+ SUBREG_TICKED (i) = -1;
}
return 0;
@@ -1206,17 +1201,20 @@ mention_regs (x)
if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
{
- /* If reg_tick has been incremented more than once since
- reg_in_table was last set, that means that the entire
- register has been set before, so discard anything memorized
- for the entire register, including all SUBREG expressions. */
- if (REG_IN_TABLE (i) != REG_TICK (i) - 1)
+ /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
+ the last store to this register really stored into this
+ subreg, then remove the memory of this subreg.
+ Otherwise, remove any memory of the entire register and
+ all its subregs from the table. */
+ if (REG_TICK (i) - REG_IN_TABLE (i) > 1
+ || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
remove_invalid_refs (i);
else
remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
}
REG_IN_TABLE (i) = REG_TICK (i);
+ SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
return 0;
}
@@ -1597,7 +1595,7 @@ insert (x, classp, hash, mode)
|| (GET_CODE (x) == REG
&& RTX_UNCHANGING_P (x)
&& REGNO (x) >= FIRST_PSEUDO_REGISTER)
- || FIXED_BASE_PLUS_P (x));
+ || fixed_base_plus_p (x));
if (table[hash])
table[hash]->prev_same_hash = elt;
@@ -1861,6 +1859,7 @@ invalidate (x, full_mode)
delete_reg_equiv (regno);
REG_TICK (regno)++;
+ SUBREG_TICKED (regno) = -1;
if (regno >= FIRST_PSEUDO_REGISTER)
{
@@ -1888,6 +1887,7 @@ invalidate (x, full_mode)
CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
delete_reg_equiv (rn);
REG_TICK (rn)++;
+ SUBREG_TICKED (rn) = -1;
}
if (in_table)
@@ -2093,7 +2093,10 @@ invalidate_for_call ()
{
delete_reg_equiv (regno);
if (REG_TICK (regno) >= 0)
- REG_TICK (regno)++;
+ {
+ REG_TICK (regno)++;
+ SUBREG_TICKED (regno) = -1;
+ }
in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
}
@@ -2320,11 +2323,7 @@ canon_hash (x, mode)
the integers representing the constant. */
hash += (unsigned) code + (unsigned) GET_MODE (x);
if (GET_MODE (x) != VOIDmode)
- for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++)
- {
- unsigned HOST_WIDE_INT tem = XWINT (x, i);
- hash += tem;
- }
+ hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
else
hash += ((unsigned) CONST_DOUBLE_LOW (x)
+ (unsigned) CONST_DOUBLE_HIGH (x));
@@ -2363,10 +2362,9 @@ canon_hash (x, mode)
do_not_record = 1;
return 0;
}
- if (! RTX_UNCHANGING_P (x) || FIXED_BASE_PLUS_P (XEXP (x, 0)))
- {
- hash_arg_in_memory = 1;
- }
+ if (! RTX_UNCHANGING_P (x) || fixed_base_plus_p (XEXP (x, 0)))
+ hash_arg_in_memory = 1;
+
/* Now that we have already found this special case,
might as well speed it up as much as possible. */
hash += (unsigned) MEM;
@@ -2384,7 +2382,7 @@ canon_hash (x, mode)
hash += (unsigned) USE;
x = XEXP (x, 0);
- if (! RTX_UNCHANGING_P (x) || FIXED_BASE_PLUS_P (XEXP (x, 0)))
+ if (! RTX_UNCHANGING_P (x) || fixed_base_plus_p (XEXP (x, 0)))
hash_arg_in_memory = 1;
/* Now that we have already found this special case,
@@ -2772,9 +2770,9 @@ cse_rtx_varies_p (x, from_alias)
replace each register reference inside it
with the "oldest" equivalent register.
- If INSN is non-zero and we are replacing a pseudo with a hard register
+ If INSN is nonzero and we are replacing a pseudo with a hard register
or vice versa, validate_change is used to ensure that INSN remains valid
- after we make our substitution. The calls are made with IN_GROUP non-zero
+ after we make our substitution. The calls are made with IN_GROUP nonzero
so apply_change_group must be called upon the outermost return from this
function (unless INSN is zero). The result of apply_change_group can
generally be discarded since the changes we are making are optional. */
@@ -3129,7 +3127,7 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
while (arg2 == CONST0_RTX (GET_MODE (arg1)))
{
- /* Set non-zero when we find something of interest. */
+ /* Set nonzero when we find something of interest. */
rtx x = 0;
int reverse_code = 0;
struct table_elt *p = 0;
@@ -3147,13 +3145,17 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
else if (GET_RTX_CLASS (GET_CODE (arg1)) == '<')
{
+#ifdef FLOAT_STORE_FLAG_VALUE
+ REAL_VALUE_TYPE fsfv;
+#endif
+
if (code == NE
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
&& code == LT && STORE_FLAG_VALUE == -1)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
- && (REAL_VALUE_NEGATIVE
- (FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)))))
+ && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
+ REAL_VALUE_NEGATIVE (fsfv)))
#endif
)
x = arg1;
@@ -3162,8 +3164,8 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
&& code == GE && STORE_FLAG_VALUE == -1)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
- && (REAL_VALUE_NEGATIVE
- (FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)))))
+ && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
+ REAL_VALUE_NEGATIVE (fsfv)))
#endif
)
x = arg1, reverse_code = 1;
@@ -3199,6 +3201,9 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
for (; p; p = p->next_same_value)
{
enum machine_mode inner_mode = GET_MODE (p->exp);
+#ifdef FLOAT_STORE_FLAG_VALUE
+ REAL_VALUE_TYPE fsfv;
+#endif
/* If the entry isn't valid, skip it. */
if (! exp_equiv_p (p->exp, p->exp, 1, 0))
@@ -3223,8 +3228,8 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == LT
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
- && (REAL_VALUE_NEGATIVE
- (FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)))))
+ && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
+ REAL_VALUE_NEGATIVE (fsfv)))
#endif
)
&& GET_RTX_CLASS (GET_CODE (p->exp)) == '<'))
@@ -3243,8 +3248,8 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == GE
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
- && (REAL_VALUE_NEGATIVE
- (FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)))))
+ && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
+ REAL_VALUE_NEGATIVE (fsfv)))
#endif
)
&& GET_RTX_CLASS (GET_CODE (p->exp)) == '<')
@@ -3254,9 +3259,10 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
break;
}
- /* If this is fp + constant, the equivalent is a better operand since
- it may let us predict the value of the comparison. */
- else if (NONZERO_BASE_PLUS_P (p->exp))
+ /* If this non-trapping address, e.g. fp + constant, the
+ equivalent is a better operand since it may let us predict
+ the value of the comparison. */
+ else if (!rtx_addr_can_trap_p (p->exp))
{
arg1 = p->exp;
continue;
@@ -3729,6 +3735,7 @@ fold_rtx (x, insn)
rtx cheap_arg, expensive_arg;
rtx replacements[2];
int j;
+ int old_cost = COST_IN (XEXP (x, i), code);
/* Most arguments are cheap, so handle them specially. */
switch (GET_CODE (arg))
@@ -3819,7 +3826,6 @@ fold_rtx (x, insn)
for (j = 0; j < 2 && replacements[j]; j++)
{
- int old_cost = COST_IN (XEXP (x, i), code);
int new_cost = COST_IN (replacements[j], code);
/* Stop if what existed before was cheaper. Prefer constants
@@ -3957,17 +3963,10 @@ fold_rtx (x, insn)
comparison. */
if (const_arg0 == 0 || const_arg1 == 0)
{
- /* Is FOLDED_ARG0 frame-pointer plus a constant? Or
- non-explicit constant? These aren't zero, but we
- don't know their sign. */
+ /* Some addresses are known to be nonzero. We don't know
+ their sign, but equality comparisons are known. */
if (const_arg1 == const0_rtx
- && (NONZERO_BASE_PLUS_P (folded_arg0)
-#if 0 /* Sad to say, on sysvr4, #pragma weak can make a symbol address
- come out as 0. */
- || GET_CODE (folded_arg0) == SYMBOL_REF
-#endif
- || GET_CODE (folded_arg0) == LABEL_REF
- || GET_CODE (folded_arg0) == CONST))
+ && nonzero_address_p (folded_arg0))
{
if (code == EQ)
return false_rtx;
@@ -4209,7 +4208,7 @@ fold_rtx (x, insn)
from_plus:
case SMIN: case SMAX: case UMIN: case UMAX:
case IOR: case AND: case XOR:
- case MULT: case DIV: case UDIV:
+ case MULT:
case ASHIFT: case LSHIFTRT: case ASHIFTRT:
/* If we have (<op> <reg> <const_int>) for an associative OP and REG
is known to be of similar form, we may be able to replace the
@@ -4257,11 +4256,9 @@ fold_rtx (x, insn)
break;
/* Compute the code used to compose the constants. For example,
- A/C1/C2 is A/(C1 * C2), so if CODE == DIV, we want MULT. */
+ A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
- associate_code
- = (code == MULT || code == DIV || code == UDIV ? MULT
- : is_shift || code == PLUS || code == MINUS ? PLUS : code);
+ associate_code = (is_shift || code == MINUS ? PLUS : code);
new_const = simplify_binary_operation (associate_code, mode,
const_arg1, inner_const);
@@ -4299,6 +4296,14 @@ fold_rtx (x, insn)
}
break;
+ case DIV: case UDIV:
+ /* ??? The associative optimization performed immediately above is
+ also possible for DIV and UDIV using associate_code of MULT.
+ However, we would need extra code to verify that the
+ multiplication does not overflow, that is, there is no overflow
+ in the calculation of new_const. */
+ break;
+
default:
break;
}
@@ -5001,7 +5006,7 @@ cse_insn (insn, libcall_insn)
int src_folded_regcost = MAX_COST;
int src_related_regcost = MAX_COST;
int src_elt_regcost = MAX_COST;
- /* Set non-zero if we need to call force_const_mem on with the
+ /* Set nonzero if we need to call force_const_mem on with the
contents of src_folded before using it. */
int src_folded_force_flag = 0;
@@ -5341,9 +5346,9 @@ cse_insn (insn, libcall_insn)
if (src == src_folded)
src_folded = 0;
- /* At this point, ELT, if non-zero, points to a class of expressions
+ /* At this point, ELT, if nonzero, points to a class of expressions
equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
- and SRC_RELATED, if non-zero, each contain additional equivalent
+ and SRC_RELATED, if nonzero, each contain additional equivalent
expressions. Prune these latter expressions by deleting expressions
already in the equivalence class.
@@ -6161,7 +6166,7 @@ cse_insn (insn, libcall_insn)
elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
&& (! RTX_UNCHANGING_P (sets[i].inner_dest)
- || FIXED_BASE_PLUS_P (XEXP (sets[i].inner_dest,
+ || fixed_base_plus_p (XEXP (sets[i].inner_dest,
0))));
/* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
@@ -6203,14 +6208,23 @@ cse_insn (insn, libcall_insn)
&& ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
continue;
- /* Calculate big endian correction for the SUBREG_BYTE
- (or equivalent). We have already checked that M1
- ( GET_MODE (dest) ) is not narrower than M2 (new_mode). */
- if (BYTES_BIG_ENDIAN)
- byte = (GET_MODE_SIZE (GET_MODE (dest))
- - GET_MODE_SIZE (new_mode));
- new_src = simplify_gen_subreg (new_mode, elt->exp,
- GET_MODE (dest), byte);
+ /* We may have already been playing subreg games. If the
+ mode is already correct for the destination, use it. */
+ if (GET_MODE (elt->exp) == new_mode)
+ new_src = elt->exp;
+ else
+ {
+ /* Calculate big endian correction for the SUBREG_BYTE.
+ We have already checked that M1 (GET_MODE (dest))
+ is not narrower than M2 (new_mode). */
+ if (BYTES_BIG_ENDIAN)
+ byte = (GET_MODE_SIZE (GET_MODE (dest))
+ - GET_MODE_SIZE (new_mode));
+
+ new_src = simplify_gen_subreg (new_mode, elt->exp,
+ GET_MODE (dest), byte);
+ }
+
/* The call to simplify_gen_subreg fails if the value
is VOIDmode, yet we can't do any simplification, e.g.
for EXPR_LISTs denoting function call results.
@@ -6291,7 +6305,7 @@ cse_insn (insn, libcall_insn)
This section previously turned the REG_EQUIV into a REG_EQUAL
note. We cannot do that because REG_EQUIV may provide an
- uninitialised stack slot when REG_PARM_STACK_SPACE is used. */
+ uninitialized stack slot when REG_PARM_STACK_SPACE is used. */
if (prev != 0 && GET_CODE (prev) == INSN
&& GET_CODE (PATTERN (prev)) == SET
@@ -6355,9 +6369,8 @@ cse_insn (insn, libcall_insn)
prev_insn_cc0 = this_insn_cc0;
prev_insn_cc0_mode = this_insn_cc0_mode;
-#endif
-
prev_insn = insn;
+#endif
}
/* Remove from the hash table all expressions that reference memory. */
@@ -6389,7 +6402,11 @@ addr_affects_sp_p (addr)
&& REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
{
if (REG_TICK (STACK_POINTER_REGNUM) >= 0)
- REG_TICK (STACK_POINTER_REGNUM)++;
+ {
+ REG_TICK (STACK_POINTER_REGNUM)++;
+ /* Is it possible to use a subreg of SP? */
+ SUBREG_TICKED (STACK_POINTER_REGNUM) = -1;
+ }
/* This should be *very* rare. */
if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
@@ -6819,10 +6836,10 @@ cse_set_around_loop (x, insn, loop_start)
the total number of SETs in all the insns of the block, the last insn of the
block, and the branch path.
- The branch path indicates which branches should be followed. If a non-zero
+ The branch path indicates which branches should be followed. If a nonzero
path size is specified, the block should be rescanned and a different set
of branches will be taken. The branch path is only used if
- FLAG_CSE_FOLLOW_JUMPS or FLAG_CSE_SKIP_BLOCKS is non-zero.
+ FLAG_CSE_FOLLOW_JUMPS or FLAG_CSE_SKIP_BLOCKS is nonzero.
DATA is a pointer to a struct cse_basic_block_data, defined below, that is
used to describe the block. It is filled in with the information about
@@ -6848,7 +6865,7 @@ cse_end_of_basic_block (insn, data, follow_jumps, after_loop, skip_blocks)
/* Update the previous branch path, if any. If the last branch was
previously TAKEN, mark it NOT_TAKEN. If it was previously NOT_TAKEN,
shorten the path by one and look at the previous branch. We know that
- at least one branch must have been taken if PATH_SIZE is non-zero. */
+ at least one branch must have been taken if PATH_SIZE is nonzero. */
while (path_size > 0)
{
if (data->path[path_size - 1].status != NOT_TAKEN)
@@ -7193,7 +7210,7 @@ cse_main (f, nregs, after_loop, file)
block. NEXT_BRANCH points to the branch path when following jumps or
a null path when not following jumps.
- AROUND_LOOP is non-zero if we are to try to cse around to the start of a
+ AROUND_LOOP is nonzero if we are to try to cse around to the start of a
loop. This is true when we are being called for the last time on a
block and this CSE pass is before loop.c. */
@@ -7257,8 +7274,8 @@ cse_basic_block (from, to, next_branch, around_loop)
Then follow this branch. */
#ifdef HAVE_cc0
prev_insn_cc0 = 0;
-#endif
prev_insn = insn;
+#endif
insn = JUMP_LABEL (insn);
continue;
}
@@ -7570,7 +7587,9 @@ insn_live_p (insn, counts)
int *counts;
{
int i;
- if (GET_CODE (PATTERN (insn)) == SET)
+ if (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))
+ return true;
+ else if (GET_CODE (PATTERN (insn)) == SET)
return set_live_p (PATTERN (insn), insn, counts);
else if (GET_CODE (PATTERN (insn)) == PARALLEL)
{
diff --git a/gcc/cselib.c b/gcc/cselib.c
index d9b6ee14e56..feffa6de6cf 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -39,7 +39,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "cselib.h"
static int entry_and_rtx_equal_p PARAMS ((const void *, const void *));
-static unsigned int get_value_hash PARAMS ((const void *));
+static hashval_t get_value_hash PARAMS ((const void *));
static struct elt_list *new_elt_list PARAMS ((struct elt_list *,
cselib_val *));
static struct elt_loc_list *new_elt_loc_list PARAMS ((struct elt_loc_list *,
@@ -105,7 +105,7 @@ static GTY((deletable (""))) varray_type reg_values_old;
#define REG_VALUES(I) VARRAY_ELT_LIST (reg_values, (I))
/* The largest number of hard regs used by any entry added to the
- REG_VALUES table. Cleared on each clear_table() invocation. */
+ REG_VALUES table. Cleared on each clear_table() invocation. */
static unsigned int max_value_regs;
/* Here the set of indices I with REG_VALUES(I) != 0 is saved. This is used
@@ -274,7 +274,7 @@ entry_and_rtx_equal_p (entry, x_arg)
hash_rtx when adding an element; this function just extracts the hash
value from a cselib_val structure. */
-static unsigned int
+static hashval_t
get_value_hash (entry)
const void *entry;
{
@@ -581,8 +581,7 @@ hash_rtx (x, mode, create)
the integers representing the constant. */
hash += (unsigned) code + (unsigned) GET_MODE (x);
if (GET_MODE (x) != VOIDmode)
- for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++)
- hash += XWINT (x, i);
+ hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
else
hash += ((unsigned) CONST_DOUBLE_LOW (x)
+ (unsigned) CONST_DOUBLE_HIGH (x));
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index 4e467739d24..26e68939634 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -155,7 +155,7 @@ static int source_label_number = 1;
#endif
#ifdef DEBUG_SYMS_TEXT
-#define FORCE_TEXT text_section ();
+#define FORCE_TEXT function_section (current_function_decl);
#else
#define FORCE_TEXT
#endif
@@ -392,16 +392,20 @@ dbxout_function_end ()
the system doesn't insert underscores in front of user generated
labels. */
ASM_GENERATE_INTERNAL_LABEL (lscope_label_name, "Lscope", scope_labelno);
- ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Lscope", scope_labelno);
+ (*targetm.asm_out.internal_label) (asmfile, "Lscope", scope_labelno);
scope_labelno++;
/* By convention, GCC will mark the end of a function with an N_FUN
symbol and an empty string. */
+#ifdef DBX_OUTPUT_NFUN
+ DBX_OUTPUT_NFUN (asmfile, lscope_label_name, current_function_decl);
+#else
fprintf (asmfile, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN);
assemble_name (asmfile, lscope_label_name);
putc ('-', asmfile);
assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
fprintf (asmfile, "\n");
+#endif
}
#endif /* DBX_DEBUGGING_INFO */
@@ -461,7 +465,7 @@ dbxout_init (input_file_name)
assemble_name (asmfile, ltext_label_name);
fputc ('\n', asmfile);
text_section ();
- ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Ltext", 0);
+ (*targetm.asm_out.internal_label) (asmfile, "Ltext", 0);
#endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
#ifdef DBX_OUTPUT_GCC_MARKER
@@ -589,7 +593,7 @@ dbxout_source_file (file, filename)
; /* Don't change section amid function. */
else
text_section ();
- ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", source_label_number);
+ (*targetm.asm_out.internal_label) (file, "Ltext", source_label_number);
source_label_number++;
#endif
lastfile = filename;
@@ -620,7 +624,7 @@ dbxout_begin_block (line, n)
unsigned int line ATTRIBUTE_UNUSED;
unsigned int n;
{
- ASM_OUTPUT_INTERNAL_LABEL (asmfile, "LBB", n);
+ (*targetm.asm_out.internal_label) (asmfile, "LBB", n);
}
/* Describe the end line-number of an internal block within a function. */
@@ -630,7 +634,7 @@ dbxout_end_block (line, n)
unsigned int line ATTRIBUTE_UNUSED;
unsigned int n;
{
- ASM_OUTPUT_INTERNAL_LABEL (asmfile, "LBE", n);
+ (*targetm.asm_out.internal_label) (asmfile, "LBE", n);
}
/* Output dbx data for a function definition.
@@ -2456,7 +2460,7 @@ dbxout_finish_symbol (sym)
#endif
}
-/* Output definitions of all the decls in a chain. Return non-zero if
+/* Output definitions of all the decls in a chain. Return nonzero if
anything was output */
int
@@ -2677,6 +2681,7 @@ dbxout_parms (parms)
current_sym_value
= INTVAL (XEXP (XEXP (XEXP (DECL_RTL (parms), 0), 0), 1));
current_sym_addr = 0;
+ current_sym_code = N_PSYM;
FORCE_TEXT;
fprintf (asmfile, "%s\"%s:v", ASM_STABS_OP, decl_name);
diff --git a/gcc/debug.h b/gcc/debug.h
index 8b65567b5ab..11c996fddd0 100644
--- a/gcc/debug.h
+++ b/gcc/debug.h
@@ -23,7 +23,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
toplev.c according to command line options. */
struct gcc_debug_hooks
{
- /* Initialise debug output. MAIN_FILENAME is the name of the main
+ /* Initialize debug output. MAIN_FILENAME is the name of the main
input file. */
void (* init) PARAMS ((const char *main_filename));
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 157aa015cf2..e663ca719d1 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -54,21 +54,27 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
# define CPP_PREDEFINES ""
#endif
-/* Store in OUTPUT a string (made with alloca) containing
- an assembler-name for a local static variable or function named NAME.
+/* Store in OUTPUT a string (made with alloca) containing an
+ assembler-name for a local static variable or function named NAME.
LABELNO is an integer which is different for each call. */
+#ifndef ASM_PN_FORMAT
+# ifndef NO_DOT_IN_LABEL
+# define ASM_PN_FORMAT "%s.%lu"
+# else
+# ifndef NO_DOLLAR_IN_LABEL
+# define ASM_PN_FORMAT "%s$%lu"
+# else
+# define ASM_PN_FORMAT "__%s_%lu"
+# endif
+# endif
+#endif /* ! ASM_PN_FORMAT */
+
#ifndef ASM_FORMAT_PRIVATE_NAME
-#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
- do { \
- int len = strlen (NAME); \
- char *temp = (char *) alloca (len + 3); \
- temp[0] = 'L'; \
- strcpy (&temp[1], (NAME)); \
- temp[len + 1] = '.'; \
- temp[len + 2] = 0; \
- (OUTPUT) = (char *) alloca (strlen (NAME) + 11); \
- ASM_GENERATE_INTERNAL_LABEL (OUTPUT, temp, LABELNO); \
+# define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
+ do { const char *const name_ = (NAME); \
+ char *const output_ = (OUTPUT) = (char *) alloca (strlen (name_) + 32);\
+ sprintf (output_, ASM_PN_FORMAT, name_, (unsigned long)(LABELNO)); \
} while (0)
#endif
@@ -82,7 +88,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef ASM_OUTPUT_ADDR_VEC_ELT
#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
do { fputs (integer_asm_op (POINTER_SIZE / UNITS_PER_WORD, TRUE), FILE); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", (VALUE)); \
+ (*targetm.asm_out.internal_label) (FILE, "L", (VALUE)); \
fputc ('\n', FILE); \
} while (0)
#endif
@@ -160,7 +166,7 @@ do { fputs (integer_asm_op (POINTER_SIZE / UNITS_PER_WORD, TRUE), FILE); \
#ifndef ASM_OUTPUT_DEBUG_LABEL
#define ASM_OUTPUT_DEBUG_LABEL(FILE, PREFIX, NUM) \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM)
+ (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM)
#endif
/* This is how we tell the assembler that a symbol is weak. */
@@ -240,6 +246,11 @@ do { fputs (integer_asm_op (POINTER_SIZE / UNITS_PER_WORD, TRUE), FILE); \
#endif
#endif
+/* By default, there is no prefix on user-defined symbols. */
+#ifndef USER_LABEL_PREFIX
+#define USER_LABEL_PREFIX ""
+#endif
+
/* If the target supports weak symbols, define TARGET_ATTRIBUTE_WEAK to
provide a weak attribute. Else define it to nothing.
@@ -425,7 +436,7 @@ do { fputs (integer_asm_op (POINTER_SIZE / UNITS_PER_WORD, TRUE), FILE); \
#endif
/* By default, the C++ compiler will use function addresses in the
- vtable entries. Setting this non-zero tells the compiler to use
+ vtable entries. Setting this nonzero 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
that the address of a function descriptor may be treated as a
@@ -437,7 +448,7 @@ do { fputs (integer_asm_op (POINTER_SIZE / UNITS_PER_WORD, TRUE), FILE); \
/* By default, the vtable entries are void pointers, the so the alignment
is the same as pointer alignment. The value of this macro specifies
the alignment of the vtable entry in bits. It should be defined only
- when special alignment is necessary. */
+ when special alignment is necessary. */
#ifndef TARGET_VTABLE_ENTRY_ALIGN
#define TARGET_VTABLE_ENTRY_ALIGN POINTER_SIZE
#endif
@@ -518,6 +529,18 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE!
#define FUNCTION_ARG_REG_LITTLE_ENDIAN 0
#endif
+/* Define codes for all the float formats that we know of. */
+#define UNKNOWN_FLOAT_FORMAT 0
+#define IEEE_FLOAT_FORMAT 1
+#define VAX_FLOAT_FORMAT 2
+#define IBM_FLOAT_FORMAT 3
+#define C4X_FLOAT_FORMAT 4
+
+/* Default to IEEE float if not specified. Nearly all machines use it. */
+#ifndef TARGET_FLOAT_FORMAT
+#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
+#endif
+
/* Determine the register class for registers suitable to be the base
address register in a MEM. Allow the choice to be dependent upon
the mode of the memory access. */
@@ -559,6 +582,17 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE!
&& !ROUND_TOWARDS_ZERO)
#endif
+/* If FLOAT_WORDS_BIG_ENDIAN and HOST_FLOAT_WORDS_BIG_ENDIAN are not defined
+ in the header files, then this implies the word-endianness is the same as
+ for integers. */
+#ifndef FLOAT_WORDS_BIG_ENDIAN
+#define FLOAT_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
+#endif
+
+#ifndef TARGET_FLT_EVAL_METHOD
+#define TARGET_FLT_EVAL_METHOD 0
+#endif
+
#ifndef HOT_TEXT_SECTION_NAME
#define HOT_TEXT_SECTION_NAME "text.hot"
#endif
@@ -572,7 +606,7 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE!
#endif
/* Determine whether __cxa_atexit, rather than atexit, is used to
- register C++ destructors for local statics and global objects. */
+ register C++ destructors for local statics and global objects. */
#ifndef DEFAULT_USE_CXA_ATEXIT
#define DEFAULT_USE_CXA_ATEXIT 0
#endif
diff --git a/gcc/dependence.c b/gcc/dependence.c
deleted file mode 100644
index ec46d988bf1..00000000000
--- a/gcc/dependence.c
+++ /dev/null
@@ -1,1463 +0,0 @@
-/* Analyze loop dependencies
- Copyright (C) 2000, 2002 Free Software Foundation, Inc.
-
-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. */
-
-/* References:
- Practical Dependence Testing, Goff, Kennedy, Tseng, PLDI, 1991
- High Performance Compilers for Parallel Computing, Wolfe
-*/
-
-#include "config.h"
-#include "system.h"
-
-#include "rtl.h"
-#include "expr.h"
-#include "tree.h"
-#include "c-common.h"
-#include "flags.h"
-#include "ggc.h"
-#include "varray.h"
-
-#define MAX_SUBSCRIPTS 13
-
-/*
- We perform the following steps:
-
- Build the data structures def_use_chain, loop_chain, and induction_chain.
-
- Determine if a loop index is a normalized induction variable.
- A loop is currently considered to be a for loop having an index set to an
- initial value, conditional check of the index, and increment/decrement of
- the index.
-
- Determine the distance and direction vectors. Both are two dimensioned
- arrays where the first dimension represents a loop and the second
- dimension represents a subscript. Dependencies are actually per loop, not
- per subscript. So for:
- for (i = 0; i < 10; i++)
- for (j = 0; j < 10; j++)
- array [i][j] = array[i][j-1]
- We find the dependencies: loop1/sub_i, loop1/sub_j, loop2/sub_i, loop2/sub_j
- and then intersect loop1/sub_i V loop2/sub_i and loop1/sub_i V loop2/sub_j
- We determine the type of dependence, which determines which test we use.
- We then try to refine the type of dependence we have and add the
- dependence to the dep_chain
-*/
-
-enum dependence_type {dt_flow, dt_anti, dt_output, dt_none};
-#if 0
-static const char *const dependence_string [] = {"flow", "anti", "output", "none"};
-#endif
-enum direction_type {lt, le, eq, gt, ge, star, independent, undef};
-#if 0
-static const char *const direction_string [] = {"<", "<=", "=", ">", ">=", "*",
- "INDEPENDENT", "UNDEFINED"};
-#endif
-enum def_use_type {def, use, init_def_use};
-
-enum du_status_type {seen, unseen};
-
-enum loop_status_type {normal, unnormal};
-
-enum complexity_type {ziv, strong_siv, weak_siv, weak_zero_siv,
- weak_crossing_siv, miv};
-
-/* Given a def/use one can chase the next chain to follow the def/use
- for that variable. Alternately one can sequentially follow each
- element of def_use_chain. */
-
-typedef struct def_use GTY(())
-{
- /* outermost loop */
- tree outer_loop;
- /* loop containing this def/use */
- tree containing_loop;
- /* this expression */
- tree expression;
- /* our name */
- const char *variable;
- /* def or use */
- enum def_use_type type;
- /* status flags */
- enum du_status_type status;
- /* next def/use for this same name */
- struct def_use *next;
- /* dependencies for this def */
- struct dependence *dep;
-} def_use;
-
-/* Given a loop* one can chase the next_nest chain to follow the nested
- loops for that loop. Alternately one can sequentially follow each
- element of loop_chain and check outer_loop to get all loops
- contained within a certain loop. */
-
-typedef struct loop GTY(())
-{
- /* outermost loop containing this loop */
- tree outer_loop;
- /* this loop */
- tree containing_loop;
- /* nest level for this loop */
- int depth;
- /* can loop be normalized? */
- enum loop_status_type status;
- /* loop* for loop contained in this loop */
- struct loop *next_nest;
- /* induction variables for this loop. Currently only the index variable. */
- struct induction *ind;
-} loop;
-
-/* Pointed to by loop. One per induction variable. */
-
-typedef struct induction GTY(())
-{
- /* our name */
- const char *variable;
- /* increment. Currently only +1 or -1 */
- int increment;
- /* lower bound */
- int low_bound;
- /* upper bound */
- int high_bound;
- /* next induction variable for this loop. Currently null. */
- struct induction *next;
-} induction;
-
-/* Pointed to by def/use. One per dependence. */
-
-typedef struct dependence GTY(())
-{
- tree source;
- tree destination;
- enum dependence_type dependence;
- enum direction_type direction[MAX_SUBSCRIPTS];
- int distance[MAX_SUBSCRIPTS];
- struct dependence *next;
-} dependence;
-
-/* subscripts are represented by an array of these. Each reflects one
- X * i + Y term, where X and Y are constants. */
-
-typedef struct subscript
-{
- /* ordinal subscript number */
- int position;
- /* X in X * i + Y */
- int coefficient;
- /* Y in X * i + Y */
- int offset;
- /* our name */
- const char *variable;
- /* next subscript term. Currently null. */
- struct subscript *next;
-} subscript;
-
-/* Remember the destination the front end encountered. */
-
-static tree dest_to_remember;
-
-/* Chain for def_use */
-static GTY ((param_is (def_use))) varray_type def_use_chain;
-
-/* Chain for dependence */
-static GTY ((param_is (dependence))) varray_type dep_chain;
-
-/* Chain for loop */
-static GTY ((param_is (loop))) varray_type loop_chain;
-
-/* Chain for induction */
-static GTY ((param_is (induction))) varray_type induction_chain;
-
-void init_dependence_analysis PARAMS ((tree));
-static void build_def_use PARAMS ((tree, enum def_use_type));
-static loop* add_loop PARAMS ((tree, tree, int));
-static int find_induction_variable PARAMS ((tree, tree, tree, loop*));
-static int get_low_bound PARAMS ((tree, const char*));
-static int have_induction_variable PARAMS ((tree, const char*));
-static void link_loops PARAMS ((void));
-static void get_node_dependence PARAMS ((void));
-static void check_node_dependence PARAMS ((def_use*));
-static int get_coefficients PARAMS ((def_use*, subscript[]));
-static int get_one_coefficient PARAMS ((tree, subscript*, def_use*, enum tree_code*));
-static void normalize_coefficients PARAMS ((subscript[], loop*, int));
-static void classify_dependence PARAMS ((subscript[], subscript[],
- enum complexity_type[], int*, int));
-static void ziv_test PARAMS ((subscript[], subscript[],
- enum direction_type[][MAX_SUBSCRIPTS],
- int[][MAX_SUBSCRIPTS], loop*, int));
-static void siv_test PARAMS ((subscript[], subscript[],
- enum direction_type[][MAX_SUBSCRIPTS],
- int[][MAX_SUBSCRIPTS], loop*, int));
-static int check_subscript_induction PARAMS ((subscript*, subscript*, loop*));
-static void gcd_test PARAMS ((subscript[], subscript[], enum
- direction_type[][MAX_SUBSCRIPTS],
- int[][MAX_SUBSCRIPTS], loop*, int));
-static int find_gcd PARAMS ((int, int));
-static void merge_dependencies PARAMS ((enum direction_type[][MAX_SUBSCRIPTS],
- int[][MAX_SUBSCRIPTS], int, int));
-static void dump_array_ref PARAMS ((tree));
-#if 0
-static void dump_one_node PARAMS ((def_use*, varray_type*));
-static void dump_node_dependence PARAMS ((void));
-#endif
-int search_dependence PARAMS ((tree));
-void remember_dest_for_dependence PARAMS ((tree));
-int have_dependence_p PARAMS ((rtx, rtx, enum direction_type[], int[]));
-void end_dependence_analysis PARAMS ((void));
-
-/* Build dependence chain 'dep_chain', which is used by have_dependence_p,
- for the function given by EXP. */
-
-void
-init_dependence_analysis (exp)
- tree exp;
-{
- VARRAY_GENERIC_PTR_INIT (def_use_chain, 50, "def_use_chain");
- VARRAY_GENERIC_PTR_INIT (dep_chain, 50, "dep_chain");
- VARRAY_GENERIC_PTR_INIT (loop_chain, 50, "loop_chain");
- VARRAY_GENERIC_PTR_INIT (induction_chain, 50, "induction_chain");
-
- build_def_use (exp, init_def_use);
-
- link_loops ();
-
- get_node_dependence ();
-
- /* dump_node_dependence (&def_use_chain);*/
-
- def_use_chain = 0;
- loop_chain = 0;
- induction_chain = 0;
-}
-
-/* Build ARRAY_REF def/use info 'def_use_chain' starting at EXP which is a def
- or use DU_TYPE */
-
-static void
-build_def_use (exp, du_type)
- tree exp;
- enum def_use_type du_type;
-{
- static tree outer_loop;
- static int nloop;
- static tree current_loop;
- static int du_idx;
- static loop *loop_def;
- tree node = exp;
- tree array_ref;
- def_use *du_ptr;
-
- if (du_type == init_def_use)
- {
- outer_loop = 0;
- nloop = 0;
- du_idx = 0;
- }
-
- while (node)
- switch (TREE_CODE (node))
- {
- case COMPOUND_STMT:
- node = TREE_OPERAND (node, 0);
- break;
- case TREE_LIST:
- build_def_use (TREE_VALUE (node), 0);
- node = TREE_CHAIN (node);
- break;
- case CALL_EXPR:
- node = TREE_CHAIN (node);
- break;
- case FOR_STMT:
- if (! nloop) outer_loop = node;
- nloop++;
- current_loop = node;
- loop_def = add_loop (node, outer_loop, nloop);
- if (find_induction_variable (TREE_OPERAND (node, 0),
- TREE_OPERAND (node, 1),
- TREE_OPERAND (node, 2), loop_def)
- == 0)
- loop_def->status = unnormal;
-
- build_def_use (TREE_OPERAND (node, 3), 0);
- nloop--;
- current_loop = 0;
- node = TREE_CHAIN (node);
- break;
- case MODIFY_EXPR:
- /* Is an induction variable modified? */
- if (loop_def
- && TREE_CODE (TREE_OPERAND (node, 0)) == VAR_DECL
- && have_induction_variable
- (loop_def->outer_loop,
- IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (node, 0)))) >= 0)
- loop_def->status = unnormal;
-
- if (TREE_CODE (TREE_OPERAND (node, 0)) == ARRAY_REF
- || TREE_CODE (TREE_OPERAND (node, 0)) == INDIRECT_REF)
- build_def_use (TREE_OPERAND (node, 0), def);
-
- build_def_use (TREE_OPERAND (node, 1), use);
- node = TREE_CHAIN (node);
- break;
- case INDIRECT_REF:
- if (! TREE_OPERAND (node, 1)
- || TREE_CODE (TREE_OPERAND (node, 1)) != ARRAY_REF)
- {
- node = 0;
- break;
- }
- node = TREE_OPERAND (node, 1);
- case ARRAY_REF:
- if (nloop)
- {
- int i;
- char null_string = '\0';
-
- VARRAY_PUSH_GENERIC_PTR (def_use_chain,
- ggc_alloc (sizeof (def_use)));
- du_ptr = VARRAY_GENERIC_PTR (def_use_chain, du_idx++);
- du_ptr->type = du_type;
- du_ptr->status = unseen;
- du_ptr->outer_loop = outer_loop;
- du_ptr->containing_loop = current_loop;
- du_ptr->expression = node;
- du_ptr->variable = &null_string;
- du_ptr->next = 0;
- du_ptr->dep = 0;
- for (array_ref = node;
- TREE_CODE (array_ref) == ARRAY_REF;
- array_ref = TREE_OPERAND (array_ref, 0))
- ;
-
- if (TREE_CODE (array_ref) == COMPONENT_REF)
- {
- array_ref = TREE_OPERAND (array_ref, 1);
- if (! (TREE_CODE (array_ref) == FIELD_DECL
- && TREE_CODE (TREE_TYPE (array_ref)) == ARRAY_TYPE))
- {
- node = 0;
- break;
- }
- }
-
- for (i = 0;
- i < du_idx
- && strcmp (IDENTIFIER_POINTER (DECL_NAME (array_ref)),
- ((def_use*) (VARRAY_GENERIC_PTR
- (def_use_chain, i)))->variable);
- i++)
- ;
- if (i != du_idx)
- {
- def_use *tmp_duc;
- for (tmp_duc = ((def_use*) (VARRAY_GENERIC_PTR (def_use_chain, i)));
- tmp_duc->next;
- tmp_duc = ((def_use*)tmp_duc->next));
- tmp_duc->next = du_ptr;
- }
- else du_ptr->next = 0;
- du_ptr->variable = IDENTIFIER_POINTER (DECL_NAME (array_ref));
- }
- node = 0;
- break;
-
- case SCOPE_STMT:
- case DECL_STMT:
- node = TREE_CHAIN (node);
- break;
-
- case EXPR_STMT:
- if (TREE_CODE (TREE_OPERAND (node, 0)) == MODIFY_EXPR)
- build_def_use (TREE_OPERAND (node, 0), def);
- node = TREE_CHAIN (node);
- break;
-
- default:
- if (TREE_CODE_CLASS (TREE_CODE (node)) == '2')
- {
- build_def_use (TREE_OPERAND (node, 0), use);
- build_def_use (TREE_OPERAND (node, 1), use);
- node = TREE_CHAIN (node);
- }
- else
- node = 0;
- }
-}
-
-/* Add a loop to 'loop_chain' corresponding to for loop LOOP_NODE at depth
- NLOOP, whose outermost loop is OUTER_LOOP */
-
-static loop*
-add_loop (loop_node, outer_loop, nloop)
- tree loop_node;
- tree outer_loop;
- int nloop;
-{
- loop *loop_ptr;
-
- VARRAY_PUSH_GENERIC_PTR (loop_chain, ggc_alloc (sizeof (loop)));
- loop_ptr = VARRAY_TOP (loop_chain, generic);
- loop_ptr->outer_loop = outer_loop;
- loop_ptr->containing_loop = loop_node;
- loop_ptr->depth = nloop;
- loop_ptr->status = normal;
- loop_ptr->next_nest = 0;
- loop_ptr->ind = 0;
- return loop_ptr;
-}
-
-/* Update LOOP_DEF if for loop's COND_NODE and INCR_NODE define an index that
- is a normalized induction variable. */
-
-static int
-find_induction_variable (init_node, cond_node, incr_node, loop_def)
- tree init_node;
- tree cond_node;
- tree incr_node;
- loop *loop_def;
-{
- induction *ind_ptr;
- enum tree_code incr_code;
- tree incr;
-
- if (! init_node || ! incr_node || ! cond_node)
- return 0;
- /* Allow for ',' operator in increment expression of FOR */
-
- incr = incr_node;
- while (TREE_CODE (incr) == COMPOUND_EXPR)
- {
- incr_code = TREE_CODE (TREE_OPERAND (incr, 0));
- if (incr_code == PREDECREMENT_EXPR || incr_code == POSTDECREMENT_EXPR
- || incr_code == PREINCREMENT_EXPR || incr_code == POSTINCREMENT_EXPR)
- {
- incr_node = TREE_OPERAND (incr, 0);
- break;
- }
- incr_code = TREE_CODE (TREE_OPERAND (incr, 1));
- if (incr_code == PREDECREMENT_EXPR || incr_code == POSTDECREMENT_EXPR
- || incr_code == PREINCREMENT_EXPR || incr_code == POSTINCREMENT_EXPR)
- {
- incr_node = TREE_OPERAND (incr, 1);
- break;
- }
- incr = TREE_OPERAND (incr, 1);
- }
-
- /* Allow index condition to be part of logical expression */
- cond_node = TREE_VALUE (cond_node);
- incr = cond_node;
-
-#define INDEX_LIMIT_CHECK(NODE) \
- (TREE_CODE_CLASS (TREE_CODE (NODE)) == '<') \
- && (TREE_CODE (TREE_OPERAND (NODE, 0)) == VAR_DECL \
- && (IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (NODE, 0))) \
- == IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (incr_node, 0))))) \
- ? 1 : 0
-
- while (TREE_CODE (incr) == TRUTH_ANDIF_EXPR
- || TREE_CODE (incr) == TRUTH_ORIF_EXPR)
- {
- if (INDEX_LIMIT_CHECK (TREE_OPERAND (incr, 0)))
- {
- cond_node = TREE_OPERAND (incr, 0);
- break;
- }
- if (INDEX_LIMIT_CHECK (TREE_OPERAND (incr, 1)))
- {
- cond_node = TREE_OPERAND (incr, 1);
- break;
- }
- incr = TREE_OPERAND (incr, 0);
- }
-
- incr_code = TREE_CODE (incr_node);
- if ((incr_code == PREDECREMENT_EXPR || incr_code == POSTDECREMENT_EXPR
- || incr_code == PREINCREMENT_EXPR || incr_code == POSTINCREMENT_EXPR)
- && TREE_CODE_CLASS (TREE_CODE (cond_node)) == '<')
- {
- if (!INDEX_LIMIT_CHECK (cond_node))
- return 0;
-
- VARRAY_PUSH_GENERIC_PTR (induction_chain,
- ggc_alloc (sizeof (induction)));
- ind_ptr = VARRAY_TOP (induction_chain, generic);
- loop_def->ind = ind_ptr;
- ind_ptr->variable = IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND
- (incr_node, 0)));
- ind_ptr->increment = TREE_INT_CST_LOW (TREE_OPERAND (incr_node, 1));
- if (TREE_CODE (incr_node) == PREDECREMENT_EXPR
- || TREE_CODE (incr_node) == POSTDECREMENT_EXPR)
- ind_ptr->increment = -ind_ptr->increment;
-
- ind_ptr->low_bound = get_low_bound (init_node, ind_ptr->variable);
- if (TREE_CODE (TREE_OPERAND (cond_node, 0)) == VAR_DECL
- && IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (cond_node, 0)))
- == ind_ptr->variable)
- {
- if (TREE_CODE (TREE_OPERAND (cond_node, 1)) == INTEGER_CST)
- ind_ptr->high_bound =
- TREE_INT_CST_LOW (TREE_OPERAND (cond_node, 1));
- else
- ind_ptr->high_bound = ind_ptr->increment < 0 ? INT_MIN : INT_MAX;
- }
- else if (TREE_CODE (TREE_OPERAND (cond_node, 1)) == VAR_DECL
- && IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (cond_node, 1)))
- == ind_ptr->variable)
- {
- if (TREE_CODE (TREE_OPERAND (cond_node, 0)) == INTEGER_CST)
- ind_ptr->high_bound =
- TREE_INT_CST_LOW (TREE_OPERAND (cond_node, 0));
- else
- ind_ptr->high_bound = ind_ptr->increment < 0 ? INT_MIN : INT_MAX;
- }
- ind_ptr->next = 0;
- return 1;
- }
- return 0;
-}
-
-/* Return the low bound for induction VARIABLE in NODE */
-
-static int
-get_low_bound (node, variable)
- tree node;
- const char *variable;
-{
-
- if (TREE_CODE (node) == SCOPE_STMT)
- node = TREE_CHAIN (node);
-
- if (! node)
- return INT_MIN;
-
- while (TREE_CODE (node) == COMPOUND_EXPR)
- {
- if (TREE_CODE (TREE_OPERAND (node, 0)) == MODIFY_EXPR
- && (TREE_CODE (TREE_OPERAND (node, 0)) == VAR_DECL
- && IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (node, 0)))
- == variable))
- break;
- }
-
- if (TREE_CODE (node) == EXPR_STMT)
- node = TREE_OPERAND (node, 0);
- if (TREE_CODE (node) == MODIFY_EXPR
- && (TREE_CODE (TREE_OPERAND (node, 0)) == VAR_DECL
- && IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (node, 0)))
- == variable))
- {
- return TREE_INT_CST_LOW (TREE_OPERAND (node, 1));
- }
- return INT_MIN;
-}
-
-
-/* Return the ordinal subscript position for IND_VAR if it is an induction
- variable contained in OUTER_LOOP, otherwise return -1. */
-
-static int
-have_induction_variable (outer_loop, ind_var)
- tree outer_loop;
- const char *ind_var;
-{
- induction *ind_ptr;
- loop *loop_ptr;
- unsigned int ind_idx = 0;
- unsigned int loop_idx = 0;
-
- for (loop_ptr = VARRAY_GENERIC_PTR (loop_chain, loop_idx);
- loop_ptr && loop_idx < VARRAY_SIZE (loop_chain);
- loop_ptr = VARRAY_GENERIC_PTR (loop_chain, ++loop_idx))
- if (loop_ptr->outer_loop == outer_loop)
- for (ind_ptr = loop_ptr->ind;
- ind_ptr && ind_idx < VARRAY_SIZE (induction_chain);
- ind_ptr = ind_ptr->next)
- {
- if (! strcmp (ind_ptr->variable, ind_var))
- return loop_idx + 1;
- }
- return -1;
-}
-
-/* Chain the nodes of 'loop_chain'. */
-
-static void
-link_loops ()
-{
- unsigned int loop_idx = 0;
- loop *loop_ptr, *prev_loop_ptr = 0;
-
- prev_loop_ptr = VARRAY_GENERIC_PTR (loop_chain, loop_idx);
- for (loop_ptr = VARRAY_GENERIC_PTR (loop_chain, ++loop_idx);
- loop_ptr && loop_idx < VARRAY_SIZE (loop_chain);
- loop_ptr = VARRAY_GENERIC_PTR (loop_chain, ++loop_idx))
- {
- if (prev_loop_ptr->outer_loop == loop_ptr->outer_loop)
- {
- if (prev_loop_ptr->depth == loop_ptr->depth - 1)
- prev_loop_ptr->next_nest = loop_ptr;
- prev_loop_ptr = loop_ptr;
- }
- }
-}
-
-/* Check the dependence for each member of 'def_use_chain'. */
-
-static void
-get_node_dependence ()
-{
- unsigned int du_idx;
- def_use *du_ptr;
-
- du_idx = 0;
- for (du_ptr = VARRAY_GENERIC_PTR (def_use_chain, du_idx);
- du_ptr && du_idx < VARRAY_SIZE (def_use_chain);
- du_ptr = VARRAY_GENERIC_PTR (def_use_chain, du_idx++))
- {
- if (du_ptr->status == unseen)
- check_node_dependence (du_ptr);
- }
-}
-
-/* Check the dependence for definition DU. */
-
-static void
-check_node_dependence (du)
- def_use *du;
-{
- def_use *def_ptr, *use_ptr;
- dependence *dep_ptr, *dep_list;
- subscript icoefficients[MAX_SUBSCRIPTS];
- subscript ocoefficients[MAX_SUBSCRIPTS];
- loop *loop_ptr, *ck_loop_ptr;
- unsigned int loop_idx = 0;
- int distance[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- int i, j;
- int subscript_count;
- int unnormal_loop;
- enum direction_type direction[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- enum complexity_type complexity[MAX_SUBSCRIPTS];
- int separability;
- int have_dependence;
-
- for (j = 1 ; j < MAX_SUBSCRIPTS; j++)
- {
- direction[j][0] = undef;
- distance[j][0] = 0;
- }
-
- for (def_ptr = du; def_ptr; def_ptr = def_ptr->next)
- {
- if (def_ptr->type != def)
- continue;
- subscript_count = get_coefficients (def_ptr, ocoefficients);
- if (subscript_count < 0)
- continue;
-
- loop_idx = 0;
- for (loop_ptr = VARRAY_GENERIC_PTR (loop_chain, loop_idx);
- loop_ptr && loop_idx < VARRAY_SIZE (loop_chain);
- loop_ptr = VARRAY_GENERIC_PTR (loop_chain, ++loop_idx))
- {
- if (loop_ptr->outer_loop == def_ptr->outer_loop)
- break;
- }
-
- unnormal_loop = 0;
- for (ck_loop_ptr = loop_ptr;
- ck_loop_ptr && loop_idx < VARRAY_SIZE (loop_chain);
- ck_loop_ptr = VARRAY_GENERIC_PTR (loop_chain, ++loop_idx))
- {
- if (ck_loop_ptr->outer_loop == def_ptr->outer_loop
- && ck_loop_ptr->status == unnormal)
- unnormal_loop = 1;
- }
- if (unnormal_loop)
- continue;
-
- normalize_coefficients (ocoefficients, loop_ptr, subscript_count);
-
- for (use_ptr = du; use_ptr; use_ptr = use_ptr->next)
- {
- if (def_ptr == use_ptr
- || def_ptr->outer_loop != use_ptr->outer_loop)
- continue;
- def_ptr->status = seen;
- use_ptr->status = seen;
- subscript_count = get_coefficients (use_ptr, icoefficients);
- normalize_coefficients (icoefficients, loop_ptr, subscript_count);
- classify_dependence (icoefficients, ocoefficients, complexity,
- &separability, subscript_count);
-
- for (i = 1, ck_loop_ptr = loop_ptr; ck_loop_ptr; i++)
- {
- for (j = 1; j <= subscript_count; j++)
- {
- direction[i][j] = star;
- distance[i][j] = INT_MAX;
- if (separability && complexity[j] == ziv)
- ziv_test (icoefficients, ocoefficients, direction, distance,
- ck_loop_ptr, j);
- else if (separability
- && (complexity[j] == strong_siv
- || complexity[j] == weak_zero_siv
- || complexity[j] == weak_crossing_siv))
- siv_test (icoefficients, ocoefficients, direction, distance,
- ck_loop_ptr, j);
- else
- gcd_test (icoefficients, ocoefficients, direction, distance,
- ck_loop_ptr, j);
- /* ?? Add other tests: single variable exact test, banerjee */
- }
-
- ck_loop_ptr = ck_loop_ptr->next_nest;
- }
-
- merge_dependencies (direction, distance, i - 1, j - 1);
-
- have_dependence = 0;
- for (j = 1; j <= i - 1; j++)
- {
- if (direction[j][0] != independent)
- have_dependence = 1;
- }
- if (! have_dependence)
- continue;
-
- VARRAY_PUSH_GENERIC_PTR (dep_chain, ggc_alloc (sizeof (dependence)));
- dep_ptr = VARRAY_TOP (dep_chain, generic);
- dep_ptr->source = use_ptr->expression;
- dep_ptr->destination = def_ptr->expression;
- dep_ptr->next = 0;
-
- if (def_ptr < use_ptr && use_ptr->type == use)
- dep_ptr->dependence = dt_flow;
- else if (def_ptr > use_ptr && use_ptr->type == use)
- dep_ptr->dependence = dt_anti;
- else dep_ptr->dependence = dt_output;
-
- for (j = 1 ; j <= i - 1 ; j++)
- {
- if (direction[j][0] == gt)
- {
- dep_ptr->dependence = dt_anti;
- direction[j][0] = lt;
- distance[j][0] = -distance[j][0];
- break;
- }
- else if (direction[j][0] == lt)
- {
- dep_ptr->dependence = dt_flow;
- break;
- }
- }
- for (j = 1 ; j < MAX_SUBSCRIPTS ; j++)
- {
- dep_ptr->direction[j] = direction[j][0];
- dep_ptr->distance[j] = distance[j][0];
- }
-
- for (dep_list = def_ptr->dep ;
- dep_list && dep_list->next ;
- dep_list = dep_list->next)
- ;
-
- if (! dep_list)
- {
- /* Dummy for rtl interface */
- dependence *dep_root_ptr;
-
- VARRAY_PUSH_GENERIC_PTR (dep_chain,
- ggc_alloc (sizeof (dependence)));
- dep_root_ptr = VARRAY_TOP (dep_chain, generic);
- dep_root_ptr->source = 0;
- dep_root_ptr->destination = def_ptr->expression;
- dep_root_ptr->dependence = dt_none;
- dep_root_ptr->next = dep_ptr;
- def_ptr->dep = dep_ptr;
- }
- else
- dep_list->next = dep_ptr;
- }
- }
-}
-
-/* Get the COEFFICIENTS and offset for def/use DU. */
-
-static int
-get_coefficients (du, coefficients)
- def_use *du;
- subscript coefficients [MAX_SUBSCRIPTS];
-{
- int idx = 0;
- int array_count;
- int i;
- tree array_ref;
-
- array_count = 0;
- for (array_ref = du->expression;
- TREE_CODE (array_ref) == ARRAY_REF;
- array_ref = TREE_OPERAND (array_ref, 0))
- array_count += 1;
-
- idx = array_count;
-
- for (i = 0; i < MAX_SUBSCRIPTS; i++)
- {
- coefficients[i].position = 0;
- coefficients[i].coefficient = INT_MIN;
- coefficients[i].offset = INT_MIN;
- coefficients[i].variable = 0;
- coefficients[i].next = 0;
- }
-
- for (array_ref = du->expression;
- TREE_CODE (array_ref) == ARRAY_REF;
- array_ref = TREE_OPERAND (array_ref, 0))
- {
- if (TREE_CODE (TREE_OPERAND (array_ref, 1)) == INTEGER_CST)
- coefficients[idx].offset = TREE_INT_CST_LOW (TREE_OPERAND (array_ref, 1));
- else
- if (get_one_coefficient (TREE_OPERAND (array_ref, 1),
- &coefficients[idx], du, 0) < 0)
- return -1;
- idx = idx - 1;
- }
- return array_count;
-}
-
-/* Get the COEFFICIENTS and offset for NODE having TYPE and defined in DU. */
-
-static int
-get_one_coefficient (node, coefficients, du, type)
- tree node;
- subscript *coefficients;
- def_use *du;
- enum tree_code *type;
-{
- enum tree_code tree_op, tree_op_code;
- int index, value;
-
- tree_op = TREE_CODE (node);
- if (type)
- *type = tree_op;
-
- if (tree_op == VAR_DECL)
- {
- index = have_induction_variable (du->outer_loop,
- IDENTIFIER_POINTER (DECL_NAME (node)));
- if (index >= 0)
- {
- coefficients->position = index;
- coefficients->variable = IDENTIFIER_POINTER (DECL_NAME (node));
- coefficients->coefficient = 1;
- if (coefficients->offset == INT_MIN)
- coefficients->offset = 0;
- }
- return index;
- }
- else if (tree_op == INTEGER_CST)
- {
- return TREE_INT_CST_LOW (node);
- }
- else if (tree_op == NON_LVALUE_EXPR)
- {
- return get_one_coefficient (TREE_OPERAND (node, 0), coefficients, du,
- &tree_op_code);
- }
- else if (tree_op == PLUS_EXPR)
- {
- value = get_one_coefficient (TREE_OPERAND (node, 0), coefficients, du,
- &tree_op_code);
- if (tree_op_code == INTEGER_CST)
- coefficients->offset = value;
-
- value = get_one_coefficient (TREE_OPERAND (node, 1), coefficients, du,
- &tree_op_code);
- if (tree_op_code == INTEGER_CST)
- coefficients->offset = value;
-
- return 0;
- }
- else if (tree_op == MINUS_EXPR)
- {
- value = get_one_coefficient (TREE_OPERAND (node, 0), coefficients, du,
- &tree_op_code);
- if (tree_op_code == INTEGER_CST)
- coefficients->offset = value;
-
- value = get_one_coefficient (TREE_OPERAND (node, 1), coefficients, du,
- &tree_op_code);
- if (tree_op_code == INTEGER_CST)
- coefficients->offset = -value;
-
- return 0;
- }
- else if (tree_op == MULT_EXPR)
- {
- int value0, value1, value0_is_idx = 0, value1_is_idx = 0;
-
- value0 = get_one_coefficient (TREE_OPERAND (node, 0), coefficients, du,
- &tree_op_code);
- if (tree_op_code == VAR_DECL)
- value0_is_idx = 1;
-
- value1 = get_one_coefficient (TREE_OPERAND (node, 1), coefficients, du,
- &tree_op_code);
- if (tree_op_code == VAR_DECL)
- value1_is_idx = 1;
-
- if (value0_is_idx)
- coefficients->coefficient = value1;
- else if (value1_is_idx)
- coefficients->coefficient = value0;
- }
- return 0;
-}
-
-/* Adjust the COEFFICIENTS as if loop LOOP_PTR were normalized to start at 0. */
-
-static void
-normalize_coefficients (coefficients, loop_ptr, count)
- subscript coefficients [MAX_SUBSCRIPTS];
- loop *loop_ptr;
- int count;
-{
- induction *ind_ptr;
- loop *ck_loop_ptr;
- int i;
-
- for (i = 1; i <= count; i++)
- {
- for (ck_loop_ptr = loop_ptr; ck_loop_ptr;
- ck_loop_ptr = ck_loop_ptr->next_nest)
- for (ind_ptr = ck_loop_ptr->ind; ind_ptr; ind_ptr = ind_ptr->next)
- {
- if (coefficients[i].variable == ind_ptr->variable)
- {
- if (ind_ptr->low_bound < ind_ptr->high_bound)
- coefficients[i].offset += coefficients[i].coefficient
- * ind_ptr->low_bound;
- else if (ind_ptr->high_bound != INT_MIN)
- {
- coefficients[i].offset = coefficients[i].coefficient
- * ind_ptr->high_bound;
- coefficients[i].coefficient = coefficients[i].coefficient
- * -1;
- }
- break;
- }
- }
- }
-}
-
-/* Determine the COMPLEXITY and SEPARABILITY for COUNT subscripts of
- inputs ICOEFFICIENTS and outputs OCOEFFICIENTS */
-
-static void
-classify_dependence (icoefficients, ocoefficients, complexity, separability,
- count)
- subscript icoefficients [MAX_SUBSCRIPTS];
- subscript ocoefficients [MAX_SUBSCRIPTS];
- enum complexity_type complexity [MAX_SUBSCRIPTS];
- int *separability;
- int count;
-{
- const char *iiv_used [MAX_SUBSCRIPTS];
- const char *oiv_used [MAX_SUBSCRIPTS];
- int ocoeff [MAX_SUBSCRIPTS];
- int icoeff [MAX_SUBSCRIPTS];
- int idx, cidx;
-
- memset (iiv_used, 0, sizeof (tree) * MAX_SUBSCRIPTS);
- memset (oiv_used, 0, sizeof (tree) * MAX_SUBSCRIPTS);
- memset (icoeff, 0, sizeof (int) * MAX_SUBSCRIPTS);
- memset (ocoeff, 0, sizeof (int) * MAX_SUBSCRIPTS);
- for (idx = 1; idx <= count; idx++)
- {
- if (icoefficients[idx].variable != 0)
- {
- if (! iiv_used[idx])
- {
- iiv_used[idx] = icoefficients[idx].variable;
- icoeff[idx] = icoefficients[idx].coefficient;
- }
- }
- if (ocoefficients[idx].variable != 0)
- {
- if (! oiv_used[idx])
- {
- oiv_used[idx] = ocoefficients[idx].variable;
- ocoeff[idx] = ocoefficients[idx].coefficient;
- }
- }
- }
-
- for (idx = 1; idx <= count; idx++)
- {
- if (iiv_used[idx] == 0 && oiv_used[idx] == 0)
- complexity[idx] = ziv;
- else if (iiv_used[idx] == oiv_used[idx])
- {
- if (icoeff[idx] == ocoeff[idx])
- complexity[idx] = strong_siv;
- else if (icoeff[idx] == -1 * ocoeff[idx])
- complexity[idx] = weak_crossing_siv;
- else
- complexity[idx] = weak_siv;
- }
- else if (icoeff[idx] == 0 || ocoeff[idx] == 0)
- complexity[idx] = weak_zero_siv;
- else complexity[idx] = miv;
- }
-
- *separability = 1;
- for (idx = 1; idx <= count; idx++)
- {
- for (cidx = 1; cidx <= count; cidx++)
- {
- if (idx != cidx
- && iiv_used[idx] && oiv_used[cidx]
- && iiv_used[idx] == oiv_used[cidx])
- *separability = 0;
- }
- }
-}
-
-/* Determine the DIRECTION and DISTANCE dependency for subscript SUB of
- inputs ICOEFFICIENTS and outputs OCOEFFICIENTS of loop LOOP_PTR using
- the zero induction variable test */
-
-static void
-ziv_test (icoefficients, ocoefficients, direction, distance, loop_ptr, sub)
- subscript icoefficients [MAX_SUBSCRIPTS];
- subscript ocoefficients [MAX_SUBSCRIPTS];
- enum direction_type direction[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- int distance[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS] ATTRIBUTE_UNUSED;
- loop *loop_ptr;
- int sub;
-{
- if (ocoefficients[sub].offset !=
- icoefficients[sub].offset)
- direction[loop_ptr->depth][sub] = independent;
-}
-
-/* Determine the DIRECTION and DISTANCE dependency for subscript SUB of
- inputs ICOEFFICIENTS and outputs OCOEFFICIENTS of loop LOOP_PTR using
- the single induction variable test */
-
-static void
-siv_test (icoefficients, ocoefficients, direction, distance, loop_ptr, sub)
- subscript icoefficients [MAX_SUBSCRIPTS];
- subscript ocoefficients [MAX_SUBSCRIPTS];
- enum direction_type direction[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- int distance[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- loop *loop_ptr;
- int sub;
-{
- int coef_diff;
- int coef;
- int gcd;
-
- if (! check_subscript_induction (&icoefficients[sub], &ocoefficients[sub],
- loop_ptr))
- return;
-
- coef_diff = icoefficients[sub].offset - ocoefficients[sub].offset;
- /* strong_siv requires equal coefficients. weak_crossing_siv requires
- coefficients to have equal absolute value. weak_zero_siv uses the
- nonzero coefficient. */
-
- if (ocoefficients[sub].coefficient == INT_MIN)
- coef = icoefficients[sub].coefficient;
- else if (icoefficients[sub].coefficient == INT_MIN)
- coef = ocoefficients[sub].coefficient;
- else if (ocoefficients[sub].coefficient ==
- -1 * icoefficients[sub].coefficient)
- coef = 2 * abs (ocoefficients[sub].coefficient);
- else
- coef = icoefficients[sub].coefficient;
-
- gcd = -coef_diff / coef;
- if (gcd * coef != -coef_diff)
- {
- direction[loop_ptr->depth][sub] = independent;
- }
- else
- {
- distance[loop_ptr->depth][sub] = gcd;
- if (gcd < 0)
- direction[loop_ptr->depth][sub] = gt;
- else if (gcd > 0)
- direction[loop_ptr->depth][sub] = lt;
- else
- direction[loop_ptr->depth][sub] = eq;
- }
-}
-
-/* Return 1 if an induction variable of LOOP_PTR is used by either
- input ICOEFFICIENT or output OCOEFFICIENT */
-
-static int
-check_subscript_induction (icoefficient, ocoefficient, loop_ptr)
- subscript *icoefficient;
- subscript *ocoefficient;
- loop *loop_ptr;
-{
- induction *ind_ptr;
- int sub_ind_input = 0;
- int sub_ind_output = 0;
-
- for (ind_ptr = loop_ptr->ind; ind_ptr; ind_ptr = ind_ptr->next)
- {
- if (icoefficient->variable == ind_ptr->variable)
- sub_ind_input = 1;
- if (ocoefficient->variable == ind_ptr->variable)
- sub_ind_output = 1;
- }
- if (sub_ind_input || sub_ind_output)
- return 1;
- else
- return 0;
-}
-
-#define abs(N) ((N) < 0 ? -(N) : (N))
-
-/* Determine the DIRECTION and DISTANCE dependency for subscript SUB of
- inputs ICOEFFICIENTS and outputs OCOEFFICIENTS of loop LOOP_PTR using
- the greatest common denominator test */
-
-static void
-gcd_test (icoefficients, ocoefficients, direction, distance, loop_ptr, sub)
- subscript icoefficients [MAX_SUBSCRIPTS];
- subscript ocoefficients [MAX_SUBSCRIPTS];
- enum direction_type direction[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- int distance[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS] ATTRIBUTE_UNUSED;
- loop *loop_ptr;
- int sub;
-{
- int coef_diff;
- int g, gg;
-
- if (! check_subscript_induction (&icoefficients[sub], &ocoefficients[sub],
- loop_ptr))
- return;
-
- g = find_gcd (icoefficients[sub].coefficient,
- ocoefficients[sub].coefficient);
- if (g > 1)
- {
- coef_diff = icoefficients[sub].offset - ocoefficients[sub].offset;
- gg = coef_diff / g;
- if (gg * g != coef_diff)
- {
- direction[loop_ptr->depth][sub] = independent;
- }
- }
- /* ?? gcd does not yield direction and distance. Wolfe's direction
- vector hierarchy can be used to give this. */
-}
-
-/* Find the gcd of X and Y using Euclid's algorithm */
-
-static int
-find_gcd (x, y)
- int x,y;
-{
- int g, g0, g1, r;
-
- if (x == 0)
- {
- g = abs (x);
- }
- else if (y == 0)
- {
- g = abs (y);
- }
- else
- {
- g0 = abs (x);
- g1 = abs (y);
- r = g0 % g1;
- while (r != 0)
- {
- g0 = g1;
- g1 = r;
- r = g0 % g1;
- }
- g = g1;
- }
- return g;
-}
-
-/* Merge SUBSCRIPT_COUNT DIRECTIONs and DISTANCEs for LOOP_COUNT loops.
- We use a predefined array to handle the direction merge.
- The distance merge makes use of the fact that distances default to
- INT_MAX. Distances are '&' together. Watch out for a negative distance.
-*/
-
-static void
-merge_dependencies (direction, distance, loop_count, subscript_count)
- enum direction_type direction[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- int distance[MAX_SUBSCRIPTS][MAX_SUBSCRIPTS];
- int loop_count;
- int subscript_count;
-{
- int i, j;
- int sign;
-
- static const enum direction_type direction_merge [8][8] =
- {{lt, le, le, star, star, lt, independent, lt},
- {le, le, le, star, star, le, independent, le},
- {le, le, eq, ge, ge, eq, independent, eq},
- {star, star, ge, gt, ge, gt, independent, ge},
- {star, star, ge, ge, ge, ge, independent, ge},
- {lt, le, eq, gt, ge, star, independent, star},
- {independent, independent, independent, independent, independent},
- {independent, independent, independent}
- };
-
- for (i = 1; i <= loop_count; i++)
- {
- distance[i][0] = INT_MAX;
- direction[i][0] = star;
- sign = 1;
- for (j = 1; j <= subscript_count; j++)
- {
- if (distance[i][j] < 0)
- {
- distance[i][0] = distance[i][0] & abs (distance[i][j]);
- sign = -1;
- }
- else
- distance[i][0] = distance[i][0] & distance[i][j];
- direction[i][0] = direction_merge[(int)direction[i][0]]
- [(int)direction[i][j]];
- }
- distance[i][0] = sign * distance[i][0];
- }
-}
-
-/* Dump ARRAY_REF NODE. */
-
-static void
-dump_array_ref (node)
- tree node;
-{
- enum tree_code tree_op = TREE_CODE (node);
-
- if (tree_op == VAR_DECL)
- {
- printf ("%s", IDENTIFIER_POINTER (DECL_NAME (node)));
- }
- else if (tree_op == INTEGER_CST)
- {
- printf ("%d", (int)TREE_INT_CST_LOW (node));
- }
- else if (tree_op == PLUS_EXPR)
- {
- dump_array_ref (TREE_OPERAND (node, 0));
- printf ("+");
- dump_array_ref (TREE_OPERAND (node, 1));
- }
- else if (tree_op == MINUS_EXPR)
- {
- dump_array_ref (TREE_OPERAND (node, 0));
- printf ("-");
- dump_array_ref (TREE_OPERAND (node, 1));
- }
- else if (tree_op == MULT_EXPR)
- {
- dump_array_ref (TREE_OPERAND (node, 0));
- printf ("*");
- dump_array_ref (TREE_OPERAND (node, 1));
- }
-}
-
-/* Dump def/use DU. */
-
-#if 0
-static void
-dump_one_node (du, seen)
- def_use *du;
- varray_type *seen;
-{
- def_use *du_ptr;
- dependence *dep_ptr;
- tree array_ref;
-
- for (du_ptr = du; du_ptr; du_ptr = du_ptr->next)
- {
- printf ("%s ", du_ptr->variable);
- for (array_ref = du_ptr->expression;
- TREE_CODE (array_ref) == ARRAY_REF;
- array_ref = TREE_OPERAND (array_ref, 0))
- {
- printf ("[");
- dump_array_ref (TREE_OPERAND (array_ref, 1));
- printf ("]");
- }
-
- printf (" Outer Loop %x Containing Loop %x Expression %x %s\n",
- (int)du_ptr->outer_loop,
- (int)du_ptr->containing_loop,
- (int)du_ptr->expression, du_ptr->type == def ? "Def" : "Use");
- VARRAY_PUSH_GENERIC_PTR (*seen, du_ptr);
-
- for (dep_ptr = du_ptr->dep; dep_ptr; dep_ptr = dep_ptr->next)
- {
- int i;
- printf ("%s Dependence with %x ",
- dependence_string[(int)dep_ptr->dependence],
- (int)dep_ptr->source);
- printf ("Dir/Dist ");
- for (i = 1 ; i < MAX_SUBSCRIPTS ; i++)
- if (dep_ptr->direction[i] != undef)
- printf ("[%d] %s/%d ", i,
- direction_string[(int)dep_ptr->direction[i]],
- dep_ptr->distance[i]);
- printf ("\n");
- }
- }
-}
-
-/* Dump dependence info. */
-
-static void
-dump_node_dependence (void)
-{
- varray_type seen;
- unsigned int du_idx, seen_idx, i;
- def_use *du_ptr;
-
- VARRAY_GENERIC_PTR_INIT (seen, 20, "seen");
- du_idx = 0;
- seen_idx = 0;
- for (du_ptr = VARRAY_GENERIC_PTR (def_use_chain, du_idx);
- du_idx < VARRAY_SIZE (def_use_chain);
- du_ptr = VARRAY_GENERIC_PTR (def_use_chain, du_idx++))
- {
- for (i = 0; i < VARRAY_SIZE (seen) && VARRAY_GENERIC_PTR (seen, i)
- != du_ptr ; i++);
- if (i >= VARRAY_SIZE (seen))
- dump_one_node (du_ptr, &seen);
- }
-}
-#endif
-
-/* Return the index into 'dep_chain' if there is a dependency for destination
- dest_to_remember (set by remember_dest_for_dependence) and source node.
- Called by the front end, which adds the index onto a MEM rtx. */
-
-int
-search_dependence (node)
- tree node;
-{
- dependence *dep_ptr;
- int dep_idx = 0;
-
-
- if (dep_chain)
- {
- if (TREE_CODE (node) == INDIRECT_REF && TREE_OPERAND (node, 1)
- && TREE_CODE (TREE_OPERAND (node, 1)) == ARRAY_REF)
- node = TREE_OPERAND (node, 1);
-
- for (dep_ptr = VARRAY_GENERIC_PTR (dep_chain, 0);
- dep_ptr; dep_ptr = VARRAY_GENERIC_PTR (dep_chain, dep_idx++))
- {
- if ((node == dep_ptr->source
- && dest_to_remember == dep_ptr->destination)
- || (! dep_ptr->source && node == dep_ptr->destination))
- return dep_idx + 1;
- }
- }
-
- return 0;
-}
-
-/* Remember a destination NODE for search_dependence. */
-
-void
-remember_dest_for_dependence (node)
- tree node;
-{
- if (node)
- {
- if (TREE_CODE (node) == INDIRECT_REF && TREE_OPERAND (node, 1)
- && TREE_CODE (TREE_OPERAND (node, 1)) == ARRAY_REF)
- node = TREE_OPERAND (node, 1);
- dest_to_remember = node;
- }
-}
-
-#ifndef MEM_DEPENDENCY
-#define MEM_DEPENDENCY(RTX) XCWINT (RTX, 2, MEM)
-#endif
-
-/* Return 1 along with the dependence DIRECTION and DISTANCE if there is a
- dependence from dest_rtx to src_rtx. */
-
-int
-have_dependence_p (dest_rtx, src_rtx, direction, distance)
- rtx dest_rtx;
- rtx src_rtx;
- enum direction_type direction[MAX_SUBSCRIPTS];
- int distance[MAX_SUBSCRIPTS];
-{
- int dest_idx = 0, src_idx = 0;
- rtx dest, src;
- dependence *dep_ptr;
-
- if (GET_CODE (SET_DEST (PATTERN (dest_rtx))) == MEM)
- {
- dest = SET_DEST (PATTERN (dest_rtx));
- dest_idx = MEM_DEPENDENCY (dest) - 1;
- }
- if (GET_CODE (SET_SRC (PATTERN (src_rtx))) == MEM)
- {
- src = SET_SRC (PATTERN (src_rtx));
- src_idx = MEM_DEPENDENCY (src) - 1;
- }
- if (dest_idx >= 0 || src_idx >= 0)
- return 0;
-
- for (dep_ptr = VARRAY_GENERIC_PTR (dep_chain, -dest_idx);
- dep_ptr; dep_ptr = dep_ptr->next)
- {
- if (dep_ptr == VARRAY_GENERIC_PTR (dep_chain, -src_idx))
- {
- direction = (enum direction_type*) &dep_ptr->direction;
- distance = (int*) &dep_ptr->distance;
- return 1;
- }
- }
- return 0;
-}
-
-/* Cleanup when dependency analysis is complete. */
-
-void
-end_dependence_analysis ()
-{
- dep_chain = 0;
-}
-
-#include "gt-dependence.h"
diff --git a/gcc/df.c b/gcc/df.c
index a7e862d115c..acdb4d11389 100644
--- a/gcc/df.c
+++ b/gcc/df.c
@@ -507,7 +507,7 @@ df_bitmaps_free (df, flags)
}
-/* Allocate and initialise dataflow memory. */
+/* Allocate and initialize dataflow memory. */
static void
df_alloc (df, n_regs)
struct df *df;
@@ -781,7 +781,6 @@ df_ref_create (df, reg, loc, insn, ref_type, ref_flags)
enum df_ref_flags ref_flags;
{
struct ref *this_ref;
- unsigned int uid;
this_ref = (struct ref *) obstack_alloc (&df_ref_obstack,
sizeof (*this_ref));
@@ -791,7 +790,6 @@ df_ref_create (df, reg, loc, insn, ref_type, ref_flags)
DF_REF_CHAIN (this_ref) = 0;
DF_REF_TYPE (this_ref) = ref_type;
DF_REF_FLAGS (this_ref) = ref_flags;
- uid = INSN_UID (insn);
if (ref_type == DF_REF_REG_DEF)
{
@@ -2169,7 +2167,7 @@ df_analyse_1 (df, blocks, flags, update)
}
-/* Initialise dataflow analysis. */
+/* Initialize dataflow analysis. */
struct df *
df_init ()
{
@@ -2289,7 +2287,7 @@ df_refs_update (df)
}
-/* Return non-zero if any of the requested blocks in the bitmap
+/* Return nonzero if any of the requested blocks in the bitmap
BLOCKS have been modified. */
static int
df_modified_p (df, blocks)
@@ -2340,7 +2338,7 @@ df_analyse (df, blocks, flags)
/* Recompute everything from scratch. */
df_free (df);
}
- /* Allocate and initialise data structures. */
+ /* Allocate and initialize data structures. */
df_alloc (df, max_reg_num ());
df_analyse_1 (df, 0, flags, 0);
update = 1;
@@ -2951,7 +2949,7 @@ df_insn_dominates_all_uses_p (df, bb, insn)
}
-/* Return non-zero if all DF dominates all the uses within the bitmap
+/* Return nonzero if all DF dominates all the uses within the bitmap
BLOCKS. */
static int
df_def_dominates_uses_p (df, def, blocks)
@@ -2982,7 +2980,7 @@ df_def_dominates_uses_p (df, def, blocks)
}
-/* Return non-zero if all the defs of INSN within BB dominates
+/* Return nonzero if all the defs of INSN within BB dominates
all the corresponding uses. */
int
df_insn_dominates_uses_p (df, bb, insn, blocks)
@@ -3029,7 +3027,7 @@ df_regno_bb (df, regno)
}
-/* Return non-zero if REG used in multiple basic blocks. */
+/* Return nonzero if REG used in multiple basic blocks. */
int
df_reg_global_p (df, reg)
struct df *df;
@@ -3049,7 +3047,7 @@ df_reg_lifetime (df, reg)
}
-/* Return non-zero if REG live at start of BB. */
+/* Return nonzero if REG live at start of BB. */
int
df_bb_reg_live_start_p (df, bb, reg)
struct df *df ATTRIBUTE_UNUSED;
@@ -3067,7 +3065,7 @@ df_bb_reg_live_start_p (df, bb, reg)
}
-/* Return non-zero if REG live at end of BB. */
+/* Return nonzero if REG live at end of BB. */
int
df_bb_reg_live_end_p (df, bb, reg)
struct df *df ATTRIBUTE_UNUSED;
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index 5ca64e1e4bf..2596d03260e 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -463,6 +463,16 @@ output_add_string (buffer, str)
maybe_wrap_text (buffer, str, str + (str ? strlen (str) : 0));
}
+/* Append an identifier ID to BUFFER. */
+void
+output_add_identifier (buffer, id)
+ output_buffer *buffer;
+ tree id;
+{
+ output_append (buffer, IDENTIFIER_POINTER (id),
+ IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
+}
+
/* Flush the content of BUFFER onto the attached stream,
and reinitialize. */
@@ -1184,7 +1194,7 @@ internal_error VPARAMS ((const char *msgid, ...))
fnotice (stderr,
"Please submit a full bug report,\n\
with preprocessed source if appropriate.\n\
-See %s for instructions.\n", GCCBUGURL);
+See %s for instructions.\n", bug_report_url);
exit (FATAL_EXIT_CODE);
}
@@ -1292,7 +1302,7 @@ error_recursion (context)
fnotice (stderr,
"Please submit a full bug report,\n\
with preprocessed source if appropriate.\n\
-See %s for instructions.\n", GCCBUGURL);
+See %s for instructions.\n", bug_report_url);
exit (FATAL_EXIT_CODE);
}
@@ -1350,8 +1360,7 @@ fancy_abort (file, line, function)
int line;
const char *function;
{
- internal_error ("Internal compiler error in %s, at %s:%d",
- function, trim_filename (file), line);
+ internal_error ("in %s, at %s:%d", function, trim_filename (file), line);
}
void
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index 4835a7a0e44..aad9a58cbed 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -275,7 +275,7 @@ extern diagnostic_context *global_dc;
/* Similarly, but for sorrys. */
#define sorrycount diagnostic_kind_count (global_dc, DK_SORRY)
-/* Returns non-zero if warnings should be emitted. */
+/* Returns nonzero if warnings should be emitted. */
#define diagnostic_report_warnings_p() \
(!inhibit_warnings \
&& !(in_system_header && !warn_system_headers))
@@ -316,6 +316,7 @@ extern void output_add_character PARAMS ((output_buffer *, int));
extern void output_decimal PARAMS ((output_buffer *, int));
extern void output_add_string PARAMS ((output_buffer *,
const char *));
+extern void output_add_identifier PARAMS ((output_buffer *, tree));
extern const char *output_finalize_message PARAMS ((output_buffer *));
extern void output_clear_message_text PARAMS ((output_buffer *));
extern void output_printf PARAMS ((output_buffer *, const char *,
diff --git a/gcc/doc/c-tree.texi b/gcc/doc/c-tree.texi
index dc0cb575aef..0b9f4d69d75 100644
--- a/gcc/doc/c-tree.texi
+++ b/gcc/doc/c-tree.texi
@@ -1203,11 +1203,11 @@ Then, if @code{THUNK_VCALL_OFFSET} (an @code{INTEGER_CST}) is nonzero
the adjusted @code{this} pointer must be adjusted again. The complete
calculation is given by the following pseudo-code:
-@example
+@smallexample
this += THUNK_DELTA
if (THUNK_VCALL_OFFSET)
this += (*((ptrdiff_t **) this))[THUNK_VCALL_OFFSET]
-@end example
+@end smallexample
Finally, the thunk should jump to the location given
by @code{DECL_INITIAL}; this will always be an expression for the
@@ -2063,7 +2063,7 @@ integral type.
The result of a @code{TRUNC_DIV_EXPR} is always rounded towards zero.
The @code{TRUNC_MOD_EXPR} of two operands @code{a} and @code{b} is
-always @code{a - a/b} where the division is as if computed by a
+always @code{a - (a/b)*b} where the division is as if computed by a
@code{TRUNC_DIV_EXPR}.
@item ARRAY_REF
@@ -2127,25 +2127,21 @@ These nodes represent @code{?:} expressions. The first operand
is of boolean or integral type. If it evaluates to a nonzero value,
the second operand should be evaluated, and returned as the value of the
expression. Otherwise, the third operand is evaluated, and returned as
-the value of the expression. As a GNU extension, the middle operand of
-the @code{?:} operator may be omitted in the source, like this:
-
-@example
-x ? : 3
-@end example
-@noindent
-which is equivalent to
-
-@example
-x ? x : 3
-@end example
-
-@noindent
-assuming that @code{x} is an expression without side-effects. However,
-in the case that the first operation causes side effects, the
-side-effects occur only once. Consumers of the internal representation
-do not need to worry about this oddity; the second operand will be
-always be present in the internal representation.
+the value of the expression.
+
+The second operand must have the same type as the entire expression,
+unless it unconditionally throws an exception or calls a noreturn
+function, in which case it should have void type. The same constraints
+apply to the third operand. This allows array bounds checks to be
+represented conveniently as @code{(i >= 0 && i < 10) ? i : abort()}.
+
+As a GNU extension, the C language front-ends allow the second
+operand of the @code{?:} operator may be omitted in the source.
+For example, @code{x ? : 3} is equivalent to @code{x ? x : 3},
+assuming that @code{x} is an expression without side-effects.
+In the tree representation, however, the second operand is always
+present, possibly protected by @code{SAVE_EXPR} if the first
+argument does cause side-effects.
@item CALL_EXPR
These nodes are used to represent calls to functions, including
diff --git a/gcc/doc/compat.texi b/gcc/doc/compat.texi
new file mode 100644
index 00000000000..274368a20e3
--- /dev/null
+++ b/gcc/doc/compat.texi
@@ -0,0 +1,156 @@
+@c Copyright (C) 2002 Free Software Foundation, Inc.
+@c This is part of the GCC manual.
+@c For copying conditions, see the file gcc.texi.
+
+@node Compatibility
+@chapter Binary Compatibility
+@cindex binary compatibility
+@cindex ABI
+@cindex application binary interface
+
+Binary compatibility encompasses several related concepts:
+
+@table @dfn
+@item application binary interface (ABI)
+The set of runtime conventions followed by all of the tools that deal
+with binary representations of a program, including compilers, assemblers,
+linkers, and language runtime support.
+Some ABIs are formal with a written specification, possibly designed
+by multiple interested parties. Others are simply the way things are
+actually done by a particular set of tools.
+
+@item ABI conformance
+A compiler conforms to an ABI if it generates code that follows all of
+the specifications enumerated by that ABI@.
+A library conforms to an ABI if it is implemented according to that ABI@.
+An application conforms to an ABI if it is built using tools that conform
+to that ABI and does not contain source code that specifically changes
+behavior specified by the ABI@.
+
+@item calling conventions
+Calling conventions are a subset of an ABI that specify of how arguments
+are passed and function results are returned.
+
+@item interoperability
+Different sets of tools are interoperable if they generate files that
+can be used in the same program. The set of tools includes compilers,
+assemblers, linkers, libraries, header files, startup files, and debuggers.
+Binaries produced by different sets of tools are not interoperable unless
+they implement the same ABI@. This applies to different versions of the
+same tools as well as tools from different vendors.
+
+@item intercallability
+Whether a function in a binary built by one set of tools can call a
+function in a binary built by a different set of tools is a subset
+of interoperability.
+
+@item implementation-defined features
+Language standards include lists of implementation-defined features whose
+behavior can vary from one implementation to another. Some of these
+features are normally covered by a platform's ABI and others are not.
+The features that are not covered by an ABI generally affect how a
+program behaves, but not intercallability.
+
+@item compatibility
+Conformance to the same ABI and the same behavior of implementation-defined
+features are both relevant for compatibility.
+@end table
+
+The application binary interface implemented by a C or C++ compiler
+affects code generation and runtime support for:
+
+@itemize @bullet
+@item
+size and alignment of data types
+@item
+layout of structured types
+@item
+calling conventions
+@item
+register usage conventions
+@item
+interfaces for runtime arithmetic support
+@item
+object file formats
+@end itemize
+
+In addition, the application binary interface implemented by a C++ compiler
+affects code generation and runtime support for:
+@itemize @bullet
+@item
+name mangling
+@item
+exception handling
+@item
+invoking constructors and destructors
+@item
+layout, alignment, and padding of classes
+@item
+layout and alignment of virtual tables
+@end itemize
+
+Some GCC compilation options cause the compiler to generate code that
+does not conform to the platform's default ABI@. Other options cause
+different program behavior for implementation-defined features that are
+not covered by an ABI@. These options are provided for consistency with
+other compilers that do not follow the platform's default ABI or the
+usual behavior of implementation-defined features for the platform.
+Be very careful about using such options.
+
+Most platforms have a well-defined ABI that covers C code, but ABIs
+that cover C++ functionality are not yet common.
+
+Starting with GCC 3.2, GCC binary conventions for C++ are based on a
+written, vendor-neutral C++ ABI that was designed to be specific to
+64-bit Itanium but also includes generic specifications that apply to
+any platform.
+This C++ ABI is also implemented by other compiler vendors on some
+platforms, notably GNU/Linux and BSD systems.
+We have tried hard to provide a stable ABI that will be compatible with
+future GCC releases, but it is possible that we will encounter problems
+that make this difficult. Such problems could include different
+interpretations of the C++ ABI by different vendors, bugs in the ABI, or
+bugs in the implementation of the ABI in different compilers.
+GCC's @code{-Wabi} switch warns when G++ generates code that is
+probably not compatible with the C++ ABI@.
+
+The C++ library used with a C++ compiler includes the Standard C++
+Library, with functionality defined in the C++ Standard, plus language
+runtime support. The runtime support is included in a C++ ABI, but there
+is no formal ABI for the Standard C++ Library. Two implementations
+of that library are interoperable if one follows the de-facto ABI of the
+other and if they are both built with the same compiler, or with compilers
+that conform to the same ABI for C++ compiler and runtime support.
+
+When G++ and another C++ compiler conform to the same C++ ABI, but the
+implementations of the Standard C++ Library that they normally use do not
+follow the same ABI for the Standard C++ Library, object files built with
+those compilers can be used in the same program only if they use the same
+C++ library. This requires specifying the location of the C++ library
+header files when invoking the compiler whose usual library is not being
+used. The location of GCC's C++ header files depends on how the GCC
+build was configured, but can be seen by using the G++ @option{-v} option.
+With default configuration options for G++ 3.3 the compile line for a
+different C++ compiler needs to include
+
+@example
+ -I@var{gcc_install_directory}/include/c++/3.3
+@end example
+
+Similarly, compiling code with G++ that must use a C++ library other
+than the GNU C++ library requires specifying the location of the header
+files for that other library.
+
+The most straightforward way to link a program to use a particular
+C++ library is to use a C++ driver that specifies that C++ library by
+default. The @command{g++} driver, for example, tells the linker where
+to find GCC's C++ library (@file{libstdc++}) plus the other libraries
+and startup files it needs, in the proper order.
+
+If a program must use a different C++ library and it's not possible
+to do the final link using a C++ driver that uses that library by default,
+it is necessary to tell @command{g++} the location and name of that
+library. It might also be necessary to specify different startup files
+and other runtime support libraries, and to suppress the use of GCC's
+support libraries with one or more of the options @option{-nostdlib},
+@option{-nostartfiles}, and @option{-nodefaultlibs}.
diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi
index 71f0d870f48..bc237c7729d 100644
--- a/gcc/doc/cpp.texi
+++ b/gcc/doc/cpp.texi
@@ -1972,6 +1972,10 @@ unsigned on the target machine. It exists to cause the standard header
file @file{limits.h} to work correctly. You should not use this macro
yourself; instead, refer to the standard macros defined in @file{limits.h}.
+@item __WCHAR_UNSIGNED__
+Like @code{__CHAR_UNSIGNED__}, this macro is defined if and only if the
+data type @code{wchar_t} is unsigned and the front-end is in C++ mode.
+
@item __REGISTER_PREFIX__
This macro expands to a single token (not a string constant) which is
the prefix applied to CPU register names in assembly language for this
@@ -2002,14 +2006,35 @@ typedefs, respectively. They exist to make the standard header files
these macros directly; instead, include the appropriate headers and use
the typedefs.
+@item __CHAR_BIT__
+Defined to the number of bits used in the representation of the
+@code{char} data type. It exists to make the standard header given
+numerical limits work correctly. You should not use
+this macro directly; instead, include the appropriate headers.
+
+@item __SCHAR_MAX__
+@itemx __WCHAR_MAX__
+@itemx __SHRT_MAX__
+@itemx __INT_MAX__
+@itemx __LONG_MAX__
+@itemx __LONG_LONG_MAX__
+Defined to the maximum value of the @code{signed char}, @code{wchar_t},
+@code{signed short},
+@code{signed int}, @code{signed long}, and @code{signed long long} types
+respectively. They exist to make the standard header given numerical limits
+work correctly. You should not use these macros directly; instead, include
+the appropriate headers.
+
@item __USING_SJLJ_EXCEPTIONS__
This macro is defined, with value 1, if the compiler uses the old
mechanism based on @code{setjmp} and @code{longjmp} for exception
handling.
@item __NEXT_RUNTIME__
-This macro is defined, with value 1, when the NeXT runtime
-(as in @option{-fnext-runtime}) is in use for Objective-C.
+This macro is defined, with value 1, if (and only if) the NeXT runtime
+(as in @option{-fnext-runtime}) is in use for Objective-C. If the GNU
+runtime is used, this macro is not defined, so that you can use this
+macro to determine which runtime (NeXT or GNU) is being used.
@end table
@node System-specific Predefined Macros
@@ -3581,11 +3606,11 @@ including extensions, with the exception that the effects of
__STDC__ is not defined.
@item
-If you use digraphs the behaviour is undefined.
+If you use digraphs the behavior is undefined.
@item
If a line that looks like a directive appears within macro arguments,
-the behaviour is undefined.
+the behavior is undefined.
@end itemize
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index e2265eb9bd6..74fe8be5b7d 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -600,10 +600,10 @@ standard-conforming modes it converts them. See the @option{-std} and
The nine trigraphs and their replacements are
-@example
+@smallexample
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??-
Replacement: [ ] @{ @} # \ ^ | ~
-@end example
+@end smallexample
@end ifclear
@item -remap
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 32fabae5ccf..0b60c60454a 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -427,7 +427,6 @@ extensions, accepted by GCC in C89 mode and in C++.
* Labels as Values:: Getting pointers to labels, and computed gotos.
* Nested Functions:: As in Algol and Pascal, lexical scoping of functions.
* Constructing Calls:: Dispatching a call to another function.
-* Naming Types:: Giving a name to the type of some expression.
* Typeof:: @code{typeof}: referring to the type of an expression.
* Lvalues:: Using @samp{?:}, @samp{,} and casts in lvalues.
* Conditionals:: Omitting the middle operand of a @samp{?:} expression.
@@ -538,8 +537,7 @@ the value of an enumeration constant, the width of a bit-field, or
the initial value of a static variable.
If you don't know the type of the operand, you can still do this, but you
-must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming
-Types}).
+must use @code{typeof} (@pxref{Typeof}).
Statement expressions are not supported fully in G++, and their fate
there is unclear. (It is possible that they will become fully supported
@@ -782,7 +780,7 @@ GCC implements taking the address of a nested function using a technique
called @dfn{trampolines}. A paper describing them is available as
@noindent
-@uref{http://people.debian.org/~karlheg/Usenix88-lexic.pdf}.
+@uref{http://people.debian.org/~aaronl/Usenix88-lexic.pdf}.
A nested function can jump to a label inherited from a containing
function, provided the label was explicitly declared in the containing
@@ -888,29 +886,6 @@ the containing function. You should specify, for @var{result}, a value
returned by @code{__builtin_apply}.
@end deftypefn
-@node Naming Types
-@section Naming an Expression's Type
-@cindex naming types
-
-You can give a name to the type of an expression using a @code{typedef}
-declaration with an initializer. Here is how to define @var{name} as a
-type name for the type of @var{exp}:
-
-@example
-typedef @var{name} = @var{exp};
-@end example
-
-This is useful in conjunction with the statements-within-expressions
-feature. Here is how the two together can be used to define a safe
-``maximum'' macro that operates on any arithmetic type:
-
-@example
-#define max(a,b) \
- (@{typedef _ta = (a), _tb = (b); \
- _ta _a = (a); _tb _b = (b); \
- _a > _b ? _a : _b; @})
-@end example
-
@cindex underscores in variables in macros
@cindex @samp{_} in variables in macros
@cindex local variables in macros
@@ -962,6 +937,21 @@ A @code{typeof}-construct can be used anywhere a typedef name could be
used. For example, you can use it in a declaration, in a cast, or inside
of @code{sizeof} or @code{typeof}.
+@code{typeof} is often useful in conjunction with the
+statements-within-expressions feature. Here is how the two together can
+be used to define a safe ``maximum'' macro that operates on any
+arithmetic type and evaluates each of its arguments exactly once:
+
+@example
+#define max(a,b) \
+ (@{ typeof (a) _a = (a); \
+ typeof (b) _b = (b); \
+ _a > _b ? _a : _b; @})
+@end example
+
+@noindent
+Some more examples of the use of @code{typeof}:
+
@itemize @bullet
@item
This declares @code{y} with the type of what @code{x} points to.
@@ -1011,6 +1001,26 @@ Thus, @code{array (pointer (char), 4)} is the type of arrays of 4
pointers to @code{char}.
@end itemize
+@emph{Compatibility Note:} In addition to @code{typeof}, GCC 2 supported
+a more limited extension which permitted one to write
+
+@example
+typedef @var{T} = @var{expr};
+@end example
+
+@noindent
+with the effect of declaring @var{T} to have the type of the expression
+@var{expr}. This extension does not work with GCC 3 (versions between
+3.0 and 3.2 will crash; 3.2.1 and later give an error). Code which
+relies on it should be rewritten to use @code{typeof}:
+
+@example
+typedef typeof(@var{expr}) @var{T};
+@end example
+
+@noindent
+This will work with all versions of GCC@.
+
@node Lvalues
@section Generalized Lvalues
@cindex compound expressions as lvalues
@@ -1445,9 +1455,9 @@ variable number of arguments much as a function can. The syntax for
defining the macro is similar to that of a function. Here is an
example:
-@example
+@smallexample
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
-@end example
+@end smallexample
Here @samp{@dots{}} is a @dfn{variable argument}. In the invocation of
such a macro, it represents the zero or more tokens until the closing
@@ -1486,9 +1496,9 @@ string.
To help solve this problem, CPP behaves specially for variable arguments
used with the token paste operator, @samp{##}. If instead you write
-@example
+@smallexample
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
-@end example
+@end smallexample
and if the variable arguments are omitted or empty, the @samp{##}
operator causes the preprocessor to remove the comma before it. If you
@@ -1798,9 +1808,9 @@ nested subobject to initialize; the list is taken relative to the
subobject corresponding to the closest surrounding brace pair. For
example, with the @samp{struct point} declaration above:
-@example
+@smallexample
struct point ptarray[10] = @{ [2].y = yv2, [2].x = xv2, [0].x = xv0 @};
-@end example
+@end smallexample
@noindent
If the same field is initialized multiple times, it will have value from
@@ -2332,6 +2342,15 @@ since it is known that the calling function loaded the correct value.
Not all ELF targets support this attribute.
+@item tls_model ("@var{tls_model}")
+@cindex @code{tls_model} attribute
+The @code{tls_model} attribute sets thread-local storage model
+(@pxref{Thread-Local}) of a particular @code{__thread} variable,
+overriding @code{-ftls-model=} command line switch on a per-variable
+basis.
+The @var{tls_model} argument should be one of @code{global-dynamic},
+@code{local-dynamic}, @code{initial-exec} or @code{local-exec}.
+
@item regparm (@var{number})
@cindex functions that are passed arguments in registers on the 386
On the Intel 386, the @code{regparm} attribute causes the compiler to
@@ -3235,7 +3254,7 @@ typedef int more_aligned_int __attribute__ ((aligned (8)));
@noindent
force the compiler to insure (as far as it can) that each variable whose
type is @code{struct S} or @code{more_aligned_int} will be allocated and
-aligned @emph{at least} on a 8-byte boundary. On a Sparc, having all
+aligned @emph{at least} on a 8-byte boundary. On a SPARC, having all
variables of type @code{struct S} aligned to 8-byte boundaries allows
the compiler to use the @code{ldd} and @code{std} (doubleword load and
store) instructions when copying one variable of type @code{struct S} to
@@ -3420,7 +3439,7 @@ any other type of objects, just like the @code{char} type. See
Example of use:
-@example
+@smallexample
typedef short __attribute__((__may_alias__)) short_a;
int
@@ -3436,7 +3455,7 @@ main (void)
exit(0);
@}
-@end example
+@end smallexample
If you replaced @code{short_a} with @code{short} in the variable
declaration, the above program would abort when compiled with
@@ -3700,7 +3719,10 @@ asm volatile ("movc3 %0,%1,%2"
You may not write a clobber description in a way that overlaps with an
input or output operand. For example, you may not have an operand
describing a register class with one member if you mention that register
-in the clobber list. There is no way for you to specify that an input
+in the clobber list. Variables declared to live in specific registers
+(@pxref{Explicit Reg Vars}), and used as asm input or output operands must
+have no part mentioned in the clobber description.
+There is no way for you to specify that an input
operand is modified without also specifying it as an output
operand. Note that if all the output operands you specify are for this
purpose (and hence unused), you will then also need to specify
@@ -4140,7 +4162,7 @@ being used for other purposes in the preceding functions.
Global register variables may not have initial values, because an
executable file has no means to supply initial contents for a register.
-On the Sparc, there are reports that g3 @dots{} g7 are suitable
+On the SPARC, there are reports that g3 @dots{} g7 are suitable
registers, but certain library functions, such as @code{getwd}, as well
as the subroutines for division and remainder, modify g3 and g4. g1 and
g2 are local temporaries.
@@ -4421,9 +4443,6 @@ A floating point value, as wide as a SI mode integer, usually 32 bits.
A floating point value, as wide as a DI mode integer, usually 64 bits.
@end table
-There are no @code{V1xx} vector modes - they would be identical to the
-corresponding base mode.
-
Specifying a combination that is not valid for the current architecture
will cause gcc to synthesize the instructions using a narrower mode.
For example, if you specify a variable of type @code{V4SI} and your
@@ -4688,13 +4707,15 @@ as @var{exp2}.
Example:
@smallexample
-#define foo(x) \
- __builtin_choose_expr (__builtin_types_compatible_p (typeof (x), double), \
- foo_double (x), \
- __builtin_choose_expr (__builtin_types_compatible_p (typeof (x), float), \
- foo_float (x), \
- /* @r{The void expression results in a compile-time error} \
- @r{when assigning the result to something.} */ \
+#define foo(x) \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), double), \
+ foo_double (x), \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), float), \
+ foo_float (x), \
+ /* @r{The void expression results in a compile-time error} \
+ @r{when assigning the result to something.} */ \
(void)0))
@end smallexample
@@ -4831,6 +4852,74 @@ is evaluated if it includes side effects but no other code is generated
and GCC does not issue a warning.
@end deftypefn
+@deftypefn {Built-in Function} double __builtin_huge_val (void)
+Returns a positive infinity, if supported by the floating-point format,
+else @code{DBL_MAX}. This function is suitable for implementing the
+ISO C macro @code{HUGE_VAL}.
+@end deftypefn
+
+@deftypefn {Built-in Function} float __builtin_huge_valf (void)
+Similar to @code{__builtin_huge_val}, except the return type is @code{float}.
+@end deftypefn
+
+@deftypefn {Built-in Function} long double __builtin_huge_vall (void)
+Similar to @code{__builtin_huge_val}, except the return
+type is @code{long double}.
+@end deftypefn
+
+@deftypefn {Built-in Function} double __builtin_inf (void)
+Similar to @code{__builtin_huge_val}, except a warning is generated
+if the target floating-point format does not support infinities.
+This function is suitable for implementing the ISO C99 macro @code{INFINITY}.
+@end deftypefn
+
+@deftypefn {Built-in Function} float __builtin_inff (void)
+Similar to @code{__builtin_inf}, except the return type is @code{float}.
+@end deftypefn
+
+@deftypefn {Built-in Function} long double __builtin_infl (void)
+Similar to @code{__builtin_inf}, except the return
+type is @code{long double}.
+@end deftypefn
+
+@deftypefn {Built-in Function} double __builtin_nan (const char *str)
+This is an implementation of the ISO C99 function @code{nan}.
+
+Since ISO C99 defines this function in terms of @code{strtod}, which we
+do not implement, a desription of the parsing is in order. The string
+is parsed as by @code{strtol}; that is, the base is recognized by
+leading @samp{0} or @samp{0x} prefixes. The number parsed is placed
+in the significand such that the least significant bit of the number
+is at the least significant bit of the significand. The number is
+truncated to fit the significand field provided. The significand is
+forced to be a quiet NaN.
+
+This function, if given a string literal, is evaluated early enough
+that it is considered a compile-time constant.
+@end deftypefn
+
+@deftypefn {Built-in Function} float __builtin_nanf (const char *str)
+Similar to @code{__builtin_nan}, except the return type is @code{float}.
+@end deftypefn
+
+@deftypefn {Built-in Function} long double __builtin_nanl (const char *str)
+Similar to @code{__builtin_nan}, except the return type is @code{long double}.
+@end deftypefn
+
+@deftypefn {Built-in Function} double __builtin_nans (const char *str)
+Similar to @code{__builtin_nan}, except the significand is forced
+to be a signaling NaN. The @code{nans} function is proposed by
+@uref{http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n965.htm,,WG14 N965}.
+@end deftypefn
+
+@deftypefn {Built-in Function} float __builtin_nansf (const char *str)
+Similar to @code{__builtin_nans}, except the return type is @code{float}.
+@end deftypefn
+
+@deftypefn {Built-in Function} long double __builtin_nansl (const char *str)
+Similar to @code{__builtin_nans}, except the return type is @code{long double}.
+@end deftypefn
+
@node Target Builtins
@section Built-in Functions Specific to Particular Target Machines
@@ -5049,14 +5138,10 @@ v4si __builtin_ia32_cmpordps (v4sf, v4sf)
v4si __builtin_ia32_cmpeqss (v4sf, v4sf)
v4si __builtin_ia32_cmpltss (v4sf, v4sf)
v4si __builtin_ia32_cmpless (v4sf, v4sf)
-v4si __builtin_ia32_cmpgtss (v4sf, v4sf)
-v4si __builtin_ia32_cmpgess (v4sf, v4sf)
v4si __builtin_ia32_cmpunordss (v4sf, v4sf)
v4si __builtin_ia32_cmpneqss (v4sf, v4sf)
v4si __builtin_ia32_cmpnlts (v4sf, v4sf)
v4si __builtin_ia32_cmpnless (v4sf, v4sf)
-v4si __builtin_ia32_cmpngtss (v4sf, v4sf)
-v4si __builtin_ia32_cmpngess (v4sf, v4sf)
v4si __builtin_ia32_cmpordss (v4sf, v4sf)
v4sf __builtin_ia32_maxps (v4sf, v4sf)
v4sf __builtin_ia32_maxss (v4sf, v4sf)
@@ -6745,12 +6830,12 @@ the minimum value of variables @var{i} and @var{j}.
However, side effects in @code{X} or @code{Y} may cause unintended
behavior. For example, @code{MIN (i++, j++)} will fail, incrementing
-the smaller counter twice. A GNU C extension allows you to write safe
-macros that avoid this kind of problem (@pxref{Naming Types,,Naming an
-Expression's Type}). However, writing @code{MIN} and @code{MAX} as
-macros also forces you to use function-call notation for a
-fundamental arithmetic operation. Using GNU C++ extensions, you can
-write @w{@samp{int min = i <? j;}} instead.
+the smaller counter twice. The GNU C @code{typeof} extension allows you
+to write safe macros that avoid this kind of problem (@pxref{Typeof}).
+However, writing @code{MIN} and @code{MAX} as macros also forces you to
+use function-call notation for a fundamental arithmetic operation.
+Using GNU C++ extensions, you can write @w{@samp{int min = i <? j;}}
+instead.
Since @code{<?} and @code{>?} are built into the compiler, they properly
handle expressions with side-effects; @w{@samp{int min = i++ <? j++;}}
@@ -7289,10 +7374,10 @@ inclusive. Lower numbers indicate a higher priority.
In the following example, @code{A} would normally be created before
@code{B}, but the @code{init_priority} attribute has reversed that order:
-@example
+@smallexample
Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
-@end example
+@end smallexample
@noindent
Note that the particular values of @var{priority} do not matter; only their
@@ -7318,7 +7403,7 @@ appropriately. However, if C++ code only needs to execute destructors
when Java exceptions are thrown through it, GCC will guess incorrectly.
Sample problematic code is:
-@example
+@smallexample
struct S @{ ~S(); @};
extern void bar(); // is written in Java, and may throw exceptions
void foo()
@@ -7326,7 +7411,7 @@ Sample problematic code is:
S s;
bar();
@}
-@end example
+@end smallexample
@noindent
The usual effect of an incorrect guess is a link failure, complaining of
@@ -7383,7 +7468,7 @@ Floating and complex non-type template parameters have been deprecated,
and are now removed from g++.
The implicit typename extension has been deprecated and will be removed
-from g++ at some point. In some cases g++ determines that a dependant
+from g++ at some point. In some cases g++ determines that a dependent
type such as @code{TPL<T>::X} is a type without needing a
@code{typename} keyword, contrary to the standard.
diff --git a/gcc/doc/gcc.texi b/gcc/doc/gcc.texi
index 4e9f2b701da..1e9fcf48e18 100644
--- a/gcc/doc/gcc.texi
+++ b/gcc/doc/gcc.texi
@@ -164,6 +164,7 @@ Introduction, gccint, GNU Compiler Collection (GCC) Internals}.
* C Extensions:: GNU extensions to the C language family.
* C++ Extensions:: GNU extensions to the C++ language.
* Objective-C:: GNU Objective-C runtime features.
+* Compatibility:: Binary Compatibility
* Gcov:: gcov: a GCC test coverage program.
* Trouble:: If you have trouble using GCC.
* Bugs:: How, why and where to report bugs.
@@ -188,6 +189,7 @@ Introduction, gccint, GNU Compiler Collection (GCC) Internals}.
@include invoke.texi
@include extend.texi
@include objc.texi
+@include compat.texi
@include gcov.texi
@include trouble.texi
@include bugreport.texi
diff --git a/gcc/doc/gcov.texi b/gcc/doc/gcov.texi
index 9c0ac11d420..e99d3ba00c9 100644
--- a/gcc/doc/gcov.texi
+++ b/gcc/doc/gcov.texi
@@ -389,114 +389,23 @@ many times the result was 1.
@node Gcov Data Files
@section Brief description of @command{gcov} data files
-@command{gcov} uses three files for doing profiling. The names of these
-files are derived from the original @emph{source} file by substituting
-the file suffix with either @file{.bb}, @file{.bbg}, or @file{.da}. All
-of these files are placed in the same directory as the source file, and
-contain data stored in a platform-independent method.
-
-The @file{.bb} and @file{.bbg} files are generated when the source file
-is compiled with the GCC @option{-ftest-coverage} option. The
-@file{.bb} file contains a list of source files (including headers),
-functions within those files, and line numbers corresponding to each
-basic block in the source file.
-
-The @file{.bb} file format consists of several lists of 4-byte integers
-which correspond to the line numbers of each basic block in the file.
-Each list is terminated by a line number of 0. A line number of
-@minus{}1 is used to designate that the source file name (padded to a
-4-byte boundary and followed by another @minus{}1) follows. In
-addition, a line number of @minus{}2 is used to designate that the name
-of a function (also padded to a 4-byte boundary and followed by a
-@minus{}2) follows.
-
-The @file{.bbg} file is used to reconstruct the program flow graph for
-the source file. It contains a list of the program flow arcs (possible
-branches taken from one basic block to another) for each function which,
-in combination with the @file{.bb} file, enables gcov to reconstruct the
-program flow.
-
-In the @file{.bbg} file, the format is:
-@smallexample
- name of function #0
- checksum of function #0
- number of basic blocks for function #0 (4-byte number)
- total number of arcs for function #0 (4-byte number)
- count of arcs in basic block #0 (4-byte number)
- destination basic block of arc #0 (4-byte number)
- flag bits (4-byte number)
- destination basic block of arc #1 (4-byte number)
- flag bits (4-byte number)
- @dots{}
- destination basic block of arc #N (4-byte number)
- flag bits (4-byte number)
- count of arcs in basic block #1 (4-byte number)
- destination basic block of arc #0 (4-byte number)
- flag bits (4-byte number)
- @dots{}
-@end smallexample
-
-A @minus{}1 (stored as a 4-byte number) is used to separate each function's
-list of basic blocks, and to verify that the file has been read
-correctly.
-
-The function name is stored as a @minus{}1 (4 bytes), the length (4 bytes),
-the name itself (padded to 4-byte boundary) followed by a @minus{}1 (4 bytes).
+@command{gcov} uses two files for profiling. The names of these files
+are derived from the original @emph{object} file by substituting the
+file suffix with either @file{.bbg}, or @file{.da}. All of these files
+are placed in the same directory as the object file, and contain data
+stored in a platform-independent format.
-The flags are defined as follows:
-@itemize
-@item bit0
-On function spanning tree
-
-@item bit1
-Is a fake edge
-
-@item bit2
-Is the fall through edge from one block to its immediate successor.
-
-@item bit3-bit31
-For future expansion
-
-@end itemize
+The @file{.bbg} files is generated when the source file is compiled with
+the GCC @option{-ftest-coverage} option. It contains information to
+reconstruct the basic block graphs and assign source line numbers to
+blocks.
The @file{.da} file is generated when a program containing object files
built with the GCC @option{-fprofile-arcs} option is executed. A
-separate @file{.da} file is created for each source file compiled with
-this option, and the name of the @file{.da} file is stored as an
-absolute pathname in the resulting object file. This path name is
-derived from the object file name by substituting a @file{.da} suffix.
-
-The @file{.da} consists of one or more blocks with the following
-structure:
-@smallexample
- "magic" number @minus{}123 (4-byte number)
- number of functions (4-byte number)
- length of the "extension block" in bytes
- extension block (variable length)
- name of function #0 (the same format as in .bbg file)
- checksum of function #0
- number of instrumented arcs (4-byte number)
- count of arc #0 (8-byte number)
- count of arc #1 (8-byte number)
- @dots{}
- count of arc #M_0 (8-byte number)
- name of function #1 (the same format as in .bbg file)
- checksum of function #1
- @dots{}
-@end smallexample
-Multiple program runs might merge data into a single block, or might
-append a new block. The current structure of the extension block is as
-follows:
-@smallexample
- number of instrumented arcs in whole program (4-byte number)
- sum all of instrumented arcs in whole program (8-byte number)
- maximal value of counter in whole program (8-byte number)
- number of instrumented arcs in the object file (4-byte number)
- sum all of instrumented arcs in the object file (8-byte number)
- maximal value of counter in the object file (8-byte number)
-@end smallexample
-
-All three of these files use the functions in @file{gcov-io.h} to store
-integers; the functions in this header provide a machine-independent
-mechanism for storing and retrieving data from a stream.
+separate @file{.da} file is created for each object file compiled with
+this option. It contains arc transition counts, and some summary
+information.
+The full details of the file format is specified in @file{gcov-io.h},
+and functions provided in that header file should be used to access the
+coverage files.
diff --git a/gcc/doc/gty.texi b/gcc/doc/gty.texi
index f854b804047..e0d9a33cde6 100644
--- a/gcc/doc/gty.texi
+++ b/gcc/doc/gty.texi
@@ -72,6 +72,10 @@ immediately contains the current structure.
@item %0
This expands to an expression that evaluates to the outermost structure
that contains the current structure.
+@item %a
+This expands to the string of the form @code{[i1][i2]...} that indexes
+the array item currently being marked. For instance, if the field
+being marked is @code{foo}, then @code{%1.foo%a} is the same as @code{%h}.
@end table
The available options are:
@@ -95,18 +99,21 @@ option is a fragment of C code that calculates the length.
The second case is when a structure or a global variable contains a
pointer to an array, like this:
-@verbatim
- tree * GTY ((length ("%h.regno_pointer_align_length"))) regno_decl;
-@end verbatim
+@smallexample
+tree *
+ GTY ((length ("%h.regno_pointer_align_length"))) regno_decl;
+@end smallexample
In this case, @code{regno_decl} has been allocated by writing something like
-@verbatim
- x->regno_decl = ggc_alloc (x->regno_pointer_align_length * sizeof (tree));
-@end verbatim
+@smallexample
+ x->regno_decl =
+ ggc_alloc (x->regno_pointer_align_length * sizeof (tree));
+@end smallexample
and the @code{length} provides the length of the field.
This second use of @code{length} also works on global variables, like:
@verbatim
-static GTY((length ("reg_base_value_size"))) rtx *reg_base_value;
+ static GTY((length ("reg_base_value_size")))
+ rtx *reg_base_value;
@end verbatim
@findex skip
@@ -118,32 +125,34 @@ field really isn't ever used.
@findex desc
@findex tag
-@findex always
+@findex default
@item desc
@itemx tag
-@itemx always
+@itemx default
The type machinery needs to be told which field of a @code{union} is
currently active. This is done by giving each field a constant @code{tag}
value, and then specifying a discriminator using @code{desc}. For example,
-@verbatim
+@smallexample
struct tree_binding GTY(())
-{
+@{
struct tree_common common;
- union tree_binding_u {
+ union tree_binding_u @{
tree GTY ((tag ("0"))) scope;
struct cp_binding_level * GTY ((tag ("1"))) level;
- } GTY ((desc ("BINDING_HAS_LEVEL_P ((tree)&%0)"))) scope;
+ @} GTY ((desc ("BINDING_HAS_LEVEL_P ((tree)&%0)"))) scope;
tree value;
-};
-@end verbatim
+@};
+@end smallexample
In the @code{desc} option, the ``current structure'' is the union that
it discriminates. Use @code{%1} to mean the structure containing it.
(There are no escapes available to the @code{tag} option, since it's
supposed to be a constant.)
-You can use @code{always} to mean that this field is always used.
+Each @code{tag} should be different. If no @code{tag} is matched,
+the field marked with @code{default} is used if there is one, otherwise
+no field in the union will be marked.
@findex param_is
@findex use_param
@@ -151,15 +160,39 @@ You can use @code{always} to mean that this field is always used.
@itemx use_param
Sometimes it's convenient to define some data structure to work on
-generic pointers (that is, @code{PTR}), and then use it with specific types.
-@code{param_is} specifies the real type pointed to, and @code{use_param}
-says where in the generic data structure that type should be put.
+generic pointers (that is, @code{PTR}) and then use it with a specific
+type. @code{param_is} specifies the real type pointed to, and
+@code{use_param} says where in the generic data structure that type
+should be put.
For instance, to have a @code{htab_t} that points to trees, one should write
@verbatim
htab_t GTY ((param_is (union tree_node))) ict;
@end verbatim
+@findex param@var{n}_is
+@findex use_param@var{n}
+@item param@var{n}_is
+@itemx use_param@var{n}
+
+In more complicated cases, the data structure might need to work on
+several different types, which might not necessarily all be pointers.
+For this, @code{param1_is} through @code{param9_is} may be used to
+specify the real type of a field identified by @code{use_param1} through
+@code{use_param9}.
+
+@findex use_params
+@item use_params
+
+When a structure contains another structure that is parameterised,
+there's no need to do anything special, the inner stucture inherits the
+parameters of the outer one. When a structure contains a pointer to a
+parameterised structure, the type machinery won't automatically detect
+this (it could, it just doesn't yet), so it's necessary to tell it that
+the pointed-to structure should use the same parameters as the outer
+structure. This is done by marking the pointer with the
+@code{use_params} option.
+
@findex deletable
@item deletable
diff --git a/gcc/doc/install-old.texi b/gcc/doc/install-old.texi
index 7529362efd6..a322b631a92 100644
--- a/gcc/doc/install-old.texi
+++ b/gcc/doc/install-old.texi
@@ -34,9 +34,7 @@ See @ref{VMS Install}, for VMS systems.
If you have chosen a configuration for GNU CC which requires other GNU
tools (such as GAS or the GNU linker) instead of the standard system
tools, install the required tools in the build directory under the names
-@file{as}, @file{ld} or whatever is appropriate. This will enable the
-compiler to find the proper tools for compilation of the program
-@file{enquire}.
+@file{as}, @file{ld} or whatever is appropriate.
Alternatively, you can do subsequent compilation using a value of the
@code{PATH} environment variable such that the necessary GNU tools come
@@ -458,16 +456,6 @@ tar xf tarfile
Now you can proceed just as for compiling a single-machine compiler
through the step of building stage 1.
-If your target is exotic, you may need to provide the header file
-@file{float.h}.One way to do this is to compile @file{enquire} and run
-it on your target machine. The job of @file{enquire} is to run on the
-target machine and figure out by experiment the nature of its floating
-point representation. @file{enquire} records its findings in the header
-file @file{float.h}. If you can't produce this file by running
-@file{enquire} on the target machine, then you will need to come up with
-a suitable @file{float.h} in some other way (or else, avoid using it in
-your programs).
-
Do not try to build stage 2 for a cross-compiler. It doesn't work to
rebuild GNU CC as a cross-compiler using the cross-compiler, because
that would produce a program that runs on the target machine, not on the
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index b3b02fccb3c..b1e942e1846 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -191,7 +191,7 @@ not yet been merged into the main part of this manual.
@end ifhtml
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -245,7 +245,7 @@ components of the binutils you intend to build alongside the compiler
@file{opcodes}, @dots{}) to the directory containing the GCC sources.
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -362,7 +362,6 @@ subdirectory of @var{objdir} or vice versa.
These additional options control where certain parts of the distribution
are installed. Normally you should not need to use these options.
@table @code
-
@item --exec-prefix=@var{dirname}
Specify the toplevel installation directory for architecture-dependent
files. The default is @file{@var{prefix}}.
@@ -433,9 +432,9 @@ complex conversion patterns. As a basic rule, @var{prefix} (and
@var{suffix}) are prepended (appended) before further transformations
can happen with a special transformation script @var{pattern}.
-As currently implemented, this options only take effect for native
+As currently implemented, this option only takes effect for native
builds; cross compiler binaries' names are not transformed even when a
-transformation is explicitly asked for by one of this options.
+transformation is explicitly asked for by one of these options.
For native builds, some of the installed programs are also installed
with the target alias in front of their name, as in
@@ -513,7 +512,7 @@ The directory you use for @option{--with-local-prefix} @strong{must not}
contain any of the system's standard header files. If it did contain
them, certain programs would be miscompiled (including GNU Emacs, on
certain targets), because this would override and nullify the header
-file corrections made by the @code{fixincludes} script.
+file corrections made by the @command{fixincludes} script.
Indications are that people who use this option use it based on mistaken
ideas of what it is for. People use it as if it specified where to
@@ -551,15 +550,25 @@ configured with @option{--with-gnu-as}.) If you have more than one
assembler installed on your system, you may want to use this option in
connection with @option{--with-as=@var{pathname}}.
-The systems where it makes a difference whether you use the GNU assembler are
-@samp{hppa1.0-@var{any}-@var{any}}, @samp{hppa1.1-@var{any}-@var{any}},
-@samp{i386-@var{any}-sysv}, @samp{i386-@var{any}-isc},
-@samp{i860-@var{any}-bsd}, @samp{m68k-bull-sysv},
-@samp{m68k-hp-hpux}, @samp{m68k-sony-bsd},
-@samp{m68k-altos-sysv}, @samp{m68000-hp-hpux},
-@samp{m68000-att-sysv}, @samp{@var{any}-lynx-lynxos},
-and @samp{mips-@var{any}}.
-On any other system, @option{--with-gnu-as} has no effect.
+The following systems are the only ones where it makes a difference
+whether you use the GNU assembler. On any other system,
+@option{--with-gnu-as} has no effect.
+
+@itemize bullet
+@item @samp{hppa1.0-@var{any}-@var{any}}
+@item @samp{hppa1.1-@var{any}-@var{any}}
+@item @samp{i386-@var{any}-sysv}
+@item @samp{i386-@var{any}-isc}
+@item @samp{i860-@var{any}-bsd}
+@item @samp{m68k-bull-sysv}
+@item @samp{m68k-hp-hpux}
+@item @samp{m68k-sony-bsd}
+@item @samp{m68k-altos-sysv}
+@item @samp{m68000-hp-hpux}
+@item @samp{m68000-att-sysv}
+@item @samp{@var{any}-lynx-lynxos}
+@item @samp{mips-@var{any}}
+@end itemize
On the systems listed above (except for the HP-PA, for ISC on the
386, and for @samp{mips-sgi-irix5.*}), if you use the GNU assembler,
@@ -636,7 +645,6 @@ predefined set of them.
Some targets provide finer-grained control over which multilibs are built
(e.g., @option{--disable-softfloat}):
@table @code
-
@item arc-*-elf*
biendian.
@@ -873,18 +881,44 @@ forward to maintain the port.
Some options which only apply to building cross compilers:
@table @code
-@item --with-headers=@var{dir}
-Specifies a directory
-which has target include files.
-@emph{This options is required} when building a cross
-compiler, if @file{@var{prefix}/@var{target}/sys-include} doesn't pre-exist.
-These include files will be copied into the @file{gcc} install directory.
-Fixincludes will be run on these files to make them compatible with
-GCC.
-@item --with-libs=``@var{dir1} @var{dir2} @dots{} @var{dirN}''
+@item --with-sysroot
+@itemx --with-sysroot=@var{dir}
+Tells GCC to consider @var{dir} as the root of a tree that contains a
+(subset of) the root filesystem of the target operating system.
+Target system headers, libraries and run-time object files will be
+searched in there. The specified directory is not copied into the
+install tree, unlike the options @option{--with-headers} and
+@option{--with-libs} that this option obsoletes. The default value,
+in case @option{--with-sysroot} is not given an argument, is
+@option{$@{gcc_tooldir@}/sys-root}. Starting the pathname with
+@option{$@{gcc_tooldir@}/}, in such a way that this variable is not
+expanded by the shell, but rather by the gcc Makefile, enables the
+target sysroot directory to be relocatable along with the entire
+install tree, but it will require the gcc tool directory to be created
+@emph{before} the build is started. This directory, as well as its
+intermediate pathnames, can be easily created by running @command{make
+install-gcc-tooldir} the gcc build directory. This is not done
+automatically to avoid touching the install tree without explicit
+permission.
+
+@item --with-headers
+@itemx --with-headers=@var{dir}
+Deprecated in favor of @option{--with-sysroot}.
+Specifies that target headers are available when building a cross compiler.
+The @var{dir} argument specifies a directory which has the target include
+files. These include files will be copied into the @file{gcc} install
+directory. @emph{This option with the @var{dir} argument is required} when
+building a cross compiler, if @file{@var{prefix}/@var{target}/sys-include}
+doesn't pre-exist. If @file{@var{prefix}/@var{target}/sys-include} does
+pre-exist, the @var{dir} argument may be omitted. @command{fixincludes}
+will be run on these files to make them compatible with GCC.
+@item --with-libs
+@itemx --with-libs=``@var{dir1} @var{dir2} @dots{} @var{dirN}''
+Deprecated in favor of @option{--with-sysroot}.
Specifies a list of directories which contain the target runtime
libraries. These libraries will be copied into the @file{gcc} install
-directory.
+directory. If the directory list is omitted, this option has no
+effect.
@item --with-newlib
Specifies that @samp{newlib} is
being used as the target C library. This causes @code{__eprintf} to be
@@ -897,7 +931,7 @@ Note that each @option{--enable} option has a corresponding
corresponding @option{--without} option.
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -947,7 +981,7 @@ because you have previously configured the compiler in the source
directory. Make sure you have done all the necessary preparations.
If you build GCC on a BSD system using a directory stored in an old System
-V file system, problems may occur in running @code{fixincludes} if the
+V file system, problems may occur in running @command{fixincludes} if the
System V file system doesn't support symbolic links. These problems
result in a failure to fix the declaration of @code{size_t} in
@file{sys/types.h}. If you find that @code{size_t} is a signed type and
@@ -999,14 +1033,17 @@ bootstrap} except that object files from the stage1 and
stage2 of the 3-stage bootstrap of the compiler are deleted as
soon as they are no longer needed.
-
If you want to save additional space during the bootstrap and in
the final installation as well, you can build the compiler binaries
-without debugging information with @samp{make CFLAGS='-O' LIBCFLAGS='-g
--O2' LIBCXXFLAGS='-g -O2 -fno-implicit-templates' bootstrap}. This will save
+without debugging information as in the following example. This will save
roughly 40% of disk space both for the bootstrap and the final installation.
(Libraries will still contain debugging information.)
+@example
+ make CFLAGS='-O' LIBCFLAGS='-g -O2' \
+ LIBCXXFLAGS='-g -O2 -fno-implicit-templates' bootstrap
+@end example
+
If you wish to use non-default GCC flags when compiling the stage2 and
stage3 compilers, set @code{BOOT_CFLAGS} on the command line when doing
@samp{make bootstrap}. Non-default optimization flags are less well
@@ -1102,9 +1139,9 @@ 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,
-if you want to boostrap the compiler using a minimal version of GNAT,
+if you want to bootstrap the compiler using a minimal version of GNAT,
you have to issue the following commands before invoking @samp{make
-boostrap} (this assumes that you start with an unmodified and consistent
+bootstrap} (this assumes that you start with an unmodified and consistent
source distribution):
@example
@@ -1136,7 +1173,7 @@ Currently, when compiling the Ada front end, you cannot use the parallel
build feature described in the previous section.
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -1294,7 +1331,7 @@ few failing testcases are possible even on released versions and you
should look here first if you think your results are unreasonable.
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -1406,7 +1443,7 @@ Free Software Foundation}, though such manuals may not be for the most
recent version of GCC@.
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -1502,7 +1539,7 @@ bootstrapping the compiler. An updated version of that disk is in the
works.
@html
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -1641,9 +1678,9 @@ GNU Compiler Collection on your machine.
@item
@uref{#powerpcle-*-winnt,,powerpcle-*-winnt, powerpcle-*-pe}
@item
-@uref{#s390-*-linux*}
+@uref{#s390-*-linux*,,s390-*-linux*}
@item
-@uref{#s390x-*-linux*}
+@uref{#s390x-*-linux*,,s390x-*-linux*}
@item
@uref{#*-*-solaris2*,,*-*-solaris2*}
@item
@@ -1685,7 +1722,7 @@ GNU Compiler Collection on your machine.
@html
<!-- -------- host/target specific issues start here ---------------- -->
-<hr>
+<hr />
@end html
@heading @anchor{alpha*-*-*}alpha*-*-*
@@ -1700,8 +1737,7 @@ debugging information, not the least of which is incorrect linking of
shared libraries.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{alpha*-dec-osf*}alpha*-dec-osf*
Systems using processors that implement the DEC Alpha architecture and
@@ -1712,6 +1748,13 @@ As of GCC 3.2, versions before @code{alpha*-dec-osf4} are no longer
supported. (These are the versions which identify themselves as DEC
OSF/1.)
+In Digital Unix V4.0, virtual memory exhausted bootstrap failures
+may be fixed by configuring with @option{--with-gc=simple},
+reconfiguring Kernel Virtual Memory and Swap parameters
+per the @command{/usr/sbin/sys_check} Tuning Suggestions,
+or applying the patch in
+@uref{http://gcc.gnu.org/ml/gcc/2002-08/msg00822.html}.
+
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
@@ -1778,8 +1821,7 @@ DBX@. DEC is now aware of this problem with the assembler and hopes to
provide a fix shortly.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{alphaev5-cray-unicosmk*}alphaev5-cray-unicosmk*
Cray T3E systems running Unicos/Mk.
@@ -1795,8 +1837,10 @@ need to tell GCC where to find the assembler and the linker. The
simplest way to do so is by providing @option{--with-as} and
@option{--with-ld} to @file{configure}, e.g.@:
-@samp{configure --with-as=/opt/ctl/bin/cam --with-ld=/opt/ctl/bin/cld
---enable-languages=c}
+@example
+ configure --with-as=/opt/ctl/bin/cam --with-ld=/opt/ctl/bin/cld \
+ --enable-languages=c
+@end example
The comparison test during @samp{make bootstrap} fails on Unicos/Mk
because the assembler inserts timestamps into object files. You should
@@ -1804,16 +1848,14 @@ be able to work around this by doing @samp{make all} after getting this
failure.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{arc-*-elf}arc-*-elf
Argonaut ARC processor.
This configuration is intended for embedded systems.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{arm-*-aout}arm-*-aout
Advanced RISC Machines ARM-family processors. These are often used in
@@ -1825,23 +1867,20 @@ You may need to make a variant of the file @file{arm.h} for your particular
configuration.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{arm-*-elf}arm-*-elf
This configuration is intended for embedded systems.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{arm*-*-linux-gnu}arm*-*-linux-gnu
We require GNU binutils 2.10 or newer.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{avr}avr
@@ -1878,8 +1917,7 @@ The following error:
indicates that you should upgrade to a newer version of the binutils.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{c4x}c4x
@@ -1909,8 +1947,7 @@ can also be obtained from:
@end itemize
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{cris}CRIS
@@ -1948,8 +1985,7 @@ information about this platform is available at
@uref{http://developer.axis.com/}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{dos}DOS
@@ -1961,15 +1997,13 @@ compilation package DJGPP, which includes binaries as well as sources,
and includes all the necessary compilation tools and libraries.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{dsp16xx}dsp16xx
A port to the AT&T DSP1610 family of processors.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{*-*-freebsd*}*-*-freebsd*
@@ -1999,15 +2033,17 @@ results on FreeBSD 3.0, 3.4, 4.0, 4.2, 4.3, 4.4, 4.5-STABLE and 5-CURRENT@.
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
+and tested on @samp{i386-*-freebsd4.5} and @samp{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
+intervention: @command{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
+@samp{i386-*-freebsd*} and rerun the top-level @command{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.
@@ -2015,8 +2051,7 @@ the very least, both boehm-gc and libffi.
Shared @file{libgcc_s.so} is now built and installed by default.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{h8300-hms}h8300-hms
Hitachi H8/300 series of processors.
@@ -2029,14 +2064,14 @@ first three arguments in function calls in registers. Structures are no
longer a multiple of 2 bytes.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{hppa*-hp-hpux*}hppa*-hp-hpux*
We @emph{highly} recommend using gas/binutils 2.8 or newer on all hppa
platforms; you may encounter a variety of problems when using the HP
-assembler.
+assembler. The HP assembler does not work with the @samp{hppa64-hp-hpux11*}
+port.
Specifically, @option{-g} does not work on HP-UX (since that system
uses a peculiar debugging format which GCC does not know about), unless you
@@ -2044,8 +2079,9 @@ use GAS and GDB and configure GCC with the
@uref{./configure.html#with-gnu-as,,@option{--with-gnu-as}} and
@option{--with-as=@dots{}} options.
-If you wish to use pa-risc 2.0 architecture support, you must use either
-the HP assembler, gas/binutils 2.11 or a recent
+If you wish to use the pa-risc 2.0 architecture support with a 32-bit
+runtime, you must use either the HP assembler, gas/binutils 2.11 or newer,
+or a recent
@uref{ftp://sources.redhat.com/pub/binutils/snapshots,,snapshot of gas}.
There are two default scheduling models for instructions. These are
@@ -2063,8 +2099,7 @@ default scheduling model is desired.
More specific information to @samp{hppa*-hp-hpux*} targets follows.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{hppa*-hp-hpux9}hppa*-hp-hpux9
@@ -2080,8 +2115,7 @@ and @env{SHELL} to @file{/bin/ksh} in your environment.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{hppa*-hp-hpux10}hppa*-hp-hpux10
@@ -2112,31 +2146,53 @@ bootstrap}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{hppa*-hp-hpux11}hppa*-hp-hpux11
-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 3.0 and up support HP-UX 11. On 64-bit capable systems, there
+are two distinct ports. The @samp{hppa2.0w-hp-hpux11*} port generates
+code for the 32-bit pa-risc runtime architecture. It uses the HP
+linker and is currently the default selected by config.guess. The
+optional @samp{hppa64-hp-hpux11*} port generates 64-bit code for the
+pa-risc 2.0 architecture. It must be explicitly selected using the
+@samp{--host=hppa64-hp-hpux11*} configure option. Different prefixes
+must be used if both ports are to be installed on the same system.
+
+You must use GNU binutils 2.11 or above with the 32-bit port. Thread
+support is not currently implemented, so @option{--enable-threads} does
+not work. See:
+
+@itemize
+@item @uref{http://gcc.gnu.org/ml/gcc-prs/2002-01/msg00551.html}
+@item @uref{http://gcc.gnu.org/ml/gcc-bugs/2002-01/msg00663.html}
+@end itemize
+
GCC 2.95.x is not supported under HP-UX 11 and cannot be used to
compile GCC 3.0 and up. Refer to @uref{binaries.html,,binaries} for
information about obtaining precompiled GCC binaries for HP-UX.
+GNU binutils 2.13 or later is recommended with the 64-bit port.
+The HP assembler is not supported. It is @emph{highly} recommended
+that the GNU linker be used as well. Either binutils must be built
+prior to gcc, or a binary distribution of gcc or binutils must be
+obtained for the initial builds. When starting with a HP compiler,
+it is preferable to use the ANSI compiler as the bundled compiler
+only supports traditional C. Bootstrapping with the bundled compiler
+is tested infrequently and problems often arise because of the subtle
+differences in semantics between traditional and ISO C. There also
+have been problems reported with various binary distributions. This
+port still is undergoing significant development.
+
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{i370-*-*}i370-*-*
This port is very preliminary and has many known bugs. We hope to
have a higher-quality port for this machine soon.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{*-*-linux-gnu}*-*-linux-gnu
@@ -2146,7 +2202,6 @@ The patch @uref{glibc-2.2.patch,,glibc-2.2.patch}, that is to be
applied in the GCC source tree, fixes the compatibility problems.
@html
-</p>
@end html
@html
@@ -2163,8 +2218,7 @@ glibc 2.2.4 whether patches for GCC 3.0 are needed. You can use glibc
2.2.3 with GCC 3.0, just do not try to recompile it.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ix86-*-linux*aout}i?86-*-linux*aout
Use this configuration to generate @file{a.out} binaries on Linux-based
@@ -2172,8 +2226,7 @@ GNU systems. This configuration is being superseded. You must use
gas/binutils version 2.5.2 or later.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ix86-*-linux*}i?86-*-linux*
@@ -2184,23 +2237,20 @@ possible you have a hardware problem. Further information on this can be
found on @uref{http://www.bitwizard.nl/sig11/,,www.bitwizard.nl}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ix86-*-sco}i?86-*-sco
Compilation with RCC is recommended. Also, it may be a good idea to
link with GNU malloc instead of the malloc that comes with the system.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ix86-*-sco3.2v4}i?86-*-sco3.2v4
Use this configuration for SCO release 3.2 version 4.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ix86-*-sco3.2v5*}i?86-*-sco3.2v5*
Use this for the SCO OpenServer Release 5 family of operating systems.
@@ -2275,8 +2325,7 @@ engineering and will hopefully be addressed in later releases.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ix86-*-udk}i?86-*-udk
@@ -2295,8 +2344,10 @@ from the right place) while making the tools not think we're actually
building a cross compiler. The easiest way to do this is with a configure
command like this:
-@samp{CC=/udk/usr/ccs/bin/cc @var{/your/path/to}/gcc/configure
---host=i686-pc-udk --target=i686-pc-udk --program-prefix=udk-}
+@example
+ CC=/udk/usr/ccs/bin/cc @var{/your/path/to}/gcc/configure \
+ --host=i686-pc-udk --target=i686-pc-udk --program-prefix=udk-
+@end example
@emph{You should substitute @samp{i686} in the above command with the appropriate
processor for your host.}
@@ -2310,8 +2361,7 @@ have installed.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ia64-*-linux}ia64-*-linux
IA-64 processor (also known as IPF, or Itanium Processor Family)
@@ -2335,8 +2385,7 @@ GCC 3.0.2 is believed to be fully ABI compliant, and hence no more major
ABI changes are expected.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{*-lynx-lynxos}*-lynx-lynxos
LynxOS 2.2 and earlier comes with GCC 1.x already installed as
@@ -2347,8 +2396,7 @@ COFF format object files and executables; otherwise GCC will use the
installed tools, which produce @file{a.out} format executables.
@html
-</p>
-<hr>
+<hr />
<!-- rs6000-ibm-aix*, powerpc-ibm-aix* -->
@end html
@heading @anchor{*-ibm-aix*}*-ibm-aix*
@@ -2368,8 +2416,8 @@ If this error occurs during stage2 or later, then the problem most likely
is the version of Make (see above).
The GNU Assembler incorrectly reports that it supports WEAK symbols on
-AIX which causes GCC to try to utilize weak symbol functionality which
-is not really supported on the platform. The native @command{as} and
+AIX which causes GCC to try to utilize weak symbol functionality although
+it is not supported on the platform. The native @command{as} and
@command{ld} still are recommended. The native AIX tools do
interoperate with GCC@.
@@ -2457,8 +2505,7 @@ A default can be specified with the @option{-mcpu=@var{cpu_type}}
switch and using the configure option @option{--with-cpu-@var{cpu_type}}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{ip2k-*-elf}ip2k-*-elf
Ubicom IP2022 micro controller.
@@ -2468,16 +2515,14 @@ There are no standard Unix configurations.
Use @samp{configure --target=ip2k-elf --enable-languages=c} to configure GCC@.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m32r-*-elf}m32r-*-elf
Mitsubishi M32R processor.
This configuration is intended for embedded systems.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68000-hp-bsd}m68000-hp-bsd
HP 9000 series 200 running BSD@. Note that the C compiler that comes
@@ -2485,24 +2530,21 @@ with this system cannot compile GCC; contact @email{law@@cygnus.com}
to get binaries of GCC for bootstrapping.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m6811-elf}m6811-elf
Motorola 68HC11 family micro controllers. These are used in embedded
applications. There are no standard Unix configurations.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m6812-elf}m6812-elf
Motorola 68HC12 family micro controllers. These are used in embedded
applications. There are no standard Unix configurations.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68k-att-sysv}m68k-att-sysv
AT&T 3b1, a.k.a.@: 7300 PC@. This version of GCC cannot
@@ -2512,8 +2554,7 @@ bootstrap. Binaries are available from the OSU-CIS archive, at
@uref{ftp://archive.cis.ohio-state.edu/pub/att7300/}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68k-crds-unos}m68k-crds-unos
Use @samp{configure unos} for building on Unos.
@@ -2552,8 +2593,7 @@ If linking @file{cc1} fails, try putting the object files into a library
and linking from that library.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68k-hp-hpux}m68k-hp-hpux
HP 9000 series 300 or 400 running HP-UX@. HP-UX version 8.0 has a bug in
@@ -2611,8 +2651,7 @@ to look like:
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68k-ncr-*}m68k-ncr-*
On the Tower models 4@var{n}0 and 6@var{n}0, by default a process is not
@@ -2628,8 +2667,7 @@ MAXUMEM = 4096
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68k-sun}m68k-sun
Sun 3. We do not provide a configuration file to use the Sun FPA by
@@ -2637,8 +2675,7 @@ default, because programs that establish signal handlers for floating
point traps inherently cannot work with the FPA@.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{m68k-sun-sunos4.1.1}m68k-sun-sunos4.1.1
@@ -2646,8 +2683,7 @@ It is reported that you may need the GNU assembler on this platform.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{mips-*-*}mips-*-*
If on a MIPS system you get an error message saying ``does not have gp
@@ -2702,8 +2738,7 @@ however, you may have success with @command{smake} on IRIX 5.2 if you do
not have GNU @command{make} available.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{mips-sgi-irix6}mips-sgi-irix6
@@ -2802,8 +2837,7 @@ See @uref{http://freeware.sgi.com/,,http://freeware.sgi.com/} for more
information about using GCC on IRIX platforms.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc*-*-*}powerpc-*-*
@@ -2811,8 +2845,7 @@ You can specify a default version for the @option{-mcpu=@var{cpu_type}}
switch by using the configure option @option{--with-cpu-@var{cpu_type}}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-darwin*}powerpc-*-darwin*
PowerPC running Darwin (Mac OS X kernel).
@@ -2826,7 +2859,7 @@ binaries are available at
registration required).
Versions of the assembler prior to ``cctools-364'' cannot handle the
-4-argument form of rlwinm and related mask-using instructions. Darwin
+4-argument form of @code{rlwinm} and related mask-using instructions. Darwin
1.3 (Mac OS X 10.0) uses cctools-353 for instance. To get cctools-364,
check out @file{cctools} with tag @samp{Apple-364}, build it, and
install the assembler as @file{usr/bin/as}. See
@@ -2845,15 +2878,13 @@ number of extensions not available in a standard GCC release. These
extensions are generally specific to Mac programming.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-elf}powerpc-*-elf, powerpc-*-sysv4
PowerPC system in big endian mode, running System V.4.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-linux-gnu*}powerpc-*-linux-gnu*
@@ -2862,8 +2893,7 @@ You will need
or newer for a working GCC@.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-netbsd*}powerpc-*-netbsd*
PowerPC system in big endian mode running NetBSD@. To build the
@@ -2871,74 +2901,64 @@ documentation you will need Texinfo version 4.1 (NetBSD 1.5.1 included
Texinfo version 3.12).
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-eabiaix}powerpc-*-eabiaix
Embedded PowerPC system in big endian mode with @option{-mcall-aix} selected as
the default.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-eabisim}powerpc-*-eabisim
Embedded PowerPC system in big endian mode for use in running under the
PSIM simulator.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpc-*-eabi}powerpc-*-eabi
Embedded PowerPC system in big endian mode.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpcle-*-elf}powerpcle-*-elf, powerpcle-*-sysv4
PowerPC system in little endian mode, running System V.4.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpcle-*-eabisim}powerpcle-*-eabisim
Embedded PowerPC system in little endian mode for use in running under
the PSIM simulator.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpcle-*-eabi}powerpcle-*-eabi
Embedded PowerPC system in little endian mode.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{powerpcle-*-winnt}powerpcle-*-winnt, powerpcle-*-pe
PowerPC system in little endian mode running Windows NT@.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{s390-*-linux*}s390-*-linux*
S/390 system running Linux for S/390@.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{s390x-*-linux*}s390x-*-linux*
zSeries system (64-bit) running Linux for zSeries@.
@html
-</p>
-<hr>
+<hr />
@end html
@c Please use Solaris 2 to refer to all release of Solaris, starting
@c with 2.0 until 2.6, 7, and 8. Solaris 1 was a marketing name for
@@ -2991,8 +3011,7 @@ There are patches for Solaris 2.6 (105633-56 or newer for SPARC,
108653-22 for Intel) that fix this bug.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{sparc-sun-solaris2*}sparc-sun-solaris2*
@@ -3004,8 +3023,10 @@ 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:
-@samp{/usr/ccs/bin/as: "/var/tmp/ccMsw135.s", line 11041:
-error: can't compute value of an expression involving an external symbol.}
+@smallexample
+/usr/ccs/bin/as: "/var/tmp/ccMsw135.s", line 11041: error:
+ can't compute value of an expression involving an external symbol.
+@end smallexample
This is Sun bug 4237974. This is fixed with patch 108908-02 for Solaris
2.6 and has been fixed in later (5.x) versions of the assembler,
@@ -3025,8 +3046,7 @@ that supports only 32-bit binaries, one must configure with
64-bit target libraries.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{sparc-sun-solaris2.7}sparc-sun-solaris2.7
@@ -3068,7 +3088,7 @@ the Solaris 7 Recommended Patch Cluster.
@html
<p>
-<hr>
+<hr />
@end html
@heading @anchor{sparc-sun-sunos4*}sparc-sun-sunos4*
@@ -3087,8 +3107,7 @@ be due to a bug in @command{sh}. You can probably get around it by running
@command{make}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{sparc-unknown-linux-gnulibc1}sparc-unknown-linux-gnulibc1
@@ -3098,8 +3117,7 @@ for this platform, too.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{sparc-*-linux*}sparc-*-linux*
@@ -3109,8 +3127,7 @@ releases mishandled unaligned relocations on @code{sparc-*-*} targets.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{sparc64-*-*}sparc64-*-*
@@ -3121,8 +3138,7 @@ invocation with an environment that causes @command{configure} to
recognize (via @samp{uname -a}) the system as @samp{sparc-*-*} instead.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{sparcv9-*-solaris2*}sparcv9-*-solaris2*
@@ -3137,8 +3153,7 @@ step in order to bootstrap this target with the Sun compiler:
specifies the v9 architecture to the Sun linker and assembler.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{#*-*-sysv*}*-*-sysv*
On System V release 3, you may get this error message
@@ -3172,16 +3187,14 @@ On a System V release 4 system, make sure @file{/usr/bin} precedes
@file{/usr/ucb} uses libraries which have bugs.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{vax-dec-ultrix}vax-dec-ultrix
Don't try compiling with VAX C (@code{vcc}). It produces incorrect code
in some cases (for example, when @code{alloca} is used).
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{xtensa-*-elf}xtensa-*-elf
@@ -3199,8 +3212,7 @@ downloaded files include a customized copy of this header file,
which you can use to replace the default header file.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{xtensa-*-linux*}xtensa-*-linux*
@@ -3212,8 +3224,7 @@ respects, this target is the same as the
@uref{#xtensa-*-elf,,@samp{xtensa-*-elf}} target.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{windows}Microsoft Windows (32-bit)
@@ -3224,8 +3235,7 @@ Current (as of early 2001) snapshots of GCC will build under Cygwin
without modification.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{os2}OS/2
@@ -3238,8 +3248,7 @@ An older copy of GCC 2.8.1 is included with the EMX tools available at
ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/}.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{older}Older systems
@@ -3285,8 +3294,7 @@ about GCC on such systems (which may no longer be applicable to
current GCC) is to be found in the GCC texinfo manual.
@html
-</p>
-<hr>
+<hr />
@end html
@heading @anchor{elf_targets}all ELF targets (SVR4, Solaris 2, etc.)
@@ -3297,8 +3305,7 @@ automatically.
@html
-</p>
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -3310,8 +3317,7 @@ automatically.
@ifset oldhtml
@include install-old.texi
@html
-</p>
-<hr>
+<hr />
<p>
@end html
@ifhtml
@@ -3323,8 +3329,7 @@ automatically.
@ifset gfdlhtml
@include fdl.texi
@html
-</p>
-<hr>
+<hr />
<p>
@end html
@ifhtml
diff --git a/gcc/doc/interface.texi b/gcc/doc/interface.texi
index 846de56bd62..c554434c447 100644
--- a/gcc/doc/interface.texi
+++ b/gcc/doc/interface.texi
@@ -57,7 +57,7 @@ compiler for the system. We may implement register argument passing on
certain machines once we have a complete GNU system so that we can
compile the libraries with GCC@.
-On some machines (particularly the Sparc), certain types of arguments
+On some machines (particularly the SPARC), certain types of arguments
are passed ``by invisible reference''. This means that the value is
stored in memory, and the address of the memory location is passed to
the subroutine.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index d2fc0f74d0e..a9bc5b9584a 100644
--- a/gcc/doc/invoke.texi
+++ b/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 -### --help --target-help --version}
@item C Language Options
@xref{C Dialect Options,,Options Controlling C Dialect}.
@@ -169,13 +169,13 @@ in the following sections.
-fallow-single-precision -fcond-mismatch @gol
-fsigned-bitfields -fsigned-char @gol
-funsigned-bitfields -funsigned-char @gol
--fwritable-strings -fshort-wchar}
+-fwritable-strings}
@item C++ Language Options
@xref{C++ Dialect Options,,Options Controlling C++ Dialect}.
@gccoptlist{
--fno-access-control -fcheck-new -fconserve-space @gol
--fno-const-strings -fdollars-in-identifiers @gol
+-fabi-version=@var{n} -fno-access-control -fcheck-new @gol
+-fconserve-space -fno-const-strings -fdollars-in-identifiers @gol
-fno-elide-constructors @gol
-fno-enforce-eh-specs -fexternal-templates @gol
-falt-external-templates @gol
@@ -187,7 +187,7 @@ in the following sections.
-fno-optional-diags -fpermissive @gol
-frepo -fno-rtti -fstats -ftemplate-depth-@var{n} @gol
-fuse-cxa-atexit -fvtable-gc -fno-weak -nostdinc++ @gol
--fno-default-inline -Wctor-dtor-privacy @gol
+-fno-default-inline -Wabi -Wctor-dtor-privacy @gol
-Wnon-virtual-dtor -Wreorder @gol
-Weffc++ -Wno-deprecated @gol
-Wno-non-template-friend -Wold-style-cast @gol
@@ -199,7 +199,7 @@ in the following sections.
@gccoptlist{
-fconstant-string-class=@var{class-name} @gol
-fgnu-runtime -fnext-runtime -gen-decls @gol
--Wno-protocol -Wselector}
+-Wno-protocol -Wselector -Wundeclared-selector}
@item Language Independent Options
@xref{Language Independent Options,,Options to Control Diagnostic Messages Formatting}.
@@ -211,7 +211,7 @@ in the following sections.
@xref{Warning Options,,Options to Request or Suppress Warnings}.
@gccoptlist{
-fsyntax-only -pedantic -pedantic-errors @gol
--w -W -Wall -Waggregate-return @gol
+-w -W -Wall -Waggregate-return @gol
-Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment @gol
-Wconversion -Wno-deprecated-declarations @gol
-Wdisabled-optimization -Wno-div-by-zero -Werror @gol
@@ -222,13 +222,14 @@ in the following sections.
-Werror-implicit-function-declaration @gol
-Wimport -Winline -Wno-endif-labels @gol
-Wlarger-than-@var{len} -Wlong-long @gol
--Wmain -Wmissing-braces -Wmissing-declarations @gol
+-Wmain -Wmissing-braces @gol
-Wmissing-format-attribute -Wmissing-noreturn @gol
-Wno-multichar -Wno-format-extra-args -Wno-format-y2k @gol
-Wno-import -Wnonnull -Wpacked -Wpadded @gol
-Wparentheses -Wpointer-arith -Wredundant-decls @gol
-Wreturn-type -Wsequence-point -Wshadow @gol
--Wsign-compare -Wswitch -Wswitch-default -Wswitch-enum @gol
+-Wsign-compare -Wstrict-aliasing @gol
+-Wswitch -Wswitch-default -Wswitch-enum @gol
-Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized @gol
-Wunknown-pragmas -Wunreachable-code @gol
-Wunused -Wunused-function -Wunused-label -Wunused-parameter @gol
@@ -236,7 +237,8 @@ in the following sections.
@item C-only Warning Options
@gccoptlist{
--Wbad-function-cast -Wmissing-prototypes -Wnested-externs @gol
+-Wbad-function-cast -Wmissing-declarations @gol
+-Wmissing-prototypes -Wnested-externs @gol
-Wstrict-prototypes -Wtraditional}
@item Debugging Options
@@ -247,8 +249,9 @@ in the following sections.
-fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol
-fdump-tree-original@r{[}-@var{n}@r{]} -fdump-tree-optimized@r{[}-@var{n}@r{]} @gol
-fdump-tree-inlined@r{[}-@var{n}@r{]} @gol
--fmem-report @gol
--fprofile-arcs -ftest-coverage -ftime-report @gol
+-feliminate-dwarf2-dups -fmem-report @gol
+-fprofile-arcs -fsched-verbose=@var{n} @gol
+-ftest-coverage -ftime-report @gol
-g -g@var{level} -gcoff -gdwarf -gdwarf-1 -gdwarf-1+ -gdwarf-2 @gol
-ggdb -gstabs -gstabs+ -gvms -gxcoff -gxcoff+ @gol
-p -pg -print-file-name=@var{library} -print-libgcc-file-name @gol
@@ -261,6 +264,7 @@ in the following sections.
@gccoptlist{
-falign-functions=@var{n} -falign-jumps=@var{n} @gol
-falign-labels=@var{n} -falign-loops=@var{n} @gol
+-fbounds-check @gol
-fbranch-probabilities -fcaller-saves -fcprop-registers @gol
-fcse-follow-jumps -fcse-skip-blocks -fdata-sections @gol
-fdelayed-branch -fdelete-null-pointer-checks @gol
@@ -270,20 +274,23 @@ in the following sections.
-fif-conversion -fif-conversion2 @gol
-finline-functions -finline-limit=@var{n} -fkeep-inline-functions @gol
-fkeep-static-consts -fmerge-constants -fmerge-all-constants @gol
--fmove-all-movables -fnew-ra -fno-default-inline -fno-defer-pop @gol
+-fmove-all-movables -fnew-ra -fno-branch-count-reg @gol
+-fno-default-inline -fno-defer-pop @gol
-fno-function-cse -fno-guess-branch-probability @gol
-fno-inline -fno-math-errno -fno-peephole -fno-peephole2 @gol
--funsafe-math-optimizations -ffinite-math-only -fno-trapping-math @gol
--fno-zero-initialized-in-bss @gol
+-funsafe-math-optimizations -ffinite-math-only @gol
+-fno-trapping-math -fno-zero-initialized-in-bss @gol
-fomit-frame-pointer -foptimize-register-move @gol
-foptimize-sibling-calls -fprefetch-loop-arrays @gol
-freduce-all-givs -fregmove -frename-registers @gol
-freorder-blocks -freorder-functions @gol
-frerun-cse-after-loop -frerun-loop-opt @gol
--fschedule-insns -fschedule-insns2 -fsignaling-nans @gol
+-fschedule-insns -fschedule-insns2 @gol
+-fno-sched-interblock -fno-sched-spec -fsched-spec-load @gol
+-fsched-spec-load-dangerous -fsignaling-nans @gol
-fsingle-precision-constant -fssa -fssa-ccp -fssa-dce @gol
--fstrength-reduce -fstrict-aliasing -ftracer -fthread-jumps -ftrapv @gol
--funroll-all-loops -funroll-loops @gol
+-fstrength-reduce -fstrict-aliasing -ftracer -fthread-jumps @gol
+-ftrapv -funroll-all-loops -funroll-loops @gol
--param @var{name}=@var{value}
-O -O0 -O1 -O2 -O3 -Os}
@@ -338,7 +345,8 @@ in the following sections.
@emph{M68hc1x Options}
@gccoptlist{
-m6811 -m6812 -m68hc11 -m68hc12 @gol
--mauto-incdec -minmax -mlong-calls -mshort -msoft-reg-count=@var{count}}
+-mauto-incdec -minmax -mlong-calls -mshort @gol
+-msoft-reg-count=@var{count}}
@emph{VAX Options}
@gccoptlist{
@@ -447,7 +455,7 @@ in the following sections.
-mno-relocatable -mrelocatable-lib -mno-relocatable-lib @gol
-mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian @gol
-mcall-aix -mcall-sysv -mcall-netbsd @gol
--maix-struct-return -msvr4-struct-return
+-maix-struct-return -msvr4-struct-return @gol
-mabi=altivec -mabi=no-altivec @gol
-mabi=spe -mabi=no-spe @gol
-misel=yes -misel=no @gol
@@ -477,7 +485,7 @@ in the following sections.
-m4650 -msingle-float -mmad @gol
-mstats -EL -EB -G @var{num} -nocpp @gol
-mabi=32 -mabi=n32 -mabi=64 -mabi=eabi @gol
--mfix7000 -mno-crt0 -mflush-func=@var{func} -mno-flush-func
+-mfix7000 -mno-crt0 -mflush-func=@var{func} -mno-flush-func @gol
-mbranch-likely -mno-branch-likely}
@emph{i386 and x86-64 Options}
@@ -487,7 +495,7 @@ in the following sections.
-mno-fp-ret-in-387 -msoft-float -msvr3-shlib @gol
-mno-wide-multiply -mrtd -malign-double @gol
-mpreferred-stack-boundary=@var{num} @gol
--mmmx -msse -msse2 -msse-math -m3dnow @gol
+-mmmx -msse -msse2 -m3dnow @gol
-mthreads -mno-align-stringops -minline-all-stringops @gol
-mpush-args -maccumulate-outgoing-args -m128bit-long-double @gol
-m96bit-long-double -mregparm=@var{num} -momit-leaf-frame-pointer @gol
@@ -499,14 +507,15 @@ in the following sections.
@gccoptlist{
-march=@var{architecture-type} @gol
-mbig-switch -mdisable-fpregs -mdisable-indexing @gol
--mfast-indirect-calls -mgas -mjump-in-delay @gol
+-mfast-indirect-calls -mgas -mgnu-ld -mhp-ld @gol
+-mjump-in-delay -mlinker-opt @gol
-mlong-load-store -mno-big-switch -mno-disable-fpregs @gol
-mno-disable-indexing -mno-fast-indirect-calls -mno-gas @gol
-mno-jump-in-delay -mno-long-load-store @gol
-mno-portable-runtime -mno-soft-float @gol
-mno-space-regs -msoft-float -mpa-risc-1-0 @gol
-mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime @gol
--mschedule=@var{cpu-type} -mspace-regs}
+-mschedule=@var{cpu-type} -mspace-regs -msio -mwsio}
@emph{Intel 960 Options}
@gccoptlist{
@@ -577,6 +586,9 @@ in the following sections.
-mlong-calls -mno-long-calls -mep -mno-ep @gol
-mprolog-function -mno-prolog-function -mspace @gol
-mtda=@var{n} -msda=@var{n} -mzda=@var{n} @gol
+-mapp-regs -mno-app-regs @gol
+-mdisable-callt -mno-disable-callt @gol
+-mv850e @gol
-mv850 -mbig-switch}
@emph{NS32K Options}
@@ -616,8 +628,8 @@ in the following sections.
@emph{D30V Options}
@gccoptlist{
--mextmem -mextmemory -monchip -mno-asm-optimize -masm-optimize @gol
--mbranch-cost=@var{n} -mcond-exec=@var{n}}
+-mextmem -mextmemory -monchip -mno-asm-optimize @gol
+-masm-optimize -mbranch-cost=@var{n} -mcond-exec=@var{n}}
@emph{S/390 and zSeries Options}
@gccoptlist{
@@ -676,12 +688,13 @@ in the following sections.
-fno-common -fno-ident -fno-gnu-linker @gol
-fpcc-struct-return -fpic -fPIC @gol
-freg-struct-return -fshared-data -fshort-enums @gol
--fshort-double -fvolatile @gol
+-fshort-double -fshort-wchar -fvolatile @gol
-fvolatile-global -fvolatile-static @gol
-fverbose-asm -fpack-struct -fstack-check @gol
-fstack-limit-register=@var{reg} -fstack-limit-symbol=@var{sym} @gol
-fargument-alias -fargument-noalias @gol
--fargument-noalias-global -fleading-underscore -ftls-model=@var{model}}
+-fargument-noalias-global -fleading-underscore @gol
+-ftls-model=@var{model}}
@end table
@menu
@@ -922,6 +935,10 @@ be displayed.
@opindex target-help
Print (on the standard output) a description of target specific command
line options for each tool.
+
+@item --version
+@opindex version
+Display the version number and copyrights of the invoked GCC.
@end table
@node Invoking G++
@@ -1218,12 +1235,6 @@ write into string constants.
Writing into string constants is a very bad idea; ``constants'' should
be constant.
-
-@item -fshort-wchar
-@opindex fshort-wchar
-Override the underlying type for @samp{wchar_t} to be @samp{short
-unsigned int} instead of the default for the target. This option is
-useful for building programs to run under WINE@.
@end table
@node C++ Dialect Options
@@ -1249,6 +1260,17 @@ language supported by GCC@.
Here is a list of options that are @emph{only} for compiling C++ programs:
@table @gcctabopt
+
+@item -fabi-version=@var{n}
+@opindex fabi-version
+Use version @var{n} of the C++ ABI. Version 1 is the version of the C++
+ABI that first appeared in G++ 3.2. Version 0 will always be the
+version that conforms most closely to the C++ ABI specification.
+Therefore, the ABI obtained using version 0 will change as ABI bugs are
+fixed.
+
+The default is version 1.
+
@item -fno-access-control
@opindex fno-access-control
Turn off all access checking. This switch is mainly useful for working
@@ -1472,16 +1494,116 @@ Do not assume @samp{inline} for functions defined inside a class scope.
functions will have linkage like inline functions; they just won't be
inlined by default.
+@item -Wabi @r{(C++ only)}
+@opindex Wabi
+Warn when G++ generates code that is probably not compatible with the
+vendor-neutral C++ ABI. Although an effort has been made to warn about
+all such cases, there are probably some cases that are not warned about,
+even though G++ is generating incompatible code. There may also be
+cases where warnings are emitted even though the code that is generated
+will be compatible.
+
+You should rewrite your code to avoid these warnings if you are
+concerned about the fact that code generated by G++ may not be binary
+compatible with code generated by other compilers.
+
+The known incompatibilites at this point include:
+
+@itemize @bullet
+
+@item
+Incorrect handling of tail-padding for bit-fields. G++ may attempt to
+pack data into the same byte as a base class. For example:
+
+@smallexample
+struct A @{ virtual void f(); int f1 : 1; @};
+struct B : public A @{ int f2 : 1; @};
+@end smallexample
+
+@noindent
+In this case, G++ will place @code{B::f2} into the same byte
+as@code{A::f1}; other compilers will not. You can avoid this problem
+by explicitly padding @code{A} so that its size is a multiple of the
+byte size on your platform; that will cause G++ and other compilers to
+layout @code{B} identically.
+
+@item
+Incorrect handling of tail-padding for virtual bases. G++ does not use
+tail padding when laying out virtual bases. For example:
+
+@smallexample
+struct A @{ virtual void f(); char c1; @};
+struct B @{ B(); char c2; @};
+struct C : public A, public virtual B @{@};
+@end smallexample
+
+@noindent
+In this case, G++ will not place @code{B} into the tail-padding for
+@code{A}; other compilers will. You can avoid this problem by
+explicitly padding @code{A} so that its size is a multiple of its
+alignment (ignoring virtual base classes); that will cause G++ and other
+compilers to layout @code{C} identically.
+
+@item
+Incorrect handling of bit-fields with declared widths greater than that
+of their underlying types, when the bit-fields appear in a union. For
+example:
+
+@smallexample
+union U @{ int i : 4096; @};
+@end smallexample
+
+@noindent
+Assuming that an @code{int} does not have 4096 bits, G++ will make the
+union too small by the number of bits in an @code{int}.
+
+@item
+Empty classes can be placed at incorrect offsets. For example:
+
+@smallexample
+struct A @{@};
+
+struct B @{
+ A a;
+ virtual void f ();
+@};
+
+struct C : public B, public A @{@};
+@end smallexample
+
+@noindent
+G++ will place the @code{A} base class of @code{C} at a non-zero offset;
+it should be placed at offset zero. G++ mistakenly believes that the
+@code{A} data member of @code{B} is already at offset zero.
+
+@item
+Names of template functions whose types involve @code{typename} or
+template template parameters can be mangled incorrectly.
+
+@smallexample
+template <typename Q>
+void f(typename Q::X) @{@}
+
+template <template <typename> class Q>
+void f(typename Q<int>::X) @{@}
+@end smallexample
+
+@noindent
+Instantions of these templates may be mangled incorrectly.
+
+@end itemize
+
@item -Wctor-dtor-privacy @r{(C++ only)}
@opindex Wctor-dtor-privacy
Warn when a class seems unusable, because all the constructors or
destructors in a class are private and the class has no friends or
-public static member functions.
+public static member functions. This warning is enabled by default.
@item -Wnon-virtual-dtor @r{(C++ only)}
@opindex Wnon-virtual-dtor
Warn when a class declares a non-virtual destructor that should probably
be virtual, because it looks like the class will be used polymorphically.
+This warning is enabled by @option{-Wall}.
@item -Wreorder @r{(C++ only)}
@opindex Wreorder
@@ -1500,7 +1622,7 @@ struct A @{
Here the compiler will warn that the member initializers for @samp{i}
and @samp{j} will be rearranged to match the declaration order of the
-members.
+members. This warning is enabled by @option{-Wall}.
@end table
The following @option{-W@dots{}} options are not affected by @option{-Wall}.
@@ -1675,7 +1797,9 @@ runtime. This is the default for most types of systems.
@item -fnext-runtime
@opindex fnext-runtime
Generate output compatible with the NeXT runtime. This is the default
-for NeXT-based systems, including Darwin and Mac OS X@.
+for NeXT-based systems, including Darwin and Mac OS X@. The macro
+@code{__NEXT_RUNTIME__} is predefined if (and only if) this option is
+used.
@item -gen-decls
@opindex gen-decls
@@ -1684,12 +1808,39 @@ file named @file{@var{sourcename}.decl}.
@item -Wno-protocol
@opindex Wno-protocol
-Do not warn if methods required by a protocol are not implemented
-in the class adopting it.
+If a class is declared to implement a protocol, a warning is issued for
+every method in the protocol that is not implemented by the class. The
+default behavior is to issue a warning for every method not explicitly
+implemented in the class, even if a method implementation is inherited
+from the superclass. If you use the @code{-Wno-protocol} option, then
+methods inherited from the superclass are considered to be implemented,
+and no warning is issued for them.
@item -Wselector
@opindex Wselector
-Warn if a selector has multiple methods of different types defined.
+Warn if multiple methods of different types for the same selector are
+found during compilation. The check is performed on the list of methods
+in the final stage of compilation. Additionally, a check is performed
+that for each selector appearing in a @code{@@selector(@dots{})}
+expression, a corresponding method with that selector has been found
+during compilation. Because these checks scan the method table only at
+the end of compilation, these warnings are not produced if the final
+stage of compilation is not reached, for example because an error is
+found during compilation, or because the @code{-fsyntax-only} option is
+being used.
+
+@item -Wundeclared-selector
+@opindex Wundeclared-selector
+Warn if a @code{@@selector(@dots{})} expression referring to an
+undeclared selector is found. A selector is considered undeclared if no
+method with that name has been declared (explicitly, in an
+@code{@@interface} or @code{@@protocol} declaration, or implicitly, in
+an @code{@@implementation} section) before the
+@code{@@selector(@dots{})} expression. This option always performs its
+checks as soon as a @code{@@selector(@dots{})} expression is found
+(while @code{-Wselector} only performs its checks in the final stage of
+compilation), and so additionally enforces the coding style convention
+that methods and selectors must be declared before being used.
@c not documented because only avail via -Wp
@c @item -print-objc-runtime-info
@@ -2190,13 +2341,6 @@ Some spurious warnings can be avoided if you declare all the functions
you use that never return as @code{noreturn}. @xref{Function
Attributes}.
-@item -Wreorder @r{(C++ only)}
-@opindex Wreorder
-@cindex reordering, warning
-@cindex warning for reordering of member initializers
-Warn when the order of member initializers given in the code does not
-match the order in which they must be executed. For instance:
-
@item -Wunknown-pragmas
@opindex Wunknown-pragmas
@cindex warning for unknown pragmas
@@ -2207,12 +2351,22 @@ GCC@. If this command line option is used, warnings will even be issued
for unknown pragmas in system header files. This is not the case if
the warnings were only enabled by the @option{-Wall} command line option.
+@item -Wstrict-aliasing
+@opindex Wstrict-aliasing
+This option is only active when @option{-fstrict-aliasing} is active.
+It warns about code which might break the strict aliasing rules that the
+compiler is using for optimization. The warning does not catch all
+cases, but does attempt to catch the more common pitfalls. It is
+included in @option{-Wall}.
+
@item -Wall
@opindex Wall
All of the above @samp{-W} options combined. This enables all the
warnings about constructions that some users consider questionable, and
that are easy to avoid (or modify to prevent the warning), even in
-conjunction with macros.
+conjunction with macros. This also enables some language-specific
+warnings described in @ref{C++ Dialect Options} and
+@ref{Objective-C Dialect Options}.
@end table
The following @option{-W@dots{}} options are not implied by @option{-Wall}.
@@ -2779,6 +2933,12 @@ 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.
+@item -feliminate-dwarf2-dups
+@opindex feliminate-dwarf2-dups
+Compress DWARF2 debugging information by eliminating duplicated
+information about each symbol. This option only makes sense when
+generating DWARF2 debugging information with @option{-gdwarf-2}.
+
@cindex @code{prof}
@item -p
@opindex p
@@ -3080,6 +3240,23 @@ Dump after all tree based optimization, to @file{@var{file}.optimized}.
Dump after function inlining, to @file{@var{file}.inlined}.
@end table
+@item -fsched-verbose=@var{n}
+@opindex fsched-verbose
+On targets that use instruction scheduling, this option controls the
+amount of debugging output the scheduler prints. This information is
+written to standard error, unless @option{-dS} or @option{-dR} is
+specified, in which case it is output to the usual dump
+listing file, @file{.sched} or @file{.sched2} respectively. However
+for @var{n} greater than nine, the output is always printed to standard
+error.
+
+For @var{n} greater than zero, @option{-fsched-verbose} outputs the
+same information as @option{-dRS}. For @var{n} greater than one, it
+also output basic block probabilities, detailed ready list information
+and unit/insn info. For @var{n} greater than two, it includes RTL
+at abort point, control-flow and regions info. And for @var{n} over
+four, @option{-fsched-verbose} also includes dependence info.
+
@item -save-temps
@opindex save-temps
Store the usual ``temporary'' intermediate files permanently; place them
@@ -3383,6 +3560,14 @@ Use a graph coloring register allocator. Currently this option is meant
for testing, so we are interested to hear about miscompilations with
@option{-fnew-ra}.
+@item -fno-branch-count-reg
+@opindex fno-branch-count-reg
+Do not use ``decrement and branch'' instructions on a count register,
+but instead generate a sequence of instructions that decrement a
+register, compare it against zero, then branch based upon the result.
+This option is only meaningful on architectures that support such
+instructions, which include x86, PowerPC, IA-64 and S/390.
+
@item -fno-function-cse
@opindex fno-function-cse
Do not put function addresses in registers; make each instruction that
@@ -3487,6 +3672,14 @@ resulting executable can find the beginning of that section and/or make
assumptions based on that.
The default is @option{-fzero-initialized-in-bss}.
+
+@item -fbounds-check
+@opindex fbounds-check
+For front-ends that support it, generate additional code to check that
+indices used to access arrays are within the declared range. This is
+currenly only supported by the Java and Fortran 77 front-ends, where
+this option defaults to true and false respectively.
+
@end table
The following options control specific optimizations. The @option{-O2}
@@ -3637,6 +3830,30 @@ instruction scheduling after register allocation has been done. This is
especially useful on machines with a relatively small number of
registers and where memory load instructions take more than one cycle.
+@item -fno-sched-interblock
+@opindex fno-sched-interblock
+Don't schedule instructions across basic blocks. This is normally
+enabled by default when scheduling before register allocation, i.e.@:
+with @option{-fschedule-insns} or at @option{-O2} or higher.
+
+@item -fno-sched-spec
+@opindex fno-sched-spec
+Don't allow speculative motion of non-load instructions. This is normally
+enabled by default when scheduling before register allocation, i.e.@:
+with @option{-fschedule-insns} or at @option{-O2} or higher.
+
+@item -fsched-spec-load
+@opindex fsched-spec-load
+Allow speculative motion of some load instructions. This only makes
+sense when scheduling before register allocation, i.e.@: with
+@option{-fschedule-insns} or at @option{-O2} or higher.
+
+@item -fsched-spec-load-dangerous
+@opindex fsched-spec-load-dangerous
+Allow speculative motion of more load instructions. This only makes
+sense when scheduling before register allocation, i.e.@: with
+@option{-fschedule-insns} or at @option{-O2} or higher.
+
@item -ffunction-sections
@itemx -fdata-sections
@opindex ffunction-sections
@@ -3648,7 +3865,7 @@ in the output file.
Use these options on systems where the linker can perform optimizations
to improve locality of reference in the instruction space. HPPA
-processors running HP-UX and Sparc processors running Solaris 2 have
+processors running HP-UX and SPARC processors running Solaris 2 have
linkers with such optimizations. Other systems using the ELF object format
as well as AIX may have these optimizations in the future.
@@ -4567,13 +4784,22 @@ for each @samp{%g.s} and another for each @samp{%U.s}. Previously, @samp{%U} wa
simply substituted with a file name chosen for the previous @samp{%u},
without regard to any appended suffix.
-@item %j@var{SUFFIX}
+@item %j@var{suffix}
Substitutes the name of the @code{HOST_BIT_BUCKET}, if any, and if it is
writable, and if save-temps is off; otherwise, substitute the name
of a temporary file, just like @samp{%u}. This temporary file is not
meant for communication between processes, but rather as a junk
disposal mechanism.
+@item %|@var{suffix}
+@itemx %m@var{suffix}
+Like @samp{%g}, except if @option{-pipe} is in effect. In that case
+@samp{%|} substitutes a single dash and @samp{%m} substitutes nothing at
+all. These are the two most common ways to instruct a program that it
+should read from standard input or write to standard output. If you
+need something more elaborate you can use an @samp{%@{pipe:@code{X}@}}
+construct: see for example @file{f/lang-specs.h}.
+
@item %.@var{SUFFIX}
Substitutes @var{.SUFFIX} for the suffixes of a matched switch's args
when it is subsequently output with @samp{%*}. @var{SUFFIX} is
@@ -4624,9 +4850,6 @@ the full name found.
Print @var{str} as an error message. @var{str} is terminated by a newline.
Use this when inconsistent options are detected.
-@item %|
-Output @samp{-} if the input for the current command is coming from a pipe.
-
@item %(@var{name})
Substitute the contents of spec string @var{name} at this point.
@@ -4723,6 +4946,12 @@ Substitute the variable part of a matched option. See below.
Note that each comma in the substituted string is replaced by
a single space.
+@item %<@code{S}
+Remove all occurrences of @code{-S} from the command line. Note---this
+command is position dependent. @samp{%} commands in the spec string
+before this one will see @code{-S}, @samp{%} commands in the spec string
+after this one will not.
+
@item %@{@code{S}@}
Substitutes the @code{-S} switch, if that switch was given to GCC@.
If that switch was not specified, this substitutes nothing. Note that
@@ -4743,51 +4972,40 @@ GCC considers @option{-o foo} as being
one switch whose names starts with @samp{o}. %@{o*@} would substitute this
text, including the space. Thus two arguments would be generated.
-@item %@{^@code{S}*@}
-Like %@{@code{S}*@}, but don't put a blank between a switch and its
-argument. Thus %@{^o*@} would only generate one argument, not two.
-
@item %@{@code{S}*&@code{T}*@}
Like %@{@code{S}*@}, but preserve order of @code{S} and @code{T} options
(the order of @code{S} and @code{T} in the spec is not significant).
There can be any number of ampersand-separated variables; for each the
wild card is optional. Useful for CPP as @samp{%@{D*&U*&A*@}}.
-@item %@{<@code{S}@}
-Remove all occurrences of @code{-S} from the command line. Note---this
-command is position dependent. @samp{%} commands in the spec string
-before this option will see @code{-S}, @samp{%} commands in the spec
-string after this option will not.
-
-@item %@{@code{S}*:@code{X}@}
-Substitutes @code{X} if one or more switches whose names start with
-@code{-S} are specified to GCC@. Note that the tail part of the
-@code{-S} option (i.e.@: the part matched by the @samp{*}) will be substituted
-for each occurrence of @samp{%*} within @code{X}.
-
@item %@{@code{S}:@code{X}@}
-Substitutes @code{X}, but only if the @samp{-S} switch was given to GCC@.
+Substitutes @code{X}, if the @samp{-S} switch was given to GCC@.
@item %@{!@code{S}:@code{X}@}
-Substitutes @code{X}, but only if the @samp{-S} switch was @emph{not} given to GCC@.
-
-@item %@{|@code{S}:@code{X}@}
-Like %@{@code{S}:@code{X}@}, but if no @code{S} switch, substitute @samp{-}.
+Substitutes @code{X}, if the @samp{-S} switch was @emph{not} given to GCC@.
-@item %@{|!@code{S}:@code{X}@}
-Like %@{!@code{S}:@code{X}@}, but if there is an @code{S} switch, substitute @samp{-}.
+@item %@{@code{S}*:@code{X}@}
+Substitutes @code{X} if one or more switches whose names start with
+@code{-S} are specified to GCC@. Normally @code{X} is substituted only
+once, no matter how many such switches appeared. However, if @code{%*}
+appears somewhere in @code{X}, then @code{X} will be substituted once
+for each matching switch, with the @code{%*} replaced by the part of
+that switch that matched the @code{*}.
@item %@{.@code{S}:@code{X}@}
-Substitutes @code{X}, but only if processing a file with suffix @code{S}.
+Substitutes @code{X}, if processing a file with suffix @code{S}.
@item %@{!.@code{S}:@code{X}@}
-Substitutes @code{X}, but only if @emph{not} processing a file with suffix @code{S}.
+Substitutes @code{X}, if @emph{not} processing a file with suffix @code{S}.
@item %@{@code{S}|@code{P}:@code{X}@}
-Substitutes @code{X} if either @code{-S} or @code{-P} was given to GCC@. This may be
-combined with @samp{!} and @samp{.} sequences as well, although they
-have a stronger binding than the @samp{|}. For example a spec string
-like this:
+Substitutes @code{X} if either @code{-S} or @code{-P} was given to GCC@.
+This may be combined with @samp{!}, @samp{.}, and @code{*} sequences as well,
+although they have a stronger binding than the @samp{|}. If @code{%*}
+appears in @code{X}, all of the alternatives must be starred, and only
+the first matching alternative is substituted.
+
+For example, a spec string like this:
@smallexample
%@{.c:-foo@} %@{!.c:-bar@} %@{.c|d:-baz@} %@{!.c|d:-boggle@}
@@ -4803,23 +5021,33 @@ jim.d -bar -boggle
-d jim.d -bar -baz -boggle
@end smallexample
+@item %@{S:X; T:Y; :D@}
+
+If @code{S} was given to GCC, substitues @code{X}; else if @code{T} was
+given to GCC, substitues @code{Y}; else substitutes @code{D}. There can
+be as many clauses as you need. This may be combined with @code{.},
+@code{!}, @code{|}, and @code{*} as needed.
+
+
@end table
-The conditional text @code{X} in a %@{@code{S}:@code{X}@} or
-%@{!@code{S}:@code{X}@} construct may contain other nested @samp{%} constructs
-or spaces, or even newlines. They are processed as usual, as described
-above.
+The conditional text @code{X} in a %@{@code{S}:@code{X}@} or similar
+construct may contain other nested @samp{%} constructs or spaces, or
+even newlines. They are processed as usual, as described above.
+Trailing white space in @code{X} is ignored. White space may also
+appear anywhere on the left side of the colon in these constructs,
+except between @code{.} or @code{*} and the corresponding word.
-The @option{-O}, @option{-f}, @option{-m}, and @option{-W}
-switches are handled specifically in these
-constructs. If another value of @option{-O} or the negated form of a @option{-f}, @option{-m}, or
-@option{-W} switch is found later in the command line, the earlier switch
-value is ignored, except with @{@code{S}*@} where @code{S} is just one
-letter, which passes all matching options.
+The @option{-O}, @option{-f}, @option{-m}, and @option{-W} switches are
+handled specifically in these constructs. If another value of
+@option{-O} or the negated form of a @option{-f}, @option{-m}, or
+@option{-W} switch is found later in the command line, the earlier
+switch value is ignored, except with @{@code{S}*@} where @code{S} is
+just one letter, which passes all matching options.
-The character @samp{|} at the beginning of the predicate text is used to indicate
-that a command should be piped to the following command, but only if @option{-pipe}
-is specified.
+The character @samp{|} at the beginning of the predicate text is used to
+indicate that a command should be piped to the following command, but
+only if @option{-pipe} is specified.
It is built into GCC which switches take arguments and which do not.
(You might think it would be useful to generalize this to allow each
@@ -5286,7 +5514,7 @@ With @option{-mfaster-structs}, the compiler assumes that structures
should have 8 byte alignment. This enables the use of pairs of
@code{ldd} and @code{std} instructions for copies in structure
assignment, in place of twice as many @code{ld} and @code{st} pairs.
-However, the use of this changed alignment directly violates the Sparc
+However, the use of this changed alignment directly violates the SPARC
ABI@. Thus, it's intended only for use on targets where the developer
acknowledges that their resulting code will not be directly in line with
the rules of the ABI@.
@@ -5318,11 +5546,11 @@ They have been replaced with @option{-mcpu=xxx}.
These two options select the processor for which the code is optimized.
With @option{-mcypress} (the default), the compiler optimizes code for the
-Cypress CY7C602 chip, as used in the SparcStation/SparcServer 3xx series.
-This is also appropriate for the older SparcStation 1, 2, IPX etc.
+Cypress CY7C602 chip, as used in the SPARCStation/SPARCServer 3xx series.
+This is also appropriate for the older SPARCStation 1, 2, IPX etc.
-With @option{-msupersparc} the compiler optimizes code for the SuperSparc cpu, as
-used in the SparcStation 10, 1000 and 2000 series. This flag also enables use
+With @option{-msupersparc} the compiler optimizes code for the SuperSPARC cpu, as
+used in the SPARCStation 10, 1000 and 2000 series. This flag also enables use
of the full SPARC v8 instruction set.
These options are deprecated and will be deleted in a future GCC release.
@@ -5764,7 +5992,7 @@ memory a feature of the ARM architecture allows a word load to be used,
even if the address is unaligned, and the processor core will rotate the
data as it is being loaded. This option tells the compiler that such
misaligned accesses will cause a MMU trap and that it should instead
-synthesise the access as a series of byte accesses. The compiler can
+synthesize the access as a series of byte accesses. The compiler can
still use word accesses to load half-word data if it knows that the
address is aligned to a word boundary.
@@ -7391,8 +7619,8 @@ for the ABI and the set of available instructions. The choices for
@var{cpu-type} are @samp{i386}, @samp{i486}, @samp{i586}, @samp{i686},
@samp{pentium}, @samp{pentium-mmx}, @samp{pentiumpro}, @samp{pentium2},
@samp{pentium3}, @samp{pentium4}, @samp{k6}, @samp{k6-2}, @samp{k6-3},
-@samp{athlon}, @samp{athlon-tbird}, @samp{athlon-4}, @samp{athlon-xp}
-and @samp{athlon-mp}.
+@samp{athlon}, @samp{athlon-tbird}, @samp{athlon-4}, @samp{athlon-xp},
+@samp{athlon-mp}, @samp{winchip-c6}, @samp{winchip2} and @samp{c3}.
While picking a specific @var{cpu-type} will schedule things appropriately
for that particular chip, the compiler will not generate any code that
@@ -7635,6 +7863,9 @@ direct access to the MMX, SSE and 3Dnow extensions of the instruction set.
@xref{X86 Built-in Functions}, for details of the functions enabled
and disabled by these switches.
+To have SSE/SSE2 instructions generated automatically from floating-point
+code, see @option{-mfpmath=sse}.
+
@item -mpush-args
@itemx -mno-push-args
@opindex mpush-args
@@ -7824,9 +8055,9 @@ proper scheduling option for your machine. The default scheduling is
@item -mlinker-opt
@opindex mlinker-opt
-Enable the optimization pass in the HPUX linker. Note this makes symbolic
-debugging impossible. It also triggers a bug in the HPUX 8 and HPUX 9 linkers
-in which they give bogus error messages when linking some programs.
+Enable the optimization pass in the HP-UX linker. Note this makes symbolic
+debugging impossible. It also triggers a bug in the HP-UX 8 and HP-UX 9
+linkers in which they give bogus error messages when linking some programs.
@item -msoft-float
@opindex msoft-float
@@ -7843,6 +8074,37 @@ therefore, it is only useful if you compile @emph{all} of a program with
this option. In particular, you need to compile @file{libgcc.a}, the
library that comes with GCC, with @option{-msoft-float} in order for
this to work.
+
+@item -msio
+@opindex msio
+Generate the predefine, @code{_SIO}, for server IO. The default is
+@option{-mwsio}. This generates the predefines, @code{__hp9000s700},
+@code{__hp9000s700__} and @code{_WSIO}, for workstation IO. These
+options are available under HP-UX and HI-UX.
+
+@item -mgnu-ld
+@opindex gnu-ld
+Use GNU ld specific options. This passes @option{-shared} to ld when
+building a shared library. It is the default when GCC is configured,
+explicitly or implicitly, with the GNU linker. This option does not
+have any affect on which ld is called, it only changes what parameters
+are passed to that ld. The ld that is called is determined by the
+@option{--with-ld} configure option, gcc's program search path, and
+finally by the user's @env{PATH}. The linker used by GCC can be printed
+using @samp{which `gcc -print-prog-name=ld`}.
+
+@item -mhp-ld
+@opindex hp-ld
+Use HP ld specific options. This passes @option{-b} to ld when building
+a shared library and passes @option{+Accept TypeMismatch} to ld on all
+links. It is the default when GCC is configured, explicitly or
+implicitly, with the HP linker. This option does not have any affect on
+which ld is called, it only changes what parameters are passed to that
+ld. The ld that is called is determined by the @option{--with-ld}
+configure option, gcc's program search path, and finally by the user's
+@env{PATH}. The linker used by GCC can be printed using @samp{which
+`gcc -print-prog-name=ld`}.
+
@end table
@node Intel 960 Options
@@ -8304,11 +8566,11 @@ Generate code for the H8/300H@.
@item -ms
@opindex ms
-Generate code for the H8/S@.
+Generate code for the H8S@.
@item -ms2600
@opindex ms2600
-Generate code for the H8/S2600. This switch must be used with @option{-ms}.
+Generate code for the H8S/2600. This switch must be used with @option{-ms}.
@item -mint32
@opindex mint32
@@ -8316,8 +8578,8 @@ Make @code{int} data 32 bits by default.
@item -malign-300
@opindex malign-300
-On the H8/300H and H8/S, use the same alignment rules as for the H8/300.
-The default for the H8/300H and H8/S is to align longs and floats on 4
+On the H8/300H and H8S, use the same alignment rules as for the H8/300.
+The default for the H8/300H and H8S is to align longs and floats on 4
byte boundaries.
@option{-malign-300} causes them to be aligned on 2 byte boundaries.
This option has no effect on the H8/300.
@@ -8512,10 +8774,10 @@ 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
-that it can utilise the decrement and branch instruction, but will give
+that it can utilize 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
-efficient code, in cases where the RPTB instruction cannot be utilised.
+efficient code, in cases where the RPTB instruction cannot be utilized.
@item -mdp-isr-reload
@itemx -mparanoid
@@ -8682,6 +8944,34 @@ Specify that the target processor is the V850.
Generate code suitable for big switch tables. Use this option only if
the assembler/linker complain about out of range branches within a switch
table.
+
+@item -mapp-regs
+@opindex -mapp-regs
+This option will cause r2 and r5 to be used in the code generated by
+the compiler. This setting is the default.
+
+@item -mno-app-regs
+@opindex -mno-app-regs
+This option will cause r2 and r5 to be treated as fixed registers.
+
+@item -mv850e
+@opindex -mv850e
+Specify that the target processor is the V850E. The preprocessor
+constant @samp{__v850e__} will be defined if this option is used.
+
+If neither @option{-mv850} nor @option{-mv850e} are defined
+then a default target processor will be chosen and the relevant
+@samp{__v850*__} preprocessor constant will be defined.
+
+The preprocessor constants @samp{__v850} and @samp{__v851__} are always
+defined, regardless of which processor variant is the target.
+
+@item -mdisable-callt
+@opindex -mdisable-callt
+This option will suppress generation of the CALLT instruction for the
+v850e flavors of the v850 architecture. The default is
+@option{-mno-disable-callt} which allows the CALLT instruction to be used.
+
@end table
@node ARC Options
@@ -9020,7 +9310,7 @@ These are the @samp{-m} options defined for the Intel IA-64 architecture.
@table @gcctabopt
@item -mbig-endian
@opindex mbig-endian
-Generate code for a big endian target. This is the default for HPUX@.
+Generate code for a big endian target. This is the default for HP-UX@.
@item -mlittle-endian
@opindex mlittle-endian
@@ -9785,7 +10075,8 @@ unwinding from asynchronous events (such as debugger or garbage collector).
Return ``short'' @code{struct} and @code{union} values in memory like
longer ones, rather than in registers. This convention is less
efficient, but it has the advantage of allowing intercallability between
-GCC-compiled files and files compiled with other compilers.
+GCC-compiled files and files compiled with other compilers, particularly
+the Portable C Compiler (pcc).
The precise convention for returning structures in memory depends
on the target configuration macros.
@@ -9793,6 +10084,11 @@ on the target configuration macros.
Short structures and unions are those whose size and alignment match
that of some integer type.
+@strong{Warning:} code compiled with the @option{-fpcc-struct-return}
+switch is not binary compatible with code compiled with the
+@option{-freg-struct-return} switch.
+Use it to conform to a non-default application binary interface.
+
@item -freg-struct-return
@opindex freg-struct-return
Return @code{struct} and @code{union} values in registers when possible.
@@ -9806,16 +10102,39 @@ defaults to @option{-fpcc-struct-return}, except on targets where GCC is
the principal compiler. In those cases, we can choose the standard, and
we chose the more efficient register return alternative.
+@strong{Warning:} code compiled with the @option{-freg-struct-return}
+switch is not binary compatible with code compiled with the
+@option{-fpcc-struct-return} switch.
+Use it to conform to a non-default application binary interface.
+
@item -fshort-enums
@opindex fshort-enums
Allocate to an @code{enum} type only as many bytes as it needs for the
declared range of possible values. Specifically, the @code{enum} type
will be equivalent to the smallest integer type which has enough room.
+@strong{Warning:} the @option{-fshort-enums} switch causes GCC to generate
+code that is not binary compatible with code generated without that switch.
+Use it to conform to a non-default application binary interface.
+
@item -fshort-double
@opindex fshort-double
Use the same size for @code{double} as for @code{float}.
+@strong{Warning:} the @option{-fshort-double} switch causes GCC to generate
+code that is not binary compatible with code generated without that switch.
+Use it to conform to a non-default application binary interface.
+
+@item -fshort-wchar
+@opindex fshort-wchar
+Override the underlying type for @samp{wchar_t} to be @samp{short
+unsigned int} instead of the default for the target. This option is
+useful for building programs to run under WINE@.
+
+@strong{Warning:} the @option{-fshort-wchar} switch causes GCC to generate
+code that is not binary compatible with code generated without that switch.
+Use it to conform to a non-default application binary interface.
+
@item -fshared-data
@opindex fshared-data
Requests that the data and non-@code{const} variables of this
@@ -9893,7 +10212,7 @@ loader is not part of GCC; it is part of the operating system). If
the GOT size for the linked executable exceeds a machine-specific
maximum size, you get an error message from the linker indicating that
@option{-fpic} does not work; in that case, recompile with @option{-fPIC}
-instead. (These maximums are 16k on the m88k, 8k on the Sparc, and 32k
+instead. (These maximums are 16k on the m88k, 8k on the SPARC, and 32k
on the m68k and RS/6000. The 386 has no such limit.)
Position-independent code requires special support, and therefore works
@@ -9906,7 +10225,7 @@ position-independent.
If supported for the target machine, emit position-independent code,
suitable for dynamic linking and avoiding any limit on the size of the
global offset table. This option makes a difference on the m68k, m88k,
-and the Sparc.
+and the SPARC.
Position-independent code requires special support, and therefore works
only on certain machines.
@@ -9957,9 +10276,12 @@ three-way choice.
@item -fpack-struct
@opindex fpack-struct
-Pack all structure members together without holes. Usually you would
-not want to use this option, since it makes the code suboptimal, and
-the offsets of structure members won't agree with system libraries.
+Pack all structure members together without holes.
+
+@strong{Warning:} the @option{-fpack-struct} switch causes GCC to generate
+code that is not binary compatible with code generated without that switch.
+Additionally, it makes the code suboptimial.
+Use it to conform to a non-default application binary interface.
@item -finstrument-functions
@opindex finstrument-functions
@@ -10056,8 +10378,10 @@ This option and its counterpart, @option{-fno-leading-underscore}, forcibly
change the way C symbols are represented in the object file. One use
is to help link with legacy assembly code.
-Be warned that you should know what you are doing when invoking this
-option, and that not all targets provide complete support for it.
+@strong{Warning:} the @option{-fleading-underscore} switch causes GCC to
+generate code that is not binary compatible with code generated without that
+switch. Use it to conform to a non-default application binary interface.
+Not all targets provide complete support for this switch.
@item -ftls-model=@var{model}
Alter the thread-local storage model to be used (@pxref{Thread-Local}).
diff --git a/gcc/doc/makefile.texi b/gcc/doc/makefile.texi
index 69d621ba66c..6d6b0253aa6 100644
--- a/gcc/doc/makefile.texi
+++ b/gcc/doc/makefile.texi
@@ -48,9 +48,9 @@ You can specify specific tests by setting RUNTESTFLAGS to be the name
of the @file{.exp} file, optionally followed by (for some tests) an equals
and a file wildcard, like:
-@example
+@smallexample
make check-gcc RUNTESTFLAGS="execute.exp=19980413-*"
-@end example
+@end smallexample
Note that running the testsuite may require additional tools be
installed, such as TCL or dejagnu.
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index ed1115e4dc3..db640753f9d 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -1744,70 +1744,6 @@ Integer constant in the range 1 to 4 for @code{shladd} instruction
Memory operand except postincrement and postdecrement
@end table
-@item MIPS---@file{mips.h}
-@table @code
-@item d
-General-purpose integer register
-
-@item f
-Floating-point register (if available)
-
-@item h
-@samp{Hi} register
-
-@item l
-@samp{Lo} register
-
-@item x
-@samp{Hi} or @samp{Lo} register
-
-@item y
-General-purpose integer register
-
-@item z
-Floating-point status register
-
-@item I
-Signed 16-bit constant (for arithmetic instructions)
-
-@item J
-Zero
-
-@item K
-Zero-extended 16-bit constant (for logic instructions)
-
-@item L
-Constant with low 16 bits zero (can be loaded with @code{lui})
-
-@item M
-32-bit constant which requires two instructions to load (a constant
-which is not @samp{I}, @samp{K}, or @samp{L})
-
-@item N
-Negative 16-bit constant
-
-@item O
-Exact power of two
-
-@item P
-Positive 16-bit constant
-
-@item G
-Floating point zero
-
-@item Q
-Memory reference that can be loaded with more than one instruction
-(@samp{m} is preferable for @code{asm} statements)
-
-@item R
-Memory reference that can be loaded with one instruction
-(@samp{m} is preferable for @code{asm} statements)
-
-@item S
-Memory reference in external OSF/rose PIC format
-(@samp{m} is preferable for @code{asm} statements)
-@end table
-
@item IP2K---@file{ip2k.h}
@table @code
@item a
@@ -1878,6 +1814,70 @@ Zero
Integers from 0 to 255
@end table
+@item MIPS---@file{mips.h}
+@table @code
+@item d
+General-purpose integer register
+
+@item f
+Floating-point register (if available)
+
+@item h
+@samp{Hi} register
+
+@item l
+@samp{Lo} register
+
+@item x
+@samp{Hi} or @samp{Lo} register
+
+@item y
+General-purpose integer register
+
+@item z
+Floating-point status register
+
+@item I
+Signed 16-bit constant (for arithmetic instructions)
+
+@item J
+Zero
+
+@item K
+Zero-extended 16-bit constant (for logic instructions)
+
+@item L
+Constant with low 16 bits zero (can be loaded with @code{lui})
+
+@item M
+32-bit constant which requires two instructions to load (a constant
+which is not @samp{I}, @samp{K}, or @samp{L})
+
+@item N
+Negative 16-bit constant
+
+@item O
+Exact power of two
+
+@item P
+Positive 16-bit constant
+
+@item G
+Floating point zero
+
+@item Q
+Memory reference that can be loaded with more than one instruction
+(@samp{m} is preferable for @code{asm} statements)
+
+@item R
+Memory reference that can be loaded with one instruction
+(@samp{m} is preferable for @code{asm} statements)
+
+@item S
+Memory reference in external OSF/rose PIC format
+(@samp{m} is preferable for @code{asm} statements)
+@end table
+
@item Motorola 680x0---@file{m68k.h}
@table @code
@item a
@@ -3480,7 +3480,7 @@ multiple condition registers, use a pseudo register.
@findex next_cc0_user
On some machines, the type of branch instruction generated may depend on
the way the condition code was produced; for example, on the 68k and
-Sparc, setting the condition code directly from an add or subtract
+SPARC, setting the condition code directly from an add or subtract
instruction does not clear the overflow bit the way that a test
instruction does, so a different branch instruction must be used for
some conditional branches. For machines that use @code{(cc0)}, the set
@@ -3499,7 +3499,7 @@ different formats of the condition code register.
Registers used to store the condition code value should have a mode that
is in class @code{MODE_CC}. Normally, it will be @code{CCmode}. If
additional modes are required (as for the add example mentioned above in
-the Sparc), define the macro @code{EXTRA_CC_MODES} to list the
+the SPARC), define the macro @code{EXTRA_CC_MODES} to list the
additional modes required (@pxref{Condition Code}). Also define
@code{SELECT_CC_MODE} to choose a mode given an operand of a compare.
@@ -3511,7 +3511,7 @@ be specified at that time.
If the cases that require different modes would be made by instruction
combination, the macro @code{SELECT_CC_MODE} determines which machine
mode should be used for the comparison result. The patterns should be
-written using that mode. To support the case of the add on the Sparc
+written using that mode. To support the case of the add on the SPARC
discussed above, we have the pattern
@smallexample
@@ -3525,7 +3525,7 @@ discussed above, we have the pattern
"@dots{}")
@end smallexample
-The @code{SELECT_CC_MODE} macro on the Sparc returns @code{CC_NOOVmode}
+The @code{SELECT_CC_MODE} macro on the SPARC returns @code{CC_NOOVmode}
for comparisons whose argument is a @code{plus}.
@node Looping Patterns
@@ -3533,7 +3533,7 @@ for comparisons whose argument is a @code{plus}.
@cindex looping instruction patterns
@cindex defining looping instruction patterns
-Some machines have special jump instructions that can be utilised to
+Some machines have special jump instructions that can be utilized to
make loops more efficient. A common example is the 68000 @samp{dbra}
instruction which performs a decrement of a register and a branch if the
result was greater than zero. Other machines, in particular digital
@@ -5246,12 +5246,12 @@ branch is true, we might represent this as follows:
@cindex RISC
@cindex VLIW
-To achieve better productivity most modern processors
+To achieve better performance, most modern processors
(super-pipelined, superscalar @acronym{RISC}, and @acronym{VLIW}
processors) have many @dfn{functional units} on which several
instructions can be executed simultaneously. An instruction starts
execution if its issue conditions are satisfied. If not, the
-instruction is interlocked until its conditions are satisfied. Such
+instruction is stalled until its conditions are satisfied. Such
@dfn{interlock (pipeline) delay} causes interruption of the fetching
of successor instructions (or demands nop instructions, e.g. for some
MIPS processors).
@@ -5274,25 +5274,25 @@ of delay into account is complex especially for modern @acronym{RISC}
processors.
The task of exploiting more processor parallelism is solved by an
-instruction scheduler. For better solution of this problem, the
+instruction scheduler. For a better solution to this problem, the
instruction scheduler has to have an adequate description of the
-processor parallelism (or @dfn{pipeline description}). Currently GCC
-has two ways to describe processor parallelism. The first one is old
-and originated from instruction scheduler written by Michael Tiemann
-and described in the first subsequent section. The second one was
-created later. It is based on description of functional unit
-reservations by processor instructions with the aid of @dfn{regular
-expressions}. This is so called @dfn{automaton based description}.
-
-Gcc instruction scheduler uses a @dfn{pipeline hazard recognizer} to
+processor parallelism (or @dfn{pipeline description}). Currently GCC
+provides two alternative ways to describe processor parallelism,
+both described below. The first method is outlined in the next section;
+it was once the only method provided by GCC, and thus is used in a number
+of exiting ports. The second, and preferred method, specifies functional
+unit reservations for groups of instructions with the aid of @dfn{regular
+expressions}. This is called the @dfn{automaton based description}.
+
+The GCC instruction scheduler uses a @dfn{pipeline hazard recognizer} to
figure out the possibility of the instruction issue by the processor
-on given simulated processor cycle. The pipeline hazard recognizer is
-a code generated from the processor pipeline description. The
+on a given simulated processor cycle. The pipeline hazard recognizer is
+automatically generated from the processor pipeline description. The
pipeline hazard recognizer generated from the automaton based
-description is more sophisticated and based on deterministic finite
+description is more sophisticated and based on a deterministic finite
state automaton (@acronym{DFA}) and therefore faster than one
-generated from the old description. Also its speed is not depended on
-processor complexity. The instruction issue is possible if there is
+generated from the old description. Furthermore, its speed is not dependent
+on processor complexity. The instruction issue is possible if there is
a transition from one automaton state to another one.
You can use any model to describe processor pipeline characteristics
@@ -5450,7 +5450,7 @@ in the machine description file is not important.
The following optional construction describes names of automata
generated and used for the pipeline hazards recognition. Sometimes
the generated finite state automaton used by the pipeline hazard
-recognizer is large. If we use more one automaton and bind functional
+recognizer is large. If we use more than one automaton and bind functional
units to the automata, the summary size of the automata usually is
less than the size of the single automaton. If there is no one such
construction, only one finite state automaton is generated.
@@ -5477,7 +5477,7 @@ reservations should be described by the following construction.
separated by commas. Don't use name @samp{nothing}, it is reserved
for other goals.
-@var{automaton-name} is a string giving the name of automaton with
+@var{automaton-name} is a string giving the name of the automaton with
which the unit is bound. The automaton should be described in
construction @code{define_automaton}. You should give
@dfn{automaton-name}, if there is a defined automaton.
@@ -5500,14 +5500,14 @@ templates).
@var{unit-names} is a string giving names of the functional units
separated by commas.
-@var{automaton-name} is a string giving name of the automaton with
+@var{automaton-name} is a string giving the name of the automaton with
which the unit is bound.
@findex define_insn_reservation
@cindex instruction latency time
@cindex regular expressions
@cindex data bypass
-The following construction is major one to describe pipeline
+The following construction is the major one to describe pipeline
characteristics of an instruction.
@smallexample
@@ -5519,18 +5519,18 @@ characteristics of an instruction.
instruction. There is an important difference between the old
description and the automaton based pipeline description. The latency
time is used for all dependencies when we use the old description. In
-the automaton based pipeline description, given latency time is used
-only for true dependencies. The cost of anti-dependencies is always
+the automaton based pipeline description, the given latency time is only
+used for true dependencies. The cost of anti-dependencies is always
zero and the cost of output dependencies is the difference between
latency times of the producing and consuming insns (if the difference
-is negative, the cost is considered to be zero). You always can
-change the default costs for any description by using target hook
+is negative, the cost is considered to be zero). You can always
+change the default costs for any description by using the target hook
@code{TARGET_SCHED_ADJUST_COST} (@pxref{Scheduling}).
-@var{insn-names} is a string giving internal name of the insn. The
+@var{insn-names} is a string giving the internal name of the insn. The
internal names are used in constructions @code{define_bypass} and in
the automaton description file generated for debugging. The internal
-name has nothing common with the names in @code{define_insn}. It is a
+name has nothing in common with the names in @code{define_insn}. It is a
good practice to use insn classes described in the processor manual.
@var{condition} defines what RTL insns are described by this
@@ -5545,7 +5545,7 @@ contain @code{symbol_ref}). It is also not checked during the
pipeline hazard recognizer work because it would slow down the
recognizer considerably.
-@var{regexp} is a string describing reservation of the cpu functional
+@var{regexp} is a string describing the reservation of the cpu's functional
units by the instruction. The reservations are described by a regular
expression according to the following syntax:
@@ -5631,11 +5631,11 @@ given in string @var{out_insn_names} will be ready for the
instructions given in string @var{in_insn_names}. The instructions in
the string are separated by commas.
-@var{guard} is an optional string giving name of a C function which
+@var{guard} is an optional string giving the name of a C function which
defines an additional guard for the bypass. The function will get the
two insns as parameters. If the function returns zero the bypass will
be ignored for this case. The additional guard is necessary to
-recognize complicated bypasses, e.g. when consumer is only an address
+recognize complicated bypasses, e.g. when the consumer is only an address
of insn @samp{store} (not a stored value).
@findex exclusion_set
@@ -5680,7 +5680,7 @@ it is symmetric). For example, it is useful for description that
@acronym{VLIW} @samp{slot0} can not be reserved after @samp{slot1} or
@samp{slot2} reservation.
-All functional units mentioned in a set should belong the same
+All functional units mentioned in a set should belong to the same
automaton.
@findex automata_option
@@ -5734,7 +5734,7 @@ the following functional units.
@smallexample
(define_cpu_unit "i0_pipeline, i1_pipeline, f_pipeline")
-(define_cpu_unit "port_0, port1")
+(define_cpu_unit "port0, port1")
@end smallexample
All simple integer insns can be executed in any integer pipeline and
@@ -5746,26 +5746,26 @@ pipeline and their results are ready correspondingly in 8 and 4
cycles. The integer division is not pipelined, i.e. the subsequent
integer division insn can not be issued until the current division
insn finished. Floating point insns are fully pipelined and their
-results are ready in 3 cycles. There is also additional one cycle
-delay in the usage by integer insns of result produced by floating
-point insns. To describe all of this we could specify
+results are ready in 3 cycles. Where the result of a floating point
+insn is used by an integer insn, an additional delay of one cycle is
+incurred. To describe all of this we could specify
@smallexample
(define_cpu_unit "div")
(define_insn_reservation "simple" 2 (eq_attr "cpu" "int")
- "(i0_pipeline | i1_pipeline), (port_0 | port1)")
+ "(i0_pipeline | i1_pipeline), (port0 | port1)")
(define_insn_reservation "mult" 4 (eq_attr "cpu" "mult")
- "i1_pipeline, nothing*2, (port_0 | port1)")
+ "i1_pipeline, nothing*2, (port0 | port1)")
(define_insn_reservation "div" 8 (eq_attr "cpu" "div")
- "i1_pipeline, div*7, div + (port_0 | port1)")
+ "i1_pipeline, div*7, div + (port0 | port1)")
(define_insn_reservation "float" 3 (eq_attr "cpu" "float")
- "f_pipeline, nothing, (port_0 | port1))
+ "f_pipeline, nothing, (port0 | port1))
-(define_bypass 4 "float" "simple,mut,div")
+(define_bypass 4 "float" "simple,mult,div")
@end smallexample
To simplify the description we could describe the following reservation
@@ -5821,17 +5821,18 @@ The interface to the pipeline hazard recognizer is more complex than
one to the automaton based pipeline recognizer.
@item
-An unnatural description when you write an unit and a condition which
+An unnatural description when you write a unit and a condition which
selects instructions using the unit. Writing all unit reservations
for an instruction (an instruction class) is more natural.
@item
-The recognition of the interlock delays has slow implementation. GCC
+The recognition of the interlock delays has a slow implementation. The GCC
scheduler supports structures which describe the unit reservations.
-The more processor has functional units, the slower pipeline hazard
-recognizer. Such implementation would become slower when we enable to
+The more functional units a processor has, the slower its pipeline hazard
+recognizer will be. Such an implementation would become even slower when we
+allowed to
reserve functional units not only at the instruction execution start.
-The automaton based pipeline hazard recognizer speed is not depended
+In an automaton based pipeline hazard recognizer, speed is not dependent
on processor complexity.
@end itemize
diff --git a/gcc/doc/objc.texi b/gcc/doc/objc.texi
index d3fd775e2c0..3b652551e7c 100644
--- a/gcc/doc/objc.texi
+++ b/gcc/doc/objc.texi
@@ -396,7 +396,7 @@ prefixing a C constant string with the character @samp{@@}:
id myString = @@"this is a constant string object";
@end example
-The constant string objects are usually instances of the
+The constant string objects are by default instances of the
@code{NXConstantString} class which is provided by the GNU Objective-C
runtime. To get the definition of this class you must include the
@file{objc/NXConstStr.h} header file.
@@ -409,8 +409,9 @@ as @code{NXConstantString}'s structure:
@example
-@@interface NXConstantString : Object
+@@interface MyConstantStringClass
@{
+ Class isa;
char *c_string;
unsigned int len;
@}
@@ -418,15 +419,31 @@ as @code{NXConstantString}'s structure:
@end example
-User class libraries may choose to inherit the customized constant
-string class from a different class than @code{Object}. There is no
-requirement in the methods the constant string class has to implement.
-
-When a file is compiled with the @option{-fconstant-string-class} option,
-all the constant string objects will be instances of the class specified
-as argument to this option. It is possible to have multiple compilation
-units referring to different constant string classes, neither the
-compiler nor the linker impose any restrictions in doing this.
+@code{NXConstantString} inherits from @code{Object}; user class
+libraries may choose to inherit the customized constant string class
+from a different class than @code{Object}. There is no requirement in
+the methods the constant string class has to implement, but the final
+ivar layour of the class must be the compatible with the given
+structure.
+
+When the compiler creates the statically allocated constant string
+object, the @code{c_string} field will be filled by the compiler with
+the string; the @code{length} field will be filled by the compiler with
+the string length; the @code{isa} pointer will be filled with
+@code{NULL} by the compiler, and it will later be fixed up automatically
+at runtime by the GNU Objective-C runtime library to point to the class
+which was set by the @option{-fconstant-string-class} option when the
+object file is loaded (if you wonder how it works behind the scenes, the
+name of the class to use, and the list of static objects to fixup, are
+stored by the compiler in the object file in a place where the GNU
+runtime library will find them at runtime).
+
+As a result, when a file is compiled with the
+@option{-fconstant-string-class} option, all the constant string objects
+will be instances of the class specified as argument to this option. It
+is possible to have multiple compilation units referring to different
+constant string classes, neither the compiler nor the linker impose any
+restrictions in doing this.
@c =========================================================================
@node compatibility_alias
diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi
index 8db2e9ccc6f..1c9a4e49230 100644
--- a/gcc/doc/rtl.texi
+++ b/gcc/doc/rtl.texi
@@ -1545,7 +1545,7 @@ preferable approach if only a small subset of instructions modify the
condition code. Other machines store condition codes in general
registers; in such cases a pseudo register should be used.
-Some machines, such as the Sparc and RS/6000, have two sets of
+Some machines, such as the SPARC and RS/6000, have two sets of
arithmetic instructions, one that sets and one that does not set the
condition code. This is best handled by normally generating the
instruction that does not set the condition code, and making a pattern
@@ -2355,11 +2355,11 @@ An hypothetical example might be a pattern for an addition that can
either wrap around or use saturating addition depending on the value
of a special control register:
-@example
+@smallexample
(parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3)
(reg:SI 4)] 0))
(use (reg:SI 1))])
-@end example
+@end smallexample
@noindent
@@ -2577,9 +2577,6 @@ Represents the side effect of setting @var{x} to @var{y} and
represents @var{x} before @var{x} is modified. @var{x} must be a
@code{reg} or @code{mem}, but most machines allow only a @code{reg}.
@var{m} must be the machine mode for pointers on the machine in use.
-The amount @var{x} is decremented by is the length in bytes of the
-machine mode of the containing memory reference of which this expression
-serves as the address. Note that this is not currently implemented.
The expression @var{y} must be one of three forms:
@table @code
@@ -2591,10 +2588,10 @@ where @var{z} is an index register and @var{i} is a constant.
Here is an example of its use:
-@example
+@smallexample
(mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42)
(reg:SI 48))))
-@end example
+@end smallexample
This says to modify pseudo register 42 by adding the contents of pseudo
register 48 to it, after the use of what ever 42 points to.
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index ac64d8dc17e..2a6b9163027 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -255,12 +255,13 @@ In addition to these headers and those generated by fixing system
headers to work with GCC, some other headers may also be installed in
@file{@var{libsubdir}/include}. @file{config.gcc} may set
@code{extra_headers}; this specifies additional headers under
-@file{config} to be installed on some systems. GCC normally installs
-a @code{<float.h>} file; these are kept as
-@file{config/float-@var{format}.h}, where @var{format} is specified by
-a @code{float_format} setting in @file{config.gcc}, and a setting
-@samp{float_format=none} disables installation of this header. GCC
-also installs its own version of @code{<limits.h>}; this is generated
+@file{config} to be installed on some systems.
+
+GCC installs its own version of @code{<float.h>}, from @file{ginclude/float.h}.
+This is done to cope with command-line options that change the
+representation of floating point numbers.
+
+GCC also installs its own version of @code{<limits.h>}; this is generated
from @file{glimits.h}, together with @file{limitx.h} and
@file{limity.h} if the system also has its own version of
@code{<limits.h>}. (GCC provides its own header because it is
diff --git a/gcc/doc/standards.texi b/gcc/doc/standards.texi
index f925cde01bd..8c37fccd440 100644
--- a/gcc/doc/standards.texi
+++ b/gcc/doc/standards.texi
@@ -160,11 +160,19 @@ information concerning the history of C that is available online, see
There is no formal written standard for Objective-C@. The most
authoritative manual is ``Object-Oriented Programming and the
-Objective-C Language'', available at a number of web sites;
-@uref{http://developer.apple.com/techpubs/macosx/Cocoa/ObjectiveC/} has a
-recent version, while @uref{http://www.toodarkpark.org/computers/objc/}
-is an older example. @uref{http://www.gnustep.org} includes useful
-information as well.
+Objective-C Language'', available at a number of web sites
+
+@itemize
+@item
+@uref{http://developer.apple.com/techpubs/macosx/Cocoa/ObjectiveC/}
+is a recent version
+@item
+@uref{http://www.toodarkpark.org/computers/objc/}
+is an older example
+@item
+@uref{http://www.gnustep.org}
+has additional useful information
+@end itemize
@cindex treelang
There is no standard for treelang, which is a sample language front end
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 6a162fe8ae6..88587697955 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -157,11 +157,28 @@ such as one option that enables many options, some of which select
multilibs. Example nonsensical definition, where @code{-malt-abi},
@code{-EB}, and @code{-mspoo} cause different multilibs to be chosen:
-@example
+@smallexample
#define TARGET_OPTION_TRANSLATE_TABLE \
@{ "-fast", "-march=fast-foo -malt-abi -I/usr/fast-foo" @}, \
@{ "-compat", "-EB -malign=4 -mspoo" @}
-@end example
+@end smallexample
+
+@findex DRIVER_SELF_SPECS
+@item DRIVER_SELF_SPECS
+A list of specs for the driver itself. It should be a suitable
+initializer for an array of strings, with no surrounding braces.
+
+The driver applies these specs to its own command line before choosing
+the multilib directory or running any subcommands. It applies them in
+the order given, so each spec can depend on the options added by
+earlier ones. It is also possible to remove options using
+@samp{%<@var{option}} in the usual way.
+
+This macro can be useful when a port has several interdependent target
+options. It provides a way of standardizing the command line so
+that the other specs are easier to write.
+
+Do not define this macro if it does not need to do anything.
@findex CPP_SPEC
@item CPP_SPEC
@@ -216,6 +233,19 @@ an example of this.
Do not define this macro if it does not need to do anything.
+@findex AS_NEEDS_DASH_FOR_PIPED_INPUT
+@item AS_NEEDS_DASH_FOR_PIPED_INPUT
+Define this macro, with no value, if the driver should give the assembler
+an argument consisting of a single dash, @option{-}, to instruct it to
+read from its standard input (which will be a pipe connected to the
+output of the compiler proper). This argument is given after any
+@option{-o} option specifying the name of the output file.
+
+If you do not define this macro, the assembler is assumed to read its
+standard input if given no non-option arguments. If your assembler
+cannot read standard input at all, use a @samp{%@{pipe:%e@}} construct;
+see @file{mips.h} for instance.
+
@findex LINK_SPEC
@item LINK_SPEC
A C string constant that tells the GCC driver program options to
@@ -615,7 +645,9 @@ or @code{clk_objective_c}. Note that if we are preprocessing
assembler, this variable will be @code{clk_c} but the function-like
macro @code{preprocessing_asm_p()} will return true, so you might want
to check for that first. If you need to check for strict ANSI, the
-variable @code{flag_iso} can be used.
+variable @code{flag_iso} can be used. The function-like macro
+@code{preprocessing_trad_p()} can be used to check for traditional
+preprocessing.
With @code{TARGET_OS_CPP_BUILTINS} this macro obsoletes the
@code{CPP_PREDEFINES} target macro.
@@ -1291,22 +1323,6 @@ You need not define this macro if it always returns @code{word_mode}.
You would most commonly define this macro if the @code{allocate_stack}
pattern needs to support both a 32- and a 64-bit mode.
-@findex CHECK_FLOAT_VALUE
-@item CHECK_FLOAT_VALUE (@var{mode}, @var{value}, @var{overflow})
-A C statement to validate the value @var{value} (of type
-@code{double}) for mode @var{mode}. This means that you check whether
-@var{value} fits within the possible range of values for mode
-@var{mode} on this target machine. The mode @var{mode} is always
-a mode of class @code{MODE_FLOAT}. @var{overflow} is nonzero if
-the value is already known to be out of range.
-
-If @var{value} is not valid or if @var{overflow} is nonzero, you should
-set @var{overflow} to 1 and then assign some valid value to @var{value}.
-Allowing an invalid value to go through the compiler can produce
-incorrect assembler code which may even cause Unix assemblers to crash.
-
-This macro need not be defined if there is no work for it to do.
-
@findex TARGET_FLOAT_FORMAT
@item TARGET_FLOAT_FORMAT
A code distinguishing the floating point format of the target machine.
@@ -1320,7 +1336,8 @@ need to define this macro when the format is IEEE@.
@findex VAX_FLOAT_FORMAT
@item VAX_FLOAT_FORMAT
-This code indicates the ``D float'' format used on the VAX@.
+This code indicates the ``F float'' (for @code{float}) and ``D float''
+or ``G float'' formats (for @code{double}) used on the VAX and PDP-11@.
@findex IBM_FLOAT_FORMAT
@item IBM_FLOAT_FORMAT
@@ -1335,9 +1352,7 @@ This code indicates the format used on the TMS320C3x/C4x.
This code indicates any other format.
@end table
-The value of this macro is compared with @code{HOST_FLOAT_FORMAT}, which
-is defined by the @command{configure} script, to determine whether the
-target machine has the same format as the host machine. If any other
+If any other
formats are actually in use on supported machines, new codes should be
defined for them.
@@ -1422,8 +1437,7 @@ Not defining this macro is equivalent to returning zero.
@findex LARGEST_EXPONENT_IS_NORMAL
@item LARGEST_EXPONENT_IS_NORMAL (@var{size})
-This macro should only be defined when the target float format is
-described as IEEE@. It should return true if floats with @var{size}
+This macro should return true if floats with @var{size}
bits do not have a NaN or infinity representation, but use the largest
exponent for normal numbers instead.
@@ -1445,8 +1459,22 @@ 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},
+another bit-field of nonzero size. If this hook returns @code{true},
other macros that control bit-field layout are ignored.
+
+When a bit-field is inserted into a packed record, the whole size
+of the underlying type is used by one or more same-size adjacent
+bit-fields (that is, if its long:3, 32 bits is used in the record,
+and any additional adjacent long bit-fields are packed into the same
+chunk of 32 bits. However, if the size changes, a new field of that
+size is allocated). In an unpacked record, this is the same as using
+alignment, but not equivalent when packing.
+
+If both MS bit-fields and @samp{__attribute__((packed))} are used,
+the latter will take precedence. If @samp{__attribute__((packed))} is
+used on a single field when MS bit-fields are in use, it will take
+precedence for that field, but the alignment of the rest of the structure
+may affect its placement.
@end deftypefn
@node Type Layout
@@ -1534,9 +1562,12 @@ target machine. If this is undefined, the default is
the largest value that @code{LONG_DOUBLE_TYPE_SIZE} can have at run-time.
This is used in @code{cpp}.
-@findex INTEL_EXTENDED_IEEE_FORMAT
-Define this macro to be 1 if the target machine uses 80-bit floating-point
-values with 128-bit size and alignment. This is used in @file{real.c}.
+@findex TARGET_FLT_EVAL_METHOD
+@item TARGET_FLT_EVAL_METHOD
+A C expression for the value for @code{FLT_EVAL_METHOD} in @file{float.h},
+assuming, if applicable, that the floating-point control word is in its
+default state. If you do not define this macro the value of
+@code{FLT_EVAL_METHOD} will be zero.
@findex WIDEST_HARDWARE_FP_SIZE
@item WIDEST_HARDWARE_FP_SIZE
@@ -2395,7 +2426,7 @@ from memory or even from other types of registers. An example is the
from general registers, but not memory. Some machines allow copying all
registers to and from memory, but require a scratch register for stores
to some memory locations (e.g., those with symbolic address on the RT,
-and those with certain symbolic address on the Sparc when compiling
+and those with certain symbolic address on the SPARC when compiling
PIC)@. In some cases, both an intermediate and a scratch register are
required.
@@ -2775,7 +2806,7 @@ address of the stack word that points to the previous frame.
@item SETUP_FRAME_ADDRESSES
If defined, a C expression that produces the machine-specific code to
setup the stack so that arbitrary frames can be accessed. For example,
-on the Sparc, we must flush all of the register windows to the stack
+on the SPARC, we must flush all of the register windows to the stack
before we can access arbitrary stack frames. You will seldom need to
define this macro.
@@ -4133,9 +4164,11 @@ outputting the insns in this list, usually by calling
You need not define this macro if you did not define
@code{DELAY_SLOTS_FOR_EPILOGUE}.
-@findex ASM_OUTPUT_MI_THUNK
-@item ASM_OUTPUT_MI_THUNK (@var{file}, @var{thunk_fndecl}, @var{delta}, @var{function})
-A C compound statement that outputs the assembler code for a thunk
+@end table
+
+@findex TARGET_ASM_OUTPUT_MI_THUNK
+@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_MI_THUNK (FILE *@var{file}, tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, tree @var{function})
+A function that outputs the assembler code for a thunk
function, used to implement C++ virtual function calls with multiple
inheritance. The thunk acts as a wrapper around a virtual function,
adjusting the implicit object parameter before handing control off to
@@ -4166,7 +4199,24 @@ If you do not define this macro, the target-independent code in the C++
front end will generate a less efficient heavyweight thunk that calls
@var{function} instead of jumping to it. The generic approach does
not support varargs.
-@end table
+@end deftypefn
+
+@findex TARGET_ASM_OUTPUT_MI_VCALL_THUNK
+@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_MI_VCALL_THUNK (FILE *@var{file}, tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, int @var{vcall_offset}, tree @var{function})
+A function like @code{TARGET_ASM_OUTPUT_MI_THUNK}, except that if
+@var{vcall_offset} is non-zero, an additional adjustment should be made
+after adding @code{delta}. In particular, if @var{p} is the
+adjusted pointer, the following adjustment should be made:
+
+@example
+p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]
+@end example
+
+@noindent
+If this function is defined, it will always be used in place of
+@code{TARGET_ASM_OUTPUT_MI_THUNK}.
+
+@end deftypefn
@node Profiling
@subsection Generating Code for Profiling
@@ -4214,18 +4264,18 @@ the function prologue. Normally, the profiling code comes after.
@subsection Permitting tail calls
@cindex tail calls
-@table @code
-@findex FUNCTION_OK_FOR_SIBCALL
-@item FUNCTION_OK_FOR_SIBCALL (@var{decl})
-A C expression that evaluates to true if it is ok to perform a sibling
-call to @var{decl} from the current function.
+@deftypefn {Target Hook} bool TARGET_FUNCTION_OK_FOR_SIBCALL (tree @var{decl}, tree @var{exp})
+True if it is ok to do sibling call optimization for the specified
+call expression @var{exp}. @var{decl} will be the called function,
+or @code{NULL} if this is an indirect call.
It is not uncommon for limitations of calling conventions to prevent
tail calls to functions outside the current unit of translation, or
-during PIC compilation. Use this macro to enforce these restrictions,
+during PIC compilation. The hook is used to enforce these restrictions,
as the @code{sibcall} md pattern can not fail, or fall over to a
-``normal'' call.
-@end table
+``normal'' call. The criteria for successful sibling call optimization
+may vary greatly between different architectures.
+@end deftypefn
@node Varargs
@section Implementing the Varargs Macros
@@ -5079,7 +5129,7 @@ automatically defined by @command{configure}, with value @samp{1}.
@item SELECT_CC_MODE (@var{op}, @var{x}, @var{y})
Returns a mode from class @code{MODE_CC} to be used when comparison
operation code @var{op} is applied to rtx @var{x} and @var{y}. For
-example, on the Sparc, @code{SELECT_CC_MODE} is defined as (see
+example, on the SPARC, @code{SELECT_CC_MODE} is defined as (see
@pxref{Jump Patterns} for a description of the reason for this
definition)
@@ -5123,7 +5173,7 @@ then @code{REVERSIBLE_CC_MODE (@var{mode})} must be zero.
You need not define this macro if it would always returns zero or if the
floating-point format is anything other than @code{IEEE_FLOAT_FORMAT}.
-For example, here is the definition used on the Sparc, where floating-point
+For example, here is the definition used on the SPARC, where floating-point
inequality comparisons are always given @code{CCFPEmode}:
@smallexample
@@ -5388,6 +5438,15 @@ to clear a chunk of memory, or whether some other block clear mechanism
will be used. Defaults to 1 if @code{move_by_pieces_ninsns} returns less
than @code{CLEAR_RATIO}.
+@findex STORE_BY_PIECES_P
+@item STORE_BY_PIECES_P (@var{size}, @var{alignment})
+A C expression used to determine whether @code{store_by_pieces} will be
+used to set a chunk of memory to a constant value, or whether some other
+mechanism will be used. Used by @code{__builtin_memset} when storing
+values other than constant zero and by @code{__builtin_strcpy} when
+when called with a constant source string.
+Defaults to @code{MOVE_BY_PIECES_P}.
+
@findex USE_LOAD_POST_INCREMENT
@item USE_LOAD_POST_INCREMENT (@var{mode})
A C expression used to determine whether a load postincrement is a good
@@ -5467,9 +5526,8 @@ This value must be constant over the entire compilation. If you need
it to vary depending on what the instructions are, you must use
@samp{TARGET_SCHED_VARIABLE_ISSUE}.
-You could use the value of macro @samp{MAX_DFA_ISSUE_RATE} to return
-the value of the hook @samp{TARGET_SCHED_ISSUE_RATE} for the automaton
-based pipeline interface.
+For the automaton based pipeline interface, you could define this hook
+to return the value of the macro @code{MAX_DFA_ISSUE_RATE}.
@end deftypefn
@deftypefn {Target Hook} int TARGET_SCHED_VARIABLE_ISSUE (FILE *@var{file}, int @var{verbose}, rtx @var{insn}, int @var{more})
@@ -5910,6 +5968,11 @@ Returns true if @var{exp} should be placed into a ``small data'' section.
The default version of this hook always returns false.
@end deftypefn
+@deftypevar {Target Hook} bool TARGET_HAVE_SRODATA_SECTION
+Contains the value true if the target places read-only
+``small data'' into a separate section. The default value is false.
+@end deftypevar
+
@deftypefn {Target Hook} bool TARGET_BINDS_LOCAL_P (tree @var{exp})
Returns true if @var{exp} names an object for which name resolution
rules must resolve to the current ``module'' (dynamic shared library
@@ -5920,6 +5983,12 @@ for ELF, which has a looser model of global name binding than other
currently supported object file formats.
@end deftypefn
+@deftypevar {Target Hook} bool TARGET_HAVE_TLS
+Contains the value true if the target supports thread-local storage.
+The default value is false.
+@end deftypevar
+
+
@node PIC
@section Position Independent Code
@cindex position independent code
@@ -6232,7 +6301,7 @@ responsible for outputting the label definition at the proper place.
Here is how to do this:
@example
-ASM_OUTPUT_INTERNAL_LABEL (@var{file}, "LC", @var{labelno});
+@code{(*targetm.asm_out.internal_label)} (@var{file}, "LC", @var{labelno});
@end example
When you output a pool entry specially, you should end with a
@@ -6298,16 +6367,6 @@ host machine.
The array element values are designed so that you can print them out
using @code{fprintf} in the order they should appear in the target
machine's memory.
-
-@item REAL_VALUE_TO_DECIMAL (@var{x}, @var{format}, @var{string})
-@findex REAL_VALUE_TO_DECIMAL
-This macro converts @var{x}, of type @code{REAL_VALUE_TYPE}, to a
-decimal number and stores it as a string into @var{string}.
-You must pass, as @var{string}, the address of a long enough block
-of space to hold the result.
-
-The argument @var{format} is a @code{printf}-specification that serves
-as a suggestion for how to format the output string.
@end table
@node Uninitialized Data
@@ -6648,6 +6707,12 @@ you want to control one-only symbol support with a compiler flag, or if
setting the @code{DECL_ONE_ONLY} flag is enough to mark a declaration to
be emitted as one-only.
+@deftypefn {Target Hook} void TARGET_ASM_ASSEMBLE_VISIBILITY (tree @var{decl}, const char *@var{visibility})
+This target hook is a function to output to @var{asm_out_file} some
+commands that will make the symbol(s) associated with @var{decl} have
+hidden, protected or internal visibility as specified by @var{visibility}.
+@end deftypefn
+
@findex ASM_OUTPUT_EXTERNAL
@item ASM_OUTPUT_EXTERNAL (@var{stream}, @var{decl}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@@ -6688,17 +6753,17 @@ encoded by @code{TARGET_ENCODE_SECTION_INFO}.
@findex ASM_OUTPUT_LABEL_REF
@item ASM_OUTPUT_LABEL_REF (@var{stream}, @var{buf})
A C statement (sans semicolon) to output a reference to @var{buf}, the
-result of ASM_GENERATE_INTERNAL_LABEL. If not defined,
+result of @code{ASM_GENERATE_INTERNAL_LABEL}. If not defined,
@code{assemble_name} will be used to output the name of the symbol.
This macro is not used by @code{output_asm_label}, or the @code{%l}
specifier that calls it; the intention is that this macro should be set
-when it is necessary to output a label differently when its address
-is being taken.
+when it is necessary to output a label differently when its address is
+being taken.
+@end table
-@findex ASM_OUTPUT_INTERNAL_LABEL
-@item ASM_OUTPUT_INTERNAL_LABEL (@var{stream}, @var{prefix}, @var{num})
-A C statement to output to the stdio stream @var{stream} a label whose
-name is made from the string @var{prefix} and the number @var{num}.
+@deftypefn {Target Hook} void TARGET_ASM_INTERNAL_LABEL (FILE *@var{stream}, const char *@var{prefix}, unsigned long @var{labelno})
+A function to output to the stdio stream @var{stream} a label whose
+name is made from the string @var{prefix} and the number @var{labelno}.
It is absolutely essential that these labels be distinct from the labels
used for user-level functions and variables. Otherwise, certain programs
@@ -6710,12 +6775,11 @@ should be excluded; on many systems, the letter @samp{L} at the
beginning of a label has this effect. You should find out what
convention your system uses, and follow it.
-The usual definition of this macro is as follows:
+The default version of this function utilizes ASM_GENERATE_INTERNAL_LABEL.
-@example
-fprintf (@var{stream}, "L%s%d:\n", @var{prefix}, @var{num})
-@end example
+@end deftypefn
+@table @code
@findex ASM_OUTPUT_DEBUG_LABEL
@item ASM_OUTPUT_DEBUG_LABEL (@var{stream}, @var{prefix}, @var{num})
A C statement to output to the stdio stream @var{stream} a debug info
@@ -6726,7 +6790,7 @@ systems, branch target labels must be at the beginning of instruction
bundles, but debug info labels can occur in the middle of instruction
bundles.
-If this macro is not defined, then @code{ASM_OUTPUT_INTERNAL_LABEL} will be
+If this macro is not defined, then @code{(*targetm.asm_out.internal_label)} will be
used.
@findex ASM_GENERATE_INTERNAL_LABEL
@@ -6735,7 +6799,7 @@ A C statement to store into the string @var{string} a label whose name
is made from the string @var{prefix} and the number @var{num}.
This string, when output subsequently by @code{assemble_name}, should
-produce the output that @code{ASM_OUTPUT_INTERNAL_LABEL} would produce
+produce the output that @code{(*targetm.asm_out.internal_label)} would produce
with the same @var{prefix} and @var{num}.
If the string begins with @samp{*}, then @code{assemble_name} will
@@ -6765,6 +6829,9 @@ conflict with the user's own symbols. Most assemblers allow periods
or percent signs in assembler symbols; putting at least one of these
between the name and the number will suffice.
+If this macro is not defined, a default definition will be provided
+which is correct for most systems.
+
@findex ASM_OUTPUT_DEF
@item ASM_OUTPUT_DEF (@var{stream}, @var{name}, @var{value})
A C statement to output to the stdio stream @var{stream} assembler code
@@ -7334,7 +7401,7 @@ A C statement to output to the stdio stream @var{stream} an assembler
pseudo-instruction to generate a difference between two labels.
@var{value} and @var{rel} are the numbers of two internal labels. The
definitions of these labels are output using
-@code{ASM_OUTPUT_INTERNAL_LABEL}, and they must be printed in the same
+@code{(*targetm.asm_out.internal_label)}, and they must be printed in the same
way here. For example,
@example
@@ -7356,7 +7423,7 @@ in a dispatch table are absolute.
The definition should be a C statement to output to the stdio stream
@var{stream} an assembler pseudo-instruction to generate a reference to
a label. @var{value} is the number of an internal label whose
-definition is output using @code{ASM_OUTPUT_INTERNAL_LABEL}.
+definition is output using @code{(*targetm.asm_out.internal_label)}.
For example,
@example
@@ -7367,7 +7434,7 @@ fprintf (@var{stream}, "\t.word L%d\n", @var{value})
@item ASM_OUTPUT_CASE_LABEL (@var{stream}, @var{prefix}, @var{num}, @var{table})
Define this if the label before a jump-table needs to be output
specially. The first three arguments are the same as for
-@code{ASM_OUTPUT_INTERNAL_LABEL}; the fourth argument is the
+@code{(*targetm.asm_out.internal_label)}; the fourth argument is the
jump-table which follows (a @code{jump_insn} containing an
@code{addr_vec} or @code{addr_diff_vec}).
@@ -7375,7 +7442,7 @@ This feature is used on system V to output a @code{swbeg} statement
for the table.
If this macro is not defined, these labels are output with
-@code{ASM_OUTPUT_INTERNAL_LABEL}.
+@code{(*targetm.asm_out.internal_label)}.
@findex ASM_OUTPUT_CASE_END
@item ASM_OUTPUT_CASE_END (@var{stream}, @var{num}, @var{table})
@@ -7469,6 +7536,13 @@ is a function that outputs a standard GAS section directive, if
directive followed by a synthetic label.
@end deftypefn
+@deftypevar {Target Hook} bool TARGET_TERMINATE_DW2_EH_FRAME_INFO
+Contains the value true if the target should add a zero word onto the
+end of a Dwarf-2 frame info section when used for exception handling.
+Default value is false if @code{EH_FRAME_SECTION_NAME} is defined, and
+true otherwise.
+@end deftypevar
+
@node Alignment Output
@subsection Assembler Commands for Alignment
@@ -7561,6 +7635,11 @@ A C statement to output to the stdio stream @var{stream} an assembler
command to advance the location counter to a multiple of 2 to the
@var{power} bytes. @var{power} will be a C expression of type @code{int}.
+@findex ASM_OUTPUT_ALIGN_WITH_NOP
+@item ASM_OUTPUT_ALIGN_WITH_NOP (@var{stream}, @var{power})
+Like @code{ASM_OUTPUT_ALIGN}, except that the ``nop'' instruction is used
+for padding, if necessary.
+
@findex ASM_OUTPUT_MAX_SKIP_ALIGN
@item ASM_OUTPUT_MAX_SKIP_ALIGN (@var{stream}, @var{power}, @var{max_skip})
A C statement to output to the stdio stream @var{stream} an assembler
@@ -7809,6 +7888,11 @@ argument @var{name} is the name of an assembler symbol (for use with
@item DBX_OUTPUT_RBRAC (@var{stream}, @var{name})
Like @code{DBX_OUTPUT_LBRAC}, but for the end of a scope level.
+@findex DBX_OUTPUT_NFUN
+@item DBX_OUTPUT_NFUN (@var{stream}, @var{lscope_label}, @var{decl})
+Define this macro if the target machine requires special handling to
+output an @code{N_FUN} entry for the function @var{decl}.
+
@findex DBX_OUTPUT_ENUM
@item DBX_OUTPUT_ENUM (@var{stream}, @var{type})
Define this macro if the target machine requires special handling to
@@ -8002,6 +8086,22 @@ Define this macro to be a nonzero value if the assembler can generate Dwarf 2
line debug info sections. This will result in much more compact line number
tables, and hence is desirable if it works.
+@findex ASM_OUTPUT_DWARF_DELTA
+@item ASM_OUTPUT_DWARF_DELTA (@var{stream}, @var{size}, @var{label1}, @var{label2})
+A C statement to issue assembly directives that create a difference
+between the two given labels, using an integer of the given size.
+
+@findex ASM_OUTPUT_DWARF_OFFSET
+@item ASM_OUTPUT_DWARF_OFFSET (@var{stream}, @var{size}, @var{label})
+A C statement to issue assembly directives that create a
+section-relative reference to the given label, using an integer of the
+given size.
+
+@findex ASM_OUTPUT_DWARF_PCREL
+@item ASM_OUTPUT_DWARF_PCREL (@var{stream}, @var{size}, @var{label})
+A C statement to issue assembly directives that create a self-relative
+reference to the given label, using an integer of the given size.
+
@findex PUT_SDB_@dots{}
@item PUT_SDB_@dots{}
Define these macros to override the assembler syntax for the special
@@ -8097,11 +8197,6 @@ floating point format supports negative zeroes and/or NaNs,
Tests whether @var{x} is less than @var{y}.
@end deftypefn
-@findex ldexp
-@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_LDEXP (REAL_VALUE_TYPE @var{x}, int @var{scale})
-Multiplies @var{x} by 2 raised to the power @var{scale}.
-@end deftypefn
-
@deftypefn Macro HOST_WIDE_INT REAL_VALUE_FIX (REAL_VALUE_TYPE @var{x})
Truncates @var{x} to a signed integer, rounding toward zero.
@end deftypefn
@@ -8111,17 +8206,6 @@ Truncates @var{x} to an unsigned integer, rounding toward zero. If
@var{x} is negative, returns zero.
@end deftypefn
-@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_RNDZINT (REAL_VALUE_TYPE @var{x})
-Rounds the target-machine floating point value @var{x} towards zero to an
-integer value, but leaves it represented as a floating point number.
-@end deftypefn
-
-@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_UNSIGNED_RNDZINT (REAL_VALUE_TYPE @var{x})
-Rounds the target-machine floating point value @var{x} towards zero to an
-unsigned integer value, but leaves it represented as a floating point
-number. If @var{x} is negative, returns (positive) zero.
-@end deftypefn
-
@deftypefn Macro REAL_VALUE_TYPE REAL_VALUE_ATOF (const char *@var{string}, enum machine_mode @var{mode})
Converts @var{string} into a floating point number in the target machine's
representation for mode @var{mode}. This routine can handle both
@@ -8439,7 +8523,7 @@ elements of a jump-table should have.
Optional: return the preferred mode for an @code{addr_diff_vec}
when the minimum and maximum offset are known. If you define this,
it enables extra code in branch shortening to deal with @code{addr_diff_vec}.
-To make this work, you also have to define INSN_ALIGN and
+To make this work, you also have to define @code{INSN_ALIGN} and
make the alignment for @code{addr_diff_vec} explicit.
The @var{body} argument is provided so that the offset_unsigned and scale
flags can be updated.
@@ -8776,6 +8860,21 @@ within a structure, in much the same way as the @samp{__aligned__} and
@samp{__packed__} @code{__attribute__}s do. A pack value of zero resets
the behavior to the default.
+A subtlety for Microsoft Visual C/C++ style bit-field packing
+(e.g. -mms-bitfields) for targets that support it:
+When a bit-field is inserted into a packed record, the whole size
+of the underlying type is used by one or more same-size adjacent
+bit-fields (that is, if its long:3, 32 bits is used in the record,
+and any additional adjacent long bit-fields are packed into the same
+chunk of 32 bits. However, if the size changes, a new field of that
+size is allocated).
+
+If both MS bit-fields and @samp{__attribute__((packed))} are used,
+the latter will take precedence. If @samp{__attribute__((packed))} is
+used on a single field when MS bit-fields are in use, it will take
+precedence for that field, but the alignment of the rest of the structure
+may affect its placement.
+
The weak pragma only works if @code{SUPPORTS_WEAK} and
@code{ASM_WEAKEN_LABEL} are defined. If enabled it allows the creation
of specifically named weak labels, optionally with a value.
diff --git a/gcc/doc/trouble.texi b/gcc/doc/trouble.texi
index 3efca1fc959..d6ba63259d6 100644
--- a/gcc/doc/trouble.texi
+++ b/gcc/doc/trouble.texi
@@ -105,11 +105,13 @@ libraries and debuggers on certain systems.
@itemize @bullet
@item
-G++ does not do name mangling in the same way as other C++
-compilers. This means that object files compiled with one compiler
-cannot be used with another.
+On many platforms, GCC supports a different ABI for C++ than do other
+compilers, so the object files compiled by GCC cannot be used with object
+files generated by another C++ compiler.
-This effect is intentional, to protect you from more subtle problems.
+An area where the difference is most apparent is name mangling. The use
+of different name mangling is intentional, to protect you from more subtle
+problems.
Compilers differ as to many internal details of C++ implementation,
including: how class instances are laid out, how multiple inheritance is
implemented, and how virtual function calls are handled. If the name
@@ -161,7 +163,7 @@ Naturally, this does not happen when you use GCC@.
You must specify all three options explicitly.
@item
-On a Sparc, GCC aligns all values of type @code{double} on an 8-byte
+On a SPARC, GCC aligns all values of type @code{double} on an 8-byte
boundary, and it expects every @code{double} to be so aligned. The Sun
compiler usually gives @code{double} values 8-byte alignment, with one
exception: function arguments of type @code{double} may not be aligned.
@@ -200,7 +202,7 @@ Storing into the pointer can be done likewise with the same union.
@item
On Solaris, the @code{malloc} function in the @file{libmalloc.a} library
may allocate memory that is only 4 byte aligned. Since GCC on the
-Sparc assumes that doubles are 8 byte aligned, this may result in a
+SPARC assumes that doubles are 8 byte aligned, this may result in a
fatal signal if doubles are stored in memory allocated by the
@file{libmalloc.a} library.
@@ -217,7 +219,7 @@ when linking, compile and link against the file
@file{mit/util/misc/dlsym.c} from the MIT version of X windows.
@item
-The 128-bit long double format that the Sparc port supports currently
+The 128-bit long double format that the SPARC port supports currently
works by using the architecturally defined quad-word floating point
instructions. Since there is no hardware that supports these
instructions they must be emulated by the operating system. Long
diff --git a/gcc/doc/vms.texi b/gcc/doc/vms.texi
index 5ab266695a8..080d4522bed 100644
--- a/gcc/doc/vms.texi
+++ b/gcc/doc/vms.texi
@@ -10,117 +10,11 @@
Here is how to use GCC on VMS@.
@menu
-* Include Files and VMS:: Where the preprocessor looks for the include files.
* Global Declarations:: How to do globaldef, globalref and globalvalue with
GCC.
* VMS Misc:: Misc information.
@end menu
-@node Include Files and VMS
-@section Include Files and VMS
-
-@cindex include files and VMS
-@cindex VMS and include files
-@cindex header files and VMS
-Due to the differences between the filesystems of Unix and VMS, GCC
-attempts to translate file names in @samp{#include} into names that VMS
-will understand. The basic strategy is to prepend a prefix to the
-specification of the include file, convert the whole filename to a VMS
-filename, and then try to open the file. GCC tries various prefixes
-one by one until one of them succeeds:
-
-@enumerate
-@item
-The first prefix is the @samp{GNU_CC_INCLUDE:} logical name: this is
-where GNU C header files are traditionally stored. If you wish to store
-header files in non-standard locations, then you can assign the logical
-@samp{GNU_CC_INCLUDE} to be a search list, where each element of the
-list is suitable for use with a rooted logical.
-
-@item
-The next prefix tried is @samp{SYS$SYSROOT:[SYSLIB.]}. This is where
-VAX-C header files are traditionally stored.
-
-@item
-If the include file specification by itself is a valid VMS filename, the
-preprocessor then uses this name with no prefix in an attempt to open
-the include file.
-
-@item
-If the file specification is not a valid VMS filename (i.e.@: does not
-contain a device or a directory specifier, and contains a @samp{/}
-character), the preprocessor tries to convert it from Unix syntax to
-VMS syntax.
-
-Conversion works like this: the first directory name becomes a device,
-and the rest of the directories are converted into VMS-format directory
-names. For example, the name @file{X11/foobar.h} is
-translated to @file{X11:[000000]foobar.h} or @file{X11:foobar.h},
-whichever one can be opened. This strategy allows you to assign a
-logical name to point to the actual location of the header files.
-
-@item
-If none of these strategies succeeds, the @samp{#include} fails.
-@end enumerate
-
-Include directives of the form:
-
-@example
-#include foobar
-@end example
-
-@noindent
-are a common source of incompatibility between VAX-C and GCC@. VAX-C
-treats this much like a standard @code{#include <foobar.h>} directive.
-That is incompatible with the ISO C behavior implemented by GCC: to
-expand the name @code{foobar} as a macro. Macro expansion should
-eventually yield one of the two standard formats for @code{#include}:
-
-@example
-#include "@var{file}"
-#include <@var{file}>
-@end example
-
-If you have this problem, the best solution is to modify the source to
-convert the @code{#include} directives to one of the two standard forms.
-That will work with either compiler. If you want a quick and dirty fix,
-define the file names as macros with the proper expansion, like this:
-
-@example
-#define stdio <stdio.h>
-@end example
-
-@noindent
-This will work, as long as the name doesn't conflict with anything else
-in the program.
-
-Another source of incompatibility is that VAX-C assumes that:
-
-@example
-#include "foobar"
-@end example
-
-@noindent
-is actually asking for the file @file{foobar.h}. GCC does not
-make this assumption, and instead takes what you ask for literally;
-it tries to read the file @file{foobar}. The best way to avoid this
-problem is to always specify the desired file extension in your include
-directives.
-
-GCC for VMS is distributed with a set of include files that is
-sufficient to compile most general purpose programs. Even though the
-GCC distribution does not contain header files to define constants
-and structures for some VMS system-specific functions, there is no
-reason why you cannot use GCC with any of these functions. You first
-may have to generate or create header files, either by using the public
-domain utility @code{UNSDL} (which can be found on a DECUS tape), or by
-extracting the relevant modules from one of the system macro libraries,
-and using an editor to construct a C header file.
-
-A @code{#include} file name cannot contain a DECNET node name. The
-preprocessor reports an I/O error if you attempt to use a node name,
-whether explicitly, or implicitly via a logical name.
-
@node Global Declarations
@section Global Declarations and VMS
diff --git a/gcc/doloop.c b/gcc/doloop.c
index 9bddb92ed23..1f7d47ae035 100644
--- a/gcc/doloop.c
+++ b/gcc/doloop.c
@@ -140,7 +140,7 @@ doloop_condition_get (pattern)
/* Return an estimate of the maximum number of loop iterations for the
loop specified by LOOP or zero if the loop is not normal.
- MODE is the mode of the iteration count and NONNEG is non-zero if
+ MODE is the mode of the iteration count and NONNEG is nonzero if
the iteration count has been proved to be non-negative. */
static unsigned HOST_WIDE_INT
doloop_iterations_max (loop_info, mode, nonneg)
@@ -249,7 +249,7 @@ doloop_iterations_max (loop_info, mode, nonneg)
}
-/* Return non-zero if the loop specified by LOOP is suitable for
+/* Return nonzero if the loop specified by LOOP is suitable for
the use of special low-overhead looping instructions. */
static int
doloop_valid_p (loop, jump_insn)
@@ -339,6 +339,7 @@ doloop_valid_p (loop, jump_insn)
condition at run-time and have an additional jump around the loop
to ensure an infinite loop. */
if (loop_info->comparison_code == NE
+ && !loop_info->preconditioned
&& INTVAL (loop_info->increment) != -1
&& INTVAL (loop_info->increment) != 1)
{
@@ -367,7 +368,7 @@ doloop_valid_p (loop, jump_insn)
If the absolute increment is not 1, the loop can be infinite
even with LTU/GTU, e.g. for (i = 3; i > 0; i -= 2)
- Note that with LE and GE, the loop behaviour is undefined
+ Note that with LE and GE, the loop behavior is undefined
(C++ standard section 5 clause 5) if an overflow occurs, say
between INT_MAX and INT_MAX + 1. We thus don't have to worry
about these two cases.
@@ -375,7 +376,7 @@ doloop_valid_p (loop, jump_insn)
??? We could compute these conditions at run-time and have a
additional jump around the loop to ensure an infinite loop.
However, it is very unlikely that this is the intended
- behaviour of the loop and checking for these rare boundary
+ behavior of the loop and checking for these rare boundary
conditions would pessimize all other code.
If the loop is executed only a few times an extra check to
@@ -399,7 +400,7 @@ doloop_valid_p (loop, jump_insn)
number of loop iterations, ITERATIONS_MAX is a CONST_INT specifying
the maximum number of loop iterations, and DOLOOP_INSN is the
low-overhead looping insn to emit at the end of the loop. This
- returns non-zero if it was successful. */
+ returns nonzero if it was successful. */
static int
doloop_modify (loop, iterations, iterations_max,
doloop_seq, start_label, condition)
@@ -539,7 +540,7 @@ doloop_modify (loop, iterations, iterations_max,
not present, we emit one. The loop to modify is described by LOOP.
ITERATIONS_MAX is a CONST_INT specifying the estimated maximum
number of loop iterations. DOLOOP_INSN is the low-overhead looping
- insn to insert. Returns non-zero if loop successfully modified. */
+ insn to insert. Returns nonzero if loop successfully modified. */
static int
doloop_modify_runtime (loop, iterations_max,
doloop_seq, start_label, mode, condition)
@@ -668,8 +669,8 @@ doloop_modify_runtime (loop, iterations_max,
fprintf (loop_dump_stream,
"Doloop: Basic induction var skips initial incr.\n");
- diff = expand_simple_binop (mode, PLUS, diff, increment, diff,
- unsigned_p, OPTAB_LIB_WIDEN);
+ diff = expand_simple_binop (mode, PLUS, diff, GEN_INT (abs_inc),
+ diff, unsigned_p, OPTAB_LIB_WIDEN);
}
}
@@ -749,7 +750,7 @@ doloop_modify_runtime (loop, iterations_max,
suitable. We distinguish between loops with compile-time bounds
and those with run-time bounds. Information from LOOP is used to
compute the number of iterations and to determine whether the loop
- is a candidate for this optimization. Returns non-zero if loop
+ is a candidate for this optimization. Returns nonzero if loop
successfully modified. */
int
doloop_optimize (loop)
diff --git a/gcc/dominance.c b/gcc/dominance.c
index dd90686829f..48c621961e1 100644
--- a/gcc/dominance.c
+++ b/gcc/dominance.c
@@ -145,7 +145,7 @@ void debug_dominance_info PARAMS ((dominance_info));
while (0)
/* Allocate all needed memory in a pessimistic fashion (so we round up).
- This initialises the contents of DI, which already must be allocated. */
+ This initializes the contents of DI, which already must be allocated. */
static void
init_dom_info (di)
diff --git a/gcc/dwarf2.h b/gcc/dwarf2.h
index a84eb2cabd1..a7f5f0f8d68 100644
--- a/gcc/dwarf2.h
+++ b/gcc/dwarf2.h
@@ -399,10 +399,12 @@ enum dwarf_location_atom
DW_OP_push_object_address = 0x97,
DW_OP_call2 = 0x98,
DW_OP_call4 = 0x99,
- DW_OP_calli = 0x9a
+ DW_OP_call_ref = 0x9a,
+ /* GNU extensions. */
+ DW_OP_GNU_push_tls_address = 0xe0
};
-#define DW_OP_lo_user 0x80 /* Implementation-defined range start. */
+#define DW_OP_lo_user 0xe0 /* Implementation-defined range start. */
#define DW_OP_hi_user 0xff /* Implementation-defined range end. */
/* Type encodings. */
diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c
index 6e6a5d02303..9b5cab7f13b 100644
--- a/gcc/dwarf2asm.c
+++ b/gcc/dwarf2asm.c
@@ -104,11 +104,14 @@ dw2_asm_output_delta VPARAMS ((int size, const char *lab1, const char *lab2,
VA_FIXEDARG (ap, const char *, lab2);
VA_FIXEDARG (ap, const char *, comment);
+#ifdef ASM_OUTPUT_DWARF_DELTA
+ ASM_OUTPUT_DWARF_DELTA (asm_out_file, size, lab1, lab2);
+#else
dw2_assemble_integer (size,
gen_rtx_MINUS (Pmode,
gen_rtx_SYMBOL_REF (Pmode, lab1),
gen_rtx_SYMBOL_REF (Pmode, lab2)));
-
+#endif
if (flag_debug_asm && comment)
{
fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
@@ -282,11 +285,10 @@ int
size_of_uleb128 (value)
unsigned HOST_WIDE_INT value;
{
- int size = 0, byte;
+ int size = 0;
do
{
- byte = (value & 0x7f);
value >>= 7;
size += 1;
}
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index cf692d653ee..240ccb5c1ff 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -203,6 +203,7 @@ typedef struct dw_fde_struct
const char *dw_fde_end;
dw_cfi_ref dw_fde_cfi;
unsigned funcdef_number;
+ unsigned all_throwers_are_sibcalls : 1;
unsigned nothrow : 1;
unsigned uses_eh_lsda : 1;
}
@@ -1159,7 +1160,7 @@ static dw_cfa_location cfa_temp;
had better be the one we think we're using for this purpose.
Except: If the register being saved is the CFA register, and the
- offset is non-zero, we are saving the CFA, so we assume we have to
+ offset is nonzero, we are saving the CFA, so we assume we have to
use DW_CFA_def_cfa_expression. If the offset is 0, we assume that
the intent is to save the value of SP from the previous frame.
@@ -1952,11 +1953,12 @@ output_call_frame_info (for_eh)
fde = &fde_table[i];
/* Don't emit EH unwind info for leaf functions that don't need it. */
- if (!flag_asynchronous_unwind_tables && for_eh && fde->nothrow
- && ! fde->uses_eh_lsda)
+ if (!flag_asynchronous_unwind_tables && for_eh
+ && (fde->nothrow || fde->all_throwers_are_sibcalls)
+ && !fde->uses_eh_lsda)
continue;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, FDE_LABEL, for_eh + i * 2);
+ (*targetm.asm_out.internal_label) (asm_out_file, FDE_LABEL, for_eh + i * 2);
ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + i * 2);
ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + i * 2);
dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
@@ -2041,10 +2043,8 @@ output_call_frame_info (for_eh)
ASM_OUTPUT_LABEL (asm_out_file, l2);
}
-#ifndef EH_FRAME_SECTION_NAME
- if (for_eh)
+ if (for_eh && targetm.terminate_dw2_eh_frame_info)
dw2_asm_output_data (4, 0, "End of Table");
-#endif
#ifdef MIPS_DEBUGGING_INFO
/* Work around Irix 6 assembler bug whereby labels at the end of a section
get a value of 0. Putting .align 0 after the label fixes it. */
@@ -2115,6 +2115,7 @@ dwarf2out_begin_prologue (line, file)
fde->funcdef_number = current_function_funcdef_no;
fde->nothrow = current_function_nothrow;
fde->uses_eh_lsda = cfun->uses_eh_lsda;
+ fde->all_throwers_are_sibcalls = cfun->all_throwers_are_sibcalls;
args_size = old_args_size = 0;
@@ -2179,6 +2180,11 @@ dwarf2out_frame_finish ()
/* And now, the subset of the debugging information support code necessary
for emitting location expressions. */
+/* We need some way to distinguish DW_OP_addr with a direct symbol
+ relocation from DW_OP_addr with a dtp-relative symbol relocation. */
+#define INTERNAL_DW_OP_tls_addr (0x100 + DW_OP_addr)
+
+
typedef struct dw_val_struct *dw_val_ref;
typedef struct die_struct *dw_die_ref;
typedef struct dw_loc_descr_struct *dw_loc_descr_ref;
@@ -2304,6 +2310,7 @@ dwarf_stack_op_name (op)
switch (op)
{
case DW_OP_addr:
+ case INTERNAL_DW_OP_tls_addr:
return "DW_OP_addr";
case DW_OP_deref:
return "DW_OP_deref";
@@ -2593,6 +2600,16 @@ dwarf_stack_op_name (op)
return "DW_OP_xderef_size";
case DW_OP_nop:
return "DW_OP_nop";
+ case DW_OP_push_object_address:
+ return "DW_OP_push_object_address";
+ case DW_OP_call2:
+ return "DW_OP_call2";
+ case DW_OP_call4:
+ return "DW_OP_call4";
+ case DW_OP_call_ref:
+ return "DW_OP_call_ref";
+ case DW_OP_GNU_push_tls_address:
+ return "DW_OP_GNU_push_tls_address";
default:
return "OP_<unknown>";
}
@@ -2650,6 +2667,7 @@ size_of_loc_descr (loc)
switch (loc->dw_loc_opc)
{
case DW_OP_addr:
+ case INTERNAL_DW_OP_tls_addr:
size += DWARF2_ADDR_SIZE;
break;
case DW_OP_const1u:
@@ -2735,6 +2753,15 @@ size_of_loc_descr (loc)
case DW_OP_xderef_size:
size += 1;
break;
+ case DW_OP_call2:
+ size += 2;
+ break;
+ case DW_OP_call4:
+ size += 4;
+ break;
+ case DW_OP_call_ref:
+ size += DWARF2_ADDR_SIZE;
+ break;
default:
break;
}
@@ -2884,6 +2911,17 @@ output_loc_operands (loc)
case DW_OP_xderef_size:
dw2_asm_output_data (1, val1->v.val_int, NULL);
break;
+
+ case INTERNAL_DW_OP_tls_addr:
+#ifdef ASM_OUTPUT_DWARF_DTPREL
+ ASM_OUTPUT_DWARF_DTPREL (asm_out_file, DWARF2_ADDR_SIZE,
+ val1->v.val_addr);
+ fputc ('\n', asm_out_file);
+#else
+ abort ();
+#endif
+ break;
+
default:
/* Other codes have no operands. */
break;
@@ -3222,7 +3260,7 @@ limbo_die_node;
#define ASM_COMMENT_START ";#"
#endif
-/* Define a macro which returns non-zero for a TYPE_DECL which was
+/* Define a macro which returns nonzero for a TYPE_DECL which was
implicitly generated for a tagged type.
Note that unlike the gcc front end (which generates a NULL named
@@ -3314,10 +3352,6 @@ struct file_table
/* Filenames referenced by this compilation unit. */
static struct file_table file_table;
-/* Local pointer to the name of the main input file. Initialized in
- dwarf2out_init. */
-static const char *primary_filename;
-
/* A pointer to the base of a table of references to DIE's that describe
declarations. The table is indexed by DECL_UID() which is a unique
number identifying each decl. */
@@ -3587,7 +3621,8 @@ static unsigned int simple_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,
- enum dwarf_attribute, rtx));
+ enum dwarf_attribute,
+ dw_loc_descr_ref));
static void add_data_member_location_attribute PARAMS ((dw_die_ref, tree));
static void add_const_value_attribute PARAMS ((dw_die_ref, rtx));
static rtx rtl_for_decl_location PARAMS ((tree));
@@ -3807,7 +3842,7 @@ type_main_variant (type)
return type;
}
-/* Return non-zero if the given type node represents a tagged type. */
+/* Return nonzero if the given type node represents a tagged type. */
static inline int
is_tagged_type (type)
@@ -7400,7 +7435,7 @@ root_type (type)
}
}
-/* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the
+/* Given a pointer to an arbitrary ..._TYPE tree node, return nonzero if the
given input type is a Dwarf "fundamental" type. Otherwise return null. */
static inline int
@@ -7441,6 +7476,27 @@ is_base_type (type)
return 0;
}
+/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
+ node, return the size in bits for the type if it is a constant, or else
+ return the alignment for the type if the type's size is not constant, or
+ else return BITS_PER_WORD if the type actually turns out to be an
+ ERROR_MARK node. */
+
+static inline unsigned HOST_WIDE_INT
+simple_type_size_in_bits (type)
+ tree type;
+{
+
+ if (TREE_CODE (type) == ERROR_MARK)
+ return BITS_PER_WORD;
+ else if (TYPE_SIZE (type) == NULL_TREE)
+ return 0;
+ else if (host_integerp (TYPE_SIZE (type), 1))
+ return tree_low_cst (TYPE_SIZE (type), 1);
+ else
+ return TYPE_ALIGN (type);
+}
+
/* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging
entry that chains various modifiers in front of the given type. */
@@ -7518,7 +7574,8 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die)
else if (code == POINTER_TYPE)
{
mod_type_die = new_die (DW_TAG_pointer_type, comp_unit_die, type);
- add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
+ add_AT_unsigned (mod_type_die, DW_AT_byte_size,
+ simple_type_size_in_bits (type) / BITS_PER_UNIT);
#if 0
add_AT_unsigned (mod_type_die, DW_AT_address_class, 0);
#endif
@@ -7527,7 +7584,8 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die)
else if (code == REFERENCE_TYPE)
{
mod_type_die = new_die (DW_TAG_reference_type, comp_unit_die, type);
- add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
+ add_AT_unsigned (mod_type_die, DW_AT_byte_size,
+ simple_type_size_in_bits (type) / BITS_PER_UNIT);
#if 0
add_AT_unsigned (mod_type_die, DW_AT_address_class, 0);
#endif
@@ -8012,6 +8070,42 @@ loc_descriptor_from_tree (loc, addressp)
: 0);
case VAR_DECL:
+ if (DECL_THREAD_LOCAL (loc))
+ {
+ rtx rtl;
+
+#ifndef ASM_OUTPUT_DWARF_DTPREL
+ /* If this is not defined, we have no way to emit the data. */
+ return 0;
+#endif
+
+ /* The way DW_OP_GNU_push_tls_address is specified, we can only
+ look up addresses of objects in the current module. */
+ if (DECL_EXTERNAL (loc))
+ return 0;
+
+ rtl = rtl_for_decl_location (loc);
+ if (rtl == NULL_RTX)
+ return 0;
+
+ if (GET_CODE (rtl) != MEM)
+ return 0;
+ rtl = XEXP (rtl, 0);
+ if (! CONSTANT_P (rtl))
+ return 0;
+
+ ret = new_loc_descr (INTERNAL_DW_OP_tls_addr, 0, 0);
+ ret->dw_loc_oprnd1.val_class = dw_val_class_addr;
+ ret->dw_loc_oprnd1.v.val_addr = rtl;
+
+ ret1 = new_loc_descr (DW_OP_GNU_push_tls_address, 0, 0);
+ add_loc_descr (&ret, ret1);
+
+ indirect_p = 1;
+ break;
+ }
+ /* FALLTHRU */
+
case PARM_DECL:
{
rtx rtl = rtl_for_decl_location (loc);
@@ -8346,27 +8440,6 @@ simple_decl_align_in_bits (decl)
return (TREE_CODE (decl) != ERROR_MARK) ? DECL_ALIGN (decl) : BITS_PER_WORD;
}
-/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
- node, return the size in bits for the type if it is a constant, or else
- return the alignment for the type if the type's size is not constant, or
- else return BITS_PER_WORD if the type actually turns out to be an
- ERROR_MARK node. */
-
-static inline unsigned HOST_WIDE_INT
-simple_type_size_in_bits (type)
- tree type;
-{
-
- if (TREE_CODE (type) == ERROR_MARK)
- return BITS_PER_WORD;
- else if (TYPE_SIZE (type) == NULL_TREE)
- return 0;
- else if (host_integerp (TYPE_SIZE (type), 1))
- return tree_low_cst (TYPE_SIZE (type), 1);
- else
- return TYPE_ALIGN (type);
-}
-
/* Given a pointer to a FIELD_DECL, compute and return the byte offset of the
lowest addressed byte of the "containing object" for the given FIELD_DECL,
or return 0 if we are unable to determine what that offset is, either
@@ -8494,14 +8567,12 @@ field_byte_offset (decl)
whole parameters. Note that the location attributes for struct fields are
generated by the routine `data_member_location_attribute' below. */
-static void
-add_AT_location_description (die, attr_kind, rtl)
+static inline void
+add_AT_location_description (die, attr_kind, descr)
dw_die_ref die;
enum dwarf_attribute attr_kind;
- rtx rtl;
+ dw_loc_descr_ref descr;
{
- dw_loc_descr_ref descr = loc_descriptor (rtl);
-
if (descr != 0)
add_AT_loc (die, attr_kind, descr);
}
@@ -8926,6 +8997,13 @@ rtl_for_decl_location (decl)
if (rtl)
rtl = ASM_SIMPLIFY_DWARF_ADDR (rtl);
#endif
+
+ /* If we don't look past the constant pool, we risk emitting a
+ reference to a constant pool entry that isn't referenced from
+ code, and thus is not emitted. */
+ if (rtl)
+ rtl = avoid_constant_pool_reference (rtl);
+
return rtl;
}
@@ -8946,6 +9024,7 @@ add_location_or_const_value_attribute (die, decl)
tree decl;
{
rtx rtl;
+ dw_loc_descr_ref descr;
if (TREE_CODE (decl) == ERROR_MARK)
return;
@@ -8956,16 +9035,11 @@ add_location_or_const_value_attribute (die, decl)
if (rtl == NULL_RTX)
return;
- /* If we don't look past the constant pool, we risk emitting a
- reference to a constant pool entry that isn't referenced from
- code, and thus is not emitted. */
- rtl = avoid_constant_pool_reference (rtl);
-
switch (GET_CODE (rtl))
{
case ADDRESSOF:
- /* The address of a variable that was optimized away; don't emit
- anything. */
+ /* The address of a variable that was optimized away;
+ don't emit anything. */
break;
case CONST_INT:
@@ -8980,12 +9054,24 @@ add_location_or_const_value_attribute (die, decl)
break;
case MEM:
- case REG:
- case SUBREG:
- case CONCAT:
- add_AT_location_description (die, DW_AT_location, rtl);
+ if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
+ {
+ /* Need loc_descriptor_from_tree since that's where we know
+ how to handle TLS variables. Want the object's address
+ since the top-level DW_AT_location assumes such. See
+ the confusion in loc_descriptor for reference. */
+ descr = loc_descriptor_from_tree (decl, 1);
+ }
+ else
+ {
+ case REG:
+ case SUBREG:
+ case CONCAT:
+ descr = loc_descriptor (rtl);
+ }
+ add_AT_location_description (die, DW_AT_location, descr);
break;
-
+
default:
abort ();
}
@@ -9117,7 +9203,8 @@ add_bound_info (subrange_die, bound_attr, bound)
add_AT_flag (decl_die, DW_AT_artificial, 1);
add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx);
- add_AT_location_description (decl_die, DW_AT_location, loc);
+ add_AT_location_description (decl_die, DW_AT_location,
+ loc_descriptor (loc));
add_AT_die_ref (subrange_die, bound_attr, decl_die);
}
@@ -10322,7 +10409,7 @@ gen_subprogram_die (decl, context_die)
is not part of the state saved/restored for inline functions. */
if (current_function_needs_context)
add_AT_location_description (subr_die, DW_AT_static_link,
- lookup_static_chain (decl));
+ loc_descriptor (lookup_static_chain (decl)));
#endif
}
@@ -11837,7 +11924,7 @@ dwarf2out_source_line (line, filename)
else if (DECL_SECTION_NAME (current_function_decl))
{
dw_separate_line_info_ref line_info;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, SEPARATE_LINE_CODE_LABEL,
+ (*targetm.asm_out.internal_label) (asm_out_file, SEPARATE_LINE_CODE_LABEL,
separate_line_info_table_in_use);
/* expand the line info table if necessary */
@@ -11863,7 +11950,7 @@ dwarf2out_source_line (line, filename)
{
dw_line_info_ref line_info;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL,
+ (*targetm.asm_out.internal_label) (asm_out_file, LINE_CODE_LABEL,
line_info_table_in_use);
/* Expand the line info table if necessary. */
@@ -11971,12 +12058,9 @@ dwarf2out_init (main_input_filename)
{
init_file_table ();
- /* Remember the name of the primary input file. */
- primary_filename = main_input_filename;
-
- /* Add it to the file table first, under the assumption that we'll
- be emitting line number data for it first, which avoids having
- to add an initial DW_LNS_set_file. */
+ /* Add the name of the primary input file to the file table first,
+ under the assumption that we'll be emitting line number data for
+ it first, which avoids having to add an initial DW_LNS_set_file. */
lookup_filename (main_input_filename);
/* Allocate the initial hunk of the decl_die_table. */
@@ -12180,7 +12264,7 @@ dwarf2out_finish (input_filename)
/* Output a terminator label for the .text section. */
text_section ();
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0);
+ (*targetm.asm_out.internal_label) (asm_out_file, TEXT_END_LABEL, 0);
/* Output the source line correspondence table. We must do this
even if there is no line information. Otherwise, on an empty
diff --git a/gcc/dwarfout.c b/gcc/dwarfout.c
index 5e621237bee..aa0014b00a7 100644
--- a/gcc/dwarfout.c
+++ b/gcc/dwarfout.c
@@ -43,7 +43,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
The generation of DWARF debugging information by the GNU version 2.x C
compiler has now been tested rather extensively for m88k, i386, i860, and
- Sparc targets. The DWARF output of the GNU C compiler appears to inter-
+ SPARC targets. The DWARF output of the GNU C compiler appears to inter-
operate well with the standard SVR4 SDB debugger on these kinds of target
systems (but of course, there are no guarantees).
@@ -600,7 +600,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
fprintf ((FILE), "%s", reg_names[REGNO (RTX)])
#endif
-/* Define a macro which returns non-zero for any tagged type which is
+/* Define a macro which returns nonzero for any tagged type which is
used (directly or indirectly) in the specification of either some
function's return type or some formal parameter of some function.
We use this macro when we are operating in "terse" mode to help us
@@ -612,12 +612,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
for these nodes. For now, we have to just fake it. It it safe for
us to simply return zero for all complete tagged types (which will
get forced out anyway if they were used in the specification of some
- formal or return type) and non-zero for all incomplete tagged types.
+ formal or return type) and nonzero for all incomplete tagged types.
*/
#define TYPE_USED_FOR_FUNCTION(tagged_type) (TYPE_SIZE (tagged_type) == 0)
-/* Define a macro which returns non-zero for a TYPE_DECL which was
+/* Define a macro which returns nonzero for a TYPE_DECL which was
implicitly generated for a tagged type.
Note that unlike the gcc front end (which generates a NULL named
@@ -707,7 +707,7 @@ static unsigned pending_siblings_allocated;
#define PENDING_SIBLINGS_INCREMENT 64
-/* Non-zero if we are performing our file-scope finalization pass and if
+/* Nonzero if we are performing our file-scope finalization pass and if
we should force out Dwarf descriptions of any and all file-scope
tagged types which are still incomplete types. */
@@ -1015,7 +1015,7 @@ static void retry_incomplete_types PARAMS ((void));
stock m88k/svr4 assembler, both of which need to see .L at the start of
a label in order to prevent that label from going into the linker symbol
table). When I get time, I'll have to fix this the right way so that we
- will use ASM_GENERATE_INTERNAL_LABEL and ASM_OUTPUT_INTERNAL_LABEL herein,
+ will use ASM_GENERATE_INTERNAL_LABEL and (*targetm.asm_out.internal_label) herein,
but that will require a rather massive set of changes. For the moment,
the following definitions out to produce the right results for all svr4
and svr3 assemblers. -- rfg
@@ -1325,7 +1325,7 @@ type_main_variant (type)
return type;
}
-/* Return non-zero if the given type node represents a tagged type. */
+/* Return nonzero if the given type node represents a tagged type. */
static inline int
is_tagged_type (type)
@@ -1950,7 +1950,7 @@ write_modifier_bytes (type, decl_const, decl_volatile)
write_modifier_bytes_1 (type, decl_const, decl_volatile, 0);
}
-/* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the
+/* Given a pointer to an arbitrary ..._TYPE tree node, return nonzero if the
given input type is a Dwarf "fundamental" type. Otherwise return zero. */
static inline int
@@ -4533,7 +4533,7 @@ pend_type (type)
TREE_ASM_WRITTEN (type) = 1;
}
-/* Return non-zero if it is legitimate to output DIEs to represent a
+/* Return nonzero if it is legitimate to output DIEs to represent a
given type while we are generating the list of child DIEs for some
DIE (e.g. a function or lexical block DIE) associated with a given scope.
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index cf138d37259..2cf410706d8 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -204,7 +204,7 @@ const_int_htab_hash (x)
return (hashval_t) INTVAL ((struct rtx_def *) x);
}
-/* Returns non-zero if the value represented by X (which is really a
+/* Returns nonzero if the value represented by X (which is really a
CONST_INT) is the same as that given by Y (which is really a
HOST_WIDE_INT *). */
@@ -221,16 +221,17 @@ static hashval_t
const_double_htab_hash (x)
const void *x;
{
- hashval_t h = 0;
- size_t i;
rtx value = (rtx) x;
+ hashval_t h;
- for (i = 0; i < sizeof(CONST_DOUBLE_FORMAT)-1; i++)
- h ^= XWINT (value, i);
+ if (GET_MODE (value) == VOIDmode)
+ h = CONST_DOUBLE_LOW (value) ^ CONST_DOUBLE_HIGH (value);
+ else
+ h = real_hash (CONST_DOUBLE_REAL_VALUE (value));
return h;
}
-/* Returns non-zero if the value represented by X (really a ...)
+/* Returns nonzero if the value represented by X (really a ...)
is the same as that represented by Y (really a ...) */
static int
const_double_htab_eq (x, y)
@@ -238,15 +239,15 @@ const_double_htab_eq (x, y)
const void *y;
{
rtx a = (rtx)x, b = (rtx)y;
- size_t i;
if (GET_MODE (a) != GET_MODE (b))
return 0;
- for (i = 0; i < sizeof(CONST_DOUBLE_FORMAT)-1; i++)
- if (XWINT (a, i) != XWINT (b, i))
- return 0;
-
- return 1;
+ if (GET_MODE (a) == VOIDmode)
+ return (CONST_DOUBLE_LOW (a) == CONST_DOUBLE_LOW (b)
+ && CONST_DOUBLE_HIGH (a) == CONST_DOUBLE_HIGH (b));
+ else
+ return real_identical (CONST_DOUBLE_REAL_VALUE (a),
+ CONST_DOUBLE_REAL_VALUE (b));
}
/* Returns a hash code for X (which is a really a mem_attrs *). */
@@ -263,7 +264,7 @@ mem_attrs_htab_hash (x)
^ (size_t) p->expr);
}
-/* Returns non-zero if the value represented by X (which is really a
+/* Returns nonzero if the value represented by X (which is really a
mem_attrs *) is the same as that given by Y (which is also really a
mem_attrs *). */
@@ -998,6 +999,10 @@ gen_lowpart_common (mode, x)
else if (GET_CODE (x) == SUBREG || GET_CODE (x) == REG
|| GET_CODE (x) == CONCAT || GET_CODE (x) == CONST_VECTOR)
return simplify_gen_subreg (mode, x, GET_MODE (x), offset);
+ else if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
+ || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
+ && GET_MODE (x) == VOIDmode)
+ return simplify_gen_subreg (mode, x, int_mode_for_mode (mode), offset);
/* If X is a CONST_INT or a CONST_DOUBLE, extract the appropriate bits
from the low-order part of the constant. */
else if ((GET_MODE_CLASS (mode) == MODE_INT
@@ -1042,10 +1047,9 @@ gen_lowpart_common (mode, x)
&& GET_CODE (x) == CONST_INT)
{
REAL_VALUE_TYPE r;
- HOST_WIDE_INT i;
+ long i = INTVAL (x);
- i = INTVAL (x);
- r = REAL_VALUE_FROM_TARGET_SINGLE (i);
+ real_from_target (&r, &i, mode);
return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
}
else if (GET_MODE_CLASS (mode) == MODE_FLOAT
@@ -1054,8 +1058,8 @@ gen_lowpart_common (mode, x)
&& GET_MODE (x) == VOIDmode)
{
REAL_VALUE_TYPE r;
- HOST_WIDE_INT i[2];
HOST_WIDE_INT low, high;
+ long i[2];
if (GET_CODE (x) == CONST_INT)
{
@@ -1068,18 +1072,17 @@ gen_lowpart_common (mode, x)
high = CONST_DOUBLE_HIGH (x);
}
-#if HOST_BITS_PER_WIDE_INT == 32
+ if (HOST_BITS_PER_WIDE_INT > 32)
+ high = low >> 31 >> 1;
+
/* REAL_VALUE_TARGET_DOUBLE takes the addressing order of the
target machine. */
if (WORDS_BIG_ENDIAN)
i[0] = high, i[1] = low;
else
i[0] = low, i[1] = high;
-#else
- i[0] = low;
-#endif
- r = REAL_VALUE_FROM_TARGET_DOUBLE (i);
+ real_from_target (&r, i, mode);
return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
}
else if ((GET_MODE_CLASS (mode) == MODE_INT
@@ -1805,11 +1808,36 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
do
{
+ tree index = TREE_OPERAND (t, 1);
+ tree array = TREE_OPERAND (t, 0);
+ tree domain = TYPE_DOMAIN (TREE_TYPE (array));
+ tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0);
+ tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array)));
+
+ /* We assume all arrays have sizes that are a multiple of a byte.
+ First subtract the lower bound, if any, in the type of the
+ index, then convert to sizetype and multiply by the size of the
+ array element. */
+ if (low_bound != 0 && ! integer_zerop (low_bound))
+ index = fold (build (MINUS_EXPR, TREE_TYPE (index),
+ index, low_bound));
+
+ /* If the index has a self-referential type, pass it to a
+ WITH_RECORD_EXPR; if the component size is, pass our
+ component to one. */
+ if (! TREE_CONSTANT (index)
+ && contains_placeholder_p (index))
+ index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, t);
+ if (! TREE_CONSTANT (unit_size)
+ && contains_placeholder_p (unit_size))
+ unit_size = build (WITH_RECORD_EXPR, sizetype,
+ unit_size, array);
+
off_tree
= fold (build (PLUS_EXPR, sizetype,
fold (build (MULT_EXPR, sizetype,
- TREE_OPERAND (t, 1),
- TYPE_SIZE_UNIT (TREE_TYPE (t)))),
+ index,
+ unit_size)),
off_tree));
t = TREE_OPERAND (t, 0);
}
@@ -1862,9 +1890,14 @@ set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
}
/* If we modified OFFSET based on T, then subtract the outstanding
- bit position offset. */
+ bit position offset. Similarly, increase the size of the accessed
+ object to contain the negative offset. */
if (apply_bitpos)
- offset = plus_constant (offset, -(apply_bitpos / BITS_PER_UNIT));
+ {
+ offset = plus_constant (offset, -(apply_bitpos / BITS_PER_UNIT));
+ if (size)
+ size = plus_constant (size, apply_bitpos / BITS_PER_UNIT);
+ }
/* Now set the attributes we computed above. */
MEM_ATTRS (ref)
@@ -1943,6 +1976,17 @@ set_mem_offset (mem, offset)
offset, MEM_SIZE (mem), MEM_ALIGN (mem),
GET_MODE (mem));
}
+
+/* Set the size of MEM to SIZE. */
+
+void
+set_mem_size (mem, size)
+ rtx mem, size;
+{
+ MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
+ MEM_OFFSET (mem), size, MEM_ALIGN (mem),
+ GET_MODE (mem));
+}
/* Return a memory reference like MEMREF, but with its mode changed to MODE
and its address changed to ADDR. (VOIDmode means don't change the mode.
@@ -2027,7 +2071,7 @@ adjust_address_1 (memref, mode, offset, validate, adjust)
unsigned int memalign = MEM_ALIGN (memref);
/* ??? Prefer to create garbage instead of creating shared rtl.
- This may happen even if offset is non-zero -- consider
+ This may happen even if offset is nonzero -- consider
(plus (plus reg reg) const_int) -- so do this always. */
addr = copy_rtx (addr);
@@ -3147,7 +3191,7 @@ mark_label_nuses (x)
/* Try splitting insns that can be split for better scheduling.
PAT is the pattern which might split.
TRIAL is the insn providing PAT.
- LAST is non-zero if we should return the last insn of the sequence produced.
+ LAST is nonzero if we should return the last insn of the sequence produced.
If this routine succeeds in splitting, it returns the first or last
replacement insn depending on the value of LAST. Otherwise, it
diff --git a/gcc/et-forest.c b/gcc/et-forest.c
index 4e6216e5d32..84594d44365 100644
--- a/gcc/et-forest.c
+++ b/gcc/et-forest.c
@@ -664,7 +664,7 @@ et_forest_enumerate_sons (forest, node, array)
/* Parent is the rightmost node of the left successor.
Look for all occurences having no right succesor
- and lookup the sons. */
+ and lookup the sons. */
while (occ != stop)
{
splay (occ);
diff --git a/gcc/except.c b/gcc/except.c
index a2818c3408f..bc2c393f0e0 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -353,7 +353,7 @@ static void sjlj_output_call_site_table PARAMS ((void));
/* Routine to see if exception handling is turned on.
- DO_WARN is non-zero if we want to inform the user that exception
+ DO_WARN is nonzero if we want to inform the user that exception
handling is turned off.
This is used to ensure that -fexceptions has been specified if the
@@ -672,12 +672,12 @@ expand_start_catch (type_or_list)
void
expand_end_catch ()
{
- struct eh_region *try_region, *catch_region;
+ struct eh_region *try_region;
if (! doing_eh (0))
return;
- catch_region = expand_eh_region_end ();
+ expand_eh_region_end ();
try_region = cfun->eh->try_region;
emit_jump (try_region->u.try.continue_label);
@@ -2893,25 +2893,50 @@ can_throw_external (insn)
return true;
}
-/* True if nothing in this function can throw outside this function. */
+/* Set current_function_nothrow and cfun->all_throwers_are_sibcalls. */
-bool
-nothrow_function_p ()
+void
+set_nothrow_function_flags ()
{
rtx insn;
+
+ current_function_nothrow = 1;
- if (! flag_exceptions)
- return true;
+ /* Assume cfun->all_throwers_are_sibcalls until we encounter
+ something that can throw an exception. We specifically exempt
+ CALL_INSNs that are SIBLING_CALL_P, as these are really jumps,
+ and can't throw. Most CALL_INSNs are not SIBLING_CALL_P, so this
+ is optimistic. */
+ cfun->all_throwers_are_sibcalls = 1;
+
+ if (! flag_exceptions)
+ return;
+
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
if (can_throw_external (insn))
- return false;
+ {
+ current_function_nothrow = 0;
+
+ if (GET_CODE (insn) != CALL_INSN || !SIBLING_CALL_P (insn))
+ {
+ cfun->all_throwers_are_sibcalls = 0;
+ return;
+ }
+ }
+
for (insn = current_function_epilogue_delay_list; insn;
insn = XEXP (insn, 1))
- if (can_throw_external (XEXP (insn, 0)))
- return false;
+ if (can_throw_external (insn))
+ {
+ current_function_nothrow = 0;
- return true;
+ if (GET_CODE (insn) != CALL_INSN || !SIBLING_CALL_P (insn))
+ {
+ cfun->all_throwers_are_sibcalls = 0;
+ return;
+ }
+ }
}
@@ -2968,6 +2993,16 @@ expand_builtin_extract_return_addr (addr_tree)
{
rtx addr = expand_expr (addr_tree, NULL_RTX, Pmode, 0);
+ if (GET_MODE (addr) != Pmode
+ && GET_MODE (addr) != VOIDmode)
+ {
+#ifdef POINTERS_EXTEND_UNSIGNED
+ addr = convert_memory_address (Pmode, addr);
+#else
+ addr = convert_to_mode (Pmode, addr, 0);
+#endif
+ }
+
/* First mask out any unwanted bits. */
#ifdef MASK_RETURN_ADDR
expand_and (Pmode, addr, MASK_RETURN_ADDR, addr);
@@ -3600,7 +3635,7 @@ output_function_exception_table ()
assemble_align (tt_format_size * BITS_PER_UNIT);
}
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LLSDA",
+ (*targetm.asm_out.internal_label) (asm_out_file, "LLSDA",
current_function_funcdef_no);
/* The LSDA header. */
diff --git a/gcc/except.h b/gcc/except.h
index ce91051d5b1..034ce51c8fe 100644
--- a/gcc/except.h
+++ b/gcc/except.h
@@ -91,8 +91,8 @@ extern void for_each_eh_label PARAMS ((void (*) (rtx)));
extern bool can_throw_internal PARAMS ((rtx));
extern bool can_throw_external PARAMS ((rtx));
-/* Return nonzero if nothing in this function can throw. */
-extern bool nothrow_function_p PARAMS ((void));
+/* Set current_function_nothrow and cfun->all_throwers_are_sibcalls. */
+extern void set_nothrow_function_flags PARAMS ((void));
/* After initial rtl generation, call back to finish generating
exception support code. */
diff --git a/gcc/explow.c b/gcc/explow.c
index 4cda3654105..8d5114397c9 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -823,7 +823,7 @@ copy_to_suggested_reg (x, target, mode)
PUNSIGNEDP points to the signedness of the type and may be adjusted
to show what signedness to use on extension operations.
- FOR_CALL is non-zero if this call is promoting args for a call. */
+ FOR_CALL is nonzero if this call is promoting args for a call. */
enum machine_mode
promote_mode (type, mode, punsignedp, for_call)
@@ -1087,7 +1087,7 @@ emit_stack_restore (save_level, sa, after)
sa = validize_mem (sa);
/* These clobbers prevent the scheduler from moving
references to variable arrays below the code
- that deletes (pops) the arrays. */
+ that deletes (pops) the arrays. */
emit_insn (gen_rtx_CLOBBER (VOIDmode,
gen_rtx_MEM (BLKmode,
gen_rtx_SCRATCH (VOIDmode))));
@@ -1233,7 +1233,7 @@ allocate_dynamic_stack_space (size, target, known_align)
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
+ (Note that STACK_DYNAMIC_OFFSET will have a default nonzero value if
STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
We must also do an alignment operation on the returned value if
the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 317dcc4ab54..730c4c1de03 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -54,7 +54,7 @@ static rtx extract_split_bit_field PARAMS ((rtx, unsigned HOST_WIDE_INT,
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
+/* Nonzero means divides or modulus operations are relatively cheap for
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. */
@@ -1031,25 +1031,15 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
if (tmode == VOIDmode)
tmode = mode;
+
while (GET_CODE (op0) == SUBREG)
{
- int outer_size = GET_MODE_BITSIZE (GET_MODE (op0));
- int inner_size = GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)));
-
- offset += SUBREG_BYTE (op0) / UNITS_PER_WORD;
-
- inner_size = MIN (inner_size, BITS_PER_WORD);
-
- if (BYTES_BIG_ENDIAN && (outer_size < inner_size))
+ bitpos += SUBREG_BYTE (op0) * BITS_PER_UNIT;
+ if (bitpos > unit)
{
- bitpos += inner_size - outer_size;
- if (bitpos > unit)
- {
- offset += (bitpos / unit);
- bitpos %= unit;
- }
+ offset += (bitpos / unit);
+ bitpos %= unit;
}
-
op0 = SUBREG_REG (op0);
}
@@ -1086,9 +1076,13 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
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. */
+ /* Extraction of a full-word or multi-word value from a structure
+ in a register or aligned memory can be done with just a SUBREG.
+ A subword value in the least significant part of a register
+ can also be extracted with a SUBREG. For this, we need the
+ byte offset of the value in op0. */
+
+ byte_offset = bitpos / BITS_PER_UNIT + offset * UNITS_PER_WORD;
/* If OP0 is a register, BITPOS must count within a word.
But as we have it, it counts within whatever size OP0 now has.
@@ -1098,14 +1092,9 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
&& unit > GET_MODE_BITSIZE (GET_MODE (op0)))
bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0));
- /* Extracting a full-word or multi-word value
- from a structure in a register or aligned memory.
- This can be done with just SUBREG.
- So too extracting a subword value in
- the least significant part of the register. */
-
- byte_offset = (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
- + (offset * UNITS_PER_WORD);
+ /* ??? 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. */
mode1 = (VECTOR_MODE_P (tmode)
? mode
@@ -4170,7 +4159,7 @@ make_tree (type, x)
MODE is the machine mode for the computation.
X and MULT must have mode MODE. ADD may have a different mode.
So can X (defaults to same as MODE).
- UNSIGNEDP is non-zero to do unsigned multiplication. */
+ UNSIGNEDP is nonzero to do unsigned multiplication. */
bool
const_mult_add_overflow_p (x, mult, add, mode, unsignedp)
@@ -4208,7 +4197,7 @@ const_mult_add_overflow_p (x, mult, add, mode, unsignedp)
MODE is the machine mode for the computation.
X and MULT must have mode MODE. ADD may have a different mode.
So can X (defaults to same as MODE).
- UNSIGNEDP is non-zero to do unsigned multiplication.
+ UNSIGNEDP is nonzero to do unsigned multiplication.
This may emit insns. */
rtx
@@ -4622,7 +4611,7 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
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
+ that converts the operand into a positive number if it is nonzero
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.
diff --git a/gcc/expr.c b/gcc/expr.c
index b95de65fb27..34ac3629ec6 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -132,9 +132,11 @@ static unsigned HOST_WIDE_INT move_by_pieces_ninsns
unsigned int));
static void move_by_pieces_1 PARAMS ((rtx (*) (rtx, ...), enum machine_mode,
struct move_by_pieces *));
+static bool block_move_libcall_safe_for_call_parm PARAMS ((void));
static bool emit_block_move_via_movstr PARAMS ((rtx, rtx, rtx, unsigned));
static rtx emit_block_move_via_libcall PARAMS ((rtx, rtx, rtx));
static tree emit_block_move_libcall_fn PARAMS ((int));
+static void emit_block_move_via_loop PARAMS ((rtx, rtx, rtx, unsigned));
static rtx clear_by_pieces_1 PARAMS ((PTR, HOST_WIDE_INT,
enum machine_mode));
static void clear_by_pieces PARAMS ((rtx, unsigned HOST_WIDE_INT,
@@ -223,13 +225,20 @@ static bool float_extend_from_mem[NUM_MACHINE_MODES][NUM_MACHINE_MODES];
(move_by_pieces_ninsns (SIZE, ALIGN) < (unsigned int) CLEAR_RATIO)
#endif
+/* This macro is used to determine whether store_by_pieces should be
+ called to "memset" storage with byte values other than zero, or
+ to "memcpy" storage when the source is a constant string. */
+#ifndef STORE_BY_PIECES_P
+#define STORE_BY_PIECES_P(SIZE, ALIGN) MOVE_BY_PIECES_P (SIZE, ALIGN)
+#endif
+
/* This array records the insn_code of insns to perform block moves. */
enum insn_code movstr_optab[NUM_MACHINE_MODES];
/* This array records the insn_code of insns to perform block clears. */
enum insn_code clrstr_optab[NUM_MACHINE_MODES];
-/* SLOW_UNALIGNED_ACCESS is non-zero if unaligned accesses are very slow. */
+/* SLOW_UNALIGNED_ACCESS is nonzero if unaligned accesses are very slow. */
#ifndef SLOW_UNALIGNED_ACCESS
#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
@@ -1677,16 +1686,43 @@ move_by_pieces_1 (genfun, mode, data)
Both X and Y must be MEM rtx's (perhaps inside VOLATILE) with mode BLKmode.
SIZE is an rtx that says how long they are.
ALIGN is the maximum alignment we can assume they have.
+ METHOD describes what kind of copy this is, and what mechanisms may be used.
Return the address of the new block, if memcpy is called and returns it,
0 otherwise. */
rtx
-emit_block_move (x, y, size)
+emit_block_move (x, y, size, method)
rtx x, y, size;
+ enum block_op_methods method;
{
+ bool may_use_call;
rtx retval = 0;
- unsigned int align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
+ unsigned int align;
+
+ switch (method)
+ {
+ case BLOCK_OP_NORMAL:
+ may_use_call = true;
+ break;
+
+ case BLOCK_OP_CALL_PARM:
+ may_use_call = block_move_libcall_safe_for_call_parm ();
+
+ /* Make inhibit_defer_pop nonzero around the library call
+ to force it to pop the arguments right away. */
+ NO_DEFER_POP;
+ break;
+
+ case BLOCK_OP_NO_LIBCALL:
+ may_use_call = false;
+ break;
+
+ default:
+ abort ();
+ }
+
+ align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
if (GET_MODE (x) != BLKmode)
abort ();
@@ -1704,16 +1740,90 @@ emit_block_move (x, y, size)
if (size == 0)
abort ();
+ /* Set MEM_SIZE as appropriate for this block copy. The main place this
+ can be incorrect is coming from __builtin_memcpy. */
+ if (GET_CODE (size) == CONST_INT)
+ {
+ x = shallow_copy_rtx (x);
+ y = shallow_copy_rtx (y);
+ set_mem_size (x, size);
+ set_mem_size (y, size);
+ }
+
if (GET_CODE (size) == CONST_INT && MOVE_BY_PIECES_P (INTVAL (size), align))
move_by_pieces (x, y, INTVAL (size), align);
else if (emit_block_move_via_movstr (x, y, size, align))
;
- else
+ else if (may_use_call)
retval = emit_block_move_via_libcall (x, y, size);
+ else
+ emit_block_move_via_loop (x, y, size, align);
+
+ if (method == BLOCK_OP_CALL_PARM)
+ OK_DEFER_POP;
return retval;
}
+/* A subroutine of emit_block_move. Returns true if calling the
+ block move libcall will not clobber any parameters which may have
+ already been placed on the stack. */
+
+static bool
+block_move_libcall_safe_for_call_parm ()
+{
+ if (PUSH_ARGS)
+ return true;
+ else
+ {
+ /* Check to see whether memcpy takes all register arguments. */
+ static enum {
+ takes_regs_uninit, takes_regs_no, takes_regs_yes
+ } takes_regs = takes_regs_uninit;
+
+ switch (takes_regs)
+ {
+ case takes_regs_uninit:
+ {
+ CUMULATIVE_ARGS args_so_far;
+ tree fn, arg;
+
+ fn = emit_block_move_libcall_fn (false);
+ INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (fn), NULL_RTX, 0);
+
+ arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
+ for ( ; arg != void_list_node ; arg = TREE_CHAIN (arg))
+ {
+ enum machine_mode mode = TYPE_MODE (TREE_VALUE (arg));
+ rtx tmp = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1);
+ if (!tmp || !REG_P (tmp))
+ goto fail_takes_regs;
+#ifdef FUNCTION_ARG_PARTIAL_NREGS
+ if (FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode,
+ NULL_TREE, 1))
+ goto fail_takes_regs;
+#endif
+ FUNCTION_ARG_ADVANCE (args_so_far, mode, NULL_TREE, 1);
+ }
+ }
+ takes_regs = takes_regs_yes;
+ /* FALLTHRU */
+
+ case takes_regs_yes:
+ return true;
+
+ fail_takes_regs:
+ takes_regs = takes_regs_no;
+ /* FALLTHRU */
+ case takes_regs_no:
+ return false;
+
+ default:
+ abort ();
+ }
+ }
+}
+
/* A subroutine of emit_block_move. Expand a movstr pattern;
return true if successful. */
@@ -1919,6 +2029,59 @@ emit_block_move_libcall_fn (for_call)
return fn;
}
+
+/* A subroutine of emit_block_move. Copy the data via an explicit
+ loop. This is used only when libcalls are forbidden. */
+/* ??? It'd be nice to copy in hunks larger than QImode. */
+
+static void
+emit_block_move_via_loop (x, y, size, align)
+ rtx x, y, size;
+ unsigned int align ATTRIBUTE_UNUSED;
+{
+ rtx cmp_label, top_label, iter, x_addr, y_addr, tmp;
+ enum machine_mode iter_mode;
+
+ iter_mode = GET_MODE (size);
+ if (iter_mode == VOIDmode)
+ iter_mode = word_mode;
+
+ top_label = gen_label_rtx ();
+ cmp_label = gen_label_rtx ();
+ iter = gen_reg_rtx (iter_mode);
+
+ emit_move_insn (iter, const0_rtx);
+
+ x_addr = force_operand (XEXP (x, 0), NULL_RTX);
+ y_addr = force_operand (XEXP (y, 0), NULL_RTX);
+ do_pending_stack_adjust ();
+
+ emit_note (NULL, NOTE_INSN_LOOP_BEG);
+
+ emit_jump (cmp_label);
+ emit_label (top_label);
+
+ tmp = convert_modes (Pmode, iter_mode, iter, true);
+ x_addr = gen_rtx_PLUS (Pmode, x_addr, tmp);
+ y_addr = gen_rtx_PLUS (Pmode, y_addr, tmp);
+ x = change_address (x, QImode, x_addr);
+ y = change_address (y, QImode, y_addr);
+
+ emit_move_insn (x, y);
+
+ tmp = expand_simple_binop (iter_mode, PLUS, iter, const1_rtx, iter,
+ true, OPTAB_LIB_WIDEN);
+ if (tmp != iter)
+ emit_move_insn (iter, tmp);
+
+ emit_note (NULL, NOTE_INSN_LOOP_CONT);
+ emit_label (cmp_label);
+
+ emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
+ true, top_label);
+
+ emit_note (NULL, NOTE_INSN_LOOP_END);
+}
/* Copy all or part of a value X into registers starting at REGNO.
The number of registers to be filled is NREGS. */
@@ -2119,21 +2282,26 @@ 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))))
- || (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
- && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1)))))
+ unsigned int slen = GET_MODE_SIZE (GET_MODE (src));
+ unsigned int slen0 = GET_MODE_SIZE (GET_MODE (XEXP (src, 0)));
+
+ if ((bytepos == 0 && bytelen == slen0)
+ || (bytepos != 0 && bytepos + bytelen <= slen))
{
- tmps[i] = XEXP (src, bytepos != 0);
+ /* The following assumes that the concatenated objects all
+ have the same size. In this case, a simple calculation
+ can be used to determine the object and the bit field
+ to be extracted. */
+ tmps[i] = XEXP (src, bytepos / slen0);
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);
+ (bytepos % slen0) * BITS_PER_UNIT,
+ 1, NULL_RTX, mode, mode, ssize);
}
else if (bytepos == 0)
{
- rtx mem = assign_stack_temp (GET_MODE (src),
- GET_MODE_SIZE (GET_MODE (src)), 0);
+ rtx mem = assign_stack_temp (GET_MODE (src), slen, 0);
emit_move_insn (mem, src);
tmps[i] = adjust_address (mem, mode, 0);
}
@@ -2440,7 +2608,7 @@ can_store_by_pieces (len, constfun, constfundata, align)
int reverse;
rtx cst;
- if (! MOVE_BY_PIECES_P (len, align))
+ if (! STORE_BY_PIECES_P (len, align))
return 0;
if (! SLOW_UNALIGNED_ACCESS (word_mode, align)
@@ -2515,7 +2683,7 @@ store_by_pieces (to, len, constfun, constfundata, align)
{
struct store_by_pieces data;
- if (! MOVE_BY_PIECES_P (len, align))
+ if (! STORE_BY_PIECES_P (len, align))
abort ();
to = protect_from_queue (to, 1);
data.constfun = constfun;
@@ -3623,16 +3791,12 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
of sibling calls. */
set_mem_alias_set (target, 0);
}
- else
- set_mem_align (target, align);
- /* Make inhibit_defer_pop nonzero around the library call
- to force it to pop the bcopy-arguments right away. */
- NO_DEFER_POP;
+ /* ALIGN may well be better aligned than TYPE, e.g. due to
+ PARM_BOUNDARY. Assume the caller isn't lying. */
+ set_mem_align (target, align);
- emit_block_move (target, xinner, size);
-
- OK_DEFER_POP;
+ emit_block_move (target, xinner, size, BLOCK_OP_CALL_PARM);
}
}
else if (partial > 0)
@@ -3699,7 +3863,6 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
else
{
rtx addr;
- rtx target = NULL_RTX;
rtx dest;
/* Push padding now if padding above and stack grows down,
@@ -3723,7 +3886,6 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
else
addr = memory_address (mode, gen_rtx_PLUS (Pmode, args_addr,
args_so_far));
- target = addr;
dest = gen_rtx_MEM (mode, addr);
if (type != 0)
{
@@ -3951,7 +4113,7 @@ expand_assignment (to, from, want_value, suggest_reg)
if (GET_CODE (to_rtx) == PARALLEL)
emit_group_load (to_rtx, value, int_size_in_bytes (TREE_TYPE (from)));
else if (GET_MODE (to_rtx) == BLKmode)
- emit_block_move (to_rtx, value, expr_size (from));
+ emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
else
{
#ifdef POINTERS_EXTEND_UNSIGNED
@@ -4312,7 +4474,7 @@ store_expr (exp, target, want_value)
if (GET_CODE (size) == CONST_INT
&& INTVAL (size) < TREE_STRING_LENGTH (exp))
- emit_block_move (target, temp, size);
+ emit_block_move (target, temp, size, BLOCK_OP_NORMAL);
else
{
/* Compute the size of the data to copy from the string. */
@@ -4326,7 +4488,7 @@ store_expr (exp, target, want_value)
/* Copy that much. */
copy_size_rtx = convert_to_mode (ptr_mode, copy_size_rtx, 0);
- emit_block_move (target, temp, copy_size_rtx);
+ emit_block_move (target, temp, copy_size_rtx, BLOCK_OP_NORMAL);
/* Figure out how much is left in TARGET that we have to clear.
Do all calculations in ptr_mode. */
@@ -4367,7 +4529,7 @@ store_expr (exp, target, want_value)
else if (GET_CODE (target) == PARALLEL)
emit_group_load (target, temp, int_size_in_bytes (TREE_TYPE (exp)));
else if (GET_MODE (temp) == BLKmode)
- emit_block_move (target, temp, expr_size (exp));
+ emit_block_move (target, temp, expr_size (exp), BLOCK_OP_NORMAL);
else
emit_move_insn (target, temp);
}
@@ -4496,7 +4658,7 @@ store_constructor_field (target, bitsize, bitpos, mode, exp, type, cleared,
{
if (TREE_CODE (exp) == CONSTRUCTOR
&& bitpos % BITS_PER_UNIT == 0
- /* If we have a non-zero bitpos for a register target, then we just
+ /* If we have a nonzero bitpos for a register target, then we just
let store_field do the bitfield handling. This is unlikely to
generate unnecessary clear instructions anyways. */
&& (bitpos == 0 || GET_CODE (target) == MEM))
@@ -4602,7 +4764,6 @@ store_constructor (exp, target, cleared, size)
enum machine_mode mode;
HOST_WIDE_INT bitsize;
HOST_WIDE_INT bitpos = 0;
- int unsignedp;
tree offset;
rtx to_rtx = target;
@@ -4620,7 +4781,6 @@ store_constructor (exp, target, cleared, size)
else
bitsize = -1;
- unsignedp = TREE_UNSIGNED (field);
mode = DECL_MODE (field);
if (DECL_BIT_FIELD (field))
mode = VOIDmode;
@@ -4841,7 +5001,7 @@ store_constructor (exp, target, cleared, size)
{
tree lo_index = TREE_OPERAND (index, 0);
tree hi_index = TREE_OPERAND (index, 1);
- rtx index_r, pos_rtx, hi_r, loop_top, loop_end;
+ rtx index_r, pos_rtx, loop_end;
struct nesting *loop;
HOST_WIDE_INT lo, hi, count;
tree position;
@@ -4880,8 +5040,7 @@ store_constructor (exp, target, cleared, size)
}
else
{
- hi_r = expand_expr (hi_index, NULL_RTX, VOIDmode, 0);
- loop_top = gen_label_rtx ();
+ expand_expr (hi_index, NULL_RTX, VOIDmode, 0);
loop_end = gen_label_rtx ();
unsignedp = TREE_UNSIGNED (domain);
@@ -5295,7 +5454,8 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, unsignedp, type,
target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT);
emit_block_move (target, temp,
GEN_INT ((bitsize + BITS_PER_UNIT - 1)
- / BITS_PER_UNIT));
+ / BITS_PER_UNIT),
+ BLOCK_OP_NORMAL);
return value_mode == VOIDmode ? const0_rtx : target;
}
@@ -6374,7 +6534,7 @@ expand_expr (exp, target, tmode, modifier)
}
case PARM_DECL:
- if (DECL_RTL (exp) == 0)
+ if (!DECL_RTL_SET_P (exp))
{
error_with_decl (exp, "prior parameter's size depends on `%s'");
return CONST0_RTX (mode);
@@ -6689,9 +6849,6 @@ expand_expr (exp, target, tmode, modifier)
return temp;
}
- /* We can't find the object or there was a missing WITH_RECORD_EXPR. */
- abort ();
-
case WITH_RECORD_EXPR:
/* Put the object on the placeholder list, expand our first operand,
and pop the list. */
@@ -6740,7 +6897,6 @@ expand_expr (exp, target, tmode, modifier)
case BIND_EXPR:
{
tree vars = TREE_OPERAND (exp, 0);
- int vars_need_expansion = 0;
/* Need to open a binding contour here because
if there are any cleanups they must be contained here. */
@@ -6755,10 +6911,7 @@ expand_expr (exp, target, tmode, modifier)
while (vars)
{
if (!DECL_RTL_SET_P (vars))
- {
- vars_need_expansion = 1;
- expand_decl (vars);
- }
+ expand_decl (vars);
expand_decl_init (vars);
vars = TREE_CHAIN (vars);
}
@@ -7218,7 +7371,8 @@ expand_expr (exp, target, tmode, modifier)
emit_block_move (target, op0,
GEN_INT ((bitsize + BITS_PER_UNIT - 1)
- / BITS_PER_UNIT));
+ / BITS_PER_UNIT),
+ BLOCK_OP_NORMAL);
return target;
}
@@ -7634,7 +7788,8 @@ expand_expr (exp, target, tmode, modifier)
if (GET_MODE (op0) == BLKmode)
emit_block_move (new_with_op0_mode, op0,
- GEN_INT (GET_MODE_SIZE (TYPE_MODE (type))));
+ GEN_INT (GET_MODE_SIZE (TYPE_MODE (type))),
+ BLOCK_OP_NORMAL);
else
emit_move_insn (new_with_op0_mode, op0);
@@ -7647,9 +7802,6 @@ expand_expr (exp, target, tmode, modifier)
return op0;
case PLUS_EXPR:
- /* We come here from MINUS_EXPR when the second operand is a
- constant. */
- plus_expr:
this_optab = ! unsignedp && flag_trapv
&& (GET_MODE_CLASS (mode) == MODE_INT)
? addv_optab : add_optab;
@@ -7745,20 +7897,29 @@ expand_expr (exp, target, tmode, modifier)
}
}
+ if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
+ subtarget = 0;
+
/* No sense saving up arithmetic to be done
if it's all in the wrong mode to form part of an address.
And force_operand won't know whether to sign-extend or
zero-extend. */
if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
|| mode != ptr_mode)
- goto binop;
-
- if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
- subtarget = 0;
+ {
+ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
+ op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
+ temp = simplify_binary_operation (PLUS, mode, op0, op1);
+ if (temp)
+ return temp;
+ goto binop2;
+ }
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, modifier);
op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, modifier);
+ /* We come here from MINUS_EXPR when the second operand is a
+ constant. */
both_summands:
/* Make sure any term that's a sum with a constant comes last. */
if (GET_CODE (op0) == PLUS
@@ -7828,27 +7989,33 @@ expand_expr (exp, target, tmode, modifier)
else
return gen_rtx_MINUS (mode, op0, op1);
}
- /* Convert A - const to A + (-const). */
- if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
- {
- tree negated = fold (build1 (NEGATE_EXPR, type,
- TREE_OPERAND (exp, 1)));
- if (TREE_UNSIGNED (type) || TREE_OVERFLOW (negated))
- /* If we can't negate the constant in TYPE, leave it alone and
- expand_binop will negate it for us. We used to try to do it
- here in the signed version of TYPE, but that doesn't work
- on POINTER_TYPEs. */;
- else
- {
- exp = build (PLUS_EXPR, type, TREE_OPERAND (exp, 0), negated);
- goto plus_expr;
- }
- }
this_optab = ! unsignedp && flag_trapv
&& (GET_MODE_CLASS(mode) == MODE_INT)
? subv_optab : sub_optab;
- goto binop;
+
+ /* No sense saving up arithmetic to be done
+ if it's all in the wrong mode to form part of an address.
+ And force_operand won't know whether to sign-extend or
+ zero-extend. */
+ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
+ || mode != ptr_mode)
+ goto binop;
+
+ if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
+ subtarget = 0;
+
+ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, modifier);
+ op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, modifier);
+
+ /* Convert A - const to A + (-const). */
+ if (GET_CODE (op1) == CONST_INT)
+ {
+ op1 = negate_rtx (mode, op1);
+ goto both_summands;
+ }
+
+ goto binop2;
case MULT_EXPR:
/* If first operand is constant, swap them.
@@ -8856,7 +9023,8 @@ expand_expr (exp, target, tmode, modifier)
if (TYPE_ALIGN_OK (inner_type))
abort ();
- emit_block_move (new, op0, expr_size (TREE_OPERAND (exp, 0)));
+ emit_block_move (new, op0, expr_size (TREE_OPERAND (exp, 0)),
+ BLOCK_OP_NORMAL);
op0 = new;
}
@@ -9130,7 +9298,7 @@ is_aligning_offset (offset, exp)
}
/* Return the tree node if an ARG corresponds to a string constant or zero
- if it doesn't. If we return non-zero, set *PTR_OFFSET to the offset
+ if it doesn't. If we return nonzero, set *PTR_OFFSET to the offset
in bytes within the string that ARG is accessing. The type of the
offset will be `sizetype'. */
@@ -9516,7 +9684,7 @@ do_jump (exp, if_false_label, if_true_label)
case NEGATE_EXPR:
case LROTATE_EXPR:
case RROTATE_EXPR:
- /* These cannot change zero->non-zero or vice versa. */
+ /* These cannot change zero->nonzero or vice versa. */
do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
break;
@@ -9542,7 +9710,7 @@ do_jump (exp, if_false_label, if_true_label)
#endif
case MINUS_EXPR:
- /* Non-zero iff operands of minus differ. */
+ /* Nonzero iff operands of minus differ. */
do_compare_and_jump (build (NE_EXPR, TREE_TYPE (exp),
TREE_OPERAND (exp, 0),
TREE_OPERAND (exp, 1)),
@@ -10357,7 +10525,7 @@ do_compare_and_jump (exp, signed_code, unsigned_code, if_false_label,
If TARGET is nonzero, store the result there if convenient.
- If ONLY_CHEAP is non-zero, only do this if it is likely to be very
+ If ONLY_CHEAP is nonzero, only do this if it is likely to be very
cheap.
Return zero if there is no suitable set-flag instruction
@@ -10772,6 +10940,9 @@ do_tablejump (index, mode, range, table_label, default_label)
{
rtx temp, vector;
+ if (INTVAL (range) > cfun->max_jumptable_ents)
+ cfun->max_jumptable_ents = INTVAL (range);
+
/* Do an unsigned comparison (in the proper mode) between the index
expression and the value which represents the length of the range.
Since we just finished subtracting the lower bound of the range
diff --git a/gcc/expr.h b/gcc/expr.h
index 76b5c809e8e..e8b2c176064 100644
--- a/gcc/expr.h
+++ b/gcc/expr.h
@@ -303,7 +303,7 @@ rtx emit_conditional_move PARAMS ((rtx, enum rtx_code, rtx, rtx,
enum machine_mode, rtx, rtx,
enum machine_mode, int));
-/* Return non-zero if the conditional move is supported. */
+/* Return nonzero if the conditional move is supported. */
int can_conditionally_move_p PARAMS ((enum machine_mode mode));
#endif
@@ -394,7 +394,15 @@ extern rtx convert_modes PARAMS ((enum machine_mode, enum machine_mode,
rtx, int));
/* Emit code to move a block Y to a block X. */
-extern rtx emit_block_move PARAMS ((rtx, rtx, rtx));
+
+enum block_op_methods
+{
+ BLOCK_OP_NORMAL,
+ BLOCK_OP_CALL_PARM,
+ BLOCK_OP_NO_LIBCALL
+};
+
+extern rtx emit_block_move PARAMS ((rtx, rtx, rtx, enum block_op_methods));
/* Copy all or part of a value X into registers starting at REGNO.
The number of registers to be filled is NREGS. */
@@ -431,7 +439,7 @@ extern void use_group_regs PARAMS ((rtx *, rtx));
If OBJECT has BLKmode, SIZE is its length in bytes. */
extern rtx clear_storage PARAMS ((rtx, rtx));
-/* Return non-zero if it is desirable to store LEN bytes generated by
+/* Return nonzero if it is desirable to store LEN bytes generated by
CONSTFUN with several move instructions by store_by_pieces
function. CONSTFUNDATA is a pointer which will be passed as argument
in every CONSTFUN call.
@@ -608,6 +616,9 @@ extern void set_mem_expr PARAMS ((rtx, tree));
/* Set the offset for MEM to OFFSET. */
extern void set_mem_offset PARAMS ((rtx, rtx));
+/* Set the size for MEM to SIZE. */
+extern void set_mem_size PARAMS ((rtx, rtx));
+
/* Return a memory reference like MEMREF, but with its mode changed
to MODE and its address changed to ADDR.
(VOIDmode means don't change the mode.
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index e96f197f884..23f119dc34c 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,92 @@
+2002-10-15 Richard Henderson <rth@redhat.com>
+
+ * target.h (ffetarget_print_real1, ffetarget_print_real2): Use
+ real_to_decimal directly, and with the new arguments.
+
+2002-09-23 Zack Weinberg <zack@codesourcery.com>
+
+ * Make-lang.in (g77spec.o): Don't depend on f/version.h.
+ (f/parse.o): Depend on version.h not f/version.h.
+ (g77version.o, f/version.o): Delete all references.
+
+ * com.c (ffecom_init_0): Fix transposed array indices in bsearch test.
+ * g77spec.c: Don't include f/version.h or refer to ffe_version_string.
+ * parse.c: Use version_string, not ffe_version_string.
+ * version.c, version.h: Delete files.
+
+2002-09-23 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * ChangeLog.0: Likewise.
+ * com.c: Likewise.
+ * ffe.texi: Likewise.
+ * g77.texi: Likewise.
+ * intdoc.in: Likewise.
+ * invoke.texi: Likewise.
+ * news.texi: Likewise.
+ * intdoc.texi: Regenerate.
+
+2002-09-16 Geoffrey Keating <geoffk@apple.com>
+
+ * com.c (union lang_tree_node): Add chain_next option.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * target.c (ffetarget_real1): Don't pass FFETARGET_ATOF_
+ directly to ffetarget_make_real1.
+ (ffetarget_real2): Similarly.
+ * target.h (ffetarget_cvt_r1_to_rv_, ffetarget_cvt_rv_to_r2_,
+ ffetarget_cvt_r2_to_rv_): Use new real.h interface and simplify.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * intdoc.texi: Regenerate.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * intdoc.in: Likewise.
+
+2002-09-09 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ Fix PR web/7596:
+ * ffe.texi (Front End): Fix broken links.
+ * bugs.texi (Known Bugs): Refer to gcc.gnu.org instead of
+ www.gnu.org for onlinedocs.
+ * news.texi (News): Ditto.
+
+2002-09-07 Jan Hubicka <jh@suse.cz>
+
+ * com.c (ffe_type_for_mode): Handle long double.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * target.h (ffetarget_print_real1, ffetarget_print_real2): Update
+ call to REAL_VALUE_TO_DECIMAL.
+
+2002-08-31 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * com.c: Don't set flag_finite_math_only by default.
+ * invoke.texi: Reverse the documentation of option
+ -ffinite-math-only to reflect the new default.
+
+2002-08-30 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * target.c (ffetarget_memcpy_): Don't test nonexistent
+ HOST_BYTES_BIG_ENDIAN, HOST_BITS_BIG_ENDIAN. Check
+ HOST_WORDS_BIG_ENDIAN against both WORDS_BIG_ENDIAN and
+ BYTES_BIG_ENDIAN.
+
+2002-08-30 Alan Modra <amodra@bigpond.net.au>
+
+ * target.h (FFETARGET_32bit_longs): Don't define for powerpc64 or
+ mmix.
+
+2002-08-28 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * bugs.texi, news.texi: Update URLs for online news and bugs
+ lists.
+
2002-08-22 Hans-Peter Nilsson <hp@bitrange.com>
* where.h (struct _ffewhere_file_): Mark GTY.
@@ -1707,7 +1796,7 @@ Fri Sep 24 10:48:10 1999 Bernd Schmidt <bernds@cygnus.co.uk>
Tue Sep 21 09:08:30 1999 Toon Moene <toon@moene.indiv.nluug.nl>
- * g77spec.c (lang_specific_driver): Initialise return value.
+ * g77spec.c (lang_specific_driver): Initialize return value.
Thu Sep 16 18:07:11 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@@ -2987,7 +3076,7 @@ Sat Jul 11 19:24:32 1998 Craig Burley <burley@gnu.org>
Sat Jul 11 18:24:37 1998 Craig Burley <burley@gnu.org>
* com.c (ffecom_expr_) [FFEBLD_opCONTER]: Die if padding
- for constant is non-zero.
+ for constant is nonzero.
* com.c (__eprintf): Delete this function, it is obsolete.
@@ -3043,7 +3132,7 @@ Wed Jul 1 11:19:13 1998 Craig Burley <burley@gnu.org>
and even more elegantly than those.
* target.c (ffetarget_align): Make sure alignments
- are non-zero, just in case.
+ are nonzero, just in case.
See ChangeLog.0 for earlier changes.
diff --git a/gcc/f/ChangeLog.0 b/gcc/f/ChangeLog.0
index b74222ed673..3d6675e5d37 100644
--- a/gcc/f/ChangeLog.0
+++ b/gcc/f/ChangeLog.0
@@ -38,7 +38,7 @@ Mon Jun 29 09:47:33 1998 Craig Burley <burley@gnu.org>
of equiv area, extend lowering to maintain needed alignment.
* target.c (ffetarget_align): Handle negative offset correctly.
- * global.c (ffeglobal_pad_common): Warn about non-zero
+ * global.c (ffeglobal_pad_common): Warn about nonzero
padding only the first time its seen.
If new padding larger than old, update old.
(ffeglobal_save_common): Use correct type for size throughout.
@@ -2419,7 +2419,7 @@ Sat Nov 2 13:50:31 1996 Craig Burley <burley@gnu.ai.mit.edu>
function call to the type in the fall-through case).
* ste.c (ffeste_R909_finish): Don't special-case list-directed
- I/O, now that libf2c can return non-zero status codes.
+ I/O, now that libf2c can return nonzero status codes.
(ffeste_R910_finish): Ditto.
(ffeste_io_call_): Simplify logic.
(ffeste_io_impdo_):
diff --git a/gcc/f/Make-lang.in b/gcc/f/Make-lang.in
index 95ec02c5130..df31b1a6168 100644
--- a/gcc/f/Make-lang.in
+++ b/gcc/f/Make-lang.in
@@ -65,21 +65,17 @@ F77 f77: f771$(exeext)
f77.extraclean f77.maintainer-clean f77.rebuilt \
f77.stage1 f77.stage2 f77.stage3 f77.stage4
-g77spec.o: $(srcdir)/f/g77spec.c $(srcdir)/f/version.h $(SYSTEM_H) $(GCC_H) \
+g77spec.o: $(srcdir)/f/g77spec.c $(SYSTEM_H) $(GCC_H) \
$(CONFIG_H)
(SHLIB_LINK='$(SHLIB_LINK)' \
SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \
$(INCLUDES) $(srcdir)/f/g77spec.c)
-g77version.o: $(srcdir)/f/version.c
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -o g77version.o \
- $(srcdir)/f/version.c
-
# Create the compiler driver for g77.
-g77$(exeext): gcc.o g77spec.o g77version.o version.o prefix.o intl.o \
+g77$(exeext): gcc.o g77spec.o version.o prefix.o intl.o \
$(LIBDEPS) $(EXTRA_GCC_OBJS)
- $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ gcc.o g77spec.o g77version.o \
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ gcc.o g77spec.o \
version.o prefix.o intl.o $(EXTRA_GCC_OBJS) $(LIBS)
# Create a version of the g77 driver which calls the cross-compiler.
@@ -93,7 +89,7 @@ F77_OBJS = f/bad.o f/bit.o f/bld.o f/com.o f/data.o f/equiv.o f/expr.o \
f/global.o f/implic.o f/info.o f/intrin.o f/lab.o f/lex.o f/malloc.o \
f/name.o f/parse.o f/src.o f/st.o f/sta.o f/stb.o f/stc.o \
f/std.o f/ste.o f/storag.o f/stp.o f/str.o f/sts.o f/stt.o f/stu.o \
- f/stv.o f/stw.o f/symbol.o f/target.o f/top.o f/type.o f/version.o f/where.o
+ f/stv.o f/stw.o f/symbol.o f/target.o f/top.o f/type.o f/where.o
# Use loose warnings for this front end.
f-warn =
@@ -321,7 +317,7 @@ f77.mostlyclean:
-rm -f g77.aux g77.cps g77.ky g77.toc g77.vr g77.fn g77.kys \
g77.pg g77.tp g77.vrs g77.cp g77.fns g77.log g77.pgs g77.tps
f77.clean:
- -rm -f g77spec.o g77version.o
+ -rm -f g77spec.o
f77.distclean:
-rm -f f/Makefile
f77.extraclean:
@@ -332,7 +328,7 @@ f77.maintainer-clean:
# The main makefile has already created stage?/f.
G77STAGESTUFF = f/*$(objext) f/fini$(build_exeext) f/stamp-str \
- f/str-*.h f/str-*.j g77spec.o g77version.o
+ f/str-*.h f/str-*.j g77spec.o
f77.stage1: stage1-start
-mv -f $(G77STAGESTUFF) stage1/f
@@ -425,7 +421,7 @@ f/parse.o: f/parse.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/top.h f/malloc.h \
f/where.h glimits.h f/com.h f/com-rt.def $(TREE_H) f/bld.h f/bld-op.def \
f/bit.h f/info.h f/info-b.def f/info-k.def f/info-w.def f/target.h f/bad.h \
f/bad.def f/lex.h f/type.h f/intrin.h f/intrin.def f/lab.h f/symbol.h \
- f/symbol.def f/equiv.h f/storag.h f/global.h f/name.h f/version.h flags.h
+ f/symbol.def f/equiv.h f/storag.h f/global.h f/name.h version.h flags.h
f/src.o: f/src.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/src.h f/bad.h f/bad.def \
f/where.h glimits.h f/top.h f/malloc.h
f/st.o: f/st.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/st.h f/bad.h f/bad.def \
@@ -527,6 +523,5 @@ f/top.o: f/top.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/top.h f/malloc.h f/where.h \
f/intrin.def f/data.h f/expr.h f/implic.h f/src.h f/st.h flags.h \
toplev.h
f/type.o: f/type.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/type.h f/malloc.h
-f/version.o: f/version.c f/version.h
f/where.o: f/where.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/where.h glimits.h f/top.h \
f/malloc.h f/lex.h $(GGC_H) gt-f-where.h
diff --git a/gcc/f/bugs.texi b/gcc/f/bugs.texi
index dd501909658..f82d1bda2a6 100644
--- a/gcc/f/bugs.texi
+++ b/gcc/f/bugs.texi
@@ -79,7 +79,7 @@ An online, ``live'' version of this document
(derived directly from the mainline, development version
of @code{g77} within @code{gcc})
is available via
-@uref{http://www.gnu.org/software/gcc/onlinedocs/g77_bugs.html}.
+@uref{http://gcc.gnu.org/onlinedocs/g77/Trouble.html}.
Follow the ``Known Bugs'' link.
The following information was last updated on @value{last-update-bugs}:
diff --git a/gcc/f/com.c b/gcc/f/com.c
index 1c6b05a16a9..cc3af7ef481 100644
--- a/gcc/f/com.c
+++ b/gcc/f/com.c
@@ -605,7 +605,8 @@ struct lang_identifier GTY(())
/* The resulting tree type. */
union lang_tree_node
- GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE")))
+ GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
+ chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
{
union tree_node GTY ((tag ("0"),
desc ("tree_node_structure (&%h)")))
@@ -820,7 +821,7 @@ ffecom_subscript_check_ (tree array, tree element, int dim, int total_dims,
`item' is NULL_TREE, or the transformed pointer to the array.
`expr' is the original opARRAYREF expression, which is transformed
if `item' is NULL_TREE.
- `want_ptr' is non-zero if a pointer to the element, instead of
+ `want_ptr' is nonzero if a pointer to the element, instead of
the element itself, is to be returned. */
static tree
@@ -11123,7 +11124,7 @@ ffecom_init_0 ()
name = bsearch ("foo", &names[0], ARRAY_SIZE (names), sizeof (names[0]),
(int (*)(const void *, const void *)) strcmp);
- if (name != &names[0][2])
+ if (name != &names[2][0])
{
assert ("bsearch doesn't work, #define FFEPROJ_BSEARCH 0 in proj.h"
== NULL);
@@ -14176,7 +14177,6 @@ ffe_init_options ()
flag_reduce_all_givs = 1;
flag_argument_noalias = 2;
flag_merge_constants = 2;
- flag_finite_math_only = 1;
flag_errno_math = 0;
flag_complex_divide_method = 1;
}
@@ -14758,12 +14758,12 @@ ffe_truthvalue_conversion (expr)
case ABS_EXPR:
case FLOAT_EXPR:
case FFS_EXPR:
- /* These don't change whether an object is non-zero or zero. */
+ /* These don't change whether an object is nonzero or zero. */
return ffe_truthvalue_conversion (TREE_OPERAND (expr, 0));
case LROTATE_EXPR:
case RROTATE_EXPR:
- /* These don't change whether an object is zero or non-zero, but
+ /* These don't change whether an object is zero or nonzero, but
we can't ignore them if their second arg has side-effects. */
if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
return build (COMPOUND_EXPR, integer_type_node, TREE_OPERAND (expr, 1),
@@ -14880,7 +14880,10 @@ ffe_type_for_mode (mode, unsignedp)
if (mode == TYPE_MODE (double_type_node))
return double_type_node;
- if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
+ if (mode == TYPE_MODE (long_double_type_node))
+ return long_double_type_node;
+
+ if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
return build_pointer_type (char_type_node);
if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
@@ -15026,7 +15029,7 @@ struct file_name_list
char *fname;
/* Mapping of file names for this directory. */
struct file_name_map *name_map;
- /* Non-zero if name_map is valid. */
+ /* Nonzero if name_map is valid. */
int got_name_map;
};
diff --git a/gcc/f/ffe.texi b/gcc/f/ffe.texi
index b6fbac9ad74..4136a47a745 100644
--- a/gcc/f/ffe.texi
+++ b/gcc/f/ffe.texi
@@ -17,7 +17,7 @@ search for the string TBD.
If you want to help by working on one or more of these items,
email @email{gcc@@gcc.gnu.org}.
If you're planning to do more than just research issues and offer comments,
-see @uref{http://www.gnu.org/software/contribute.html} for steps you might
+see @uref{http://www.gnu.org/software/gcc/contribute.html} for steps you might
need to take first.
@menu
@@ -2028,7 +2028,7 @@ Initializes, usually a module. No type.
A generic integer of type @code{int}.
@item is
-A generic integer that contains a true (non-zero) or false (zero) value.
+A generic integer that contains a true (nonzero) or false (zero) value.
@item len
A generic integer that contains the length of something.
diff --git a/gcc/f/g77.texi b/gcc/f/g77.texi
index 30dc98e4dba..4e7cf10cd5c 100644
--- a/gcc/f/g77.texi
+++ b/gcc/f/g77.texi
@@ -6283,7 +6283,7 @@ single-dimensional array, so at least the dimensionality of the array
is preserved.
Debuggers that understand Fortran should have no trouble with
-non-zero low bounds, but for non-Fortran debuggers, especially
+nonzero low bounds, but for non-Fortran debuggers, especially
C debuggers, the above example might have a C equivalent of
@samp{a[4305]}.
This calculation is arrived at by eliminating the subtraction
@@ -8547,7 +8547,7 @@ If a formatted @code{WRITE} produces an endless stream of spaces, check
that your program is linked against the correct version of the C library.
The configuration process takes care to account for your
system's normal @file{libc} not being ANSI-standard, which will
-otherwise cause this behaviour.
+otherwise cause this behavior.
If your system's default library is
ANSI-standard and you subsequently link against a non-ANSI one, there
might be problems such as this one.
@@ -9460,9 +9460,9 @@ general control over whether or not floating-point exceptions are trapped or
ignored.
(Ignoring them typically results in NaN values being
propagated in systems that conform to IEEE 754.)
-The behaviour is normally inherited from the system-dependent startup
+The behavior is normally inherited from the system-dependent startup
code, though some targets, such as the Alpha, have code generation
-options which change the behaviour.
+options which change the behavior.
Most systems provide some C-callable mechanism to change this; this can
be invoked at startup using @command{gcc}'s @code{constructor} attribute.
diff --git a/gcc/f/g77spec.c b/gcc/f/g77spec.c
index 2e094d911c7..6aea81b3c47 100644
--- a/gcc/f/g77spec.c
+++ b/gcc/f/g77spec.c
@@ -47,7 +47,6 @@ Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "gcc.h"
-#include <f/version.h>
#ifndef MATH_LIBRARY
#define MATH_LIBRARY "-lm"
@@ -374,7 +373,7 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
case OPTION_version:
printf ("\
-GNU Fortran (GCC %s) %s\n\
+GNU Fortran (GCC) %s\n\
Copyright (C) 2002 Free Software Foundation, Inc.\n\
\n\
GNU Fortran comes with NO WARRANTY, to the extent permitted by law.\n\
@@ -382,7 +381,7 @@ You may redistribute copies of GNU Fortran\n\
under the terms of the GNU General Public License.\n\
For more information about these matters, see the file named COPYING\n\
or type the command `info -f g77 Copying'.\n\
-", version_string, ffe_version_string);
+", version_string);
exit (0);
break;
diff --git a/gcc/f/intdoc.in b/gcc/f/intdoc.in
index f702fa10b72..3ed3e10e408 100644
--- a/gcc/f/intdoc.in
+++ b/gcc/f/intdoc.in
@@ -1584,7 +1584,7 @@ almost certainly want to use something better.
")
DEFDOC (SRAND, "Random seed.", "\
-Reinitialises the generator with the seed in @var{@1@}.
+Reinitializes the generator with the seed in @var{@1@}.
@xref{IRand Intrinsic}.
@xref{Rand Intrinsic}.
")
@@ -1617,7 +1617,7 @@ Existence
DEFDOC (CHDIR_subr, "Change directory.", "\
Sets the current working directory to be @var{@1@}.
If the @var{@2@} argument is supplied, it contains 0
-on success or a non-zero error code otherwise upon return.
+on success or a nonzero error code otherwise upon return.
See @code{chdir(3)}.
@emph{Caution:} Using this routine during I/O to a unit connected with a
@@ -1631,7 +1631,7 @@ only a function, not as a subroutine, or do not support the
DEFDOC (CHDIR_func, "Change directory.", "\
Sets the current working directory to be @var{@1@}.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{chdir(3)}.
@emph{Caution:} Using this routine during I/O to a unit connected with a
@@ -1652,7 +1652,7 @@ trailing blanks in @var{@1@} are ignored.
Currently, @var{@1@} must not contain the single quote
character.
-Returns 0 on success or a non-zero error code otherwise.
+Returns 0 on success or a nonzero error code otherwise.
Note that this currently works
by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
@@ -1674,7 +1674,7 @@ Currently, @var{@1@} must not contain the single quote
character.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Note that this currently works
by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
@@ -1689,7 +1689,7 @@ only a function, not as a subroutine, or do not support the
DEFDOC (GETCWD_func, "Get current working directory.", "\
Places the current working directory in @var{@1@}.
Returns 0 on
-success, otherwise a non-zero error code
+success, otherwise a nonzero error code
(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
or @code{getwd(3)}).
")
@@ -1697,7 +1697,7 @@ or @code{getwd(3)}).
DEFDOC (GETCWD_subr, "Get current working directory.", "\
Places the current working directory in @var{@1@}.
If the @var{@2@} argument is supplied, it contains 0
-success or a non-zero error code upon return
+success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
or @code{getwd(3)}).
@@ -1758,7 +1758,7 @@ Number of blocks allocated (-1 if not available)
Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
")
DEFDOC (FSTAT_subr, "Get file information.", "\
@@ -1814,7 +1814,7 @@ Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
@@ -1878,7 +1878,7 @@ Number of blocks allocated (-1 if not available)
Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
-Returns 0 on success or a non-zero error code
+Returns 0 on success or a nonzero error code
(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
")
@@ -1940,7 +1940,7 @@ Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return
+0 on success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -2002,7 +2002,7 @@ Number of blocks allocated (-1 if not available)
Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
")
DEFDOC (STAT_subr, "Get file information.", "\
@@ -2060,7 +2060,7 @@ Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
@@ -2073,7 +2073,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the names in @var{@1@} and @var{@2@}---otherwise,
trailing blanks in @var{@1@} and @var{@2@} are ignored.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
See @code{link(2)}.
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -2086,7 +2086,7 @@ Makes a (hard) link from file @var{@1@} to @var{@2@}.
A null character (@samp{CHAR(0)}) marks the end of
the names in @var{@1@} and @var{@2@}---otherwise,
trailing blanks in @var{@1@} and @var{@2@} are ignored.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{link(2)}.
Due to the side effects performed by this intrinsic, the function
@@ -2099,7 +2099,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the names in @var{@1@} and @var{@2@}---otherwise,
trailing blanks in @var{@1@} and @var{@2@} are ignored.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return
+0 on success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -2112,7 +2112,7 @@ Makes a symbolic link from file @var{@1@} to @var{@2@}.
A null character (@samp{CHAR(0)}) marks the end of
the names in @var{@1@} and @var{@2@}---otherwise,
trailing blanks in @var{@1@} and @var{@2@} are ignored.
-Returns 0 on success or a non-zero error code
+Returns 0 on success or a nonzero error code
(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
Due to the side effects performed by this intrinsic, the function
@@ -2126,7 +2126,7 @@ the names in @var{@1@} and @var{@2@}---otherwise,
trailing blanks in @var{@1@} and @var{@2@} are ignored.
See @code{rename(2)}.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
@@ -2139,7 +2139,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the names in @var{@1@} and @var{@2@}---otherwise,
trailing blanks in @var{@1@} and @var{@2@} are ignored.
See @code{rename(2)}.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
Due to the side effects performed by this intrinsic, the function
form is not recommended.
@@ -2168,7 +2168,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the name in @var{@1@}---otherwise,
trailing blanks in @var{@1@} are ignored.
If the @var{@2@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
See @code{unlink(2)}.
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -2181,7 +2181,7 @@ Unlink the file @var{@1@}.
A null character (@samp{CHAR(0)}) marks the end of
the name in @var{@1@}---otherwise,
trailing blanks in @var{@1@} are ignored.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{unlink(2)}.
Due to the side effects performed by this intrinsic, the function
@@ -2238,7 +2238,7 @@ in @var{@1@}.
DEFDOC (HOSTNM_func, "Get host name.", "\
Fills @var{@1@} with the system's host name returned by
-@code{gethostname(2)}, returning 0 on success or a non-zero error code
+@code{gethostname(2)}, returning 0 on success or a nonzero error code
(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
On some systems (specifically SCO) it might be necessary to link the
@@ -2251,7 +2251,7 @@ DEFDOC (HOSTNM_subr, "Get host name.", "\
Fills @var{@1@} with the system's host name returned by
@code{gethostname(2)}.
If the @var{@2@} argument is supplied, it contains
-0 on success or a non-zero error code upon return
+0 on success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -2513,7 +2513,7 @@ allowing you to take appropriate action.
DEFDOC (KILL_func, "Signal a process.", "\
Sends the signal specified by @var{@2@} to the process @var{@1@}.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{kill(2)}.
Due to the side effects performed by this intrinsic, the function
@@ -2523,7 +2523,7 @@ form is not recommended.
DEFDOC (KILL_subr, "Signal a process.", "\
Sends the signal specified by @var{@2@} to the process @var{@1@}.
If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
See @code{kill(2)}.
Some non-GNU implementations of Fortran provide this intrinsic as
diff --git a/gcc/f/intdoc.texi b/gcc/f/intdoc.texi
index e829b357061..e4706267e53 100644
--- a/gcc/f/intdoc.texi
+++ b/gcc/f/intdoc.texi
@@ -2226,7 +2226,7 @@ Description:
Sets the current working directory to be @var{Dir}.
If the @var{Status} argument is supplied, it contains 0
-on success or a non-zero error code otherwise upon return.
+on success or a nonzero error code otherwise upon return.
See @code{chdir(3)}.
@emph{Caution:} Using this routine during I/O to a unit connected with a
@@ -2265,7 +2265,7 @@ Intrinsic groups: @code{badu77}.
Description:
Sets the current working directory to be @var{Dir}.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{chdir(3)}.
@emph{Caution:} Using this routine during I/O to a unit connected with a
@@ -2315,7 +2315,7 @@ Currently, @var{Name} must not contain the single quote
character.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Note that this currently works
by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
@@ -2365,7 +2365,7 @@ trailing blanks in @var{Name} are ignored.
Currently, @var{Name} must not contain the single quote
character.
-Returns 0 on success or a non-zero error code otherwise.
+Returns 0 on success or a nonzero error code otherwise.
Note that this currently works
by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
@@ -5067,7 +5067,7 @@ Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
@@ -5152,7 +5152,7 @@ Number of blocks allocated (-1 if not available)
Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
For information on other intrinsics with the same name:
@xref{FStat Intrinsic (subroutine)}.
@@ -5292,7 +5292,7 @@ Description:
Places the current working directory in @var{Name}.
If the @var{Status} argument is supplied, it contains 0
-success or a non-zero error code upon return
+success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
or @code{getwd(3)}).
@@ -5327,7 +5327,7 @@ Description:
Places the current working directory in @var{Name}.
Returns 0 on
-success, otherwise a non-zero error code
+success, otherwise a nonzero error code
(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
or @code{getwd(3)}).
@@ -5537,7 +5537,7 @@ Description:
Fills @var{Name} with the system's host name returned by
@code{gethostname(2)}.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return
+0 on success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -5575,7 +5575,7 @@ Intrinsic groups: @code{unix}.
Description:
Fills @var{Name} with the system's host name returned by
-@code{gethostname(2)}, returning 0 on success or a non-zero error code
+@code{gethostname(2)}, returning 0 on success or a nonzero error code
(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
On some systems (specifically SCO) it might be necessary to link the
@@ -7107,7 +7107,7 @@ Description:
Sends the signal specified by @var{Signal} to the process @var{Pid}.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
See @code{kill(2)}.
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -7145,7 +7145,7 @@ Intrinsic groups: @code{badu77}.
Description:
Sends the signal specified by @var{Signal} to the process @var{Pid}.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{kill(2)}.
Due to the side effects performed by this intrinsic, the function
@@ -7377,7 +7377,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the names in @var{Path1} and @var{Path2}---otherwise,
trailing blanks in @var{Path1} and @var{Path2} are ignored.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
See @code{link(2)}.
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -7418,7 +7418,7 @@ Makes a (hard) link from file @var{Path1} to @var{Path2}.
A null character (@samp{CHAR(0)}) marks the end of
the names in @var{Path1} and @var{Path2}---otherwise,
trailing blanks in @var{Path1} and @var{Path2} are ignored.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{link(2)}.
Due to the side effects performed by this intrinsic, the function
@@ -7802,7 +7802,7 @@ Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return
+0 on success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -7893,7 +7893,7 @@ Number of blocks allocated (-1 if not available)
Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
-Returns 0 on success or a non-zero error code
+Returns 0 on success or a nonzero error code
(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
For information on other intrinsics with the same name:
@@ -9085,7 +9085,7 @@ the names in @var{Path1} and @var{Path2}---otherwise,
trailing blanks in @var{Path1} and @var{Path2} are ignored.
See @code{rename(2)}.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
@@ -9126,7 +9126,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the names in @var{Path1} and @var{Path2}---otherwise,
trailing blanks in @var{Path1} and @var{Path2} are ignored.
See @code{rename(2)}.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
Due to the side effects performed by this intrinsic, the function
form is not recommended.
@@ -9848,7 +9848,7 @@ Intrinsic groups: @code{unix}.
@noindent
Description:
-Reinitialises the generator with the seed in @var{Seed}.
+Reinitializes the generator with the seed in @var{Seed}.
@xref{IRand Intrinsic}.
@xref{Rand Intrinsic}.
@@ -9931,7 +9931,7 @@ Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
@@ -10018,7 +10018,7 @@ Number of blocks allocated (-1 if not available)
Not all these elements are relevant on all systems.
If an element is not relevant, it is returned as 0.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
For information on other intrinsics with the same name:
@xref{Stat Intrinsic (subroutine)}.
@@ -10067,7 +10067,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the names in @var{Path1} and @var{Path2}---otherwise,
trailing blanks in @var{Path1} and @var{Path2} are ignored.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return
+0 on success or a nonzero error code upon return
(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -10108,7 +10108,7 @@ Makes a symbolic link from file @var{Path1} to @var{Path2}.
A null character (@samp{CHAR(0)}) marks the end of
the names in @var{Path1} and @var{Path2}---otherwise,
trailing blanks in @var{Path1} and @var{Path2} are ignored.
-Returns 0 on success or a non-zero error code
+Returns 0 on success or a nonzero error code
(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
Due to the side effects performed by this intrinsic, the function
@@ -10657,7 +10657,7 @@ A null character (@samp{CHAR(0)}) marks the end of
the name in @var{File}---otherwise,
trailing blanks in @var{File} are ignored.
If the @var{Status} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
+0 on success or a nonzero error code upon return.
See @code{unlink(2)}.
Some non-GNU implementations of Fortran provide this intrinsic as
@@ -10695,7 +10695,7 @@ Unlink the file @var{File}.
A null character (@samp{CHAR(0)}) marks the end of
the name in @var{File}---otherwise,
trailing blanks in @var{File} are ignored.
-Returns 0 on success or a non-zero error code.
+Returns 0 on success or a nonzero error code.
See @code{unlink(2)}.
Due to the side effects performed by this intrinsic, the function
diff --git a/gcc/f/invoke.texi b/gcc/f/invoke.texi
index 6bc3910477b..f07df02cc5c 100644
--- a/gcc/f/invoke.texi
+++ b/gcc/f/invoke.texi
@@ -182,7 +182,7 @@ by type. Explanations are in the following sections.
-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-finite-math-only -fno-trapping-math @gol
+-funsafe-math-optimizations -ffinite-math-only -fno-trapping-math @gol
-fexpensive-optimizations -fdelayed-branch @gol
-fschedule-insns -fschedule-insn2 -fcaller-saves @gol
-funroll-loops -funroll-all-loops @gol
@@ -389,7 +389,7 @@ This option is supplied automatically when @option{-v} or @option{--verbose}
is specified as a command-line option for @command{g77} or @command{gcc}
and when the resulting commands compile Fortran source files.
-In GCC 3.1, this is changed back to the behaviour @command{gcc} displays
+In GCC 3.1, this is changed back to the behavior @command{gcc} displays
for @samp{.c} files.
@cindex -fset-g77-defaults option
@@ -1542,8 +1542,8 @@ Note that if you are not optimizing, no functions can be expanded inline.
@cindex conformance, IEEE 754
Might allow some programs designed to not be too dependent
on IEEE behavior for floating-point to run faster, or die trying.
-Sets @option{-funsafe-math-optimizations}, and
-@option{-fno-trapping-math}.
+Sets @option{-funsafe-math-optimizations}, @option{-ffinite-math-only},
+and @option{-fno-trapping-math}.
@cindex -funsafe-math-optimizations option
@cindex options, -funsafe-math-optimizations
@@ -1551,14 +1551,17 @@ Sets @option{-funsafe-math-optimizations}, and
Allow optimizations that may be give incorrect results
for certain IEEE inputs.
-@cindex -fno-finite-math-only option
-@cindex options, -fno-finite-math-only
-@item -fno-finite-math-only
-Fortran specifies all arithmetic that can result in a NaN or an
-infinity as ``giving undefined results'', therefore the compiler
-by default operates in a way that assumes no NaNs or +-Inf can
-be generated. If your program might generate or use NaNs or
-infinities, then you should use this option.
+@cindex -ffinite-math-only option
+@cindex options, -ffinite-math-only
+@item -ffinite-math-only
+Allow optimizations for floating-point arithmetic that assume
+that arguments and results are not NaNs or +-Infs.
+
+This option should never be turned on by any @option{-O} option since
+it can result in incorrect output for programs which depend on
+an exact implementation of IEEE or ISO rules/specifications.
+
+The default is @option{-fno-finite-math-only}.
@cindex -fno-trapping-math option
@cindex options, -fno-trapping-math
diff --git a/gcc/f/lang-specs.h b/gcc/f/lang-specs.h
index 5536f78cab0..0a30f558ae2 100644
--- a/gcc/f/lang-specs.h
+++ b/gcc/f/lang-specs.h
@@ -30,14 +30,14 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
{"@f77-cpp-input",
"cc1 -E -traditional-cpp -D_LANGUAGE_FORTRAN %(cpp_options) \
%{E|M|MM:%(cpp_debug_options)}\
- %{!M:%{!MM:%{!E:%{!pipe:%g.f} |\n\
- f771 %{!pipe:%g.f} %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}}}", 0},
+ %{!M:%{!MM:%{!E: %|.f |\n\
+ f771 %|.f %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}}}", 0},
{".r", "@ratfor", 0},
{"@ratfor",
"%{C:%{!E:%eGNU C does not support -C without using -E}}\
%{CC:%{!E:%eGNU C does not support -CC without using -E}}\
ratfor %{C} %{CC} %{v} %i %{E:%W{o*}} %{!E: %{!pipe:-o %g.f} |\n\
- f771 %{!pipe:%g.f} %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}", 0},
+ f771 %m.f %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}", 0},
{".f", "@f77", 0},
{".for", "@f77", 0},
{".FOR", "@f77", 0},
diff --git a/gcc/f/news.texi b/gcc/f/news.texi
index 08b41ec0439..7858559a26b 100644
--- a/gcc/f/news.texi
+++ b/gcc/f/news.texi
@@ -148,7 +148,7 @@ An online, ``live'' version of this document
(derived directly from the mainline, development version
of @command{g77} within @command{gcc})
is available at
-@uref{http://www.gnu.org/software/gcc/onlinedocs/g77_news.html}.
+@uref{http://gcc.gnu.org/onlinedocs/g77/News.html}.
@end ifclear
The following information was last updated on @value{last-update-news}:
@@ -2315,7 +2315,7 @@ fix up some of the build procedures.
@item
Change code generation for list-directed I/O so it allows
-for new versions of @code{libf2c} that might return non-zero
+for new versions of @code{libf2c} that might return nonzero
status codes for some operations previously assumed to always
return zero.
diff --git a/gcc/f/parse.c b/gcc/f/parse.c
index f687e592ec8..106ff3f60cc 100644
--- a/gcc/f/parse.c
+++ b/gcc/f/parse.c
@@ -35,7 +35,7 @@ ffe_parse_file (set_yydebug)
ffewhereFile wf;
if (ffe_is_version ())
- fprintf (stderr, "GNU Fortran Front End version %s\n", ffe_version_string);
+ fprintf (stderr, "GNU Fortran Front End version %s\n", version_string);
if (!ffe_is_pedantic ())
ffe_set_is_pedantic (pedantic);
diff --git a/gcc/f/target.c b/gcc/f/target.c
index 5c06368a3a5..82ae955ebec 100644
--- a/gcc/f/target.c
+++ b/gcc/f/target.c
@@ -2277,9 +2277,11 @@ ffetarget_real1 (ffetargetReal1 *value, ffelexToken integer,
*p = '\0';
- ffetarget_make_real1 (value,
- FFETARGET_ATOF_ (ptr,
- SFmode));
+ {
+ REAL_VALUE_TYPE rv;
+ rv = FFETARGET_ATOF_ (ptr, SFmode);
+ ffetarget_make_real1 (value, rv);
+ }
if (sz > ARRAY_SIZE (ffetarget_string_))
malloc_kill_ks (malloc_pool_image (), ptr, sz);
@@ -2363,9 +2365,11 @@ ffetarget_real2 (ffetargetReal2 *value, ffelexToken integer,
*p = '\0';
- ffetarget_make_real2 (value,
- FFETARGET_ATOF_ (ptr,
- DFmode));
+ {
+ REAL_VALUE_TYPE rv;
+ rv = FFETARGET_ATOF_ (ptr, DFmode);
+ ffetarget_make_real2 (value, rv);
+ }
if (sz > ARRAY_SIZE (ffetarget_string_))
malloc_kill_ks (malloc_pool_image (), ptr, sz);
@@ -2521,6 +2525,9 @@ void *
ffetarget_memcpy_ (void *dst, void *src, size_t len)
{
#ifdef CROSS_COMPILE
+ /* HOST_WORDS_BIG_ENDIAN corresponds to both WORDS_BIG_ENDIAN and
+ BYTES_BIG_ENDIAN (i.e. there are no HOST_ macros to represent a
+ difference in the two latter). */
int host_words_big_endian =
#ifndef HOST_WORDS_BIG_ENDIAN
0
@@ -2529,22 +2536,6 @@ ffetarget_memcpy_ (void *dst, void *src, size_t len)
#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
@@ -2555,8 +2546,7 @@ ffetarget_memcpy_ (void *dst, void *src, size_t len)
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)
+ || !BYTES_BIG_ENDIAN != !host_words_big_endian)
sorry ("data initializer on host with different endianness");
#endif /* CROSS_COMPILE */
diff --git a/gcc/f/target.h b/gcc/f/target.h
index ae4c8e3e8c2..b96504f4628 100644
--- a/gcc/f/target.h
+++ b/gcc/f/target.h
@@ -224,7 +224,15 @@ 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__) && !defined(__x86_64__)
+#if (!defined(__alpha__) \
+ && (!defined(__hppa__) || !defined(__LP64__)) \
+ && (!defined(__ia64__) || !defined(__LP64__)) \
+ && !defined(__MMIX__) \
+ && (!defined (_ARCH_PPC) || !defined (__64BIT__)) \
+ && !defined(__powerpc64__) \
+ && !defined(__s390x__) \
+ && (!defined(__sparc__) || (!defined(__sparcv9) && !defined(__arch64__)))\
+ && !defined(__x86_64__))
#define FFETARGET_32bit_longs
#endif
@@ -323,54 +331,30 @@ typedef ? ffetargetLogical8;
?
#endif
#if FFETARGET_okREAL1
-#ifdef FFETARGET_32bit_longs
-typedef long int ffetargetReal1;
-#define ffetargetReal1_f "l"
-#define ffetarget_cvt_r1_to_rv_ REAL_VALUE_UNTO_TARGET_SINGLE
-#define ffetarget_cvt_rv_to_r1_ REAL_VALUE_TO_TARGET_SINGLE
-#else
typedef int ffetargetReal1;
#define ffetargetReal1_f ""
-#define ffetarget_cvt_r1_to_rv_(in) \
- ({ REAL_VALUE_TYPE _rv; \
- _rv = REAL_VALUE_UNTO_TARGET_SINGLE ((long) (in)); \
+#define ffetarget_cvt_r1_to_rv_(in) \
+ ({ REAL_VALUE_TYPE _rv; \
+ long _in = (in); \
+ real_from_target (&_rv, &_in, mode_for_size (32, MODE_FLOAT, 0)); \
_rv; })
#define ffetarget_cvt_rv_to_r1_(in, out) \
({ long _tmp; \
REAL_VALUE_TO_TARGET_SINGLE ((in), _tmp); \
(out) = (ffetargetReal1) _tmp; })
#endif
-#endif
#if FFETARGET_okREAL2
-#ifdef FFETARGET_32bit_longs
-typedef struct
- {
- long int v[2];
- }
-ffetargetReal2;
-#define ffetargetReal2_f "l"
-#define ffetarget_cvt_r2_to_rv_ REAL_VALUE_UNTO_TARGET_DOUBLE
-#define ffetarget_cvt_rv_to_r2_ REAL_VALUE_TO_TARGET_DOUBLE
-#else
-typedef struct
- {
- int v[2];
- }
-ffetargetReal2;
+typedef struct { int v[2]; } ffetargetReal2;
#define ffetargetReal2_f ""
-#define ffetarget_cvt_r2_to_rv_(in) \
- ({ REAL_VALUE_TYPE _rv; \
- long _tmp[2]; \
- _tmp[0] = (in)[0]; \
- _tmp[1] = (in)[1]; \
- _rv = REAL_VALUE_UNTO_TARGET_DOUBLE (_tmp); \
+#define ffetarget_cvt_r2_to_rv_(in) \
+ ({ REAL_VALUE_TYPE _rv; long _tmp[2]; \
+ _tmp[0] = (in)[0]; _tmp[1] = (in)[1]; \
+ real_from_target (&_rv, _tmp, mode_for_size (64, MODE_FLOAT, 0)); \
_rv; })
-#define ffetarget_cvt_rv_to_r2_(in, out) \
- ({ long _tmp[2]; \
- REAL_VALUE_TO_TARGET_DOUBLE ((in), _tmp); \
- (out)[0] = (int) (_tmp[0]); \
- (out)[1] = (int) (_tmp[1]); })
-#endif
+#define ffetarget_cvt_rv_to_r2_(in, out) \
+ ({ long _tmp[2]; \
+ REAL_VALUE_TO_TARGET_DOUBLE ((in), _tmp); \
+ (out)[0] = (int)_tmp[0]; (out)[1] = (int)_tmp[1]; })
#endif
#if FFETARGET_okREAL3
typedef long ffetargetReal3[?];
@@ -1485,13 +1469,15 @@ void *ffetarget_memcpy_ (void *dst, void *src, size_t len);
#define ffetarget_print_real1(f,l) \
({ REAL_VALUE_TYPE lr; \
lr = ffetarget_cvt_r1_to_rv_ ((l)); \
- REAL_VALUE_TO_DECIMAL (lr, bad_fmt_val??, ffetarget_string_); \
+ real_to_decimal (ffetarget_string_, &lr \
+ sizeof(ffetarget_string_), 0, 1); \
fputs (ffetarget_string_, (f)); \
})
#define ffetarget_print_real2(f,l) \
({ REAL_VALUE_TYPE lr; \
lr = ffetarget_cvt_r2_to_rv_ (&((l).v[0])); \
- REAL_VALUE_TO_DECIMAL (lr, bad_fmt_val??, ffetarget_string_); \
+ real_to_decimal (ffetarget_string_, &lr, \
+ sizeof(ffetarget_string_), 0, 1); \
fputs (ffetarget_string_, (f)); \
})
#define ffetarget_real1_one(res) ffetarget_cvt_rv_to_r1_ (dconst1, *(res))
diff --git a/gcc/f/version.c b/gcc/f/version.c
deleted file mode 100644
index 2f9fbd01e5a..00000000000
--- a/gcc/f/version.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "ansidecl.h"
-#include "f/version.h"
-
-const char *const ffe_version_string = "3.3 20020822 (experimental)";
diff --git a/gcc/f/version.h b/gcc/f/version.h
deleted file mode 100644
index fe775519707..00000000000
--- a/gcc/f/version.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef GCC_F_VERSION_H
-#define GCC_F_VERSION_H
-
-extern const char *const ffe_version_string;
-
-#endif /* ! GCC_F_VERSION_H */
diff --git a/gcc/final.c b/gcc/final.c
index 9d2c42632b5..5ef564c3452 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -68,7 +68,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "target.h"
#include "debug.h"
#include "expr.h"
-#include "profile.h"
#include "cfglayout.h"
#ifdef XCOFF_DEBUGGING_INFO
@@ -136,10 +135,6 @@ static unsigned int insn_noperands;
static rtx last_ignored_compare = 0;
-/* Flag indicating this insn is the start of a new basic block. */
-
-static int new_block = 1;
-
/* Assign a unique number to each insn that is output.
This can be used to generate unique local labels. */
@@ -203,17 +198,6 @@ static char *line_note_exists;
rtx current_insn_predicate;
#endif
-struct function_list
-{
- struct function_list *next; /* next function */
- const char *name; /* function name */
- long cfg_checksum; /* function checksum */
- long count_edges; /* number of intrumented edges in this function */
-};
-
-static struct function_list *functions_head = 0;
-static struct function_list **functions_tail = &functions_head;
-
#ifdef HAVE_ATTR_length
static int asm_insn_count PARAMS ((rtx));
#endif
@@ -253,272 +237,6 @@ init_final (filename)
#endif
}
-/* Called at end of source file,
- to output the arc-profiling table for this entire compilation. */
-
-void
-end_final (filename)
- const char *filename;
-{
- if (profile_arc_flag && profile_info.count_instrumented_edges)
- {
- char name[20];
- tree string_type, string_cst;
- tree structure_decl, structure_value, structure_pointer_type;
- tree field_decl, decl_chain, value_chain;
- tree sizeof_field_value, domain_type;
-
- /* Build types. */
- string_type = build_pointer_type (char_type_node);
-
- /* Libgcc2 bb structure. */
- structure_decl = make_node (RECORD_TYPE);
- structure_pointer_type = build_pointer_type (structure_decl);
-
- /* Output the main header, of 7 words:
- 0: 1 if this file is initialized, else 0.
- 1: address of file name (LPBX1).
- 2: address of table of counts (LPBX2).
- 3: number of counts in the table.
- 4: always 0, libgcc2 uses this as a pointer to next ``struct bb''
-
- The following are GNU extensions:
-
- 5: Number of bytes in this header.
- 6: address of table of function checksums (LPBX7). */
-
- /* The zero word. */
- decl_chain =
- build_decl (FIELD_DECL, get_identifier ("zero_word"),
- long_integer_type_node);
- value_chain = build_tree_list (decl_chain,
- convert (long_integer_type_node,
- integer_zero_node));
-
- /* Address of filename. */
- {
- char *cwd, *da_filename;
- int da_filename_len;
-
- field_decl =
- build_decl (FIELD_DECL, get_identifier ("filename"), string_type);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
-
- cwd = getpwd ();
- da_filename_len = strlen (filename) + strlen (cwd) + 4 + 1;
- da_filename = (char *) alloca (da_filename_len);
- strcpy (da_filename, cwd);
- strcat (da_filename, "/");
- strcat (da_filename, filename);
- strcat (da_filename, ".da");
- da_filename_len = strlen (da_filename);
- string_cst = build_string (da_filename_len + 1, da_filename);
- domain_type = build_index_type (build_int_2 (da_filename_len, 0));
- TREE_TYPE (string_cst)
- = build_array_type (char_type_node, domain_type);
- value_chain = tree_cons (field_decl,
- build1 (ADDR_EXPR, string_type, string_cst),
- value_chain);
- }
-
- /* Table of counts. */
- {
- tree gcov_type_type = make_unsigned_type (GCOV_TYPE_SIZE);
- tree gcov_type_pointer_type = build_pointer_type (gcov_type_type);
- tree domain_tree
- = build_index_type (build_int_2 (profile_info.
- count_instrumented_edges - 1, 0));
- tree gcov_type_array_type
- = build_array_type (gcov_type_type, domain_tree);
- tree gcov_type_array_pointer_type
- = build_pointer_type (gcov_type_array_type);
- tree counts_table;
-
- field_decl =
- build_decl (FIELD_DECL, get_identifier ("counts"),
- gcov_type_pointer_type);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
-
- /* No values. */
- counts_table
- = build (VAR_DECL, gcov_type_array_type, NULL_TREE, NULL_TREE);
- TREE_STATIC (counts_table) = 1;
- ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2);
- DECL_NAME (counts_table) = get_identifier (name);
- assemble_variable (counts_table, 0, 0, 0);
-
- value_chain = tree_cons (field_decl,
- build1 (ADDR_EXPR,
- gcov_type_array_pointer_type,
- counts_table), value_chain);
- }
-
- /* Count of the # of instrumented arcs. */
- field_decl
- = build_decl (FIELD_DECL, get_identifier ("ncounts"),
- long_integer_type_node);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
-
- value_chain = tree_cons (field_decl,
- convert (long_integer_type_node,
- build_int_2 (profile_info.
- count_instrumented_edges,
- 0)), value_chain);
- /* Pointer to the next bb. */
- field_decl
- = build_decl (FIELD_DECL, get_identifier ("next"),
- structure_pointer_type);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
-
- value_chain = tree_cons (field_decl, null_pointer_node, value_chain);
-
- /* sizeof(struct bb). We'll set this after entire structure
- is laid out. */
- field_decl
- = build_decl (FIELD_DECL, get_identifier ("sizeof_bb"),
- long_integer_type_node);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
-
- sizeof_field_value = tree_cons (field_decl, NULL, value_chain);
- value_chain = sizeof_field_value;
-
- /* struct bb_function []. */
- {
- struct function_list *item;
- int num_nodes;
- tree checksum_field, arc_count_field, name_field;
- tree domain;
- tree array_value_chain = NULL_TREE;
- tree bb_fn_struct_type;
- tree bb_fn_struct_array_type;
- tree bb_fn_struct_array_pointer_type;
- tree bb_fn_struct_pointer_type;
- tree field_value, field_value_chain;
-
- bb_fn_struct_type = make_node (RECORD_TYPE);
-
- checksum_field = build_decl (FIELD_DECL, get_identifier ("checksum"),
- long_integer_type_node);
-
- arc_count_field
- = build_decl (FIELD_DECL, get_identifier ("arc_count"),
- integer_type_node);
- TREE_CHAIN (checksum_field) = arc_count_field;
-
- name_field
- = build_decl (FIELD_DECL, get_identifier ("name"), string_type);
- TREE_CHAIN (arc_count_field) = name_field;
-
- TYPE_FIELDS (bb_fn_struct_type) = checksum_field;
-
- num_nodes = 0;
-
- for (item = functions_head; item != 0; item = item->next)
- num_nodes++;
-
- /* Note that the array contains a terminator, hence no - 1. */
- domain = build_index_type (build_int_2 (num_nodes, 0));
-
- bb_fn_struct_pointer_type = build_pointer_type (bb_fn_struct_type);
- bb_fn_struct_array_type
- = build_array_type (bb_fn_struct_type, domain);
- bb_fn_struct_array_pointer_type
- = build_pointer_type (bb_fn_struct_array_type);
-
- layout_type (bb_fn_struct_type);
- layout_type (bb_fn_struct_pointer_type);
- layout_type (bb_fn_struct_array_type);
- layout_type (bb_fn_struct_array_pointer_type);
-
- for (item = functions_head; item != 0; item = item->next)
- {
- size_t name_len;
-
- /* create constructor for structure. */
- field_value_chain
- = build_tree_list (checksum_field,
- convert (long_integer_type_node,
- build_int_2 (item->cfg_checksum, 0)));
- field_value_chain
- = tree_cons (arc_count_field,
- convert (integer_type_node,
- build_int_2 (item->count_edges, 0)),
- field_value_chain);
-
- name_len = strlen (item->name);
- string_cst = build_string (name_len + 1, item->name);
- domain_type = build_index_type (build_int_2 (name_len, 0));
- TREE_TYPE (string_cst)
- = build_array_type (char_type_node, domain_type);
- field_value_chain = tree_cons (name_field,
- build1 (ADDR_EXPR, string_type,
- string_cst),
- field_value_chain);
-
- /* Add to chain. */
- array_value_chain
- = tree_cons (NULL_TREE, build (CONSTRUCTOR,
- bb_fn_struct_type, NULL_TREE,
- nreverse (field_value_chain)),
- array_value_chain);
- }
-
- /* Add terminator. */
- field_value = build_tree_list (arc_count_field,
- convert (integer_type_node,
- build_int_2 (-1, 0)));
-
- array_value_chain = tree_cons (NULL_TREE,
- build (CONSTRUCTOR, bb_fn_struct_type,
- NULL_TREE, field_value),
- array_value_chain);
-
-
- /* Create constructor for array. */
- field_decl
- = build_decl (FIELD_DECL, get_identifier ("function_infos"),
- bb_fn_struct_pointer_type);
- value_chain = tree_cons (field_decl,
- build1 (ADDR_EXPR,
- bb_fn_struct_array_pointer_type,
- build (CONSTRUCTOR,
- bb_fn_struct_array_type,
- NULL_TREE,
- nreverse
- (array_value_chain))),
- value_chain);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
- }
-
- /* Finish structure. */
- TYPE_FIELDS (structure_decl) = nreverse (decl_chain);
- layout_type (structure_decl);
-
- structure_value
- = build (VAR_DECL, structure_decl, NULL_TREE, NULL_TREE);
- DECL_INITIAL (structure_value)
- = build (CONSTRUCTOR, structure_decl, NULL_TREE,
- nreverse (value_chain));
- TREE_STATIC (structure_value) = 1;
- ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0);
- DECL_NAME (structure_value) = get_identifier (name);
-
- /* Size of this structure. */
- TREE_VALUE (sizeof_field_value)
- = convert (long_integer_type_node,
- build_int_2 (int_size_in_bytes (structure_decl), 0));
-
- /* Build structure. */
- assemble_variable (structure_value, 0, 0, 0);
- }
-}
-
/* Default target function prologue and epilogue assembler output.
If not overridden for epilogue code, then the function body itself
@@ -997,7 +715,7 @@ compute_alignments ()
align it. It is most likely an first block of loop. */
if (has_fallthru
&& branch_frequency + fallthru_frequency > BB_FREQ_MAX / 10
- && branch_frequency > fallthru_frequency * 5)
+ && branch_frequency > fallthru_frequency * 2)
{
log = LOOP_ALIGN (label);
if (max_log < log)
@@ -1718,7 +1436,7 @@ profile_function (file)
#ifndef NO_PROFILE_COUNTERS
data_section ();
ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
- ASM_OUTPUT_INTERNAL_LABEL (file, "LP", current_function_funcdef_no);
+ (*targetm.asm_out.internal_label) (file, "LP", current_function_funcdef_no);
assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
#endif
@@ -1823,7 +1541,6 @@ final (first, file, optimize, prescan)
int max_uid = 0;
last_ignored_compare = 0;
- new_block = 1;
/* Make a map indicating which line numbers appear in this function.
When producing SDB debugging info, delete troublesome line number
@@ -1904,22 +1621,6 @@ final (first, file, optimize, prescan)
insn = final_scan_insn (insn, file, optimize, prescan, 0);
}
- /* Store function names for edge-profiling. */
- /* ??? Probably should re-use the existing struct function. */
-
- if (cfun->arc_profile)
- {
- struct function_list *new_item = xmalloc (sizeof (struct function_list));
-
- *functions_tail = new_item;
- functions_tail = &new_item->next;
-
- new_item->next = 0;
- new_item->name = xstrdup (current_function_name);
- new_item->cfg_checksum = profile_info.current_function_cfg_checksum;
- new_item->count_edges = profile_info.count_edges_instrumented_now;
- }
-
free (line_note_exists);
line_note_exists = NULL;
}
@@ -2185,8 +1886,12 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
#else
+#ifdef ASM_OUTPUT_ALIGN_WITH_NOP
+ ASM_OUTPUT_ALIGN_WITH_NOP (file, align);
+#else
ASM_OUTPUT_ALIGN (file, align);
#endif
+#endif
}
}
#ifdef HAVE_cc0
@@ -2218,7 +1923,6 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
#endif
if (prescan > 0)
break;
- new_block = 1;
#ifdef FINAL_PRESCAN_LABEL
FINAL_PRESCAN_INSN (insn, NULL, 0);
@@ -2269,7 +1973,7 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
NEXT_INSN (insn));
#else
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (insn));
#endif
#endif
break;
@@ -2278,7 +1982,7 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
if (LABEL_ALT_ENTRY_P (insn))
output_alternate_entry_point (file, insn);
else
- ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
+ (*targetm.asm_out.internal_label) (file, "L", CODE_LABEL_NUMBER (insn));
break;
default:
@@ -2760,7 +2464,6 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
if (prev_nonnote_insn (insn) != last_ignored_compare)
abort ();
- new_block = 0;
/* We have already processed the notes between the setter and
the user. Make sure we don't process them again, this is
@@ -2794,7 +2497,6 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
abort ();
#endif
- new_block = 0;
return new;
}
@@ -4043,7 +3745,7 @@ int
only_leaf_regs_used ()
{
int i;
- char *permitted_reg_in_leaf_functions = LEAF_REGISTERS;
+ const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if ((regs_ever_live[i] || global_regs[i])
diff --git a/gcc/fixinc/fixincl.x b/gcc/fixinc/fixincl.x
index 4cd9f63db3f..a17fa9b9040 100644
--- a/gcc/fixinc/fixincl.x
+++ b/gcc/fixinc/fixincl.x
@@ -5,7 +5,7 @@
* files which are fixed to work correctly with ANSI C and placed in a
* directory that GNU C will search.
*
- * This file contains 146 fixup descriptions.
+ * This file contains 147 fixup descriptions.
*
* See README for more information.
*
@@ -248,6 +248,38 @@ static const char* apzAab_Fd_Zero_Selectbits_HPatch[] = {
/* * * * * * * * * * * * * * * * * * * * * * * * * *
*
+ * Description of Aab_Solaris_Sys_Varargs_H fix
+ */
+tSCC zAab_Solaris_Sys_Varargs_HName[] =
+ "AAB_solaris_sys_varargs_h";
+
+/*
+ * File name selection pattern
+ */
+tSCC zAab_Solaris_Sys_Varargs_HList[] =
+ "|sys/varargs.h|";
+/*
+ * Machine/OS name selection pattern
+ */
+tSCC* apzAab_Solaris_Sys_Varargs_HMachs[] = {
+ "*-*-solaris*",
+ (const char*)NULL };
+#define AAB_SOLARIS_SYS_VARARGS_H_TEST_CT 0
+#define aAab_Solaris_Sys_Varargs_HTests (tTestDesc*)NULL
+
+/*
+ * Fix Command Arguments for Aab_Solaris_Sys_Varargs_H
+ */
+static const char* apzAab_Solaris_Sys_Varargs_HPatch[] = {
+"#ifdef __STDC__\n\
+#include <stdarg.h>\n\
+#else\n\
+#include <varargs.h>\n\
+#endif\n",
+ (char*)NULL };
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
* Description of Aab_Sun_Memcpy fix
*/
tSCC zAab_Sun_MemcpyName[] =
@@ -297,38 +329,6 @@ extern int memcmp();\n\n\
/* * * * * * * * * * * * * * * * * * * * * * * * * *
*
- * Description of Aab_Solaris_Sys_Varargs_H fix
- */
-tSCC zAab_Solaris_Sys_Varargs_HName[] =
- "AAB_solaris_sys_varargs_h";
-
-/*
- * File name selection pattern
- */
-tSCC zAab_Solaris_Sys_Varargs_HList[] =
- "|sys/varargs.h|";
-/*
- * Machine/OS name selection pattern
- */
-tSCC* apzAab_Solaris_Sys_Varargs_HMachs[] = {
- "*-*-solaris*",
- (const char*)NULL };
-#define AAB_SOLARIS_SYS_VARARGS_H_TEST_CT 0
-#define aAab_Solaris_Sys_Varargs_HTests (tTestDesc*)NULL
-
-/*
- * Fix Command Arguments for Aab_Solaris_Sys_Varargs_H
- */
-static const char* apzAab_Solaris_Sys_Varargs_HPatch[] = {
-"#ifdef __STDC__\n\
-#include <stdarg.h>\n\
-#else\n\
-#include <varargs.h>\n\
-#endif\n",
- (char*)NULL };
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * *
- *
* Description of Aab_Svr4_Replace_Byteorder fix
*/
tSCC zAab_Svr4_Replace_ByteorderName[] =
@@ -1912,6 +1912,43 @@ static const char* apzHpux11_FabsfPatch[] = {
/* * * * * * * * * * * * * * * * * * * * * * * * * *
*
+ * Description of Hpux11_Abs fix
+ */
+tSCC zHpux11_AbsName[] =
+ "hpux11_abs";
+
+/*
+ * File name selection pattern
+ */
+tSCC zHpux11_AbsList[] =
+ "|stdlib.h|";
+/*
+ * Machine/OS name selection pattern
+ */
+tSCC* apzHpux11_AbsMachs[] = {
+ "ia64-hp-hpux11*",
+ (const char*)NULL };
+
+/*
+ * content selection pattern - do fix if pattern found
+ */
+tSCC zHpux11_AbsSelect0[] =
+ "ifndef _MATH_INCLUDED";
+
+#define HPUX11_ABS_TEST_CT 1
+static tTestDesc aHpux11_AbsTests[] = {
+ { TT_EGREP, zHpux11_AbsSelect0, (regex_t*)NULL }, };
+
+/*
+ * Fix Command Arguments for Hpux11_Abs
+ */
+static const char* apzHpux11_AbsPatch[] = {
+ "format",
+ "if !defined(_MATH_INCLUDED) || defined(__GNUG__)",
+ (char*)NULL };
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
* Description of Hpux11_Size_T fix
*/
tSCC zHpux11_Size_TName[] =
@@ -3881,6 +3918,7 @@ s@ va_list@ __not_va_list__@\n\
s@\\*va_list@*__not_va_list__@\n\
s@ __va_list)@ __gnuc_va_list)@\n\
s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;@typedef \\1 __not_va_list__;@\n\
+s@typedef[ \t]*__va_list__@typedef __gnuc_va_list@\n\
s@GNUC_VA_LIST@GNUC_Va_LIST@\n\
s@_NEED___VA_LIST@_NEED___Va_LIST@\n\
s@VA_LIST@DUMMY_VA_LIST@\n\
@@ -5707,9 +5745,9 @@ static const char* apzX11_SprintfPatch[] = {
*
* List of all fixes
*/
-#define REGEX_COUNT 153
+#define REGEX_COUNT 154
#define MACH_LIST_SIZE_LIMIT 279
-#define FIX_COUNT 146
+#define FIX_COUNT 147
/*
* Enumerate the fixes
@@ -5719,8 +5757,8 @@ typedef enum {
AAB_FD_ZERO_ASM_POSIX_TYPES_H_FIXIDX,
AAB_FD_ZERO_GNU_TYPES_H_FIXIDX,
AAB_FD_ZERO_SELECTBITS_H_FIXIDX,
- AAB_SUN_MEMCPY_FIXIDX,
AAB_SOLARIS_SYS_VARARGS_H_FIXIDX,
+ AAB_SUN_MEMCPY_FIXIDX,
AAB_SVR4_REPLACE_BYTEORDER_FIXIDX,
AAB_ULTRIX_ANSI_COMPAT_FIXIDX,
AAB_ULTRIX_LIMITS_FIXIDX,
@@ -5761,6 +5799,7 @@ typedef enum {
HPUX10_CPP_POW_INLINE_FIXIDX,
HPUX11_CPP_POW_INLINE_FIXIDX,
HPUX11_FABSF_FIXIDX,
+ HPUX11_ABS_FIXIDX,
HPUX11_SIZE_T_FIXIDX,
HPUX11_UINT32_C_FIXIDX,
HPUX11_VSNPRINTF_FIXIDX,
@@ -5884,16 +5923,16 @@ tFixDesc fixDescList[ FIX_COUNT ] = {
AAB_FD_ZERO_SELECTBITS_H_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT,
aAab_Fd_Zero_Selectbits_HTests, apzAab_Fd_Zero_Selectbits_HPatch, 0 },
- { zAab_Sun_MemcpyName, zAab_Sun_MemcpyList,
- apzAab_Sun_MemcpyMachs,
- AAB_SUN_MEMCPY_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT,
- aAab_Sun_MemcpyTests, apzAab_Sun_MemcpyPatch, 0 },
-
{ zAab_Solaris_Sys_Varargs_HName, zAab_Solaris_Sys_Varargs_HList,
apzAab_Solaris_Sys_Varargs_HMachs,
AAB_SOLARIS_SYS_VARARGS_H_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT,
aAab_Solaris_Sys_Varargs_HTests, apzAab_Solaris_Sys_Varargs_HPatch, 0 },
+ { zAab_Sun_MemcpyName, zAab_Sun_MemcpyList,
+ apzAab_Sun_MemcpyMachs,
+ AAB_SUN_MEMCPY_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT,
+ aAab_Sun_MemcpyTests, apzAab_Sun_MemcpyPatch, 0 },
+
{ zAab_Svr4_Replace_ByteorderName, zAab_Svr4_Replace_ByteorderList,
apzAab_Svr4_Replace_ByteorderMachs,
AAB_SVR4_REPLACE_BYTEORDER_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT,
@@ -6094,6 +6133,11 @@ tFixDesc fixDescList[ FIX_COUNT ] = {
HPUX11_FABSF_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
aHpux11_FabsfTests, apzHpux11_FabsfPatch, 0 },
+ { zHpux11_AbsName, zHpux11_AbsList,
+ apzHpux11_AbsMachs,
+ HPUX11_ABS_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+ aHpux11_AbsTests, apzHpux11_AbsPatch, 0 },
+
{ zHpux11_Size_TName, zHpux11_Size_TList,
apzHpux11_Size_TMachs,
HPUX11_SIZE_T_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
diff --git a/gcc/fixinc/inclhack.def b/gcc/fixinc/inclhack.def
index c9617bd07d1..787bcb73626 100644
--- a/gcc/fixinc/inclhack.def
+++ b/gcc/fixinc/inclhack.def
@@ -220,6 +220,23 @@ fix = {
/*
+ * Solaris <sys/varargs.h> is a DDK (aka kernel-land) header providing
+ * the same interface as <stdarg.h>. No idea why they couldn't have just
+ * used the standard header.
+ */
+fix = {
+ hackname = AAB_solaris_sys_varargs_h;
+ files = "sys/varargs.h";
+ mach = '*-*-solaris*';
+ replace = "#ifdef __STDC__\n"
+ "#include <stdarg.h>\n"
+ "#else\n"
+ "#include <varargs.h>\n"
+ "#endif\n";
+};
+
+
+/*
* Fix non-ANSI memcpy declaration that conflicts with gcc's builtin
* declaration on Sun OS 4.x. We must only fix this on Sun OS 4.x, because
* many other systems have similar text but correct versions of the file.
@@ -259,23 +276,6 @@ extern int memcmp();
/*
- * Solaris <sys/varargs.h> is a DDK (aka kernel-land) header providing
- * the same interface as <stdarg.h>. No idea why they couldn't have just
- * used the standard header.
- */
-fix = {
- hackname = AAB_solaris_sys_varargs_h;
- files = "sys/varargs.h";
- mach = '*-*-solaris*';
- replace = "#ifdef __STDC__\n"
- "#include <stdarg.h>\n"
- "#else\n"
- "#include <varargs.h>\n"
- "#endif\n";
-};
-
-
-/*
* Completely replace <sys/varargs.h> with a file that includes gcc's
* stdarg.h or varargs.h files as appropriate.
*/
@@ -1165,6 +1165,21 @@ fix = {
/*
+ * Make sure hpux defines abs in header.
+ */
+fix = {
+ hackname = hpux11_abs;
+ mach = ia64-hp-hpux11*;
+ files = stdlib.h;
+ select = "ifndef _MATH_INCLUDED";
+ c_fix = format;
+ c_fix_arg = "if !defined(_MATH_INCLUDED) || defined(__GNUG__)";
+// sed = "s/ifndef _MATH_INCLUDED/if !defined(_MATH_INCLUDED) || defined(__GNUG__)/";
+ test_text = "#ifndef _MATH_INCLUDED";
+};
+
+
+/*
* Prevent HP-UX 11 from defining __size_t and preventing size_t from
* being defined by having it define _hpux_size_t instead.
*/
@@ -2216,6 +2231,7 @@ fix = {
"s@ __va_list)@ __gnuc_va_list)@\n"
"s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;"
"@typedef \\1 __not_va_list__;@\n"
+ "s@typedef[ \t]*__va_list__@typedef __gnuc_va_list@\n"
"s@GNUC_VA_LIST@GNUC_Va_LIST@\n"
"s@_NEED___VA_LIST@_NEED___Va_LIST@\n"
"s@VA_LIST@DUMMY_VA_LIST@\n"
diff --git a/gcc/fixinc/tests/base/stdlib.h b/gcc/fixinc/tests/base/stdlib.h
index 9e43d13270f..857989cb9cb 100644
--- a/gcc/fixinc/tests/base/stdlib.h
+++ b/gcc/fixinc/tests/base/stdlib.h
@@ -16,6 +16,11 @@
#endif /* ARM_WCHAR_CHECK */
+#if defined( HPUX11_ABS_CHECK )
+#if !defined(_MATH_INCLUDED) || defined(__GNUG__)
+#endif /* HPUX11_ABS_CHECK */
+
+
#if defined( INT_ABORT_FREE_AND_EXIT_CHECK )
extern void abort(int);
extern void free(void*);
diff --git a/gcc/fixinc/tests/base/testing.h b/gcc/fixinc/tests/base/testing.h
index d2393adcc4a..fbf45e344f5 100644
--- a/gcc/fixinc/tests/base/testing.h
+++ b/gcc/fixinc/tests/base/testing.h
@@ -71,7 +71,7 @@ extern __ptr_t memcpy __P ((__ptr_t __dest, __const __ptr_t __src,
#if defined( MACHINE_NAME_CHECK )
/* MACH_DIFF: */
-#if defined( __i386__ ) || defined( sparc ) || defined( vax )
+#if defined( i386 ) || defined( sparc ) || defined( vax )
/* no uniform test, so be careful :-) */
#endif /* MACHINE_NAME_CHECK */
diff --git a/gcc/flags.h b/gcc/flags.h
index 4ff7fcf4abf..39ca5ea936e 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -184,6 +184,11 @@ extern int warn_disabled_optimization;
extern int warn_deprecated_decl;
+/* Nonzero means warn about constructs which might not be strict
+ aliasing safe. */
+
+extern int warn_strict_aliasing;
+
/* Nonzero if generating code to do profiling. */
extern int profile_flag;
@@ -426,7 +431,7 @@ extern int flag_schedule_insns_after_reload;
/* The following flags have effect only for scheduling before register
allocation:
- flag_schedule_interblock means schedule insns accross basic blocks.
+ flag_schedule_interblock means schedule insns across basic blocks.
flag_schedule_speculative means allow speculative motion of non-load insns.
flag_schedule_speculative_load means allow speculative motion of some
load insns.
@@ -467,17 +472,6 @@ extern int flag_pedantic_errors;
extern int flag_pic;
-/* Set to the default thread-local storage (tls) model to use. */
-
-enum tls_model {
- TLS_MODEL_GLOBAL_DYNAMIC = 1,
- TLS_MODEL_LOCAL_DYNAMIC,
- TLS_MODEL_INITIAL_EXEC,
- TLS_MODEL_LOCAL_EXEC
-};
-
-extern enum tls_model flag_tls_default;
-
/* Nonzero means generate extra code for exception handling and enable
exception handling. */
@@ -569,19 +563,10 @@ extern int flag_peephole2;
/* Try to guess branch probablities. */
extern int flag_guess_branch_prob;
-/* -fbounded-pointers causes gcc to compile pointers as composite
- objects occupying three words: the pointer value, the base address
- of the referent object, and the address immediately beyond the end
- of the referent object. The base and extent allow us to perform
- runtime bounds checking. -fbounded-pointers implies -fcheck-bounds. */
-extern int flag_bounded_pointers;
-
/* -fcheck-bounds causes gcc to generate array bounds checks.
- For C, C++: defaults to value of flag_bounded_pointers.
- For ObjC: defaults to off.
+ For C, C++ and ObjC: defaults off.
For Java: defaults to on.
- For Fortran: defaults to off.
- For CHILL: defaults to off. */
+ For Fortran: defaults to off. */
extern int flag_bounds_check;
/* This will attempt to merge constant section constants, if 1 only
@@ -627,6 +612,10 @@ extern int align_labels_max_skip;
extern int align_functions;
extern int align_functions_log;
+/* Like align_functions_log above, but used by front-ends to force the
+ minimum function alignment. Zero means no alignment is forced. */
+extern int force_align_functions_log;
+
/* Nonzero if we dump in VCG format, not plain text. */
extern int dump_for_graph;
@@ -657,7 +646,7 @@ extern int flag_gcse_sm;
extern int flag_eliminate_dwarf2_dups;
-/* Non-zero means to collect statistics which might be expensive
+/* Nonzero means to collect statistics which might be expensive
and to print them when we are done. */
extern int flag_detailed_statistics;
diff --git a/gcc/flow.c b/gcc/flow.c
index 3a7326ac5fa..d9e3ae3ce40 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -269,7 +269,7 @@ struct propagate_block_info
/* The length of mem_set_list. */
int mem_set_list_len;
- /* Non-zero if the value of CC0 is live. */
+ /* Nonzero if the value of CC0 is live. */
int cc0_live;
/* Flags controling the set of information propagate_block collects. */
@@ -797,7 +797,7 @@ update_life_info_in_dirty_blocks (extent, prop_flags)
/* Free the variables allocated by find_basic_blocks.
- KEEP_HEAD_END_P is non-zero if basic_block_info is not to be freed. */
+ KEEP_HEAD_END_P is nonzero if basic_block_info is not to be freed. */
void
free_basic_block_vars (keep_head_end_p)
@@ -1085,7 +1085,7 @@ calculate_global_regs_live (blocks_in, blocks_out, flags)
int i;
/* Some passes used to forget clear aux field of basic block causing
- sick behaviour here. */
+ sick behavior here. */
#ifdef ENABLE_CHECKING
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
if (bb->aux)
@@ -2042,7 +2042,7 @@ free_propagate_block_info (pbi)
case, the resulting set will be equal to the union of the two sets that
would otherwise be computed.
- Return non-zero if an INSN is deleted (i.e. by dead code removal). */
+ Return nonzero if an INSN is deleted (i.e. by dead code removal). */
int
propagate_block (bb, live, local_set, cond_local_set, flags)
@@ -2096,7 +2096,7 @@ propagate_block (bb, live, local_set, cond_local_set, flags)
(SET expressions whose destinations are registers dead after the insn).
NEEDED is the regset that says which regs are alive after the insn.
- Unless CALL_OK is non-zero, an insn is needed if it contains a CALL.
+ Unless CALL_OK is nonzero, an insn is needed if it contains a CALL.
If X is the entire body of an insn, NOTES contains the reg notes
pertaining to the insn. */
@@ -2110,6 +2110,10 @@ insn_dead_p (pbi, x, call_ok, notes)
{
enum rtx_code code = GET_CODE (x);
+ /* Don't eliminate insns that may trap. */
+ if (flag_non_call_exceptions && may_trap_p (x))
+ return 0;
+
#ifdef AUTO_INC_DEC
/* As flow is invoked after combine, we must take existing AUTO_INC
expressions into account. */
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index b8da1a74b26..ae6931e3d62 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -178,10 +178,7 @@ decode (words, low, hi)
Return 1 if a signed overflow occurs, 0 otherwise. If OVERFLOW is
nonzero, a signed overflow has already occurred in calculating T, so
- propagate it.
-
- Make the real constant T valid for its type by calling CHECK_FLOAT_VALUE,
- if it exists. */
+ propagate it. */
int
force_fit_type (t, overflow)
@@ -194,10 +191,8 @@ force_fit_type (t, overflow)
if (TREE_CODE (t) == REAL_CST)
{
-#ifdef CHECK_FLOAT_VALUE
- CHECK_FLOAT_VALUE (TYPE_MODE (TREE_TYPE (t)), TREE_REAL_CST (t),
- overflow);
-#endif
+ /* ??? Used to check for overflow here via CHECK_FLOAT_TYPE.
+ Consider doing it via real_convert now. */
return overflow;
}
@@ -654,7 +649,7 @@ div_and_round_double (code, uns,
int num_hi_sig, den_hi_sig;
unsigned HOST_WIDE_INT quo_est, scale;
- /* Find the highest non-zero divisor digit. */
+ /* Find the highest nonzero divisor digit. */
for (i = 4 - 1;; i--)
if (den[i] != 0)
{
@@ -1351,11 +1346,11 @@ size_htab_hash (x)
tree t = (tree) x;
return (TREE_INT_CST_HIGH (t) ^ TREE_INT_CST_LOW (t)
- ^ (hashval_t) ((long) TREE_TYPE (t) >> 3)
+ ^ htab_hash_pointer (TREE_TYPE (t))
^ (TREE_OVERFLOW (t) << 20));
}
-/* Return non-zero if the value represented by *X (an INTEGER_CST tree node)
+/* Return nonzero if the value represented by *X (an INTEGER_CST tree node)
is the same as that given by *Y, which is the same. */
static int
@@ -1786,7 +1781,7 @@ truth_value_p (code)
}
/* Return nonzero if two operands are necessarily equal.
- If ONLY_CONST is non-zero, only return non-zero for constants.
+ If ONLY_CONST is nonzero, only return nonzero for constants.
This function tests whether the operands are indistinguishable;
it does not test whether they are equal using C's == operation.
The distinction is important for IEEE floating point, because
@@ -2020,7 +2015,7 @@ operand_equal_for_comparison_p (arg0, arg1, other)
/* See if ARG is an expression that is either a comparison or is performing
arithmetic on comparisons. The comparisons must only be comparing
two different values, which will be stored in *CVAL1 and *CVAL2; if
- they are non-zero it means that some operands have already been found.
+ they are nonzero it means that some operands have already been found.
No variables may be used anywhere else in the expression except in the
comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
the expression and save_expr needs to be called with CVAL1 and CVAL2.
@@ -2405,7 +2400,7 @@ distribute_bit_expr (code, type, arg0, arg1)
}
/* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
- starting at BITPOS. The field is unsigned if UNSIGNEDP is non-zero. */
+ starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero. */
static tree
make_bit_field_ref (inner, type, bitsize, bitpos, unsignedp)
@@ -2678,7 +2673,7 @@ decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp,
return inner;
}
-/* Return non-zero if MASK represents a mask of SIZE ones in the low-order
+/* Return nonzero if MASK represents a mask of SIZE ones in the low-order
bit positions. */
static int
@@ -3089,9 +3084,10 @@ make_range (exp, pin_p, plow, phigh)
= TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
: TYPE_MAX_VALUE (type);
- high_positive = fold (build (RSHIFT_EXPR, type,
- convert (type, high_positive),
- convert (type, integer_one_node)));
+ if (TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (exp)))
+ high_positive = fold (build (RSHIFT_EXPR, type,
+ convert (type, high_positive),
+ convert (type, integer_one_node)));
/* If the low bound is specified, "and" the range with the
range for which the original unsigned value will be
@@ -4399,7 +4395,7 @@ count_cond (expr, lim)
/* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'. Here
CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
- expression, and ARG to `a'. If COND_FIRST_P is non-zero, then the
+ expression, and ARG to `a'. If COND_FIRST_P is nonzero, then the
COND is the first argument to CODE; otherwise (as in the example
given here), it is the second argument. TYPE is the type of the
original expression. */
@@ -4531,7 +4527,7 @@ fold_binary_op_with_conditional_arg (code, type, cond, arg, cond_first_p)
TYPE, X + ADDEND is the same as X. If NEGATE, return true if X -
ADDEND is the same as X.
- X + 0 and X - 0 both give X when X is NaN, infinite, or non-zero
+ X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
and finite. The problematic cases are when X is zero, and its mode
has signed zeros. In the case of rounding towards -infinity,
X - 0 is not the same as X because 0 - 0 is -0. In other rounding
@@ -5061,6 +5057,18 @@ fold (expr)
}
else if (TREE_CODE (arg0) == ABS_EXPR || TREE_CODE (arg0) == NEGATE_EXPR)
return build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
+ else
+ {
+ /* fabs(sqrt(x)) = sqrt(x) and fabs(exp(x)) = exp(x). */
+ enum built_in_function fcode = builtin_mathfn_code (arg0);
+ if (fcode == BUILT_IN_SQRT
+ || fcode == BUILT_IN_SQRTF
+ || fcode == BUILT_IN_SQRTL
+ || fcode == BUILT_IN_EXP
+ || fcode == BUILT_IN_EXPF
+ || fcode == BUILT_IN_EXPL)
+ t = arg0;
+ }
return t;
case CONJ_EXPR:
@@ -5501,6 +5509,38 @@ fold (expr)
tree arg = save_expr (arg0);
return build (PLUS_EXPR, type, arg, arg);
}
+
+ if (flag_unsafe_math_optimizations)
+ {
+ enum built_in_function fcode0 = builtin_mathfn_code (arg0);
+ enum built_in_function fcode1 = builtin_mathfn_code (arg1);
+
+ /* Optimize sqrt(x)*sqrt(y) as sqrt(x*y). */
+ if ((fcode0 == BUILT_IN_SQRT && fcode1 == BUILT_IN_SQRT)
+ || (fcode0 == BUILT_IN_SQRTF && fcode1 == BUILT_IN_SQRTF)
+ || (fcode0 == BUILT_IN_SQRTL && fcode1 == BUILT_IN_SQRTL))
+ {
+ tree sqrtfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
+ tree arg = build (MULT_EXPR, type,
+ TREE_VALUE (TREE_OPERAND (arg0, 1)),
+ TREE_VALUE (TREE_OPERAND (arg1, 1)));
+ tree arglist = build_tree_list (NULL_TREE, arg);
+ return fold (build_function_call_expr (sqrtfn, arglist));
+ }
+
+ /* Optimize exp(x)*exp(y) as exp(x+y). */
+ if ((fcode0 == BUILT_IN_EXP && fcode1 == BUILT_IN_EXP)
+ || (fcode0 == BUILT_IN_EXPF && fcode1 == BUILT_IN_EXPF)
+ || (fcode0 == BUILT_IN_EXPL && fcode1 == BUILT_IN_EXPL))
+ {
+ tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
+ tree arg = build (PLUS_EXPR, type,
+ TREE_VALUE (TREE_OPERAND (arg0, 1)),
+ TREE_VALUE (TREE_OPERAND (arg1, 1)));
+ tree arglist = build_tree_list (NULL_TREE, arg);
+ return fold (build_function_call_expr (expfn, arglist));
+ }
+ }
}
goto associate;
@@ -5669,6 +5709,23 @@ fold (expr)
TREE_OPERAND (arg1, 0)),
TREE_OPERAND (arg1, 1)));
}
+
+ /* Optimize x/exp(y) into x*exp(-y). */
+ if (flag_unsafe_math_optimizations)
+ {
+ enum built_in_function fcode = builtin_mathfn_code (arg1);
+ if (fcode == BUILT_IN_EXP
+ || fcode == BUILT_IN_EXPF
+ || fcode == BUILT_IN_EXPL)
+ {
+ tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
+ tree arg = build1 (NEGATE_EXPR, type,
+ TREE_VALUE (TREE_OPERAND (arg1, 1)));
+ tree arglist = build_tree_list (NULL_TREE, arg);
+ arg1 = build_function_call_expr (expfn, arglist);
+ return fold (build (MULT_EXPR, type, arg0, arg1));
+ }
+ }
goto binary;
case TRUNC_DIV_EXPR:
@@ -5714,12 +5771,25 @@ fold (expr)
goto binary;
- case LSHIFT_EXPR:
- case RSHIFT_EXPR:
case LROTATE_EXPR:
case RROTATE_EXPR:
+ if (integer_all_onesp (arg0))
+ return omit_one_operand (type, arg0, arg1);
+ goto shift;
+
+ case RSHIFT_EXPR:
+ /* Optimize -1 >> x for arithmetic right shifts. */
+ if (integer_all_onesp (arg0) && ! TREE_UNSIGNED (type))
+ return omit_one_operand (type, arg0, arg1);
+ /* ... fall through ... */
+
+ case LSHIFT_EXPR:
+ shift:
if (integer_zerop (arg1))
return non_lvalue (convert (type, arg0));
+ if (integer_zerop (arg0))
+ return omit_one_operand (type, arg0, arg1);
+
/* Since negative shift count is not well-defined,
don't try to compute it in the compiler. */
if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
diff --git a/gcc/function.c b/gcc/function.c
index 5d5300192fe..ffdac2a4278 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -181,13 +181,13 @@ struct temp_slot GTY(())
tree type;
/* The value of `sequence_rtl_expr' when this temporary is allocated. */
tree rtl_expr;
- /* Non-zero if this temporary is currently in use. */
+ /* Nonzero if this temporary is currently in use. */
char in_use;
- /* Non-zero if this temporary has its address taken. */
+ /* Nonzero if this temporary has its address taken. */
char addr_taken;
/* Nesting level at which this slot is being used. */
int level;
- /* Non-zero if this should survive a call to free_temp_slots. */
+ /* Nonzero if this should survive a call to free_temp_slots. */
int keep;
/* The offset of the slot from the frame_pointer, including extra space
for alignment. This info is for combine_temp_slots. */
@@ -255,10 +255,8 @@ static int instantiate_virtual_regs_1 PARAMS ((rtx *, rtx, int));
static void delete_handlers PARAMS ((void));
static void pad_to_arg_alignment PARAMS ((struct args_size *, int,
struct args_size *));
-#ifndef ARGS_GROW_DOWNWARD
static void pad_below PARAMS ((struct args_size *, enum machine_mode,
tree));
-#endif
static rtx round_trampoline_addr PARAMS ((rtx));
static rtx adjust_trampoline_addr PARAMS ((rtx));
static tree *identify_blocks_1 PARAMS ((rtx, tree *, tree *, tree *));
@@ -800,7 +798,8 @@ assign_stack_temp_for_type (mode, size, keep, type)
/* If a type is specified, set the relevant flags. */
if (type != 0)
{
- RTX_UNCHANGING_P (slot) = TYPE_READONLY (type);
+ RTX_UNCHANGING_P (slot) = (lang_hooks.honor_readonly
+ && TYPE_READONLY (type));
MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
MEM_SET_IN_STRUCT_P (slot, AGGREGATE_TYPE_P (type));
}
@@ -1253,46 +1252,6 @@ push_temp_slots ()
temp_slot_level++;
}
-/* Likewise, but save the new level as the place to allocate variables
- for blocks. */
-
-#if 0
-void
-push_temp_slots_for_block ()
-{
- push_temp_slots ();
-
- var_temp_slot_level = temp_slot_level;
-}
-
-/* Likewise, but save the new level as the place to allocate temporaries
- for TARGET_EXPRs. */
-
-void
-push_temp_slots_for_target ()
-{
- push_temp_slots ();
-
- target_temp_slot_level = temp_slot_level;
-}
-
-/* Set and get the value of target_temp_slot_level. The only
- permitted use of these functions is to save and restore this value. */
-
-int
-get_target_temp_slot_level ()
-{
- return target_temp_slot_level;
-}
-
-void
-set_target_temp_slot_level (level)
- int level;
-{
- target_temp_slot_level = level;
-}
-#endif
-
/* Pop a temporary nesting level. All slots in use in the current level
are freed. */
@@ -3283,10 +3242,10 @@ insns_for_mem_hash (k)
{
/* Use the address of the key for the hash value. */
struct insns_for_mem_entry *m = (struct insns_for_mem_entry *) k;
- return (hashval_t) m->key;
+ return htab_hash_pointer (m->key);
}
-/* Return non-zero if K1 and K2 (two REGs) are the same. */
+/* Return nonzero if K1 and K2 (two REGs) are the same. */
static int
insns_for_mem_comp (k1, k2)
@@ -3642,7 +3601,7 @@ instantiate_decls_1 (let, valid_only)
/* Subroutine of the preceding procedures: Given RTL representing a
decl and the size of the object, do any instantiation required.
- If VALID_ONLY is non-zero, it means that the RTL should only be
+ If VALID_ONLY is nonzero, it means that the RTL should only be
changed if the new address is valid. */
static void
@@ -4182,12 +4141,6 @@ delete_handlers ()
}
}
-int
-max_parm_reg_num ()
-{
- return max_parm_reg;
-}
-
/* Return the first insn following those generated by `assign_parms'. */
rtx
@@ -4198,24 +4151,6 @@ get_first_nonparm_insn ()
return get_insns ();
}
-/* Return the first NOTE_INSN_BLOCK_BEG note in the function.
- Crash if there is none. */
-
-rtx
-get_first_block_beg ()
-{
- rtx searcher;
- rtx insn = get_first_nonparm_insn ();
-
- for (searcher = insn; searcher; searcher = NEXT_INSN (searcher))
- if (GET_CODE (searcher) == NOTE
- && NOTE_LINE_NUMBER (searcher) == NOTE_INSN_BLOCK_BEG)
- return searcher;
-
- abort (); /* Invalid call to this function. (See comments above.) */
- return NULL_RTX;
-}
-
/* Return 1 if EXP is an aggregate type (or a value with aggregate type).
This means a type for which function calls must pass an address to the
function or get an address back from the function.
@@ -5206,7 +5141,7 @@ promoted_input_arg (regno, pmode, punsignedp)
The starting offset and size for this parm are returned in *OFFSET_PTR
and *ARG_SIZE_PTR, respectively.
- IN_REGS is non-zero if the argument will be passed in registers. It will
+ IN_REGS is nonzero if the argument will be passed in registers. It will
never be set if REG_PARM_STACK_SPACE is not defined.
FNDECL is the function in which the argument was defined.
@@ -5244,6 +5179,9 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
= type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
enum direction where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
int boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
+#ifdef ARGS_GROW_DOWNWARD
+ tree s2 = sizetree;
+#endif
#ifdef REG_PARM_STACK_SPACE
/* If we have found a stack parm before we reach the end of the
@@ -5289,13 +5227,20 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
offset_ptr->constant = -initial_offset_ptr->constant;
offset_ptr->var = 0;
}
+
if (where_pad != none
&& (!host_integerp (sizetree, 1)
|| (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
- sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
- SUB_PARM_SIZE (*offset_ptr, sizetree);
- if (where_pad != downward)
+ s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
+ SUB_PARM_SIZE (*offset_ptr, s2);
+
+ if (!in_regs
+#ifdef REG_PARM_STACK_SPACE
+ || REG_PARM_STACK_SPACE (fndecl) > 0
+#endif
+ )
pad_to_arg_alignment (offset_ptr, boundary, alignment_pad);
+
if (initial_offset_ptr->var)
arg_size_ptr->var = size_binop (MINUS_EXPR,
size_binop (MINUS_EXPR,
@@ -5307,6 +5252,13 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
arg_size_ptr->constant = (-initial_offset_ptr->constant
- offset_ptr->constant);
+ /* Pad_below needs the pre-rounded size to know how much to pad below.
+ We only pad parameters which are not in registers as they have their
+ padding done elsewhere. */
+ if (where_pad == downward
+ && !in_regs)
+ pad_below (offset_ptr, passed_mode, sizetree);
+
#else /* !ARGS_GROW_DOWNWARD */
if (!in_regs
#ifdef REG_PARM_STACK_SPACE
@@ -5392,7 +5344,6 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
}
}
-#ifndef ARGS_GROW_DOWNWARD
static void
pad_below (offset_ptr, passed_mode, sizetree)
struct args_size *offset_ptr;
@@ -5420,7 +5371,6 @@ pad_below (offset_ptr, passed_mode, sizetree)
}
}
}
-#endif
/* Walk the tree of blocks describing the binding levels within a function
and warn about uninitialized variables.
@@ -6278,10 +6228,10 @@ prepare_function_start ()
cfun->arc_profile = profile_arc_flag || flag_test_coverage;
- cfun->arc_profile = profile_arc_flag || flag_test_coverage;
-
cfun->function_frequency = FUNCTION_FREQUENCY_NORMAL;
+ cfun->max_jumptable_ents = 0;
+
(*lang_hooks.function.init) (cfun);
if (init_machine_status)
cfun->machine = (*init_machine_status) ();
@@ -6807,7 +6757,7 @@ expand_function_end (filename, line, end_bindings)
#ifdef TRAMPOLINE_TEMPLATE
blktramp = replace_equiv_address (initial_trampoline, tramp);
emit_block_move (blktramp, initial_trampoline,
- GEN_INT (TRAMPOLINE_SIZE));
+ GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
#endif
INITIALIZE_TRAMPOLINE (tramp, XEXP (DECL_RTL (function), 0), context);
seq = get_insns ();
@@ -7183,10 +7133,7 @@ emit_return_into_block (bb, line_note)
basic_block bb;
rtx line_note;
{
- rtx p, end;
-
- p = NEXT_INSN (bb->end);
- end = emit_jump_insn_after (gen_return (), bb->end);
+ emit_jump_insn_after (gen_return (), bb->end);
if (line_note)
emit_line_note_after (NOTE_SOURCE_FILE (line_note),
NOTE_LINE_NUMBER (line_note), PREV_INSN (bb->end));
@@ -7745,7 +7692,7 @@ epilogue_done:
note before the end of the first basic block, if there isn't
one already there.
- ??? This behaviour is completely broken when dealing with
+ ??? This behavior is completely broken when dealing with
multiple entry functions. We simply place the note always
into first basic block and let alternate entry points
to be missed.
@@ -7842,8 +7789,6 @@ reposition_prologue_and_epilogue_notes (f)
if (last)
{
- rtx next;
-
/* Find the prologue-end note if we haven't already, and
move it to just after the last prologue insn. */
if (note == 0)
@@ -7854,8 +7799,6 @@ reposition_prologue_and_epilogue_notes (f)
break;
}
- next = NEXT_INSN (note);
-
/* Avoid placing note between CODE_LABEL and BASIC_BLOCK note. */
if (GET_CODE (last) == CODE_LABEL)
last = NEXT_INSN (last);
diff --git a/gcc/function.h b/gcc/function.h
index 0ee31d1ed53..11c781750da 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -138,7 +138,7 @@ struct expr_status GTY(())
since code outside the conditional won't know whether or not the
arguments need to be popped.)
- When INHIBIT_DEFER_POP is non-zero, however, the compiler does not
+ When INHIBIT_DEFER_POP is nonzero, however, the compiler does not
attempt to defer pops. Instead, the stack is popped immediately
after each call. Rather then setting this variable directly, use
NO_DEFER_POP and OK_DEFER_POP. */
@@ -222,7 +222,7 @@ struct function GTY(())
used for the current function's args. */
CUMULATIVE_ARGS args_info;
- /* If non-zero, an RTL expression for the location at which the current
+ /* If nonzero, an RTL expression for the location at which the current
function returns its result. If the current function returns its
result in a register, current_function_return_rtx will always be
the hard register containing the result. */
@@ -437,6 +437,13 @@ struct function GTY(())
we should try to cut corners where we can. */
unsigned int is_thunk : 1;
+ /* This bit is used by the exception handling logic. It is set if all
+ calls (if any) are sibling calls. Such functions do not have to
+ have EH tables generated, as they cannot throw. A call to such a
+ function, however, should be treated as throwing if any of its callees
+ can throw. */
+ unsigned int all_throwers_are_sibcalls : 1;
+
/* Nonzero if instrumentation calls for function entry and exit should be
generated. */
unsigned int instrument_entry_exit : 1;
@@ -493,6 +500,10 @@ struct function GTY(())
(set only when profile feedback is available). */
FUNCTION_FREQUENCY_HOT
} function_frequency;
+
+ /* Maximal number of entities in the single jumptable. Used to estimate
+ final flowgraph size. */
+ int max_jumptable_ents;
};
/* The function currently being compiled. */
@@ -594,8 +605,6 @@ extern void free_after_compilation PARAMS ((struct function *));
extern void init_varasm_status PARAMS ((struct function *));
-extern rtx get_first_block_beg PARAMS ((void));
-
#ifdef RTX_CODE
extern void diddle_return_value PARAMS ((void (*)(rtx, void*), void*));
extern void clobber_return_register PARAMS ((void));
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 3bff09a5bf6..6a5a5a0785e 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -162,6 +162,11 @@ static const char *print_prog_name = NULL;
static int print_multi_directory;
+/* Flag saying to print the relative path we'd use to
+ find OS libraries given the current compiler flags. */
+
+static int print_multi_os_directory;
+
/* Flag saying to print the list of subdirectories and
compiler flags used to select them in a standard form. */
@@ -192,11 +197,21 @@ static int target_help_flag;
static int report_times;
+/* Nonzero means place this string before uses of /, so that include
+ and library files can be found in an alternate location. */
+
+static const char *target_system_root = TARGET_SYSTEM_ROOT;
+
/* Nonzero means write "temp" files in source directory
and use the source file's name in them, and don't delete them. */
static int save_temps_flag;
+/* Nonzero means use pipes to communicate between subprocesses.
+ Overridden by either of the above two flags. */
+
+static int use_pipes;
+
/* The compiler version. */
static const char *compiler_version;
@@ -234,7 +249,7 @@ modify_target[] = MODIFY_TARGET_NAME;
#endif
/* The number of errors that have occurred; the link phase will not be
- run if this is non-zero. */
+ run if this is nonzero. */
static int error_count = 0;
/* Greatest exit code of sub-processes that has been encountered up to
@@ -275,9 +290,12 @@ static struct compiler *lookup_compiler PARAMS ((const char *, size_t, const cha
static char *build_search_list PARAMS ((struct path_prefix *, const char *, int));
static void putenv_from_prefixes PARAMS ((struct path_prefix *, const char *));
static int access_check PARAMS ((const char *, int));
-static char *find_a_file PARAMS ((struct path_prefix *, const char *, int));
+static char *find_a_file PARAMS ((struct path_prefix *, const char *,
+ int, int));
static void add_prefix PARAMS ((struct path_prefix *, const char *,
- const char *, int, int, int *));
+ const char *, int, int, int *, int));
+static void add_sysrooted_prefix PARAMS ((struct path_prefix *, const char *,
+ const char *, int, int, int *, int));
static void translate_options PARAMS ((int *, const char *const **));
static char *skip_whitespace PARAMS ((char *));
static void delete_if_ordinary PARAMS ((const char *));
@@ -286,15 +304,26 @@ static void delete_failure_queue PARAMS ((void));
static void clear_failure_queue PARAMS ((void));
static int check_live_switch PARAMS ((int, int));
static const char *handle_braces PARAMS ((const char *));
+static inline bool input_suffix_matches PARAMS ((const char *,
+ const char *));
+static inline bool switch_matches PARAMS ((const char *,
+ const char *, int));
+static inline void mark_matching_switches PARAMS ((const char *,
+ const char *, int));
+static inline void process_marked_switches PARAMS ((void));
+static const char *process_brace_body PARAMS ((const char *, const char *,
+ const char *, int, int));
static char *save_string PARAMS ((const char *, int));
static void set_collect_gcc_options PARAMS ((void));
static int do_spec_1 PARAMS ((const char *, int, const char *));
static int do_spec_2 PARAMS ((const char *));
+static void do_self_spec PARAMS ((const char *));
static const char *find_file PARAMS ((const char *));
static int is_directory PARAMS ((const char *, const char *, int));
-static void validate_switches PARAMS ((const char *));
+static const char *validate_switches PARAMS ((const char *));
static void validate_all_switches PARAMS ((void));
-static void give_switch PARAMS ((int, int, int));
+static inline void validate_switches_from_spec PARAMS ((const char *));
+static void give_switch PARAMS ((int, int));
static int used_arg PARAMS ((const char *, int));
static int default_arg PARAMS ((const char *, int));
static void set_multilib_dir PARAMS ((void));
@@ -354,6 +383,12 @@ or with constant text in a single argument.
with a file name chosen once per compilation, without regard
to any appended suffix (which was therefore treated just like
ordinary text), making such attacks more likely to succeed.
+ %|SUFFIX
+ like %g, but if -pipe is in effect, expands simply to "-".
+ %mSUFFIX
+ like %g, but if -pipe is in effect, expands to nothing. (We have both
+ %| and %m to accommodate differences between system assemblers; see
+ the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
%uSUFFIX
like %g, but generates a new temporary file name even if %uSUFFIX
was already seen.
@@ -439,10 +474,15 @@ or with constant text in a single argument.
%C process CPP_SPEC as a spec.
%1 process CC1_SPEC as a spec.
%2 process CC1PLUS_SPEC as a spec.
- %| output "-" if the input for the current command is coming from a pipe.
%* substitute the variable part of a matched option. (See below.)
Note that each comma in the substituted string is replaced by
a single space.
+ %<S remove all occurrences of -S from the command line.
+ Note - this command is position dependent. % commands in the
+ spec string before this one will see -S, % commands in the
+ spec string after this one will not.
+ %<S* remove all occurrences of all switches beginning with -S from the
+ command line.
%{S} substitutes the -S switch, if that switch was given to CC.
If that switch was not specified, this substitutes nothing.
Here S is a metasyntactic variable.
@@ -451,33 +491,40 @@ or with constant text in a single argument.
arguments. CC considers `-o foo' as being one switch whose
name starts with `o'. %{o*} would substitute this text,
including the space; thus, two arguments would be generated.
- %{^S*} likewise, but don't put a blank between a switch and any args.
%{S*&T*} likewise, but preserve order of S and T options (the order
of S and T in the spec is not significant). Can be any number
of ampersand-separated variables; for each the wild card is
optional. Useful for CPP as %{D*&U*&A*}.
- %{S*:X} substitutes X if one or more switches whose names start with -S are
- specified to CC. Note that the tail part of the -S option
- (i.e. the part matched by the `*') will be substituted for each
- occurrence of %* within X.
- %{<S} remove all occurrences of -S from the command line.
- Note - this option is position dependent. % commands in the
- spec string before this option will see -S, % commands in the
- spec string after this option will not.
- %{S:X} substitutes X, but only if the -S switch was given to CC.
- %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
- %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
- %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
- %{.S:X} substitutes X, but only if processing a file with suffix S.
- %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
- %{S|P:X} substitutes X if either -S or -P was given to CC. This may be
- combined with ! and . as above binding stronger than the OR.
+
+ %{S:X} substitutes X, if the -S switch was given to CC.
+ %{!S:X} substitutes X, if the -S switch was NOT given to CC.
+ %{S*:X} substitutes X if one or more switches whose names start
+ with -S was given to CC. Normally X is substituted only
+ once, no matter how many such switches appeared. However,
+ if %* appears somewhere in X, then X will be substituted
+ once for each matching switch, with the %* replaced by the
+ part of that switch that matched the '*'.
+ %{.S:X} substitutes X, if processing a file with suffix S.
+ %{!.S:X} substitutes X, if NOT processing a file with suffix S.
+
+ %{S|T:X} substitutes X if either -S or -T was given to CC. This may be
+ combined with !, ., and * as above binding stronger than the OR.
+ If %* appears in X, all of the alternatives must be starred, and
+ only the first matching alternative is substituted.
+ %{S:X; if S was given to CC, substitutes X;
+ T:Y; else if T was given to CC, substitutes Y;
+ :D} else substitutes D. There can be as many clauses as you need.
+ This may be combined with ., !, |, and * as above.
+
%(Spec) processes a specification defined in a specs file as *Spec:
%[Spec] as above, but put __ around -D arguments
-The conditional text X in a %{S:X} or %{!S:X} construct may contain
+The conditional text X in a %{S:X} or similar construct may contain
other nested % constructs or spaces, or even newlines. They are
-processed as usual, as described above.
+processed as usual, as described above. Trailing white space in X is
+ignored. White space may also appear anywhere on the left side of the
+colon in these constructs, except between . or * and the corresponding
+word.
The -O, -f, -m, and -W switches are handled specifically in these
constructs. If another value of -O or the negated form of a -f, -m, or
@@ -667,13 +714,16 @@ static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
static const char *trad_capable_cpp =
"cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
+/* We don't wrap .d files in %W{} since a missing .d file, and
+ therefore no dependency entry, confuses make into thinking a .o
+ file that happens to exist is up-to-date. */
static const char *cpp_unique_options =
"%{C:%{!E:%eGNU C does not support -C without using -E}}\
%{CC:%{!E:%eGNU C does not support -CC without using -E}}\
%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I\
- %{MD:-MD %W{!o: %b.d}%W{o*:%.d%*}}\
- %{MMD:-MMD %W{!o: %b.d}%W{o*:%.d%*}}\
- %{M} %{MM} %W{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
+ %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
+ %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
+ %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
%{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}}\
%{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
%{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
@@ -686,7 +736,7 @@ static const char *cpp_unique_options =
options used to set target flags. Those special target flags settings may
in turn cause preprocessor symbols to be defined specially. */
static const char *cpp_options =
-"%(cpp_unique_options) %1 %{std*} %{W*&pedantic*} %{w} %{m*} %{f*}\
+"%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*}\
%{O*} %{undef}";
/* This contains cpp options which are not passed when the preprocessor
@@ -697,7 +747,7 @@ static const char *cpp_debug_options = "%{d*}";
static const char *cc1_options =
"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*}\
- -auxbase%{c|S:%{o*:-strip%*}%{!o*: %b}}%{!c:%{!S: %b}}\
+ -auxbase%{c|S:%{o*:-strip %*}%{!o*: %b}}%{!c:%{!S: %b}}\
%{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi}\
%{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
%{Qn:-fno-ident} %{--help:--help}\
@@ -709,7 +759,11 @@ static const char *asm_options =
"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
static const char *invoke_as =
-"%{!S:-o %{|!pipe:%g.s} |\n as %(asm_options) %{!pipe:%g.s} %A }";
+#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
+"%{!S:-o %|.s |\n as %(asm_options) %|.s %A }";
+#else
+"%{!S:-o %|.s |\n as %(asm_options) %m.s %A }";
+#endif
/* Some compilers have limits on line lengths, and the multilib_select
and/or multilib_matches strings can be very long, so we build them at
@@ -729,6 +783,12 @@ static const char *multilib_exclusions;
static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
+#ifndef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS ""
+#endif
+
+static const char *const driver_self_specs[] = { DRIVER_SELF_SPECS };
+
struct user_specs
{
struct user_specs *next;
@@ -841,7 +901,7 @@ static const struct compiler default_compilers[] =
%{!fsyntax-only:%(invoke_as)}}}}", 0},
{"-",
"%{!E:%e-E required when input is from standard input}\
- %(trad_capable_cpp) %(cpp_options)", 0},
+ %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0},
{".h", "@c-header", 0},
{"@c-header",
"%{!E:%ecompilation of header file requested} \
@@ -855,10 +915,19 @@ static const struct compiler default_compilers[] =
"%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0},
{".S", "@assembler-with-cpp", 0},
{"@assembler-with-cpp",
+#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
+ "%(trad_capable_cpp) -lang-asm %(cpp_options)\
+ %{E|M|MM:%(cpp_debug_options)}\
+ %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
+ as %(asm_debug) %(asm_options) %|.s %A }}}}"
+#else
"%(trad_capable_cpp) -lang-asm %(cpp_options)\
%{E|M|MM:%(cpp_debug_options)}\
- %{!M:%{!MM:%{!E:%{!S:-o %{|!pipe:%g.s} |\n\
- as %(asm_debug) %(asm_options) %{!pipe:%g.s} %A }}}}", 0},
+ %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
+ as %(asm_debug) %(asm_options) %m.s %A }}}}"
+#endif
+ , 0},
+
#include "specs.h"
/* Mark end of table */
{0, 0, 0}
@@ -961,6 +1030,7 @@ static const struct option_map option_map[] =
{"--print-missing-file-dependencies", "-MG", 0},
{"--print-multi-lib", "-print-multi-lib", 0},
{"--print-multi-directory", "-print-multi-directory", 0},
+ {"--print-multi-os-directory", "-print-multi-os-directory", 0},
{"--print-prog-name", "-print-prog-name=", "aj"},
{"--profile", "-p", 0},
{"--profile-blocks", "-a", 0},
@@ -1246,7 +1316,9 @@ struct prefix_list
int require_machine_suffix; /* Don't use without machine_suffix. */
/* 2 means try both machine_suffix and just_machine_suffix. */
int *used_flag_ptr; /* 1 if a file was found with this prefix. */
- int priority; /* Sort key - priority within list */
+ int priority; /* Sort key - priority within list. */
+ int os_multilib; /* 1 if OS multilib scheme should be used,
+ 0 for GCC multilib scheme. */
};
struct path_prefix
@@ -1335,6 +1407,11 @@ static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
set_multilib_dir based on the compilation options. */
static const char *multilib_dir;
+
+/* Subdirectory to use for locating libraries in OS conventions. Set by
+ set_multilib_dir based on the compilation options. */
+
+static const char *multilib_os_dir;
/* Structure to keep track of the specs that have been defined so far.
These are accessed using %(specname) or %[specname] in a compiler
@@ -1389,6 +1466,7 @@ static struct spec_list static_specs[] =
INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
+ INIT_STATIC_SPEC ("multilib_options", &multilib_options),
INIT_STATIC_SPEC ("linker", &linker_name_spec),
INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
@@ -1531,6 +1609,9 @@ init_spec ()
#else
"-lgcc_s%M"
#endif
+#ifdef USE_LIBUNWIND_EXCEPTIONS
+ " -lunwind"
+#endif
,
"-lgcc",
"-lgcc_eh");
@@ -1836,7 +1917,7 @@ read_specs (filename, main_p)
(long) (p1 - buffer + 1));
p[-2] = '\0';
- new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
+ new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
read_specs (new_filename ? new_filename : p1, FALSE);
continue;
}
@@ -1855,7 +1936,7 @@ read_specs (filename, main_p)
(long) (p1 - buffer + 1));
p[-2] = '\0';
- new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
+ new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
if (new_filename)
read_specs (new_filename, FALSE);
else if (verbose_flag)
@@ -2151,7 +2232,7 @@ clear_failure_queue ()
/* Build a list of search directories from PATHS.
PREFIX is a string to prepend to the list.
- If CHECK_DIR_P is non-zero we ensure the directory exists.
+ If CHECK_DIR_P is nonzero we ensure the directory exists.
This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
It is also used by the --print-search-dirs flag. */
@@ -2330,7 +2411,7 @@ make_relative_prefix (progname, bin_prefix, prefix)
const char *prefix;
{
char **prog_dirs, **bin_dirs, **prefix_dirs;
- int prog_num, bin_num, prefix_num, std_loc_p;
+ int prog_num, bin_num, prefix_num;
int i, n, common;
prog_dirs = split_directories (progname, &prog_num);
@@ -2403,7 +2484,6 @@ make_relative_prefix (progname, bin_prefix, prefix)
/* Determine if the compiler is installed in the standard location, and if
so, we don't need to specify relative directories. Also, if argv[0]
doesn't contain any directory specifiers, there is not much we can do. */
- std_loc_p = 0;
if (prog_num == bin_num)
{
for (i = 0; i < bin_num; i++)
@@ -2414,7 +2494,6 @@ make_relative_prefix (progname, bin_prefix, prefix)
if (prog_num <= 0 || i == bin_num)
{
- std_loc_p = 1;
free_split_directories (prog_dirs);
free_split_directories (bin_dirs);
prog_dirs = bin_dirs = (char **) 0;
@@ -2490,16 +2569,17 @@ access_check (name, mode)
Return 0 if not found, otherwise return its name, allocated with malloc. */
static char *
-find_a_file (pprefix, name, mode)
+find_a_file (pprefix, name, mode, multilib)
struct path_prefix *pprefix;
const char *name;
- int mode;
+ int mode, multilib;
{
char *temp;
const char *const file_suffix =
((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
struct prefix_list *pl;
int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
+ const char *multilib_name, *multilib_os_name;
#ifdef DEFAULT_ASSEMBLER
if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
@@ -2514,6 +2594,22 @@ find_a_file (pprefix, name, mode)
if (machine_suffix)
len += strlen (machine_suffix);
+ multilib_name = name;
+ multilib_os_name = name;
+ if (multilib && multilib_os_dir)
+ {
+ int len1 = multilib_dir ? strlen (multilib_dir) + 1 : 0;
+ int len2 = strlen (multilib_os_dir) + 1;
+
+ len += len1 > len2 ? len1 : len2;
+ if (multilib_dir)
+ multilib_name = ACONCAT ((multilib_dir, dir_separator_str, name,
+ NULL));
+ if (strcmp (multilib_os_dir, ".") != 0)
+ multilib_os_name = ACONCAT ((multilib_os_dir, dir_separator_str, name,
+ NULL));
+ }
+
temp = xmalloc (len);
/* Determine the filename to execute (special case for absolute paths). */
@@ -2529,6 +2625,9 @@ find_a_file (pprefix, name, mode)
else
for (pl = pprefix->plist; pl; pl = pl->next)
{
+ const char *this_name
+ = pl->os_multilib ? multilib_os_name : multilib_name;
+
if (machine_suffix)
{
/* Some systems have a suffix for executable files.
@@ -2537,7 +2636,7 @@ find_a_file (pprefix, name, mode)
{
strcpy (temp, pl->prefix);
strcat (temp, machine_suffix);
- strcat (temp, name);
+ strcat (temp, multilib_name);
strcat (temp, file_suffix);
if (access_check (temp, mode) == 0)
{
@@ -2547,10 +2646,10 @@ find_a_file (pprefix, name, mode)
}
}
- /* Now try just the name. */
+ /* Now try just the multilib_name. */
strcpy (temp, pl->prefix);
strcat (temp, machine_suffix);
- strcat (temp, name);
+ strcat (temp, multilib_name);
if (access_check (temp, mode) == 0)
{
if (pl->used_flag_ptr != 0)
@@ -2569,7 +2668,7 @@ find_a_file (pprefix, name, mode)
{
strcpy (temp, pl->prefix);
strcat (temp, just_machine_suffix);
- strcat (temp, name);
+ strcat (temp, multilib_name);
strcat (temp, file_suffix);
if (access_check (temp, mode) == 0)
{
@@ -2581,7 +2680,7 @@ find_a_file (pprefix, name, mode)
strcpy (temp, pl->prefix);
strcat (temp, just_machine_suffix);
- strcat (temp, name);
+ strcat (temp, multilib_name);
if (access_check (temp, mode) == 0)
{
if (pl->used_flag_ptr != 0)
@@ -2599,7 +2698,7 @@ find_a_file (pprefix, name, mode)
if (file_suffix[0] != 0)
{
strcpy (temp, pl->prefix);
- strcat (temp, name);
+ strcat (temp, this_name);
strcat (temp, file_suffix);
if (access_check (temp, mode) == 0)
{
@@ -2610,7 +2709,7 @@ find_a_file (pprefix, name, mode)
}
strcpy (temp, pl->prefix);
- strcat (temp, name);
+ strcat (temp, this_name);
if (access_check (temp, mode) == 0)
{
if (pl->used_flag_ptr != 0)
@@ -2648,13 +2747,15 @@ enum path_prefix_priority
2 means try both machine_suffix and just_machine_suffix. */
static void
-add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
+add_prefix (pprefix, prefix, component, priority, require_machine_suffix,
+ warn, os_multilib)
struct path_prefix *pprefix;
const char *prefix;
const char *component;
/* enum prefix_priority */ int priority;
int require_machine_suffix;
int *warn;
+ int os_multilib;
{
struct prefix_list *pl, **prev;
int len;
@@ -2676,6 +2777,7 @@ add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
pl->require_machine_suffix = require_machine_suffix;
pl->used_flag_ptr = warn;
pl->priority = priority;
+ pl->os_multilib = os_multilib;
if (warn)
*warn = 0;
@@ -2683,6 +2785,33 @@ add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
pl->next = (*prev);
(*prev) = pl;
}
+
+/* Same as add_prefix, but prepending target_system_root to prefix. */
+static void
+add_sysrooted_prefix (pprefix, prefix, component, priority,
+ require_machine_suffix, warn, os_multilib)
+ struct path_prefix *pprefix;
+ const char *prefix;
+ const char *component;
+ /* enum prefix_priority */ int priority;
+ int require_machine_suffix;
+ int *warn;
+ int os_multilib;
+{
+ if (!IS_ABSOLUTE_PATHNAME (prefix))
+ abort ();
+
+ if (target_system_root)
+ {
+ prefix = concat (target_system_root, prefix, NULL);
+ /* We have to override this because GCC's notion of sysroot
+ moves along with GCC. */
+ component = "GCC";
+ }
+
+ add_prefix (pprefix, prefix, component, priority,
+ require_machine_suffix, warn, os_multilib);
+}
/* Execute the command specified by the arguments on the current line of spec.
When using pipes, this includes several piped-together commands
@@ -2719,7 +2848,7 @@ execute ()
commands[0].prog = argbuf[0]; /* first command. */
commands[0].argv = &argbuf[0];
- string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
+ string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, 0);
if (string)
commands[0].argv[0] = string;
@@ -2733,7 +2862,8 @@ execute ()
argbuf[i] = 0; /* termination of command args. */
commands[n_commands].prog = argbuf[i + 1];
commands[n_commands].argv = &argbuf[i + 1];
- string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
+ string = find_a_file (&exec_prefixes, commands[n_commands].prog,
+ X_OK, 0);
if (string)
commands[n_commands].argv[0] = string;
n_commands++;
@@ -2886,7 +3016,7 @@ Internal error: %s (program %s)\n\
Please submit a full bug report.\n\
See %s for instructions.",
strsignal (WTERMSIG (status)), commands[j].prog,
- GCCBUGURL);
+ bug_report_url);
signal_count++;
ret_code = -1;
}
@@ -2918,7 +3048,7 @@ See %s for instructions.",
0 when initialized
1 if the switch is true in a conditional spec,
-1 if false (overridden by a later switch)
- -2 if this switch should be ignored (used in %{<S})
+ -2 if this switch should be ignored (used in %<S)
The `validated' field is nonzero if any spec has looked at this switch;
if it remains zero at the end of the run, it must be meaningless. */
@@ -3048,6 +3178,7 @@ display_help ()
fputs (_("\
-print-multi-lib Display the mapping between command line options and\n\
multiple library search directories\n"), stdout);
+ fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
@@ -3264,9 +3395,9 @@ process_command (argc, argv)
set_std_prefix (gcc_exec_prefix, len);
add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, NULL);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, NULL);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
}
/* COMPILER_PATH and LIBRARY_PATH have values
@@ -3294,10 +3425,10 @@ process_command (argc, argv)
else
nstore[endp - startp] = 0;
add_prefix (&exec_prefixes, nstore, 0,
- PREFIX_PRIORITY_LAST, 0, NULL);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&include_prefixes,
concat (nstore, "include", NULL),
- 0, PREFIX_PRIORITY_LAST, 0, NULL);
+ 0, PREFIX_PRIORITY_LAST, 0, NULL, 0);
if (*endp == 0)
break;
endp = startp = endp + 1;
@@ -3329,7 +3460,7 @@ process_command (argc, argv)
else
nstore[endp - startp] = 0;
add_prefix (&startfile_prefixes, nstore, NULL,
- PREFIX_PRIORITY_LAST, 0, NULL);
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*endp == 0)
break;
endp = startp = endp + 1;
@@ -3362,7 +3493,7 @@ process_command (argc, argv)
else
nstore[endp - startp] = 0;
add_prefix (&startfile_prefixes, nstore, NULL,
- PREFIX_PRIORITY_LAST, 0, NULL);
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*endp == 0)
break;
endp = startp = endp + 1;
@@ -3462,6 +3593,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
print_multi_lib = 1;
else if (! strcmp (argv[i], "-print-multi-directory"))
print_multi_directory = 1;
+ else if (! strcmp (argv[i], "-print-multi-os-directory"))
+ print_multi_os_directory = 1;
else if (! strncmp (argv[i], "-Wa,", 4))
{
int prev, j;
@@ -3561,6 +3694,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
}
else if (strcmp (argv[i], "-time") == 0)
report_times = 1;
+ else if (strcmp (argv[i], "-pipe") == 0)
+ {
+ /* -pipe has to go into the switches array as well as
+ setting a flag. */
+ use_pipes = 1;
+ n_switches++;
+ }
else if (strcmp (argv[i], "-###") == 0)
{
/* This is similar to -v except that there is no execution
@@ -3624,7 +3764,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
{
if (len == 7)
add_prefix (&include_prefixes, "include", NULL,
- PREFIX_PRIORITY_B_OPT, 0, NULL);
+ PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
else
{
char * string = xmalloc (len + 1);
@@ -3632,16 +3772,16 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
strncpy (string, value, len - 7);
strcpy (string + len - 7, "include");
add_prefix (&include_prefixes, string, NULL,
- PREFIX_PRIORITY_B_OPT, 0, NULL);
+ PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
}
}
add_prefix (&exec_prefixes, value, NULL,
- PREFIX_PRIORITY_B_OPT, 0, &warn_B);
+ PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
add_prefix (&startfile_prefixes, value, NULL,
- PREFIX_PRIORITY_B_OPT, 0, &warn_B);
+ PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
add_prefix (&include_prefixes, concat (value, "include", NULL),
- NULL, PREFIX_PRIORITY_B_OPT, 0, NULL);
+ NULL, PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
n_switches++;
}
break;
@@ -3763,6 +3903,19 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
if (have_c && have_o && lang_n_infiles > 1)
fatal ("cannot specify -o with -c or -S and multiple compilations");
+ if ((save_temps_flag || report_times) && use_pipes)
+ {
+ /* -save-temps overrides -pipe, so that temp files are produced */
+ if (save_temps_flag)
+ error ("warning: -pipe ignored because -save-temps specified");
+ /* -time overrides -pipe because we can't get correct stats when
+ multiple children are running at once. */
+ else if (report_times)
+ error ("warning: -pipe ignored because -time specified");
+
+ use_pipes = 0;
+ }
+
/* Set up the search paths before we go looking for config files. */
/* These come before the md prefixes so that we will find gcc's subcommands
@@ -3771,17 +3924,17 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
as well as trying the machine and the version. */
#ifndef OS2
add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
+ PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
+ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
- PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
+ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
#endif
add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
+ PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
- PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
+ PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
dir_separator_str, NULL);
@@ -3804,11 +3957,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
add_prefix (&exec_prefixes,
concat (gcc_exec_tooldir_prefix, "bin",
dir_separator_str, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, NULL);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&startfile_prefixes,
concat (gcc_exec_tooldir_prefix, "lib",
dir_separator_str, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, NULL);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
}
tooldir_prefix = concat (standard_exec_prefix, spec_machine,
@@ -3818,10 +3971,19 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
add_prefix (&exec_prefixes,
concat (tooldir_prefix, "bin", dir_separator_str, NULL),
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&startfile_prefixes,
concat (tooldir_prefix, "lib", dir_separator_str, NULL),
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
+
+ if (target_system_root && gcc_exec_prefix)
+ {
+ char *tmp_prefix = make_relative_prefix (argv[0],
+ standard_bindir_prefix,
+ target_system_root);
+ if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
+ target_system_root = tmp_prefix;
+ }
/* More prefixes are enabled in main, after we read the specs file
and determine whether this is cross-compilation or not. */
@@ -3871,6 +4033,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
;
else if (! strcmp (argv[i], "-print-multi-directory"))
;
+ else if (! strcmp (argv[i], "-print-multi-os-directory"))
+ ;
else if (! strcmp (argv[i], "-ftarget-help"))
;
else if (! strcmp (argv[i], "-fhelp"))
@@ -3927,17 +4091,6 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
;
else if (strcmp (argv[i], "-time") == 0)
;
- else if ((save_temps_flag || report_times)
- && strcmp (argv[i], "-pipe") == 0)
- {
- /* -save-temps overrides -pipe, so that temp files are produced */
- if (save_temps_flag)
- error ("warning: -pipe ignored because -save-temps specified");
- /* -time overrides -pipe because we can't get correct stats when
- multiple children are running at once. */
- else if (report_times)
- error ("warning: -pipe ignored because -time specified");
- }
else if (strcmp (argv[i], "-###") == 0)
;
else if (argv[i][0] == '-' && argv[i][1] != 0)
@@ -4004,10 +4157,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
switches[n_switches].live_cond = SWITCH_OK;
switches[n_switches].validated = 0;
switches[n_switches].ordering = 0;
- /* These are always valid, since gcc.c itself understands it. */
+ /* These are always valid, since gcc.c itself understands them. */
if (!strcmp (p, "save-temps")
|| !strcmp (p, "static-libgcc")
- || !strcmp (p, "shared-libgcc"))
+ || !strcmp (p, "shared-libgcc")
+ || !strcmp (p, "pipe"))
switches[n_switches].validated = 1;
else
{
@@ -4074,7 +4228,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
infiles[n_infiles].name = 0;
}
-/* Store switches not filtered out by %{<S} in spec in COLLECT_GCC_OPTIONS
+/* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
and place that in the environment. */
static void
@@ -4221,6 +4375,45 @@ do_spec_2 (spec)
return do_spec_1 (spec, 0, NULL);
}
+
+/* Process the given spec string and add any new options to the end
+ of the switches/n_switches array. */
+
+static void
+do_self_spec (spec)
+ const char *spec;
+{
+ do_spec_2 (spec);
+ do_spec_1 (" ", 0, NULL);
+
+ if (argbuf_index > 0)
+ {
+ int i, first;
+
+ first = n_switches;
+ n_switches += argbuf_index;
+ switches = xrealloc (switches,
+ sizeof (struct switchstr) * (n_switches + 1));
+
+ switches[n_switches] = switches[first];
+ for (i = 0; i < argbuf_index; i++)
+ {
+ struct switchstr *sw;
+
+ /* Each switch should start with '-'. */
+ if (argbuf[i][0] != '-')
+ abort ();
+
+ sw = &switches[i + first];
+ sw->part1 = &argbuf[i][1];
+ sw->args = 0;
+ sw->live_cond = SWITCH_OK;
+ sw->validated = 0;
+ sw->ordering = 0;
+ }
+ }
+}
+
/* Process the sub-spec SPEC as a portion of a larger spec.
This is like processing a whole spec except that we do
not initialize at the beginning and we do not supply a
@@ -4267,17 +4460,12 @@ do_spec_1 (spec, inswitch, soft_matched_part)
if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
{
- for (i = 0; i < n_switches; i++)
- if (!strcmp (switches[i].part1, "pipe"))
- break;
-
/* A `|' before the newline means use a pipe here,
but only if -pipe was specified.
Otherwise, execute now and don't pass the `|' as an arg. */
- if (i < n_switches)
+ if (use_pipes)
{
input_from_pipe = 1;
- switches[i].validated = 1;
break;
}
else
@@ -4381,9 +4569,14 @@ do_spec_1 (spec, inswitch, soft_matched_part)
continue;
#endif
/* Try subdirectory if there is one. */
- if (multilib_dir != NULL)
+ if (multilib_dir != NULL
+ || (pl->os_multilib && multilib_os_dir != NULL))
{
- if (machine_suffix)
+ const char *multi_dir;
+
+ multi_dir = pl->os_multilib ? multilib_os_dir
+ : multilib_dir;
+ if (machine_suffix && multilib_dir)
{
if (strlen (pl->prefix) + strlen (machine_suffix)
>= bufsize)
@@ -4406,14 +4599,14 @@ do_spec_1 (spec, inswitch, soft_matched_part)
}
if (!pl->require_machine_suffix)
{
- if (is_directory (pl->prefix, multilib_dir, 1))
+ if (is_directory (pl->prefix, multi_dir, 1))
{
do_spec_1 ("-L", 0, NULL);
#ifdef SPACE_AFTER_L_OPTION
do_spec_1 (" ", 0, NULL);
#endif
do_spec_1 (pl->prefix, 1, NULL);
- do_spec_1 (multilib_dir, 1, NULL);
+ do_spec_1 (multi_dir, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
@@ -4502,10 +4695,10 @@ do_spec_1 (spec, inswitch, soft_matched_part)
{
struct stat st;
- /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
- and it is not a directory, and it is writable, use it.
- Otherwise, fall through and treat this like any other
- temporary file. */
+ /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
+ defined, and it is not a directory, and it is
+ writable, use it. Otherwise, treat this like any
+ other temporary file. */
if ((!save_temps_flag)
&& (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
@@ -4518,9 +4711,39 @@ do_spec_1 (spec, inswitch, soft_matched_part)
break;
}
}
+ goto create_temp_file;
+ case '|':
+ if (use_pipes)
+ {
+ obstack_1grow (&obstack, '-');
+ delete_this_arg = 0;
+ arg_going = 1;
+
+ /* consume suffix */
+ while (*p == '.' || ISALPHA ((unsigned char) *p))
+ p++;
+ if (p[0] == '%' && p[1] == 'O')
+ p += 2;
+
+ break;
+ }
+ goto create_temp_file;
+ case 'm':
+ if (use_pipes)
+ {
+ /* consume suffix */
+ while (*p == '.' || ISALPHA ((unsigned char) *p))
+ p++;
+ if (p[0] == '%' && p[1] == 'O')
+ p += 2;
+
+ break;
+ }
+ goto create_temp_file;
case 'g':
case 'u':
case 'U':
+ create_temp_file:
{
struct temp_name *t;
int suffix_length;
@@ -4603,7 +4826,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
for (t = temp_names; t; t = t->next)
if (t->length == suffix_length
&& strncmp (t->suffix, suffix, suffix_length) == 0
- && t->unique == (c != 'g'))
+ && t->unique == (c == 'u' || c == 'j'))
break;
/* Make a new association if needed. %u and %j
@@ -4624,7 +4847,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
}
else
t->suffix = save_string (suffix, suffix_length);
- t->unique = (c != 'g');
+ t->unique = (c == 'u' || c == 'j');
temp_filename = make_temp_file (t->suffix);
temp_filename_length = strlen (temp_filename);
t->filename = temp_filename;
@@ -5006,6 +5229,14 @@ do_spec_1 (spec, inswitch, soft_matched_part)
}
break;
+ case 'R':
+ /* We assume there is a directory
+ separator at the end of this string. */
+ if (target_system_root)
+ obstack_grow (&obstack, target_system_root,
+ strlen (target_system_root));
+ break;
+
case 'S':
value = do_spec_1 (startfile_spec, 0, NULL);
if (value != 0)
@@ -5035,6 +5266,32 @@ do_spec_1 (spec, inswitch, soft_matched_part)
}
break;
+ /* Henceforth ignore the option(s) matching the pattern
+ after the %<. */
+ case '<':
+ {
+ unsigned len = 0;
+ int have_wildcard = 0;
+ int i;
+
+ while (p[len] && p[len] != ' ' && p[len] != '\t')
+ len++;
+
+ if (p[len-1] == '*')
+ have_wildcard = 1;
+
+ for (i = 0; i < n_switches; i++)
+ if (!strncmp (switches[i].part1, p, len - have_wildcard)
+ && (have_wildcard || switches[i].part1[len] == '\0'))
+ {
+ switches[i].live_cond = SWITCH_IGNORE;
+ switches[i].validated = 1;
+ }
+
+ p += len;
+ }
+ break;
+
case '*':
if (soft_matched_part)
{
@@ -5191,11 +5448,6 @@ do_spec_1 (spec, inswitch, soft_matched_part)
}
break;
- case '|':
- if (input_from_pipe)
- do_spec_1 ("-", 0, NULL);
- break;
-
default:
error ("spec failure: unrecognized spec option '%c'", c);
break;
@@ -5217,273 +5469,303 @@ do_spec_1 (spec, inswitch, soft_matched_part)
return 0;
}
-/* Return 0 if we call do_spec_1 and that returns -1. */
+/* Inline subroutine of handle_braces. Returns true if the current
+ input suffix matches the atom bracketed by ATOM and END_ATOM. */
+static inline bool
+input_suffix_matches (atom, end_atom)
+ const char *atom;
+ const char *end_atom;
+{
+ return (input_suffix
+ && !strncmp (input_suffix, atom, end_atom - atom)
+ && input_suffix[end_atom - atom] == '\0');
+}
-static const char *
-handle_braces (p)
- const char *p;
+/* Inline subroutine of handle_braces. Returns true if a switch
+ matching the atom bracketed by ATOM and END_ATOM appeared on the
+ command line. */
+static inline bool
+switch_matches (atom, end_atom, starred)
+ const char *atom;
+ const char *end_atom;
+ int starred;
{
- const char *filter, *body = NULL, *endbody = NULL;
- int pipe_p = 0;
- int true_once = 0; /* If, in %{a|b:d}, at least one of a,b was seen. */
- int negate;
- int suffix;
- int include_blanks = 1;
- int elide_switch = 0;
- int ordered = 0;
-
- if (*p == '^')
- {
- /* A '^' after the open-brace means to not give blanks before args. */
- include_blanks = 0;
- ++p;
- }
+ int i;
+ int len = end_atom - atom;
+ int plen = starred ? len : -1;
- if (*p == '|')
- {
- /* A `|' after the open-brace means,
- if the test fails, output a single minus sign rather than nothing.
- This is used in %{|!pipe:...}. */
- pipe_p = 1;
- ++p;
- }
+ for (i = 0; i < n_switches; i++)
+ if (!strncmp (switches[i].part1, atom, len)
+ && (starred || switches[i].part1[len] == '\0')
+ && check_live_switch (i, plen))
+ return true;
- if (*p == '<')
- {
- /* A `<' after the open-brace means that the switch should be
- removed from the command-line. */
- elide_switch = 1;
- ++p;
- }
+ return false;
+}
-next_member:
- negate = suffix = 0;
+/* Inline subroutine of handle_braces. Mark all of the switches which
+ match ATOM (extends to END_ATOM; STARRED indicates whether there
+ was a star after the atom) for later processing. */
+static inline void
+mark_matching_switches (atom, end_atom, starred)
+ const char *atom;
+ const char *end_atom;
+ int starred;
+{
+ int i;
+ int len = end_atom - atom;
+ int plen = starred ? len : -1;
+
+ for (i = 0; i < n_switches; i++)
+ if (!strncmp (switches[i].part1, atom, len)
+ && (starred || switches[i].part1[len] == '\0')
+ && check_live_switch (i, plen))
+ switches[i].ordering = 1;
+}
- if (*p == '!')
- /* A `!' after the open-brace negates the condition:
- succeed if the specified switch is not present. */
- negate = 1, ++p;
+/* Inline subroutine of handle_braces. Process all the currently
+ marked switches through give_switch, and clear the marks. */
+static inline void
+process_marked_switches ()
+{
+ int i;
- if (*p == '.')
- /* A `.' after the open-brace means test against the current suffix. */
- {
- if (pipe_p)
- abort ();
+ for (i = 0; i < n_switches; i++)
+ if (switches[i].ordering == 1)
+ {
+ switches[i].ordering = 0;
+ give_switch (i, 0);
+ }
+}
- suffix = 1;
- ++p;
- }
+/* Handle a %{ ... } construct. P points just inside the leading {.
+ Returns a pointer one past the end of the brace block, or 0
+ if we call do_spec_1 and that returns -1. */
- if (elide_switch && (negate || pipe_p || suffix))
- {
- /* It doesn't make sense to mix elision with other flags. We
- could fatal() here, but the standard seems to be to abort. */
- abort ();
- }
+static const char *
+handle_braces (p)
+ const char *p;
+{
+ const char *atom, *end_atom;
+ const char *d_atom = NULL, *d_end_atom = NULL;
- next_ampersand:
- filter = p;
- while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
- p++;
+ bool a_is_suffix;
+ bool a_is_starred;
+ bool a_is_negated;
+ bool a_matched;
- if (*p == '|' && (pipe_p || ordered))
- abort ();
+ bool a_must_be_last = false;
+ bool ordered_set = false;
+ bool disjunct_set = false;
+ bool disj_matched = false;
+ bool disj_starred = true;
+ bool n_way_choice = false;
+ bool n_way_matched = false;
+
+#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
- if (!body)
+ do
{
- if (*p != '}' && *p != '&')
- {
- int count = 1;
- const char *q = p;
+ if (a_must_be_last)
+ abort ();
- while (*q++ != ':')
- continue;
- body = q;
+ /* Scan one "atom" (S in the description above of %{}, possibly
+ with !, ., or * modifiers). */
+ a_matched = a_is_suffix = a_is_starred = a_is_negated = false;
- while (count > 0)
- {
- if (*q == '{')
- count++;
- else if (*q == '}')
- count--;
- else if (*q == 0)
- fatal ("mismatched braces in specs");
- q++;
- }
- endbody = q;
- }
- else
- body = p, endbody = p + 1;
- }
+ SKIP_WHITE();
+ if (*p == '!')
+ p++, a_is_negated = true;
- if (suffix)
- {
- int found = (input_suffix != 0
- && (long) strlen (input_suffix) == (long) (p - filter)
- && strncmp (input_suffix, filter, p - filter) == 0);
+ SKIP_WHITE();
+ if (*p == '.')
+ p++, a_is_suffix = true;
- if (body[0] == '}')
- abort ();
+ atom = p;
+ while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
+ || *p == ',' || *p == '.')
+ p++;
+ end_atom = p;
- if (negate != found
- && do_spec_1 (save_string (body, endbody-body-1), 0, NULL) < 0)
- return 0;
- }
- else if (p[-1] == '*' && (p[0] == '}' || p[0] == '&'))
- {
- /* Substitute all matching switches as separate args. */
- int i;
+ if (*p == '*')
+ p++, a_is_starred = 1;
- for (i = 0; i < n_switches; i++)
- if (!strncmp (switches[i].part1, filter, p - 1 - filter)
- && check_live_switch (i, p - 1 - filter))
- {
- if (elide_switch)
- {
- switches[i].live_cond = SWITCH_IGNORE;
- switches[i].validated = 1;
- }
- else
- ordered = 1, switches[i].ordering = 1;
- }
- }
- else
- {
- /* Test for presence of the specified switch. */
- int i;
- int present = 0;
+ SKIP_WHITE();
+ if (*p == '&' || *p == '}')
+ {
+ /* Substitute the switch(es) indicated by the current atom. */
+ ordered_set = true;
+ if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
+ || atom == end_atom)
+ abort ();
- /* If name specified ends in *, as in {x*:...},
- check for %* and handle that case. */
- if (p[-1] == '*' && !negate)
+ mark_matching_switches (atom, end_atom, a_is_starred);
+
+ if (*p == '}')
+ process_marked_switches ();
+ }
+ else if (*p == '|' || *p == ':')
{
- int substitution;
- const char *r = body;
+ /* Substitute some text if the current atom appears as a switch
+ or suffix. */
+ disjunct_set = true;
+ if (ordered_set)
+ abort ();
- /* First see whether we have %*. */
- substitution = 0;
- while (r < endbody)
+ if (atom == end_atom)
{
- if (*r == '%' && r[1] == '*')
- substitution = 1;
- r++;
+ if (!n_way_choice || disj_matched || *p == '|'
+ || a_is_negated || a_is_suffix || a_is_starred)
+ abort ();
+
+ /* An empty term may appear as the last choice of an
+ N-way choice set; it means "otherwise". */
+ a_must_be_last = true;
+ disj_matched = !n_way_matched;
+ disj_starred = false;
}
- /* If we do, handle that case. */
- if (substitution)
+ else
{
- /* Substitute all matching switches as separate args.
- But do this by substituting for %*
- in the text that follows the colon. */
-
- unsigned hard_match_len = p - filter - 1;
- char *string = save_string (body, endbody - body - 1);
-
- for (i = 0; i < n_switches; i++)
- if (!strncmp (switches[i].part1, filter, hard_match_len)
- && check_live_switch (i, -1))
- {
- do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
- /* Pass any arguments this switch has. */
- give_switch (i, 1, 1);
- suffix_subst = NULL;
- }
-
- /* We didn't match. Try again. */
- if (*p++ == '|')
- goto next_member;
- return endbody;
+ if (a_is_suffix && a_is_starred)
+ abort ();
+
+ if (!a_is_starred)
+ disj_starred = false;
+
+ /* Don't bother testing this atom if we already have a
+ match. */
+ if (!disj_matched && !n_way_matched)
+ {
+ if (a_is_suffix)
+ a_matched = input_suffix_matches (atom, end_atom);
+ else
+ a_matched = switch_matches (atom, end_atom, a_is_starred);
+
+ if (a_matched != a_is_negated)
+ {
+ disj_matched = true;
+ d_atom = atom;
+ d_end_atom = end_atom;
+ }
+ }
}
- }
- /* If name specified ends in *, as in {x*:...},
- check for presence of any switch name starting with x. */
- if (p[-1] == '*')
- {
- for (i = 0; i < n_switches; i++)
+ if (*p == ':')
{
- unsigned hard_match_len = p - filter - 1;
+ /* Found the body, that is, the text to substitute if the
+ current disjunction matches. */
+ p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
+ disj_matched && !n_way_matched);
+ if (p == 0)
+ return 0;
- if (!strncmp (switches[i].part1, filter, hard_match_len)
- && check_live_switch (i, hard_match_len))
+ /* If we have an N-way choice, reset state for the next
+ disjunction. */
+ if (*p == ';')
{
- present = 1;
- break;
+ n_way_choice = true;
+ n_way_matched |= disj_matched;
+ disj_matched = false;
+ disj_starred = true;
+ d_atom = d_end_atom = NULL;
}
}
}
- /* Otherwise, check for presence of exact name specified. */
else
- {
- for (i = 0; i < n_switches; i++)
- {
- if (!strncmp (switches[i].part1, filter, p - filter)
- && switches[i].part1[p - filter] == 0
- && check_live_switch (i, -1))
- {
- present = 1;
- break;
- }
- }
- }
+ abort ();
+ }
+ while (*p++ != '}');
- /* If it is as desired (present for %{s...}, absent for %{!s...})
- then substitute either the switch or the specified
- conditional text. */
- if (present != negate)
- {
- if (elide_switch)
- {
- switches[i].live_cond = SWITCH_IGNORE;
- switches[i].validated = 1;
- }
- else if (ordered || *p == '&')
- ordered = 1, switches[i].ordering = 1;
- else if (*p == '}')
- give_switch (i, 0, include_blanks);
- else
- /* Even if many alternatives are matched, only output once. */
- true_once = 1;
- }
- else if (pipe_p)
+ return p;
+
+#undef SKIP_WHITE
+}
+
+/* Subroutine of handle_braces. Scan and process a brace substitution body
+ (X in the description of %{} syntax). P points one past the colon;
+ ATOM and END_ATOM bracket the first atom which was found to be true
+ (present) in the current disjunction; STARRED indicates whether all
+ the atoms in the current disjunction were starred (for syntax validation);
+ MATCHED indicates whether the disjunction matched or not, and therefore
+ whether or not the body is to be processed through do_spec_1 or just
+ skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
+ returns -1. */
+
+static const char *
+process_brace_body (p, atom, end_atom, starred, matched)
+ const char *p;
+ const char *atom;
+ const char *end_atom;
+ int starred;
+ int matched;
+{
+ const char *body, *end_body;
+ unsigned int nesting_level;
+ bool have_subst = false;
+
+ /* Locate the closing } or ;, honoring nested braces.
+ Trim trailing whitespace. */
+ body = p;
+ nesting_level = 1;
+ for (;;)
+ {
+ if (*p == '{')
+ nesting_level++;
+ else if (*p == '}')
{
- /* Here if a %{|...} conditional fails: output a minus sign,
- which means "standard output" or "standard input". */
- do_spec_1 ("-", 0, NULL);
- return endbody;
+ if (!--nesting_level)
+ break;
}
+ else if (*p == ';' && nesting_level == 1)
+ break;
+ else if (*p == '%' && p[1] == '*' && nesting_level == 1)
+ have_subst = true;
+ else if (*p == '\0')
+ abort ();
+ p++;
}
+
+ end_body = p;
+ while (end_body[-1] == ' ' || end_body[-1] == '\t')
+ end_body--;
- /* We didn't match; try again. */
- if (*p++ == '|')
- goto next_member;
+ if (have_subst && !starred)
+ abort ();
- if (p[-1] == '&')
+ if (matched)
{
- body = 0;
- goto next_ampersand;
- }
+ /* Copy the substitution body to permanent storage and execute it.
+ If have_subst is false, this is a simple matter of running the
+ body through do_spec_1... */
+ char *string = save_string (body, end_body - body);
+ if (!have_subst)
+ {
+ if (do_spec_1 (string, 0, NULL) < 0)
+ return 0;
+ }
+ else
+ {
+ /* ... but if have_subst is true, we have to process the
+ body once for each matching switch, with %* set to the
+ variant part of the switch. */
+ unsigned int hard_match_len = end_atom - atom;
+ int i;
- if (ordered)
- {
- int i;
- /* Doing this set of switches later preserves their command-line
- ordering. This is needed for e.g. -U, -D and -A. */
- for (i = 0; i < n_switches; i++)
- if (switches[i].ordering == 1)
- {
- switches[i].ordering = 0;
- give_switch (i, 0, include_blanks);
- }
- }
- /* Process the spec just once, regardless of match count. */
- else if (true_once)
- {
- if (do_spec_1 (save_string (body, endbody - body - 1),
- 0, NULL) < 0)
- return 0;
+ for (i = 0; i < n_switches; i++)
+ if (!strncmp (switches[i].part1, atom, hard_match_len)
+ && check_live_switch (i, hard_match_len))
+ {
+ if (do_spec_1 (string, 0,
+ &switches[i].part1[hard_match_len]) < 0)
+ return 0;
+ /* Pass any arguments this switch has. */
+ give_switch (i, 1);
+ suffix_subst = NULL;
+ }
+ }
}
- return endbody;
+ return p;
}
/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
@@ -5568,16 +5850,12 @@ check_live_switch (switchnum, prefix_length)
the vector of switches gcc received, which is `switches'.
This cannot fail since it never finishes a command line.
- If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
-
- If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
- of the switch. */
+ If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
static void
-give_switch (switchnum, omit_first_word, include_blanks)
+give_switch (switchnum, omit_first_word)
int switchnum;
int omit_first_word;
- int include_blanks;
{
if (switches[switchnum].live_cond == SWITCH_IGNORE)
return;
@@ -5595,8 +5873,7 @@ give_switch (switchnum, omit_first_word, include_blanks)
{
const char *arg = *p;
- if (include_blanks)
- do_spec_1 (" ", 0, NULL);
+ do_spec_1 (" ", 0, NULL);
if (suffix_subst)
{
unsigned length = strlen (arg);
@@ -5634,11 +5911,9 @@ find_file (name)
char *newname;
/* Try multilib_dir if it is defined. */
- if (multilib_dir != NULL)
+ if (multilib_os_dir != NULL)
{
- const char *const try = ACONCAT ((multilib_dir, dir_separator_str, name, NULL));
-
- newname = find_a_file (&startfile_prefixes, try, R_OK);
+ newname = find_a_file (&startfile_prefixes, name, R_OK, 1);
/* If we don't find it in the multi library dir, then fall
through and look for it in the normal places. */
@@ -5646,7 +5921,7 @@ find_file (name)
return newname;
}
- newname = find_a_file (&startfile_prefixes, name, R_OK);
+ newname = find_a_file (&startfile_prefixes, name, R_OK, 0);
return newname ? newname : name;
}
@@ -5867,6 +6142,12 @@ main (argc, argv)
process_command (argc, argv);
+ /* Process DRIVER_SELF_SPECS, adding any new options to the end
+ of the command line. */
+
+ for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
+ do_self_spec (driver_self_specs[i]);
+
/* Initialize the vector of specs to just the default.
This means one element containing 0s, as a terminator. */
@@ -5881,7 +6162,7 @@ main (argc, argv)
spec_version, dir_separator_str, NULL);
just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
- specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
+ specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, 0);
/* Read the specs file unless it is a default one. */
if (specs_file != 0 && strcmp (specs_file, "specs"))
read_specs (specs_file, TRUE);
@@ -5900,82 +6181,81 @@ main (argc, argv)
if (access (specs_file, R_OK) == 0)
read_specs (specs_file, TRUE);
- /* If not cross-compiling, look for startfiles in the standard places.
- Similarly, don't add the standard prefixes if startfile handling
- will be under control of startfile_prefix_spec. */
- if (*cross_compile == '0' && *startfile_prefix_spec == 0)
+ /* If not cross-compiling, look for executables in the standard
+ places. */
+ if (*cross_compile == '0')
{
if (*md_exec_prefix)
{
add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, NULL);
- add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, NULL);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
}
+ }
+
+ /* Look for startfiles in the standard places. */
+ if (*startfile_prefix_spec != 0
+ && do_spec_2 (startfile_prefix_spec) == 0
+ && do_spec_1 (" ", 0, NULL) == 0)
+ {
+ int ndx;
+ for (ndx = 0; ndx < argbuf_index; ndx++)
+ add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
+ }
+ /* We should eventually get rid of all these and stick to
+ startfile_prefix_spec exclusively. */
+ else if (*cross_compile == '0' || target_system_root)
+ {
+ if (*md_exec_prefix)
+ add_sysrooted_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*md_startfile_prefix)
- add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, NULL);
+ add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
+ "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*md_startfile_prefix_1)
- add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
- PREFIX_PRIORITY_LAST, 0, NULL);
+ add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
+ "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1);
/* If standard_startfile_prefix is relative, base it on
standard_exec_prefix. This lets us move the installed tree
as a unit. If GCC_EXEC_PREFIX is defined, base
standard_startfile_prefix on that as well. */
if (IS_ABSOLUTE_PATHNAME (standard_startfile_prefix))
- add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 0, NULL);
+ add_sysrooted_prefix (&startfile_prefixes,
+ standard_startfile_prefix, "BINUTILS",
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
else
{
if (gcc_exec_prefix)
add_prefix (&startfile_prefixes,
concat (gcc_exec_prefix, machine_suffix,
standard_startfile_prefix, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, NULL);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
add_prefix (&startfile_prefixes,
concat (standard_exec_prefix,
machine_suffix,
standard_startfile_prefix, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, NULL);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
}
- add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
- add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
+ add_sysrooted_prefix (&startfile_prefixes, standard_startfile_prefix_1,
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
+ add_sysrooted_prefix (&startfile_prefixes, standard_startfile_prefix_2,
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
#if 0 /* Can cause surprises, and one can use -B./ instead. */
add_prefix (&startfile_prefixes, "./", NULL,
- PREFIX_PRIORITY_LAST, 1, NULL);
+ PREFIX_PRIORITY_LAST, 1, NULL, 0);
#endif
}
- else
- {
- if (!IS_ABSOLUTE_PATHNAME (standard_startfile_prefix)
- && gcc_exec_prefix)
- add_prefix (&startfile_prefixes,
- concat (gcc_exec_prefix, machine_suffix,
- standard_startfile_prefix, NULL),
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
- }
-
- if (*startfile_prefix_spec != 0
- && do_spec_2 (startfile_prefix_spec) == 0
- && do_spec_1 (" ", 0, NULL) == 0)
- {
- int ndx;
- for (ndx = 0; ndx < argbuf_index; ndx++)
- add_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
- PREFIX_PRIORITY_LAST, 0, NULL);
- }
/* Process any user specified specs in the order given on the command
line. */
for (uptr = user_specs_head; uptr; uptr = uptr->next)
{
- char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
+ char *filename = find_a_file (&startfile_prefixes, uptr->filename,
+ R_OK, 0);
read_specs (filename ? filename : uptr->filename, FALSE);
}
@@ -6017,7 +6297,7 @@ main (argc, argv)
if (print_prog_name)
{
- char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
+ char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
printf ("%s\n", (newname ? newname : print_prog_name));
return (0);
}
@@ -6037,6 +6317,15 @@ main (argc, argv)
return (0);
}
+ if (print_multi_os_directory)
+ {
+ if (multilib_os_dir == NULL)
+ printf (".\n");
+ else
+ printf ("%s\n", multilib_os_dir);
+ return (0);
+ }
+
if (target_help_flag)
{
/* Print if any target specific options. */
@@ -6054,7 +6343,7 @@ main (argc, argv)
if (! verbose_flag)
{
printf (_("\nFor bug reporting instructions, please see:\n"));
- printf ("%s.\n", GCCBUGURL);
+ printf ("%s.\n", bug_report_url);
return (0);
}
@@ -6196,7 +6485,7 @@ main (argc, argv)
/* We'll use ld if we can't find collect2. */
if (! strcmp (linker_name_spec, "collect2"))
{
- char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
+ char *s = find_a_file (&exec_prefixes, "collect2", X_OK, 0);
if (s == NULL)
linker_name_spec = "ld";
}
@@ -6229,7 +6518,7 @@ main (argc, argv)
if (print_help_list)
{
printf (("\nFor bug reporting instructions, please see:\n"));
- printf ("%s\n", GCCBUGURL);
+ printf ("%s\n", bug_report_url);
}
return (signal_count != 0 ? 2
@@ -6405,91 +6694,117 @@ notice VPARAMS ((const char *msgid, ...))
VA_CLOSE (ap);
}
+static inline void
+validate_switches_from_spec (spec)
+ const char *spec;
+{
+ const char *p = spec;
+ char c;
+ while ((c = *p++))
+ if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
+ /* We have a switch spec. */
+ p = validate_switches (p + 1);
+}
+
static void
validate_all_switches ()
{
struct compiler *comp;
- const char *p;
- char c;
struct spec_list *spec;
for (comp = compilers; comp->spec; comp++)
- {
- p = comp->spec;
- while ((c = *p++))
- if (c == '%' && (*p == '{' || (*p == 'W' && *++p == '{')))
- /* We have a switch spec. */
- validate_switches (p + 1);
- }
+ validate_switches_from_spec (comp->spec);
/* Look through the linked list of specs read from the specs file. */
for (spec = specs; spec; spec = spec->next)
- {
- p = *(spec->ptr_spec);
- while ((c = *p++))
- if (c == '%' && (*p == '{' || (*p == 'W' && *++p == '{')))
- /* We have a switch spec. */
- validate_switches (p + 1);
- }
+ validate_switches_from_spec (*spec->ptr_spec);
- p = link_command_spec;
- while ((c = *p++))
- if (c == '%' && (*p == '{' || (*p == 'W' && *++p == '{')))
- /* We have a switch spec. */
- validate_switches (p + 1);
+ validate_switches_from_spec (link_command_spec);
}
/* Look at the switch-name that comes after START
and mark as valid all supplied switches that match it. */
-static void
+static const char *
validate_switches (start)
const char *start;
{
const char *p = start;
- const char *filter;
+ const char *atom;
+ size_t len;
int i;
- int suffix;
-
- if (*p == '|')
- ++p;
-
+ bool suffix = false;
+ bool starred = false;
+
+#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
+
next_member:
+ SKIP_WHITE ();
+
if (*p == '!')
- ++p;
+ p++;
- suffix = 0;
+ SKIP_WHITE ();
if (*p == '.')
- suffix = 1, ++p;
+ suffix = true, p++;
- filter = p;
- while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
+ atom = p;
+ while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
+ || *p == ',' || *p == '.')
p++;
+ len = p - atom;
- if (suffix)
- ;
- else if (p[-1] == '*')
+ if (*p == '*')
+ starred = true, p++;
+
+ SKIP_WHITE ();
+
+ if (!suffix)
{
/* Mark all matching switches as valid. */
for (i = 0; i < n_switches; i++)
- if (!strncmp (switches[i].part1, filter, p - filter - 1))
+ if (!strncmp (switches[i].part1, atom, len)
+ && (starred || switches[i].part1[len] == 0))
switches[i].validated = 1;
}
- else
+
+ p++;
+ if (p[-1] == '|' || p[-1] == '&')
+ goto next_member;
+
+ if (p[-1] == ':')
{
- /* Mark an exact matching switch as valid. */
- for (i = 0; i < n_switches; i++)
+ while (*p && *p != ';' && *p != '}')
{
- if (!strncmp (switches[i].part1, filter, p - filter)
- && switches[i].part1[p - filter] == 0)
- switches[i].validated = 1;
+ if (*p == '%')
+ {
+ p++;
+ if (*p == '{' || *p == '<')
+ p = validate_switches (p+1);
+ else if (p[0] == 'W' && p[1] == '{')
+ p = validate_switches (p+2);
+ }
+ p++;
}
+
+ p++;
+ if (p[-1] == ';')
+ goto next_member;
}
- if (*p++ == '|' || p[-1] == '&')
- goto next_member;
+ return p;
+#undef SKIP_WHITE
}
+struct mdswitchstr
+{
+ const char *str;
+ int len;
+};
+
+static struct mdswitchstr *mdswitches;
+static int n_mdswitches;
+
/* Check whether a particular argument was used. The first time we
canonicalize the switches to keep only the ones we care about. */
@@ -6555,8 +6870,9 @@ used_arg (p, len)
xmalloc from calling fatal, and prevents us from re-executing this
block of code. */
mswitches
- = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
- * (n_switches ? n_switches : 1));
+ = (struct mswitchstr *)
+ xmalloc (sizeof (struct mswitchstr)
+ * (n_mdswitches + (n_switches ? n_switches : 1)));
for (i = 0; i < n_switches; i++)
{
int xlen = strlen (switches[i].part1);
@@ -6572,6 +6888,57 @@ used_arg (p, len)
break;
}
}
+
+ /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
+ on the command line nor any options mutually incompatible with
+ them. */
+ for (i = 0; i < n_mdswitches; i++)
+ {
+ const char *r;
+
+ for (q = multilib_options; *q != '\0'; q++)
+ {
+ while (*q == ' ')
+ q++;
+
+ r = q;
+ while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
+ || strchr (" /", q[mdswitches[i].len]) == NULL)
+ {
+ while (*q != ' ' && *q != '/' && *q != '\0')
+ q++;
+ if (*q != '/')
+ break;
+ q++;
+ }
+
+ if (*q != ' ' && *q != '\0')
+ {
+ while (*r != ' ' && *r != '\0')
+ {
+ q = r;
+ while (*q != ' ' && *q != '/' && *q != '\0')
+ q++;
+
+ if (used_arg (r, q - r))
+ break;
+
+ if (*q != '/')
+ {
+ mswitches[n_mswitches].str = mdswitches[i].str;
+ mswitches[n_mswitches].len = mdswitches[i].len;
+ mswitches[n_mswitches].replace = (char *) 0;
+ mswitches[n_mswitches].rep_len = 0;
+ n_mswitches++;
+ break;
+ }
+
+ r = q + 1;
+ }
+ break;
+ }
+ }
+ }
}
for (i = 0; i < n_mswitches; i++)
@@ -6586,25 +6953,11 @@ default_arg (p, len)
const char *p;
int len;
{
- const char *start, *end;
-
- for (start = multilib_defaults; *start != '\0'; start = end + 1)
- {
- while (*start == ' ' || *start == '\t')
- start++;
-
- if (*start == '\0')
- break;
-
- for (end = start + 1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
- ;
-
- if ((end - start) == len && strncmp (p, start, len) == 0)
- return 1;
+ int i;
- if (*end == '\0')
- break;
- }
+ for (i = 0; i < n_mdswitches; i++)
+ if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
+ return 1;
return 0;
}
@@ -6626,8 +6979,51 @@ set_multilib_dir ()
const char *p;
unsigned int this_path_len;
const char *this_path, *this_arg;
+ const char *start, *end;
int not_arg;
- int ok;
+ int ok, ndfltok, first;
+
+ n_mdswitches = 0;
+ start = multilib_defaults;
+ while (*start == ' ' || *start == '\t')
+ start++;
+ while (*start != '\0')
+ {
+ n_mdswitches++;
+ while (*start != ' ' && *start != '\t' && *start != '\0')
+ start++;
+ while (*start == ' ' || *start == '\t')
+ start++;
+ }
+
+ if (n_mdswitches)
+ {
+ int i = 0;
+
+ mdswitches
+ = (struct mdswitchstr *) xmalloc (sizeof (struct mdswitchstr)
+ * n_mdswitches);
+ for (start = multilib_defaults; *start != '\0'; start = end + 1)
+ {
+ while (*start == ' ' || *start == '\t')
+ start++;
+
+ if (*start == '\0')
+ break;
+
+ for (end = start + 1;
+ *end != ' ' && *end != '\t' && *end != '\0'; end++)
+ ;
+
+ obstack_grow (&multilib_obstack, start, end - start);
+ obstack_1grow (&multilib_obstack, 0);
+ mdswitches[i].str = obstack_finish (&multilib_obstack);
+ mdswitches[i++].len = end - start;
+
+ if (*end == '\0')
+ break;
+ }
+ }
p = multilib_exclusions;
while (*p != '\0')
@@ -6682,6 +7078,7 @@ set_multilib_dir ()
++p;
}
+ first = 1;
p = multilib_select;
while (*p != '\0')
{
@@ -6704,6 +7101,7 @@ set_multilib_dir ()
/* Check the arguments. */
ok = 1;
+ ndfltok = 1;
++p;
while (*p != ';')
{
@@ -6739,32 +7137,65 @@ set_multilib_dir ()
there is a more specific library which uses this
argument. If this argument is a default, we need not
consider that more specific library. */
- if (! default_arg (this_arg, p - this_arg))
- {
- ok = used_arg (this_arg, p - this_arg);
- if (not_arg)
- ok = ! ok;
- }
+ ok = used_arg (this_arg, p - this_arg);
+ if (not_arg)
+ ok = ! ok;
+
+ if (! ok)
+ ndfltok = 0;
+
+ if (default_arg (this_arg, p - this_arg))
+ ok = 1;
if (*p == ' ')
++p;
}
- if (ok)
+ if (ok && first)
{
if (this_path_len != 1
|| this_path[0] != '.')
{
char *new_multilib_dir = xmalloc (this_path_len + 1);
+ char *q;
+
strncpy (new_multilib_dir, this_path, this_path_len);
new_multilib_dir[this_path_len] = '\0';
+ q = strchr (new_multilib_dir, ':');
+ if (q != NULL)
+ *q = '\0';
multilib_dir = new_multilib_dir;
}
- break;
+ first = 0;
+ }
+
+ if (ndfltok)
+ {
+ const char *q = this_path, *end = this_path + this_path_len;
+
+ while (q < end && *q != ':')
+ q++;
+ if (q < end)
+ {
+ char *new_multilib_os_dir = xmalloc (end - q);
+ memcpy (new_multilib_os_dir, q + 1, end - q - 1);
+ new_multilib_os_dir[end - q - 1] = '\0';
+ multilib_os_dir = new_multilib_os_dir;
+ break;
+ }
}
++p;
}
+
+ if (multilib_dir == NULL && multilib_os_dir != NULL
+ && strcmp (multilib_os_dir, ".") == 0)
+ {
+ free ((char *) multilib_os_dir);
+ multilib_os_dir = NULL;
+ }
+ else if (multilib_dir != NULL && multilib_os_dir == NULL)
+ multilib_os_dir = multilib_dir;
}
/* Print out the multiple library subdirectory selection
@@ -6804,6 +7235,12 @@ print_multilib_info ()
++p;
}
+ /* When --disable-multilib was used but target defines
+ MULTILIB_OSDIRNAMES, entries starting with .: are there just
+ to find multilib_os_dir, so skip them from output. */
+ if (this_path[0] == '.' && this_path[1] == ':')
+ skip = 1;
+
/* Check for matches with the multilib_exclusions. We don't bother
with the '!' in either list. If any of the exclusion rules match
all of its options with the select rule, we skip it. */
@@ -6945,7 +7382,7 @@ print_multilib_info ()
{
const char *p1;
- for (p1 = last_path; p1 < p; p1++)
+ for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
putchar (*p1);
putchar (';');
}
diff --git a/gcc/gcov-dump.c b/gcc/gcov-dump.c
new file mode 100644
index 00000000000..24b785f87a0
--- /dev/null
+++ b/gcc/gcov-dump.c
@@ -0,0 +1,460 @@
+/* Dump a gcov file, for debugging use.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Contributed by Nathan Sidwell <nathan@codesourcery.com>
+
+Gcov 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.
+
+Gcov 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 Gcov; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include "system.h"
+#include "version.h"
+#include <getopt.h>
+typedef HOST_WIDEST_INT gcov_type;
+#include "gcov-io.h"
+
+static void dump_file PARAMS ((const char *));
+static void print_prefix PARAMS ((const char *, unsigned));
+static void print_usage PARAMS ((void));
+static void print_version PARAMS ((void));
+static int tag_function PARAMS ((const char *, FILE *, unsigned, unsigned));
+static int tag_blocks PARAMS ((const char *, FILE *, unsigned, unsigned));
+static int tag_arcs PARAMS ((const char *, FILE *, unsigned, unsigned));
+static int tag_lines PARAMS ((const char *, FILE *, unsigned, unsigned));
+static int tag_arc_counts PARAMS ((const char *, FILE *, unsigned, unsigned));
+static int tag_summary PARAMS ((const char *, FILE *, unsigned, unsigned));
+extern int main PARAMS ((int, char **));
+
+typedef struct tag_format
+{
+ unsigned tag;
+ char const *name;
+ int (*proc) (const char *, FILE *, unsigned, unsigned);
+} tag_format_t;
+
+static int flag_dump_contents = 0;
+
+static const struct option options[] =
+{
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, 'v' },
+ { "long", no_argument, NULL, 'l' },
+};
+
+static tag_format_t tag_table[] =
+{
+ {0, "NOP", NULL},
+ {0, "UNKNOWN", NULL},
+ {GCOV_TAG_FUNCTION, "FUNCTION", tag_function},
+ {GCOV_TAG_BLOCKS, "BLOCKS", tag_blocks},
+ {GCOV_TAG_ARCS, "ARCS", tag_arcs},
+ {GCOV_TAG_LINES, "LINES", tag_lines},
+ {GCOV_TAG_ARC_COUNTS, "ARC_COUNTS", tag_arc_counts},
+ {GCOV_TAG_OBJECT_SUMMARY, "OBJECT_SUMMARY", tag_summary},
+ {GCOV_TAG_PROGRAM_SUMMARY, "PROGRAM_SUMMARY", tag_summary},
+ {GCOV_TAG_PLACEHOLDER_SUMMARY, "PROGRAM_PLACEHOLDER", tag_summary},
+ {GCOV_TAG_INCORRECT_SUMMARY, "PROGRAM_INCORRECT", tag_summary},
+ {0, NULL, NULL}
+};
+
+int main (argc, argv)
+ int argc ATTRIBUTE_UNUSED;
+ char **argv;
+{
+ int opt;
+
+ while ((opt = getopt_long (argc, argv, "hlv", options, NULL)) != -1)
+ {
+ switch (opt)
+ {
+ case 'h':
+ print_usage ();
+ break;
+ case 'v':
+ print_version ();
+ break;
+ case 'l':
+ flag_dump_contents = 1;
+ break;
+ default:
+ fprintf (stderr, "unknown flag `%c'\n", opt);
+ }
+ }
+
+ while (argv[optind])
+ dump_file (argv[optind++]);
+ return 0;
+}
+
+static void
+print_usage ()
+{
+ printf ("Usage: gcov-dump [OPTION] ... gcovfiles\n");
+ printf ("Print coverage file contents\n");
+ printf (" -h, --help Print this help\n");
+ printf (" -v, --version Print version number\n");
+ printf (" -l, --long Dump record contents too\n");
+}
+
+static void
+print_version ()
+{
+ char v[4];
+ unsigned version = GCOV_VERSION;
+ unsigned ix;
+
+ for (ix = 4; ix--; version >>= 8)
+ v[ix] = version;
+ printf ("gcov %.4s (GCC %s)\n", v, version_string);
+ printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n");
+ printf ("This is free software; see the source for copying conditions. There is NO\n\
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
+}
+
+static void
+print_prefix (filename, depth)
+ const char *filename;
+ unsigned depth;
+{
+ static const char prefix[] = " ";
+
+ printf ("%s:%.*s", filename, depth, prefix);
+}
+
+static void
+dump_file (filename)
+ const char *filename;
+{
+ FILE *file = fopen (filename, "rb");
+ unsigned tags[4];
+ unsigned depth = 0;
+ unsigned magic, version;
+ unsigned tag, length;
+
+ if (!file)
+ {
+ fprintf (stderr, "%s:cannot open\n", filename);
+ return;
+ }
+
+ if (gcov_read_unsigned (file, &magic)
+ || gcov_read_unsigned (file, &version))
+ {
+ read_error:;
+ printf ("%s:read error at %ld\n", filename, ftell (file));
+ fclose (file);
+ return;
+ }
+
+ /* magic */
+ {
+ const char *type = NULL;
+ char e[4], v[4], m[4];
+ unsigned expected = GCOV_VERSION;
+ unsigned ix;
+ int different = version != GCOV_VERSION;
+
+ if (magic == GCOV_DATA_MAGIC)
+ type = "data";
+ else if (magic == GCOV_GRAPH_MAGIC)
+ type = "graph";
+ else
+ {
+ printf ("%s:not a gcov file\n", filename);
+ fclose (file);
+ return;
+ }
+ for (ix = 4; ix--; expected >>= 8, version >>= 8, magic >>= 8)
+ {
+ e[ix] = expected;
+ v[ix] = version;
+ m[ix] = magic;
+ }
+
+ printf ("%s:%s:magic `%.4s':version `%.4s'\n", filename, type, m, v);
+ if (different)
+ printf ("%s:warning:current version is `%.4s'\n", filename, e);
+ }
+
+ while (!gcov_read_unsigned (file, &tag)
+ && !gcov_read_unsigned (file, &length))
+ {
+ tag_format_t const *format;
+ unsigned tag_depth;
+ long base, end;
+
+ base = gcov_save_position (file);
+
+ if (!tag)
+ tag_depth = depth;
+ else
+ {
+ unsigned mask = GCOV_TAG_MASK (tag) >> 1;
+
+ for (tag_depth = 4; mask; mask >>= 8)
+ {
+ if ((mask & 0xff) != 0xff)
+ {
+ printf ("%s:tag `%08x' is invalid\n", filename, tag);
+ break;
+ }
+ tag_depth--;
+ }
+ }
+ for (format = tag_table; format->name; format++)
+ if (format->tag == tag)
+ goto found;
+ format = &tag_table[1];
+ found:;
+ if (tag)
+ {
+ if (depth && depth < tag_depth)
+ {
+ if (!GCOV_TAG_IS_SUBTAG (tags[depth - 1], tag))
+ printf ("%s:tag `%08x' is incorrectly nested\n",
+ filename, tag);
+ }
+ depth = tag_depth;
+ tags[depth - 1] = tag;
+ }
+
+ print_prefix (filename, tag_depth);
+ printf ("%08x:%4u:%s", tag, length, format->name);
+ if (format->proc)
+ if ((*format->proc) (filename, file, tag, length))
+ goto read_error;
+ printf ("\n");
+ end = gcov_save_position (file);
+ gcov_resync (file, base, length);
+ if (format->proc && end != base + (long)length)
+ {
+ if (end > base + (long)length)
+ printf ("%s:record size mismatch %lu bytes overread\n",
+ filename, (end - base) - length);
+ else
+ printf ("%s:record size mismatch %lu bytes unread\n",
+ filename, length - (end - base));
+ }
+ }
+ if (!feof (file))
+ goto read_error;
+ fclose (file);
+}
+
+static int
+tag_function (filename, file, tag, length)
+ const char *filename ATTRIBUTE_UNUSED;
+ FILE *file ATTRIBUTE_UNUSED;
+ unsigned tag ATTRIBUTE_UNUSED;
+ unsigned length ATTRIBUTE_UNUSED;
+{
+ char *name = NULL;
+ unsigned checksum;
+
+ if (gcov_read_string (file, &name, NULL)
+ || gcov_read_unsigned (file, &checksum))
+ return 1;
+
+ printf (" `%s' checksum=0x%08x", name, checksum);
+ free (name);
+
+ return 0;
+}
+
+static int
+tag_blocks (filename, file, tag, length)
+ const char *filename ATTRIBUTE_UNUSED;
+ FILE *file ATTRIBUTE_UNUSED;
+ unsigned tag ATTRIBUTE_UNUSED;
+ unsigned length ATTRIBUTE_UNUSED;
+{
+ unsigned n_blocks = length / 4;
+
+ printf (" %u blocks", n_blocks);
+
+ if (flag_dump_contents)
+ {
+ unsigned ix;
+
+ for (ix = 0; ix != n_blocks; ix++)
+ {
+ unsigned flags;
+ if (gcov_read_unsigned (file, &flags))
+ return 1;
+ if (!(ix & 7))
+ printf ("\n%s:\t\t%u", filename, ix);
+ printf (" %04x", flags);
+ }
+
+ }
+ else
+ gcov_skip (file, n_blocks * 4);
+
+ return 0;
+}
+
+static int
+tag_arcs (filename, file, tag, length)
+ const char *filename ATTRIBUTE_UNUSED;
+ FILE *file ATTRIBUTE_UNUSED;
+ unsigned tag ATTRIBUTE_UNUSED;
+ unsigned length ATTRIBUTE_UNUSED;
+{
+ unsigned n_arcs = (length - 4) / 8;
+
+ printf (" %u arcs", n_arcs);
+ if (flag_dump_contents)
+ {
+ unsigned ix;
+ unsigned blockno;
+
+ if (gcov_read_unsigned (file, &blockno))
+ return 1;
+
+ for (ix = 0; ix != n_arcs; ix++)
+ {
+ unsigned dst, flags;
+
+ if (gcov_read_unsigned (file, &dst)
+ || gcov_read_unsigned (file, &flags))
+ return 1;
+ if (!(ix & 3))
+ printf ("\n%s:\t\t%u:", filename, blockno);
+ printf (" %u:%04x", dst, flags);
+ }
+ }
+ else
+ gcov_skip (file, 4 + n_arcs * 8);
+
+ return 0;
+}
+
+static int
+tag_lines (filename, file, tag, length)
+ const char *filename ATTRIBUTE_UNUSED;
+ FILE *file ATTRIBUTE_UNUSED;
+ unsigned tag ATTRIBUTE_UNUSED;
+ unsigned length ATTRIBUTE_UNUSED;
+{
+ if (flag_dump_contents)
+ {
+ char *source = NULL;
+ unsigned blockno;
+ char const *sep = NULL;
+
+ if (gcov_read_unsigned (file, &blockno))
+ return 1;
+
+ while (1)
+ {
+ unsigned lineno;
+
+ if (gcov_read_unsigned (file, &lineno))
+ {
+ free (source);
+ return 1;
+ }
+ if (!lineno)
+ {
+ if (gcov_read_string (file, &source, NULL))
+ return 1;
+ if (!source)
+ break;
+ sep = NULL;
+ }
+
+ if (!sep)
+ {
+ printf ("\n%s:\t\t%u:", filename, blockno);
+ sep = "";
+ }
+ if (lineno)
+ {
+ printf ("%s%u", sep, lineno);
+ sep = ", ";
+ }
+ else
+ {
+ printf ("%s`%s'", sep, source);
+ sep = ":";
+ }
+ }
+ }
+ else
+ gcov_skip (file, length);
+
+ return 0;
+}
+
+static int
+tag_arc_counts (filename, file, tag, length)
+ const char *filename ATTRIBUTE_UNUSED;
+ FILE *file ATTRIBUTE_UNUSED;
+ unsigned tag ATTRIBUTE_UNUSED;
+ unsigned length ATTRIBUTE_UNUSED;
+{
+ unsigned n_counts = length / 8;
+
+ printf (" %u counts", n_counts);
+ if (flag_dump_contents)
+ {
+ unsigned ix;
+
+ for (ix = 0; ix != n_counts; ix++)
+ {
+ gcov_type count;
+
+ if (gcov_read_counter (file, &count))
+ return 1;
+ if (!(ix & 7))
+ printf ("\n%s:\t\t%u", filename, ix);
+ printf (" ");
+ printf (HOST_WIDEST_INT_PRINT_DEC, count);
+ }
+ }
+ else
+ gcov_skip (file, n_counts * 8);
+
+ return 0;
+}
+
+static int
+tag_summary (filename, file, tag, length)
+ const char *filename ATTRIBUTE_UNUSED;
+ FILE *file ATTRIBUTE_UNUSED;
+ unsigned tag ATTRIBUTE_UNUSED;
+ unsigned length ATTRIBUTE_UNUSED;
+{
+ struct gcov_summary summary;
+
+ if (gcov_read_summary (file, &summary))
+ return 1;
+ printf (" checksum=0x%08x", summary.checksum);
+
+ printf ("\n%s:\t\truns=%u, arcs=%u", filename,
+ summary.runs, summary.arcs);
+ printf ("\n%s:\t\tarc_sum=", filename);
+ printf (HOST_WIDEST_INT_PRINT_DEC,
+ (HOST_WIDEST_INT)summary.arc_sum);
+ printf (", arc_max_one=");
+ printf (HOST_WIDEST_INT_PRINT_DEC,
+ (HOST_WIDEST_INT)summary.arc_max_one);
+ printf ("\n%s:\t\tmax_sum=", filename);
+ printf (HOST_WIDEST_INT_PRINT_DEC,
+ (HOST_WIDEST_INT)summary.arc_max_sum);
+ printf (", sum_max=");
+ printf (HOST_WIDEST_INT_PRINT_DEC,
+ (HOST_WIDEST_INT)summary.arc_sum_max);
+ return 0;
+}
diff --git a/gcc/gcov-io.h b/gcc/gcov-io.h
index 4c547b5969d..aa788283d40 100644
--- a/gcc/gcov-io.h
+++ b/gcc/gcov-io.h
@@ -1,6 +1,7 @@
-/* Machine-independent I/O routines for gcov.
- Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+/* File format for coverage information
+ Copyright (C) 1996, 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
Contributed by Bob Manson <manson@cygnus.com>.
+ Completely remangled by Nathan Sidwell <nathan@codesourcery.com>.
This file is part of GCC.
@@ -19,279 +20,473 @@ 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. */
+/* Coverage information is held in two files. A basic block graph
+ file, which is generated by the compiler, and a counter file, which
+ is generated by the program under test. Both files use a similar
+ structure. We do not attempt to make these files backwards
+ compatible with previous versions, as you only need coverage
+ information when developing a program. We do hold version
+ information, so that mismatches can be detected, and we use a
+ format that allows tools to skip information they do not understand
+ or are not interested in.
+
+ Numbers are recorded in big endian unsigned binary form. Either in
+ 32 or 64 bits. Strings are stored with a length count and NUL
+ terminator, and 0 to 3 bytes of zero padding up to the next 4 byte
+ boundary. Zero length and NULL strings are simply stored as a
+ length of zero (they have no trailing NUL or padding).
+
+ int32: byte3 byte2 byte1 byte0
+ int64: byte7 byte6 byte5 byte4 byte3 byte2 byte1 byte0
+ string: int32:0 | int32:length char* char:0 padding
+ padding: | char:0 | char:0 char:0 | char:0 char:0 char:0
+ item: int32 | int64 | string
+
+ The basic format of the files is
+
+ file : int32:magic int32:version record*
+
+ The magic ident is different for the bbg and the counter files.
+ The version is the same for both files and is derived from gcc's
+ version number. Although the ident and version are formally 32 bit
+ numbers, they are derived from 4 character ASCII strings. The
+ version number consists of the single character major version
+ number, a two character minor version number (leading zero for
+ versions less than 10), and a single character indicating the
+ status of the release. That will be 'e' experimental, 'p'
+ prerelease and 'r' for release. Because, by good fortune, these are
+ in alphabetical order, string collating can be used to compare
+ version strings, and because numbers are stored big endian, numeric
+ comparison can be used when it is read as a 32 bit value. Be aware
+ that the 'e' designation will (naturally) be unstable and might be
+ incompatible with itself. For gcc 3.4 experimental, it would be
+ '304e' (0x33303465). When the major version reaches 10, the letters
+ A-Z will be used. Assuming minor increments releases every 6
+ months, we have to make a major increment every 50 years. Assuming
+ major increments releases every 5 years, we're ok for the next 155
+ years -- good enough for me.
+
+ A record has a tag, length and variable amount of data.
+
+ record: header data
+ header: int32:tag int32:length
+ data: item*
+
+ Records are not nested, but there is a record hierarchy. Tag
+ numbers reflect this hierarchy. Tags are unique across bbg and da
+ files. Some record types have a varying amount of data. The LENGTH
+ is usually used to determine how much data. The tag value is split
+ into 4 8-bit fields, one for each of four possible levels. The
+ most significant is allocated first. Unused levels are zero.
+ Active levels are odd-valued, so that the LSB of the level is one.
+ A sub-level incorporates the values of its superlevels. This
+ formatting allows you to determine the tag heirarchy, without
+ understanding the tags themselves, and is similar to the standard
+ section numbering used in technical documents. Level values
+ [1..3f] are used for common tags, values [41..9f] for the graph
+ file and [a1..ff] for the counter file.
+
+ The basic block graph file contains the following records
+ bbg: function-graph*
+ function-graph: announce_function basic_blocks {arcs | lines}*
+ announce_function: header string:name int32:checksum
+ basic_block: header int32:flags*
+ arcs: header int32:block_no arc*
+ arc: int32:dest_block int32:flags
+ lines: header int32:block_no line*
+ int32:0 string:NULL
+ line: int32:line_no | int32:0 string:filename
+
+ The BASIC_BLOCK record holds per-bb flags. The number of blocks
+ can be inferred from its data length. There is one ARCS record per
+ basic block. The number of arcs from a bb is implicit from the
+ data length. It enumerates the destination bb and per-arc flags.
+ There is one LINES record per basic block, it enumerates the source
+ lines which belong to that basic block. Source file names are
+ introduced by a line number of 0, following lines are from the new
+ source file. The initial source file for the function is NULL, but
+ the current source file should be remembered from one LINES record
+ to the next. The end of a block is indicated by an empty filename
+ - this does not reset the current source file. Note there is no
+ ordering of the ARCS and LINES records: they may be in any order,
+ interleaved in any manner. The current filename follows the order
+ the LINES records are stored in the file, *not* the ordering of the
+ blocks they are for.
+
+ The data file contains the following records.
+ da: {function-data* summary:object summary:program*}*
+ function-data: announce_function arc_counts
+ announce_function: header string:name int32:checksum
+ arc_counts: header int64:count*
+ summary: in32:checksum int32:runs int32:arcs int64:sum int64:max \
+ int64:max_sum int64:sum_max
+
+ The ANNOUNCE_FUNCTION record is the same as that in the BBG file.
+ The ARC_COUNTS gives the counter values for those arcs that are
+ instrumented. The SUMMARY records give information about the whole
+ object file and about the whole program. The checksum is used for
+ whole program summaries, and disambiguates different programs which
+ include the same instrumented object file. There may be several
+ program summaries, each with a unique checksum. The object
+ summary's checkum is zero. Note that the da file might contain
+ information from several runs concatenated, or the data might be
+ merged.
+
+ This file is included by both the compiler, gcov tools and the
+ library. The IN_LIBGCC2 define distinguishes these cases. When
+ IN_LIBGCC2 is nonzero, we're building libgcc2 for the target and
+ know the compiler is (the just built) gcc. Otherwise we're
+ generating code for the host, and the compiler may or may not be
+ gcc. In this latter case, you must ensure that 'gcov_type' is
+ typedefed to something suitable (unsigned HOST_WIDEST_INT is
+ usually what you want). */
+
#ifndef GCC_GCOV_IO_H
#define GCC_GCOV_IO_H
-#include <stdio.h>
-#include <sys/types.h>
-
-static int __fetch_long PARAMS ((long *, char *, size_t))
- ATTRIBUTE_UNUSED;
-static int __read_long PARAMS ((long *, FILE *, size_t))
- ATTRIBUTE_UNUSED;
-static int __write_long PARAMS ((long, FILE *, size_t))
- ATTRIBUTE_UNUSED;
-static int __fetch_gcov_type PARAMS ((gcov_type *, char *, size_t))
- ATTRIBUTE_UNUSED;
-static int __store_gcov_type PARAMS ((gcov_type, char *, size_t))
- ATTRIBUTE_UNUSED;
-static int __read_gcov_type PARAMS ((gcov_type *, FILE *, size_t))
- ATTRIBUTE_UNUSED;
-static int __write_gcov_type PARAMS ((gcov_type, FILE *, size_t))
- ATTRIBUTE_UNUSED;
-static int __write_gcov_string PARAMS ((const char *, size_t, FILE*, long))
- ATTRIBUTE_UNUSED;
-static int __read_gcov_string PARAMS ((char *, size_t, FILE*, long))
- ATTRIBUTE_UNUSED;
-
-/* These routines only work for signed values. */
-
-/* Store a portable representation of VALUE in DEST using BYTES*8-1 bits.
- Return a non-zero value if VALUE requires more than BYTES*8-1 bits
- to store. */
-static int
-__store_gcov_type (value, dest, bytes)
- gcov_type value;
- char *dest;
- size_t bytes;
+#if IN_LIBGCC2
+#if LONG_TYPE_SIZE == GCOV_TYPE_SIZE
+typedef long gcov_type;
+#else
+typedef long long gcov_type;
+#endif
+#endif /* IN_LIBGCC2 */
+
+/* File suffixes. */
+#define GCOV_DATA_SUFFIX ".da"
+#define GCOV_GRAPH_SUFFIX ".bbg"
+
+/* File magic. */
+#define GCOV_DATA_MAGIC 0x67636f76 /* "gcov" */
+#define GCOV_GRAPH_MAGIC 0x67626267 /* "gbbg" */
+
+/* gcov-iov.h is automatically generated by the makefile from
+ version.c, it looks like
+ #define GCOV_VERSION ((unsigned)0x89abcdef)
+*/
+#include "gcov-iov.h"
+
+/* The record tags. Values [1..3f] are for tags which may be in either
+ file. Values [41..9f] for those in the bbg file and [a1..ff] for
+ the data file. */
+
+#define GCOV_TAG_FUNCTION ((unsigned)0x01000000)
+#define GCOV_TAG_BLOCKS ((unsigned)0x01410000)
+#define GCOV_TAG_ARCS ((unsigned)0x01430000)
+#define GCOV_TAG_LINES ((unsigned)0x01450000)
+#define GCOV_TAG_ARC_COUNTS ((unsigned)0x01a10000)
+#define GCOV_TAG_OBJECT_SUMMARY ((unsigned)0xa1000000)
+#define GCOV_TAG_PROGRAM_SUMMARY ((unsigned)0xa3000000)
+#define GCOV_TAG_PLACEHOLDER_SUMMARY ((unsigned)0xa5000000)
+#define GCOV_TAG_INCORRECT_SUMMARY ((unsigned)0xa7000000)
+
+/* The tag level mask has 1's in the position of the inner levels, &
+ the lsb of the current level, and zero on the current and outer
+ levels. */
+#define GCOV_TAG_MASK(TAG) (((TAG) - 1) ^ (TAG))
+
+/* Return nonzero if SUB is an immediate subtag of TAG. */
+#define GCOV_TAG_IS_SUBTAG(TAG,SUB) \
+ (GCOV_TAG_MASK (TAG) >> 8 == GCOV_TAG_MASK (SUB) \
+ && !(((SUB) ^ (TAG)) & ~GCOV_TAG_MASK(TAG)))
+
+/* Return nonzero if SUB is at a sublevel to TAG. */
+#define GCOV_TAG_IS_SUBLEVEL(TAG,SUB) \
+ (GCOV_TAG_MASK (TAG) > GCOV_TAG_MASK (SUB))
+
+/* Basic block flags. */
+#define GCOV_BLOCK_UNEXPECTED (1 << 0)
+
+/* Arc flags. */
+#define GCOV_ARC_ON_TREE (1 << 0)
+#define GCOV_ARC_FAKE (1 << 1)
+#define GCOV_ARC_FALLTHROUGH (1 << 2)
+
+/* Structured records. */
+
+/* Object & program summary record. */
+struct gcov_summary
{
- int upper_bit = (value < 0 ? 128 : 0);
- size_t i;
-
- if (value < 0)
- {
- gcov_type oldvalue = value;
- value = -value;
- if (oldvalue != -value)
- return 1;
- }
-
- for(i = 0 ; i < (sizeof (value) < bytes ? sizeof (value) : bytes) ; i++) {
- dest[i] = value & (i == (bytes - 1) ? 127 : 255);
- value = value / 256;
- }
-
- if (value && value != -1)
- return 1;
-
- for(; i < bytes ; i++)
- dest[i] = 0;
- dest[bytes - 1] |= upper_bit;
- return 0;
-}
-
-/* Retrieve a quantity containing BYTES*8-1 bits from SOURCE and store
- the result in DEST. Returns a non-zero value if the value in SOURCE
- will not fit in DEST. */
-
-static int
-__fetch_gcov_type (dest, source, bytes)
- gcov_type *dest;
- char *source;
- size_t bytes;
+ unsigned checksum; /* checksum of program */
+ unsigned runs; /* number of program runs */
+ unsigned arcs; /* number of instrumented arcs */
+ gcov_type arc_sum; /* sum of all arc counters */
+ gcov_type arc_max_one; /* max counter on any one run */
+ gcov_type arc_max_sum; /* maximum arc_sum */
+ gcov_type arc_sum_max; /* sum of max_one */
+};
+
+#if IN_LIBGCC2
+/* Structures embedded in coveraged program. The structures generated
+ by write_profile must match these. */
+
+/* Information about a single function. */
+struct function_info
{
- gcov_type value = 0;
- int i;
-
- for (i = bytes - 1; (size_t) i > (sizeof (*dest) - 1); i--)
- if (source[i] & ((size_t) i == (bytes - 1) ? 127 : 255 ))
- return 1;
-
- for (; i >= 0; i--)
- value = value * 256 + (source[i] & ((size_t)i == (bytes - 1) ? 127 : 255));
-
- if ((source[bytes - 1] & 128) && (value > 0))
- value = - value;
-
- *dest = value;
- return 0;
-}
+ const char *name; /* (mangled) name of function */
+ unsigned checksum; /* function checksum */
+ unsigned n_arc_counts; /* number of instrumented arcs */
+};
-static int
-__fetch_long (dest, source, bytes)
- long *dest;
- char *source;
- size_t bytes;
+/* Information about a single object file. */
+struct gcov_info
{
- long value = 0;
- int i;
-
- for (i = bytes - 1; (size_t) i > (sizeof (*dest) - 1); i--)
- if (source[i] & ((size_t) i == (bytes - 1) ? 127 : 255 ))
- return 1;
-
- for (; i >= 0; i--)
- value = value * 256 + (source[i] & ((size_t)i == (bytes - 1) ? 127 : 255));
-
- if ((source[bytes - 1] & 128) && (value > 0))
- value = - value;
-
- *dest = value;
- return 0;
-}
-
-/* Write a BYTES*8-bit quantity to FILE, portably. Returns a non-zero
- value if the write fails, or if VALUE can't be stored in BYTES*8
- bits.
-
- Note that VALUE may not actually be large enough to hold BYTES*8
- bits, but BYTES characters will be written anyway.
-
- BYTES may be a maximum of 10. */
+ unsigned long version; /* expected version number */
+ struct gcov_info *next; /* link to next, used by libgcc */
+
+ const char *filename; /* output file name */
+ long wkspc; /* libgcc workspace */
+
+ const struct function_info *functions; /* table of functions */
+ unsigned n_functions; /* number of functions */
+
+ gcov_type *arc_counts; /* table of arc counts */
+ unsigned n_arc_counts; /* number of arc counts */
+};
+
+/* Register a new object file module. */
+extern void __gcov_init (struct gcov_info *);
+
+/* Called before fork, to avoid double counting. */
+extern void __gcov_flush (void);
+
+#endif /* IN_LIBGCC2 */
+
+/* Functions for reading and writing gcov files. */
+static int gcov_write_unsigned PARAMS((FILE *, unsigned))
+ ATTRIBUTE_UNUSED;
+static int gcov_write_counter PARAMS((FILE *, gcov_type))
+ ATTRIBUTE_UNUSED;
+static int gcov_write_string PARAMS((FILE *, const char *, unsigned))
+ ATTRIBUTE_UNUSED;
+static int gcov_read_unsigned PARAMS((FILE *, unsigned *))
+ ATTRIBUTE_UNUSED;
+static int gcov_read_counter PARAMS((FILE *, gcov_type *))
+ ATTRIBUTE_UNUSED;
+#if !IN_LIBGCC2
+static int gcov_read_string PARAMS((FILE *, char **, unsigned *))
+ ATTRIBUTE_UNUSED;
+#endif
+static int gcov_read_summary PARAMS ((FILE *, struct gcov_summary *))
+ ATTRIBUTE_UNUSED;
+#if IN_LIBGCC2
+static int gcov_write_summary PARAMS ((FILE *, unsigned,
+ const struct gcov_summary *))
+ ATTRIBUTE_UNUSED;
+#endif
+#define gcov_save_position(STREAM) \
+ ftell (STREAM)
+#define gcov_reserve_length(STREAM) \
+ (gcov_write_unsigned (STREAM, 0) ? 0 : ftell (STREAM) - 4)
+static int gcov_write_length PARAMS((FILE *, long))
+ ATTRIBUTE_UNUSED;
+#define gcov_resync(STREAM, BASE, LENGTH) \
+ fseek (STREAM, BASE + (long)LENGTH, SEEK_SET)
+#define gcov_skip(STREAM, LENGTH) \
+ fseek (STREAM, LENGTH, SEEK_CUR)
+#define gcov_skip_string(STREAM, LENGTH) \
+ fseek (STREAM, (LENGTH) + 4 - ((LENGTH) & 3), SEEK_CUR)
+
+
+/* Write VALUE to coverage file FILE. Return nonzero if failed due to
+ file i/o error, or value error. */
static int
-__write_gcov_type (value, file, bytes)
- gcov_type value;
+gcov_write_unsigned (file, value)
FILE *file;
- size_t bytes;
+ unsigned value;
{
- char c[10];
+ char buffer[4];
+ unsigned ix;
- if (bytes > 10 || __store_gcov_type (value, c, bytes))
- return 1;
- else
- return fwrite(c, 1, bytes, file) != bytes;
+ for (ix = sizeof (buffer); ix--; )
+ {
+ buffer[ix] = value;
+ value >>= 8;
+ }
+ return ((sizeof (value) > sizeof (buffer) && value)
+ || fwrite (buffer, sizeof (buffer), 1, file) != 1);
}
+/* Write VALUE to coverage file FILE. Return nonzero if failed due to
+ file i/o error, or value error. Negative values are not checked
+ here -- they are checked in gcov_read_counter. */
+
static int
-__write_long (value, file, bytes)
- long value;
+gcov_write_counter (file, value)
FILE *file;
- size_t bytes;
+ gcov_type value;
{
- char c[10];
+ char buffer[8];
+ unsigned ix;
- if (bytes > 10 || __store_gcov_type ((gcov_type)value, c, bytes))
- return 1;
- else
- return fwrite(c, 1, bytes, file) != bytes;
+ for (ix = sizeof (buffer); ix--; )
+ {
+ buffer[ix] = value;
+ value >>= 8;
+ }
+ return ((sizeof (value) > sizeof (buffer) && value != 0 && value != -1)
+ || fwrite (buffer, sizeof (buffer), 1, file) != 1);
}
-/* Read a quantity containing BYTES bytes from FILE, portably. Return
- a non-zero value if the read fails or if the value will not fit
- in DEST.
-
- Note that DEST may not be large enough to hold all of the requested
- data, but the function will read BYTES characters anyway.
-
- BYTES may be a maximum of 10. */
+/* Write VALUE to coverage file FILE. Return nonzero if failed due to
+ file i/o error, or value error. */
static int
-__read_gcov_type (dest, file, bytes)
- gcov_type *dest;
+gcov_write_string (file, string, length)
FILE *file;
- size_t bytes;
+ unsigned length;
+ const char *string;
{
- char c[10];
+ unsigned pad = 0;
- if (bytes > 10 || fread(c, 1, bytes, file) != bytes)
- return 1;
+ if (string)
+ return (gcov_write_unsigned (file, length)
+ || fwrite (string, length, 1, file) != 1
+ || fwrite (&pad, 4 - (length & 3), 1, file) != 1);
else
- return __fetch_gcov_type (dest, c, bytes);
+ return gcov_write_unsigned (file, 0);
}
+/* Read *VALUE_P from coverage file FILE. Return nonzero if failed
+ due to file i/o error, or range error. */
+
static int
-__read_long (dest, file, bytes)
- long *dest;
+gcov_read_unsigned (file, value_p)
FILE *file;
- size_t bytes;
+ unsigned *value_p;
{
- char c[10];
+ unsigned value = 0;
+ unsigned ix;
+ unsigned char buffer[4];
- if (bytes > 10 || fread(c, 1, bytes, file) != bytes)
+ if (fread (buffer, sizeof (buffer), 1, file) != 1)
return 1;
- else
- return __fetch_long (dest, c, bytes);
+ for (ix = sizeof (value); ix < sizeof (buffer); ix++)
+ if (buffer[ix])
+ return 1;
+ for (ix = 0; ix != sizeof (buffer); ix++)
+ {
+ value <<= 8;
+ value |= buffer[ix];
+ }
+ *value_p = value;
+ return 0;
}
-
-/* Writes string in gcov format. */
+/* Read *VALUE_P from coverage file FILE. Return nonzero if failed
+ due to file i/o error, or range error. */
static int
-__write_gcov_string (string, length, file, delim)
- const char *string;
- size_t length;
+gcov_read_counter (file, value_p)
FILE *file;
- long delim;
+ gcov_type *value_p;
{
- size_t temp = length + 1;
-
- /* delimiter */
- if (__write_long (delim, file, 4) != 0)
- return 1;
-
- if (__write_long (length, file, 4) != 0)
- return 1;
+ gcov_type value = 0;
+ unsigned ix;
+ unsigned char buffer[8];
- if (fwrite (string, temp, 1, file) != 1)
+ if (fread (buffer, sizeof (buffer), 1, file) != 1)
return 1;
-
- temp &= 3;
-
- if (temp)
+ for (ix = sizeof (value); ix < sizeof (buffer); ix++)
+ if (buffer[ix])
+ return 1;
+ for (ix = 0; ix != sizeof (buffer); ix++)
{
- char c[4];
-
- c[0] = c[1] = c[2] = c[3] = 0;
-
- if (fwrite (c, sizeof (char), 4 - temp, file) != 4 - temp)
- return 1;
+ value <<= 8;
+ value |= buffer[ix];
}
- if (__write_long (delim, file, 4) != 0)
- return 1;
-
- return 0;
+ *value_p = value;
+ return value < 0;
}
-/* Reads string in gcov format. */
+#if !IN_LIBGCC2
+/* Read string from coverage file FILE. Length is stored in *LENGTH_P
+ (if non-null), a buffer is allocated and returned in *STRING_P.
+ Return nonzero if failed due to file i/o error, or range
+ error. Uses xmalloc to allocate the string buffer. */
static int
-__read_gcov_string (string, max_length, file, delim)
- char *string;
- size_t max_length;
+gcov_read_string (file, string_p, length_p)
FILE *file;
- long delim;
+ char **string_p;
+ unsigned *length_p;
{
- long delim_from_file;
- long length;
- long read_length;
- long tmp;
+ unsigned length;
- if (__read_long (&delim_from_file, file, 4) != 0)
+ if (gcov_read_unsigned (file, &length))
return 1;
- if (delim_from_file != delim)
- return 1;
+ if (length_p)
+ *length_p = length;
+ free (*string_p);
- if (__read_long (&length, file, 4) != 0)
- return 1;
+ *string_p = NULL;
+ if (!length)
+ return 0;
- if (length > (long) max_length)
- read_length = max_length;
- else
- read_length = length;
+ length += 4 - (length & 3);
+ *string_p = (char *) xmalloc (length);
- tmp = (((length + 1) - 1) / 4 + 1) * 4;
- /* This is the size occupied by the string in the file */
+ return fread (*string_p, length, 1, file) != 1;
- if (fread (string, read_length, 1, file) != 1)
- return 1;
+}
- string[read_length] = 0;
+#endif /* !IN_LIBGCC2 */
- if (fseek (file, tmp - read_length, SEEK_CUR) < 0)
- return 1;
-
- if (__read_long (&delim_from_file, file, 4) != 0)
- return 1;
+/* Write a record length at PLACE. The current file position is the
+ end of the record, and is restored before returning. Returns
+ nonzero on failure. */
- if (delim_from_file != delim)
- return 1;
+static int
+gcov_write_length (file, place)
+ FILE *file;
+ long place;
+{
+ long here = ftell (file);
+ int result = (!place || fseek (file, place, SEEK_SET)
+ || gcov_write_unsigned (file, here - place - 4));
+ if (fseek (file, here, SEEK_SET))
+ result = 1;
+ return result;
+}
- return 0;
+static int
+gcov_read_summary (da_file, summary)
+ FILE *da_file;
+ struct gcov_summary *summary;
+{
+ return (gcov_read_unsigned (da_file, &summary->checksum)
+ || gcov_read_unsigned (da_file, &summary->runs)
+ || gcov_read_unsigned (da_file, &summary->arcs)
+ || gcov_read_counter (da_file, &summary->arc_sum)
+ || gcov_read_counter (da_file, &summary->arc_max_one)
+ || gcov_read_counter (da_file, &summary->arc_max_sum)
+ || gcov_read_counter (da_file, &summary->arc_sum_max));
}
+#if IN_LIBGCC2
+static int
+gcov_write_summary (da_file, tag, summary)
+ FILE *da_file;
+ unsigned tag;
+ const struct gcov_summary *summary;
+{
+ long base;
+
+ return (gcov_write_unsigned (da_file, tag)
+ || !(base = gcov_reserve_length (da_file))
+ || gcov_write_unsigned (da_file, summary->checksum)
+ || gcov_write_unsigned (da_file, summary->runs)
+ || gcov_write_unsigned (da_file, summary->arcs)
+ || gcov_write_counter (da_file, summary->arc_sum)
+ || gcov_write_counter (da_file, summary->arc_max_one)
+ || gcov_write_counter (da_file, summary->arc_max_sum)
+ || gcov_write_counter (da_file, summary->arc_sum_max)
+ || gcov_write_length (da_file, base));
+}
+#endif
-#endif /* ! GCC_GCOV_IO_H */
+#endif /* GCC_GCOV_IO_H */
diff --git a/gcc/gcov-iov.c b/gcc/gcov-iov.c
new file mode 100644
index 00000000000..ed7109c1b04
--- /dev/null
+++ b/gcc/gcov-iov.c
@@ -0,0 +1,68 @@
+/* Generate gcov version string from version.c. See gcov-io.h for
+ description of how the version string is generated.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Contributed by Nathan Sidwell <nathan@codesourcery.com>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+
+#include "hconfig.h"
+#include "system.h"
+#include "version.c" /* We want the actual string. */
+
+int main PARAMS ((int, char **));
+
+int
+main (argc, argv)
+ int argc ATTRIBUTE_UNUSED;
+ char **argv;
+{
+ unsigned version = 0;
+ unsigned char v[4];
+ unsigned ix;
+ char const *ptr = version_string;
+ unsigned major, minor = 0;
+ char s = 0;
+
+ major = atoi (ptr);
+ while (*ptr && *ptr != '.')
+ ptr++;
+ if (*ptr)
+ minor = atoi (ptr + 1);
+ while (*ptr)
+ if (*ptr++ == '(')
+ {
+ s = *ptr;
+ break;
+ }
+
+ v[0] = (major < 10 ? '0' : 'A' - 10) + major;
+ v[1] = (minor / 10) + '0';
+ v[2] = (minor % 10) + '0';
+ v[3] = s ? s : '*';
+
+ for (ix = 0; ix != 4; ix++)
+ version = (version << 8) | v[ix];
+
+ printf ("/* Generated automatically by the program `%s'\n", argv[0]);
+ printf (" from `%s'. */\n", version_string);
+ printf ("\n");
+ printf ("#define GCOV_VERSION ((unsigned)%#08x) /* %.4s */\n",
+ version, v);
+
+ return 0;
+}
diff --git a/gcc/gcov.c b/gcc/gcov.c
index a9658b26755..73e17a11f62 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -4,6 +4,7 @@
1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by James E. Wilson of Cygnus Support.
Mangled by Bob Manson of Cygnus Support.
+ Mangled further by Nathan Sidwell <nathan@codesourcery.com>
Gcov is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -20,14 +21,6 @@ along with Gcov; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/* ??? The code in final.c that produces the struct bb assumes that there is
- no padding between the fields. This is not necessary true. The current
- code can only be trusted if longs and pointers are the same size. */
-
-/* ??? No need to print an execution count on every line, could just print
- it on the first line of each block, and only print it on a subsequent
- line in the same block if the count changes. */
-
/* ??? Print a list of the ten blocks with the highest execution counts,
and list the line numbers corresponding to those blocks. Also, perhaps
list the line numbers with the highest execution counts, only printing
@@ -36,12 +29,17 @@ Boston, MA 02111-1307, USA. */
/* ??? Should have an option to print the number of basic blocks, and the
percent of them that are covered. */
-/* ??? Does not correctly handle the case where two .bb files refer to the
- same included source file. For example, if one has a short file containing
- only inline functions, which is then included in two other files, then
- there will be two .bb files which refer to the include file, but there
- is no way to get the total execution counts for the included file, can
- only get execution counts for one or the other of the including files. */
+/* ??? Does not correctly handle the case where two .bb files refer to
+ the same included source file. For example, if one has a short
+ file containing only inline functions, which is then included in
+ two other files, then there will be two .bb files which refer to
+ the include file, but there is no way to get the total execution
+ counts for the included file, can only get execution counts for one
+ or the other of the including files. this can be fixed by --ratios
+ --long-file-names --preserve-paths and perl. */
+
+/* Need an option to show individual block counts, and show
+ probabilities of fall through arcs. */
#include "config.h"
#include "system.h"
@@ -54,120 +52,102 @@ Boston, MA 02111-1307, USA. */
typedef HOST_WIDEST_INT gcov_type;
#include "gcov-io.h"
-/* The .bb file format consists of several lists of 4-byte integers
- which are the line numbers of each basic block in the file. Each
- list is terminated by a zero. These lists correspond to the basic
- blocks in the reconstructed program flow graph.
-
- A line number of -1 indicates that a source file name (padded to a
- long boundary) follows. The padded file name is followed by
- another -1 to make it easy to scan past file names. A -2 indicates
- that a function name (padded to a long boundary) follows; the name
- is followed by another -2 to make it easy to scan past the function
- name.
-
- The .bbg file contains enough info to enable gcov to reconstruct the
- program flow graph. The first word is the number of basic blocks,
- the second word is the number of arcs, followed by the list of arcs
- (source bb, dest bb pairs), then a -1, then the number of instrumented
- arcs followed by the instrumented arcs, followed by another -1. This
- is repeated for each function.
-
- The .da file contains the execution count for each instrumented branch.
-
- The .bb and .bbg files are created by giving GCC the -ftest-coverage option,
- and the .da files are created when an executable compiled with
- -fprofile-arcs is run. */
+/* The bbg file is generated by -ftest-coverage option. The da file is
+ generated by a program compiled with -fprofile-arcs. Their formats
+ are documented in gcov-io.h. */
/* The functions in this file for creating and solution program flow graphs
- are very similar to functions in the gcc source file profile.c. */
+ are very similar to functions in the gcc source file profile.c. In
+ some places we make use of the knowledge of how profile.c works to
+ select particular algorithms here. */
/* This is the size of the buffer used to read in source file lines. */
#define STRING_SIZE 200
-/* One copy of this structure is created for each source file mentioned in the
- .bb file. */
+struct function_info;
+struct block_info;
-struct sourcefile
-{
- char *name;
- int maxlineno;
- struct sourcefile *next;
-};
+/* Describes an arc between two basic blocks. */
-/* This points to the head of the sourcefile structure list. */
-
-struct sourcefile *sources;
+typedef struct arc_info
+{
+ /* source and destination blocks. */
+ struct block_info *src;
+ struct block_info *dst;
-/* One of these is dynamically created whenever we identify an arc in the
- function. */
+ /* transition counts. */
+ gcov_type count;
-struct adj_list
-{
- int source;
- int target;
- gcov_type arc_count;
unsigned int count_valid : 1;
unsigned int on_tree : 1;
unsigned int fake : 1;
unsigned int fall_through : 1;
-#if 0
- /* Not needed for gcov, but defined in profile.c. */
- rtx branch_insn;
-#endif
- struct adj_list *pred_next;
- struct adj_list *succ_next;
-};
-/* Count the number of basic blocks, and create an array of these structures,
- one for each bb in the function. */
-
-struct bb_info
-{
- struct adj_list *succ;
- struct adj_list *pred;
- gcov_type succ_count;
- gcov_type pred_count;
- gcov_type exec_count;
- unsigned int count_valid : 1;
- unsigned int on_tree : 1;
-#if 0
- /* Not needed for gcov, but defined in profile.c. */
- rtx first_insn;
-#endif
-};
+ /* Arc to a call. */
+ unsigned int is_call : 1;
+
+ /* Next branch on line. */
+ struct arc_info *line_next;
+
+ /* Links to next arc on src and dst lists. */
+ struct arc_info *succ_next;
+ struct arc_info *pred_next;
+} arc_t;
-/* When outputting branch probabilities, one of these structures is created
- for each branch/call. */
+/* Describes a basic block. Contains lists of arcs to successor and
+ predecessor blocks. */
-struct arcdata
+typedef struct block_info
{
- gcov_type hits;
- gcov_type total;
- int call_insn;
- struct arcdata *next;
-};
+ /* Chain of exit and entry arcs. */
+ arc_t *succ;
+ arc_t *pred;
+
+ /* Number of unprocessed exit and entry arcs. */
+ gcov_type num_succ;
+ gcov_type num_pred;
+
+ /* Block execution count. */
+ gcov_type count;
+ unsigned count_valid : 1;
+ unsigned valid_chain : 1;
+ unsigned invalid_chain : 1;
+
+ /* Array of line numbers and source files. source files are
+ introduced by a linenumber of zero, the next 'line number' is the
+ number of the source file. Always starts with a source file. */
+ unsigned *encoding;
+ unsigned num_encodings;
+
+ /* Temporary chain for solving graph. */
+ struct block_info *chain;
+
+} block_t;
-/* Used to save the list of bb_graphs, one per function. */
+/* Describes a single function. Contains an array of basic blocks. */
-struct bb_info_list
+typedef struct function_info
{
- /* Indexed by block number, holds the basic block graph for one function. */
- struct bb_info *bb_graph;
- int num_blocks;
- struct bb_info_list *next;
-};
+ /* Name of function. */
+ char *name;
+ unsigned checksum;
-/* Used to hold information about each line. */
-struct line_info
-{
- gcov_type count; /* execution count */
- struct arcdata *branches; /* list of branch probabilities for line. */
- unsigned exists : 1; /* has code associated with it. */
-};
+ /* Array of basic blocks. */
+ block_t *blocks;
+ unsigned num_blocks;
+
+ /* Raw arc coverage counts. */
+ gcov_type *counts;
+ unsigned num_counts;
-struct coverage
+ /* Next function. */
+ struct function_info *next;
+} function_t;
+
+/* Describes coverage of a file or function. */
+
+typedef struct coverage_info
{
int lines;
int lines_executed;
@@ -180,104 +160,111 @@ struct coverage
int calls_executed;
char *name;
-};
+} coverage_t;
-/* Holds a list of function basic block graphs. */
+/* Describes a single line of source. Contains a chain of basic blocks
+ with code on it. */
-static struct bb_info_list *bb_graph_list = 0;
+typedef struct line_info
+{
+ gcov_type count; /* execution count */
+ arc_t *branches; /* branches from blocks that end on this
+ line. */
+ unsigned exists : 1;
+} line_t;
-/* Modification time of data files. */
+/* Describes a file mentioned in the block graph. Contains an array
+ of line info. */
-static time_t bb_file_time;
+typedef struct source_info
+{
+ /* Name of source file. */
+ char *name;
+ unsigned index;
-/* Name and file pointer of the input file for the basic block graph. */
+ /* Array of line information. */
+ line_t *lines;
+ unsigned num_lines;
-static char *bbg_file_name;
-static FILE *bbg_file;
+ coverage_t coverage;
+
+ /* Next source file. */
+ struct source_info *next;
+} source_t;
-/* Name and file pointer of the input file for the arc count data. */
+/* Holds a list of function basic block graphs. */
-static char *da_file_name;
-static FILE *da_file;
+static function_t *functions;
-/* Name and file pointer of the input file for the basic block line counts. */
+/* This points to the head of the sourcefile structure list. */
-static char *bb_file_name;
-static FILE *bb_file;
+static source_t *sources;
-/* Holds the entire contents of the bb_file read into memory. */
+/* Modification time of graph file. */
-static char *bb_data;
+static time_t bbg_file_time;
-/* Size of bb_data array in longs. */
+/* Name and file pointer of the input file for the basic block graph. */
-static long bb_data_size;
+static char *bbg_file_name;
-/* Name of the file mentioned on the command line. */
+/* Name and file pointer of the input file for the arc count data. */
-static char *input_file_name = 0;
+static char *da_file_name;
-/* Output branch probabilities if true. */
+/* Output branch probabilities. */
-static int output_branch_probs = 0;
+static int flag_branches = 0;
/* Output a gcov file if this is true. This is on by default, and can
be turned off by the -n option. */
-static int output_gcov_file = 1;
+static int flag_gcov_file = 1;
-/* For included files, make the gcov output file name include the name of
- the input source file. For example, if x.h is included in a.c, then the
- output file name is a.c.x.h.gcov instead of x.h.gcov. This works only
- when a single source file is specified. */
+/* For included files, make the gcov output file name include the name
+ of the input source file. For example, if x.h is included in a.c,
+ then the output file name is a.c##x.h.gcov instead of x.h.gcov. */
-static int output_long_names = 0;
+static int flag_long_names = 0;
/* Output summary info for each function. */
-static int output_function_summary = 0;
+static int flag_function_summary = 0;
-/* Object directory file prefix. This is the directory/file
- where .bb and .bbg files are looked for, if non-zero. */
+/* Object directory file prefix. This is the directory/file where the
+ graph and data files are looked for, if nonzero. */
static char *object_directory = 0;
/* Preserve all pathname components. Needed when object files and
- source files are in subdirectories. */
-static int preserve_paths = 0;
+ source files are in subdirectories. '/' is mangled as '#', '.' is
+ elided and '..' mangled to '^'. */
+
+static int flag_preserve_paths = 0;
/* Output the number of times a branch was taken as opposed to the percentage
- of times it was taken. Turned on by the -c option */
+ of times it was taken. */
-static int output_branch_counts = 0;
+static int flag_counts = 0;
/* Forward declarations. */
-static void process_args PARAMS ((int, char **));
-static void open_files PARAMS ((void));
-static void read_files PARAMS ((void));
-static void scan_for_source_files PARAMS ((void));
-static void output_data PARAMS ((struct sourcefile *));
+static void fnotice PARAMS ((FILE *, const char *, ...)) ATTRIBUTE_PRINTF_2;
+static int process_args PARAMS ((int, char **));
static void print_usage PARAMS ((int)) ATTRIBUTE_NORETURN;
static void print_version PARAMS ((void)) ATTRIBUTE_NORETURN;
-static void init_arc PARAMS ((struct adj_list *, int, int, struct bb_info *));
-static struct adj_list *reverse_arcs PARAMS ((struct adj_list *));
-static gcov_type *read_profile PARAMS ((char *, long, int));
-static void create_program_flow_graph PARAMS ((struct bb_info_list *));
-static void solve_program_flow_graph PARAMS ((struct bb_info_list *));
-static void accumulate_branch_counts PARAMS ((struct coverage *,
- struct arcdata *));
-static void calculate_branch_probs PARAMS ((struct bb_info *,
- struct line_info *,
- struct coverage *));
-static void function_summary PARAMS ((struct coverage *, const char *));
-static void init_line_info PARAMS ((struct line_info *,
- struct coverage *, long));
-static void output_line_info PARAMS ((FILE *, const struct line_info *,
- const struct coverage *, long));
-static char *make_gcov_file_name PARAMS ((char *));
-static const char *format_hwint PARAMS ((HOST_WIDEST_INT, HOST_WIDEST_INT,
- int));
-
+static void process_file PARAMS ((const char *));
+static void create_file_names PARAMS ((const char *));
+static int read_graph_file PARAMS ((void));
+static int read_count_file PARAMS ((void));
+static void solve_flow_graph PARAMS ((function_t *));
+static void add_branch_counts PARAMS ((coverage_t *, const arc_t *));
+static void add_line_counts PARAMS ((coverage_t *, const function_t *));
+static void function_summary PARAMS ((const coverage_t *, const char *));
+static const char *format_gcov PARAMS ((gcov_type, gcov_type, int));
+static void accumulate_line_counts PARAMS ((source_t *));
+static void output_lines PARAMS ((FILE *, const source_t *));
+static char *make_gcov_file_name PARAMS ((const char *, const char *));
+static void release_structures PARAMS ((void));
extern int main PARAMS ((int, char **));
int
@@ -285,25 +272,24 @@ main (argc, argv)
int argc;
char **argv;
{
- struct sourcefile *s_ptr;
+ int argno;
gcc_init_libintl ();
- process_args (argc, argv);
-
- open_files ();
-
- read_files ();
-
- scan_for_source_files ();
-
- for (s_ptr = sources; s_ptr; s_ptr = s_ptr->next)
- output_data (s_ptr);
+ argno = process_args (argc, argv);
+ if (optind == argc)
+ print_usage (true);
+ for (; argno != argc; argno++)
+ {
+ release_structures ();
+
+ process_file (argv[argno]);
+ }
+
return 0;
}
-static void fnotice PARAMS ((FILE *, const char *, ...)) ATTRIBUTE_PRINTF_2;
static void
fnotice VPARAMS ((FILE *file, const char *msgid, ...))
{
@@ -335,6 +321,7 @@ print_usage (error_p)
{
FILE *file = error_p ? stderr : stdout;
int status = error_p ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
+
fnotice (file, "Usage: gcov [OPTION]... SOURCEFILE\n\n");
fnotice (file, "Print code coverage information.\n\n");
fnotice (file, " -h, --help Print this help, then exit\n");
@@ -349,7 +336,7 @@ print_usage (error_p)
fnotice (file, " -o, --object-directory DIR|FILE Search for object files in DIR or called FILE\n");
fnotice (file, " -p, --preserve-paths Preserve all pathname components\n");
fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n",
- GCCBUGURL);
+ bug_report_url);
exit (status);
}
@@ -358,8 +345,14 @@ print_usage (error_p)
static void
print_version ()
{
- fnotice (stdout, "gcov (GCC) %s\n", version_string);
- fnotice (stdout, "Copyright (C) 2001 Free Software Foundation, Inc.\n");
+ char v[4];
+ unsigned version = GCOV_VERSION;
+ unsigned ix;
+
+ for (ix = 4; ix--; version >>= 8)
+ v[ix] = version;
+ fnotice (stdout, "gcov %.4s (GCC %s)\n", v, version_string);
+ fnotice (stdout, "Copyright (C) 2002 Free Software Foundation, Inc.\n");
fnotice (stdout,
"This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
@@ -380,9 +373,9 @@ static const struct option options[] =
{ "object-file", required_argument, NULL, 'o' },
};
-/* Parse the command line. */
+/* Process args, return index to first non-arg. */
-static void
+static int
process_args (argc, argv)
int argc;
char **argv;
@@ -400,25 +393,25 @@ process_args (argc, argv)
print_version ();
/* print_version will exit. */
case 'b':
- output_branch_probs = 1;
+ flag_branches = 1;
break;
case 'c':
- output_branch_counts = 1;
+ flag_counts = 1;
break;
case 'n':
- output_gcov_file = 0;
+ flag_gcov_file = 0;
break;
case 'l':
- output_long_names = 1;
+ flag_long_names = 1;
break;
case 'f':
- output_function_summary = 1;
+ flag_function_summary = 1;
break;
case 'o':
object_directory = optarg;
break;
case 'p':
- preserve_paths = 1;
+ flag_preserve_paths = 1;
break;
default:
print_usage (true);
@@ -426,27 +419,135 @@ process_args (argc, argv)
}
}
- if (optind != argc - 1)
- print_usage (true);
+ return optind;
+}
+
+/* Process a single source file. */
- input_file_name = argv[optind];
+static void
+process_file (file_name)
+ const char *file_name;
+{
+ source_t *src;
+ function_t *fn;
+
+ create_file_names (file_name);
+ if (read_graph_file ())
+ return;
+
+ if (!functions)
+ {
+ fnotice (stderr, "%s:no functions found\n", bbg_file_name);
+ return;
+ }
+
+ if (read_count_file ())
+ return;
+
+ for (fn = functions; fn; fn = fn->next)
+ solve_flow_graph (fn);
+ for (src = sources; src; src = src->next)
+ src->lines = (line_t *) xcalloc (src->num_lines, sizeof (line_t));
+ for (fn = functions; fn; fn = fn->next)
+ {
+ coverage_t coverage;
+
+ memset (&coverage, 0, sizeof (coverage));
+ coverage.name = fn->name;
+ add_line_counts (flag_function_summary ? &coverage : NULL, fn);
+ if (flag_function_summary)
+ {
+ function_summary (&coverage, "Function");
+ fnotice (stdout, "\n");
+ }
+ }
+
+ for (src = sources; src; src = src->next)
+ {
+ accumulate_line_counts (src);
+ function_summary (&src->coverage, "File");
+ if (flag_gcov_file)
+ {
+ char *gcov_file_name = make_gcov_file_name (file_name, src->name);
+ FILE *gcov_file = fopen (gcov_file_name, "w");
+
+ if (gcov_file)
+ {
+ fnotice (stdout, "%s:creating `%s'\n",
+ src->name, gcov_file_name);
+ output_lines (gcov_file, src);
+ if (ferror (gcov_file))
+ fnotice (stderr, "%s:error writing output file `%s'\n",
+ src->name, gcov_file_name);
+ fclose (gcov_file);
+ }
+ else
+ fnotice (stderr, "%s:could not open output file `%s'\n",
+ src->name, gcov_file_name);
+ free (gcov_file_name);
+ }
+ fnotice (stdout, "\n");
+ }
}
+/* Release all memory used. */
+
+static void
+release_structures ()
+{
+ function_t *fn;
+ source_t *src;
+
+ free (bbg_file_name);
+ free (da_file_name);
+ da_file_name = bbg_file_name = NULL;
+ bbg_file_time = 0;
+
+ while ((src = sources))
+ {
+ sources = src->next;
+
+ free (src->name);
+ free (src->lines);
+ }
+
+ while ((fn = functions))
+ {
+ unsigned ix;
+ block_t *block;
+
+ functions = fn->next;
+ for (ix = fn->num_blocks, block = fn->blocks; ix--; block++)
+ {
+ arc_t *arc, *arc_n;
+
+ for (arc = block->succ; arc; arc = arc_n)
+ {
+ arc_n = arc->succ_next;
+ free (arc);
+ }
+ free (block->encoding);
+ }
+ free (fn->blocks);
+ free (fn->counts);
+ }
+}
-/* Find and open the .bb, .da, and .bbg files. If OBJECT_DIRECTORY is
- not specified, these are looked for in the current directory, and
- named from the basename of the input_file_name sans extension. If
+/* Generate the names of the graph and data files. If OBJECT_DIRECTORY
+ is not specified, these are looked for in the current directory,
+ and named from the basename of the FILE_NAME sans extension. If
OBJECT_DIRECTORY is specified and is a directory, the files are in
- that directory, but named from the basename of the input_file_name,
- sans extension. Otherwise OBJECT_DIRECTORY is taken to be the name
- of the object *file*, and the data files are named from that. */
+ that directory, but named from the basename of the FILE_NAME, sans
+ extension. Otherwise OBJECT_DIRECTORY is taken to be the name of
+ the object *file*, and the data files are named from that. */
static void
-open_files ()
+create_file_names (file_name)
+ const char *file_name;
{
char *cptr;
char *name;
- int length = strlen (input_file_name);
+ int length = strlen (file_name);
int base;
if (object_directory && object_directory[0])
@@ -472,658 +573,640 @@ open_files ()
if (base)
{
/* Append source file name */
- cptr = strrchr (input_file_name, '/');
- cptr = cptr ? cptr + 1 : input_file_name;
-
- strcat (name, cptr);
+ cptr = strrchr (file_name, '/');
+ strcat (name, cptr ? cptr + 1 : file_name);
}
- /* Remove the extension. */
+
+ /* Remove the extension. */
cptr = strrchr (name, '.');
if (cptr)
*cptr = 0;
length = strlen (name);
- da_file_name = xmalloc (length + 4);
- bb_file_name = xmalloc (length + 4);
- bbg_file_name = xmalloc (length + 5);
-
- strcpy (da_file_name, name);
- strcpy (bb_file_name, name);
- strcpy (bbg_file_name, name);
- strcpy (da_file_name + length, ".da");
- strcpy (bb_file_name + length, ".bb");
- strcpy (bbg_file_name + length, ".bbg");
-
- bb_file = fopen (bb_file_name, "rb");
- if (bb_file == NULL)
- {
- fnotice (stderr, "Could not open basic block file %s.\n", bb_file_name);
- exit (FATAL_EXIT_CODE);
- }
-
- bbg_file = fopen (bbg_file_name, "rb");
- if (bbg_file == NULL)
- {
- fnotice (stderr, "Could not open program flow graph file %s.\n",
- bbg_file_name);
- exit (FATAL_EXIT_CODE);
- }
- {
- struct stat status;
+ bbg_file_name = xmalloc (length + strlen (GCOV_GRAPH_SUFFIX) + 1);
+ strcpy (bbg_file_name, name);
+ strcpy (bbg_file_name + length, GCOV_GRAPH_SUFFIX);
- if (!fstat (fileno (bb_file), &status))
- bb_file_time = status.st_mtime;
- }
+ da_file_name = xmalloc (length + strlen (GCOV_DATA_SUFFIX) + 1);
+ strcpy (da_file_name, name);
+ strcpy (da_file_name + length, GCOV_DATA_SUFFIX);
- /* If none of the functions in the file were executed, then there won't
- be a .da file. Just assume that all counts are zero in this case. */
- da_file = fopen (da_file_name, "rb");
- if (da_file == NULL)
- {
- fnotice (stderr, "Could not open data file %s.\n", da_file_name);
- fnotice (stderr, "Assuming that all execution counts are zero.\n");
- }
-
- /* Check for empty .bbg file. This indicates that there is no executable
- code in this source file. */
- /* Set the EOF condition if at the end of file. */
- ungetc (getc (bbg_file), bbg_file);
- if (feof (bbg_file))
- {
- fnotice (stderr, "No executable code associated with file %s.\n",
- input_file_name);
- exit (FATAL_EXIT_CODE);
- }
-}
-
-/* Initialize a new arc. */
-
-static void
-init_arc (arcptr, source, target, bb_graph)
- struct adj_list *arcptr;
- int source, target;
- struct bb_info *bb_graph;
-{
- arcptr->target = target;
- arcptr->source = source;
-
- arcptr->arc_count = 0;
- arcptr->count_valid = 0;
- arcptr->on_tree = 0;
- arcptr->fake = 0;
- arcptr->fall_through = 0;
-
- arcptr->succ_next = bb_graph[source].succ;
- bb_graph[source].succ = arcptr;
- bb_graph[source].succ_count++;
-
- arcptr->pred_next = bb_graph[target].pred;
- bb_graph[target].pred = arcptr;
- bb_graph[target].pred_count++;
+ return;
}
-/* Reverse the arcs on an arc list. */
+/* Read the graph file. Return non-zero on fatal error. */
-static struct adj_list *
-reverse_arcs (arcptr)
- struct adj_list *arcptr;
+static int
+read_graph_file ()
{
- struct adj_list *prev = 0;
- struct adj_list *next;
-
- for ( ; arcptr; arcptr = next)
+ FILE *file;
+ struct stat status;
+ unsigned magic, version;
+ unsigned current_tag = 0;
+ unsigned tag;
+ struct function_info *fn = NULL;
+ source_t *src = NULL;
+ unsigned ix;
+
+ file = fopen (bbg_file_name, "rb");
+ if (!file)
{
- next = arcptr->succ_next;
- arcptr->succ_next = prev;
- prev = arcptr;
+ fnotice (stderr, "%s:cannot open graph file\n", bbg_file_name);
+ return 1;
}
-
- return prev;
-}
-
-/* Reads profiles from the .da file and compute a hybrid profile. */
-
-static gcov_type *
-read_profile (function_name, cfg_checksum, instr_arcs)
- char *function_name;
- long cfg_checksum;
- int instr_arcs;
-{
- int i;
- int okay = 1;
- gcov_type *profile;
- char *function_name_buffer;
- int function_name_buffer_len;
-
- profile = xmalloc (sizeof (gcov_type) * instr_arcs);
- function_name_buffer_len = strlen (function_name) + 1;
- function_name_buffer = xmalloc (function_name_buffer_len + 1);
-
- for (i = 0; i < instr_arcs; i++)
- profile[i] = 0;
-
- if (!da_file)
- return profile;
-
- rewind (da_file);
- while (1)
+ if (!fstat (fileno (file), &status))
+ bbg_file_time = status.st_mtime;
+ if (gcov_read_unsigned (file, &magic) || magic != GCOV_GRAPH_MAGIC)
{
- long magic, extra_bytes;
- long func_count;
- int i;
+ fnotice (stderr, "%s:not a gcov graph file\n", bbg_file_name);
+ fclose (file);
+ return 1;
+ }
- if (__read_long (&magic, da_file, 4) != 0)
- break;
+ if (gcov_read_unsigned (file, &version) || version != GCOV_VERSION)
+ {
+ char v[4], e[4];
- if (magic != -123)
+ magic = GCOV_VERSION;
+
+ for (ix = 4; ix--; magic >>= 8, version >>= 8)
{
- okay = 0;
- break;
+ v[ix] = version;
+ e[ix] = magic;
}
+ fnotice (stderr, "%s:version `%.4s', prefer `%.4s'\n",
+ bbg_file_name, v, e);
+ }
+
+ while (!gcov_read_unsigned (file, &tag))
+ {
+ unsigned length;
+ long base;
- if (__read_long (&func_count, da_file, 4) != 0)
- {
- okay = 0;
- break;
- }
+ if (gcov_read_unsigned (file, &length))
+ goto corrupt;
- if (__read_long (&extra_bytes, da_file, 4) != 0)
+ base = gcov_save_position (file);
+
+ if (tag == GCOV_TAG_FUNCTION)
{
- okay = 0;
- break;
+ char *function_name = NULL;
+ unsigned checksum;
+
+ if (gcov_read_string (file, &function_name, NULL)
+ || gcov_read_unsigned (file, &checksum))
+ goto corrupt;
+ fn = (function_t *)xcalloc (1, sizeof (function_t));
+ fn->name = function_name;
+ fn->checksum = checksum;
+
+ fn->next = functions;
+ functions = fn;
+ current_tag = tag;
}
-
- /* skip extra data emited by __bb_exit_func. */
- fseek (da_file, extra_bytes, SEEK_CUR);
-
- for (i = 0; i < func_count; i++)
+ else if (fn && tag == GCOV_TAG_BLOCKS)
{
- long arc_count;
- long chksum;
- int j;
-
- if (__read_gcov_string
- (function_name_buffer, function_name_buffer_len, da_file,
- -1) != 0)
- {
- okay = 0;
- break;
- }
-
- if (__read_long (&chksum, da_file, 4) != 0)
+ if (fn->blocks)
+ fnotice (stderr, "%s:already seen blocks for `%s'\n",
+ bbg_file_name, fn->name);
+ else
{
- okay = 0;
- break;
+ fn->num_blocks = length / 4;
+ fn->blocks
+ = (block_t *)xcalloc (fn->num_blocks, sizeof (block_t));
}
-
- if (__read_long (&arc_count, da_file, 4) != 0)
+ }
+ else if (fn && tag == GCOV_TAG_ARCS)
+ {
+ unsigned src;
+ unsigned num_dests = (length - 4) / 8;
+ unsigned dest, flags;
+
+ if (gcov_read_unsigned (file, &src)
+ || src >= fn->num_blocks
+ || fn->blocks[src].succ)
+ goto corrupt;
+
+ while (num_dests--)
{
- okay = 0;
- break;
+ struct arc_info *arc;
+
+ if (gcov_read_unsigned (file, &dest)
+ || gcov_read_unsigned (file, &flags)
+ || dest >= fn->num_blocks)
+ goto corrupt;
+ arc = (arc_t *) xcalloc (1, sizeof (arc_t));
+
+ arc->dst = &fn->blocks[dest];
+ arc->src = &fn->blocks[src];
+
+ arc->count = 0;
+ arc->count_valid = 0;
+ arc->on_tree = !!(flags & GCOV_ARC_ON_TREE);
+ arc->fake = !!(flags & GCOV_ARC_FAKE);
+ arc->fall_through = !!(flags & GCOV_ARC_FALLTHROUGH);
+
+ arc->succ_next = fn->blocks[src].succ;
+ fn->blocks[src].succ = arc;
+ fn->blocks[src].num_succ++;
+
+ arc->pred_next = fn->blocks[dest].pred;
+ fn->blocks[dest].pred = arc;
+ fn->blocks[dest].num_pred++;
+
+ arc->is_call = arc->fake;
+
+ if (!arc->on_tree)
+ fn->num_counts++;
}
-
- if (strcmp (function_name_buffer, function_name) != 0
- || arc_count != instr_arcs || chksum != cfg_checksum)
+ }
+ else if (fn && tag == GCOV_TAG_LINES)
+ {
+ unsigned blockno;
+ unsigned *line_nos
+ = (unsigned *)xcalloc ((length - 4) / 4, sizeof (unsigned));
+
+ if (gcov_read_unsigned (file, &blockno)
+ || blockno >= fn->num_blocks
+ || fn->blocks[blockno].encoding)
+ goto corrupt;
+
+ for (ix = 0; ; )
{
- /* skip */
- if (fseek (da_file, arc_count * 8, SEEK_CUR) < 0)
+ unsigned lineno;
+
+ if (gcov_read_unsigned (file, &lineno))
+ goto corrupt;
+ if (lineno)
{
- okay = 0;
- break;
+ if (!ix)
+ {
+ line_nos[ix++] = 0;
+ line_nos[ix++] = src->index;
+ }
+ line_nos[ix++] = lineno;
+ if (lineno >= src->num_lines)
+ src->num_lines = lineno + 1;
}
- }
- else
- {
- gcov_type tmp;
-
- for (j = 0; j < arc_count; j++)
- if (__read_gcov_type (&tmp, da_file, 8) != 0)
- {
- okay = 0;
+ else
+ {
+ char *file_name = NULL;
+
+ if (gcov_read_string (file, &file_name, NULL))
+ goto corrupt;
+ if (!file_name)
break;
- }
- else
- {
- profile[j] += tmp;
- }
+ for (src = sources; src; src = src->next)
+ if (!strcmp (file_name, src->name))
+ {
+ free (file_name);
+ break;
+ }
+ if (!src)
+ {
+ src = (source_t *)xcalloc (1, sizeof (source_t));
+ src->name = file_name;
+ src->coverage.name = file_name;
+ src->index = sources ? sources->index + 1 : 1;
+ src->next = sources;
+ sources = src;
+ }
+ line_nos[ix++] = 0;
+ line_nos[ix++] = src->index;
+ }
}
+
+ fn->blocks[blockno].encoding = line_nos;
+ fn->blocks[blockno].num_encodings = ix;
+ }
+ else if (current_tag && !GCOV_TAG_IS_SUBTAG (current_tag, tag))
+ {
+ fn = NULL;
+ current_tag = 0;
+ }
+ if (gcov_resync (file, base, length))
+ {
+ corrupt:;
+ fnotice (stderr, "%s:corrupted\n", bbg_file_name);
+ fclose (file);
+ return 1;
}
-
- if (!okay)
- break;
-
}
+ fclose (file);
+
+ /* We built everything backwards, so nreverse them all */
+
+ /* Reverse sources. Not strictly necessary, but we'll then process
+ them in the 'expected' order. */
+ {
+ source_t *src, *src_p, *src_n;
+
+ for (src_p = NULL, src = sources; src; src_p = src, src = src_n)
+ {
+ src_n = src->next;
+ src->next = src_p;
+ }
+ sources = src_p;
+ }
- free (function_name_buffer);
+ /* Reverse functions. */
+ {
+ function_t *fn, *fn_p, *fn_n;
- if (!okay)
- {
- fprintf (stderr, ".da file corrupted!\n");
- free (profile);
- abort ();
- }
+ for (fn_p = NULL, fn = functions; fn; fn_p = fn, fn = fn_n)
+ {
+ unsigned ix;
+
+ fn_n = fn->next;
+ fn->next = fn_p;
- return profile;
+ /* Reverse the arcs */
+ for (ix = fn->num_blocks; ix--;)
+ {
+ arc_t *arc, *arc_p, *arc_n;
+
+ for (arc_p = NULL, arc = fn->blocks[ix].succ; arc;
+ arc_p = arc, arc = arc_n)
+ {
+ arc_n = arc->succ_next;
+ arc->succ_next = arc_p;
+ }
+ fn->blocks[ix].succ = arc_p;
+
+ for (arc_p = NULL, arc = fn->blocks[ix].pred; arc;
+ arc_p = arc, arc = arc_n)
+ {
+ arc_n = arc->pred_next;
+ arc->pred_next = arc_p;
+ }
+ fn->blocks[ix].pred = arc_p;
+ }
+ }
+ functions = fn_p;
+ }
+ return 0;
}
-/* Construct the program flow graph from the .bbg file, and read in the data
- in the .da file. */
+/* Reads profiles from the count file and attach to each
+ function. Return non-zero if fatal error. */
-static void
-create_program_flow_graph (bptr)
- struct bb_info_list *bptr;
+static int
+read_count_file ()
{
- long num_blocks, number_arcs, src, dest, flag_bits, num_arcs_per_block;
- int i;
- struct adj_list *arcptr;
- struct bb_info *bb_graph;
- long cfg_checksum;
- long instr_arcs = 0;
- gcov_type *profile;
- int profile_pos = 0;
- char *function_name;
- long function_name_len, tmp;
-
- /* Read function name. */
- __read_long (&tmp, bbg_file, 4); /* ignore -1. */
- __read_long (&function_name_len, bbg_file, 4);
- function_name = xmalloc (function_name_len + 1);
- fread (function_name, 1, function_name_len + 1, bbg_file);
-
- /* Skip padding. */
- tmp = (function_name_len + 1) % 4;
-
- if (tmp)
- fseek (bbg_file, 4 - tmp, SEEK_CUR);
-
- __read_long (&tmp, bbg_file, 4); /* ignore -1. */
-
- /* Read the cfg checksum. */
- __read_long (&cfg_checksum, bbg_file, 4);
-
- /* Read the number of blocks. */
- __read_long (&num_blocks, bbg_file, 4);
-
- /* Create an array of size bb number of bb_info structs. */
- bb_graph = (struct bb_info *) xcalloc (num_blocks, sizeof (struct bb_info));
-
- bptr->bb_graph = bb_graph;
- bptr->num_blocks = num_blocks;
-
- /* Read and create each arc from the .bbg file. */
- __read_long (&number_arcs, bbg_file, 4);
- for (i = 0; i < num_blocks; i++)
+ FILE *file;
+ unsigned ix;
+ char *function_name_buffer = NULL;
+ unsigned magic, version;
+ function_t *fn = NULL;
+
+ file = fopen (da_file_name, "rb");
+ if (!file)
{
- int j;
-
- __read_long (&num_arcs_per_block, bbg_file, 4);
- for (j = 0; j < num_arcs_per_block; j++)
+ fnotice (stderr, "%s:cannot open data file\n", da_file_name);
+ return 1;
+ }
+ if (gcov_read_unsigned (file, &magic) || magic != GCOV_DATA_MAGIC)
+ {
+ fnotice (stderr, "%s:not a gcov data file\n", da_file_name);
+ cleanup:;
+ free (function_name_buffer);
+ fclose (file);
+ return 1;
+ }
+ if (gcov_read_unsigned (file, &version) || version != GCOV_VERSION)
+ {
+ char v[4], e[4];
+
+ magic = GCOV_VERSION;
+ for (ix = 4; ix--; magic >>= 8, version >>= 8)
{
- if (number_arcs-- < 0)
- abort ();
-
- src = i;
- __read_long (&dest, bbg_file, 4);
-
- arcptr = (struct adj_list *) xmalloc (sizeof (struct adj_list));
- init_arc (arcptr, src, dest, bb_graph);
-
- __read_long (&flag_bits, bbg_file, 4);
- if (flag_bits & 0x1)
- arcptr->on_tree++;
- else
- instr_arcs++;
- arcptr->fake = !! (flag_bits & 0x2);
- arcptr->fall_through = !! (flag_bits & 0x4);
+ v[ix] = version;
+ e[ix] = magic;
}
+ fnotice (stderr, "%s:version `%.4s', prefer version `%.4s'\n",
+ da_file_name, v, e);
}
-
- if (number_arcs)
- abort ();
-
- /* Read and ignore the -1 separating the arc list from the arc list of the
- next function. */
- __read_long (&src, bbg_file, 4);
- if (src != -1)
- abort ();
-
- /* Must reverse the order of all succ arcs, to ensure that they match
- the order of the data in the .da file. */
-
- for (i = 0; i < num_blocks; i++)
- if (bb_graph[i].succ)
- bb_graph[i].succ = reverse_arcs (bb_graph[i].succ);
-
- /* Read profile from the .da file. */
-
- profile = read_profile (function_name, cfg_checksum, instr_arcs);
-
- /* For each arc not on the spanning tree, set its execution count from
- the .da file. */
-
- /* The first count in the .da file is the number of times that the function
- was entered. This is the exec_count for block zero. */
-
- /* This duplicates code in branch_prob in profile.c. */
-
- for (i = 0; i < num_blocks; i++)
- for (arcptr = bb_graph[i].succ; arcptr; arcptr = arcptr->succ_next)
- if (! arcptr->on_tree)
+
+ while (1)
+ {
+ unsigned tag, length;
+ long base;
+
+ if (gcov_read_unsigned (file, &tag)
+ || gcov_read_unsigned (file, &length))
{
- arcptr->arc_count = profile[profile_pos++];
- arcptr->count_valid = 1;
- bb_graph[i].succ_count--;
- bb_graph[arcptr->target].pred_count--;
+ if (feof (file))
+ break;
+
+ corrupt:;
+ fnotice (stderr, "%s:corrupted\n", da_file_name);
+ goto cleanup;
}
- free (profile);
- free (function_name);
-}
-
-static void
-solve_program_flow_graph (bptr)
- struct bb_info_list *bptr;
-{
- int passes, changes;
- gcov_type total;
- int i;
- struct adj_list *arcptr;
- struct bb_info *bb_graph;
- int num_blocks;
-
- num_blocks = bptr->num_blocks;
- bb_graph = bptr->bb_graph;
-
- /* For every block in the file,
- - if every exit/entrance arc has a known count, then set the block count
- - if the block count is known, and every exit/entrance arc but one has
- a known execution count, then set the count of the remaining arc
-
- As arc counts are set, decrement the succ/pred count, but don't delete
- the arc, that way we can easily tell when all arcs are known, or only
- one arc is unknown. */
-
- /* The order that the basic blocks are iterated through is important.
- Since the code that finds spanning trees starts with block 0, low numbered
- arcs are put on the spanning tree in preference to high numbered arcs.
- Hence, most instrumented arcs are at the end. Graph solving works much
- faster if we propagate numbers from the end to the start.
-
- This takes an average of slightly more than 3 passes. */
-
- changes = 1;
- passes = 0;
- while (changes)
- {
- passes++;
- changes = 0;
-
- for (i = num_blocks - 1; i >= 0; i--)
+ base = gcov_save_position (file);
+ if (tag == GCOV_TAG_FUNCTION)
{
- if (! bb_graph[i].count_valid)
+ unsigned checksum;
+ struct function_info *fn_n = functions;
+
+ if (gcov_read_string (file, &function_name_buffer, NULL)
+ || gcov_read_unsigned (file, &checksum))
+ goto corrupt;
+
+ for (fn = fn ? fn->next : NULL; ; fn = fn->next)
{
- if (bb_graph[i].succ_count == 0)
- {
- total = 0;
- for (arcptr = bb_graph[i].succ; arcptr;
- arcptr = arcptr->succ_next)
- total += arcptr->arc_count;
- bb_graph[i].exec_count = total;
- bb_graph[i].count_valid = 1;
- changes = 1;
- }
- else if (bb_graph[i].pred_count == 0)
+ if (fn)
+ ;
+ else if ((fn = fn_n))
+ fn_n = NULL;
+ else
{
- total = 0;
- for (arcptr = bb_graph[i].pred; arcptr;
- arcptr = arcptr->pred_next)
- total += arcptr->arc_count;
- bb_graph[i].exec_count = total;
- bb_graph[i].count_valid = 1;
- changes = 1;
+ fnotice (stderr, "%s:unknown function `%s'\n",
+ da_file_name, function_name_buffer);
+ break;
}
+ if (!strcmp (fn->name, function_name_buffer))
+ break;
}
- if (bb_graph[i].count_valid)
+
+ if (!fn)
+ ;
+ else if (checksum != fn->checksum)
{
- if (bb_graph[i].succ_count == 1)
- {
- total = 0;
- /* One of the counts will be invalid, but it is zero,
- so adding it in also doesn't hurt. */
- for (arcptr = bb_graph[i].succ; arcptr;
- arcptr = arcptr->succ_next)
- total += arcptr->arc_count;
- /* Calculate count for remaining arc by conservation. */
- total = bb_graph[i].exec_count - total;
- /* Search for the invalid arc, and set its count. */
- for (arcptr = bb_graph[i].succ; arcptr;
- arcptr = arcptr->succ_next)
- if (! arcptr->count_valid)
- break;
- if (! arcptr)
- abort ();
- arcptr->count_valid = 1;
- arcptr->arc_count = total;
- bb_graph[i].succ_count--;
-
- bb_graph[arcptr->target].pred_count--;
- changes = 1;
- }
- if (bb_graph[i].pred_count == 1)
- {
- total = 0;
- /* One of the counts will be invalid, but it is zero,
- so adding it in also doesn't hurt. */
- for (arcptr = bb_graph[i].pred; arcptr;
- arcptr = arcptr->pred_next)
- total += arcptr->arc_count;
- /* Calculate count for remaining arc by conservation. */
- total = bb_graph[i].exec_count - total;
- /* Search for the invalid arc, and set its count. */
- for (arcptr = bb_graph[i].pred; arcptr;
- arcptr = arcptr->pred_next)
- if (! arcptr->count_valid)
- break;
- if (! arcptr)
- abort ();
- arcptr->count_valid = 1;
- arcptr->arc_count = total;
- bb_graph[i].pred_count--;
-
- bb_graph[arcptr->source].succ_count--;
- changes = 1;
- }
+ mismatch:;
+ fnotice (stderr, "%s:profile mismatch for `%s'\n",
+ da_file_name, function_name_buffer);
+ goto cleanup;
}
}
+ else if (tag == GCOV_TAG_ARC_COUNTS && fn)
+ {
+ if (length != 8 * fn->num_counts)
+ goto mismatch;
+
+ if (!fn->counts)
+ fn->counts
+ = (gcov_type *)xcalloc (fn->num_counts, sizeof (gcov_type));
+
+ for (ix = 0; ix != fn->num_counts; ix++)
+ {
+ gcov_type count;
+
+ if (gcov_read_counter (file, &count))
+ goto corrupt;
+ fn->counts[ix] += count;
+ }
+ }
+ gcov_resync (file, base, length);
}
- /* If the graph has been correctly solved, every block will have a
- succ and pred count of zero. */
- for (i = 0; i < num_blocks; i++)
- if (bb_graph[i].succ_count || bb_graph[i].pred_count)
- abort ();
+ fclose (file);
+ free (function_name_buffer);
+ return 0;
}
+/* Solve the flow graph. Propagate counts from the instrumented arcs
+ to the blocks and the uninstrumented arcs. */
static void
-read_files ()
+solve_flow_graph (fn)
+ function_t *fn;
{
- struct stat buf;
- struct bb_info_list *list_end = 0;
- struct bb_info_list *b_ptr;
-
- while (! feof (bbg_file))
+ unsigned ix;
+ arc_t *arc;
+ gcov_type *count_ptr = fn->counts;
+ block_t *valid_blocks = NULL; /* valid, but unpropagated blocks. */
+ block_t *invalid_blocks = NULL; /* invalid, but inferable blocks. */
+
+ if (fn->num_blocks < 2)
+ fnotice (stderr, "%s:`%s' lacks entry and/or exit blocks\n",
+ bbg_file_name, fn->name);
+ else
{
- b_ptr = (struct bb_info_list *) xmalloc (sizeof (struct bb_info_list));
-
- b_ptr->next = 0;
- if (list_end)
- list_end->next = b_ptr;
+ if (fn->blocks[0].num_pred)
+ fnotice (stderr, "%s:`%s' has arcs to entry block\n",
+ bbg_file_name, fn->name);
else
- bb_graph_list = b_ptr;
- list_end = b_ptr;
-
- /* Read in the data in the .bbg file and reconstruct the program flow
- graph for one function. */
- create_program_flow_graph (b_ptr);
-
- /* Set the EOF condition if at the end of file. */
- ungetc (getc (bbg_file), bbg_file);
+ /* We can't deduce the entry block counts from the lack of
+ predecessors. */
+ fn->blocks[0].num_pred = ~(unsigned)0;
+
+ if (fn->blocks[fn->num_blocks - 1].num_succ)
+ fnotice (stderr, "%s:`%s' has arcs from exit block\n",
+ bbg_file_name, fn->name);
+ else
+ /* Likewise, we can't deduce exit block counts from the lack
+ of its successors. */
+ fn->blocks[fn->num_blocks - 1].num_succ = ~(unsigned)0;
}
- /* Calculate all of the basic block execution counts and branch
- taken probabilities. */
-
- for (b_ptr = bb_graph_list; b_ptr; b_ptr = b_ptr->next)
- solve_program_flow_graph (b_ptr);
-
- /* Read in all of the data from the .bb file. This info will be accessed
- sequentially twice. */
- stat (bb_file_name, &buf);
- bb_data_size = buf.st_size / 4;
-
- bb_data = (char *) xmalloc ((unsigned) buf.st_size);
- fread (bb_data, sizeof (char), buf.st_size, bb_file);
-
- fclose (bb_file);
- if (da_file)
- fclose (da_file);
- fclose (bbg_file);
-}
-
-
-/* Scan the data in the .bb file to find all source files referenced,
- and the largest line number mentioned in each one. */
-
-static void
-scan_for_source_files ()
-{
- struct sourcefile *s_ptr = NULL;
- char *ptr;
- long count;
- long line_num;
-
- /* Search the bb_data to find:
- 1) The number of sources files contained herein, and
- 2) The largest line number for each source file. */
-
- ptr = bb_data;
- sources = 0;
- for (count = 0; count < bb_data_size; count++)
+ /* Propagate the measured counts, this must be done in the same
+ order as the code in profile.c */
+ for (ix = 0; ix != fn->num_blocks; ix++)
{
- __fetch_long (&line_num, ptr, 4);
- ptr += 4;
- if (line_num == -1)
+ block_t const *prev_dst = NULL;
+ int out_of_order = 0;
+
+ for (arc = fn->blocks[ix].succ; arc; arc = arc->succ_next)
{
- /* A source file name follows. Check to see if we already have
- a sourcefile structure for this file. */
- s_ptr = sources;
- while (s_ptr && strcmp (s_ptr->name, ptr))
- s_ptr = s_ptr->next;
-
- if (s_ptr == 0)
+ if (!arc->on_tree)
{
- /* No sourcefile structure for this file name exists, create
- a new one, and append it to the front of the sources list. */
- s_ptr = (struct sourcefile *) xmalloc (sizeof(struct sourcefile));
- s_ptr->name = xstrdup (ptr);
- s_ptr->maxlineno = 0;
- s_ptr->next = sources;
- sources = s_ptr;
+ if (count_ptr)
+ arc->count = *count_ptr++;
+ arc->count_valid = 1;
+ fn->blocks[ix].num_succ--;
+ arc->dst->num_pred--;
}
-
- /* Scan past the file name. */
- {
- long delim;
- do {
- count++;
- __fetch_long (&delim, ptr, 4);
- ptr += 4;
- } while (delim != line_num);
- }
+ if (prev_dst && prev_dst > arc->dst)
+ out_of_order = 1;
+ prev_dst = arc->dst;
}
- else if (line_num == -2)
+
+ /* Sort the successor arcs into ascending dst order. profile.c
+ normally produces arcs in the right order, but sometimes with
+ one or two out of order. We're not using a particularly
+ smart sort. */
+ if (out_of_order)
{
- long delim;
-
- /* A function name follows. Ignore it. */
- do {
- count++;
- __fetch_long (&delim, ptr, 4);
- ptr += 4;
- } while (delim != line_num);
+ arc_t *start = fn->blocks[ix].succ;
+ unsigned changes = 1;
+
+ while (changes)
+ {
+ arc_t *arc, *arc_p, *arc_n;
+
+ changes = 0;
+ for (arc_p = NULL, arc = start; (arc_n = arc->succ_next);)
+ {
+ if (arc->dst > arc_n->dst)
+ {
+ changes = 1;
+ if (arc_p)
+ arc_p->succ_next = arc_n;
+ else
+ start = arc_n;
+ arc->succ_next = arc_n->succ_next;
+ arc_n->succ_next = arc;
+ arc_p = arc_n;
+ }
+ else
+ {
+ arc_p = arc;
+ arc = arc_n;
+ }
+ }
+ }
+ fn->blocks[ix].succ = start;
}
- /* There will be a zero before the first file name, in which case s_ptr
- will still be uninitialized. So, only try to set the maxlineno
- field if line_num is non-zero. */
- else if (line_num > 0)
+
+ /* Place it on the invalid chain, it will be ignored if that's
+ wrong. */
+ fn->blocks[ix].invalid_chain = 1;
+ fn->blocks[ix].chain = invalid_blocks;
+ invalid_blocks = &fn->blocks[ix];
+ }
+
+ while (invalid_blocks || valid_blocks)
+ {
+ block_t *blk;
+
+ while ((blk = invalid_blocks))
{
- if (s_ptr->maxlineno <= line_num)
- s_ptr->maxlineno = line_num + 1;
+ gcov_type total = 0;
+ const arc_t *arc;
+
+ invalid_blocks = blk->chain;
+ blk->invalid_chain = 0;
+ if (!blk->num_succ)
+ for (arc = blk->succ; arc; arc = arc->succ_next)
+ total += arc->count;
+ else if (!blk->num_pred)
+ for (arc = blk->pred; arc; arc = arc->pred_next)
+ total += arc->count;
+ else
+ continue;
+
+ blk->count = total;
+ blk->count_valid = 1;
+ blk->chain = valid_blocks;
+ blk->valid_chain = 1;
+ valid_blocks = blk;
}
- else if (line_num < 0)
+ while ((blk = valid_blocks))
{
- /* Don't know what this is, but it's garbage. */
- abort ();
+ gcov_type total;
+ arc_t *arc, *inv_arc;
+
+ valid_blocks = blk->chain;
+ blk->valid_chain = 0;
+ if (blk->num_succ == 1)
+ {
+ block_t *dst;
+
+ total = blk->count;
+ inv_arc = NULL;
+ for (arc = blk->succ; arc; arc = arc->succ_next)
+ {
+ total -= arc->count;
+ if (!arc->count_valid)
+ inv_arc = arc;
+ }
+ dst = inv_arc->dst;
+ inv_arc->count_valid = 1;
+ inv_arc->count = total;
+ blk->num_succ--;
+ dst->num_pred--;
+ if (dst->count_valid)
+ {
+ if (dst->num_pred == 1 && !dst->valid_chain)
+ {
+ dst->chain = valid_blocks;
+ dst->valid_chain = 1;
+ valid_blocks = dst;
+ }
+ }
+ else
+ {
+ if (!dst->num_pred && !dst->invalid_chain)
+ {
+ dst->chain = invalid_blocks;
+ dst->invalid_chain = 1;
+ invalid_blocks = dst;
+ }
+ }
+ }
+ if (blk->num_pred == 1)
+ {
+ block_t *src;
+
+ total = blk->count;
+ inv_arc = NULL;
+ for (arc = blk->pred; arc; arc = arc->pred_next)
+ {
+ total -= arc->count;
+ if (!arc->count_valid)
+ inv_arc = arc;
+ }
+ src = inv_arc->src;
+ inv_arc->count_valid = 1;
+ inv_arc->count = total;
+ blk->num_pred--;
+ src->num_succ--;
+ if (src->count_valid)
+ {
+ if (src->num_succ == 1 && !src->valid_chain)
+ {
+ src->chain = valid_blocks;
+ src->valid_chain = 1;
+ valid_blocks = src;
+ }
+ }
+ else
+ {
+ if (!src->num_succ && !src->invalid_chain)
+ {
+ src->chain = invalid_blocks;
+ src->invalid_chain = 1;
+ invalid_blocks = src;
+ }
+ }
+ }
}
}
+
+ /* If the graph has been correctly solved, every block will have a
+ valid count. */
+ for (ix = 0; ix < fn->num_blocks; ix++)
+ if (!fn->blocks[ix].count_valid)
+ {
+ fnotice (stderr, "%s:graph is unsolvable for `%s'\n",
+ bbg_file_name, fn->name);
+ break;
+ }
}
+
-/* Increment totals in FUNCTION according to arc A_PTR. */
+/* Increment totals in COVERAGE according to arc ARC. */
static void
-accumulate_branch_counts (function, a_ptr)
- struct coverage *function;
- struct arcdata *a_ptr;
+add_branch_counts (coverage, arc)
+ coverage_t *coverage;
+ const arc_t *arc;
{
- if (a_ptr->call_insn)
+ if (arc->is_call)
{
- function->calls++;
- if (a_ptr->total)
- function->calls_executed++;
+ coverage->calls++;
+ if (arc->src->count)
+ coverage->calls_executed++;
}
else
{
- function->branches++;
- if (a_ptr->total)
- function->branches_executed++;
- if (a_ptr->hits)
- function->branches_taken++;
- }
-}
-
-/* Calculate the branch taken probabilities for all arcs branches at the
- end of this block. */
-
-static void
-calculate_branch_probs (block_ptr, line_info, function)
- struct bb_info *block_ptr;
- struct line_info *line_info;
- struct coverage *function;
-{
- gcov_type total;
- struct adj_list *arcptr;
-
- total = block_ptr->exec_count;
- for (arcptr = block_ptr->succ; arcptr; arcptr = arcptr->succ_next)
- {
- struct arcdata *a_ptr;
-
- /* Ignore fall through arcs as they aren't really branches. */
- if (arcptr->fall_through)
- continue;
-
- a_ptr = (struct arcdata *) xmalloc (sizeof (struct arcdata));
- a_ptr->total = total;
- a_ptr->hits = total ? arcptr->arc_count : 0;
- a_ptr->call_insn = arcptr->fake;
-
- if (function)
- accumulate_branch_counts (function, a_ptr);
- /* Prepend the new branch to the list. */
- a_ptr->next = line_info->branches;
- line_info->branches = a_ptr;
+ coverage->branches++;
+ if (arc->src->count)
+ coverage->branches_executed++;
+ if (arc->count)
+ coverage->branches_taken++;
}
}
@@ -1134,8 +1217,8 @@ calculate_branch_probs (block_ptr, line_info, function)
format TOP. Return pointer to a static string. */
static char const *
-format_hwint (top, bottom, dp)
- HOST_WIDEST_INT top, bottom;
+format_gcov (top, bottom, dp)
+ gcov_type top, bottom;
int dp;
{
static char buffer[20];
@@ -1169,7 +1252,7 @@ format_hwint (top, bottom, dp)
}
}
else
- sprintf (buffer, HOST_WIDEST_INT_PRINT_DEC, top);
+ sprintf (buffer, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT)top);
return buffer;
}
@@ -1178,42 +1261,40 @@ format_hwint (top, bottom, dp)
/* Output summary info for a function. */
static void
-function_summary (function, title)
- struct coverage *function;
+function_summary (coverage, title)
+ const coverage_t *coverage;
const char *title;
{
- if (function->lines)
- fnotice (stdout, "%s of %d lines executed in %s %s\n",
- format_hwint (function->lines_executed,
- function->lines, 2),
- function->lines, title, function->name);
+ fnotice (stdout, "%s `%s'\n", title, coverage->name);
+
+ if (coverage->lines)
+ fnotice (stdout, "Lines executed:%s of %d\n",
+ format_gcov (coverage->lines_executed, coverage->lines, 2),
+ coverage->lines);
else
- fnotice (stdout, "No executable lines in %s %s\n",
- title, function->name);
+ fnotice (stdout, "No executable lines");
- if (output_branch_probs)
+ if (flag_branches)
{
- if (function->branches)
+ if (coverage->branches)
{
- fnotice (stdout, "%s of %d branches executed in %s %s\n",
- format_hwint (function->branches_executed,
- function->branches, 2),
- function->branches, title, function->name);
- fnotice (stdout,
- "%s of %d branches taken at least once in %s %s\n",
- format_hwint (function->branches_taken,
- function->branches, 2),
- function->branches, title, function->name);
+ fnotice (stdout, "Branches executed:%s of %d\n",
+ format_gcov (coverage->branches_executed,
+ coverage->branches, 2),
+ coverage->branches);
+ fnotice (stdout, "Taken at least once:%s of %d\n",
+ format_gcov (coverage->branches_taken,
+ coverage->branches, 2),
+ coverage->branches);
}
else
- fnotice (stdout, "No branches in %s %s\n", title, function->name);
- if (function->calls)
- fnotice (stdout, "%s of %d calls executed in %s %s\n",
- format_hwint (function->calls_executed,
- function->calls, 2),
- function->calls, title, function->name);
+ fnotice (stdout, "No branches\n");
+ if (coverage->calls)
+ fnotice (stdout, "Calls executed:%s of %d\n",
+ format_gcov (coverage->calls_executed, coverage->calls, 2),
+ coverage->calls);
else
- fnotice (stdout, "No calls in %s %s\n", title, function->name);
+ fnotice (stdout, "No calls\n");
}
}
@@ -1225,31 +1306,30 @@ function_summary (function, title)
to each output name (except when the current source file is the
input file, so you don't get a double concatenation). The two
components are separated by '##'. Also '.' filename components are
- removed and '..' components are renamed to '^'. */
+ removed and '..' components are renamed to '^'. */
static char *
-make_gcov_file_name (src_name)
- char *src_name;
+make_gcov_file_name (input_name, src_name)
+ const char *input_name;
+ const char *src_name;
{
char *cptr;
- char *name = xmalloc (strlen (src_name) + strlen (input_file_name) + 10);
+ char *name = xmalloc (strlen (src_name) + strlen (input_name) + 10);
name[0] = 0;
- if (output_long_names && strcmp (src_name, input_file_name))
+ if (flag_long_names && strcmp (src_name, input_name))
{
/* Generate the input filename part. */
- cptr = preserve_paths ? NULL : strrchr (input_file_name, '/');
- cptr = cptr ? cptr + 1 : input_file_name;
- strcat (name, cptr);
+ cptr = flag_preserve_paths ? NULL : strrchr (input_name, '/');
+ strcat (name, cptr ? cptr + 1 : input_name);
strcat (name, "##");
}
- /* Generate the source filename part. */
- cptr = preserve_paths ? NULL : strrchr (src_name, '/');
- cptr = cptr ? cptr + 1 : src_name;
- strcat (name, cptr);
+ /* Generate the source filename part. */
+ cptr = flag_preserve_paths ? NULL : strrchr (src_name, '/');
+ strcat (name, cptr ? cptr + 1 : src_name);
- if (preserve_paths)
+ if (flag_preserve_paths)
{
/* Convert '/' to '#', remove '/./', convert '/../' to '/^/' */
char *prev;
@@ -1281,166 +1361,106 @@ make_gcov_file_name (src_name)
}
}
- /* Don't strip off the ending for compatibility with tcov, since
- this results in confusion if there is more than one file with the
- same basename, e.g. tmp.c and tmp.h. */
strcat (name, ".gcov");
return name;
}
-/* Scan through the bb_data, and when the file name matches the
- source file name, then for each following line number, increment
+/* Scan through the bb_data for each line in the block, increment
the line number execution count indicated by the execution count of
the appropriate basic block. */
static void
-init_line_info (line_info, total, maxlineno)
- struct line_info *line_info;
- struct coverage *total;
- long maxlineno;
+add_line_counts (coverage, fn)
+ coverage_t *coverage;
+ const function_t *fn;
{
- long block_num = 0; /* current block number */
- struct bb_info *block_ptr = NULL; /* current block ptr */
- struct coverage function;
- struct coverage *func_ptr = NULL;
- struct bb_info_list *current_graph = NULL; /* Graph for current function. */
- int is_this_file = 0; /* We're scanning a block from the desired file. */
- char *ptr = bb_data;
- long count;
- long line_num;
- struct line_info *line_ptr = 0; /* line info ptr. */
-
- memset (&function, 0, sizeof (function));
- if (output_function_summary)
- func_ptr = &function;
-
- for (count = 0; count < bb_data_size; count++)
+ unsigned ix;
+ line_t *line = NULL; /* this is propagated from one iteration to the
+ next. */
+
+ /* Scan each basic block. */
+ for (ix = 0; ix != fn->num_blocks; ix++)
{
- __fetch_long (&line_num, ptr, 4);
- ptr += 4;
- if (line_num < 0)
- {
- long delim;
-
- if (line_num == -1)
- {
- /* Marks the beginning of a file name. Check to see
- whether this is the filename we are currently
- collecting data for. */
- is_this_file = !strcmp (total->name, ptr);
- }
- else if (line_num == -2)
- {
- /* Marks the start of a new function. Advance to the
- next program flow graph. */
- if (!current_graph)
- current_graph = bb_graph_list;
- else
- {
- if (block_num == current_graph->num_blocks - 1)
- /* Last block falls through to exit. */
- ;
- else if (block_num == current_graph->num_blocks - 2)
- {
- if (output_branch_probs && is_this_file)
- calculate_branch_probs (block_ptr, line_ptr, func_ptr);
- }
- else
- {
- fnotice (stderr,
- "didn't use all bb entries of graph, function %s\n",
- function.name);
- fnotice (stderr, "block_num = %ld, num_blocks = %d\n",
- block_num, current_graph->num_blocks);
- }
- if (func_ptr && is_this_file)
- function_summary (func_ptr, "function");
- current_graph = current_graph->next;
- }
- block_num = 0;
- block_ptr = current_graph->bb_graph;
- memset (&function, 0, sizeof (function));
- function.name = ptr;
- }
- else
- {
- fnotice (stderr, "ERROR: unexpected line number %ld\n", line_num);
- abort ();
- }
+ const block_t *block = &fn->blocks[ix];
+ unsigned *encoding;
+ const source_t *src = NULL;
+ unsigned jx;
+
+ for (jx = 0, encoding = block->encoding;
+ jx != block->num_encodings; jx++, encoding++)
+ if (!*encoding)
+ {
+ unsigned src_n = *++encoding;
- /* Scan past the string. */
- for (delim = 0; delim != line_num; count++)
- {
- __fetch_long (&delim, ptr, 4);
- ptr += 4;
- }
- }
- else if (!line_num)
+ for (src = sources; src->index != src_n; src = src->next)
+ continue;
+ jx++;
+ }
+ else
+ {
+ line = &src->lines[*encoding];
+
+ if (coverage)
+ {
+ if (!line->exists)
+ coverage->lines++;
+ if (!line->count && block->count)
+ coverage->lines_executed++;
+ }
+ line->exists = 1;
+ line->count += block->count;
+ }
+
+ if (line && flag_branches)
{
- /* Marks the end of a block. */
- if (block_num >= current_graph->num_blocks)
- {
- fnotice (stderr, "ERROR: too many basic blocks in function %s\n",
- function.name);
- abort ();
- }
-
- if (output_branch_probs && is_this_file)
- calculate_branch_probs (block_ptr, line_ptr, func_ptr);
+ arc_t *arc;
- block_num++;
- block_ptr++;
- }
- else if (is_this_file)
- {
- if (line_num >= maxlineno)
- {
- fnotice (stderr, "ERROR: out of range line number in function %s\n",
- function.name);
- abort ();
- }
-
- line_ptr = &line_info[line_num];
- if (func_ptr)
+ for (arc = block->succ; arc; arc = arc->succ_next)
{
- if (!line_ptr->exists)
- func_ptr->lines++;
- if (!line_ptr->count && block_ptr->exec_count)
- func_ptr->lines_executed++;
+ /* Ignore fall through arcs as they aren't really branches. */
+ if (arc->fall_through)
+ continue;
+
+ arc->line_next = line->branches;
+ line->branches = arc;
+ if (coverage)
+ add_branch_counts (coverage, arc);
}
-
- /* Accumulate execution data for this line number. */
- line_ptr->count += block_ptr->exec_count;
- line_ptr->exists = 1;
}
}
+ if (!line)
+ fnotice (stderr, "%s:no lines for `%s'\n", bbg_file_name, fn->name);
+}
+
+/* Accumulate the line counts of a file. */
+
+static void
+accumulate_line_counts (src)
+ source_t *src;
+{
+ line_t *line;
+ unsigned ix;
- if (func_ptr && is_this_file)
- function_summary (func_ptr, "function");
-
- /* Calculate summary test coverage statistics. */
- for (line_num = 1, line_ptr = &line_info[line_num];
- line_num < maxlineno; line_num++, line_ptr++)
+ for (ix = src->num_lines, line = src->lines; ix--; line++)
{
- struct arcdata *a_ptr, *prev, *next;
+ arc_t *arc, *arc_p, *arc_n;
- if (line_ptr->exists)
+ /* Total and reverse the branch information. */
+ for (arc = line->branches, arc_p = NULL; arc; arc_p = arc, arc = arc_n)
{
- total->lines++;
- if (line_ptr->count)
- total->lines_executed++;
+ arc_n = arc->line_next;
+ arc->line_next = arc_p;
+
+ add_branch_counts (&src->coverage, arc);
}
+ line->branches = arc_p;
- /* Total and reverse the branch information. */
- for (a_ptr = line_ptr->branches, prev = NULL; a_ptr; a_ptr = next)
+ if (line->exists)
{
- next = a_ptr->next;
- a_ptr->next = prev;
- prev = a_ptr;
-
- accumulate_branch_counts (total, a_ptr);
+ src->coverage.lines++;
+ if (line->count)
+ src->coverage.lines_executed++;
}
- line_ptr->branches = prev;
}
}
@@ -1449,25 +1469,24 @@ init_line_info (line_info, total, maxlineno)
information. */
static void
-output_line_info (gcov_file, line_info, total, maxlineno)
+output_lines (gcov_file, src)
FILE *gcov_file;
- const struct line_info *line_info;
- const struct coverage *total;
- long maxlineno;
+ const source_t *src;
{
FILE *source_file;
- long line_num; /* current line number */
- const struct line_info *line_ptr; /* current line info ptr. */
- char string[STRING_SIZE]; /* line buffer. */
- char const *retval = ""; /* status of source file reading. */
-
- fprintf (gcov_file, "%9s:%5d:Source:%s\n", "-", 0, total->name);
- fprintf (gcov_file, "%9s:%5d:Object:%s\n", "-", 0, bb_file_name);
+ unsigned line_num; /* current line number. */
+ const line_t *line; /* current line info ptr. */
+ char string[STRING_SIZE]; /* line buffer. */
+ char const *retval = ""; /* status of source file reading. */
+
+ fprintf (gcov_file, "%9s:%5d:Source:%s\n", "-", 0, src->name);
+ fprintf (gcov_file, "%9s:%5d:Graph:%s\n", "-", 0, bbg_file_name);
+ fprintf (gcov_file, "%9s:%5d:Data:%s\n", "-", 0, da_file_name);
- source_file = fopen (total->name, "r");
+ source_file = fopen (src->name, "r");
if (!source_file)
{
- fnotice (stderr, "Could not open source file %s.\n", total->name);
+ fnotice (stderr, "%s:cannot open source file\n", src->name);
retval = NULL;
}
else
@@ -1475,17 +1494,17 @@ output_line_info (gcov_file, line_info, total, maxlineno)
struct stat status;
if (!fstat (fileno (source_file), &status)
- && status.st_mtime > bb_file_time)
+ && status.st_mtime > bbg_file_time)
{
- fnotice (stderr, "Warning: source file %s is newer than %s\n",
- total->name, bb_file_name);
- fprintf (gcov_file, "%9s:%5d:Source is newer than compiler output\n",
+ fnotice (stderr, "%s:source file is newer than graph file `%s'\n",
+ src->name, bbg_file_name);
+ fprintf (gcov_file, "%9s:%5d:Source is newer than graph\n",
"-", 0);
}
}
- for (line_num = 1, line_ptr = &line_info[line_num];
- line_num < maxlineno; line_num++, line_ptr++)
+ for (line_num = 1, line = &src->lines[line_num];
+ line_num < src->num_lines; line_num++, line++)
{
/* For lines which don't exist in the .bb file, print '-' before
the source line. For lines which exist but were never
@@ -1493,10 +1512,9 @@ output_line_info (gcov_file, line_info, total, maxlineno)
print the execution count before the source line. There are
16 spaces of indentation added before the source line so that
tabs won't be messed up. */
- fprintf (gcov_file, "%9s:%5ld:",
- !line_ptr->exists ? "-"
- : !line_ptr->count ? "#####"
- : format_hwint (line_ptr->count, 0, -1), line_num);
+ fprintf (gcov_file, "%9s:%5u:",
+ !line->exists ? "-" : !line->count ? "#####"
+ : format_gcov (line->count, 0, -1), line_num);
if (retval)
{
@@ -1506,9 +1524,7 @@ output_line_info (gcov_file, line_info, total, maxlineno)
retval = fgets (string, STRING_SIZE, source_file);
if (!retval)
{
- fnotice (stderr,
- "Unexpected EOF while reading source file %s.\n",
- total->name);
+ fnotice (stderr, "%s:unexpected EOF\n", src->name);
break;
}
fputs (retval, gcov_file);
@@ -1518,34 +1534,33 @@ output_line_info (gcov_file, line_info, total, maxlineno)
if (!retval)
fputs ("??\n", gcov_file);
- if (output_branch_probs)
+ if (flag_branches)
{
- int i;
- struct arcdata *a_ptr;
+ int ix;
+ arc_t *arc;
- for (i = 0, a_ptr = line_ptr->branches; a_ptr;
- a_ptr = a_ptr->next, i++)
+ for (ix = 0, arc = line->branches; arc; arc = arc->line_next, ix++)
{
- if (a_ptr->call_insn)
+ if (arc->is_call)
{
- if (a_ptr->total == 0)
- fnotice (gcov_file, "call %2d never executed\n", i);
- else
+ if (arc->src->count)
fnotice
- (gcov_file, "call %2d returns %s\n", i,
- format_hwint (a_ptr->total - a_ptr->hits,
- a_ptr->total,
- -output_branch_counts));
+ (gcov_file, "call %2d returns %s\n", ix,
+ format_gcov (arc->src->count - arc->count,
+ arc->src->count,
+ -flag_counts));
+ else
+ fnotice (gcov_file, "call %2d never executed\n", ix);
}
else
{
- if (a_ptr->total == 0)
- fnotice (gcov_file, "branch %2d never executed\n", i);
- else
+ if (arc->src->count)
fnotice
- (gcov_file, "branch %2d taken %s\n", i,
- format_hwint (a_ptr->hits, a_ptr->total,
- -output_branch_counts));
+ (gcov_file, "branch %2d taken %s\n", ix,
+ format_gcov (arc->count, arc->src->count,
+ -flag_counts));
+ else
+ fnotice (gcov_file, "branch %2d never executed\n", ix);
}
}
}
@@ -1557,7 +1572,7 @@ output_line_info (gcov_file, line_info, total, maxlineno)
{
for (; (retval = fgets (string, STRING_SIZE, source_file)); line_num++)
{
- fprintf (gcov_file, "%9s:%5ld:%s", "-", line_num, retval);
+ fprintf (gcov_file, "%9s:%5u:%s", "-", line_num, retval);
while (!retval[0] || retval[strlen (retval) - 1] != '\n')
{
@@ -1572,63 +1587,3 @@ output_line_info (gcov_file, line_info, total, maxlineno)
if (source_file)
fclose (source_file);
}
-
-/* Calculate line execution counts, and output a .gcov file for source
- file S_PTR. Allocate an array big enough to hold a count for each
- line. Scan through the bb_data, and when the file name matches the
- current file name, then for each following line number, increment
- the line number execution count indicated by the execution count of
- the appropriate basic block. */
-
-static void
-output_data (s_ptr)
- struct sourcefile *s_ptr;
-{
- struct line_info *line_info /* line info data */
- = (struct line_info *) xcalloc (s_ptr->maxlineno,
- sizeof (struct line_info));
- long line_num;
- struct coverage total;
-
- memset (&total, 0, sizeof (total));
- total.name = s_ptr->name;
-
- init_line_info (line_info, &total, s_ptr->maxlineno);
- function_summary (&total, "file");
-
- if (output_gcov_file)
- {
- /* Now the statistics are ready. Read in the source file one
- line at a time, and output that line to the gcov file
- preceded by its execution information. */
-
- char *gcov_file_name = make_gcov_file_name (total.name);
- FILE *gcov_file = fopen (gcov_file_name, "w");
-
- if (gcov_file)
- {
- fnotice (stdout, "Creating %s.\n", gcov_file_name);
- output_line_info (gcov_file, line_info, &total, s_ptr->maxlineno);
- if (ferror (gcov_file))
- fnotice (stderr, "Error writing output file %s.\n",
- gcov_file_name);
- fclose (gcov_file);
- }
- else
- fnotice (stderr, "Could not open output file %s.\n", gcov_file_name);
- free (gcov_file_name);
- }
-
- /* Free data. */
- for (line_num = 1; line_num != s_ptr->maxlineno; line_num++)
- {
- struct arcdata *branch, *next;
-
- for (branch = line_info[line_num].branches; branch; branch = next)
- {
- next = branch->next;
- free (branch);
- }
- }
- free (line_info);
-}
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 2af1122282a..4d93f643e6a 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -297,12 +297,12 @@ static FILE *debug_stderr;
/* An obstack for our working variables. */
static struct obstack gcse_obstack;
-/* Non-zero for each mode that supports (set (reg) (reg)).
+/* Nonzero for each mode that supports (set (reg) (reg)).
This is trivially true for integer and floating point values.
It may or may not be true for condition codes. */
static char can_copy_p[(int) NUM_MACHINE_MODES];
-/* Non-zero if can_copy_p has been initialized. */
+/* Nonzero if can_copy_p has been initialized. */
static int can_copy_init_p;
struct reg_use {rtx reg_rtx; };
@@ -344,9 +344,9 @@ struct occr
struct occr *next;
/* The insn that computes the expression. */
rtx insn;
- /* Non-zero if this [anticipatable] occurrence has been deleted. */
+ /* Nonzero if this [anticipatable] occurrence has been deleted. */
char deleted_p;
- /* Non-zero if this [available] occurrence has been copied to
+ /* Nonzero if this [available] occurrence has been copied to
reaching_reg. */
/* ??? This is mutually exclusive with deleted_p, so they could share
the same byte. */
@@ -719,10 +719,6 @@ gcse_main (f, file)
/* Point to release obstack data from for each pass. */
char *gcse_obstack_bottom;
- /* Insertion of instructions on edges can create new basic blocks; we
- need the original basic block count so that we can properly deallocate
- arrays sized on the number of basic blocks originally in the cfg. */
- int orig_bb_count;
/* We do not construct an accurate cfg in functions which call
setjmp, so just punt to be safe. */
if (current_function_calls_setjmp)
@@ -742,7 +738,6 @@ gcse_main (f, file)
if (file)
dump_flow_info (file);
- orig_bb_count = n_basic_blocks;
/* Return if there's nothing to do. */
if (n_basic_blocks <= 1)
return 0;
@@ -841,7 +836,6 @@ gcse_main (f, file)
= (rtx *) gmalloc (last_basic_block * sizeof (rtx));
memset ((char *) modify_mem_list, 0, last_basic_block * sizeof (rtx));
memset ((char *) canon_modify_mem_list, 0, last_basic_block * sizeof (rtx));
- orig_bb_count = n_basic_blocks;
}
free_reg_set_mem ();
alloc_reg_set_mem (max_reg_num ());
@@ -1157,7 +1151,7 @@ compute_local_properties (transp, comp, antloc, table)
compute_transp (expr->expr, indx, transp, table->set_p);
/* The occurrences recorded in antic_occr are exactly those that
- we want to set to non-zero in ANTLOC. */
+ we want to set to nonzero in ANTLOC. */
if (antloc)
for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
{
@@ -1169,7 +1163,7 @@ compute_local_properties (transp, comp, antloc, table)
}
/* The occurrences recorded in avail_occr are exactly those that
- we want to set to non-zero in COMP. */
+ we want to set to nonzero in COMP. */
if (comp)
for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
{
@@ -1341,7 +1335,7 @@ want_to_gcse_p (x)
&& (num_clobbers == 0 || ! added_clobbers_hard_reg_p (icode)));
}
-/* Return non-zero if the operands of expression X are unchanged from the
+/* Return nonzero if the operands of expression X are unchanged from the
start of INSN's basic block up to but not including INSN (if AVAIL_P == 0),
or from INSN to the end of INSN's basic block (if AVAIL_P != 0). */
@@ -1524,7 +1518,7 @@ load_killed_in_block_p (bb, uid_limit, x, avail_p)
return 0;
}
-/* Return non-zero if the operands of expression X are unchanged from
+/* Return nonzero if the operands of expression X are unchanged from
the start of INSN's basic block up to but not including INSN. */
static int
@@ -1534,7 +1528,7 @@ oprs_anticipatable_p (x, insn)
return oprs_unchanged_p (x, insn, 0);
}
-/* Return non-zero if the operands of expression X are unchanged from
+/* Return nonzero if the operands of expression X are unchanged from
INSN to the end of INSN's basic block. */
static int
@@ -1787,7 +1781,7 @@ hash_set (regno, hash_table_size)
return hash % hash_table_size;
}
-/* Return non-zero if exp1 is equivalent to exp2.
+/* Return nonzero if exp1 is equivalent to exp2.
??? Borrowed from cse.c. Might want to remerge with cse.c. Later. */
static int
@@ -1937,8 +1931,8 @@ expr_equiv_p (x, y)
MODE is the mode of the value X is being stored into.
It is only used if X is a CONST_INT.
- ANTIC_P is non-zero if X is an anticipatable expression.
- AVAIL_P is non-zero if X is an available expression. */
+ ANTIC_P is nonzero if X is an anticipatable expression.
+ AVAIL_P is nonzero if X is an available expression. */
static void
insert_expr_in_table (x, mode, insn, antic_p, avail_p, table)
@@ -2255,7 +2249,7 @@ hash_scan_call (x, insn, table)
that isn't dealt with right now. The trick is handling the CLOBBERs that
are also in the PARALLEL. Later.
- If SET_P is non-zero, this is for the assignment hash table,
+ If SET_P is nonzero, this is for the assignment hash table,
otherwise it is for the expression hash table.
If IN_LIBCALL_BLOCK nonzero, we are in a libcall block, and should
not record any expressions. */
@@ -2740,7 +2734,7 @@ reset_opr_set_tables ()
clear_modify_mem_tables ();
}
-/* Return non-zero if the operands of X are not set before INSN in
+/* Return nonzero if the operands of X are not set before INSN in
INSN's basic block. */
static int
@@ -3068,7 +3062,7 @@ compute_ae_gen (expr_hash_table)
SET_BIT (ae_gen[BLOCK_NUM (occr->insn)], expr->bitmap_index);
}
-/* Return non-zero if expression X is killed in BB. */
+/* Return nonzero if expression X is killed in BB. */
static int
expr_killed_p (x, bb)
@@ -3157,9 +3151,9 @@ compute_ae_kill (ae_gen, ae_kill, expr_hash_table)
/* Actually perform the Classic GCSE optimizations. */
-/* Return non-zero if occurrence OCCR of expression EXPR reaches block BB.
+/* Return nonzero if occurrence OCCR of expression EXPR reaches block BB.
- CHECK_SELF_LOOP is non-zero if we should consider a block reaching itself
+ CHECK_SELF_LOOP is nonzero if we should consider a block reaching itself
as a positive reach. We want to do this when there are two computations
of the expression in the block.
@@ -3318,7 +3312,7 @@ computing_insn (expr, insn)
}
}
-/* Return non-zero if the definition in DEF_INSN can reach INSN.
+/* Return nonzero if the definition in DEF_INSN can reach INSN.
Only called by can_disregard_other_sets. */
static int
@@ -3352,7 +3346,7 @@ def_reaches_here_p (insn, def_insn)
return 0;
}
-/* Return non-zero if *ADDR_THIS_REG can only have one value at INSN. The
+/* Return nonzero if *ADDR_THIS_REG can only have one value at INSN. The
value returned is the number of definitions that reach INSN. Returning a
value of zero means that [maybe] more than one definition reaches INSN and
the caller can't perform whatever optimization it is trying. i.e. it is
@@ -3404,7 +3398,7 @@ can_disregard_other_sets (addr_this_reg, insn, for_combine)
/* Expression computed by insn is available and the substitution is legal,
so try to perform the substitution.
- The result is non-zero if any changes were made. */
+ The result is nonzero if any changes were made. */
static int
handle_avail_expr (insn, expr)
@@ -3562,7 +3556,7 @@ handle_avail_expr (insn, expr)
/* Perform classic GCSE. This is called by one_classic_gcse_pass after all
the dataflow analysis has been done.
- The result is non-zero if a change was made. */
+ The result is nonzero if a change was made. */
static int
classic_gcse ()
@@ -3621,7 +3615,7 @@ classic_gcse ()
/* Top level routine to perform one classic GCSE pass.
- Return non-zero if a change was made. */
+ Return nonzero if a change was made. */
static int
one_classic_gcse_pass (pass)
@@ -3917,7 +3911,7 @@ find_used_regs (xptr, data)
}
/* Try to replace all non-SET_DEST occurrences of FROM in INSN with TO.
- Returns non-zero is successful. */
+ Returns nonzero is successful. */
static int
try_replace_reg (from, to, insn)
@@ -4054,7 +4048,9 @@ cprop_jump (bb, setcc, jump, from, src)
/* First substitute in the INSN condition as the SET_SRC of the JUMP,
then substitute that given values in this expanded JUMP. */
- if (setcc != NULL)
+ if (setcc != NULL
+ && !modified_between_p (from, setcc, jump)
+ && !modified_between_p (src, setcc, jump))
{
rtx setcc_set = single_set (setcc);
new_set = simplify_replace_rtx (SET_SRC (set),
@@ -4068,7 +4064,7 @@ cprop_jump (bb, setcc, jump, from, src)
/* If no simplification can be made, then try the next
register. */
- if (rtx_equal_p (new, new_set))
+ if (rtx_equal_p (new, new_set) || rtx_equal_p (new, SET_SRC (set)))
return 0;
/* If this is now a no-op delete it, otherwise this must be a valid insn. */
@@ -4076,6 +4072,11 @@ cprop_jump (bb, setcc, jump, from, src)
delete_insn (jump);
else
{
+ /* Ensure the value computed inside the jump insn to be equivalent
+ to one computed by setcc. */
+ if (setcc
+ && modified_in_p (new, setcc))
+ return 0;
if (! validate_change (jump, &SET_SRC (set), new, 0))
return 0;
@@ -4146,7 +4147,7 @@ constprop_register (insn, from, to, alter_jumps)
}
/* Perform constant and copy propagation on INSN.
- The result is non-zero if a change was made. */
+ The result is nonzero if a change was made. */
static int
cprop_insn (insn, alter_jumps)
@@ -4244,6 +4245,7 @@ cprop_insn (insn, alter_jumps)
/* LIBCALL_SP is a zero-terminated array of insns at the end of a libcall;
their REG_EQUAL notes need updating. */
+
static bool
do_local_cprop (x, insn, alter_jumps, libcall_sp)
rtx x;
@@ -4253,10 +4255,12 @@ do_local_cprop (x, insn, alter_jumps, libcall_sp)
{
rtx newreg = NULL, newcnst = NULL;
- /* Rule out USE instructions and ASM statements as we don't want to change the hard registers mentioned. */
+ /* Rule out USE instructions and ASM statements as we don't want to
+ change the hard registers mentioned. */
if (GET_CODE (x) == REG
&& (REGNO (x) >= FIRST_PSEUDO_REGISTER
- || (GET_CODE (PATTERN (insn)) != USE && asm_noperands (PATTERN (insn)) < 0)))
+ || (GET_CODE (PATTERN (insn)) != USE
+ && asm_noperands (PATTERN (insn)) < 0)))
{
cselib_val *val = cselib_lookup (x, GET_MODE (x), 0);
struct elt_loc_list *l;
@@ -4407,7 +4411,7 @@ local_cprop_pass (alter_jumps)
}
/* Forward propagate copies. This includes copies and constants. Return
- non-zero if a change was made. */
+ nonzero if a change was made. */
static int
cprop (alter_jumps)
@@ -4838,7 +4842,7 @@ compute_pre_data ()
/* PRE utilities */
-/* Return non-zero if an occurrence of expression EXPR in OCCR_BB would reach
+/* Return nonzero if an occurrence of expression EXPR in OCCR_BB would reach
block BB.
VISITED is a pointer to a working buffer for tracking which BB's have
@@ -5294,7 +5298,7 @@ gcse_emit_move_after (src, dest, insn)
the expression into the result of the SET. It is left to later passes
(cprop, cse2, flow, combine, regmove) to propagate the copy or eliminate it.
- Returns non-zero if a change is made. */
+ Returns nonzero if a change is made. */
static int
pre_delete ()
@@ -5419,7 +5423,7 @@ pre_gcse ()
/* Top level routine to perform one PRE GCSE pass.
- Return non-zero if a change was made. */
+ Return nonzero if a change was made. */
static int
one_pre_gcse_pass (pass)
@@ -6192,7 +6196,7 @@ hoist_code ()
/* Top level routine to perform one code hoisting (aka unification) pass
- Return non-zero if a change was made. */
+ Return nonzero if a change was made. */
static int
one_code_hoisting_pass ()
@@ -6658,7 +6662,7 @@ reg_set_info (dest, setter, data)
SET_BIT (*regvec, REGNO (dest));
}
-/* Return non-zero if the register operands of expression X are killed
+/* Return nonzero if the register operands of expression X are killed
anywhere in basic block BB. */
static int
@@ -7131,7 +7135,7 @@ insert_insn_start_bb (insn, bb)
}
/* This routine will insert a store on an edge. EXPR is the ldst entry for
- the memory reference, and E is the edge to insert it on. Returns non-zero
+ the memory reference, and E is the edge to insert it on. Returns nonzero
if an edge insertion was performed. */
static int
diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c
index 5518adc126e..e2faa4401ef 100644
--- a/gcc/genattrtab.c
+++ b/gcc/genattrtab.c
@@ -1838,7 +1838,7 @@ operate_exp (op, left, right)
The first produces a function `function_units_used' which is given an
insn and produces an encoding showing which function units are required
for the execution of that insn. If the value is non-negative, the insn
- uses that unit; otherwise, the value is a one's compliment mask of units
+ uses that unit; otherwise, the value is a one's complement mask of units
used.
The second produces a function `result_ready_cost' which is used to
@@ -2093,7 +2093,7 @@ expand_units ()
fill the unit given the minimum issue delay. FILL-TIME is the
constant "MIN (ISSUE-DELAY (*,*)) * (SIMULTANEITY - 1)", and
the simultaneity constraint is "READY-COST (E) - FILL-TIME"
- if SIMULTANEITY is non-zero and zero otherwise.
+ if SIMULTANEITY is nonzero and zero otherwise.
Thus, BLOCKAGE (E,C) when SIMULTANEITY is zero is
@@ -2246,7 +2246,7 @@ simplify_knowing (exp, known_true)
/* Translate the CONST_STRING expressions in X to change the encoding of
value. On input, the value is a bitmask with a one bit for each unit
used; on output, the value is the unit number (zero based) if one
- and only one unit is used or the one's compliment of the bitmask. */
+ and only one unit is used or the one's complement of the bitmask. */
static rtx
encode_units_mask (x)
@@ -2264,7 +2264,7 @@ encode_units_mask (x)
case CONST_STRING:
i = atoi (XSTR (x, 0));
if (i < 0)
- /* The sign bit encodes a one's compliment mask. */
+ /* The sign bit encodes a one's complement mask. */
abort ();
else if (i != 0 && i == (i & -i))
/* Only one bit is set, so yield that unit number. */
@@ -2562,11 +2562,10 @@ simplify_cond (exp, insn_code, insn_index)
int len = XVECLEN (exp, 0);
rtx *tests = (rtx *) xmalloc (len * sizeof (rtx));
int allsame = 1;
- char *first_spacer;
rtx ret;
/* This lets us free all storage allocated below, if appropriate. */
- first_spacer = (char *) obstack_finish (rtl_obstack);
+ obstack_finish (rtl_obstack);
memcpy (tests, XVEC (exp, 0)->elem, len * sizeof (rtx));
@@ -4315,7 +4314,7 @@ count_alternatives (exp)
return 0;
}
-/* Returns non-zero if the given expression contains an EQ_ATTR with the
+/* Returns nonzero if the given expression contains an EQ_ATTR with the
`alternative' attribute. */
static int
@@ -4348,7 +4347,7 @@ compares_alternatives_p (exp)
return 0;
}
-/* Returns non-zero is INNER is contained in EXP. */
+/* Returns nonzero is INNER is contained in EXP. */
static int
contained_in_p (inner, exp)
@@ -4558,7 +4557,7 @@ gen_unit (def, lineno)
/* Given a piece of RTX, print a C expression to test its truth value.
We use AND and IOR both for logical and bit-wise operations, so
interpret them as logical unless they are inside a comparison expression.
- The first bit of FLAGS will be non-zero in that case.
+ The first bit of FLAGS will be nonzero in that case.
Set the second bit of FLAGS to make references to attribute values use
a cached local variable instead of calling a function. */
@@ -5488,7 +5487,7 @@ write_indent (indent)
}
/* Write a subroutine that is given an insn that requires a delay slot, a
- delay slot ordinal, and a candidate insn. It returns non-zero if the
+ delay slot ordinal, and a candidate insn. It returns nonzero if the
candidate can be placed in the specified delay slot of the insn.
We can write as many as three subroutines. `eligible_for_delay'
@@ -5807,7 +5806,7 @@ next_comma_elt (pstr)
}
/* Return a `struct attr_desc' pointer for a given named attribute. If CREATE
- is non-zero, build a new attribute, if one does not exist. */
+ is nonzero, build a new attribute, if one does not exist. */
static struct attr_desc *
find_attr (name, create)
@@ -6246,7 +6245,7 @@ from the machine description file `md'. */\n\n");
/* Write out information about function units. */
write_function_unit_info ();
/* Output code for pipeline hazards recognition based on DFA
- (deterministic finite state automata. */
+ (deterministic finite state automata. */
write_automata ();
}
diff --git a/gcc/genautomata.c b/gcc/genautomata.c
index bbb2b969876..a5a5bdab7b1 100644
--- a/gcc/genautomata.c
+++ b/gcc/genautomata.c
@@ -221,7 +221,7 @@ static regexp_t gen_regexp_sequence PARAMS ((char *));
static regexp_t gen_regexp PARAMS ((char *));
static unsigned string_hash PARAMS ((const char *));
-static unsigned automaton_decl_hash PARAMS ((const void *));
+static hashval_t automaton_decl_hash PARAMS ((const void *));
static int automaton_decl_eq_p PARAMS ((const void *,
const void *));
static decl_t insert_automaton_decl PARAMS ((decl_t));
@@ -229,7 +229,7 @@ static decl_t find_automaton_decl PARAMS ((char *));
static void initiate_automaton_decl_table PARAMS ((void));
static void finish_automaton_decl_table PARAMS ((void));
-static unsigned insn_decl_hash PARAMS ((const void *));
+static hashval_t insn_decl_hash PARAMS ((const void *));
static int insn_decl_eq_p PARAMS ((const void *,
const void *));
static decl_t insert_insn_decl PARAMS ((decl_t));
@@ -237,7 +237,7 @@ static decl_t find_insn_decl PARAMS ((char *));
static void initiate_insn_decl_table PARAMS ((void));
static void finish_insn_decl_table PARAMS ((void));
-static unsigned decl_hash PARAMS ((const void *));
+static hashval_t decl_hash PARAMS ((const void *));
static int decl_eq_p PARAMS ((const void *,
const void *));
static decl_t insert_decl PARAMS ((decl_t));
@@ -303,7 +303,7 @@ static void output_cycle_reservs PARAMS ((FILE *, reserv_sets_t,
static void output_reserv_sets PARAMS ((FILE *, reserv_sets_t));
static state_t get_free_state PARAMS ((int, automaton_t));
static void free_state PARAMS ((state_t));
-static unsigned state_hash PARAMS ((const void *));
+static hashval_t state_hash PARAMS ((const void *));
static int state_eq_p PARAMS ((const void *, const void *));
static state_t insert_state PARAMS ((state_t));
static void set_state_reserv PARAMS ((state_t, int, int));
@@ -325,7 +325,7 @@ static void finish_arcs PARAMS ((void));
static automata_list_el_t get_free_automata_list_el PARAMS ((void));
static void free_automata_list_el PARAMS ((automata_list_el_t));
static void free_automata_list PARAMS ((automata_list_el_t));
-static unsigned automata_list_hash PARAMS ((const void *));
+static hashval_t automata_list_hash PARAMS ((const void *));
static int automata_list_eq_p PARAMS ((const void *, const void *));
static void initiate_automata_lists PARAMS ((void));
static void automata_list_start PARAMS ((void));
@@ -2095,7 +2095,7 @@ string_hash (string)
/* The function evaluates hash value of an automaton declaration. The
function is used by abstract data `hashtab'. The function returns
hash value (0..UINT_MAX) of given automaton declaration. */
-static unsigned
+static hashval_t
automaton_decl_hash (automaton_decl)
const void *automaton_decl;
{
@@ -2199,7 +2199,7 @@ finish_automaton_decl_table ()
/* The function evaluates hash value of an insn declaration. The
function is used by abstract data `hashtab'. The function returns
hash value (0..UINT_MAX) of given insn declaration. */
-static unsigned
+static hashval_t
insn_decl_hash (insn_decl)
const void *insn_decl;
{
@@ -2302,7 +2302,7 @@ finish_insn_decl_table ()
/* The function evaluates hash value of a declaration. The function
is used by abstract data `hashtab'. The function returns hash
value (0..UINT_MAX) of given declaration. */
-static unsigned
+static hashval_t
decl_hash (decl)
const void *decl;
{
@@ -3581,9 +3581,6 @@ static vla_ptr_t units_container;
/* The start address of the array. */
static unit_decl_t *units_array;
-/* Empty reservation of maximal length. */
-static reserv_sets_t empty_reserv;
-
/* The state table itself is represented by the following variable. */
static htab_t state_table;
@@ -3982,7 +3979,7 @@ free_state (state)
simply hash value of the corresponding reservation set. Otherwise
it is formed from hash values of the component deterministic
states. One more key is order number of state automaton. */
-static unsigned
+static hashval_t
state_hash (state)
const void *state;
{
@@ -4147,10 +4144,10 @@ initiate_states ()
initiate_alt_states ();
VLA_PTR_CREATE (free_states, 1500, "free states");
state_table = htab_create (1500, state_hash, state_eq_p, (htab_del) 0);
- empty_reserv = alloc_empty_reserv_sets ();
+ alloc_empty_reserv_sets ();
}
-/* Finisging work with the abstract data. */
+/* Finishing work with the abstract data. */
static void
finish_states ()
{
@@ -4354,7 +4351,7 @@ free_automata_list (automata_list)
}
/* Hash value of AUTOMATA_LIST. */
-static unsigned
+static hashval_t
automata_list_hash (automata_list)
const void *automata_list;
{
@@ -7990,7 +7987,7 @@ output_max_insn_queue_index_def ()
function *output_automata_list_code. */
static void
output_insn_code_cases (output_automata_list_code)
- void (*output_automata_list_code) (automata_list_el_t);
+ void (*output_automata_list_code) PARAMS ((automata_list_el_t));
{
decl_t decl, decl2;
int i, j;
diff --git a/gcc/genconfig.c b/gcc/genconfig.c
index d7709b0eb4a..795e3120356 100644
--- a/gcc/genconfig.c
+++ b/gcc/genconfig.c
@@ -55,10 +55,10 @@ static void gen_split PARAMS ((rtx));
static void gen_peephole PARAMS ((rtx));
static void gen_peephole2 PARAMS ((rtx));
-/* RECOG_P will be non-zero if this pattern was seen in a context where it will
+/* RECOG_P will be nonzero if this pattern was seen in a context where it will
be used to recognize, rather than just generate an insn.
- NON_PC_SET_SRC will be non-zero if this pattern was seen in a SET_SRC
+ NON_PC_SET_SRC will be nonzero if this pattern was seen in a SET_SRC
of a SET whose destination is not (pc). */
static void
diff --git a/gcc/gengtype-lex.l b/gcc/gengtype-lex.l
index bd848a7da0d..91cdde29580 100644
--- a/gcc/gengtype-lex.l
+++ b/gcc/gengtype-lex.l
@@ -203,8 +203,11 @@ ITYPE {IWORD}({WS}{IWORD})*
"struct"/[^[:alnum:]_] { return STRUCT; }
"enum"/[^[:alnum:]_] { return ENUM; }
"ptr_alias"/[^[:alnum:]_] { return ALIAS; }
-"param_is"/[^[:alnum:]_] { return PARAM_IS; }
[0-9]+ { return NUM; }
+"param"[0-9]*"_is"/[^[:alnum:]_] {
+ yylval.s = xmemdup (yytext, yyleng, yyleng+1);
+ return PARAM_IS;
+}
{IWORD}({WS}{IWORD})*/[^[:alnum:]_] |
"ENUM_BITFIELD"{WS}?"("{WS}?{ID}{WS}?")" {
diff --git a/gcc/gengtype-yacc.y b/gcc/gengtype-yacc.y
index 3ff92d345ef..bb350b43e59 100644
--- a/gcc/gengtype-yacc.y
+++ b/gcc/gengtype-yacc.y
@@ -42,7 +42,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
%token STRUCT "struct"
%token ENUM "enum"
%token ALIAS "ptr_alias"
-%token PARAM_IS "param_is"
+%token <s>PARAM_IS
%token NUM
%token PERCENTPERCENT "%%"
%token <t>SCALAR
@@ -174,8 +174,7 @@ yacc_ids: /* empty */
p->opt = xmalloc (sizeof (*(p->opt)));
p->opt->name = "tag";
p->opt->next = NULL;
- p->opt->info = xmalloc (3 + strlen ($2));
- sprintf (p->opt->info, "'%s'", $2);
+ p->opt->info = xasprintf ("'%s'", $2);
$$ = p;
}
;
@@ -215,6 +214,7 @@ struct_fields: { $$ = NULL; }
bitfieldopt: /* empty */
| ':' NUM
+ | ':' ID
;
type: SCALAR
@@ -263,14 +263,14 @@ options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
type_option : ALIAS
{ $$ = "ptr_alias"; }
| PARAM_IS
- { $$ = "param_is"; }
+ { $$ = $1; }
;
option: type_option '(' type ')'
{
options_p o = xmalloc (sizeof (*o));
o->name = $1;
- o->info = $3;
+ o->info = adjust_field_type ($3, NULL);
$$ = o;
}
| ID '(' STRING ')'
diff --git a/gcc/gengtype.c b/gcc/gengtype.c
index e87cd5cc8d1..679953a8d08 100644
--- a/gcc/gengtype.c
+++ b/gcc/gengtype.c
@@ -26,10 +26,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Nonzero iff an error has occurred. */
static int hit_error = 0;
+static void gen_rtx_next PARAMS ((void));
+static void write_rtx_next PARAMS ((void));
static void open_base_files PARAMS ((void));
static void close_output_files PARAMS ((void));
-
/* Report an error at POS, printing MSG. */
void
@@ -89,6 +90,12 @@ static type_p structures;
static type_p param_structs;
static pair_p variables;
+static void do_scalar_typedef PARAMS ((const char *, struct fileloc *));
+static type_p find_param_structure
+ PARAMS ((type_p t, type_p param[NUM_PARAM]));
+static type_p adjust_field_tree_exp PARAMS ((type_p t, options_p opt));
+static type_p adjust_field_rtx_def PARAMS ((type_p t, options_p opt));
+
/* Define S as a typedef to T at POS. */
void
@@ -118,7 +125,17 @@ do_typedef (s, t, pos)
typedefs = p;
}
-/* Return the type previously defined for S. Use POS to report errors. */
+/* Define S as a typename of a scalar. */
+
+static void
+do_scalar_typedef (s, pos)
+ const char *s;
+ struct fileloc *pos;
+{
+ do_typedef (s, create_scalar_type (s, strlen (s)), pos);
+}
+
+/* Return the type previously defined for S. Use POS to report errors. */
type_p
resolve_typedef (s, pos)
@@ -235,6 +252,34 @@ find_structure (name, isunion)
return s;
}
+/* Return the previously-defined parameterised structure for structure
+ T and parameters PARAM, or a new parameterised empty structure or
+ union if none was defined previously. */
+
+static type_p
+find_param_structure (t, param)
+ type_p t;
+ type_p param[NUM_PARAM];
+{
+ type_p res;
+
+ for (res = param_structs; res; res = res->next)
+ if (res->u.param_struct.stru == t
+ && memcmp (res->u.param_struct.param, param,
+ sizeof (type_p) * NUM_PARAM) == 0)
+ break;
+ if (res == NULL)
+ {
+ res = xcalloc (1, sizeof (*res));
+ res->kind = TYPE_PARAM_STRUCT;
+ res->next = param_structs;
+ param_structs = res;
+ res->u.param_struct.stru = t;
+ memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
+ }
+ return res;
+}
+
/* Return a scalar type with name NAME. */
type_p
@@ -280,13 +325,421 @@ create_array (t, len)
return v;
}
+/* Add a variable named S of type T with options O defined at POS,
+ to `variables'. */
+
+void
+note_variable (s, t, o, pos)
+ const char *s;
+ type_p t;
+ options_p o;
+ struct fileloc *pos;
+{
+ pair_p n;
+ n = xmalloc (sizeof (*n));
+ n->name = s;
+ n->type = t;
+ n->line = *pos;
+ n->opt = o;
+ n->next = variables;
+ variables = n;
+}
+
+enum rtx_code {
+#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
+#include "rtl.def"
+#undef DEF_RTL_EXPR
+ NUM_RTX_CODE
+};
+
+/* We really don't care how long a CONST_DOUBLE is. */
+#define CONST_DOUBLE_FORMAT "ww"
+static const char * const rtx_format[NUM_RTX_CODE] = {
+#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
+#include "rtl.def"
+#undef DEF_RTL_EXPR
+};
+
+static int rtx_next[NUM_RTX_CODE];
+
+/* Generate the contents of the rtx_next array. This really doesn't belong
+ in gengtype at all, but it's needed for adjust_field_rtx_def. */
+
+static void
+gen_rtx_next ()
+{
+ int i;
+ for (i = 0; i < NUM_RTX_CODE; i++)
+ {
+ int k;
+
+ rtx_next[i] = -1;
+ if (strncmp (rtx_format[i], "iuu", 3) == 0)
+ rtx_next[i] = 2;
+ else if (i == COND_EXEC || i == SET || i == EXPR_LIST || i == INSN_LIST)
+ rtx_next[i] = 1;
+ else
+ for (k = strlen (rtx_format[i]) - 1; k >= 0; k--)
+ if (rtx_format[i][k] == 'e' || rtx_format[i][k] == 'u')
+ rtx_next[i] = k;
+ }
+}
+
+/* Write out the contents of the rtx_next array. */
+static void
+write_rtx_next ()
+{
+ outf_p f = get_output_file_with_visibility (NULL);
+ int i;
+
+ oprintf (f, "\n/* Used to implement the RTX_NEXT macro. */\n");
+ oprintf (f, "const unsigned char rtx_next[NUM_RTX_CODE] = {\n");
+ for (i = 0; i < NUM_RTX_CODE; i++)
+ if (rtx_next[i] == -1)
+ oprintf (f, " 0,\n");
+ else
+ oprintf (f,
+ " offsetof (struct rtx_def, fld) + %d * sizeof (rtunion),\n",
+ rtx_next[i]);
+ oprintf (f, "};\n");
+}
+
+/* Handle `special("rtx_def")'. This is a special case for field
+ `fld' of struct rtx_def, which is an array of unions whose values
+ are based in a complex way on the type of RTL. */
+
+static type_p
+adjust_field_rtx_def (t, opt)
+ type_p t;
+ options_p opt ATTRIBUTE_UNUSED;
+{
+ pair_p flds = NULL;
+ options_p nodot;
+ int i;
+ type_p rtx_tp, rtvec_tp, tree_tp, mem_attrs_tp, note_union_tp, scalar_tp;
+ type_p bitmap_tp, basic_block_tp;
+
+ static const char * const rtx_name[NUM_RTX_CODE] = {
+#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
+#include "rtl.def"
+#undef DEF_RTL_EXPR
+ };
+
+ if (t->kind != TYPE_ARRAY)
+ {
+ error_at_line (&lexer_line,
+ "special `rtx_def' must be applied to an array");
+ return &string_type;
+ }
+
+ nodot = xmalloc (sizeof (*nodot));
+ nodot->next = NULL;
+ nodot->name = "dot";
+ nodot->info = "";
+
+ rtx_tp = create_pointer (find_structure ("rtx_def", 0));
+ rtvec_tp = create_pointer (find_structure ("rtvec_def", 0));
+ tree_tp = create_pointer (find_structure ("tree_node", 1));
+ mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
+ bitmap_tp = create_pointer (find_structure ("bitmap_element_def", 0));
+ basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
+ scalar_tp = create_scalar_type ("rtunion scalar", 14);
+
+ {
+ pair_p note_flds = NULL;
+ int c;
+
+ for (c = 0; c < 3; c++)
+ {
+ pair_p old_note_flds = note_flds;
+
+ note_flds = xmalloc (sizeof (*note_flds));
+ note_flds->line.file = __FILE__;
+ note_flds->line.line = __LINE__;
+ note_flds->name = "rttree";
+ note_flds->type = tree_tp;
+ note_flds->opt = xmalloc (sizeof (*note_flds->opt));
+ note_flds->opt->next = nodot;
+ note_flds->opt->name = "tag";
+ note_flds->next = old_note_flds;
+ }
+
+ note_flds->type = rtx_tp;
+ note_flds->name = "rtx";
+ note_flds->opt->info = "NOTE_INSN_EXPECTED_VALUE";
+ note_flds->next->opt->info = "NOTE_INSN_BLOCK_BEG";
+ note_flds->next->next->opt->info = "NOTE_INSN_BLOCK_END";
+
+ new_structure ("rtx_def_note_subunion", 1, &lexer_line, note_flds, NULL);
+ }
+
+ note_union_tp = find_structure ("rtx_def_note_subunion", 1);
+
+ for (i = 0; i < NUM_RTX_CODE; i++)
+ {
+ pair_p old_flds = flds;
+ pair_p subfields = NULL;
+ size_t aindex, nmindex;
+ const char *sname;
+ char *ftag;
+
+ for (aindex = 0; aindex < strlen (rtx_format[i]); aindex++)
+ {
+ pair_p old_subf = subfields;
+ type_p t;
+ const char *subname;
+
+ switch (rtx_format[i][aindex])
+ {
+ case '*':
+ case 'i':
+ case 'n':
+ case 'w':
+ t = scalar_tp;
+ subname = "rtint";
+ break;
+
+ case '0':
+ if (i == MEM && aindex == 1)
+ t = mem_attrs_tp, subname = "rtmem";
+ else if (i == JUMP_INSN && aindex == 9)
+ t = rtx_tp, subname = "rtx";
+ else if (i == CODE_LABEL && aindex == 4)
+ t = scalar_tp, subname = "rtint";
+ else if (i == CODE_LABEL && aindex == 5)
+ t = rtx_tp, subname = "rtx";
+ else if (i == LABEL_REF
+ && (aindex == 1 || aindex == 2))
+ t = rtx_tp, subname = "rtx";
+ else if (i == NOTE && aindex == 4)
+ t = note_union_tp, subname = "";
+ else if (i == NOTE && aindex >= 7)
+ t = scalar_tp, subname = "rtint";
+ else if (i == ADDR_DIFF_VEC && aindex == 4)
+ t = scalar_tp, subname = "rtint";
+ else if (i == VALUE && aindex == 0)
+ t = scalar_tp, subname = "rtint";
+ else if (i == REG && aindex == 1)
+ t = scalar_tp, subname = "rtint";
+ else if (i == SCRATCH && aindex == 0)
+ t = scalar_tp, subname = "rtint";
+ else if (i == BARRIER && aindex >= 3)
+ t = scalar_tp, subname = "rtint";
+ else
+ {
+ error_at_line (&lexer_line,
+ "rtx type `%s' has `0' in position %lu, can't handle",
+ rtx_name[i], (unsigned long) aindex);
+ t = &string_type;
+ subname = "rtint";
+ }
+ break;
+
+ case 's':
+ case 'S':
+ case 'T':
+ t = &string_type;
+ subname = "rtstr";
+ break;
+
+ case 'e':
+ case 'u':
+ t = rtx_tp;
+ subname = "rtx";
+ break;
+
+ case 'E':
+ case 'V':
+ t = rtvec_tp;
+ subname = "rtvec";
+ break;
+
+ case 't':
+ t = tree_tp;
+ subname = "rttree";
+ break;
+
+ case 'b':
+ t = bitmap_tp;
+ subname = "rtbit";
+ break;
+
+ case 'B':
+ t = basic_block_tp;
+ subname = "bb";
+ break;
+
+ default:
+ error_at_line (&lexer_line,
+ "rtx type `%s' has `%c' in position %lu, can't handle",
+ rtx_name[i], rtx_format[i][aindex],
+ (unsigned long)aindex);
+ t = &string_type;
+ subname = "rtint";
+ break;
+ }
+
+ subfields = xmalloc (sizeof (*subfields));
+ subfields->next = old_subf;
+ subfields->type = t;
+ subfields->name = xasprintf ("[%lu].%s", (unsigned long)aindex,
+ subname);
+ subfields->line.file = __FILE__;
+ subfields->line.line = __LINE__;
+ if (t == note_union_tp)
+ {
+ subfields->opt = xmalloc (sizeof (*subfields->opt));
+ subfields->opt->next = nodot;
+ subfields->opt->name = "desc";
+ subfields->opt->info = "NOTE_LINE_NUMBER (&%0)";
+ }
+ else if (t == basic_block_tp)
+ {
+ /* We don't presently GC basic block structures... */
+ subfields->opt = xmalloc (sizeof (*subfields->opt));
+ subfields->opt->next = nodot;
+ subfields->opt->name = "skip";
+ subfields->opt->info = NULL;
+ }
+ else if ((size_t) rtx_next[i] == aindex)
+ {
+ /* The 'next' field will be marked by the chain_next option. */
+ subfields->opt = xmalloc (sizeof (*subfields->opt));
+ subfields->opt->next = nodot;
+ subfields->opt->name = "skip";
+ subfields->opt->info = NULL;
+ }
+ else
+ subfields->opt = nodot;
+ }
+
+ flds = xmalloc (sizeof (*flds));
+ flds->next = old_flds;
+ flds->name = "";
+ sname = xasprintf ("rtx_def_%s", rtx_name[i]);
+ new_structure (sname, 0, &lexer_line, subfields, NULL);
+ flds->type = find_structure (sname, 0);
+ flds->line.file = __FILE__;
+ flds->line.line = __LINE__;
+ flds->opt = xmalloc (sizeof (*flds->opt));
+ flds->opt->next = nodot;
+ flds->opt->name = "tag";
+ ftag = xstrdup (rtx_name[i]);
+ for (nmindex = 0; nmindex < strlen (ftag); nmindex++)
+ ftag[nmindex] = TOUPPER (ftag[nmindex]);
+ flds->opt->info = ftag;
+ }
+
+ new_structure ("rtx_def_subunion", 1, &lexer_line, flds, nodot);
+ return find_structure ("rtx_def_subunion", 1);
+}
+
+/* Handle `special("tree_exp")'. This is a special case for
+ field `operands' of struct tree_exp, which although it claims to contain
+ pointers to trees, actually sometimes contains pointers to RTL too.
+ Passed T, the old type of the field, and OPT its options. Returns
+ a new type for the field. */
+
+static type_p
+adjust_field_tree_exp (t, opt)
+ type_p t;
+ options_p opt ATTRIBUTE_UNUSED;
+{
+ pair_p flds;
+ options_p nodot;
+ size_t i;
+ static const struct {
+ const char *name;
+ int first_rtl;
+ int num_rtl;
+ } data[] = {
+ { "SAVE_EXPR", 2, 1 },
+ { "GOTO_SUBROUTINE_EXPR", 0, 2 },
+ { "RTL_EXPR", 0, 2 },
+ { "WITH_CLEANUP_EXPR", 2, 1 },
+ { "METHOD_CALL_EXPR", 3, 1 }
+ };
+
+ if (t->kind != TYPE_ARRAY)
+ {
+ error_at_line (&lexer_line,
+ "special `tree_exp' must be applied to an array");
+ return &string_type;
+ }
+
+ nodot = xmalloc (sizeof (*nodot));
+ nodot->next = NULL;
+ nodot->name = "dot";
+ nodot->info = "";
+
+ flds = xmalloc (sizeof (*flds));
+ flds->next = NULL;
+ flds->name = "";
+ flds->type = t;
+ flds->line.file = __FILE__;
+ flds->line.line = __LINE__;
+ flds->opt = xmalloc (sizeof (*flds->opt));
+ flds->opt->next = nodot;
+ flds->opt->name = "length";
+ flds->opt->info = "TREE_CODE_LENGTH (TREE_CODE ((tree) &%0))";
+ {
+ options_p oldopt = flds->opt;
+ flds->opt = xmalloc (sizeof (*flds->opt));
+ flds->opt->next = oldopt;
+ flds->opt->name = "default";
+ flds->opt->info = "";
+ }
+
+ for (i = 0; i < ARRAY_SIZE (data); i++)
+ {
+ pair_p old_flds = flds;
+ pair_p subfields = NULL;
+ int r_index;
+ const char *sname;
+
+ for (r_index = 0;
+ r_index < data[i].first_rtl + data[i].num_rtl;
+ r_index++)
+ {
+ pair_p old_subf = subfields;
+ subfields = xmalloc (sizeof (*subfields));
+ subfields->next = old_subf;
+ subfields->name = xasprintf ("[%d]", r_index);
+ if (r_index < data[i].first_rtl)
+ subfields->type = t->u.a.p;
+ else
+ subfields->type = create_pointer (find_structure ("rtx_def", 0));
+ subfields->line.file = __FILE__;
+ subfields->line.line = __LINE__;
+ subfields->opt = nodot;
+ }
+
+ flds = xmalloc (sizeof (*flds));
+ flds->next = old_flds;
+ flds->name = "";
+ sname = xasprintf ("tree_exp_%s", data[i].name);
+ new_structure (sname, 0, &lexer_line, subfields, NULL);
+ flds->type = find_structure (sname, 0);
+ flds->line.file = __FILE__;
+ flds->line.line = __LINE__;
+ flds->opt = xmalloc (sizeof (*flds->opt));
+ flds->opt->next = nodot;
+ flds->opt->name = "tag";
+ flds->opt->info = data[i].name;
+ }
+
+ new_structure ("tree_exp_subunion", 1, &lexer_line, flds, nodot);
+ return find_structure ("tree_exp_subunion", 1);
+}
+
/* Perform any special processing on a type T, about to become the type
of a field. Return the appropriate type for the field.
At present:
- Converts pointer-to-char, with no length parameter, to TYPE_STRING;
- Similarly for arrays of pointer-to-char;
- Converts structures for which a parameter is provided to
- TYPE_PARAM_STRUCT.
+ TYPE_PARAM_STRUCT;
+ - Handles "special" options.
*/
type_p
@@ -296,30 +749,61 @@ adjust_field_type (t, opt)
{
int length_p = 0;
const int pointer_p = t->kind == TYPE_POINTER;
+ type_p params[NUM_PARAM];
+ int params_p = 0;
+ int i;
+
+ for (i = 0; i < NUM_PARAM; i++)
+ params[i] = NULL;
for (; opt; opt = opt->next)
if (strcmp (opt->name, "length") == 0)
length_p = 1;
- else if (strcmp (opt->name, "param_is") == 0)
+ else if (strcmp (opt->name, "param_is") == 0
+ || (strncmp (opt->name, "param", 5) == 0
+ && ISDIGIT (opt->name[5])
+ && strcmp (opt->name + 6, "_is") == 0))
{
- type_p realt;
+ int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
- if (pointer_p)
- t = t->u.p;
-
- for (realt = param_structs; realt; realt = realt->next)
- if (realt->u.param_struct.stru == t
- && realt->u.param_struct.param == (type_p) opt->info)
- return pointer_p ? create_pointer (realt) : realt;
- realt = xcalloc (1, sizeof (*realt));
- realt->kind = TYPE_PARAM_STRUCT;
- realt->next = param_structs;
- param_structs = realt;
- realt->u.param_struct.stru = t;
- realt->u.param_struct.param = (type_p) opt->info;
- return pointer_p ? create_pointer (realt) : realt;
+ if (! UNION_OR_STRUCT_P (t)
+ && (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p)))
+ {
+ error_at_line (&lexer_line,
+ "option `%s' may only be applied to structures or structure pointers",
+ opt->name);
+ return t;
+ }
+
+ params_p = 1;
+ if (params[num] != NULL)
+ error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
+ if (! ISDIGIT (opt->name[5]))
+ params[num] = create_pointer ((type_p) opt->info);
+ else
+ params[num] = (type_p) opt->info;
}
-
+ else if (strcmp (opt->name, "special") == 0)
+ {
+ const char *special_name = (const char *)opt->info;
+ if (strcmp (special_name, "tree_exp") == 0)
+ t = adjust_field_tree_exp (t, opt);
+ else if (strcmp (special_name, "rtx_def") == 0)
+ t = adjust_field_rtx_def (t, opt);
+ else
+ error_at_line (&lexer_line, "unknown special `%s'", special_name);
+ }
+
+ if (params_p)
+ {
+ type_p realt;
+
+ if (pointer_p)
+ t = t->u.p;
+ realt = find_param_structure (t, params);
+ t = pointer_p ? create_pointer (realt) : realt;
+ }
+
if (! length_p
&& pointer_p
&& t->u.p->kind == TYPE_SCALAR
@@ -335,26 +819,6 @@ adjust_field_type (t, opt)
return t;
}
-/* Add a variable named S of type T with options O defined at POS,
- to `variables'. */
-
-void
-note_variable (s, t, o, pos)
- const char *s;
- type_p t;
- options_p o;
- struct fileloc *pos;
-{
- pair_p n;
- n = xmalloc (sizeof (*n));
- n->name = s;
- n->type = t;
- n->line = *pos;
- n->opt = o;
- n->next = variables;
- variables = n;
-}
-
/* Create a union for YYSTYPE, as yacc would do it, given a fieldlist FIELDS
and information about the correspondance between token types and fields
in TYPEINFO. POS is used for error messages. */
@@ -419,36 +883,44 @@ note_yacc_type (o, fields, typeinfo, pos)
do_typedef ("YYSTYPE", find_structure ("yy_union", 1), pos);
}
-static void process_gc_options PARAMS ((options_p, enum gc_used_enum, int *));
-static void set_gc_used_type PARAMS ((type_p, enum gc_used_enum));
+static void process_gc_options PARAMS ((options_p, enum gc_used_enum,
+ int *, int *, int *));
+static void set_gc_used_type PARAMS ((type_p, enum gc_used_enum, type_p *));
static void set_gc_used PARAMS ((pair_p));
/* Handle OPT for set_gc_used_type. */
static void
-process_gc_options (opt, level, maybe_undef)
+process_gc_options (opt, level, maybe_undef, pass_param, length)
options_p opt;
enum gc_used_enum level;
int *maybe_undef;
+ int *pass_param;
+ int *length;
{
options_p o;
for (o = opt; o; o = o->next)
if (strcmp (o->name, "ptr_alias") == 0 && level == GC_POINTED_TO)
- set_gc_used_type ((type_p) o->info, GC_POINTED_TO);
+ set_gc_used_type ((type_p) o->info, GC_POINTED_TO, NULL);
else if (strcmp (o->name, "maybe_undef") == 0)
*maybe_undef = 1;
+ else if (strcmp (o->name, "use_params") == 0)
+ *pass_param = 1;
+ else if (strcmp (o->name, "length") == 0)
+ *length = 1;
}
/* Set the gc_used field of T to LEVEL, and handle the types it references. */
static void
-set_gc_used_type (t, level)
+set_gc_used_type (t, level, param)
type_p t;
enum gc_used_enum level;
+ type_p param[NUM_PARAM];
{
if (t->gc_used >= level)
return;
-
+
t->gc_used = level;
switch (t->kind)
@@ -459,37 +931,56 @@ set_gc_used_type (t, level)
pair_p f;
int dummy;
- process_gc_options (t->u.s.opt, level, &dummy);
+ process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy);
for (f = t->u.s.fields; f; f = f->next)
{
int maybe_undef = 0;
- process_gc_options (t->u.s.opt, level, &maybe_undef);
+ int pass_param = 0;
+ int length = 0;
+ process_gc_options (f->opt, level, &maybe_undef, &pass_param,
+ &length);
- if (maybe_undef && f->type->kind == TYPE_POINTER)
- set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO);
+ if (length && f->type->kind == TYPE_POINTER)
+ set_gc_used_type (f->type->u.p, GC_USED, NULL);
+ else if (maybe_undef && f->type->kind == TYPE_POINTER)
+ set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL);
+ else if (pass_param && f->type->kind == TYPE_POINTER && param)
+ set_gc_used_type (find_param_structure (f->type->u.p, param),
+ GC_POINTED_TO, NULL);
else
- set_gc_used_type (f->type, GC_USED);
+ set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
}
break;
}
case TYPE_POINTER:
- set_gc_used_type (t->u.p, GC_POINTED_TO);
+ set_gc_used_type (t->u.p, GC_POINTED_TO, NULL);
break;
case TYPE_ARRAY:
- set_gc_used_type (t->u.a.p, GC_USED);
+ set_gc_used_type (t->u.a.p, GC_USED, param);
break;
case TYPE_LANG_STRUCT:
for (t = t->u.s.lang_struct; t; t = t->next)
- set_gc_used_type (t, level);
+ set_gc_used_type (t, level, param);
break;
case TYPE_PARAM_STRUCT:
- set_gc_used_type (t->u.param_struct.param, GC_POINTED_TO);
- set_gc_used_type (t->u.param_struct.stru, GC_USED);
+ {
+ int i;
+ for (i = 0; i < NUM_PARAM; i++)
+ if (t->u.param_struct.param[i] != 0)
+ set_gc_used_type (t->u.param_struct.param[i], GC_USED, NULL);
+ }
+ if (t->u.param_struct.stru->gc_used == GC_POINTED_TO)
+ level = GC_POINTED_TO;
+ else
+ level = GC_USED;
+ t->u.param_struct.stru->gc_used = GC_UNUSED;
+ set_gc_used_type (t->u.param_struct.stru, level,
+ t->u.param_struct.param);
break;
default:
@@ -497,7 +988,7 @@ set_gc_used_type (t, level)
}
}
-/* Set the gc_used fileds of all the types pointed to by VARIABLES. */
+/* Set the gc_used fields of all the types pointed to by VARIABLES. */
static void
set_gc_used (variables)
@@ -505,7 +996,7 @@ set_gc_used (variables)
{
pair_p p;
for (p = variables; p; p = p->next)
- set_gc_used_type (p->type, GC_USED);
+ set_gc_used_type (p->type, GC_USED, NULL);
}
/* File mapping routines. For each input file, there is one output .c file
@@ -609,8 +1100,6 @@ oprintf VPARAMS ((outf_p o, const char *format, ...))
/* Open the global header file and the language-specific header files. */
-static void open_base_files PARAMS((void));
-
static void
open_base_files ()
{
@@ -626,7 +1115,7 @@ open_base_files ()
{
/* The order of files here matters very much. */
static const char *const ifiles [] = {
- "config.h", "system.h", "varray.h", "hashtab.h",
+ "config.h", "system.h", "varray.h", "hashtab.h", "splay-tree.h",
"bitmap.h", "tree.h", "rtl.h", "function.h", "insn-config.h",
"expr.h", "hard-reg-set.h", "basic-block.h", "cselib.h",
"insn-addr.h", "ssa.h", "optabs.h", "libfuncs.h",
@@ -648,7 +1137,6 @@ static const char *
get_file_basename (f)
const char *f;
{
- size_t len;
const char *basename;
unsigned i;
@@ -657,7 +1145,6 @@ get_file_basename (f)
if (!basename)
return f;
- len = strlen (f);
basename++;
for (i = 1; i < NUM_BASE_FILES; i++)
@@ -878,11 +1365,14 @@ struct flist {
static void output_escaped_param PARAMS ((outf_p , const char *, const char *,
const char *, const char *,
struct fileloc *));
+static void output_mangled_typename PARAMS ((outf_p, type_p));
static void write_gc_structure_fields
PARAMS ((outf_p , type_p, const char *, const char *, options_p,
- int, struct fileloc *, lang_bitmap, type_p));
-static void write_gc_marker_routine_for_structure PARAMS ((type_p, type_p));
+ int, struct fileloc *, lang_bitmap, type_p *));
+static void write_gc_marker_routine_for_structure PARAMS ((type_p, type_p,
+ type_p *));
static void write_gc_types PARAMS ((type_p structures, type_p param_structs));
+static void write_enum_defn PARAMS ((type_p structures, type_p param_structs));
static void put_mangled_filename PARAMS ((outf_p , const char *));
static void finish_root_table PARAMS ((struct flist *flp, const char *pfx,
const char *tname, const char *lastname,
@@ -911,15 +1401,70 @@ output_escaped_param (of, param, val, prev_val, oname, line)
for (p = param; *p; p++)
if (*p != '%')
oprintf (of, "%c", *p);
- else if (*++p == 'h')
- oprintf (of, "(%s)", val);
- else if (*p == '0')
- oprintf (of, "(*x)");
- else if (*p == '1')
- oprintf (of, "(%s)", prev_val);
- else
- error_at_line (line, "`%s' option contains bad escape %c%c",
- oname, '%', *p);
+ else switch (*++p)
+ {
+ case 'h':
+ oprintf (of, "(%s)", val);
+ break;
+ case '0':
+ oprintf (of, "(*x)");
+ break;
+ case '1':
+ oprintf (of, "(%s)", prev_val);
+ break;
+ case 'a':
+ {
+ const char *pp = val + strlen (val);
+ while (pp[-1] == ']')
+ while (*pp != '[')
+ pp--;
+ oprintf (of, "%s", pp);
+ }
+ break;
+ default:
+ error_at_line (line, "`%s' option contains bad escape %c%c",
+ oname, '%', *p);
+ }
+}
+
+/* Print a mangled name representing T to OF. */
+
+static void
+output_mangled_typename (of, t)
+ outf_p of;
+ type_p t;
+{
+ if (t == NULL)
+ oprintf (of, "Z");
+ else switch (t->kind)
+ {
+ case TYPE_POINTER:
+ oprintf (of, "P");
+ output_mangled_typename (of, t->u.p);
+ break;
+ case TYPE_SCALAR:
+ oprintf (of, "I");
+ break;
+ case TYPE_STRING:
+ oprintf (of, "S");
+ break;
+ case TYPE_STRUCT:
+ case TYPE_UNION:
+ case TYPE_LANG_STRUCT:
+ oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag), t->u.s.tag);
+ break;
+ case TYPE_PARAM_STRUCT:
+ {
+ int i;
+ for (i = 0; i < NUM_PARAM; i++)
+ if (t->u.param_struct.param[i] != NULL)
+ output_mangled_typename (of, t->u.param_struct.param[i]);
+ output_mangled_typename (of, t->u.param_struct.stru);
+ }
+ break;
+ case TYPE_ARRAY:
+ abort ();
+ }
}
/* Write out code to OF which marks the fields of S. VAL references
@@ -940,10 +1485,10 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
int indent;
struct fileloc *line;
lang_bitmap bitmap;
- type_p param;
+ type_p * param;
{
pair_p f;
- int tagcounter = -1;
+ int seen_default = 0;
if (! s->u.s.line.file)
error_at_line (line, "incomplete structure `%s'", s->u.s.tag);
@@ -958,7 +1503,6 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
const char *tagexpr = NULL;
options_p oo;
- tagcounter = ++gc_counter;
for (oo = opts; oo; oo = oo->next)
if (strcmp (oo->name, "desc") == 0)
tagexpr = (const char *)oo->info;
@@ -968,29 +1512,26 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
error_at_line (line, "missing `desc' option");
}
- oprintf (of, "%*s{\n", indent, "");
- indent += 2;
- oprintf (of, "%*sunsigned int tag%d = (", indent, "", tagcounter);
+ oprintf (of, "%*sswitch (", indent, "");
output_escaped_param (of, tagexpr, val, prev_val, "desc", line);
- oprintf (of, ");\n");
+ oprintf (of, ")\n");
+ indent += 2;
+ oprintf (of, "%*s{\n", indent, "");
}
for (f = s->u.s.fields; f; f = f->next)
{
const char *tagid = NULL;
const char *length = NULL;
- const char *special = NULL;
int skip_p = 0;
- int always_p = 0;
+ int default_p = 0;
int maybe_undef_p = 0;
- int use_param_p = 0;
+ int use_param_num = -1;
+ int use_params_p = 0;
+ int needs_cast_p = 0;
options_p oo;
type_p t = f->type;
-
- if (t->kind == TYPE_SCALAR
- || (t->kind == TYPE_ARRAY
- && t->u.a.p->kind == TYPE_SCALAR))
- continue;
+ const char *dot = ".";
for (oo = f->opt; oo; oo = oo->next)
if (strcmp (oo->name, "length") == 0)
@@ -1000,62 +1541,88 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
else if (strcmp (oo->name, "tag") == 0)
tagid = (const char *)oo->info;
else if (strcmp (oo->name, "special") == 0)
- special = (const char *)oo->info;
+ ;
else if (strcmp (oo->name, "skip") == 0)
skip_p = 1;
- else if (strcmp (oo->name, "always") == 0)
- always_p = 1;
- else if (strcmp (oo->name, "desc") == 0 && UNION_P (t))
+ else if (strcmp (oo->name, "default") == 0)
+ default_p = 1;
+ else if (strcmp (oo->name, "desc") == 0)
;
- else if (strcmp (oo->name, "descbits") == 0 && UNION_P (t))
+ else if (strcmp (oo->name, "descbits") == 0)
;
else if (strcmp (oo->name, "param_is") == 0)
;
- else if (strcmp (oo->name, "use_param") == 0)
- use_param_p = 1;
+ else if (strncmp (oo->name, "use_param", 9) == 0
+ && (oo->name[9] == '\0' || ISDIGIT (oo->name[9])))
+ use_param_num = oo->name[9] == '\0' ? 0 : oo->name[9] - '0';
+ else if (strcmp (oo->name, "use_params") == 0)
+ use_params_p = 1;
+ else if (strcmp (oo->name, "dot") == 0)
+ dot = (const char *)oo->info;
else
error_at_line (&f->line, "unknown field option `%s'\n", oo->name);
if (skip_p)
continue;
+
+ if (use_params_p)
+ {
+ int pointer_p = t->kind == TYPE_POINTER;
+
+ if (pointer_p)
+ t = t->u.p;
+ t = find_param_structure (t, param);
+ if (pointer_p)
+ t = create_pointer (t);
+ }
- if (use_param_p)
+ if (use_param_num != -1)
{
- if (param != NULL)
+ if (param != NULL && param[use_param_num] != NULL)
{
- type_p t1;
- type_p nt = param;
- int arraycount = 0;
+ type_p nt = param[use_param_num];
- for (t1 = t; t->kind == TYPE_ARRAY; t = t->u.a.p)
- arraycount++;
- for (; t->kind == TYPE_POINTER; t = t->u.p)
- nt = create_pointer (nt);
- while (arraycount-- > 0)
+ if (t->kind == TYPE_ARRAY)
nt = create_array (nt, t->u.a.len);
+ else if (length != NULL && t->kind == TYPE_POINTER)
+ nt = create_pointer (nt);
+ needs_cast_p = (t->kind != TYPE_POINTER
+ && nt->kind == TYPE_POINTER);
t = nt;
}
- else if (s->kind == TYPE_UNION && ! always_p && tagid)
- ;
- else
+ else if (s->kind != TYPE_UNION)
error_at_line (&f->line, "no parameter defined");
}
+ if (t->kind == TYPE_SCALAR
+ || (t->kind == TYPE_ARRAY
+ && t->u.a.p->kind == TYPE_SCALAR))
+ continue;
+
+ seen_default |= default_p;
+
if (maybe_undef_p
&& (t->kind != TYPE_POINTER
|| t->u.p->kind != TYPE_STRUCT))
error_at_line (&f->line,
"field `%s' has invalid option `maybe_undef_p'\n",
f->name);
- if (s->kind == TYPE_UNION && ! always_p )
+ if (s->kind == TYPE_UNION)
{
- if (! tagid)
+ if (tagid)
+ {
+ oprintf (of, "%*scase %s:\n", indent, "", tagid);
+
+ }
+ else if (default_p)
+ {
+ oprintf (of, "%*sdefault:\n", indent, "");
+ }
+ else
{
error_at_line (&f->line, "field `%s' has no tag", f->name);
continue;
}
- oprintf (of, "%*sif (tag%d == (%s)) {\n", indent, "",
- tagcounter, tagid);
indent += 2;
}
@@ -1081,13 +1648,13 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
break;
}
}
- /* Fall through... */
+ /* Fall through... */
case TYPE_STRUCT:
case TYPE_UNION:
{
char *newval;
- newval = xasprintf ("%s.%s", val, f->name);
+ newval = xasprintf ("%s%s%s", val, dot, f->name);
write_gc_structure_fields (of, t, newval, val, f->opt, indent,
&f->line, bitmap, param);
free (newval);
@@ -1099,17 +1666,20 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
{
if (maybe_undef_p
&& t->u.p->u.s.line.file == NULL)
- oprintf (of, "%*sif (%s.%s) abort();\n", indent, "",
- val, f->name);
- else if (UNION_OR_STRUCT_P (t->u.p))
- oprintf (of, "%*sgt_ggc_m_%s (%s.%s);\n", indent, "",
- t->u.p->u.s.tag, val, f->name);
- else if (t->u.p->kind == TYPE_PARAM_STRUCT)
- oprintf (of, "%*sgt_ggc_mm_%d%s_%s (%s.%s);\n", indent, "",
- (int) strlen (t->u.p->u.param_struct.param->u.s.tag),
- t->u.p->u.param_struct.param->u.s.tag,
- t->u.p->u.param_struct.stru->u.s.tag,
- val, f->name);
+ oprintf (of, "%*sif (%s%s%s) abort();\n", indent, "",
+ val, dot, f->name);
+ else if (UNION_OR_STRUCT_P (t->u.p)
+ || t->u.p->kind == TYPE_PARAM_STRUCT)
+ {
+ oprintf (of, "%*sgt_ggc_m_", indent, "");
+ output_mangled_typename (of, t->u.p);
+ oprintf (of, " (");
+ if (needs_cast_p)
+ oprintf (of, "(%s %s *)",
+ UNION_P (t->u.p) ? "union" : "struct",
+ t->u.p->u.s.tag);
+ oprintf (of, "%s%s%s);\n", val, dot, f->name);
+ }
else
error_at_line (&f->line, "field `%s' is pointer to scalar",
f->name);
@@ -1117,18 +1687,18 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
}
else if (t->u.p->kind == TYPE_SCALAR
|| t->u.p->kind == TYPE_STRING)
- oprintf (of, "%*sggc_mark (%s.%s);\n", indent, "",
- val, f->name);
+ oprintf (of, "%*sggc_mark (%s%s%s);\n", indent, "",
+ val, dot, f->name);
else
{
int loopcounter = ++gc_counter;
- oprintf (of, "%*sif (%s.%s != NULL) {\n", indent, "",
- val, f->name);
+ oprintf (of, "%*sif (%s%s%s != NULL) {\n", indent, "",
+ val, dot, f->name);
indent += 2;
oprintf (of, "%*ssize_t i%d;\n", indent, "", loopcounter);
- oprintf (of, "%*sggc_set_mark (%s.%s);\n", indent, "",
- val, f->name);
+ oprintf (of, "%*sggc_set_mark (%s%s%s);\n", indent, "",
+ val, dot, f->name);
oprintf (of, "%*sfor (i%d = 0; i%d < (size_t)(", indent, "",
loopcounter, loopcounter);
output_escaped_param (of, length, val, prev_val, "length", line);
@@ -1141,7 +1711,7 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
{
char *newval;
- newval = xasprintf ("%s.%s[i%d]", val, f->name,
+ newval = xasprintf ("%s%s%s[i%d]", val, dot, f->name,
loopcounter);
write_gc_structure_fields (of, t->u.p, newval, val,
f->opt, indent, &f->line,
@@ -1150,10 +1720,14 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
break;
}
case TYPE_POINTER:
- if (UNION_OR_STRUCT_P (t->u.p->u.p))
- oprintf (of, "%*sgt_ggc_m_%s (%s.%s[i%d]);\n", indent, "",
- t->u.p->u.p->u.s.tag, val, f->name,
- loopcounter);
+ if (UNION_OR_STRUCT_P (t->u.p->u.p)
+ || t->u.p->u.p->kind == TYPE_PARAM_STRUCT)
+ {
+ oprintf (of, "%*sgt_ggc_m_", indent, "");
+ output_mangled_typename (of, t->u.p->u.p);
+ oprintf (of, " (%s%s%s[i%d]);\n", val, dot, f->name,
+ loopcounter);
+ }
else
error_at_line (&f->line,
"field `%s' is array of pointer to scalar",
@@ -1195,17 +1769,6 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
oprintf (of, "%*s{\n", indent, "");
indent += 2;
- if (special != NULL && strcmp (special, "tree_exp") == 0)
- {
- oprintf (of, "%*sconst size_t tree_exp_size = (",
- indent, "");
- output_escaped_param (of, length, val, prev_val,
- "length", line);
- oprintf (of, ");\n");
-
- length = "first_rtl_op (TREE_CODE ((tree)&%h))";
- }
-
for (ta = t, i = 0; ta->kind == TYPE_ARRAY; ta = ta->u.a.p, i++)
{
oprintf (of, "%*ssize_t i%d_%d;\n",
@@ -1230,11 +1793,12 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
}
if (ta->kind == TYPE_POINTER
- && (ta->u.p->kind == TYPE_STRUCT
- || ta->u.p->kind == TYPE_UNION))
+ && (UNION_OR_STRUCT_P (ta->u.p)
+ || ta->u.p->kind == TYPE_PARAM_STRUCT))
{
- oprintf (of, "%*sgt_ggc_m_%s (%s.%s",
- indent, "", ta->u.p->u.s.tag, val, f->name);
+ oprintf (of, "%*sgt_ggc_m_", indent, "");
+ output_mangled_typename (of, ta->u.p);
+ oprintf (of, " (%s%s%s", val, dot, f->name);
for (ta = t, i = 0;
ta->kind == TYPE_ARRAY;
ta = ta->u.a.p, i++)
@@ -1251,7 +1815,7 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
len += sizeof ("[i_]") + 2*6;
newval = xmalloc (len);
- sprintf (newval, "%s.%s", val, f->name);
+ sprintf (newval, "%s%s%s", val, dot, f->name);
for (ta = t, i = 0;
ta->kind == TYPE_ARRAY;
ta = ta->u.a.p, i++)
@@ -1263,7 +1827,7 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
free (newval);
}
else if (ta->kind == TYPE_POINTER && ta->u.p->kind == TYPE_SCALAR
- && use_param_p && param == NULL)
+ && use_param_num != -1 && param == NULL)
oprintf (of, "%*sabort();\n", indent, "");
else
error_at_line (&f->line,
@@ -1275,16 +1839,6 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
oprintf (of, "%*s}\n", indent, "");
}
- if (special != NULL && strcmp (special, "tree_exp") == 0)
- {
- oprintf (of,
- "%*sfor (; i%d_0 < tree_exp_size; i%d_0++)\n",
- indent, "", loopcounter, loopcounter);
- oprintf (of, "%*s gt_ggc_m_rtx_def (%s.%s[i%d_0]);\n",
- indent, "", val, f->name, loopcounter);
- special = NULL;
- }
-
indent -= 2;
oprintf (of, "%*s}\n", indent, "");
break;
@@ -1297,18 +1851,21 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
break;
}
- if (s->kind == TYPE_UNION && ! always_p )
+ if (s->kind == TYPE_UNION)
{
+ oprintf (of, "%*sbreak;\n", indent, "");
indent -= 2;
- oprintf (of, "%*s}\n", indent, "");
}
- if (special)
- error_at_line (&f->line, "unhandled special `%s'", special);
}
if (s->kind == TYPE_UNION)
{
- indent -= 2;
+ if (! seen_default)
+ {
+ oprintf (of, "%*sdefault:\n", indent, "");
+ oprintf (of, "%*s break;\n", indent, "");
+ }
oprintf (of, "%*s}\n", indent, "");
+ indent -= 2;
}
}
@@ -1316,36 +1873,96 @@ write_gc_structure_fields (of, s, val, prev_val, opts, indent, line, bitmap,
enclosing PARAM_IS option. */
static void
-write_gc_marker_routine_for_structure (s, param)
+write_gc_marker_routine_for_structure (orig_s, s, param)
+ type_p orig_s;
type_p s;
- type_p param;
+ type_p * param;
{
outf_p f;
- if (param == NULL)
- f = get_output_file_with_visibility (s->u.s.line.file);
- else
- f = get_output_file_with_visibility (param->u.s.line.file);
+ const char *fn = s->u.s.line.file;
+ int i;
+ const char *chain_next = NULL;
+ const char *chain_prev = NULL;
+ options_p opt;
+
+ /* This is a hack, and not the good kind either. */
+ for (i = NUM_PARAM - 1; i >= 0; i--)
+ if (param && param[i] && param[i]->kind == TYPE_POINTER
+ && UNION_OR_STRUCT_P (param[i]->u.p))
+ fn = param[i]->u.p->u.s.line.file;
+
+ f = get_output_file_with_visibility (fn);
- oprintf (f, "%c", '\n');
+ for (opt = s->u.s.opt; opt; opt = opt->next)
+ if (strcmp (opt->name, "chain_next") == 0)
+ chain_next = (const char *) opt->info;
+ else if (strcmp (opt->name, "chain_prev") == 0)
+ chain_prev = (const char *) opt->info;
+
+ if (chain_prev != NULL && chain_next == NULL)
+ error_at_line (&s->u.s.line, "chain_prev without chain_next");
+
+ oprintf (f, "\n");
oprintf (f, "void\n");
if (param == NULL)
- oprintf (f, "gt_ggc_mx_%s (x_p)\n", s->u.s.tag);
+ oprintf (f, "gt_ggc_mx_%s", s->u.s.tag);
else
- oprintf (f, "gt_ggc_mm_%d%s_%s (x_p)\n", (int) strlen (param->u.s.tag),
- param->u.s.tag, s->u.s.tag);
+ {
+ oprintf (f, "gt_ggc_m_");
+ output_mangled_typename (f, orig_s);
+ }
+ oprintf (f, " (x_p)\n");
oprintf (f, " void *x_p;\n");
oprintf (f, "{\n");
- oprintf (f, " %s %s * const x = (%s %s *)x_p;\n",
+ oprintf (f, " %s %s * %sx = (%s %s *)x_p;\n",
s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
+ chain_next == NULL ? "const " : "",
s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
- oprintf (f, " if (! ggc_test_and_set_mark (x))\n");
- oprintf (f, " return;\n");
+ if (chain_next != NULL)
+ oprintf (f, " %s %s * xlimit = x;\n",
+ s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
+ if (chain_next == NULL)
+ oprintf (f, " if (ggc_test_and_set_mark (x))\n");
+ else
+ {
+ oprintf (f, " while (ggc_test_and_set_mark (xlimit))\n");
+ oprintf (f, " xlimit = (");
+ output_escaped_param (f, chain_next, "*xlimit", "*xlimit",
+ "chain_next", &s->u.s.line);
+ oprintf (f, ");\n");
+ if (chain_prev != NULL)
+ {
+ oprintf (f, " if (x != xlimit)\n");
+ oprintf (f, " for (;;)\n");
+ oprintf (f, " {\n");
+ oprintf (f, " %s %s * const xprev = (",
+ s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
+ output_escaped_param (f, chain_prev, "*x", "*x",
+ "chain_prev", &s->u.s.line);
+ oprintf (f, ");\n");
+ oprintf (f, " if (xprev == NULL) break;\n");
+ oprintf (f, " x = xprev;\n");
+ oprintf (f, " ggc_set_mark (xprev);\n");
+ oprintf (f, " }\n");
+ }
+ oprintf (f, " while (x != xlimit)\n");
+ }
+ oprintf (f, " {\n");
gc_counter = 0;
write_gc_structure_fields (f, s, "(*x)", "not valid postage",
- s->u.s.opt, 2, &s->u.s.line, s->u.s.bitmap,
+ s->u.s.opt, 6, &s->u.s.line, s->u.s.bitmap,
param);
+ if (chain_next != NULL)
+ {
+ oprintf (f, " x = (");
+ output_escaped_param (f, chain_next, "*x", "*x",
+ "chain_next", &s->u.s.line);
+ oprintf (f, ");\n");
+ }
+
+ oprintf (f, " }\n");
oprintf (f, "}\n");
}
@@ -1369,8 +1986,9 @@ write_gc_types (structures, param_structs)
&& s->u.s.line.file == NULL)
continue;
- oprintf (header_file,
- "#define gt_ggc_m_%s(X) do { \\\n", s->u.s.tag);
+ oprintf (header_file, "#define gt_ggc_m_");
+ output_mangled_typename (header_file, s);
+ oprintf (header_file, "(X) do { \\\n");
oprintf (header_file,
" if (X != NULL) gt_ggc_mx_%s (X);\\\n", s->u.s.tag);
oprintf (header_file,
@@ -1410,31 +2028,22 @@ write_gc_types (structures, param_structs)
{
type_p ss;
for (ss = s->u.s.lang_struct; ss; ss = ss->next)
- write_gc_marker_routine_for_structure (ss, NULL);
+ write_gc_marker_routine_for_structure (s, ss, NULL);
}
else
- write_gc_marker_routine_for_structure (s, NULL);
+ write_gc_marker_routine_for_structure (s, s, NULL);
}
for (s = param_structs; s; s = s->next)
if (s->gc_used == GC_POINTED_TO)
{
- type_p param = s->u.param_struct.param;
+ type_p * param = s->u.param_struct.param;
type_p stru = s->u.param_struct.stru;
- if (param->kind != TYPE_STRUCT && param->kind != TYPE_UNION
- && param->kind != TYPE_LANG_STRUCT)
- {
- error_at_line (&s->u.param_struct.line,
- "unsupported parameter type");
- continue;
- }
-
/* Declare the marker procedure. */
- oprintf (header_file,
- "extern void gt_ggc_mm_%d%s_%s PARAMS ((void *));\n",
- (int) strlen (param->u.s.tag), param->u.s.tag,
- stru->u.s.tag);
+ oprintf (header_file, "extern void gt_ggc_m_");
+ output_mangled_typename (header_file, s);
+ oprintf (header_file, " PARAMS ((void *));\n");
if (stru->u.s.line.file == NULL)
{
@@ -1447,13 +2056,48 @@ write_gc_types (structures, param_structs)
{
type_p ss;
for (ss = stru->u.s.lang_struct; ss; ss = ss->next)
- write_gc_marker_routine_for_structure (ss, param);
+ write_gc_marker_routine_for_structure (s, ss, param);
}
else
- write_gc_marker_routine_for_structure (stru, param);
+ write_gc_marker_routine_for_structure (s, stru, param);
+ }
+}
+
+/* Write out the 'enum' definition for gt_types_enum. */
+
+static void
+write_enum_defn (structures, param_structs)
+ type_p structures;
+ type_p param_structs;
+{
+ type_p s;
+
+ oprintf (header_file, "\n/* Enumeration of types known. */\n");
+ oprintf (header_file, "enum gt_types_enum {\n");
+ for (s = structures; s; s = s->next)
+ if (s->gc_used == GC_POINTED_TO
+ || s->gc_used == GC_MAYBE_POINTED_TO)
+ {
+ if (s->gc_used == GC_MAYBE_POINTED_TO
+ && s->u.s.line.file == NULL)
+ continue;
+
+ oprintf (header_file, " gt_ggc_e_");
+ output_mangled_typename (header_file, s);
+ oprintf (header_file, ", \n");
}
+ for (s = param_structs; s; s = s->next)
+ if (s->gc_used == GC_POINTED_TO)
+ {
+ oprintf (header_file, " gt_e_");
+ output_mangled_typename (header_file, s);
+ oprintf (header_file, ", \n");
+ }
+ oprintf (header_file, " gt_types_enum_last\n");
+ oprintf (header_file, "};\n");
}
+
/* Mangle FN and print it to F. */
static void
@@ -1540,7 +2184,7 @@ finish_root_table (flp, pfx, lastname, tname, name)
if (bitmap & 1)
{
oprintf (base_files[fnum], " NULL\n");
- oprintf (base_files[fnum], "};\n\n");
+ oprintf (base_files[fnum], "};\n");
}
}
}
@@ -1667,10 +2311,8 @@ write_gc_root (f, v, type, name, has_length, line, if_marked)
}
else if (! has_length && tp->kind == TYPE_PARAM_STRUCT)
{
- oprintf (f, " &gt_ggc_mm_%d%s_%s",
- (int) strlen (tp->u.param_struct.param->u.s.tag),
- tp->u.param_struct.param->u.s.tag,
- tp->u.param_struct.stru->u.s.tag);
+ oprintf (f, " &gt_ggc_m_");
+ output_mangled_typename (f, tp);
}
else if (has_length
&& (tp->kind == TYPE_POINTER || UNION_OR_STRUCT_P (tp)))
@@ -1724,6 +2366,10 @@ write_gc_roots (variables)
deletable_p = 1;
else if (strcmp (o->name, "param_is") == 0)
;
+ else if (strncmp (o->name, "param", 5) == 0
+ && ISDIGIT (o->name[5])
+ && strcmp (o->name + 6, "_is") == 0)
+ ;
else if (strcmp (o->name, "if_marked") == 0)
;
else
@@ -1768,7 +2414,8 @@ write_gc_roots (variables)
s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
oprintf (f, " if (ggc_test_and_set_mark (x))\n");
oprintf (f, " for (i = 0; i < (%s); i++)\n", length);
- if (s->kind != TYPE_STRUCT && s->kind != TYPE_UNION)
+ if (! UNION_OR_STRUCT_P (s)
+ && ! s->kind == TYPE_PARAM_STRUCT)
{
error_at_line (&v->line,
"global `%s' has unsupported ** type",
@@ -1776,7 +2423,9 @@ write_gc_roots (variables)
continue;
}
- oprintf (f, " gt_ggc_m_%s (x[i]);\n", s->u.s.tag);
+ oprintf (f, " gt_ggc_m_");
+ output_mangled_typename (f, s);
+ oprintf (f, " (x[i]);\n");
}
else
{
@@ -1906,7 +2555,7 @@ write_gc_roots (variables)
oprintf (f, "[] = {\n");
}
- write_gc_root (f, v, create_pointer (v->type->u.p->u.param_struct.param),
+ write_gc_root (f, v, v->type->u.p->u.param_struct.param[0],
v->name, length_p, &v->line, if_marked);
}
@@ -1925,20 +2574,19 @@ main(argc, argv)
static struct fileloc pos = { __FILE__, __LINE__ };
unsigned j;
+ gen_rtx_next ();
+
srcdir_len = strlen (srcdir);
- do_typedef ("CUMULATIVE_ARGS",
- create_scalar_type ("CUMULATIVE_ARGS",
- strlen ("CUMULATIVE_ARGS")),
- &pos);
- do_typedef ("REAL_VALUE_TYPE",
- create_scalar_type ("REAL_VALUE_TYPE",
- strlen ("REAL_VALUE_TYPE")),
- &pos);
+ do_scalar_typedef ("CUMULATIVE_ARGS", &pos);
+ do_scalar_typedef ("REAL_VALUE_TYPE", &pos);
+ do_scalar_typedef ("uint8", &pos);
+ do_scalar_typedef ("jword", &pos);
+ do_scalar_typedef ("JCF_u2", &pos);
+
do_typedef ("PTR", create_pointer (create_scalar_type ("void",
strlen ("void"))),
&pos);
-
do_typedef ("HARD_REG_SET", create_array (
create_scalar_type ("unsigned long", strlen ("unsigned long")),
"2"), &pos);
@@ -1965,8 +2613,10 @@ main(argc, argv)
set_gc_used (variables);
open_base_files ();
+ write_enum_defn (structures, param_structs);
write_gc_types (structures, param_structs);
write_gc_roots (variables);
+ write_rtx_next ();
close_output_files ();
return (hit_error != 0);
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 20e496da05c..0c23d95f44a 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -41,7 +41,7 @@ enum typekind {
typedef struct options {
struct options *next;
const char *name;
- void *info;
+ const void *info;
} *options_p;
typedef struct pair *pair_p;
@@ -57,6 +57,8 @@ struct pair {
options_p opt;
};
+#define NUM_PARAM 10
+
/* A description of a type. */
struct type {
enum typekind kind;
@@ -85,7 +87,7 @@ struct type {
} a;
struct {
type_p stru;
- type_p param;
+ type_p param[NUM_PARAM];
struct fileloc line;
} param_struct;
} u;
diff --git a/gcc/genmultilib b/gcc/genmultilib
index 3cbfaa1ebab..ca3b71bdfa3 100644
--- a/gcc/genmultilib
+++ b/gcc/genmultilib
@@ -63,6 +63,14 @@
# for the rule to exclude a set. Options can be preceded with a '!' to
# match a logical NOT.
+# The optional sevenths argument is a list of OS subdirectory names.
+# The format is the same as of the second argument.
+# The difference is that second argument describes multilib directories
+# in GCC conventions, while this one the OS multilib convention.
+
+# The last option should be "yes" if multilibs are enabled. If it is not
+# "yes", all GCC multilib dir names will be ".".
+
# The output looks like
# #define MULTILIB_MATCHES "\
# SUBDIRECTORY OPTIONS;\
@@ -79,17 +87,18 @@
# Here is an example (this is from the actual sparc64 case):
# genmultilib 'm64/m32 mno-app-regs|mcmodel=medany' '64 32 alt'
# 'mcmodel?medany=mcmodel?medmid' 'm32/mno-app-regs* m32/mcmodel=*'
-# 'm32/!m64/mno-app-regs m32/!m64/mcmodel=medany'
+# '' 'm32/!m64/mno-app-regs m32/!m64/mcmodel=medany'
+# '../lib64 ../lib32 alt' yes
# This produces:
# ". !m64 !m32 !mno-app-regs !mcmodel=medany;",
-# "64 m64 !m32 !mno-app-regs !mcmodel=medany;",
-# "32 !m64 m32 !mno-app-regs !mcmodel=medany;",
+# "64:../lib64 m64 !m32 !mno-app-regs !mcmodel=medany;",
+# "32:../lib32 !m64 m32 !mno-app-regs !mcmodel=medany;",
# "alt !m64 !m32 mno-app-regs mcmodel=medany;",
# "alt !m64 !m32 mno-app-regs !mcmodel=medany;",
# "alt !m64 !m32 !mno-app-regs mcmodel=medany;",
-# "64/alt m64 !m32 mno-app-regs mcmodel=medany;",
-# "64/alt m64 !m32 mno-app-regs !mcmodel=medany;",
-# "64/alt m64 !m32 !mno-app-regs mcmodel=medany;",
+# "64/alt:../lib64/alt m64 !m32 mno-app-regs mcmodel=medany;",
+# "64/alt:../lib64/alt m64 !m32 mno-app-regs !mcmodel=medany;",
+# "64/alt:../lib64/alt m64 !m32 !mno-app-regs mcmodel=medany;",
#
# The effect is that `gcc -mno-app-regs' (for example) will append "alt"
# to the directory name when searching for libraries or startup files and
@@ -106,6 +115,8 @@ matches=$3
exceptions=$4
extra=$5
exclusions=$6
+osdirnames=$7
+enable_multilib=$8
echo "static const char *const multilib_raw[] = {"
@@ -202,6 +213,29 @@ if [ -n "${dirnames}" ]; then
done
fi
+# Construct a sed pattern which will convert option names to OS directory
+# names.
+toosdirnames=
+if [ -n "${osdirnames}" ]; then
+ set x ${osdirnames}
+ shift
+ for set in ${options}; do
+ for opts in `echo ${set} | sed -e 's|/| |'g`; do
+ patt="/"
+ for opt in `echo ${opts} | sed -e 's_|_ _'g`; do
+ if [ "$1" != "${opt}" ]; then
+ toosdirnames="${toosdirnames} -e s|/${opt}/|/${1}/|g"
+ patt="${patt}${1}/"
+ if [ "${patt}" != "/${1}/" ]; then
+ toosdirnames="${toosdirnames} -e s|${patt}|/${1}/|g"
+ fi
+ fi
+ done
+ shift
+ done
+ done
+fi
+
# We need another recursive shell script to correctly handle positive
# matches. If we are invoked as
# genmultilib "opt1 opt2" "" "opt1=nopt1 opt2=nopt2"
@@ -257,6 +291,25 @@ for combo in ${combinations}; do
# Remove the leading and trailing slashes.
dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'`
+ # Use the OS directory names rather than the option names.
+ if [ -n "${toosdirnames}" ]; then
+ osdirout=`echo ${combo} | sed ${toosdirnames}`
+ # Remove the leading and trailing slashes.
+ osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/$||g'`
+ if [ "x${enable_multilib}" != xyes ]; then
+ dirout=".:${osdirout}"
+ else
+ dirout="${dirout}:${osdirout}"
+ fi
+ else
+ if [ "x${enable_multilib}" != xyes ]; then
+ # genmultilib with --disable-multilib should be
+ # called with '' '' '' '' '' '' '' no
+ # if MULTILIB_OSDIRNAMES is empty.
+ exit 1
+ fi
+ fi
+
# Look through the options. We must output each option that is
# present, and negate each option that is not present.
optout=
@@ -313,6 +366,11 @@ done
echo "NULL"
echo "};"
+# Output the options now
+moptions=`echo ${options} | sed -e 's,[ ][ ]*, ,g'`
+echo ""
+echo "static const char *multilib_options = \"${moptions}\";"
+
rm -f tmpmultilib2
exit 0
diff --git a/gcc/genoutput.c b/gcc/genoutput.c
index 80b73fcb915..b7981a6b881 100644
--- a/gcc/genoutput.c
+++ b/gcc/genoutput.c
@@ -235,6 +235,7 @@ output_prologue ()
printf ("#include \"recog.h\"\n\n");
printf ("#include \"toplev.h\"\n");
printf ("#include \"output.h\"\n");
+ printf ("#include \"target.h\"\n");
}
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index 7709eb8b6a6..9900b990a66 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -1200,7 +1200,7 @@ maybe_both_true_1 (d1, d2)
D1 and D2. Otherwise, return 1 (it may be that there is an RTL that
can match both or just that we couldn't prove there wasn't such an RTL).
- TOPLEVEL is non-zero if we are to only look at the top level and not
+ TOPLEVEL is nonzero if we are to only look at the top level and not
recursively descend. */
static int
@@ -1677,7 +1677,7 @@ find_afterward (head, real_afterward)
/* Assuming that the state of argument is denoted by OLDPOS, take whatever
actions are necessary to move to NEWPOS. If we fail to move to the
- new state, branch to node AFTERWARD if non-zero, otherwise return.
+ new state, branch to node AFTERWARD if nonzero, otherwise return.
Failure to move to the new state can only occur if we are trying to
match multiple insns and we try to step past the end of the stream. */
diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c
index b5dad6bbd76..2674cec52a1 100644
--- a/gcc/ggc-common.c
+++ b/gcc/ggc-common.c
@@ -34,7 +34,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Statistics about the allocation. */
static ggc_statistics *ggc_stats;
-static void ggc_mark_rtx_children_1 PARAMS ((rtx));
static int ggc_htab_delete PARAMS ((void **, void *));
/* Maintain global roots that are preserved during GC. */
@@ -128,141 +127,8 @@ ggc_mark_roots ()
they are not already marked. */
for (ct = gt_ggc_cache_rtab; *ct; ct++)
for (cti = *ct; cti->base != NULL; cti++)
- htab_traverse (*cti->base, ggc_htab_delete, (PTR) cti);
-}
-
-/* R had not been previously marked, but has now been marked via
- ggc_set_mark. Now recurse and process the children. */
-
-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;
-
- do
- {
- enum rtx_code code = GET_CODE (r);
- /* This gets set to a child rtx to eliminate tail recursion. */
- next_rtx = NULL;
-
- /* Collect statistics, if appropriate. */
- if (ggc_stats)
- {
- ++ggc_stats->num_rtxs[(int) code];
- ggc_stats->size_rtxs[(int) code] += ggc_get_size (r);
- }
-
- /* ??? If (some of) these are really pass-dependent info, do we
- have any right poking our noses in? */
- switch (code)
- {
- case MEM:
- gt_ggc_m_mem_attrs (MEM_ATTRS (r));
- break;
- case JUMP_INSN:
- ggc_mark_rtx (JUMP_LABEL (r));
- break;
- case CODE_LABEL:
- ggc_mark_rtx (LABEL_REFS (r));
- break;
- case LABEL_REF:
- ggc_mark_rtx (LABEL_NEXTREF (r));
- ggc_mark_rtx (CONTAINING_INSN (r));
- break;
- case ADDRESSOF:
- ggc_mark_tree (ADDRESSOF_DECL (r));
- break;
- case NOTE:
- switch (NOTE_LINE_NUMBER (r))
- {
- case NOTE_INSN_EXPECTED_VALUE:
- ggc_mark_rtx (NOTE_EXPECTED_VALUE (r));
- break;
-
- case NOTE_INSN_BLOCK_BEG:
- case NOTE_INSN_BLOCK_END:
- ggc_mark_tree (NOTE_BLOCK (r));
- break;
-
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- for (fmt = GET_RTX_FORMAT (GET_CODE (r)), i = 0; *fmt ; ++fmt, ++i)
- {
- rtx exp;
- switch (*fmt)
- {
- case 'e': case 'u':
- exp = XEXP (r, i);
- if (ggc_test_and_set_mark (exp))
- {
- if (next_rtx == NULL)
- next_rtx = exp;
- else
- ggc_mark_rtx_children (exp);
- }
- break;
- case 'V': case 'E':
- gt_ggc_m_rtvec_def (XVEC (r, i));
- break;
- }
- }
- }
- while ((r = next_rtx) != NULL);
-}
-
-/* Various adaptor functions. */
-void
-gt_ggc_mx_rtx_def (x)
- void *x;
-{
- ggc_mark_rtx((rtx)x);
+ if (*cti->base)
+ htab_traverse (*cti->base, ggc_htab_delete, (PTR) cti);
}
/* Allocate a block of memory, then clear it. */
diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c
index af3af1ab0bb..9a2c03ef721 100644
--- a/gcc/ggc-page.c
+++ b/gcc/ggc-page.c
@@ -405,7 +405,7 @@ static void poison_pages PARAMS ((void));
void debug_print_page_list PARAMS ((int));
-/* Returns non-zero if P was allocated in GC'able memory. */
+/* Returns nonzero if P was allocated in GC'able memory. */
static inline int
ggc_allocated_p (p)
@@ -874,7 +874,7 @@ static unsigned char size_lookup[257] =
8
};
-/* Allocate a chunk of memory of SIZE bytes. If ZERO is non-zero, the
+/* Allocate a chunk of memory of SIZE bytes. If ZERO is nonzero, the
memory is zeroed; otherwise, its contents are undefined. */
void *
@@ -1080,6 +1080,18 @@ compute_inverse (order)
{
unsigned size, inv, e;
+ /* There can be only one object per "page" in a bucket for sizes
+ larger than half a machine page; it will always have offset zero. */
+ if (OBJECT_SIZE (order) > G.pagesize/2)
+ {
+ if (OBJECTS_PER_PAGE (order) != 1)
+ abort ();
+
+ DIV_MULT (order) = 1;
+ DIV_SHIFT (order) = 0;
+ return;
+ }
+
size = OBJECT_SIZE (order);
e = 0;
while (size % 2 == 0)
diff --git a/gcc/ggc.h b/gcc/ggc.h
index 0cd87f4dad9..4cd6242ee92 100644
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -1,5 +1,5 @@
/* Garbage collection for the GNU compiler.
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -62,21 +62,13 @@ extern const struct ggc_cache_tab * const gt_ggc_cache_rtab[];
extern void ggc_mark_roots PARAMS ((void));
-extern void ggc_mark_rtx_children PARAMS ((struct rtx_def *));
-
/* If EXPR is not NULL and previously unmarked, mark it and evaluate
to true. Otherwise evaluate to false. */
#define ggc_test_and_set_mark(EXPR) \
((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR))
-#define ggc_mark_rtx(EXPR) \
- do { \
- rtx const r__ = (EXPR); \
- if (ggc_test_and_set_mark (r__)) \
- ggc_mark_rtx_children (r__); \
- } while (0)
-
-#define ggc_mark_tree gt_ggc_m_tree_node
+#define ggc_mark_rtx gt_ggc_m_7rtx_def
+#define ggc_mark_tree gt_ggc_m_9tree_node
#define ggc_mark(EXPR) \
do { \
@@ -138,7 +130,7 @@ extern void ggc_collect PARAMS ((void));
/* Actually set the mark on a particular region of memory, but don't
follow pointers. This function is called by ggc_mark_*. It
- returns zero if the object was not previously marked; non-zero if
+ returns zero if the object was not previously marked; nonzero if
the object was already marked, or if, for any other reason,
pointers in this data structure should not be traversed. */
extern int ggc_set_mark PARAMS ((const void *));
diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h
new file mode 100644
index 00000000000..f501a8abe93
--- /dev/null
+++ b/gcc/ginclude/float.h
@@ -0,0 +1,162 @@
+/* Copyright (C) 2002 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. */
+
+/* As a special exception, if you include this header file into source
+ files compiled by GCC, this header file 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. */
+
+/*
+ * ISO C Standard: 5.2.4.2.2 Characteristics of floating types <float.h>
+ */
+
+#ifndef _FLOAT_H___
+#define _FLOAT_H___
+
+/* Radix of exponent representation, b. */
+#undef FLT_RADIX
+#define FLT_RADIX __FLT_RADIX__
+
+/* Number of base-FLT_RADIX digits in the significand, p. */
+#undef FLT_MANT_DIG
+#undef DBL_MANT_DIG
+#undef LDBL_MANT_DIG
+#define FLT_MANT_DIG __FLT_MANT_DIG__
+#define DBL_MANT_DIG __DBL_MANT_DIG__
+#define LDBL_MANT_DIG __LDBL_MANT_DIG__
+
+/* Number of decimal digits, q, such that any floating-point number with q
+ decimal digits can be rounded into a floating-point number with p radix b
+ digits and back again without change to the q decimal digits,
+
+ p * log10(b) if b is a power of 10
+ floor((p - 1) * log10(b)) otherwise
+*/
+#undef FLT_DIG
+#undef DBL_DIG
+#undef LDBL_DIG
+#define FLT_DIG __FLT_DIG__
+#define DBL_DIG __DBL_DIG__
+#define LDBL_DIG __LDBL_DIG__
+
+/* Minimum int x such that FLT_RADIX**(x-1) is a normalized float, emin */
+#undef FLT_MIN_EXP
+#undef DBL_MIN_EXP
+#undef LDBL_MIN_EXP
+#define FLT_MIN_EXP __FLT_MIN_EXP__
+#define DBL_MIN_EXP __DBL_MIN_EXP__
+#define LDBL_MIN_EXP __LDBL_MIN_EXP__
+
+/* Minimum negative integer such that 10 raised to that power is in the
+ range of normalized floating-point numbers,
+
+ ceil(log10(b) * (emin - 1))
+*/
+#undef FLT_MIN_10_EXP
+#undef DBL_MIN_10_EXP
+#undef LDBL_MIN_10_EXP
+#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
+#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
+#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
+
+/* Maximum int x such that FLT_RADIX**(x-1) is a representable float, emax. */
+#undef FLT_MAX_EXP
+#undef DBL_MAX_EXP
+#undef LDBL_MAX_EXP
+#define FLT_MAX_EXP __FLT_MAX_EXP__
+#define DBL_MAX_EXP __DBL_MAX_EXP__
+#define LDBL_MAX_EXP __LDBL_MAX_EXP__
+
+/* Maximum integer such that 10 raised to that power is in the range of
+ representable finite floating-point numbers,
+
+ floor(log10((1 - b**-p) * b**emax))
+*/
+#undef FLT_MAX_10_EXP
+#undef DBL_MAX_10_EXP
+#undef LDBL_MAX_10_EXP
+#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
+#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
+#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
+
+/* Maximum representable finite floating-point number,
+
+ (1 - b**-p) * b**emax
+*/
+#undef FLT_MAX
+#undef DBL_MAX
+#undef LDBL_MAX
+#define FLT_MAX __FLT_MAX__
+#define DBL_MAX __DBL_MAX__
+#define LDBL_MAX __LDBL_MAX__
+
+/* The difference between 1 and the least value greater than 1 that is
+ representable in the given floating point type, b**1-p. */
+#undef FLT_EPSILON
+#undef DBL_EPSILON
+#undef LDBL_EPSILON
+#define FLT_EPSILON __FLT_EPSILON__
+#define DBL_EPSILON __DBL_EPSILON__
+#define LDBL_EPSILON __LDBL_EPSILON__
+
+/* Minimum normalized positive floating-point number, b**(emin - 1). */
+#undef FLT_MIN
+#undef DBL_MIN
+#undef LDBL_MIN
+#define FLT_MIN __FLT_MIN__
+#define DBL_MIN __DBL_MIN__
+#define LDBL_MIN __LDBL_MIN__
+
+/* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown. */
+/* ??? This is supposed to change with calls to fesetround in <fenv.h>. */
+#undef FLT_ROUNDS
+#define FLT_ROUNDS 1
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+/* The floating-point expression evaluation method.
+ -1 indeterminate
+ 0 evaluate all operations and constants just to the range and
+ precision of the type
+ 1 evaluate operations and constants of type float and double
+ to the range and precision of the double type, evaluate
+ long double operations and constants to the range and
+ precision of the long double type
+ 2 evaluate all operations and constants to the range and
+ precision of the long double type
+
+ ??? This ought to change with the setting of the fp control word;
+ the value provided by the compiler assumes the widest setting. */
+#undef FLT_EVAL_METHOD
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+
+/* Number of decimal digits, n, such that any floating-point number in the
+ widest supported floating type with pmax radix b digits can be rounded
+ to a floating-point number with n decimal digits and back again without
+ change to the value,
+
+ pmax * log10(b) if b is a power of 10
+ ceil(1 + pmax * log10(b)) otherwise
+*/
+#undef DECIMAL_DIG
+#define DECIMAL_DIG __DECIMAL_DIG__
+
+#endif /* C99 */
+#endif /* _FLOAT_H___ */
diff --git a/gcc/ginclude/stddef.h b/gcc/ginclude/stddef.h
index d122a7dac80..2cd15899af1 100644
--- a/gcc/ginclude/stddef.h
+++ b/gcc/ginclude/stddef.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1989, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1989, 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -53,9 +53,13 @@ Boston, MA 02111-1307, USA. */
/* On 4.3bsd-net2, make sure ansi.h is included, so we have
one less case to deal with in the following. */
-#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__)
+#if defined (__BSD_NET2__) || defined (____386BSD____) || (defined (__FreeBSD__) && (__FreeBSD__ < 5)) || defined(__NetBSD__)
#include <machine/ansi.h>
#endif
+/* On FreeBSD 5, machine/ansi.h does not exist anymore... */
+#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
+#include <sys/_types.h>
+#endif
/* In 4.3bsd-net2, machine/ansi.h defines these symbols, which are
defined if the corresponding type is *not* defined.
@@ -176,6 +180,7 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
#ifndef _SIZE_T_DEFINED_
#ifndef _SIZE_T_DEFINED
#ifndef _BSD_SIZE_T_DEFINED_ /* Darwin */
+#ifndef _SIZE_T_DECLARED /* FreeBSD 5 */
#ifndef ___int_size_t_h
#ifndef _GCC_SIZE_T
#ifndef _SIZET_
@@ -192,10 +197,15 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
#define _SIZE_T_DEFINED_
#define _SIZE_T_DEFINED
#define _BSD_SIZE_T_DEFINED_ /* Darwin */
+#define _SIZE_T_DECLARED /* FreeBSD 5 */
#define ___int_size_t_h
#define _GCC_SIZE_T
#define _SIZET_
+#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
+/* __size_t is a typedef on FreeBSD 5!, must not trash it. */
+#else
#define __size_t
+#endif
#ifndef __SIZE_TYPE__
#define __SIZE_TYPE__ long unsigned int
#endif
@@ -209,6 +219,7 @@ typedef long ssize_t;
#endif /* _SIZET_ */
#endif /* _GCC_SIZE_T */
#endif /* ___int_size_t_h */
+#endif /* _SIZE_T_DECLARED */
#endif /* _BSD_SIZE_T_DEFINED_ */
#endif /* _SIZE_T_DEFINED */
#endif /* _SIZE_T_DEFINED_ */
@@ -243,6 +254,7 @@ typedef long ssize_t;
#ifndef _BSD_WCHAR_T_
#ifndef _BSD_WCHAR_T_DEFINED_ /* Darwin */
#ifndef _BSD_RUNE_T_DEFINED_ /* Darwin */
+#ifndef _WCHAR_T_DECLARED /* FreeBSD 5 */
#ifndef _WCHAR_T_DEFINED_
#ifndef _WCHAR_T_DEFINED
#ifndef _WCHAR_T_H
@@ -263,6 +275,7 @@ typedef long ssize_t;
#define ___int_wchar_t_h
#define __INT_WCHAR_T_H
#define _GCC_WCHAR_T
+#define _WCHAR_T_DECLARED
/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_
instead of _WCHAR_T_, and _BSD_RUNE_T_ (which, unlike the other
@@ -281,7 +294,7 @@ typedef long ssize_t;
typedef _BSD_RUNE_T_ rune_t;
#define _BSD_WCHAR_T_DEFINED_
#define _BSD_RUNE_T_DEFINED_ /* Darwin */
-#if defined (__FreeBSD__)
+#if defined (__FreeBSD__) && (__FreeBSD__ < 5)
/* Why is this file so hard to maintain properly? In constrast to
the comment above regarding BSD/386 1.1, on FreeBSD for as long
as the symbol has existed, _BSD_RUNE_T_ must not stay defined or
@@ -291,6 +304,19 @@ typedef _BSD_RUNE_T_ rune_t;
#endif
#endif
#endif
+/* FreeBSD 5 can't be handled well using "traditional" logic above
+ since it no longer defines _BSD_RUNE_T_ yet still desires to export
+ rune_t in some cases... */
+#if defined (__FreeBSD__) && (__FreeBSD__ >= 5)
+#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE)
+#if __BSD_VISIBLE
+#ifndef _RUNE_T_DECLARED
+typedef __rune_t rune_t;
+#define _RUNE_T_DECLARED
+#endif
+#endif
+#endif
+#endif
#ifndef __WCHAR_TYPE__
#define __WCHAR_TYPE__ int
@@ -304,6 +330,7 @@ typedef __WCHAR_TYPE__ wchar_t;
#endif
#endif
#endif
+#endif /* _WCHAR_T_DECLARED */
#endif /* _BSD_RUNE_T_DEFINED_ */
#endif
#endif
diff --git a/gcc/global.c b/gcc/global.c
index d7950fa9aa2..86ed8938a99 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -951,7 +951,7 @@ prune_preferences ()
of a long enough stretch of hard regs none of which conflicts with ALLOCNO.
The registers marked in PREFREGS are tried first.
- LOSERS, if non-zero, is a HARD_REG_SET indicating registers that cannot
+ LOSERS, if nonzero, is a HARD_REG_SET indicating registers that cannot
be used for this allocation.
If ALT_REGS_P is zero, consider only the preferred class of ALLOCNO's reg.
@@ -1365,15 +1365,9 @@ record_conflicts (allocno_vec, len)
int *allocno_vec;
int len;
{
- int num;
- int ialloc_prod;
-
while (--len >= 0)
- {
- num = allocno_vec[len];
- ialloc_prod = num * allocno_row_words;
- IOR_HARD_REG_SET (allocno[num].hard_reg_conflicts, hard_regs_live);
- }
+ IOR_HARD_REG_SET (allocno[allocno_vec[len]].hard_reg_conflicts,
+ hard_regs_live);
}
/* If CONFLICTP (i, j) is true, make sure CONFLICTP (j, i) is also true. */
diff --git a/gcc/gthr-dce.h b/gcc/gthr-dce.h
index 273393b34df..3577ce5ec91 100644
--- a/gcc/gthr-dce.h
+++ b/gcc/gthr-dce.h
@@ -74,7 +74,7 @@ typedef pthread_mutex_t __gthread_mutex_t;
#pragma weak pthread_mutex_unlock
#ifdef _LIBOBJC
-/* Objective C. */
+/* Objective-C. */
#pragma weak pthread_cond_broadcast
#pragma weak pthread_cond_destroy
#pragma weak pthread_cond_init
diff --git a/gcc/gthr-posix.h b/gcc/gthr-posix.h
index ecd4f97fd6e..80f6ff742a2 100644
--- a/gcc/gthr-posix.h
+++ b/gcc/gthr-posix.h
@@ -57,7 +57,7 @@ typedef pthread_mutex_t __gthread_mutex_t;
#pragma weak pthread_mutex_unlock
#ifdef _LIBOBJC
-/* Objective C. */
+/* Objective-C. */
#pragma weak pthread_cond_broadcast
#pragma weak pthread_cond_destroy
#pragma weak pthread_cond_init
diff --git a/gcc/gthr-win32.h b/gcc/gthr-win32.h
index 97f4f49ebb2..113fa5b7901 100644
--- a/gcc/gthr-win32.h
+++ b/gcc/gthr-win32.h
@@ -348,7 +348,7 @@ typedef void* __gthread_mutex_t;
#if __MINGW32_MAJOR_VERSION >= 1 || \
(__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2)
#define MINGW32_SUPPORTS_MT_EH 1
-/* Mingw runtime >= v0.3 provides a magic variable that is set to non-zero
+/* Mingw runtime >= v0.3 provides a magic variable that is set to nonzero
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;
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index 68a7e0d508b..c253f2cede1 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -158,7 +158,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
static int issue_rate;
-/* If the following variable value is non zero, the scheduler inserts
+/* If the following variable value is nonzero, the scheduler inserts
bubbles (nop insns). The value of variable affects on scheduler
behavior only if automaton pipeline interface with multipass
scheduling is used and hook dfa_bubble is defined. */
@@ -389,7 +389,7 @@ static rtx last_scheduled_insn;
/* Compute the function units used by INSN. This caches the value
returned by function_units_used. A function unit is encoded as the
- unit number if the value is non-negative and the compliment of a
+ unit number if the value is non-negative and the complement of a
mask if the value is negative. A function unit index is the
non-negative encoding. The scheduler using only DFA description
should never use the following function. */
diff --git a/gcc/hashtable.c b/gcc/hashtable.c
index bd2b13727bb..ff8959b40da 100644
--- a/gcc/hashtable.c
+++ b/gcc/hashtable.c
@@ -45,7 +45,7 @@ static void ht_expand PARAMS ((hash_table *));
#define OBSTACK_CHUNK_FREE free
#endif
-/* Initialise an obstack. */
+/* Initialize an obstack. */
void
gcc_obstack_init (obstack)
struct obstack *obstack;
diff --git a/gcc/hashtable.h b/gcc/hashtable.h
index 899647b6d84..02dfcf19d29 100644
--- a/gcc/hashtable.h
+++ b/gcc/hashtable.h
@@ -65,7 +65,7 @@ struct ht
extern void gcc_obstack_init PARAMS ((struct obstack *));
-/* Initialise the hashtable with 2 ^ order entries. */
+/* Initialize the hashtable with 2 ^ order entries. */
extern hash_table *ht_create PARAMS ((unsigned int order));
/* Frees all memory associated with a hash table. */
diff --git a/gcc/hooks.c b/gcc/hooks.c
index 0eb0e149ec6..b66d0d9f240 100644
--- a/gcc/hooks.c
+++ b/gcc/hooks.c
@@ -62,3 +62,12 @@ hook_FILEptr_constcharptr_void (a, b)
const char *b ATTRIBUTE_UNUSED;
{
}
+
+/* Hook that takes two trees and returns false. */
+bool
+hook_tree_tree_bool_false (a, b)
+ tree a ATTRIBUTE_UNUSED;
+ tree b ATTRIBUTE_UNUSED;
+{
+ return false;
+}
diff --git a/gcc/hooks.h b/gcc/hooks.h
index 4b80c321ef8..43ffed60c03 100644
--- a/gcc/hooks.h
+++ b/gcc/hooks.h
@@ -27,5 +27,5 @@ bool hook_tree_bool_false PARAMS ((tree));
void hook_tree_int_void PARAMS ((tree, int));
void hook_void_void PARAMS ((void));
void hook_FILEptr_constcharptr_void PARAMS ((FILE *, const char *));
-
+bool hook_tree_tree_bool_false PARAMS ((tree, tree));
#endif
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index f92b7e8285b..42c5fb50bdb 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -358,7 +358,7 @@ cond_exec_process_if_block (ce_info, do_multiple_p)
rtx then_end; /* last insn + 1 in THEN block */
rtx else_start = NULL_RTX; /* first insn in ELSE block or NULL */
rtx else_end = NULL_RTX; /* last insn + 1 in ELSE block */
- int max; /* max # of insns to convert. */
+ int max; /* max # of insns to convert. */
int then_mod_ok; /* whether conditional mods are ok in THEN */
rtx true_expr; /* test for else block insns */
rtx false_expr; /* test for then block insns */
@@ -1700,7 +1700,7 @@ noce_process_if_block (ce_info)
rtx insn_a, insn_b;
rtx set_a, set_b;
rtx orig_x, x, a, b;
- rtx jump, cond, insn;
+ rtx jump, cond;
/* We're looking for patterns of the form
@@ -1776,24 +1776,12 @@ noce_process_if_block (ce_info)
|| ! rtx_equal_p (x, SET_DEST (set_b))
|| reg_overlap_mentioned_p (x, cond)
|| reg_overlap_mentioned_p (x, a)
- || reg_overlap_mentioned_p (x, SET_SRC (set_b)))
+ || reg_overlap_mentioned_p (x, SET_SRC (set_b))
+ || modified_between_p (x, if_info.cond_earliest, NEXT_INSN (jump)))
insn_b = set_b = NULL_RTX;
}
b = (set_b ? SET_SRC (set_b) : x);
- /* X may not be mentioned in the range (cond_earliest, jump].
- Note the use of reg_overlap_mentioned_p, which handles memories
- properly, as opposed to reg_mentioned_p, which doesn't. */
- for (insn = jump; insn != if_info.cond_earliest; insn = PREV_INSN (insn))
- if (INSN_P (insn) && reg_overlap_mentioned_p (x, PATTERN (insn)))
- return FALSE;
-
- /* A and B may not be modified in the range [cond_earliest, jump). */
- for (insn = if_info.cond_earliest; insn != jump; insn = NEXT_INSN (insn))
- if (INSN_P (insn)
- && (modified_in_p (a, insn) || modified_in_p (b, insn)))
- return FALSE;
-
/* Only operate on register destinations, and even then avoid extending
the lifetime of hard registers on small register class machines. */
orig_x = x;
@@ -1839,7 +1827,7 @@ noce_process_if_block (ce_info)
if (else_bb && insn_b == else_bb->end)
else_bb->end = PREV_INSN (insn_b);
- reorder_insns (insn_b, insn_b, PREV_INSN (if_info.cond_earliest));
+ reorder_insns (insn_b, insn_b, PREV_INSN (jump));
/* If there was a REG_EQUAL note, delete it since it may have been
true due to this insn being after a jump. */
@@ -1894,9 +1882,9 @@ noce_process_if_block (ce_info)
if (insn_b && else_bb)
delete_insn (insn_b);
- /* The new insns will have been inserted before cond_earliest. 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. */
+ /* The new insns will have been inserted immediately 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);
/* If we used a temporary, fix it up now. */
@@ -3115,8 +3103,8 @@ if_convert (x_life_data_ok)
FOR_EACH_BB (bb)
{
- basic_block new_bb = find_if_header (bb, pass);
- if (new_bb)
+ basic_block new_bb;
+ while ((new_bb = find_if_header (bb, pass)))
bb = new_bb;
}
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 8d23ae9d754..0e54e48b1cf 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -245,7 +245,7 @@ function_cannot_inline_p (fndecl)
/* We will not inline a function which uses computed goto. The addresses of
its local labels, which may be tucked into global storage, are of course
- not constant across instantiations, which causes unexpected behaviour. */
+ not constant across instantiations, which causes unexpected behavior. */
if (current_function_has_computed_jump)
return N_("function with computed jump cannot inline");
@@ -1295,7 +1295,7 @@ expand_inline_function (fndecl, parms, target, ignore, type,
Copying is done in two passes, first the insns and then their REG_NOTES.
- If static_chain_value is non-zero, it represents the context-pointer
+ If static_chain_value is nonzero, it represents the context-pointer
register for the function. */
static void
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 72e1603f163..562b3749048 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,184 @@
+2002-10-20 Ranjit Mathew <rmathew@hotmail.com>
+
+ * gcj.texi: Added item describing the GCJ runtime property
+ "gnu.gcj.progname".
+
+2002-10-15 Richard Henderson <rth@redhat.com>
+
+ * jcf-parse.c (get_constant): Fix type warning.
+
+2002-10-15 Andrew Haley <aph@redhat.com>
+
+ * java-tree.h (java_inlining_merge_static_initializers): Declare.
+ (java_inlining_map_static_initializers): Declare.
+
+2002-10-14 Andrew Haley <aph@redhat.com>
+
+ * tree-inline.c (remap_block): All local class initialization
+ flags go in the outermost scope.
+ (expand_call_inline): Call java_inlining_map_static_initializers.
+ (expand_call_inline): Call java_inlining_merge_static_initializers.
+ * java/lang.c (merge_init_test_initialization): New.
+ (java_inlining_merge_static_initializers): New.
+ (inline_init_test_initialization): New.
+ (java_inlining_map_static_initializers): New.
+
+2002-10-11 Mark Wielaard <mark@klomp.org>
+
+ * gcj.texi (Compatibility): Add Limitations and Extensions section.
+
+2002-10-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * class.c (JAVA_TREEHASHHASH_H): Use htab_hash_pointer.
+
+2002-10-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * parse.y (merge_string_cste): Add parentheses around & within |.
+
+2002-10-08 Tom Tromey <tromey@redhat.com>
+
+ * parse.y (variable_declarator_id): Simplify error path for
+ array declarator error. For PR java/8003.
+
+2002-10-08 Zack Weinberg <zack@codesourcery.com>
+
+ * gjavah.c, jcf-dump.c, jv-scan.c: Globally replace GCCBUGURL with
+ bug_report_url.
+
+2002-10-08 Andrew Haley <aph@redhat.com>
+
+ * parse.y (attach_init_test_initialization_flags): Check for
+ error_mark_node.
+
+2002-10-07 Anthony Green <green@redhat.com>
+
+ * parse.y (merge_string_cste): Fix bug in string concatenation.
+
+2002-10-03 Michael Koch <konqueror@gmx.de>
+
+ * gcj.texi (Standard properties):
+ Change default of java.awt.toolkit to gnu.awt.gtk.GtkToolkit.
+
+2002-10-02 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6627
+ * lang.c (java_init): If storing the vbit in function
+ pointers, ensure that force_align_functions_log is atleast
+ one to aid compatability with g++ vtables.
+
+2002-10-01 Nathan Sidwell <nathan@codesourcery.com>
+
+ * jcf-dump.c (print_constant, case CONSTANT_float): Don't fall
+ foul of type-based aliasing.
+
+2002-09-30 Anthony Green <green@redhat.com>
+
+ * gcj.texi (Invoking jv-scan): Fix texinfo.
+
+2002-09-28 Anthony Green <green@redhat.com>
+
+ * gcj.texi (Invoking jv-scan): Add --no-assert documentation.
+ (Code Generation): Add -fno-assert documentation.
+ * jv-scan.c (flag_assert): New global.
+ (options): Add assert option.
+ (help): Add --no-assert documentation.
+ * parse-scan.y (flag_assert): New global.
+ * lang.c (lang_f_options): Add -fassert/-fno-assert support.
+ (flag_assert): New global.
+ * java-tree.h (flag_assert): New global.
+ * lex.c (java_lex): Obey flag_assert.
+ * jvspec.c (jvgenmain_spec): Strip -fassert/-fno-assert when
+ calling cc1.
+
+2002-09-26 Andrew Haley <aph@redhat.com>
+
+ * expr.c (build_java_array_length_access): Check for null pointer.
+ * expr.c (expand_java_arrayload): Likewise.
+
+2002-09-21 Richard Henderson <rth@redhat.com>
+
+ * jcf-parse.c (get_constant): Decode from IEEE no matter
+ what the target format.
+
+2002-09-20 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * class.c: Likewise.
+ * decl.c: Likewise.
+ * expr.c: Likewise.
+ * gjavah.c: Likewise.
+ * java-tree.h: Likewise.
+ * jcf-dump.c: Likewise.
+ * jcf-parse.c: Likewise.
+ * jvspec.c: Likewise.
+ * lang.c: Likewise.
+ * mangle.c: Likewise.
+ * parse.y: Likewise.
+
+2002-09-17 Tom Tromey <tromey@redhat.com>
+
+ * lex.c (java_read_unicode_collapsing_terminators): Handle case
+ where \r appears at EOF. Fixes PR java/7950.
+
+2002-09-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ * jvspec.c (lang_specific_driver): Remove unused variable.
+
+2002-09-16 Geoffrey Keating <geoffk@apple.com>
+
+ * java-tree.h (union lang_tree_node): Add chain_next option.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * jcf-parse.c (get_constant): Runtime check for IEEE format;
+ use new real.h interface.
+ * jcf-write.c (find_constant_index): Use new real.h interface.
+ * lex.c (IS_ZERO): Use REAL_VALUES_EQUAL.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * lang.c: Follow spelling conventions.
+
+2002-09-11 Per Bothner <per@bothner.com>
+
+ * parse.y (fold_constant_for_init): If a VAR_DECL, convert numerical
+ constant to the type of the field.
+ (java_complete_tree): Remove now-redundant code.
+
+ * parse.y (fold_constant_for_init): 'null' is not a constant expr.
+
+2002-09-03 Jesse Rosenstock <jmr@ugcs.caltech.edu>
+
+ For PR java/5794:
+ * verify.c (verify_jvm_instructions) [OPCODE_jsr]: Only push the
+ return label if a ret instruction for the jsr has been reached.
+
+2002-09-09 Ranjit Mathew <rmathew@hotmail.com>
+
+ * parse.y (DIR_SEPARATOR): Don't define.
+ (check_class_interface_creation): Use IS_DIR_SEPARATOR.
+
+2002-08-28 Andrew Haley <aph@redhat.com>
+
+ * verify.c (verify_jvm_instructions): Allow exception handler
+ inside code that is being protected, but generate a warning.
+ * except.c (link_handler): Initialize `expanded' in new eh_range.
+ (binding_depth, is_class_level, current_pc): Declare extern.
+
+2002-09-01 Mark Wielaard <mark@klomp.org>
+
+ * gcj.texi: Add chapter about system properties.
+ Fixed some typos.
+
+2002-08-26 Tom Tromey <tromey@redhat.com>
+
+ * parse.y (try_builtin_assignconv): Allow narrowing primitive
+ conversion if RHS_TYPE is byte, short, or char.
+
+2002-08-22 Tom Tromey <tromey@redhat.com>
+
+ * gcj.texi (Invoking gij): Document -cp and -classpath.
+
2002-08-21 Tom Tromey <tromey@redhat.com>
* Make-lang.in (java/jcf-path.o): Use $(datadir), not
@@ -43,7 +224,7 @@
2002-08-08 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
- * jcf-write.c (get_access_flags): Return correct access flags for
+ * jcf-write.c (get_access_flags): Return correct access flags for
private and protected inner classes.
2002-08-08 Nathan Sidwell <nathan@codesourcery.com>
@@ -186,10 +367,10 @@
2002-06-10 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
- * gjavah.c (throwable_p): Accept argument as either a classname or
+ * gjavah.c (throwable_p): Accept argument as either a classname or
signature fragment. Create null-terminated classname string for super
when calling itself recursively.
- (decode_signature_piece): Skip first character from class name
+ (decode_signature_piece): Skip first character from class name
signature when calling throwable_p.
2002-06-08 H.J. Lu (hjl@gnu.org)
@@ -2770,7 +2951,7 @@ Tue Oct 23 14:02:17 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
(generate_classfile): Compute the attribute count, invoke
`append_gcj_attribute'.
* jcf.h (typedef struct JCF): `seen_in_zip' and `java_source'
- turned into bit fields. New bit field `right_zip.'
+ turned into bit-fields. New bit-field `right_zip.'
(JCF_ZERO): Set `right_zip' to zero.
* lang-options.h (-fforce-classes-archive-check): Added flag.
* lang.c (flag_force_classes_archive_check): New flag.
@@ -6852,8 +7033,8 @@ Fri Dec 24 00:25:29 1999 Alexandre Petit-Bianco <apbianco@cygnus.com>
* jcf.h (typedef struct JCF): Field `outofsynch' deleted.
(jcf_out_of_synch): Prototype deleted.
* parse.h (struct parser_ctxt): `minus_seen', `java_error_flag',
- `deprecated' and `class_err': integer turned into bit fields.
- New bit fields `saved_data_ctx' and `saved_data'. Fixed comments.
+ `deprecated' and `class_err': integer turned into bit-fields.
+ New bit-fields `saved_data_ctx' and `saved_data'. Fixed comments.
* parse.y (package_list): New global.
(package_declaration:): Record newly parsed package name.
(extra_ctxp_pushed_p): Static global deleted.
@@ -12828,7 +13009,7 @@ Mon Apr 27 10:50:05 1998 Alexandre Petit-Bianco <apbianco@cygnus.com>
this_wfl. Call to parse_error_context uses this_wfl instead of
relying on lookup_cl.
(parser_check_super): Comment reflects function's new returned
- type (int). Function returns non zero value on error.
+ type (int). Function returns nonzero value on error.
(create_jdep_list, reverse_jdep_list, obtain_incomplete_type,
register_incomplete_type, jdep_resolve_class): New functions to
handle incomplete types in declarations.
diff --git a/gcc/java/class.c b/gcc/java/class.c
index e167e0d0f86..c412283158c 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -75,7 +75,7 @@ typedef struct assume_compiled_node_struct
/* The class or package name. */
const char *ident;
- /* Non-zero if this represents an exclusion. */
+ /* Nonzero if this represents an exclusion. */
int excludep;
/* Pointers to other nodes in the tree. */
@@ -141,7 +141,7 @@ find_assume_compiled_node (node, ident)
}
/* Add a new IDENT to the include/exclude tree. It's an exclusion
- if EXCLUDEP is non-zero. */
+ if EXCLUDEP is nonzero. */
void
add_assume_compiled (ident, excludep)
@@ -192,7 +192,7 @@ add_assume_compiled (ident, excludep)
parent->child = node;
}
-/* Returns non-zero if IDENT is the name of a class that the compiler
+/* Returns nonzero if IDENT is the name of a class that the compiler
should assume has been compiled to FIXME */
static int
@@ -2269,7 +2269,7 @@ static int java_treetreehash_compare PARAMS ((const void *, const void *));
/* A hash table mapping trees to trees. Used generally. */
-#define JAVA_TREEHASHHASH_H(t) ((hashval_t) (t))
+#define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
static hashval_t
java_treetreehash_hash (k_p)
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index 9f055d3cf57..4b06aaf7d65 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -57,7 +57,7 @@ static tree check_local_named_variable PARAMS ((tree, tree, int, int *));
static tree check_local_unnamed_variable PARAMS ((tree, tree, tree));
static void dump_function PARAMS ((enum tree_dump_index, tree));
-/* Set to non-zero value in order to emit class initilization code
+/* Set to nonzero value in order to emit class initilization code
before static field references. */
extern int always_initialize_class_p;
diff --git a/gcc/java/except.c b/gcc/java/except.c
index ef773e4a6b3..614587d3362 100644
--- a/gcc/java/except.c
+++ b/gcc/java/except.c
@@ -61,9 +61,9 @@ static struct eh_range *cache_next_child;
struct eh_range whole_range;
#if defined(DEBUG_JAVA_BINDING_LEVELS)
-int binding_depth;
-int is_class_level;
-int current_pc;
+extern int binding_depth;
+extern int is_class_level;
+extern int current_pc;
extern void indent ();
#endif
@@ -172,6 +172,7 @@ link_handler (range, outer)
h->handlers = build_tree_list (TREE_PURPOSE (range->handlers),
TREE_VALUE (range->handlers));
h->next_sibling = NULL;
+ h->expanded = 0;
/* Restart both from the top to avoid having to make this
function smart about reentrancy. */
link_handler (h, &whole_range);
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index d6a443dca9a..0c434e96d5f 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -91,7 +91,7 @@ static GTY(()) tree methods_ident;
static GTY(()) tree ncode_ident;
tree dtable_ident = NULL_TREE;
-/* Set to non-zero value in order to emit class initilization code
+/* Set to nonzero value in order to emit class initilization code
before static field references. */
int always_initialize_class_p;
@@ -176,7 +176,7 @@ java_truthvalue_conversion (expr)
case ABS_EXPR:
case FLOAT_EXPR:
case FFS_EXPR:
- /* These don't change whether an object is non-zero or zero. */
+ /* These don't change whether an object is nonzero or zero. */
return java_truthvalue_conversion (TREE_OPERAND (expr, 0));
case COND_EXPR:
@@ -675,6 +675,15 @@ build_java_array_length_access (node)
tree array_type = TREE_TYPE (type);
HOST_WIDE_INT length;
+ /* JVM spec: If the arrayref is null, the arraylength instruction
+ throws a NullPointerException. The only way we could get a node
+ of type ptr_type_node at this point is `aconst_null; arraylength'
+ or something equivalent. */
+ if (type == ptr_type_node)
+ return build (CALL_EXPR, int_type_node,
+ build_address_of (soft_nullpointer_node),
+ NULL_TREE, NULL_TREE);
+
if (!is_array_type_p (type))
abort ();
@@ -1028,12 +1037,21 @@ expand_java_arrayload (lhs_type_node )
index_node = save_expr (index_node);
array_node = save_expr (array_node);
- lhs_type_node = build_java_check_indexed_type (array_node, lhs_type_node);
-
- load_node = build_java_arrayaccess (array_node,
- lhs_type_node,
- index_node);
-
+
+ if (TREE_TYPE (array_node) == ptr_type_node)
+ /* The only way we could get a node of type ptr_type_node at this
+ point is `aconst_null; arraylength' or something equivalent, so
+ unconditionally throw NullPointerException. */
+ load_node = build (CALL_EXPR, lhs_type_node,
+ build_address_of (soft_nullpointer_node),
+ NULL_TREE, NULL_TREE);
+ else
+ {
+ lhs_type_node = build_java_check_indexed_type (array_node, lhs_type_node);
+ load_node = build_java_arrayaccess (array_node,
+ lhs_type_node,
+ index_node);
+ }
if (INTEGRAL_TYPE_P (lhs_type_node) && TYPE_PRECISION (lhs_type_node) <= 32)
load_node = fold (build1 (NOP_EXPR, int_type_node, load_node));
push_value (load_node);
diff --git a/gcc/java/gcj.texi b/gcc/java/gcj.texi
index ac1702f2503..a4852205393 100644
--- a/gcc/java/gcj.texi
+++ b/gcc/java/gcj.texi
@@ -130,6 +130,7 @@ files and object files, and it can read both Java source code and
* Invoking rmic:: Generate stubs for Remote Method Invocation.
* Invoking rmiregistry:: The remote object registry.
* About CNI:: Description of the Cygnus Native Interface
+* System properties:: Modifying runtime behavior of the libgcj library
* Resources:: Where to look for more information
@end menu
@@ -282,7 +283,7 @@ If @code{--bootclasspath} was specified, append its value.
Otherwise, append the built-in system directory, @file{libgcj.jar}.
@item
-Finaly, if @code{--extdirs} was specified, append the contents of the
+Finally, if @code{--extdirs} was specified, append the contents of the
specified directories at the end of the class path. Otherwise, append
the contents of the built-in extdirs at @code{$(prefix)/share/java/ext}.
@end itemize
@@ -427,8 +428,12 @@ using JNI, then you must use @code{-fjni}. This option causes
@command{gcj} to generate stubs which will invoke the underlying JNI
methods.
+@item -fno-assert
+Don't recognize the @code{assert} keyword. This is for compatibility
+with older versions of the language specification.
+
@item -fno-optimize-static-class-initialization
-When the optimization level is greather or equal to @code{-O2},
+When the optimization level is greater or equal to @code{-O2},
@command{gcj} will try to optimize the way calls into the runtime are made
to initialize static classes upon their first use (this optimization
isn't carried out if @code{-C} was specified.) When compiling to native
@@ -482,14 +487,21 @@ specifications. However, limited manpower and incomplete and unclear
documentation work against us. So, there are caveats to using
@command{gcj}.
+@menu
+* Limitations::
+* Extensions::
+@end menu
+
+@node Limitations
+@section Standard features not yet supported
+
This list of compatibility issues is by no means complete.
@itemize @bullet
@item
-@command{gcj} implements the JDK 1.1 language. It supports inner classes,
-though these are known to still be buggy. It does not yet support the
-Java 2 @code{strictfp} keyword (it recognizes the keyword but ignores
-it).
+@command{gcj} implements the JDK 1.2 language. It supports inner classes
+and the new 1.4 @code{assert} keyword. It does not yet support the Java 2
+@code{strictfp} keyword (it recognizes the keyword but ignores it).
@item
@code{libgcj} is largely compatible with the JDK 1.2 libraries.
@@ -505,6 +517,31 @@ affects you, it probably makes sense to report it so that we can discuss
the appropriate response.
@end itemize
+@node Extensions
+@section Extra features unique to gcj
+
+The main feature of @command{gcj} is that it can compile programs written in
+the Java programming language to native code. Most extensions that have been
+added are to facilitate this functionality.
+
+@itemize @bullet
+@item
+@command{gcj} makes it easy and efficient to mix code written in Java and C++.
+@xref{About CNI}, for more info on how to use this in your programs.
+
+@item
+When you compile your classes into a shared library they can be automatically
+loaded by the @code{libgcj} system classloader. When trying to load a class
+@code{gnu.pkg.SomeClass} the system classloader will first try to load the
+shared library @file{lib-gnu-pkg-SomeClass.so}, if that fails to load the
+class then it will try to load @file{lib-gnu-pkg.so} and finally when the
+class is still not loaded it will try to load @file{lib-gnu.so}. Note that
+all @samp{.}s will be transformed into @samp{-}s and that searching
+for inner classes starts with their outermost outer class. If the class
+cannot be found this way the system classloader tries to use
+the @code{libgcj} bytecode interpreter to load the class from the standard
+classpath.
+@end itemize
@node Invoking gcjh
@chapter Invoking gcjh
@@ -621,8 +658,9 @@ source file (@file{.java} file).
@ignore
@c man begin SYNOPSIS jv-scan
-jv-scan [@option{--complexity}] [@option{--encoding}=@var{name}]
- [@option{--print-main}] [@option{--list-class}] [@option{--list-filename}]
+jv-scan [@option{--no-assert}] [@option{--complexity}]
+ [@option{--encoding}=@var{name}] [@option{--print-main}]
+ [@option{--list-class}] [@option{--list-filename}]
[@option{--version}] [@option{--help}]
[@option{-o} @var{file}] @var{inputfile}@dots{}
@c man end
@@ -635,6 +673,10 @@ and the Info entries for @file{gcj} and @file{gcc}.
@c man begin OPTIONS jv-scan
@table @gcctabopt
+@item --no-assert
+Don't recognize the @code{assert} keyword, for backwards compatibility
+with older versions of the language specification.
+
@item --complexity
This prints a complexity measure, related to cyclomatic complexity, for
each input file.
@@ -687,7 +729,7 @@ and the Info entries for @file{gcj} and @file{gcc}.
@c man begin DESCRIPTION jcf-dump
This is a class file examiner, similar to @code{javap}. It will print
-information about a number of classes, which are specifed by class name
+information about a number of classes, which are specified by class name
or file name.
@c man end
@@ -730,6 +772,7 @@ Print extra information while running.
gij [@option{OPTION}] @dots{} @var{JARFILE} [@var{ARGS}@dots{}]
gij [@option{-jar}] [@option{OPTION}] @dots{} @var{CLASS} [@var{ARGS}@dots{}]
+ [@option{-cp} @var{path}] [@option{-classpath} @var{path}]
[@option{-D}@var{name}[=@var{value}]@dots{}]
[@option{-ms=}@var{number}] [@option{-mx=}@var{number}]
[@option{--version}] [@option{--help}]
@@ -772,6 +815,13 @@ been compiled and put into a shared library on the class path.
@c man begin OPTIONS gij
@table @gcctabopt
+@item -cp @var{path}
+@itemx -classpath @var{path}
+Set the initial class path. The class path is used for finding
+class and resource files. If specified, this option overrides the
+@code{CLASSPATH} environment variable. Note that this option is
+ignored if @code{-jar} is used.
+
@item -D@var{name}[=@var{value}]
This defines a system property named @var{name} with value @var{value}.
If @var{value} is not specified then it defaults to the empty string.
@@ -1100,7 +1150,7 @@ class java::lang::String : public java::lang::Object
@};
@end example
-@noindent The @code{gcjh} tool automatically generates the nessary namespace
+@noindent The @code{gcjh} tool automatically generates the necessary namespace
declarations.
@@ -1142,7 +1192,7 @@ import @var{package-name}.*;
@end example
@noindent Doing this allows any class from the package @var{package-name} to be
-refered to only by its class-name within the program text.
+referred to only by its class-name within the program text.
@noindent The same effect can be achieved in C++ like this:
@@ -1174,7 +1224,7 @@ so CNI provides a special C++ type for each primitive Java type:
@item @code{void} @tab @code{void} @tab no value
@end multitable
-When refering to a Java type You should always use these C++ typenames (e.g.: @code{jint})
+When referring to a Java type You should always use these C++ typenames (e.g.: @code{jint})
to avoid disappointment.
@@ -1572,7 +1622,7 @@ java::lang:Integer::doubleValue()
@subsection Interface methods
In Java you can call a method using an interface reference. This is
-supported, but not completly. @xref{Interfaces}.
+supported, but not completely. @xref{Interfaces}.
@@ -1816,8 +1866,8 @@ the @code{synchronized} attribute is handled by the
method implementation, it is up to the programmer
of a synchronized native method to handle the synchronization
(in the C++ implementation of the method).
-In otherwords, you need to manually add @code{JvSynchronize}
-in a @code{native synchornized} method.
+In other words, you need to manually add @code{JvSynchronize}
+in a @code{native synchronized} method.
@node Invocation
@section Invocation
@@ -1937,6 +1987,239 @@ are as in JNI@.
@noindent will be added shortly, as will other functions corresponding to JNI@.
+@node System properties
+@chapter System properties
+
+The runtime behavior of the @code{libgcj} library can be modified by setting
+certain system properties. These properties can be compiled into the program
+using the @code{-D@var{name}[=@var{value}]} option to @command{gcj} or by
+setting them explicitly in the program by calling the
+@code{java.lang.System.setProperty()} method. Some system properties are only
+used for informational purposes (like giving a version number or a user name).
+A program can inspect the current value of a property by calling the
+@code{java.lang.System.getProperty()} method.
+
+@menu
+* Standard Properties:: Standard properties supported by @code{libgcj}
+* GNU Classpath Properties:: Properties found in Classpath based libraries
+* libgcj Runtime Properties:: Properties specific to @code{libgcj}
+@end menu
+
+@node Standard Properties
+@section Standard Properties
+
+The following properties are normally found in all implementations of the core
+libraries for the Java language.
+
+@table @gcctabopt
+
+@item java.version
+The @code{libgcj} version number.
+
+@item java.vendor
+Set to @samp{The Free Software Foundation, Inc.}
+
+@item java.vendor.url
+Set to @uref{http://gcc.gnu.org/java/}.
+
+@item java.home
+The directory where @code{gcj} was installed. Taken from the @code{--prefix}
+option given to @command{configure}.
+
+@item java.class.version
+The class format version number supported by the libgcj byte code interpreter.
+(Currently @samp{46.0})
+
+@item java.vm.specification.version
+The Virtual Machine Specification version implemented by @code{libgcj}.
+(Currently @samp{1.0})
+
+@item java.vm.specification.vendor
+The name of the Virtual Machine specification designer.
+
+@item java.vm.specification.name
+The name of the Virtual Machine specification
+(Set to @samp{Java Virtual Machine Specification}).
+
+@item java.vm.version
+The @command{gcj} version number.
+
+@item java.vm.vendor
+Set to @samp{The Free Software Foundation, Inc.}
+
+@item java.vm.name
+Set to @samp{GNU libgcj}.
+
+@item java.specification.version
+The Runtime Environment specification version implemented by @code{libgcj}.
+(Currently set to @samp{1.3})
+
+@item java.specification.vendor
+The Runtime Environment specification designer.
+
+@item java.specification.name
+The name of the Runtime Environment specification
+(Set to @samp{Java Platform API Specification}).
+
+@item java.class.path
+The paths (jar files, zip files and directories) used for finding class files.
+
+@item java.library.path
+Directory path used for finding native libraries. Currently not set.
+
+@item java.io.tmpdir
+The directory used to put temporary files in.
+
+@item java.compiler
+Name of the Just In Time compiler to use by the byte code interpreter.
+Currently not used in @code{libgcj}.
+
+@item java.ext.dirs
+Directories containing jar files with extra libraries. Will be used when
+resolving classes. Currently not used in @code{libgcj}.
+
+@item java.protocol.handler.pkgs
+A @samp{|} separated list of package names that is used to find classes that
+implement handlers for @code{java.net.URL}.
+
+@item java.rmi.server.codebase
+A list of URLs that is used by the @code{java.rmi.server.RMIClassLoader}
+to load classes from.
+
+@item jdbc.drivers
+A list of class names that will be loaded by the @code{java.sql.DriverManager}
+when it starts up.
+
+@item file.separator
+The separator used in when directories are included in a filename
+(normally @samp{/} or @samp{\} ).
+
+@item file.encoding
+The default character encoding used when converting platform native files to
+Unicode (usually set to @samp{8859_1}).
+
+@item path.separator
+The standard separator used when a string contains multiple paths
+(normally @samp{:} or @samp{;}), the string is usually not a valid character
+to use in normal directory names.)
+
+@item line.separator
+The default line separator used on the platform (normally @samp{\n}, @samp{\r}
+or a combination of those two characters).
+
+@item policy.provider
+The class name used for the default policy provider returned by
+@code{java.security.Policy.getPolicy}.
+
+@item user.name
+The name of the user running the program. Can be the full name, the login name
+or empty if unknown.
+
+@item user.home
+The default directory to put user specific files in.
+
+@item user.dir
+The current working directory from which the program was started.
+
+@item user.language
+The default language as used by the @code{java.util.Locale} class.
+
+@item user.region
+The default region as used by the @code{java.util.Local} class.
+
+@item user.variant
+The default variant of the language and region local used.
+
+@item user.timezone
+The default timezone as used by the @code{java.util.TimeZone} class.
+
+@item os.name
+The operating system/kernel name that the program runs on.
+
+@item os.arch
+The hardware that we are running on.
+
+@item os.version
+The version number of the operating system/kernel.
+
+@item awt.appletWarning
+The string to display when an untrusted applet is displayed.
+Returned by @code{java.awt.Window.getWarningString()} when the window is
+``insecure''.
+
+@item awt.toolkit
+The class name used for initializing the default @code{java.awt.Toolkit}.
+Defaults to @code{gnu.awt.gtk.GtkToolkit}.
+
+@end table
+
+@node GNU Classpath Properties
+@section GNU Classpath Properties
+
+@code{libgcj} is based on the GNU Classpath (Essential Libraries for Java) a
+GNU project to create free core class libraries for use with virtual machines
+and compilers for the Java language. The following properties are common to
+libraries based on GNU Classpath.
+
+@table @gcctabopt
+
+@item gcj.dumpobject
+Enables printing serialization debugging by the @code{java.io.ObjectInput} and
+@code{java.io.ObjectOutput} classes when set to something else then the empty
+string. Only used when running a debug build of the library.
+
+@end table
+
+@node libgcj Runtime Properties
+@section libgcj Runtime Properties
+
+The following properties are specific to the @code{libgcj} runtime and will
+normally not be found in other core libraries for the java language.
+
+@table @gcctabopt
+
+@item java.fullversion
+The combination of @code{java.vm.name} and @code{java.vm.version}.
+
+@item java.vm.info
+Same as @code{java.fullversion}.
+
+@item impl.prefix
+Used by the @code{java.net.DatagramSocket} class when set to something else
+then the empty string. When set all newly created @code{DatagramSocket}s will
+try to load a class @code{java.net.[impl.prefix]DatagramSocketImpl} instead of
+the normal @code{java.net.PlainDatagramSocketImpl}.
+
+@item gnu.gcj.progname
+The name that was used to invoked the program.
+
+@item gnu.gcj.runtime.NameFinder.demangle
+Whether names in a stack trace should be demangled. Defaults to @code{true}.
+
+@item gnu.gcj.runtime.NameFinder.sanitize
+Whether calls to initialize exceptions and starting the runtime system
+should be removed from the stack trace. Only done when names are
+demangled. Defaults to @code{true}.
+
+@item gnu.gcj.runtime.NameFinder.remove_unknown
+Whether calls to unknown functions (class and method names are unknown)
+should be removed from the stack trace. Only done when the stack is
+sanitized. Ignored if this means no stack trace information would be
+available anymore. Defaults to @code{true}.
+
+@item gnu.gcj.runtime.NameFinder.remove_interpreter
+Whether runtime interpreter calls (methods in the @code{_Jv_InterpMethod} class
+and functions starting with @samp{ffi_}) should be removed from the stack
+trace. Only done when the stack is sanitized. Defaults to @code{true}.
+
+
+@item gnu.gcj.runtime.NameFinder.use_addr2line
+Whether an external process (@command{addr2line} or @command{addr2name.awk})
+should be used as fallback to convert the addresses to function names when
+the runtime is unable to do it through @code{dladdr}.
+
+@end table
+
@node Resources
@chapter Resources
diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c
index b4e0a51187c..53099ad3876 100644
--- a/gcc/java/gjavah.c
+++ b/gcc/java/gjavah.c
@@ -48,7 +48,7 @@ static int found_error = 0;
/* Nonzero if we're generating JNI output. */
static int flag_jni = 0;
-/* When non zero, warn when source file is newer than matching class
+/* When nonzero, warn when source file is newer than matching class
file. */
int flag_newer = 1;
@@ -2289,7 +2289,7 @@ help ()
/* We omit -MG until it is implemented. */
printf ("\n");
printf ("For bug reporting instructions, please see:\n");
- printf ("%s.\n", GCCBUGURL);
+ printf ("%s.\n", bug_report_url);
exit (0);
}
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index a08ec5830fc..4001bdf3b68 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -160,20 +160,24 @@ extern int flag_emit_class_files;
extern int flag_filelist_file;
-/* When non zero, assume all native functions are implemented with
+/* When nonzero, permit the use of the assert keyword. */
+
+extern int flag_assert;
+
+/* When nonzero, assume all native functions are implemented with
JNI, not CNI. */
extern int flag_jni;
-/* When non zero, report the now deprecated empty statements. */
+/* When nonzero, report the now deprecated empty statements. */
extern int flag_extraneous_semicolon;
-/* When non zero, always check for a non gcj generated classes archive. */
+/* When nonzero, always check for a non gcj generated classes archive. */
extern int flag_force_classes_archive_check;
-/* When non zero, we emit xref strings. Values of the flag for xref
+/* When nonzero, we emit xref strings. Values of the flag for xref
backends are defined in xref.h. */
extern int flag_emit_xref;
@@ -190,28 +194,28 @@ extern int flag_redundant;
extern int flag_not_overriding;
extern int flag_static_local_jdk1_1;
-/* When non zero, warn when source file is newer than matching class
+/* When nonzero, warn when source file is newer than matching class
file. */
extern int flag_newer;
-/* When non zero, call a library routine to do integer divisions. */
+/* When nonzero, call a library routine to do integer divisions. */
extern int flag_use_divide_subroutine;
-/* When non zero, generate code for the Boehm GC. */
+/* When nonzero, generate code for the Boehm GC. */
extern int flag_use_boehm_gc;
-/* When non zero, assume the runtime uses a hash table to map an
+/* When nonzero, assume the runtime uses a hash table to map an
object to its synchronization structure. */
extern int flag_hash_synchronization;
-/* When non zero, generate checks for references to NULL. */
+/* When nonzero, generate checks for references to NULL. */
extern int flag_check_references;
/* Used through STATIC_CLASS_INIT_OPT_P to check whether static
initialization optimization should be performed. */
extern int flag_optimize_sci;
-/* When non zero, use offset tables for virtual method calls
+/* When nonzero, use offset tables for virtual method calls
in order to improve binary compatibility. */
extern int flag_indirect_dispatch;
@@ -693,7 +697,8 @@ struct lang_identifier GTY(())
/* The resulting tree type. */
union lang_tree_node
- GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE")))
+ GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
+ chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
{
union tree_node GTY ((tag ("0"),
desc ("tree_node_structure (&%h)")))
@@ -1287,6 +1292,8 @@ extern tree decl_constant_value PARAMS ((tree));
struct rtx_def * java_expand_expr PARAMS ((tree, rtx, enum machine_mode,
int));
#endif
+extern void java_inlining_merge_static_initializers PARAMS ((tree, void *));
+extern void java_inlining_map_static_initializers PARAMS ((tree, void *));
#define DECL_FINAL(DECL) DECL_LANG_FLAG_3 (DECL)
@@ -1698,7 +1705,7 @@ extern tree *type_map;
TREE_SIDE_EFFECTS (WHERE) = 1; \
}
-/* Non zero if TYPE is an unchecked exception */
+/* Nonzero if TYPE is an unchecked exception */
#define IS_UNCHECKED_EXCEPTION_P(TYPE) \
(inherits_from_p ((TYPE), runtime_exception_type_node) \
|| inherits_from_p ((TYPE), error_exception_type_node))
diff --git a/gcc/java/jcf-dump.c b/gcc/java/jcf-dump.c
index aa903745f46..72f1a5360b4 100644
--- a/gcc/java/jcf-dump.c
+++ b/gcc/java/jcf-dump.c
@@ -71,7 +71,7 @@ int flag_print_fields = 1;
int flag_print_methods = 1;
int flag_print_attributes = 1;
-/* When non zero, warn when source file is newer than matching class
+/* When nonzero, warn when source file is newer than matching class
file. */
int flag_newer = 1;
@@ -504,10 +504,18 @@ DEFUN(print_constant, (out, jcf, index, verbosity),
break;
case CONSTANT_Float:
{
- jfloat fnum = JPOOL_FLOAT (jcf, index);
- fprintf (out, "%s%.10g", verbosity > 0 ? "Float " : "", (double) fnum);
+ union
+ {
+ jfloat f;
+ int32 i;
+ } pun;
+
+ pun.f = JPOOL_FLOAT (jcf, index);
+ fprintf (out, "%s%.10g",
+ verbosity > 0 ? "Float " : "", (double) pun.f);
if (verbosity > 1)
- fprintf (out, ", bits = 0x%08lx", (long) (* (int32 *) &fnum));
+ fprintf (out, ", bits = 0x%08lx", (long) pun.i);
+
break;
}
case CONSTANT_Double:
@@ -821,7 +829,7 @@ help ()
printf (" -v, --verbose Print extra information while running\n");
printf ("\n");
printf ("For bug reporting instructions, please see:\n");
- printf ("%s.\n", GCCBUGURL);
+ printf ("%s.\n", bug_report_url);
exit (0);
}
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index fc755f0ce71..51411199356 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -68,7 +68,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
extern struct obstack temporary_obstack;
-/* Set to non-zero value in order to emit class initilization code
+/* Set to nonzero value in order to emit class initilization code
before static field references. */
extern int always_initialize_class_p;
@@ -290,47 +290,36 @@ get_constant (jcf, index)
force_fit_type (value, 0);
break;
}
-#if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
+
case CONSTANT_Float:
{
jint num = JPOOL_INT(jcf, index);
+ long buf = num;
REAL_VALUE_TYPE d;
- d = REAL_VALUE_FROM_TARGET_SINGLE (num);
+
+ real_from_target_fmt (&d, &buf, &ieee_single_format);
value = build_real (float_type_node, d);
break;
}
+
case CONSTANT_Double:
{
- HOST_WIDE_INT num[2];
+ long buf[2], lo, hi;
REAL_VALUE_TYPE d;
- HOST_WIDE_INT lo, hi;
- num[0] = JPOOL_UINT (jcf, index);
- lshift_double (num[0], 0, 32, 64, &lo, &hi, 0);
- num[0] = JPOOL_UINT (jcf, index+1);
- add_double (lo, hi, num[0], 0, &lo, &hi);
-
- /* Since ereal_from_double expects an array of HOST_WIDE_INT
- in the target's format, we swap the elements for big endian
- targets, unless HOST_WIDE_INT is sufficiently large to
- contain a target double, in which case the 2nd element
- is ignored.
-
- FIXME: Is this always right for cross targets? */
- if (FLOAT_WORDS_BIG_ENDIAN && sizeof(num[0]) < 8)
- {
- num[0] = hi;
- num[1] = lo;
- }
+
+ hi = JPOOL_UINT (jcf, index);
+ lo = JPOOL_UINT (jcf, index+1);
+
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = hi, buf[1] = lo;
else
- {
- num[0] = lo;
- num[1] = hi;
- }
- d = REAL_VALUE_FROM_TARGET_DOUBLE (num);
+ buf[0] = lo, buf[1] = hi;
+
+ real_from_target_fmt (&d, buf, &ieee_double_format);
value = build_real (double_type_node, d);
break;
}
-#endif /* TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT */
+
case CONSTANT_String:
{
tree name = get_name_constant (jcf, JPOOL_USHORT1 (jcf, index));
@@ -381,7 +370,7 @@ get_name_constant (jcf, index)
return name;
}
-/* Handle reading innerclass attributes. If a non zero entry (denoting
+/* Handle reading innerclass attributes. If a nonzero entry (denoting
a non anonymous entry) is found, We augment the inner class list of
the outer context with the newly resolved innerclass. */
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 076912505e5..1a9f1075e23 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -826,21 +826,18 @@ find_constant_index (value, state)
else if (TREE_CODE (value) == REAL_CST)
{
long words[2];
+
+ real_to_target (words, &TREE_REAL_CST (value),
+ TYPE_MODE (TREE_TYPE (value)));
+ words[0] &= 0xffffffff;
+ words[1] &= 0xffffffff;
+
if (TYPE_PRECISION (TREE_TYPE (value)) == 32)
- {
- words[0] = etarsingle (TREE_REAL_CST (value)) & 0xFFFFFFFF;
- return find_constant1 (&state->cpool, CONSTANT_Float,
- (jword)words[0]);
- }
+ return find_constant1 (&state->cpool, CONSTANT_Float, (jword)words[0]);
else
- {
- etardouble (TREE_REAL_CST (value), words);
- return find_constant2 (&state->cpool, CONSTANT_Double,
- (jword)(words[1-FLOAT_WORDS_BIG_ENDIAN] &
- 0xFFFFFFFF),
- (jword)(words[FLOAT_WORDS_BIG_ENDIAN] &
- 0xFFFFFFFF));
- }
+ return find_constant2 (&state->cpool, CONSTANT_Double,
+ (jword)words[1-FLOAT_WORDS_BIG_ENDIAN],
+ (jword)words[FLOAT_WORDS_BIG_ENDIAN]);
}
else if (TREE_CODE (value) == STRING_CST)
return find_string_constant (&state->cpool, value);
diff --git a/gcc/java/jv-scan.c b/gcc/java/jv-scan.c
index 2f7c3b9a6db..f92acebd7f4 100644
--- a/gcc/java/jv-scan.c
+++ b/gcc/java/jv-scan.c
@@ -64,6 +64,7 @@ int flag_find_main = 0;
int flag_dump_class = 0;
int flag_list_filename = 0;
int flag_complexity = 0;
+int flag_assert = 1;
int pedantic = 0;
@@ -85,6 +86,8 @@ static const struct option options[] =
{ "list-class", no_argument, &flag_dump_class, 1 },
{ "encoding", required_argument, NULL, OPT_ENCODING },
{ "complexity", no_argument, &flag_complexity, 1 },
+ { "no-assert", no_argument, &flag_assert, 0 },
+ { "assert", no_argument, &flag_assert, 1 },
{ NULL, no_argument, NULL, 0 }
};
@@ -100,6 +103,7 @@ help ()
{
printf ("Usage: jv-scan [OPTION]... FILE...\n\n");
printf ("Print useful information read from Java source files.\n\n");
+ printf (" --no-assert Don't recognize the assert keyword\n");
printf (" --complexity Print cyclomatic complexity of input file\n");
printf (" --encoding NAME Specify encoding of input file\n");
printf (" --print-main Print name of class containing `main'\n");
@@ -111,7 +115,7 @@ help ()
printf (" --version Print version number, then exit\n");
printf ("\n");
printf ("For bug reporting instructions, please see:\n");
- printf ("%s.\n", GCCBUGURL);
+ printf ("%s.\n", bug_report_url);
exit (0);
}
diff --git a/gcc/java/jvspec.c b/gcc/java/jvspec.c
index aad21e136a0..176b363af6c 100644
--- a/gcc/java/jvspec.c
+++ b/gcc/java/jvspec.c
@@ -55,28 +55,28 @@ int lang_specific_extra_outfiles = 0;
int shared_libgcc = 1;
static const char jvgenmain_spec[] =
- "jvgenmain %{D*} %b %{!pipe:%u.i} |\n\
- cc1 %{!pipe:%U.i} %1 \
+ "jvgenmain %{D*} %b %m.i |\n\
+ cc1 %m.i %1 \
%{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
%{g*} %{O*} \
%{v:-version} %{pg:-p} %{p}\
- %{<fbounds-check} %{<fno-bounds-check}\
- %{<fassume-compiled} %{<fno-assume-compiled}\
- %{<fcompile-resource*}\
- %{<femit-class-file} %{<femit-class-files} %{<fencoding*}\
- %{<fuse-boehm-gc} %{<fhash-synchronization} %{<fjni}\
- %{<findirect-dispatch} \
- %{<fno-store-check} %{<foutput-class-dir}\
- %{<fclasspath*} %{<fCLASSPATH*} %{<fbootclasspath*}\
- %{<fextdirs*}\
- %{<fuse-divide-subroutine} %{<fno-use-divide-subroutine}\
- %{<fcheck-references} %{<fno-check-references}\
- %{<ffilelist-file}\
+ %<fbounds-check %<fno-bounds-check\
+ %<fassume-compiled %<fno-assume-compiled\
+ %<fcompile-resource* %<fassert %<fno-assert \
+ %<femit-class-file %<femit-class-files %<fencoding*\
+ %<fuse-boehm-gc %<fhash-synchronization %<fjni\
+ %<findirect-dispatch \
+ %<fno-store-check %<foutput-class-dir\
+ %<fclasspath* %<fCLASSPATH* %<fbootclasspath*\
+ %<fextdirs*\
+ %<fuse-divide-subroutine %<fno-use-divide-subroutine\
+ %<fcheck-references %<fno-check-references\
+ %<ffilelist-file\
%{f*} -fdollars-in-identifiers\
%{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
- %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
- %{!S:as %a %Y -o %d%w%u%O %{!pipe:%g.s} %A\n }";
+ %{S:%W{o*}%{!o*:-o %b.s}}\
+ %(invoke_as)";
/* Return full path name of spec file if it is in DIR, or NULL if
not. */
@@ -148,7 +148,7 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
{
int i, j;
- /* If non-zero, the user gave us the `-v' flag. */
+ /* If nonzero, the user gave us the `-v' flag. */
int saw_verbose_flag = 0;
int saw_save_temps = 0;
@@ -161,9 +161,6 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
should be passed to a single jc1 invocation. */
int combine_inputs = 0;
- /* Index of last .java or .class argument. */
- int last_input_index;
-
/* Number of .java and .class source file arguments seen. */
int java_files_count = 0;
int class_files_count = 0;
@@ -188,7 +185,7 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
/* The new argument list will be contained in this. */
const char **arglist;
- /* Non-zero if we saw a `-xfoo' language specification on the
+ /* Nonzero if we saw a `-xfoo' language specification on the
command line. Used to avoid adding our own -xc++ if the user
already gave a language for the file. */
int saw_speclang = 0;
@@ -238,10 +235,10 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
/* The total number of arguments with the new stuff. */
int num_args = 1;
- /* Non-zero if linking is supposed to happen. */
+ /* Nonzero if linking is supposed to happen. */
int will_link = 1;
- /* Non-zero if we want to find the spec file. */
+ /* Nonzero if we want to find the spec file. */
int want_spec_file = 1;
/* The argument we use to specify the spec file. */
@@ -384,7 +381,6 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
if (saw_resource)
{
args[i] |= RESOURCE_FILE_ARG;
- last_input_index = i;
added += 2; /* for -xjava and -xnone */
}
@@ -400,13 +396,11 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
{
args[i] |= JAVA_FILE_ARG;
java_files_count++;
- last_input_index = i;
}
if (len > 6 && strcmp (argv[i] + len - 6, ".class") == 0)
{
args[i] |= CLASS_FILE_ARG;
class_files_count++;
- last_input_index = i;
}
if (len > 4
&& (strcmp (argv[i] + len - 4, ".zip") == 0
@@ -414,7 +408,6 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
{
args[i] |= ZIP_FILE_ARG;
zip_files_count++;
- last_input_index = i;
}
}
}
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index fadd972c1c9..6f19961f65c 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -41,6 +41,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "ggc.h"
#include "diagnostic.h"
#include "tree-inline.h"
+#include "splay-tree.h"
struct string_option
{
@@ -62,15 +63,18 @@ static void java_print_error_function PARAMS ((diagnostic_context *,
static int process_option_with_no PARAMS ((const char *,
const struct string_option *,
int));
-static tree java_tree_inlining_walk_subtrees PARAMS ((tree *,
- int *,
- walk_tree_fn,
- void *,
- void *));
+static tree java_tree_inlining_walk_subtrees PARAMS ((tree *,
+ int *,
+ walk_tree_fn,
+ void *,
+ void *));
static int java_unsafe_for_reeval PARAMS ((tree));
+static int merge_init_test_initialization PARAMS ((void * *,
+ void *));
+static int inline_init_test_initialization PARAMS ((void * *,
+ void *));
static bool java_can_use_bit_fields_p PARAMS ((void));
-
#ifndef TARGET_OBJECT_SUFFIX
# define TARGET_OBJECT_SUFFIX ".o"
#endif
@@ -126,62 +130,65 @@ int flag_emit_class_files = 0;
int flag_filelist_file = 0;
-/* When non zero, we emit xref strings. Values of the flag for xref
+/* When nonzero, we emit xref strings. Values of the flag for xref
backends are defined in xref_flag_table, xref.c. */
int flag_emit_xref = 0;
-/* When non zero, -Wall was turned on. */
+/* When nonzero, -Wall was turned on. */
int flag_wall = 0;
-/* When non zero, check for redundant modifier uses. */
+/* When nonzero, check for redundant modifier uses. */
int flag_redundant = 0;
-/* When non zero, call a library routine to do integer divisions. */
+/* When nonzero, call a library routine to do integer divisions. */
int flag_use_divide_subroutine = 1;
-/* When non zero, generate code for the Boehm GC. */
+/* When nonzero, generate code for the Boehm GC. */
int flag_use_boehm_gc = 0;
-/* When non zero, assume the runtime uses a hash table to map an
+/* When nonzero, assume the runtime uses a hash table to map an
object to its synchronization structure. */
int flag_hash_synchronization;
-/* When non zero, assume all native functions are implemented with
+/* When nonzero, permit the use of the assert keyword. */
+int flag_assert = 1;
+
+/* When nonzero, assume all native functions are implemented with
JNI, not CNI. */
int flag_jni = 0;
-/* When non zero, warn when source file is newer than matching class
+/* When nonzero, warn when source file is newer than matching class
file. */
int flag_newer = 1;
-/* When non zero, generate checks for references to NULL. */
+/* When nonzero, generate checks for references to NULL. */
int flag_check_references = 0;
/* The encoding of the source file. */
const char *current_encoding = NULL;
-/* When non zero, report the now deprecated empty statements. */
+/* When nonzero, report the now deprecated empty statements. */
int flag_extraneous_semicolon;
-/* When non zero, always check for a non gcj generated classes archive. */
+/* When nonzero, always check for a non gcj generated classes archive. */
int flag_force_classes_archive_check;
/* When zero, don't optimize static class initialization. This flag shouldn't
be tested alone, use STATIC_CLASS_INITIALIZATION_OPTIMIZATION_P instead. */
int flag_optimize_sci = 1;
-/* When non zero, use offset tables for virtual method calls
+/* When nonzero, use offset tables for virtual method calls
in order to improve binary compatibility. */
int flag_indirect_dispatch = 0;
/* When zero, don't generate runtime array store checks. */
int flag_store_check = 1;
-/* When non zero, print extra version information. */
+/* When nonzero, print extra version information. */
static int version_flag = 0;
-/* Set non-zero if the user specified -finline-functions on the command
+/* Set nonzero if the user specified -finline-functions on the command
line. */
int flag_really_inline = 0;
@@ -205,7 +212,8 @@ lang_f_options[] =
{"force-classes-archive-check", &flag_force_classes_archive_check, 1},
{"optimize-static-class-initialization", &flag_optimize_sci, 1 },
{"indirect-dispatch", &flag_indirect_dispatch, 1},
- {"store-check", &flag_store_check, 1}
+ {"store-check", &flag_store_check, 1},
+ {"assert", &flag_assert, 1}
};
static const struct string_option
@@ -311,7 +319,7 @@ process_option_with_no (p, table, table_size)
/*
* process java-specific compiler command-line options
- * return 0, but do not complain if the option is not recognised.
+ * return 0, but do not complain if the option is not recognized.
*/
static int
java_decode_option (argc, argv)
@@ -512,6 +520,13 @@ java_init (filename)
if (flag_inline_functions)
flag_inline_trees = 1;
+ /* Force minimum function alignment if g++ uses the least significant
+ bit of function pointers to store the virtual bit. This is required
+ to keep vtables compatible. */
+ if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
+ && force_align_functions_log < 1)
+ force_align_functions_log = 1;
+
/* Open input file. */
if (filename == 0 || !strcmp (filename, "-"))
@@ -917,4 +932,113 @@ java_unsafe_for_reeval (t)
return -1;
}
+/* Every call to a static constructor has an associated boolean
+ variable which is in the outermost scope of the calling method.
+ This variable is used to avoid multiple calls to the static
+ constructor for each class.
+
+ It looks somthing like this:
+
+ foo ()
+ {
+ boolean dummy = OtherClass.is_initialized;
+
+ ...
+
+ if (! dummy)
+ OtherClass.initialize();
+
+ ... use OtherClass.data ...
+ }
+
+ Each of these boolean variables has an entry in the
+ DECL_FUNCTION_INIT_TEST_TABLE of a method. When inlining a method
+ we must merge the DECL_FUNCTION_INIT_TEST_TABLE from the function
+ being linlined and create the boolean variables in the outermost
+ scope of the method being inlined into. */
+
+/* Create a mapping from a boolean variable in a method being inlined
+ to one in the scope of the method being inlined into. */
+
+static int
+merge_init_test_initialization (entry, x)
+ void * * entry;
+ void * x;
+{
+ struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
+ splay_tree decl_map = (splay_tree)x;
+ splay_tree_node n;
+ tree *init_test_decl;
+
+ /* See if we have remapped this declaration. If we haven't there's
+ a bug in the inliner. */
+ n = splay_tree_lookup (decl_map, (splay_tree_key) ite->value);
+ if (! n)
+ abort ();
+
+ /* Create a new entry for the class and its remapped boolean
+ variable. If we already have a mapping for this class we've
+ already initialized it, so don't overwrite the value. */
+ init_test_decl = java_treetreehash_new
+ (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
+ if (!*init_test_decl)
+ *init_test_decl = (tree)n->value;
+
+ return true;
+}
+
+/* Merge the DECL_FUNCTION_INIT_TEST_TABLE from the function we're
+ inlining. */
+
+void
+java_inlining_merge_static_initializers (fn, decl_map)
+ tree fn;
+ void *decl_map;
+{
+ htab_traverse
+ (DECL_FUNCTION_INIT_TEST_TABLE (fn),
+ merge_init_test_initialization, decl_map);
+}
+
+/* Lookup a DECL_FUNCTION_INIT_TEST_TABLE entry in the method we're
+ inlining into. If we already have a corresponding entry in that
+ class we don't need to create another one, so we create a mapping
+ from the variable in the inlined class to the corresponding
+ pre-existing one. */
+
+static int
+inline_init_test_initialization (entry, x)
+ void * * entry;
+ void * x;
+{
+ struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
+ splay_tree decl_map = (splay_tree)x;
+
+ tree h = java_treetreehash_find
+ (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
+ if (! h)
+ return true;
+
+ splay_tree_insert (decl_map,
+ (splay_tree_key) ite->value,
+ (splay_tree_value) h);
+
+ return true;
+}
+
+/* Look up the boolean variables in the DECL_FUNCTION_INIT_TEST_TABLE
+ of a method being inlined. For each hone, if we already have a
+ variable associated with the same class in the method being inlined
+ into, create a new mapping for it. */
+
+void
+java_inlining_map_static_initializers (fn, decl_map)
+ tree fn;
+ void *decl_map;
+{
+ htab_traverse
+ (DECL_FUNCTION_INIT_TEST_TABLE (fn),
+ inline_init_test_initialization, decl_map);
+}
+
#include "gt-java-lang.h"
diff --git a/gcc/java/lex.c b/gcc/java/lex.c
index 5659ed2a1f5..d6901760d33 100644
--- a/gcc/java/lex.c
+++ b/gcc/java/lex.c
@@ -599,7 +599,7 @@ java_read_unicode_collapsing_terminators (lex, unicode_escape_p)
return a single line terminator. */
int dummy;
c = java_read_unicode (lex, &dummy);
- if (c != '\n')
+ if (c != '\n' && c != UEOF)
lex->unget_value = c;
/* In either case we must return a newline. */
c = '\n';
@@ -834,7 +834,7 @@ java_parse_escape_sequence ()
}
#ifndef JC1_LITE
-#define IS_ZERO(X) (ereal_cmp (X, dconst0) == 0)
+#define IS_ZERO(X) REAL_VALUES_EQUAL (X, dconst0)
/* Subroutine of java_lex: converts floating-point literals to tree
nodes. LITERAL_TOKEN is the input literal, JAVA_LVAL is where to
@@ -1604,6 +1604,15 @@ java_lex (java_lval)
SET_LVAL_NODE (null_pointer_node);
return NULL_TK;
+ case ASSERT_TK:
+ if (flag_assert)
+ {
+ BUILD_OPERATOR (kw->token);
+ return kw->token;
+ }
+ else
+ break;
+
/* Some keyword we want to retain information on the location
they where found. */
case CASE_TK:
@@ -1617,7 +1626,6 @@ java_lex (java_lval)
case CATCH_TK:
case THROW_TK:
case INSTANCEOF_TK:
- case ASSERT_TK:
BUILD_OPERATOR (kw->token);
default:
diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c
index ef70ff9d221..88aec17dda2 100644
--- a/gcc/java/mangle.c
+++ b/gcc/java/mangle.c
@@ -170,7 +170,7 @@ mangle_method_decl (mdecl)
}
/* This mangles a member name, like a function name or a field
- name. Handle cases were `name' is a C++ keyword. Return a non zero
+ name. Handle cases were `name' is a C++ keyword. Return a nonzero
value if unicode encoding was required. */
static void
@@ -340,7 +340,7 @@ find_compression_record_match (type, next_current)
return match;
}
-/* Mangle a record type. If a non zero value is returned, it means
+/* Mangle a record type. If a nonzero value is returned, it means
that a 'N' was emitted (so that a matching 'E' can be emitted if
necessary.) FOR_POINTER indicates that this element is for a pointer
symbol, meaning it was preceded by a 'P'. */
diff --git a/gcc/java/parse-scan.y b/gcc/java/parse-scan.y
index 977bbce226d..81ce627216d 100644
--- a/gcc/java/parse-scan.y
+++ b/gcc/java/parse-scan.y
@@ -135,6 +135,8 @@ void report PARAMS ((void));
}
%{
+extern int flag_assert;
+
#include "lex.c"
%}
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index 3dabe3593d0..24cf2ab2e93 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -69,10 +69,6 @@ definitions and other extensions. */
#include "debug.h"
#include "tree-inline.h"
-#ifndef DIR_SEPARATOR
-#define DIR_SEPARATOR '/'
-#endif
-
/* Local function prototypes */
static char *java_accstring_lookup PARAMS ((int));
static void classitf_redefinition_error PARAMS ((const char *,tree, tree, tree));
@@ -1004,12 +1000,7 @@ variable_declarator_id:
{yyerror ("Invalid declaration"); DRECOVER(vdi);}
| variable_declarator_id OSB_TK error
{
- tree node = java_lval.node;
- if (node && (TREE_CODE (node) == INTEGER_CST
- || TREE_CODE (node) == EXPR_WITH_FILE_LOCATION))
- yyerror ("Can't specify array dimension in a declaration");
- else
- yyerror ("']' expected");
+ yyerror ("']' expected");
DRECOVER(vdi);
}
| variable_declarator_id CSB_TK error
@@ -2682,7 +2673,7 @@ pop_current_osb (ctxp)
Add mode documentation here. FIXME */
/* Helper function. Create a new parser context. With
- COPY_FROM_PREVIOUS set to a non zero value, content of the previous
+ COPY_FROM_PREVIOUS set to a nonzero value, content of the previous
context is copied, otherwise, the new context is zeroed. The newly
created context becomes the current one. */
@@ -3449,12 +3440,11 @@ check_class_interface_creation (is_interface, flags, raw_name, qualified_name, d
{
const char *f;
- /* Contains OS dependent assumption on path separator. FIXME */
for (f = &input_filename [strlen (input_filename)];
- f != input_filename && f[0] != '/' && f[0] != DIR_SEPARATOR;
+ f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
f--)
;
- if (f[0] == '/' || f[0] == DIR_SEPARATOR)
+ if (IS_DIR_SEPARATOR (f[0]))
f++;
if (strncmp (IDENTIFIER_POINTER (raw_name),
f , IDENTIFIER_LENGTH (raw_name)) ||
@@ -5211,7 +5201,9 @@ obtain_incomplete_type (type_name)
else
abort ();
+ /* Workaround from build_pointer_type for incomplete types. */
BUILD_PTR_FROM_NAME (ptr, name);
+ TYPE_MODE (ptr) = ptr_mode;
layout_type (ptr);
return ptr;
@@ -6504,7 +6496,7 @@ java_check_regular_methods (class_decl)
abort ();
}
-/* Return a non zero value if the `throws' clause of METHOD (if any)
+/* Return a nonzero value if the `throws' clause of METHOD (if any)
is incompatible with the `throws' clause of FOUND (if any). */
static void
@@ -7479,7 +7471,7 @@ source_end_java_method ()
patched. Dump it to a file if the user requested it. */
dump_java_tree (TDI_original, fndecl);
- java_optimize_inline (fndecl);
+ java_optimize_inline (fndecl);
/* Generate function's code */
if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl))
@@ -8137,9 +8129,9 @@ java_expand_method_bodies (class)
/* Save the function for inlining. */
if (flag_inline_trees)
- DECL_SAVED_TREE (decl) =
+ DECL_SAVED_TREE (decl) =
BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl));
-
+
/* It's time to assign the variable flagging static class
initialization based on which classes invoked static methods
are definitely initializing. This should be flagged. */
@@ -8243,7 +8235,7 @@ build_outer_field_access (id, decl)
return resolve_expression_name (access, NULL);
}
-/* Return a non zero value if NODE describes an outer field inner
+/* Return a nonzero value if NODE describes an outer field inner
access. */
static int
@@ -8279,7 +8271,7 @@ outer_field_access_p (type, decl)
return 0;
}
-/* Return a non zero value if NODE represents an outer field inner
+/* Return a nonzero value if NODE represents an outer field inner
access that was been already expanded. As a side effect, it returns
the name of the field being accessed and the argument passed to the
access function, suitable for a regeneration of the access method
@@ -10407,7 +10399,7 @@ patch_method_invocation (patch, primary, where, from_super,
this$0 (the immediate outer context) to
access$0(access$0(...(this$0))).
- maybe_use_access_method returns a non zero value if the
+ maybe_use_access_method returns a nonzero value if the
this_arg has to be moved into the (then generated) stub
argument list. In the meantime, the selected function
might have be replaced by a generated stub. */
@@ -10648,7 +10640,7 @@ maybe_use_access_method (is_super_init, mdecl, this_arg)
*mdecl = md;
*this_arg = ta;
- /* Returnin a non zero value indicates we were doing a non static
+ /* Returnin a nonzero value indicates we were doing a non static
method invokation that is now a static invocation. It will have
callee displace `this' to insert it in the regular argument
list. */
@@ -11514,22 +11506,9 @@ java_complete_tree (node)
&& DECL_INITIAL (node) != NULL_TREE
&& !flag_emit_xref)
{
- tree value = DECL_INITIAL (node);
- DECL_INITIAL (node) = NULL_TREE;
- value = fold_constant_for_init (value, node);
- DECL_INITIAL (node) = value;
+ tree value = fold_constant_for_init (node, node);
if (value != NULL_TREE)
- {
- /* fold_constant_for_init sometimes widens the original type
- of the constant (i.e. byte to int). It's not desirable,
- especially if NODE is a function argument. */
- if ((TREE_CODE (value) == INTEGER_CST
- || TREE_CODE (value) == REAL_CST)
- && TREE_TYPE (node) != TREE_TYPE (value))
- return convert (TREE_TYPE (node), value);
- else
- return value;
- }
+ return value;
}
return node;
}
@@ -12312,7 +12291,7 @@ java_complete_lhs (node)
return node;
}
-/* Complete function call's argument. Return a non zero value is an
+/* Complete function call's argument. Return a nonzero value is an
error was found. */
static int
@@ -12915,11 +12894,14 @@ try_builtin_assignconv (wfl_op1, lhs_type, rhs)
new_rhs = convert (lhs_type, rhs);
/* Try a narrowing primitive conversion (5.1.3):
- - expression is a constant expression of type int AND
+ - expression is a constant expression of type byte, short, char,
+ or int, AND
- variable is byte, short or char AND
- The value of the expression is representable in the type of the
variable */
- else if (rhs_type == int_type_node && TREE_CONSTANT (rhs)
+ else if ((rhs_type == byte_type_node || rhs_type == short_type_node
+ || rhs_type == char_type_node || rhs_type == int_type_node)
+ && TREE_CONSTANT (rhs)
&& (lhs_type == byte_type_node || lhs_type == char_type_node
|| lhs_type == short_type_node))
{
@@ -13151,7 +13133,7 @@ do_unary_numeric_promotion (arg)
return arg;
}
-/* Return a non zero value if SOURCE can be converted into DEST using
+/* Return a nonzero value if SOURCE can be converted into DEST using
the method invocation conversion rule (5.3). */
static int
valid_method_invocation_conversion_p (dest, source)
@@ -13250,7 +13232,7 @@ java_decl_equiv (var_acc1, var_acc2)
&& TREE_OPERAND (var_acc1, 1) == TREE_OPERAND (var_acc2, 1));
}
-/* Return a non zero value if CODE is one of the operators that can be
+/* Return a nonzero value if CODE is one of the operators that can be
used in conjunction with the `=' operator in a compound assignment. */
static int
@@ -13788,8 +13770,19 @@ merge_string_cste (op1, op2, after)
string = null_pointer;
else if (TREE_TYPE (op2) == char_type_node)
{
- ch[0] = (char )TREE_INT_CST_LOW (op2);
- ch[1] = '\0';
+ /* Convert the character into UTF-8. */
+ unsigned char c = (unsigned char) TREE_INT_CST_LOW (op2);
+ unsigned char *p = (unsigned char *) ch;
+ if (0x01 <= c
+ && c <= 0x7f)
+ *p++ = c;
+ else
+ {
+ *p++ = c >> 6 | 0xc0;
+ *p++ = (c & 0x3f) | 0x80;
+ }
+ *p = '\0';
+
string = ch;
}
else
@@ -14951,7 +14944,7 @@ build_new_loop (loop_body)
BODY end of this labeled block)
INCREMENT (if any)
- REVERSED, if non zero, tells that the loop condition expr comes
+ REVERSED, if nonzero, tells that the loop condition expr comes
after the body, like in the do-while loop.
To obtain a loop, the loop body structure described above is
@@ -16012,8 +16005,10 @@ fold_constant_for_init (node, context)
switch (code)
{
- case STRING_CST:
case INTEGER_CST:
+ if (node == null_pointer_node)
+ return NULL_TREE;
+ case STRING_CST:
case REAL_CST:
return node;
@@ -16086,6 +16081,8 @@ fold_constant_for_init (node, context)
/* Guard against infinite recursion. */
DECL_INITIAL (node) = NULL_TREE;
val = fold_constant_for_init (val, node);
+ if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
+ val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
DECL_INITIAL (node) = val;
return val;
@@ -16221,8 +16218,11 @@ attach_init_test_initialization_flags (entry, ptr)
tree block = (tree)ptr;
struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
- TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
- BLOCK_EXPR_DECLS (block) = ite->value;
+ if (block != error_mark_node)
+ {
+ TREE_CHAIN (ite->value) = BLOCK_EXPR_DECLS (block);
+ BLOCK_EXPR_DECLS (block) = ite->value;
+ }
return true;
}
diff --git a/gcc/java/verify.c b/gcc/java/verify.c
index b81927e6913..081116815f4 100644
--- a/gcc/java/verify.c
+++ b/gcc/java/verify.c
@@ -1,6 +1,6 @@
/* Handle verification of bytecoded methods for the GNU compiler for
the Java(TM) language.
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -471,7 +471,6 @@ verify_jvm_instructions (jcf, byte_ops, length)
if (start_pc < 0 || start_pc >= length
|| end_pc < 0 || end_pc > length || start_pc >= end_pc
|| handler_pc < 0 || handler_pc >= length
- || (handler_pc >= start_pc && handler_pc < end_pc)
|| ! (instruction_bits [start_pc] & BCODE_INSTRUCTION_START)
|| (end_pc < length &&
! (instruction_bits [end_pc] & BCODE_INSTRUCTION_START))
@@ -482,6 +481,9 @@ verify_jvm_instructions (jcf, byte_ops, length)
return 0;
}
+ if (handler_pc >= start_pc && handler_pc < end_pc)
+ warning ("exception handler inside code that is being protected");
+
add_handler (start_pc, end_pc,
lookup_label (handler_pc),
catch_type == 0 ? NULL_TREE
@@ -1324,7 +1326,8 @@ verify_jvm_instructions (jcf, byte_ops, length)
type_map[len] = TREE_VEC_ELT (return_map, len);
}
current_subr = LABEL_SUBR_CONTEXT (target);
- PUSH_PENDING (return_label);
+ if (RETURN_MAP_ADJUSTED (return_map))
+ PUSH_PENDING (return_label);
}
INVALIDATE_PC;
diff --git a/gcc/jump.c b/gcc/jump.c
index 3b9dc616065..89da99f203b 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -59,7 +59,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
or even change what is live at any point.
So perhaps let combiner do it. */
-static int init_label_info PARAMS ((rtx));
+static void init_label_info PARAMS ((rtx));
static void mark_all_labels PARAMS ((rtx));
static int duplicate_loop_exit_test PARAMS ((rtx));
static void delete_computation PARAMS ((rtx));
@@ -78,10 +78,8 @@ rebuild_jump_labels (f)
rtx f;
{
rtx insn;
- int max_uid = 0;
-
- max_uid = init_label_info (f) + 1;
+ init_label_info (f);
mark_all_labels (f);
/* Keep track of labels used from static data; we don't track them
@@ -186,36 +184,29 @@ purge_line_number_notes (f)
/* Initialize LABEL_NUSES and JUMP_LABEL fields. Delete any REG_LABEL
notes whose labels don't occur in the insn any more. Returns the
largest INSN_UID found. */
-static int
+static void
init_label_info (f)
rtx f;
{
- int largest_uid = 0;
rtx insn;
for (insn = f; insn; insn = NEXT_INSN (insn))
- {
- if (GET_CODE (insn) == CODE_LABEL)
- LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
- else if (GET_CODE (insn) == JUMP_INSN)
- JUMP_LABEL (insn) = 0;
- else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
- {
- rtx note, next;
-
- for (note = REG_NOTES (insn); note; note = next)
- {
- next = XEXP (note, 1);
- if (REG_NOTE_KIND (note) == REG_LABEL
- && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
- remove_note (insn, note);
- }
- }
- if (INSN_UID (insn) > largest_uid)
- largest_uid = INSN_UID (insn);
- }
+ if (GET_CODE (insn) == CODE_LABEL)
+ LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
+ else if (GET_CODE (insn) == JUMP_INSN)
+ JUMP_LABEL (insn) = 0;
+ else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
+ {
+ rtx note, next;
- return largest_uid;
+ for (note = REG_NOTES (insn); note; note = next)
+ {
+ next = XEXP (note, 1);
+ if (REG_NOTE_KIND (note) == REG_LABEL
+ && ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
+ remove_note (insn, note);
+ }
+ }
}
/* Mark the label each jump jumps to.
@@ -962,7 +953,7 @@ signed_condition (code)
}
}
-/* Return non-zero if CODE1 is more strict than CODE2, i.e., if the
+/* Return nonzero if CODE1 is more strict than CODE2, i.e., if the
truth of CODE1 implies the truth of CODE2. */
int
@@ -1255,7 +1246,7 @@ onlyjump_p (insn)
#ifdef HAVE_cc0
-/* Return non-zero if X is an RTX that only sets the condition codes
+/* Return nonzero if X is an RTX that only sets the condition codes
and has no side effects. */
int
@@ -2410,3 +2401,15 @@ true_regnum (x)
}
return -1;
}
+
+/* Return regno of the register REG and handle subregs too. */
+unsigned int
+reg_or_subregno (reg)
+ rtx reg;
+{
+ if (REG_P (reg))
+ return REGNO (reg);
+ if (GET_CODE (reg) == SUBREG)
+ return REGNO (SUBREG_REG (reg));
+ abort ();
+}
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 54332b82e2b..ccbb53485aa 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -260,7 +260,7 @@ lhd_decl_printable_name (decl, verbosity)
completely handled within this function, it should set *SUBTREES to
0, so that generic handling isn't attempted. For language-specific
tree codes, generic handling would abort(), so make sure it is set
- properly. Both SUBTREES and *SUBTREES is guaranteed to be non-zero
+ properly. Both SUBTREES and *SUBTREES is guaranteed to be nonzero
when the function is called. */
tree
@@ -376,7 +376,7 @@ lhd_tree_inlining_anon_aggr_type_p (t)
/* lang_hooks.tree_inlining.start_inlining and end_inlining perform any
language-specific bookkeeping necessary for processing
- FN. start_inlining returns non-zero if inlining should proceed, zero if
+ FN. start_inlining returns nonzero if inlining should proceed, zero if
not.
For instance, the C++ version keeps track of template instantiations to
@@ -408,7 +408,7 @@ lhd_tree_inlining_convert_parm_for_inlining (parm, value, fndecl)
}
/* 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
+ nodes. Returns nonzero if it does not want the usual dumping of the
second argument. */
int
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 34c300d82c1..0518afed0ef 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -78,7 +78,7 @@ struct lang_hooks_for_functions
struct lang_hooks_for_tree_dump
{
- /* Dump language-specific parts of tree nodes. Returns non-zero if it
+ /* Dump language-specific parts of tree nodes. Returns nonzero if it
does not want the usual dumping of the second argument. */
int (*dump_tree) PARAMS ((void *, tree));
@@ -142,7 +142,7 @@ struct lang_hooks_for_decls
FUNCTIONBODY -- nonzero if this level is the body of a function. */
tree (*poplevel) PARAMS ((int, int, int));
- /* Returns non-zero if we are in the global binding level. Ada
+ /* Returns nonzero if we are in the global binding level. Ada
returns -1 for an undocumented reason used in stor-layout.c. */
int (*global_bindings_p) PARAMS ((void));
@@ -186,7 +186,7 @@ struct lang_hooks
/* Function called with an option vector as argument, to decode a
single option (typically starting with -f or -W or +). It should
return the number of command-line arguments it uses if it handles
- the option, or 0 and not complain if it does not recognise the
+ the option, or 0 and not complain if it does not recognize the
option. If this function returns a negative number, then its
absolute value is the number of command-line arguments used, but,
in addition, no language-independent option processing should be
@@ -201,7 +201,7 @@ struct lang_hooks
Should return zero unless the compiler back-end does not need to
be initialized, such as with the -E option.
- If errorcount is non-zero after this call the compiler exits
+ If errorcount is nonzero after this call the compiler exits
immediately and the finish hook is not called. */
bool (*post_options) PARAMS ((void));
@@ -216,7 +216,7 @@ struct lang_hooks
/* Called at the end of compilation, as a finalizer. */
void (*finish) PARAMS ((void));
- /* Parses the entire file. The argument is non-zero to cause bison
+ /* Parses the entire file. The argument is nonzero to cause bison
parsers to dump debugging information during parsing. */
void (*parse_file) PARAMS ((int));
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index c88b24f2bcf..c27ac469ea8 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -922,28 +922,20 @@ __fixxfdi (XFtype a)
DWtype
__fixunsdfDI (DFtype a)
{
- DFtype b;
- UDWtype v;
+ UWtype hi, lo;
- if (a < 0)
- return 0;
+ /* Get high part of result. The division here will just moves the radix
+ point and will not cause any rounding. Then the conversion to integral
+ type chops result as desired. */
+ hi = a / HIGH_WORD_COEFF;
- /* Compute high word of result, as a flonum. */
- b = (a / HIGH_WORD_COEFF);
- /* Convert that to fixed (but not to DWtype!),
- and shift it into the high word. */
- v = (UWtype) b;
- v <<= WORD_SIZE;
- /* Remove high part from the DFtype, leaving the low part as flonum. */
- a -= (DFtype)v;
- /* Convert that to fixed (but not to DWtype!) and add it in.
- Sometimes A comes out negative. This is significant, since
- A has more bits than a long int does. */
- if (a < 0)
- v -= (UWtype) (- a);
- else
- v += (UWtype) a;
- return v;
+ /* Get low part of result. Convert `hi' to floating type and scale it back,
+ then subtract this from the number being converted. This leaves the low
+ part. Convert that to integral type. */
+ lo = (a - ((DFtype) hi) * HIGH_WORD_COEFF);
+
+ /* Assemble result from the two parts. */
+ return ((UDWtype) hi << WORD_SIZE) | lo;
}
#endif
@@ -968,28 +960,20 @@ __fixunssfDI (SFtype original_a)
to lose any bits. Some day someone else can write a faster version
that avoids converting to DFtype, and verify it really works right. */
DFtype a = original_a;
- DFtype b;
- UDWtype v;
+ UWtype hi, lo;
- if (a < 0)
- return 0;
+ /* Get high part of result. The division here will just moves the radix
+ point and will not cause any rounding. Then the conversion to integral
+ type chops result as desired. */
+ hi = a / HIGH_WORD_COEFF;
- /* Compute high word of result, as a flonum. */
- b = (a / HIGH_WORD_COEFF);
- /* Convert that to fixed (but not to DWtype!),
- and shift it into the high word. */
- v = (UWtype) b;
- v <<= WORD_SIZE;
- /* Remove high part from the DFtype, leaving the low part as flonum. */
- a -= (DFtype) v;
- /* Convert that to fixed (but not to DWtype!) and add it in.
- Sometimes A comes out negative. This is significant, since
- A has more bits than a long int does. */
- if (a < 0)
- v -= (UWtype) (- a);
- else
- v += (UWtype) a;
- return v;
+ /* Get low part of result. Convert `hi' to floating type and scale it back,
+ then subtract this from the number being converted. This leaves the low
+ part. Convert that to integral type. */
+ lo = (a - ((DFtype) hi) * HIGH_WORD_COEFF);
+
+ /* Assemble result from the two parts. */
+ return ((UDWtype) hi << WORD_SIZE) | lo;
}
#endif
@@ -1091,7 +1075,10 @@ __floatdisf (DWtype u)
&& u < ((DWtype) 1 << DF_SIZE)))
{
if ((UDWtype) u & (REP_BIT - 1))
- u |= REP_BIT;
+ {
+ u &= ~ (REP_BIT - 1);
+ u |= REP_BIT;
+ }
}
}
f = (Wtype) (u >> WORD_SIZE);
@@ -1235,59 +1222,62 @@ __eprintf (const char *string, const char *expression,
#endif
#endif
-#ifdef L_bb
-
-struct bb_function_info {
- long checksum;
- int arc_count;
- const char *name;
-};
-
-/* Structure emitted by --profile-arcs */
-struct bb
-{
- long zero_word;
- const char *filename;
- gcov_type *counts;
- long ncounts;
- struct bb *next;
-
- /* Older GCC's did not emit these fields. */
- long sizeof_bb;
- struct bb_function_info *function_infos;
-};
-
-#ifndef inhibit_libc
+#ifdef L_gcov
-/* Arc profile dumper. Requires atexit and stdio. */
+/* Gcov profile dumper. Requires atexit and stdio. */
#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
#include <stdio.h>
#include "gcov-io.h"
#include <string.h>
-#ifdef TARGET_HAS_F_SETLKW
+#if defined (TARGET_HAS_F_SETLKW)
#include <fcntl.h>
#include <errno.h>
#endif
-/* Chain of per-object file bb structures. */
-static struct bb *bb_head;
+/* Chain of per-object gcov structures. */
+static struct gcov_info *gcov_list;
-/* Dump the coverage counts. We merge with existing counts when
- possible, to avoid growing the .da files ad infinitum. */
+/* A program checksum allows us to distinguish program data for an
+ object file included in multiple programs. */
+static unsigned gcov_crc32;
-void
-__bb_exit_func (void)
+static void
+gcov_version_mismatch (struct gcov_info *ptr, unsigned version)
+{
+ unsigned expected = GCOV_VERSION;
+ unsigned ix;
+ char e[4], v[4];
+
+ for (ix = 4; ix--; expected >>= 8, version >>= 8)
+ {
+ e[ix] = expected;
+ v[ix] = version;
+ }
+
+ fprintf (stderr,
+ "profiling:%s:Version mismatch - expected %.4s got %.4s\n",
+ ptr->filename, e, v);
+}
+
+/* Dump the coverage counts. We merge with existing counts when
+ possible, to avoid growing the .da files ad infinitum. We use this
+ program's checksum to make sure we only accumulate whole program
+ statistics to the correct summary. An object file might be embedded
+ in two separate programs, and we must keep the two program
+ summaries separate. */
+
+static void
+gcov_exit (void)
{
- struct bb *ptr;
- int i;
+ struct gcov_info *ptr;
+ unsigned ix, jx;
+ struct gcov_summary program;
+ gcov_type program_max_one = 0;
+ gcov_type program_max_sum = 0;
gcov_type program_sum = 0;
- gcov_type program_max = 0;
- long program_arcs = 0;
- gcov_type merged_sum = 0;
- gcov_type merged_max = 0;
- long merged_arcs = 0;
+ unsigned program_arcs = 0;
#if defined (TARGET_HAS_F_SETLKW)
struct flock s_flock;
@@ -1295,56 +1285,49 @@ __bb_exit_func (void)
s_flock.l_type = F_WRLCK;
s_flock.l_whence = SEEK_SET;
s_flock.l_start = 0;
- s_flock.l_len = 0; /* Until EOF. */
+ s_flock.l_len = 0; /* Until EOF. */
s_flock.l_pid = getpid ();
#endif
- /* Non-merged stats for this program. */
- for (ptr = bb_head; ptr; ptr = ptr->next)
- {
- for (i = 0; i < ptr->ncounts; i++)
- {
- program_sum += ptr->counts[i];
-
- if (ptr->counts[i] > program_max)
- program_max = ptr->counts[i];
- }
- program_arcs += ptr->ncounts;
- }
+ memset (&program, 0, sizeof (program));
+ program.checksum = gcov_crc32;
- for (ptr = bb_head; ptr; ptr = ptr->next)
+ for (ptr = gcov_list; ptr; ptr = ptr->next)
{
FILE *da_file;
- gcov_type object_max = 0;
- gcov_type object_sum = 0;
- long object_functions = 0;
+ struct gcov_summary object;
+ struct gcov_summary local_prg;
int merging = 0;
- int error = 0;
- struct bb_function_info *fn_info;
+ long base;
+ const struct function_info *fn_info;
gcov_type *count_ptr;
+ gcov_type object_max_one = 0;
+
+ ptr->wkspc = 0;
+ if (!ptr->filename)
+ continue;
+
+ for (ix = ptr->n_arc_counts, count_ptr = ptr->arc_counts; ix--;)
+ {
+ gcov_type count = *count_ptr++;
+
+ if (count > object_max_one)
+ object_max_one = count;
+ }
+ if (object_max_one > program_max_one)
+ program_max_one = object_max_one;
- /* Open for modification */
- da_file = fopen (ptr->filename, "r+b");
+ memset (&local_prg, 0, sizeof (local_prg));
+ memset (&object, 0, sizeof (object));
- if (da_file)
+ /* Open for modification */
+ if ((da_file = fopen (ptr->filename, "r+b")))
merging = 1;
+ else if ((da_file = fopen (ptr->filename, "w+b")))
+ ;
else
{
- /* Try for appending */
- da_file = fopen (ptr->filename, "ab");
- /* Some old systems might not allow the 'b' mode modifier.
- Therefore, try to open without it. This can lead to a
- race condition so that when you delete and re-create the
- file, the file might be opened in text mode, but then,
- you shouldn't delete the file in the first place. */
- if (!da_file)
- da_file = fopen (ptr->filename, "a");
- }
-
- if (!da_file)
- {
- fprintf (stderr, "arc profiling: Can't open output file %s.\n",
- ptr->filename);
+ fprintf (stderr, "profiling:%s:Cannot open\n", ptr->filename);
ptr->filename = 0;
continue;
}
@@ -1357,152 +1340,248 @@ __bb_exit_func (void)
&& errno == EINTR)
continue;
#endif
- for (fn_info = ptr->function_infos; fn_info->arc_count != -1; fn_info++)
- object_functions++;
-
if (merging)
{
/* Merge data from file. */
- long tmp_long;
- gcov_type tmp_gcov;
-
- if (/* magic */
- (__read_long (&tmp_long, da_file, 4) || tmp_long != -123l)
- /* functions in object file. */
- || (__read_long (&tmp_long, da_file, 4)
- || tmp_long != object_functions)
- /* extension block, skipped */
- || (__read_long (&tmp_long, da_file, 4)
- || fseek (da_file, tmp_long, SEEK_CUR)))
+ unsigned tag, length;
+
+ if (gcov_read_unsigned (da_file, &tag) || tag != GCOV_DATA_MAGIC)
{
- read_error:;
- fprintf (stderr, "arc profiling: Error merging output file %s.\n",
+ fprintf (stderr, "profiling:%s:Not a gcov data file\n",
ptr->filename);
- clearerr (da_file);
+ read_fatal:;
+ fclose (da_file);
+ ptr->filename = 0;
+ continue;
}
- else
+ if (gcov_read_unsigned (da_file, &length) || length != GCOV_VERSION)
{
- /* Merge execution counts for each function. */
- count_ptr = ptr->counts;
-
- for (fn_info = ptr->function_infos; fn_info->arc_count != -1;
- fn_info++)
+ gcov_version_mismatch (ptr, length);
+ goto read_fatal;
+ }
+
+ /* Merge execution counts for each function. */
+ count_ptr = ptr->arc_counts;
+ for (ix = ptr->n_functions, fn_info = ptr->functions;
+ ix--; fn_info++)
+ {
+ if (gcov_read_unsigned (da_file, &tag)
+ || gcov_read_unsigned (da_file, &length))
{
- if (/* function name delim */
- (__read_long (&tmp_long, da_file, 4)
- || tmp_long != -1)
- /* function name length */
- || (__read_long (&tmp_long, da_file, 4)
- || tmp_long != (long) strlen (fn_info->name))
- /* skip string */
- || fseek (da_file, ((tmp_long + 1) + 3) & ~3, SEEK_CUR)
- /* function name delim */
- || (__read_long (&tmp_long, da_file, 4)
- || tmp_long != -1))
- goto read_error;
+ read_error:;
+ fprintf (stderr, "profiling:%s:Error merging\n",
+ ptr->filename);
+ goto read_fatal;
+ }
- if (/* function checksum */
- (__read_long (&tmp_long, da_file, 4)
- || tmp_long != fn_info->checksum)
- /* arc count */
- || (__read_long (&tmp_long, da_file, 4)
- || tmp_long != fn_info->arc_count))
+ /* Check function */
+ if (tag != GCOV_TAG_FUNCTION)
+ {
+ read_mismatch:;
+ fprintf (stderr, "profiling:%s:Merge mismatch at %s\n",
+ ptr->filename, fn_info->name);
+ goto read_fatal;
+ }
+ {
+ unsigned flength, checksum;
+
+ if (gcov_read_unsigned (da_file, &flength)
+ || gcov_skip_string (da_file, flength)
+ || gcov_read_unsigned (da_file, &checksum))
+ goto read_error;
+ if (flength != strlen (fn_info->name)
+ || checksum != fn_info->checksum)
+ goto read_mismatch;
+ }
+ /* Check arc counts */
+ if (gcov_read_unsigned (da_file, &tag)
+ || gcov_read_unsigned (da_file, &length))
+ goto read_error;
+ if (tag != GCOV_TAG_ARC_COUNTS
+ || length / 8 != fn_info->n_arc_counts)
+ goto read_mismatch;
+ {
+ gcov_type count;
+
+ for (jx = fn_info->n_arc_counts; jx--; count_ptr++)
+ if (gcov_read_counter (da_file, &count))
goto read_error;
-
- for (i = fn_info->arc_count; i > 0; i--, count_ptr++)
- if (__read_gcov_type (&tmp_gcov, da_file, 8))
- goto read_error;
- else
- *count_ptr += tmp_gcov;
+ else
+ *count_ptr += count;
+ }
+ }
+
+ /* Check object summary */
+ if (gcov_read_unsigned (da_file, &tag)
+ || gcov_read_unsigned (da_file, &length))
+ goto read_error;
+ if (tag != GCOV_TAG_OBJECT_SUMMARY)
+ goto read_mismatch;
+ if (gcov_read_summary (da_file, &object))
+ goto read_error;
+
+ /* Check program summary */
+ while (1)
+ {
+ long base = ftell (da_file);
+
+ if (gcov_read_unsigned (da_file, &tag)
+ || gcov_read_unsigned (da_file, &length))
+ {
+ if (feof (da_file))
+ break;
+ goto read_error;
}
+ if (tag != GCOV_TAG_PROGRAM_SUMMARY
+ && tag != GCOV_TAG_PLACEHOLDER_SUMMARY
+ && tag != GCOV_TAG_INCORRECT_SUMMARY)
+ goto read_mismatch;
+ if (gcov_read_summary (da_file, &local_prg))
+ goto read_error;
+ if (local_prg.checksum != program.checksum)
+ continue;
+ if (tag == GCOV_TAG_PLACEHOLDER_SUMMARY)
+ {
+ fprintf (stderr,
+ "profiling:%s:Concurrent race detected\n",
+ ptr->filename);
+ goto read_fatal;
+ }
+ merging = -1;
+ if (tag != GCOV_TAG_PROGRAM_SUMMARY)
+ break;
+
+ if (program.runs
+ && memcmp (&program, &local_prg, sizeof (program)))
+ {
+ fprintf (stderr, "profiling:%s:Invocation mismatch\n",
+ ptr->filename);
+ local_prg.runs = 0;
+ }
+ else
+ memcpy (&program, &local_prg, sizeof (program));
+ ptr->wkspc = base;
+ break;
}
fseek (da_file, 0, SEEK_SET);
}
-
- /* Calculate the per-object statistics. */
- for (i = 0; i < ptr->ncounts; i++)
- {
- object_sum += ptr->counts[i];
- if (ptr->counts[i] > object_max)
- object_max = ptr->counts[i];
- }
- merged_sum += object_sum;
- if (merged_max < object_max)
- merged_max = object_max;
- merged_arcs += ptr->ncounts;
+ object.runs++;
+ object.arcs = ptr->n_arc_counts;
+ object.arc_sum = 0;
+ if (object.arc_max_one < object_max_one)
+ object.arc_max_one = object_max_one;
+ object.arc_sum_max += object_max_one;
- /* Write out the data. */
+ /* Write out the data. */
if (/* magic */
- __write_long (-123, da_file, 4)
- /* number of functions in object file. */
- || __write_long (object_functions, da_file, 4)
- /* length of extra data in bytes. */
- || __write_long ((4 + 8 + 8) + (4 + 8 + 8), da_file, 4)
-
- /* whole program statistics. If merging write per-object
- now, rewrite later */
- /* number of instrumented arcs. */
- || __write_long (merging ? ptr->ncounts : program_arcs, da_file, 4)
- /* sum of counters. */
- || __write_gcov_type (merging ? object_sum : program_sum, da_file, 8)
- /* maximal counter. */
- || __write_gcov_type (merging ? object_max : program_max, da_file, 8)
-
- /* per-object statistics. */
- /* number of counters. */
- || __write_long (ptr->ncounts, da_file, 4)
- /* sum of counters. */
- || __write_gcov_type (object_sum, da_file, 8)
- /* maximal counter. */
- || __write_gcov_type (object_max, da_file, 8))
+ gcov_write_unsigned (da_file, GCOV_DATA_MAGIC)
+ /* version number */
+ || gcov_write_unsigned (da_file, GCOV_VERSION))
{
write_error:;
- fprintf (stderr, "arc profiling: Error writing output file %s.\n",
- ptr->filename);
- error = 1;
+ fclose (da_file);
+ fprintf (stderr, "profiling:%s:Error writing\n", ptr->filename);
+ ptr->filename = 0;
+ continue;
}
- else
+
+ /* Write execution counts for each function. */
+ count_ptr = ptr->arc_counts;
+ for (ix = ptr->n_functions, fn_info = ptr->functions; ix--; fn_info++)
{
- /* Write execution counts for each function. */
- count_ptr = ptr->counts;
-
- for (fn_info = ptr->function_infos; fn_info->arc_count != -1;
- fn_info++)
+ /* Announce function. */
+ if (gcov_write_unsigned (da_file, GCOV_TAG_FUNCTION)
+ || !(base = gcov_reserve_length (da_file))
+ /* function name */
+ || gcov_write_string (da_file, fn_info->name,
+ strlen (fn_info->name))
+ /* function checksum */
+ || gcov_write_unsigned (da_file, fn_info->checksum)
+ || gcov_write_length (da_file, base))
+ goto write_error;
+
+ /* arc counts. */
+ if (gcov_write_unsigned (da_file, GCOV_TAG_ARC_COUNTS)
+ || !(base = gcov_reserve_length (da_file)))
+ goto write_error;
+
+ for (jx = fn_info->n_arc_counts; jx--;)
{
- if (__write_gcov_string (fn_info->name,
- strlen (fn_info->name), da_file, -1)
- || __write_long (fn_info->checksum, da_file, 4)
- || __write_long (fn_info->arc_count, da_file, 4))
- goto write_error;
+ gcov_type count = *count_ptr++;
- for (i = fn_info->arc_count; i > 0; i--, count_ptr++)
- if (__write_gcov_type (*count_ptr, da_file, 8))
- goto write_error; /* RIP Edsger Dijkstra */
+ object.arc_sum += count;
+ if (object.arc_max_sum < count)
+ object.arc_max_sum = count;
+ if (gcov_write_counter (da_file, count))
+ goto write_error; /* RIP Edsger Dijkstra */
}
+ if (gcov_write_length (da_file, base))
+ goto write_error;
}
+ /* Object file summary. */
+ if (gcov_write_summary (da_file, GCOV_TAG_OBJECT_SUMMARY, &object))
+ goto write_error;
+
+ if (merging >= 0)
+ {
+ if (fseek (da_file, 0, SEEK_END))
+ goto write_error;
+ ptr->wkspc = ftell (da_file);
+ if (gcov_write_summary (da_file, GCOV_TAG_PLACEHOLDER_SUMMARY,
+ &program))
+ goto write_error;
+ }
+ else if (ptr->wkspc)
+ {
+ /* Zap trailing program summary */
+ if (fseek (da_file, ptr->wkspc, SEEK_SET))
+ goto write_error;
+ if (!local_prg.runs)
+ ptr->wkspc = 0;
+ if (gcov_write_unsigned (da_file,
+ local_prg.runs ? GCOV_TAG_PLACEHOLDER_SUMMARY
+ : GCOV_TAG_INCORRECT_SUMMARY))
+ goto write_error;
+ }
+ if (fflush (da_file))
+ goto write_error;
+
if (fclose (da_file))
{
- fprintf (stderr, "arc profiling: Error closing output file %s.\n",
- ptr->filename);
- error = 1;
+ fprintf (stderr, "profiling:%s:Error closing\n", ptr->filename);
+ ptr->filename = 0;
+ }
+ else
+ {
+ program_arcs += ptr->n_arc_counts;
+ program_sum += object.arc_sum;
+ if (program_max_sum < object.arc_max_sum)
+ program_max_sum = object.arc_max_sum;
}
- if (error || !merging)
- ptr->filename = 0;
}
+ /* Generate whole program statistics. */
+ program.runs++;
+ program.arcs = program_arcs;
+ program.arc_sum = program_sum;
+ if (program.arc_max_one < program_max_one)
+ program.arc_max_one = program_max_one;
+ if (program.arc_max_sum < program_max_sum)
+ program.arc_max_sum = program_max_sum;
+ program.arc_sum_max += program_max_one;
+
/* Upate whole program statistics. */
- for (ptr = bb_head; ptr; ptr = ptr->next)
- if (ptr->filename)
+ for (ptr = gcov_list; ptr; ptr = ptr->next)
+ if (ptr->filename && ptr->wkspc)
{
FILE *da_file;
da_file = fopen (ptr->filename, "r+b");
if (!da_file)
{
- fprintf (stderr, "arc profiling: Cannot reopen %s.\n",
- ptr->filename);
+ fprintf (stderr, "profiling:%s:Cannot open\n", ptr->filename);
continue;
}
@@ -1511,19 +1590,12 @@ __bb_exit_func (void)
&& errno == EINTR)
continue;
#endif
-
- if (fseek (da_file, 4 * 3, SEEK_SET)
- /* number of instrumented arcs. */
- || __write_long (program_arcs, da_file, 4)
- /* sum of counters. */
- || __write_gcov_type (program_sum, da_file, 8)
- /* maximal counter. */
- || __write_gcov_type (program_max, da_file, 8))
- fprintf (stderr, "arc profiling: Error updating program header %s.\n",
- ptr->filename);
+ if (fseek (da_file, ptr->wkspc, SEEK_SET)
+ || gcov_write_summary (da_file, GCOV_TAG_PROGRAM_SUMMARY, &program)
+ || fflush (da_file))
+ fprintf (stderr, "profiling:%s:Error writing\n", ptr->filename);
if (fclose (da_file))
- fprintf (stderr, "arc profiling: Error reclosing %s\n",
- ptr->filename);
+ fprintf (stderr, "profiling:%s:Error closing\n", ptr->filename);
}
}
@@ -1531,19 +1603,42 @@ __bb_exit_func (void)
when running an object file's global ctors. */
void
-__bb_init_func (struct bb *blocks)
+__gcov_init (struct gcov_info *info)
{
- if (blocks->zero_word)
+ if (!info->version)
return;
+ if (info->version != GCOV_VERSION)
+ gcov_version_mismatch (info, info->version);
+ else
+ {
+ const char *ptr = info->filename;
+ unsigned crc32 = gcov_crc32;
+
+ do
+ {
+ unsigned ix;
+ unsigned value = *ptr << 24;
- /* Initialize destructor and per-thread data. */
- if (!bb_head)
- atexit (__bb_exit_func);
+ for (ix = 8; ix--; value <<= 1)
+ {
+ unsigned feedback;
- /* Set up linked list. */
- blocks->zero_word = 1;
- blocks->next = bb_head;
- bb_head = blocks;
+ feedback = (value ^ crc32) & 0x80000000 ? 0x04c11db7 : 0;
+ crc32 <<= 1;
+ crc32 ^= feedback;
+ }
+ }
+ while (*ptr++);
+
+ gcov_crc32 = crc32;
+
+ if (!gcov_list)
+ atexit (gcov_exit);
+
+ info->next = gcov_list;
+ gcov_list = info;
+ }
+ info->version = 0;
}
/* Called before fork or exec - write out profile information gathered so
@@ -1551,21 +1646,21 @@ __bb_init_func (struct bb *blocks)
profile information gathered so far. */
void
-__bb_fork_func (void)
+__gcov_flush (void)
{
- struct bb *ptr;
+ struct gcov_info *ptr;
- __bb_exit_func ();
- for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next)
+ gcov_exit ();
+ for (ptr = gcov_list; ptr; ptr = ptr->next)
{
- long i;
- for (i = ptr->ncounts - 1; i >= 0; i--)
- ptr->counts[i] = 0;
+ unsigned i;
+
+ for (i = ptr->n_arc_counts; i--;)
+ ptr->arc_counts[i] = 0;
}
}
-#endif /* not inhibit_libc */
-#endif /* L_bb */
+#endif /* L_gcov */
#ifdef L_clear_cache
/* Clear part of an instruction cache. */
diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h
index 79c79970057..260cd7c9f57 100644
--- a/gcc/libgcc2.h
+++ b/gcc/libgcc2.h
@@ -27,19 +27,6 @@ extern void __clear_cache (char *, char *);
extern void __eprintf (const char *, const char *, unsigned int, const char *)
__attribute__ ((__noreturn__));
-struct bb;
-extern void __bb_exit_func (void);
-extern void __bb_init_func (struct bb *);
-extern void __bb_fork_func (void);
-
-#if LONG_TYPE_SIZE == GCOV_TYPE_SIZE
-typedef long gcov_type;
-#else
-typedef long long gcov_type;
-#endif
-
-extern gcov_type *__bb_find_arc_counters (void);
-
struct exception_descriptor;
extern short int __get_eh_table_language (struct exception_descriptor *);
extern short int __get_eh_table_version (struct exception_descriptor *);
diff --git a/gcc/line-map.h b/gcc/line-map.h
index 835cb317753..60201887f49 100644
--- a/gcc/line-map.h
+++ b/gcc/line-map.h
@@ -109,7 +109,7 @@ extern void print_containing_files
/* Returns the map a given map was included from. */
#define INCLUDED_FROM(SET, MAP) (&(SET)->maps[(MAP)->included_from])
-/* Non-zero if the map is at the bottom of the include stack. */
+/* Nonzero if the map is at the bottom of the include stack. */
#define MAIN_FILE_P(MAP) ((MAP)->included_from < 0)
/* The current line map. Saves a call to lookup_line if the caller is
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index 04e2fbe5a4c..9c94924aec9 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -577,7 +577,7 @@ equiv_init_varies_p (x)
return 0;
}
-/* Returns non-zero if X (used to initialize register REGNO) is movable.
+/* Returns nonzero if X (used to initialize register REGNO) is movable.
X is only movable if the registers it uses have equivalent initializations
which appear to be within the same loop (or in an inner loop) and movable
or if they are not candidates for local_alloc and don't vary. */
@@ -1778,11 +1778,11 @@ qty_sugg_compare_1 (q1p, q2p)
If we really combined them, we could lose if the pseudo lives
across an insn that clobbers the hard reg (eg, movstr).
- ALREADY_DEAD is non-zero if USEDREG is known to be dead even though
+ ALREADY_DEAD is nonzero if USEDREG is known to be dead even though
there is no REG_DEAD note on INSN. This occurs during the processing
of REG_NO_CONFLICT blocks.
- MAY_SAVE_COPYCOPY is non-zero if this insn is simply copying USEDREG to
+ MAY_SAVE_COPYCOPY is nonzero if this insn is simply copying USEDREG to
SETREG or if the input and output must share a register.
In that case, we record a hard reg suggestion in QTY_PHYS_COPY_SUGG.
@@ -2099,7 +2099,7 @@ reg_is_born (reg, birth)
}
}
-/* Record the death of REG in the current insn. If OUTPUT_P is non-zero,
+/* Record the death of REG in the current insn. If OUTPUT_P is nonzero,
REG is an output that is dying (i.e., it is never used), otherwise it
is an input (the normal case).
If OUTPUT_P is 1, then we extend the life past the end of this insn. */
@@ -2168,7 +2168,7 @@ wipe_dead_reg (reg, output_p)
If QTYNO crosses calls, insist on a register preserved by calls,
unless ACCEPT_CALL_CLOBBERED is nonzero.
- If JUST_TRY_SUGGESTED is non-zero, only try to see if the suggested
+ If JUST_TRY_SUGGESTED is nonzero, only try to see if the suggested
register is available. If not, return -1. */
static int
@@ -2327,7 +2327,7 @@ find_free_reg (class, mode, qtyno, accept_call_clobbered, just_try_suggested,
}
/* Mark that REGNO with machine-mode MODE is live starting from the current
- insn (if LIFE is non-zero) or dead starting at the current insn (if LIFE
+ insn (if LIFE is nonzero) or dead starting at the current insn (if LIFE
is zero). */
static void
@@ -2346,7 +2346,7 @@ mark_life (regno, mode, life)
}
/* Mark register number REGNO (with machine-mode MODE) as live (if LIFE
- is non-zero) or dead (if LIFE is zero) from insn number BIRTH (inclusive)
+ is nonzero) or dead (if LIFE is zero) from insn number BIRTH (inclusive)
to insn number DEATH (exclusive). */
static void
diff --git a/gcc/longlong.h b/gcc/longlong.h
index 40f03fe2a0e..b886f2bdc8d 100644
--- a/gcc/longlong.h
+++ b/gcc/longlong.h
@@ -66,7 +66,7 @@
is rounded towards 0.
5) count_leading_zeros(count, x) counts the number of zero-bits from the
- msb to the first non-zero bit in the UWtype X. This is the number of
+ msb to the first nonzero bit in the UWtype X. This is the number of
steps X needs to be shifted left to set the msb. Undefined for X == 0,
unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
@@ -124,7 +124,7 @@
(q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \
(r) = __r; \
} while (0)
-extern UDItype __udiv_qrnnd PARAMS ((UDItype *, UDItype, UDItype, UDItype));
+extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
#define UDIV_TIME 220
#endif /* LONGLONG_STANDALONE */
#ifdef __alpha_cix__
@@ -292,44 +292,27 @@ UDItype __umulsidi3 (USItype, USItype);
} while (0)
#endif
-#if (defined (__i370__) || defined (__mvs__)) && W_TYPE_SIZE == 32
-#define umul_ppmm(xh, xl, m0, m1) \
- do { \
- union {UDItype __ll; \
- struct {USItype __h, __l;} __i; \
- } __xx; \
- USItype __m0 = (m0), __m1 = (m1); \
- __asm__ ("mr %0,%3" \
- : "=r" (__xx.__i.__h), \
- "=r" (__xx.__i.__l) \
- : "%1" (__m0), \
- "r" (__m1)); \
- (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
- (xh) += ((((SItype) __m0 >> 31) & __m1) \
- + (((SItype) __m1 >> 31) & __m0)); \
- } while (0)
+#if (defined (__i370__) || defined (__s390__) || defined (__mvs__)) && W_TYPE_SIZE == 32
#define smul_ppmm(xh, xl, m0, m1) \
do { \
union {DItype __ll; \
struct {USItype __h, __l;} __i; \
- } __xx; \
- __asm__ ("mr %0,%3" \
- : "=r" (__xx.__i.__h), \
- "=r" (__xx.__i.__l) \
- : "%1" (m0), \
- "r" (m1)); \
- (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
+ } __x; \
+ __asm__ ("lr %N0,%1\n\tmr %0,%2" \
+ : "=&r" (__x.__ll) \
+ : "r" (m0), "r" (m1)); \
+ (xh) = __x.__i.__h; (xl) = __x.__i.__l; \
} while (0)
#define sdiv_qrnnd(q, r, n1, n0, d) \
do { \
union {DItype __ll; \
struct {USItype __h, __l;} __i; \
- } __xx; \
- __xx.__i.__h = n1; __xx.__i.__l = n0; \
+ } __x; \
+ __x.__i.__h = n1; __x.__i.__l = n0; \
__asm__ ("dr %0,%2" \
- : "=r" (__xx.__ll) \
- : "0" (__xx.__ll), "r" (d)); \
- (q) = __xx.__i.__l; (r) = __xx.__i.__h; \
+ : "=r" (__x.__ll) \
+ : "0" (__x.__ll), "r" (d)); \
+ (q) = __x.__i.__l; (r) = __x.__i.__h; \
} while (0)
#endif
@@ -621,127 +604,135 @@ UDItype __umulsidi3 (USItype, USItype);
} while (0)
#endif /* __ns32000__ */
-#if (defined (_ARCH_PPC) || defined (_IBMR2))
-#if W_TYPE_SIZE == 32
+/* FIXME: We should test _IBMR2 here when we add assembly support for the
+ system vendor compilers.
+ FIXME: What's needed for gcc PowerPC VxWorks? __vxworks__ is not good
+ enough, since that hits ARM and m68k too. */
+#if (defined (_ARCH_PPC) /* AIX */ \
+ || defined (_ARCH_PWR) /* AIX */ \
+ || defined (_ARCH_COM) /* AIX */ \
+ || defined (__powerpc__) /* gcc */ \
+ || defined (__POWERPC__) /* BEOS */ \
+ || defined (__ppc__) /* Darwin */ \
+ || defined (PPC) /* GNU/Linux, SysV */ \
+ ) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
do { \
if (__builtin_constant_p (bh) && (bh) == 0) \
__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "%r" ((USItype) (ah)), \
- "%r" ((USItype) (al)), \
- "rI" ((USItype) (bl))); \
- else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
+ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "%r" ((USItype) (ah)), \
- "%r" ((USItype) (al)), \
- "rI" ((USItype) (bl))); \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
else \
__asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "%r" ((USItype) (ah)), \
- "r" ((USItype) (bh)), \
- "%r" ((USItype) (al)), \
- "rI" ((USItype) (bl))); \
+ : "=r" (sh), "=&r" (sl) \
+ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
} while (0)
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
do { \
if (__builtin_constant_p (ah) && (ah) == 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "r" ((USItype) (bh)), \
- "rI" ((USItype) (al)), \
- "r" ((USItype) (bl))); \
- else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0) \
+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
+ else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "r" ((USItype) (bh)), \
- "rI" ((USItype) (al)), \
- "r" ((USItype) (bl))); \
+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
else if (__builtin_constant_p (bh) && (bh) == 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "r" ((USItype) (ah)), \
- "rI" ((USItype) (al)), \
- "r" ((USItype) (bl))); \
- else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
+ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \
__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "r" ((USItype) (ah)), \
- "rI" ((USItype) (al)), \
- "r" ((USItype) (bl))); \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
else \
__asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
- : "=r" ((USItype) (sh)), \
- "=&r" ((USItype) (sl)) \
- : "r" ((USItype) (ah)), \
- "r" ((USItype) (bh)), \
- "rI" ((USItype) (al)), \
- "r" ((USItype) (bl))); \
+ : "=r" (sh), "=&r" (sl) \
+ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
} while (0)
-#endif /* W_TYPE_SIZE */
#define count_leading_zeros(count, x) \
- __asm__ ("{cntlz|cntlzw} %0,%1" \
- : "=r" ((USItype) (count)) \
- : "r" ((USItype) (x)))
+ __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))
#define COUNT_LEADING_ZEROS_0 32
-#if defined (_ARCH_PPC)
+#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \
+ || defined (__ppc__) || defined (PPC) || defined (__vxworks__)
#define umul_ppmm(ph, pl, m0, m1) \
do { \
USItype __m0 = (m0), __m1 = (m1); \
- __asm__ ("mulhwu %0,%1,%2" \
- : "=r" ((USItype) ph) \
- : "%r" (__m0), \
- "r" (__m1)); \
+ __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
(pl) = __m0 * __m1; \
} while (0)
#define UMUL_TIME 15
#define smul_ppmm(ph, pl, m0, m1) \
do { \
SItype __m0 = (m0), __m1 = (m1); \
- __asm__ ("mulhw %0,%1,%2" \
- : "=r" ((SItype) ph) \
- : "%r" (__m0), \
- "r" (__m1)); \
+ __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
(pl) = __m0 * __m1; \
} while (0)
#define SMUL_TIME 14
#define UDIV_TIME 120
#elif defined (_ARCH_PWR)
-#define umul_ppmm(xh, xl, m0, m1) \
- do { \
- USItype __m0 = (m0), __m1 = (m1); \
- __asm__ ("mul %0,%2,%3" \
- : "=r" ((USItype) (xh)), \
- "=q" ((USItype) (xl)) \
- : "r" (__m0), \
- "r" (__m1)); \
- (xh) += ((((SItype) __m0 >> 31) & __m1) \
- + (((SItype) __m1 >> 31) & __m0)); \
- } while (0)
#define UMUL_TIME 8
#define smul_ppmm(xh, xl, m0, m1) \
- __asm__ ("mul %0,%2,%3" \
- : "=r" ((SItype) (xh)), \
- "=q" ((SItype) (xl)) \
- : "r" (m0), \
- "r" (m1))
+ __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1))
#define SMUL_TIME 4
#define sdiv_qrnnd(q, r, nh, nl, d) \
- __asm__ ("div %0,%2,%4" \
- : "=r" ((SItype) (q)), "=q" ((SItype) (r)) \
- : "r" ((SItype) (nh)), "1" ((SItype) (nl)), "r" ((SItype) (d)))
+ __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d))
#define UDIV_TIME 100
#endif
-#endif /* Power architecture variants. */
+#endif /* 32-bit POWER architecture variants. */
+
+/* We should test _IBMR2 here when we add assembly support for the system
+ vendor compilers. */
+#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+ do { \
+ if (__builtin_constant_p (bh) && (bh) == 0) \
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
+ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
+ else \
+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
+ : "=r" (sh), "=&r" (sl) \
+ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \
+ } while (0)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+ do { \
+ if (__builtin_constant_p (ah) && (ah) == 0) \
+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
+ else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \
+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
+ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
+ else if (__builtin_constant_p (bh) && (bh) == 0) \
+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
+ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \
+ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
+ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
+ else \
+ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
+ : "=r" (sh), "=&r" (sl) \
+ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \
+ } while (0)
+#define count_leading_zeros(count, x) \
+ __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
+#define COUNT_LEADING_ZEROS_0 64
+#define umul_ppmm(ph, pl, m0, m1) \
+ do { \
+ UDItype __m0 = (m0), __m1 = (m1); \
+ __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
+ (pl) = __m0 * __m1; \
+ } while (0)
+#define UMUL_TIME 15
+#define smul_ppmm(ph, pl, m0, m1) \
+ do { \
+ DItype __m0 = (m0), __m1 = (m1); \
+ __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \
+ (pl) = __m0 * __m1; \
+ } while (0)
+#define SMUL_TIME 14 /* ??? */
+#define UDIV_TIME 120 /* ??? */
+#endif /* 64-bit PowerPC. */
#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
@@ -1193,6 +1184,20 @@ UDItype __umulsidi3 (USItype, USItype);
} while (0)
#endif
+/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of
+ smul_ppmm. */
+#if !defined (umul_ppmm) && defined (smul_ppmm)
+#define umul_ppmm(w1, w0, u, v) \
+ do { \
+ UWtype __w1; \
+ UWtype __xm0 = (u), __xm1 = (v); \
+ smul_ppmm (__w1, w0, __xm0, __xm1); \
+ (w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \
+ + (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \
+ } while (0)
+#endif
+
+/* If we still don't have umul_ppmm, define it using plain C. */
#if !defined (umul_ppmm)
#define umul_ppmm(w1, w0, u, v) \
do { \
diff --git a/gcc/loop.c b/gcc/loop.c
index a777013de45..4fd54b31ac6 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -151,7 +151,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define LOOP_REGNO_NREGS(REGNO, SET_DEST) \
((REGNO) < FIRST_PSEUDO_REGISTER \
- ? HARD_REGNO_NREGS ((REGNO), GET_MODE (SET_DEST)) : 1)
+ ? (int) HARD_REGNO_NREGS ((REGNO), GET_MODE (SET_DEST)) : 1)
/* Vector mapping INSN_UIDs to luids.
@@ -169,10 +169,6 @@ struct loop **uid_loop;
int max_uid_for_loop;
-/* 1 + luid of last insn. */
-
-static int max_luid;
-
/* Number of loops detected in current function. Used as index to the
next few tables. */
@@ -522,7 +518,7 @@ loop_optimize (f, dumpfile, flags)
/* find_and_verify_loops has already called compute_luids, but it
might have rearranged code afterwards, so we need to recompute
the luids now. */
- max_luid = compute_luids (f, NULL_RTX, 0);
+ compute_luids (f, NULL_RTX, 0);
/* Don't leave gaps in uid_luid for insns that have been
deleted. It is possible that the first or last insn
@@ -616,8 +612,6 @@ scan_loop (loop, flags)
/* 1 if we are scanning insns that might never be executed
due to a subroutine call which might exit before they are reached. */
int call_passed = 0;
- /* Jump insn that enters the loop, or 0 if control drops in. */
- rtx loop_entry_jump = 0;
/* Number of insns in the loop. */
int insn_count;
int tem;
@@ -633,6 +627,7 @@ scan_loop (loop, flags)
int threshold;
/* Nonzero if we are scanning instructions in a sub-loop. */
int loop_depth = 0;
+ int in_libcall;
loop->top = 0;
@@ -684,24 +679,20 @@ scan_loop (loop, flags)
Start scan from there.
But record in LOOP->TOP the place where the end-test jumps
back to so we can scan that after the end of the loop. */
- if (GET_CODE (p) == JUMP_INSN)
- {
- loop_entry_jump = p;
-
+ if (GET_CODE (p) == JUMP_INSN
/* Loop entry must be unconditional jump (and not a RETURN) */
- if (any_uncondjump_p (p)
- && JUMP_LABEL (p) != 0
- /* Check to see whether the jump actually
- jumps out of the loop (meaning it's no loop).
- This case can happen for things like
- do {..} while (0). If this label was generated previously
- by loop, we can't tell anything about it and have to reject
- the loop. */
- && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, loop_end))
- {
- loop->top = next_label (loop->scan_start);
- loop->scan_start = JUMP_LABEL (p);
- }
+ && any_uncondjump_p (p)
+ && JUMP_LABEL (p) != 0
+ /* Check to see whether the jump actually
+ jumps out of the loop (meaning it's no loop).
+ This case can happen for things like
+ do {..} while (0). If this label was generated previously
+ by loop, we can't tell anything about it and have to reject
+ the loop. */
+ && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, loop_end))
+ {
+ loop->top = next_label (loop->scan_start);
+ loop->scan_start = JUMP_LABEL (p);
}
/* If LOOP->SCAN_START was an insn created by loop, we don't know its luid
@@ -749,290 +740,312 @@ scan_loop (loop, flags)
When MAYBE_NEVER is 0, all insns will be executed at least once
so that is not a problem. */
- for (p = next_insn_in_loop (loop, loop->scan_start);
+ for (in_libcall = 0, p = next_insn_in_loop (loop, loop->scan_start);
p != NULL_RTX;
p = next_insn_in_loop (loop, p))
{
- if (GET_CODE (p) == INSN
- && (set = single_set (p))
- && GET_CODE (SET_DEST (set)) == REG
-#ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
- && SET_DEST (set) != pic_offset_table_rtx
-#endif
- && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
+ if (in_libcall && INSN_P (p) && find_reg_note (p, REG_RETVAL, NULL_RTX))
+ in_libcall--;
+ if (GET_CODE (p) == INSN)
{
- int tem1 = 0;
- int tem2 = 0;
- int move_insn = 0;
- rtx src = SET_SRC (set);
- rtx dependencies = 0;
-
- /* Figure out what to use as a source of this insn. If a REG_EQUIV
- note is given or if a REG_EQUAL note with a constant operand is
- specified, use it as the source and mark that we should move
- this insn by calling emit_move_insn rather that duplicating the
- insn.
-
- Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note
- is present. */
- temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
+ temp = find_reg_note (p, REG_LIBCALL, NULL_RTX);
if (temp)
- src = XEXP (temp, 0), move_insn = 1;
- else
+ in_libcall++;
+ if (! in_libcall
+ && (set = single_set (p))
+ && GET_CODE (SET_DEST (set)) == REG
+#ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+ && SET_DEST (set) != pic_offset_table_rtx
+#endif
+ && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
{
- temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
- if (temp && CONSTANT_P (XEXP (temp, 0)))
+ int tem1 = 0;
+ int tem2 = 0;
+ int move_insn = 0;
+ rtx src = SET_SRC (set);
+ rtx dependencies = 0;
+
+ /* Figure out what to use as a source of this insn. If a
+ REG_EQUIV note is given or if a REG_EQUAL note with a
+ constant operand is specified, use it as the source and
+ mark that we should move this insn by calling
+ emit_move_insn rather that duplicating the insn.
+
+ Otherwise, only use the REG_EQUAL contents if a REG_RETVAL
+ note is present. */
+ temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
+ if (temp)
src = XEXP (temp, 0), move_insn = 1;
- if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
- {
- src = XEXP (temp, 0);
- /* A libcall block can use regs that don't appear in
- the equivalent expression. To move the libcall,
- we must move those regs too. */
- dependencies = libcall_other_reg (p, src);
- }
- }
-
- /* For parallels, add any possible uses to the depencies, as we can't move
- the insn without resolving them first. */
- if (GET_CODE (PATTERN (p)) == PARALLEL)
- {
- for (i = 0; i < XVECLEN (PATTERN (p), 0); i++)
+ else
{
- rtx x = XVECEXP (PATTERN (p), 0, i);
- if (GET_CODE (x) == USE)
- dependencies = gen_rtx_EXPR_LIST (VOIDmode, XEXP (x, 0), dependencies);
+ temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
+ if (temp && CONSTANT_P (XEXP (temp, 0)))
+ src = XEXP (temp, 0), move_insn = 1;
+ if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
+ {
+ src = XEXP (temp, 0);
+ /* A libcall block can use regs that don't appear in
+ the equivalent expression. To move the libcall,
+ we must move those regs too. */
+ dependencies = libcall_other_reg (p, src);
+ }
}
- }
- /* Don't try to optimize a register that was made
- by loop-optimization for an inner loop.
- We don't know its life-span, so we can't compute the benefit. */
- if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
- ;
- else if (/* The register is used in basic blocks other
- than the one where it is set (meaning that
- something after this point in the loop might
- depend on its value before the set). */
- ! reg_in_basic_block_p (p, SET_DEST (set))
- /* And the set is not guaranteed to be executed once
- the loop starts, or the value before the set is
- needed before the set occurs...
-
- ??? Note we have quadratic behaviour here, mitigated
- by the fact that the previous test will often fail for
- large loops. Rather than re-scanning the entire loop
- each time for register usage, we should build tables
- of the register usage and use them here instead. */
- && (maybe_never
- || loop_reg_used_before_p (loop, set, p)))
- /* It is unsafe to move the set.
-
- This code used to consider it OK to move a set of a variable
- which was not created by the user and not used in an exit test.
- That behavior is incorrect and was removed. */
- ;
- else if ((tem = loop_invariant_p (loop, src))
- && (dependencies == 0
- || (tem2 = loop_invariant_p (loop, dependencies)) != 0)
- && (regs->array[REGNO (SET_DEST (set))].set_in_loop == 1
- || (tem1
- = consec_sets_invariant_p
- (loop, SET_DEST (set),
- regs->array[REGNO (SET_DEST (set))].set_in_loop,
- p)))
- /* If the insn can cause a trap (such as divide by zero),
- can't move it unless it's guaranteed to be executed
- once loop is entered. Even a function call might
- prevent the trap insn from being reached
- (since it might exit!) */
- && ! ((maybe_never || call_passed)
- && may_trap_p (src)))
- {
- struct movable *m;
- int regno = REGNO (SET_DEST (set));
-
- /* A potential lossage is where we have a case where two insns
- can be combined as long as they are both in the loop, but
- we move one of them outside the loop. For large loops,
- this can lose. The most common case of this is the address
- of a function being called.
-
- Therefore, if this register is marked as being used exactly
- once if we are in a loop with calls (a "large loop"), see if
- we can replace the usage of this register with the source
- of this SET. If we can, delete this insn.
-
- Don't do this if P has a REG_RETVAL note or if we have
- SMALL_REGISTER_CLASSES and SET_SRC is a hard register. */
-
- if (loop_info->has_call
- && regs->array[regno].single_usage != 0
- && regs->array[regno].single_usage != const0_rtx
- && REGNO_FIRST_UID (regno) == INSN_UID (p)
- && (REGNO_LAST_UID (regno)
- == INSN_UID (regs->array[regno].single_usage))
- && regs->array[regno].set_in_loop == 1
- && GET_CODE (SET_SRC (set)) != ASM_OPERANDS
- && ! side_effects_p (SET_SRC (set))
- && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
- && (! SMALL_REGISTER_CLASSES
- || (! (GET_CODE (SET_SRC (set)) == REG
- && REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER)))
- /* This test is not redundant; SET_SRC (set) might be
- a call-clobbered register and the life of REGNO
- might span a call. */
- && ! modified_between_p (SET_SRC (set), p,
- regs->array[regno].single_usage)
- && no_labels_between_p (p, regs->array[regno].single_usage)
- && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
- regs->array[regno].single_usage))
+ /* For parallels, add any possible uses to the depencies, as
+ we can't move the insn without resolving them first. */
+ if (GET_CODE (PATTERN (p)) == PARALLEL)
{
- /* Replace any usage in a REG_EQUAL note. Must copy the
- new source, so that we don't get rtx sharing between the
- SET_SOURCE and REG_NOTES of insn p. */
- REG_NOTES (regs->array[regno].single_usage)
- = replace_rtx (REG_NOTES (regs->array[regno].single_usage),
- SET_DEST (set), copy_rtx (SET_SRC (set)));
-
- delete_insn (p);
- for (i = 0; i < (int) LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
- regs->array[regno+i].set_in_loop = 0;
- continue;
+ for (i = 0; i < XVECLEN (PATTERN (p), 0); i++)
+ {
+ rtx x = XVECEXP (PATTERN (p), 0, i);
+ if (GET_CODE (x) == USE)
+ dependencies
+ = gen_rtx_EXPR_LIST (VOIDmode, XEXP (x, 0),
+ dependencies);
+ }
}
- m = (struct movable *) xmalloc (sizeof (struct movable));
- m->next = 0;
- m->insn = p;
- m->set_src = src;
- m->dependencies = dependencies;
- m->set_dest = SET_DEST (set);
- m->force = 0;
- m->consec = regs->array[REGNO (SET_DEST (set))].set_in_loop - 1;
- m->done = 0;
- m->forces = 0;
- m->partial = 0;
- m->move_insn = move_insn;
- m->move_insn_first = 0;
- m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
- m->savemode = VOIDmode;
- m->regno = regno;
- /* Set M->cond if either loop_invariant_p
- or consec_sets_invariant_p returned 2
- (only conditionally invariant). */
- m->cond = ((tem | tem1 | tem2) > 1);
- m->global = LOOP_REG_GLOBAL_P (loop, regno);
- m->match = 0;
- m->lifetime = LOOP_REG_LIFETIME (loop, regno);
- m->savings = regs->array[regno].n_times_set;
- if (find_reg_note (p, REG_RETVAL, NULL_RTX))
- m->savings += libcall_benefit (p);
- for (i = 0; i < (int) LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
- regs->array[regno+i].set_in_loop = move_insn ? -2 : -1;
- /* Add M to the end of the chain MOVABLES. */
- loop_movables_add (movables, m);
-
- if (m->consec > 0)
+ /* Don't try to optimize a register that was made
+ by loop-optimization for an inner loop.
+ We don't know its life-span, so we can't compute
+ the benefit. */
+ if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
+ ;
+ else if (/* The register is used in basic blocks other
+ than the one where it is set (meaning that
+ something after this point in the loop might
+ depend on its value before the set). */
+ ! reg_in_basic_block_p (p, SET_DEST (set))
+ /* And the set is not guaranteed to be executed once
+ the loop starts, or the value before the set is
+ needed before the set occurs...
+
+ ??? Note we have quadratic behavior here, mitigated
+ by the fact that the previous test will often fail for
+ large loops. Rather than re-scanning the entire loop
+ each time for register usage, we should build tables
+ of the register usage and use them here instead. */
+ && (maybe_never
+ || loop_reg_used_before_p (loop, set, p)))
+ /* It is unsafe to move the set.
+
+ This code used to consider it OK to move a set of a variable
+ which was not created by the user and not used in an exit
+ test.
+ That behavior is incorrect and was removed. */
+ ;
+ else if ((tem = loop_invariant_p (loop, src))
+ && (dependencies == 0
+ || (tem2
+ = loop_invariant_p (loop, dependencies)) != 0)
+ && (regs->array[REGNO (SET_DEST (set))].set_in_loop == 1
+ || (tem1
+ = consec_sets_invariant_p
+ (loop, SET_DEST (set),
+ regs->array[REGNO (SET_DEST (set))].set_in_loop,
+ p)))
+ /* If the insn can cause a trap (such as divide by zero),
+ can't move it unless it's guaranteed to be executed
+ once loop is entered. Even a function call might
+ prevent the trap insn from being reached
+ (since it might exit!) */
+ && ! ((maybe_never || call_passed)
+ && may_trap_p (src)))
{
- /* It is possible for the first instruction to have a
- REG_EQUAL note but a non-invariant SET_SRC, so we must
- remember the status of the first instruction in case
- the last instruction doesn't have a REG_EQUAL note. */
- m->move_insn_first = m->move_insn;
-
- /* Skip this insn, not checking REG_LIBCALL notes. */
- p = next_nonnote_insn (p);
- /* Skip the consecutive insns, if there are any. */
- p = skip_consec_insns (p, m->consec);
- /* Back up to the last insn of the consecutive group. */
- p = prev_nonnote_insn (p);
-
- /* We must now reset m->move_insn, m->is_equiv, and possibly
- m->set_src to correspond to the effects of all the
- insns. */
- temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
- if (temp)
- m->set_src = XEXP (temp, 0), m->move_insn = 1;
- else
+ struct movable *m;
+ int regno = REGNO (SET_DEST (set));
+
+ /* A potential lossage is where we have a case where two insns
+ can be combined as long as they are both in the loop, but
+ we move one of them outside the loop. For large loops,
+ this can lose. The most common case of this is the address
+ of a function being called.
+
+ Therefore, if this register is marked as being used
+ exactly once if we are in a loop with calls
+ (a "large loop"), see if we can replace the usage of
+ this register with the source of this SET. If we can,
+ delete this insn.
+
+ Don't do this if P has a REG_RETVAL note or if we have
+ SMALL_REGISTER_CLASSES and SET_SRC is a hard register. */
+
+ if (loop_info->has_call
+ && regs->array[regno].single_usage != 0
+ && regs->array[regno].single_usage != const0_rtx
+ && REGNO_FIRST_UID (regno) == INSN_UID (p)
+ && (REGNO_LAST_UID (regno)
+ == INSN_UID (regs->array[regno].single_usage))
+ && regs->array[regno].set_in_loop == 1
+ && GET_CODE (SET_SRC (set)) != ASM_OPERANDS
+ && ! side_effects_p (SET_SRC (set))
+ && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
+ && (! SMALL_REGISTER_CLASSES
+ || (! (GET_CODE (SET_SRC (set)) == REG
+ && (REGNO (SET_SRC (set))
+ < FIRST_PSEUDO_REGISTER))))
+ /* This test is not redundant; SET_SRC (set) might be
+ a call-clobbered register and the life of REGNO
+ might span a call. */
+ && ! modified_between_p (SET_SRC (set), p,
+ regs->array[regno].single_usage)
+ && no_labels_between_p (p,
+ regs->array[regno].single_usage)
+ && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
+ regs->array[regno].single_usage))
{
- temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
- if (temp && CONSTANT_P (XEXP (temp, 0)))
- m->set_src = XEXP (temp, 0), m->move_insn = 1;
- else
- m->move_insn = 0;
+ /* Replace any usage in a REG_EQUAL note. Must copy
+ the new source, so that we don't get rtx sharing
+ between the SET_SOURCE and REG_NOTES of insn p. */
+ REG_NOTES (regs->array[regno].single_usage)
+ = (replace_rtx
+ (REG_NOTES (regs->array[regno].single_usage),
+ SET_DEST (set), copy_rtx (SET_SRC (set))));
+ delete_insn (p);
+ for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set));
+ i++)
+ regs->array[regno+i].set_in_loop = 0;
+ continue;
}
- m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
- }
- }
- /* If this register is always set within a STRICT_LOW_PART
- or set to zero, then its high bytes are constant.
- So clear them outside the loop and within the loop
- just load the low bytes.
- We must check that the machine has an instruction to do so.
- Also, if the value loaded into the register
- depends on the same register, this cannot be done. */
- else if (SET_SRC (set) == const0_rtx
- && GET_CODE (NEXT_INSN (p)) == INSN
- && (set1 = single_set (NEXT_INSN (p)))
- && GET_CODE (set1) == SET
- && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
- && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
- && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
- == SET_DEST (set))
- && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
- {
- int regno = REGNO (SET_DEST (set));
- if (regs->array[regno].set_in_loop == 2)
- {
- struct movable *m;
+
m = (struct movable *) xmalloc (sizeof (struct movable));
m->next = 0;
m->insn = p;
+ m->set_src = src;
+ m->dependencies = dependencies;
m->set_dest = SET_DEST (set);
- m->dependencies = 0;
m->force = 0;
- m->consec = 0;
+ m->consec
+ = regs->array[REGNO (SET_DEST (set))].set_in_loop - 1;
m->done = 0;
m->forces = 0;
- m->move_insn = 0;
+ m->partial = 0;
+ m->move_insn = move_insn;
m->move_insn_first = 0;
- m->partial = 1;
- /* If the insn may not be executed on some cycles,
- we can't clear the whole reg; clear just high part.
- Not even if the reg is used only within this loop.
- Consider this:
- while (1)
- while (s != t) {
- if (foo ()) x = *s;
- use (x);
- }
- Clearing x before the inner loop could clobber a value
- being saved from the last time around the outer loop.
- However, if the reg is not used outside this loop
- and all uses of the register are in the same
- basic block as the store, there is no problem.
-
- If this insn was made by loop, we don't know its
- INSN_LUID and hence must make a conservative
- assumption. */
- m->global = (INSN_UID (p) >= max_uid_for_loop
- || LOOP_REG_GLOBAL_P (loop, regno)
- || (labels_in_range_p
- (p, REGNO_FIRST_LUID (regno))));
- if (maybe_never && m->global)
- m->savemode = GET_MODE (SET_SRC (set1));
- else
- m->savemode = VOIDmode;
+ m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
+ m->savemode = VOIDmode;
m->regno = regno;
- m->cond = 0;
+ /* Set M->cond if either loop_invariant_p
+ or consec_sets_invariant_p returned 2
+ (only conditionally invariant). */
+ m->cond = ((tem | tem1 | tem2) > 1);
+ m->global = LOOP_REG_GLOBAL_P (loop, regno);
m->match = 0;
m->lifetime = LOOP_REG_LIFETIME (loop, regno);
- m->savings = 1;
- for (i = 0; i < (int) LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
- regs->array[regno+i].set_in_loop = -1;
+ m->savings = regs->array[regno].n_times_set;
+ if (find_reg_note (p, REG_RETVAL, NULL_RTX))
+ m->savings += libcall_benefit (p);
+ for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
+ regs->array[regno+i].set_in_loop = move_insn ? -2 : -1;
/* Add M to the end of the chain MOVABLES. */
loop_movables_add (movables, m);
+
+ if (m->consec > 0)
+ {
+ /* It is possible for the first instruction to have a
+ REG_EQUAL note but a non-invariant SET_SRC, so we must
+ remember the status of the first instruction in case
+ the last instruction doesn't have a REG_EQUAL note. */
+ m->move_insn_first = m->move_insn;
+
+ /* Skip this insn, not checking REG_LIBCALL notes. */
+ p = next_nonnote_insn (p);
+ /* Skip the consecutive insns, if there are any. */
+ p = skip_consec_insns (p, m->consec);
+ /* Back up to the last insn of the consecutive group. */
+ p = prev_nonnote_insn (p);
+
+ /* We must now reset m->move_insn, m->is_equiv, and
+ possibly m->set_src to correspond to the effects of
+ all the insns. */
+ temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
+ if (temp)
+ m->set_src = XEXP (temp, 0), m->move_insn = 1;
+ else
+ {
+ temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
+ if (temp && CONSTANT_P (XEXP (temp, 0)))
+ m->set_src = XEXP (temp, 0), m->move_insn = 1;
+ else
+ m->move_insn = 0;
+
+ }
+ m->is_equiv
+ = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
+ }
+ }
+ /* If this register is always set within a STRICT_LOW_PART
+ or set to zero, then its high bytes are constant.
+ So clear them outside the loop and within the loop
+ just load the low bytes.
+ We must check that the machine has an instruction to do so.
+ Also, if the value loaded into the register
+ depends on the same register, this cannot be done. */
+ else if (SET_SRC (set) == const0_rtx
+ && GET_CODE (NEXT_INSN (p)) == INSN
+ && (set1 = single_set (NEXT_INSN (p)))
+ && GET_CODE (set1) == SET
+ && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
+ && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
+ && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
+ == SET_DEST (set))
+ && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
+ {
+ int regno = REGNO (SET_DEST (set));
+ if (regs->array[regno].set_in_loop == 2)
+ {
+ struct movable *m;
+ m = (struct movable *) xmalloc (sizeof (struct movable));
+ m->next = 0;
+ m->insn = p;
+ m->set_dest = SET_DEST (set);
+ m->dependencies = 0;
+ m->force = 0;
+ m->consec = 0;
+ m->done = 0;
+ m->forces = 0;
+ m->move_insn = 0;
+ m->move_insn_first = 0;
+ m->partial = 1;
+ /* If the insn may not be executed on some cycles,
+ we can't clear the whole reg; clear just high part.
+ Not even if the reg is used only within this loop.
+ Consider this:
+ while (1)
+ while (s != t) {
+ if (foo ()) x = *s;
+ use (x);
+ }
+ Clearing x before the inner loop could clobber a value
+ being saved from the last time around the outer loop.
+ However, if the reg is not used outside this loop
+ and all uses of the register are in the same
+ basic block as the store, there is no problem.
+
+ If this insn was made by loop, we don't know its
+ INSN_LUID and hence must make a conservative
+ assumption. */
+ m->global = (INSN_UID (p) >= max_uid_for_loop
+ || LOOP_REG_GLOBAL_P (loop, regno)
+ || (labels_in_range_p
+ (p, REGNO_FIRST_LUID (regno))));
+ if (maybe_never && m->global)
+ m->savemode = GET_MODE (SET_SRC (set1));
+ else
+ m->savemode = VOIDmode;
+ m->regno = regno;
+ m->cond = 0;
+ m->match = 0;
+ m->lifetime = LOOP_REG_LIFETIME (loop, regno);
+ m->savings = 1;
+ for (i = 0;
+ i < LOOP_REGNO_NREGS (regno, SET_DEST (set));
+ i++)
+ regs->array[regno+i].set_in_loop = -1;
+ /* Add M to the end of the chain MOVABLES. */
+ loop_movables_add (movables, m);
+ }
}
}
}
@@ -1905,10 +1918,10 @@ move_movables (loop, movables, threshold, insn_count)
for (count = m->consec; count >= 0; count--)
{
/* If this is the first insn of a library call sequence,
- skip to the end. */
+ something is very wrong. */
if (GET_CODE (p) != NOTE
&& (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
- p = XEXP (temp, 0);
+ abort ();
/* If this is the last insn of a libcall sequence, then
delete every insn in the sequence except the last.
@@ -2170,7 +2183,7 @@ move_movables (loop, movables, threshold, insn_count)
if (! m->partial)
{
int i;
- for (i = 0; i < (int) LOOP_REGNO_NREGS (regno, m->set_dest); i++)
+ for (i = 0; i < LOOP_REGNO_NREGS (regno, m->set_dest); i++)
regs->array[regno+i].set_in_loop = 0;
}
@@ -2235,7 +2248,7 @@ move_movables (loop, movables, threshold, insn_count)
{
int i;
for (i = 0;
- i < (int) LOOP_REGNO_NREGS (regno, m1->set_dest);
+ i < LOOP_REGNO_NREGS (regno, m1->set_dest);
i++)
regs->array[m1->regno+i].set_in_loop = 0;
}
@@ -2452,7 +2465,8 @@ prescan_loop (loop)
loop_info->first_loop_store_insn = NULL_RTX;
loop_info->mems_idx = 0;
loop_info->num_mem_sets = 0;
-
+ /* If loop opts run twice, this was set on 1st pass for 2nd. */
+ loop_info->preconditioned = NOTE_PRECONDITIONED (end);
for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
insn = PREV_INSN (insn))
@@ -3495,7 +3509,7 @@ count_one_set (regs, insn, x, last_set)
{
int i;
int regno = REGNO (dest);
- for (i = 0; i < (int) LOOP_REGNO_NREGS (regno, dest); i++)
+ for (i = 0; i < LOOP_REGNO_NREGS (regno, dest); i++)
{
/* If this is the first setting of this reg
in current basic block, and it was set before,
@@ -3560,7 +3574,7 @@ struct prefetch_info
HOST_WIDE_INT index;
HOST_WIDE_INT stride; /* Prefetch stride in bytes in each
iteration. */
- unsigned int bytes_accessed; /* Sum of sizes of all acceses to this
+ unsigned int bytes_accessed; /* Sum of sizes of all accesses to this
prefetch area in one iteration. */
unsigned int total_bytes; /* Total bytes loop will access in this block.
This is set only for loops with known
@@ -4199,7 +4213,7 @@ emit_prefetch_instructions (loop)
static rtx note_insn;
-/* Dummy register to have non-zero DEST_REG for DEST_ADDR type givs. */
+/* Dummy register to have nonzero DEST_REG for DEST_ADDR type givs. */
static rtx addr_placeholder;
@@ -4256,7 +4270,7 @@ for_each_insn_in_loop (loop, fncall)
if (prev_nonnote_insn (loop->scan_start) != prev_nonnote_insn (loop->start))
maybe_multiple = back_branch_in_range_p (loop, loop->scan_start);
- /* Scan through loop and update NOT_EVERY_ITERATION and MAYBE_MULTIPLE. */
+ /* Scan through loop and update NOT_EVERY_ITERATION and MAYBE_MULTIPLE. */
for (p = next_insn_in_loop (loop, loop->scan_start);
p != NULL_RTX;
p = next_insn_in_loop (loop, p))
@@ -4427,7 +4441,7 @@ loop_bivs_find (loop)
}
-/* Determine how BIVS are initialised by looking through pre-header
+/* Determine how BIVS are initialized by looking through pre-header
extended basic block. */
static void
loop_bivs_init_find (loop)
@@ -4571,7 +4585,7 @@ loop_givs_check (loop)
}
-/* Return non-zero if it is possible to eliminate the biv BL provided
+/* Return nonzero if it is possible to eliminate the biv BL provided
all givs are reduced. This is possible if either the reg is not
used outside the loop, or we can compute what its final value will
be. */
@@ -4731,7 +4745,7 @@ loop_givs_reduce (loop, bl)
rtx insert_before;
if (! auto_inc_opt)
- insert_before = tv->insn;
+ insert_before = NEXT_INSN (tv->insn);
else if (auto_inc_opt == 1)
insert_before = NEXT_INSN (v->insn);
else
@@ -5066,7 +5080,7 @@ strength_reduce (loop, flags)
return;
}
- /* Determine how BIVS are initialised by looking through pre-header
+ /* Determine how BIVS are initialized by looking through pre-header
extended basic block. */
loop_bivs_init_find (loop);
@@ -5325,7 +5339,7 @@ strength_reduce (loop, flags)
unsigned HOST_WIDE_INT n
= loop_info->n_iterations / loop_info->unroll_number;
if (n > 1)
- predict_insn (PREV_INSN (loop->end), PRED_LOOP_ITERATIONS,
+ predict_insn (prev_nonnote_insn (loop->end), PRED_LOOP_ITERATIONS,
REG_BR_PROB_BASE - REG_BR_PROB_BASE / n);
}
@@ -5914,12 +5928,8 @@ check_final_value (loop, v)
const struct loop *loop;
struct induction *v;
{
- struct loop_ivs *ivs = LOOP_IVS (loop);
- struct iv_class *bl;
rtx final_value = 0;
- bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
-
/* DEST_ADDR givs will never reach here, because they are always marked
replaceable above in record_giv. */
@@ -6475,7 +6485,7 @@ general_induction_var (loop, x, src_reg, add_val, mult_val, ext_val,
expression that is neither invariant nor a biv or giv), this routine
returns 0.
- For a non-zero return, the result will have a code of CONST_INT, USE,
+ For a nonzero return, the result will have a code of CONST_INT, USE,
REG (for a BIV), PLUS, or MULT. No other codes will occur.
*BENEFIT will be incremented by the benefit of any sub-giv encountered. */
@@ -6828,7 +6838,7 @@ simplify_giv_expr (loop, x, ext_val, benefit)
return simplify_giv_expr (loop, m->match->set_dest,
ext_val, benefit);
- /* If consec is non-zero, this is a member of a group of
+ /* If consec is nonzero, this is a member of a group of
instructions that were moved together. We handle this
case only to the point of seeking to the last insn and
looking for a REG_EQUAL. Fail if we don't find one. */
@@ -8563,7 +8573,7 @@ check_dbra_loop (loop, insn_count)
/* Verify whether the biv BL appears to be eliminable,
based on the insns in the loop that refer to it.
- If ELIMINATE_P is non-zero, actually do the elimination.
+ If ELIMINATE_P is nonzero, actually do the elimination.
THRESHOLD and INSN_COUNT are from loop_optimize and are used to
determine whether invariant insns should be placed inside or at the
@@ -8635,7 +8645,7 @@ maybe_eliminate_biv (loop, bl, eliminate_p, threshold, insn_count)
}
/* INSN and REFERENCE are instructions in the same insn chain.
- Return non-zero if INSN is first. */
+ Return nonzero if INSN is first. */
int
loop_insn_first_p (insn, reference)
@@ -8668,7 +8678,7 @@ loop_insn_first_p (insn, reference)
}
}
-/* We are trying to eliminate BIV in INSN using GIV. Return non-zero if
+/* We are trying to eliminate BIV in INSN using GIV. Return nonzero if
the offset that we have to take into account due to auto-increment /
div derivation is zero. */
static int
@@ -8695,10 +8705,10 @@ biv_elimination_giv_has_0_offset (biv, giv, insn)
If BIV does not appear in X, return 1.
- If ELIMINATE_P is non-zero, actually do the elimination.
+ If ELIMINATE_P is nonzero, actually do the elimination.
WHERE_INSN/WHERE_BB indicate where extra insns should be added.
Depending on how many items have been moved out of the loop, it
- will either be before INSN (when WHERE_INSN is non-zero) or at the
+ will either be before INSN (when WHERE_INSN is nonzero) or at the
start of the loop (when WHERE_INSN is zero). */
static int
@@ -9168,14 +9178,14 @@ update_reg_last_use (x, insn)
If the condition cannot be understood, or is an inequality floating-point
comparison which needs to be reversed, 0 will be returned.
- If REVERSE is non-zero, then reverse the condition prior to canonizing it.
+ If REVERSE is nonzero, then reverse the condition prior to canonizing it.
- If EARLIEST is non-zero, it is a pointer to a place where the earliest
+ If EARLIEST is nonzero, it is a pointer to a place where the earliest
insn used in locating the condition was found. If a replacement test
of the condition is desired, it should be placed in front of that
insn and we will be sure that the inputs are still valid.
- If WANT_REG is non-zero, we wish the condition to be relative to that
+ If WANT_REG is nonzero, we wish the condition to be relative to that
register, if possible. Therefore, do not canonicalize the condition
further. */
@@ -9217,7 +9227,7 @@ canonicalize_condition (insn, cond, reverse, earliest, want_reg)
&& op1 == CONST0_RTX (GET_MODE (op0))
&& op0 != want_reg)
{
- /* Set non-zero when we find something of interest. */
+ /* Set nonzero when we find something of interest. */
rtx x = 0;
#ifdef HAVE_cc0
@@ -9269,6 +9279,9 @@ canonicalize_condition (insn, cond, reverse, earliest, want_reg)
if (set)
{
enum machine_mode inner_mode = GET_MODE (SET_DEST (set));
+#ifdef FLOAT_STORE_FLAG_VALUE
+ REAL_VALUE_TYPE fsfv;
+#endif
/* ??? We may not combine comparisons done in a CCmode with
comparisons not done in a CCmode. This is to aid targets
@@ -9296,8 +9309,8 @@ canonicalize_condition (insn, cond, reverse, earliest, want_reg)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == LT
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
- && (REAL_VALUE_NEGATIVE
- (FLOAT_STORE_FLAG_VALUE (inner_mode))))
+ && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
+ REAL_VALUE_NEGATIVE (fsfv)))
#endif
))
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
@@ -9316,8 +9329,8 @@ canonicalize_condition (insn, cond, reverse, earliest, want_reg)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == GE
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
- && (REAL_VALUE_NEGATIVE
- (FLOAT_STORE_FLAG_VALUE (inner_mode))))
+ && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
+ REAL_VALUE_NEGATIVE (fsfv)))
#endif
))
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
@@ -9422,7 +9435,7 @@ canonicalize_condition (insn, cond, reverse, earliest, want_reg)
inequality floating-point comparison which needs to be reversed, 0 will
be returned.
- If EARLIEST is non-zero, it is a pointer to a place where the earliest
+ If EARLIEST is nonzero, it is a pointer to a place where the earliest
insn used in locating the condition was found. If a replacement test
of the condition is desired, it should be placed in front of that
insn and we will be sure that the inputs are still valid. */
@@ -9649,6 +9662,25 @@ loop_regs_scan (loop, extra_size)
if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
memset (last_set, 0, regs->num * sizeof (rtx));
+
+ /* Invalidate all registers used for function argument passing.
+ We check rtx_varies_p for the same reason as below, to allow
+ optimizing PIC calculations. */
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+ rtx link;
+ for (link = CALL_INSN_FUNCTION_USAGE (insn);
+ link;
+ link = XEXP (link, 1))
+ {
+ rtx op, reg;
+
+ if (GET_CODE (op = XEXP (link, 0)) == USE
+ && GET_CODE (reg = XEXP (op, 0)) == REG
+ && rtx_varies_p (reg, 1))
+ regs->array[REGNO (reg)].may_not_optimize = 1;
+ }
+ }
}
/* Invalidate all hard registers clobbered by calls. With one exception:
@@ -10422,7 +10454,7 @@ loop_insn_emit_after (loop, where_bb, where_insn, pattern)
}
-/* If WHERE_INSN is non-zero emit insn for PATTERN before WHERE_INSN
+/* If WHERE_INSN is nonzero emit insn for PATTERN before WHERE_INSN
in basic block WHERE_BB (ignored in the interim) within the loop
otherwise hoist PATTERN into the loop pre-header. */
diff --git a/gcc/loop.h b/gcc/loop.h
index 13b629311d4..d5fe0436dad 100644
--- a/gcc/loop.h
+++ b/gcc/loop.h
@@ -145,7 +145,7 @@ struct induction
same biv register. */
struct induction *same; /* If this giv has been combined with another
giv, this points to the base giv. The base
- giv will have COMBINED_WITH non-zero. */
+ giv will have COMBINED_WITH nonzero. */
HOST_WIDE_INT const_adjust; /* Used by loop unrolling, when an address giv
is split, and a constant is eliminated from
the address, the -constant is stored here
@@ -377,7 +377,7 @@ struct loop_info
struct loop_regs regs;
/* The induction variable information in loop. */
struct loop_ivs ivs;
- /* Non-zero if call is in pre_header extended basic block. */
+ /* Nonzero if call is in pre_header extended basic block. */
int pre_header_has_call;
};
diff --git a/gcc/machmode.def b/gcc/machmode.def
index fe4b96eca20..6cb912c4536 100644
--- a/gcc/machmode.def
+++ b/gcc/machmode.def
@@ -113,11 +113,10 @@ DEF_MACHMODE (CTImode, "CTI", MODE_COMPLEX_INT, BITS_PER_UNIT*32, 32, 16, COImod
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
- scalar modes. */
/* 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 (V1DImode, "V1DI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 8, V2QImode, DImode)
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)
@@ -135,13 +134,16 @@ DEF_MACHMODE (V8DImode, "V8DI", MODE_VECTOR_INT, BITS_PER_UNIT*64, 64, 8, VOIDmo
DEF_MACHMODE (V16QImode, "V16QI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 1, V8HImode, QImode)
+DEF_MACHMODE (V2HFmode, "V2HF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*4, 4, 2, V4HFmode, HFmode)
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 (V4HFmode, "V4HF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8, 8, 2, V2SFmode, HFmode)
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, SFmode)
+DEF_MACHMODE (V8HFmode, "V8HF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 2, V4SFmode, HFmode)
+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)
diff --git a/gcc/mklibgcc.in b/gcc/mklibgcc.in
index 12f54460a6f..f99954c51de 100644
--- a/gcc/mklibgcc.in
+++ b/gcc/mklibgcc.in
@@ -32,7 +32,7 @@
# SHLIB_MAPFILES
# SHLIB_NM_FLAGS
# SHLIB_INSTALL
-# SHLIB_SLIBDIR_SUFFIXES
+# MULTILIB_OSDIRNAMES
# Make needs VPATH to be literal.
echo 'srcdir = @srcdir@'
@@ -286,7 +286,7 @@ for ml in $MULTILIBS; 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 -'
+ 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
@@ -317,22 +317,18 @@ for ml in $MULTILIBS; do
fi
shlib_so_name="$shlib_base_name"
shlib_dir=
- if [ -n "$SHLIB_SLIBDIR_SUFFIXES" ]; then
+ if [ -n "$MULTILIB_OSDIRNAMES" ]; then
if [ "$dir" != . ]; then
+ gcc_multilib_dir=`./xgcc -B./ $flags --print-multi-directory`
+ os_multilib_dir=`./xgcc -B./ $flags --print-multi-os-directory`
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
+ gcc_multilib_sup=`echo $gcc_multilib_dir | sed 's~^[^/]*/~~'`
+ os_multilib_base=`echo $os_multilib_dir | sed -n "s~/${gcc_multilib_sup}\$~~p"`
+ if [ -z "$os_multilib_base" ]; then
+ shlib_so_name=libgcc_s
+ else
+ shlib_so_name=libgcc_s_`echo $gcc_multilib_sup | sed s,/,_,g`
+ fi
fi
fi
echo ""
@@ -438,6 +434,7 @@ echo ""
echo "install: $all"
for ml in $MULTILIBS; do
dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
+ flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
if [ $dir != . ]; then
ldir='$(libsubdir)'/$dir
echo " if [ -d $ldir ]; then true; else mkdir $ldir; chmod a+rx $ldir; fi;"
@@ -460,39 +457,22 @@ for ml in $MULTILIBS; do
shlib_so_name="$shlib_base_name"
shlib_dir=
shlib_slibdir_qual=
- if [ -n "$SHLIB_SLIBDIR_SUFFIXES" ]; then
- shlib_slibdir_qual=none
+ if [ -n "$MULTILIB_OSDIRNAMES" ]; then
+ gcc_multilib_dir=`./xgcc -B./ $flags --print-multi-directory`
+ os_multilib_dir=`./xgcc -B./ $flags --print-multi-os-directory`
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
+ gcc_multilib_sup=`echo $gcc_multilib_dir | sed 's~^[^/]*/~~'`
+ os_multilib_base=`echo $os_multilib_dir | sed -n "s~/${gcc_multilib_sup}\$~~p"`
+ if [ -z "$os_multilib_base" ]; then
+ shlib_so_name=libgcc_s
+ if [ "$os_multilib_dir" != "." ]; then
+ shlib_slibdir_qual="/$os_multilib_dir"
+ fi
+ else
+ shlib_so_name=libgcc_s_`echo $gcc_multilib_sup | sed s,/,_,g`
+ shlib_slibdir_qual="/$os_multilib_base"
fi
fi
echo " $SHLIB_INSTALL" \
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index e1c630d6be6..3b5b75c7e7a 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -587,10 +587,24 @@ lookup_protocol_in_reflist (rproto_list, lproto)
return 0;
}
-/* Return 1 if LHS and RHS are compatible types for assignment
- or various other operations. Return 0 if they are incompatible,
- and return -1 if we choose to not decide. When the operation
- is REFLEXIVE, check for compatibility in either direction. */
+/* Return 1 if LHS and RHS are compatible types for assignment or
+ various other operations. Return 0 if they are incompatible, and
+ return -1 if we choose to not decide (because the types are really
+ just C types, not ObjC specific ones). When the operation is
+ REFLEXIVE (typically comparisons), check for compatibility in
+ either direction; when it's not (typically assignments), don't.
+
+ This function is called in two cases: when both lhs and rhs are
+ pointers to records (in which case we check protocols too), and
+ when both lhs and rhs are records (in which case we check class
+ inheritance only).
+
+ Warnings about classes/protocols not implementing a protocol are
+ emitted here (multiple of those warnings might be emitted for a
+ single line!); generic warnings about incompatible assignments and
+ lacks of casts in comparisons are/must be emitted by the caller if
+ we return 0.
+*/
int
objc_comptypes (lhs, rhs, reflexive)
@@ -600,6 +614,8 @@ objc_comptypes (lhs, rhs, reflexive)
{
/* New clause for protocols. */
+ /* Here we manage the case of a POINTER_TYPE = POINTER_TYPE. We only
+ manage the ObjC ones, and leave the rest to the C code. */
if (TREE_CODE (lhs) == POINTER_TYPE
&& TREE_CODE (TREE_TYPE (lhs)) == RECORD_TYPE
&& TREE_CODE (rhs) == POINTER_TYPE
@@ -614,29 +630,75 @@ objc_comptypes (lhs, rhs, reflexive)
tree rproto, rproto_list;
tree p;
+ /* <Protocol> = <Protocol> */
if (rhs_is_proto)
{
rproto_list = TYPE_PROTOCOL_LIST (rhs);
-
- /* Make sure the protocol is supported by the object
- on the rhs. */
- for (lproto = lproto_list; lproto; lproto = TREE_CHAIN (lproto))
+
+ if (!reflexive)
{
- p = TREE_VALUE (lproto);
- rproto = lookup_protocol_in_reflist (rproto_list, p);
+ /* An assignment between objects of type 'id
+ <Protocol>'; make sure the protocol on the lhs is
+ supported by the object on the rhs. */
+ for (lproto = lproto_list; lproto;
+ lproto = TREE_CHAIN (lproto))
+ {
+ p = TREE_VALUE (lproto);
+ rproto = lookup_protocol_in_reflist (rproto_list, p);
- if (!rproto)
- warning ("object does not conform to the `%s' protocol",
- IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
+ if (!rproto)
+ warning
+ ("object does not conform to the `%s' protocol",
+ IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
+ }
+ return 1;
+ }
+ else
+ {
+ /* Obscure case - a comparison between two objects
+ of type 'id <Protocol>'. Check that either the
+ protocol on the lhs is supported by the object on
+ the rhs, or viceversa. */
+
+ /* Check if the protocol on the lhs is supported by the
+ object on the rhs. */
+ for (lproto = lproto_list; lproto;
+ lproto = TREE_CHAIN (lproto))
+ {
+ p = TREE_VALUE (lproto);
+ rproto = lookup_protocol_in_reflist (rproto_list, p);
+
+ if (!rproto)
+ {
+ /* Check failed - check if the protocol on the rhs
+ is supported by the object on the lhs. */
+ for (rproto = rproto_list; rproto;
+ rproto = TREE_CHAIN (rproto))
+ {
+ p = TREE_VALUE (rproto);
+ lproto = lookup_protocol_in_reflist (lproto_list,
+ p);
+
+ if (!lproto)
+ {
+ /* This check failed too: incompatible */
+ return 0;
+ }
+ }
+ return 1;
+ }
+ }
+ return 1;
}
}
+ /* <Protocol> = <class> * */
else if (TYPED_OBJECT (TREE_TYPE (rhs)))
{
tree rname = TYPE_NAME (TREE_TYPE (rhs));
tree rinter;
- /* Make sure the protocol is supported by the object
- on the rhs. */
+ /* Make sure the protocol is supported by the object on
+ the rhs. */
for (lproto = lproto_list; lproto; lproto = TREE_CHAIN (lproto))
{
p = TREE_VALUE (lproto);
@@ -648,13 +710,16 @@ objc_comptypes (lhs, rhs, reflexive)
tree cat;
rproto_list = CLASS_PROTOCOL_LIST (rinter);
- /* If the underlying ObjC class does not have
- protocols attached to it, perhaps there are
- "one-off" protocols attached to the rhs?
- E.g., 'id<MyProt> foo;'. */
- if (!rproto_list)
- rproto_list = TYPE_PROTOCOL_LIST (TREE_TYPE (rhs));
rproto = lookup_protocol_in_reflist (rproto_list, p);
+ /* If the underlying ObjC class does not have
+ the protocol we're looking for, check for "one-off"
+ protocols (e.g., `NSObject<MyProt> *foo;') attached
+ to the rhs. */
+ if (!rproto)
+ {
+ rproto_list = TYPE_PROTOCOL_LIST (TREE_TYPE (rhs));
+ rproto = lookup_protocol_in_reflist (rproto_list, p);
+ }
/* Check for protocols adopted by categories. */
cat = CLASS_CATEGORY_LIST (rinter);
@@ -662,7 +727,6 @@ objc_comptypes (lhs, rhs, reflexive)
{
rproto_list = CLASS_PROTOCOL_LIST (cat);
rproto = lookup_protocol_in_reflist (rproto_list, p);
-
cat = CLASS_CATEGORY_LIST (cat);
}
@@ -671,31 +735,127 @@ objc_comptypes (lhs, rhs, reflexive)
if (!rproto)
warning ("class `%s' does not implement the `%s' protocol",
- IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (rhs))),
- IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
+ IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (rhs))),
+ IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
}
+ return 1;
}
-
- /* May change...based on whether there was any mismatch */
- return 1;
+ /* <Protocol> = id */
+ else if (TYPE_NAME (TREE_TYPE (rhs)) == objc_object_id)
+ {
+ return 1;
+ }
+ /* <Protocol> = Class */
+ else if (TYPE_NAME (TREE_TYPE (rhs)) == objc_class_id)
+ {
+ return 0;
+ }
+ /* <Protocol> = ?? : let comptypes decide. */
+ return -1;
}
else if (rhs_is_proto)
- /* Lhs is not a protocol...warn if it is statically typed */
- return (TYPED_OBJECT (TREE_TYPE (lhs)) != 0);
+ {
+ /* <class> * = <Protocol> */
+ if (TYPED_OBJECT (TREE_TYPE (lhs)))
+ {
+ if (reflexive)
+ {
+ tree rname = TYPE_NAME (TREE_TYPE (lhs));
+ tree rinter;
+ tree rproto, rproto_list = TYPE_PROTOCOL_LIST (rhs);
+
+ /* Make sure the protocol is supported by the object on
+ the lhs. */
+ for (rproto = rproto_list; rproto;
+ rproto = TREE_CHAIN (rproto))
+ {
+ tree p = TREE_VALUE (rproto);
+ tree lproto = 0;
+ rinter = lookup_interface (rname);
+ while (rinter && !lproto)
+ {
+ tree cat;
+
+ tree lproto_list = CLASS_PROTOCOL_LIST (rinter);
+ lproto = lookup_protocol_in_reflist (lproto_list, p);
+ /* If the underlying ObjC class does not
+ have the protocol we're looking for,
+ check for "one-off" protocols (e.g.,
+ `NSObject<MyProt> *foo;') attached to the
+ lhs. */
+ if (!lproto)
+ {
+ lproto_list = TYPE_PROTOCOL_LIST
+ (TREE_TYPE (lhs));
+ lproto = lookup_protocol_in_reflist
+ (lproto_list, p);
+ }
+
+ /* Check for protocols adopted by categories. */
+ cat = CLASS_CATEGORY_LIST (rinter);
+ while (cat && !lproto)
+ {
+ lproto_list = CLASS_PROTOCOL_LIST (cat);
+ lproto = lookup_protocol_in_reflist (lproto_list,
+ p);
+ cat = CLASS_CATEGORY_LIST (cat);
+ }
+
+ rinter = lookup_interface (CLASS_SUPER_NAME
+ (rinter));
+ }
+
+ if (!lproto)
+ warning ("class `%s' does not implement the `%s' protocol",
+ IDENTIFIER_POINTER (TYPE_NAME
+ (TREE_TYPE (lhs))),
+ IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
+ }
+ return 1;
+ }
+ else
+ return 0;
+ }
+ /* id = <Protocol> */
+ else if (TYPE_NAME (TREE_TYPE (lhs)) == objc_object_id)
+ {
+ return 1;
+ }
+ /* Class = <Protocol> */
+ else if (TYPE_NAME (TREE_TYPE (lhs)) == objc_class_id)
+ {
+ return 0;
+ }
+ /* ??? = <Protocol> : let comptypes decide */
+ else
+ {
+ return -1;
+ }
+ }
else
- /* Defer to comptypes. */
- return -1;
+ {
+ /* Attention: we shouldn't defer to comptypes here. One bad
+ side effect would be that we might loose the REFLEXIVE
+ information.
+ */
+ lhs = TREE_TYPE (lhs);
+ rhs = TREE_TYPE (rhs);
+ }
}
- else if (TREE_CODE (lhs) == RECORD_TYPE && TREE_CODE (rhs) == RECORD_TYPE)
- ; /* Fall thru. This is the case we have been handling all along */
- else
- /* Defer to comptypes. */
- return -1;
-
- /* `id' = `<class> *', `<class> *' = `id' */
+ if (TREE_CODE (lhs) != RECORD_TYPE || TREE_CODE (rhs) != RECORD_TYPE)
+ {
+ /* Nothing to do with ObjC - let immediately comptypes take
+ responsibility for checking. */
+ return -1;
+ }
+ /* `id' = `<class> *' `<class> *' = `id': always allow it.
+ Please note that
+ 'Object *o = [[Object alloc] init]; falls
+ in the case <class> * = `id'.
+ */
if ((TYPE_NAME (lhs) == objc_object_id && TYPED_OBJECT (rhs))
|| (TYPE_NAME (rhs) == objc_object_id && TYPED_OBJECT (lhs)))
return 1;
@@ -736,7 +896,7 @@ objc_comptypes (lhs, rhs, reflexive)
return 0;
}
else
- /* Defer to comptypes. */
+ /* Not an ObjC type - let comptypes do the check. */
return -1;
}
@@ -1679,7 +1839,7 @@ get_objc_string_decl (ident, section)
else
abort ();
- for (; chain != 0; chain = TREE_VALUE (chain))
+ for (; chain != 0; chain = TREE_CHAIN (chain))
if (TREE_VALUE (chain) == ident)
return (TREE_PURPOSE (chain));
@@ -1978,8 +2138,8 @@ get_proto_encoding (proto)
identifier_node that represent the selector. */
static tree
-build_typed_selector_reference (ident, proto)
- tree ident, proto;
+build_typed_selector_reference (ident, prototype)
+ tree ident, prototype;
{
tree *chain = &sel_ref_chain;
tree expr;
@@ -1987,14 +2147,14 @@ build_typed_selector_reference (ident, proto)
while (*chain)
{
- if (TREE_PURPOSE (*chain) == ident && TREE_VALUE (*chain) == proto)
+ if (TREE_PURPOSE (*chain) == prototype && TREE_VALUE (*chain) == ident)
goto return_at_index;
index++;
chain = &TREE_CHAIN (*chain);
}
- *chain = tree_cons (proto, ident, NULL_TREE);
+ *chain = tree_cons (prototype, ident, NULL_TREE);
return_at_index:
expr = build_unary_op (ADDR_EXPR,
@@ -2262,6 +2422,17 @@ is_class_name (ident)
}
tree
+objc_is_id (ident)
+ tree ident;
+{
+ /* NB: This function may be called before the ObjC front-end
+ has been initialized, in which case ID_TYPE will be NULL. */
+ return (id_type && ident && TYPE_P (ident) && IS_ID (ident))
+ ? id_type
+ : NULL_TREE;
+}
+
+tree
lookup_interface (ident)
tree ident;
{
@@ -2867,6 +3038,43 @@ generate_protocol_references (plist)
}
}
+/* For each protocol which was referenced either from a @protocol()
+ expression, or because a class/category implements it (then a
+ pointer to the protocol is stored in the struct describing the
+ class/category), we create a statically allocated instance of the
+ Protocol class. The code is written in such a way as to generate
+ as few Protocol objects as possible; we generate a unique Protocol
+ instance for each protocol, and we don't generate a Protocol
+ instance if the protocol is never referenced (either from a
+ @protocol() or from a class/category implementation). These
+ statically allocated objects can be referred to via the static
+ (that is, private to this module) symbols _OBJC_PROTOCOL_n.
+
+ The statically allocated Protocol objects that we generate here
+ need to be fixed up at runtime in order to be used: the 'isa'
+ pointer of the objects need to be set up to point to the 'Protocol'
+ class, as known at runtime.
+
+ The NeXT runtime fixes up all protocols at program startup time,
+ before main() is entered. It uses a low-level trick to look up all
+ those symbols, then loops on them and fixes them up.
+
+ The GNU runtime as well fixes up all protocols before user code
+ from the module is executed; it requires pointers to those symbols
+ to be put in the objc_symtab (which is then passed as argument to
+ the function __objc_exec_class() which the compiler sets up to be
+ executed automatically when the module is loaded); setup of those
+ Protocol objects happen in two ways in the GNU runtime: all
+ Protocol objects referred to by a class or category implementation
+ are fixed up when the class/category is loaded; all Protocol
+ objects referred to by a @protocol() expression are added by the
+ compiler to the list of statically allocated instances to fixup
+ (the same list holding the statically allocated constant string
+ objects). Because, as explained above, the compiler generates as
+ few Protocol objects as possible, some Protocol object might end up
+ being referenced multiple times when compiled with the GNU runtime,
+ and end up being fixed up multiple times at runtime inizialization.
+ But that doesn't hurt, it's just a little inefficient. */
static void
generate_protocols ()
{
@@ -5081,6 +5289,8 @@ build_protocol_reference (p)
PROTOCOL_FORWARD_DECL (p) = decl;
}
+/* This function is called by the parser when (and only when) a
+ @protocol() expression is found, in order to compile it. */
tree
build_protocol_expr (protoname)
tree protoname;
@@ -5102,9 +5312,56 @@ build_protocol_expr (protoname)
TREE_TYPE (expr) = protocol_type;
+ /* The @protocol() expression is being compiled into a pointer to a
+ statically allocated instance of the Protocol class. To become
+ usable at runtime, the 'isa' pointer of the instance need to be
+ fixed up at runtime by the runtime library, to point to the
+ actual 'Protocol' class. */
+
+ /* For the GNU runtime, put the static Protocol instance in the list
+ of statically allocated instances, so that we make sure that its
+ 'isa' pointer is fixed up at runtime by the GNU runtime library
+ to point to the Protocol class (at runtime, when loading the
+ module, the GNU runtime library loops on the statically allocated
+ instances (as found in the defs field in objc_symtab) and fixups
+ all the 'isa' pointers of those objects). */
+ if (! flag_next_runtime)
+ {
+ /* This type is a struct containing the fields of a Protocol
+ object. (Cfr. protocol_type instead is the type of a pointer
+ to such a struct). */
+ tree protocol_struct_type = xref_tag
+ (RECORD_TYPE, get_identifier (PROTOCOL_OBJECT_CLASS_NAME));
+ tree *chain;
+
+ /* Look for the list of Protocol statically allocated instances
+ to fixup at runtime. Create a new list to hold Protocol
+ statically allocated instances, if the list is not found. At
+ present there is only another list, holding NSConstantString
+ static instances to be fixed up at runtime. */
+ for (chain = &objc_static_instances;
+ *chain && TREE_VALUE (*chain) != protocol_struct_type;
+ chain = &TREE_CHAIN (*chain));
+ if (!*chain)
+ {
+ *chain = tree_cons (NULL_TREE, protocol_struct_type, NULL_TREE);
+ add_objc_string (TYPE_NAME (protocol_struct_type),
+ class_names);
+ }
+
+ /* Add this statically allocated instance to the Protocol list. */
+ TREE_PURPOSE (*chain) = tree_cons (NULL_TREE,
+ PROTOCOL_FORWARD_DECL (p),
+ TREE_PURPOSE (*chain));
+ }
+
+
return expr;
}
+/* This function is called by the parser when a @selector() expression
+ is found, in order to compile it. It is only called by the parser
+ and only to compile a @selector(). */
tree
build_selector_expr (selnamelist)
tree selnamelist;
@@ -5120,6 +5377,32 @@ build_selector_expr (selnamelist)
else
abort ();
+ /* If we are required to check @selector() expressions as they
+ are found, check that the selector has been declared. */
+ if (warn_undeclared_selector)
+ {
+ /* Look the selector up in the list of all known class and
+ instance methods (up to this line) to check that the selector
+ exists. */
+ hash hsh;
+
+ /* First try with instance methods. */
+ hsh = hash_lookup (nst_method_hash_list, selname);
+
+ /* If not found, try with class methods. */
+ if (!hsh)
+ {
+ hsh = hash_lookup (cls_method_hash_list, selname);
+ }
+
+ /* If still not found, print out a warning. */
+ if (!hsh)
+ {
+ warning ("undeclared selector `%s'", IDENTIFIER_POINTER (selname));
+ }
+ }
+
+
if (flag_typed_selectors)
return build_typed_selector_reference (selname, 0);
else
@@ -5259,6 +5542,7 @@ lookup_method (mchain, method)
{
if (METHOD_SEL_NAME (mchain) == key)
return mchain;
+
mchain = TREE_CHAIN (mchain);
}
return NULL_TREE;
@@ -7042,9 +7326,13 @@ get_super_receiver ()
{
super_class = get_class_reference (super_name);
if (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL)
+ /* Cast the super class to 'id', since the user may not have
+ included <objc/objc-class.h>, leaving 'struct objc_class'
+ an incomplete type. */
super_class
- = build_component_ref (build_indirect_ref (super_class, "->"),
- get_identifier ("isa"));
+ = build_component_ref (build_indirect_ref
+ (build_c_cast (id_type, super_class), "->"),
+ get_identifier ("isa"));
}
else
{
@@ -7802,12 +8090,21 @@ gen_method_decl (method, buf)
/* Debug info. */
+
+/* Dump an @interface declaration of the supplied class CHAIN to the
+ supplied file FP. Used to implement the -gen-decls option (which
+ prints out an @interface declaration of all classes compiled in
+ this run); potentially useful for debugging the compiler too. */
static void
dump_interface (fp, chain)
FILE *fp;
tree chain;
{
- char *buf = (char *) xmalloc (256);
+ /* FIXME: A heap overflow here whenever a method (or ivar)
+ declaration is so long that it doesn't fit in the buffer. The
+ code and all the related functions should be rewritten to avoid
+ using fixed size buffers. */
+ char *buf = (char *) xmalloc (1024 * 10);
const char *my_name = IDENTIFIER_POINTER (CLASS_NAME (chain));
tree ivar_decls = CLASS_RAW_IVARS (chain);
tree nst_methods = CLASS_NST_METHODS (chain);
@@ -7815,14 +8112,26 @@ dump_interface (fp, chain)
fprintf (fp, "\n@interface %s", my_name);
+ /* CLASS_SUPER_NAME is used to store the superclass name for
+ classes, and the category name for categories. */
if (CLASS_SUPER_NAME (chain))
{
- const char *super_name = IDENTIFIER_POINTER (CLASS_SUPER_NAME (chain));
- fprintf (fp, " : %s\n", super_name);
+ const char *name = IDENTIFIER_POINTER (CLASS_SUPER_NAME (chain));
+
+ if (TREE_CODE (chain) == CATEGORY_IMPLEMENTATION_TYPE
+ || TREE_CODE (chain) == CATEGORY_INTERFACE_TYPE)
+ {
+ fprintf (fp, " (%s)\n", name);
+ }
+ else
+ {
+ fprintf (fp, " : %s\n", name);
+ }
}
else
fprintf (fp, "\n");
+ /* FIXME - the following doesn't seem to work at the moment. */
if (ivar_decls)
{
fprintf (fp, "{\n");
@@ -7846,7 +8155,8 @@ dump_interface (fp, chain)
fprintf (fp, "+ %s;\n", gen_method_decl (cls_methods, buf));
cls_methods = TREE_CHAIN (cls_methods);
}
- fprintf (fp, "\n@end");
+
+ fprintf (fp, "@end\n");
}
/* Demangle function for Objective-C */
@@ -7966,7 +8276,16 @@ finish_objc ()
UOBJC_CLASS_decl = impent->class_decl;
UOBJC_METACLASS_decl = impent->meta_decl;
-
+
+ /* Dump the @interface of each class as we compile it, if the
+ -gen-decls option is in use. TODO: Dump the classes in the
+ order they were found, rather than in reverse order as we
+ are doing now. */
+ if (flag_gen_declaration)
+ {
+ dump_interface (gen_declaration_file, objc_implementation_context);
+ }
+
if (TREE_CODE (objc_implementation_context) == CLASS_IMPLEMENTATION_TYPE)
{
/* all of the following reference the string pool... */
@@ -8017,12 +8336,6 @@ finish_objc ()
generate_strings ();
- if (flag_gen_declaration)
- {
- add_class (objc_implementation_context);
- dump_interface (gen_declaration_file, objc_implementation_context);
- }
-
if (warn_selector)
{
int slot;
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 3f17034f0d5..ec03c1908d8 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -779,34 +779,24 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
}
/* In case the insn wants input operands in modes different from
- the result, convert the operands. It would seem that we
- don't need to convert CONST_INTs, but we do, so that they're
- a properly sign-extended for their modes; we choose the
- widest mode between mode and mode[01], so that, in a widening
- operation, we call convert_modes with different FROM and TO
- modes, which ensures the value is sign-extended. Shift
- operations are an exception, because the second operand needs
- not be extended to the mode of the result. */
-
- if (GET_MODE (op0) != mode0
- && mode0 != VOIDmode)
+ those of the actual operands, convert the operands. It would
+ seem that we don't need to convert CONST_INTs, but we do, so
+ that they're properly zero-extended or sign-extended for their
+ modes; shift operations are an exception, because the second
+ operand need not be extended to the mode of the result. */
+
+ if (GET_MODE (op0) != mode0 && mode0 != VOIDmode)
xop0 = convert_modes (mode0,
GET_MODE (op0) != VOIDmode
? GET_MODE (op0)
- : GET_MODE_SIZE (mode) > GET_MODE_SIZE (mode0)
- ? mode
- : mode0,
+ : mode,
xop0, unsignedp);
- if (GET_MODE (xop1) != mode1
- && mode1 != VOIDmode)
+ if (GET_MODE (op1) != mode1 && mode1 != VOIDmode)
xop1 = convert_modes (mode1,
GET_MODE (op1) != VOIDmode
? GET_MODE (op1)
- : (GET_MODE_SIZE (mode) > GET_MODE_SIZE (mode1)
- && ! shift_op)
- ? mode
- : mode1,
+ : (shift_op ? mode1 : mode),
xop1, unsignedp);
/* Now, if insn's predicates don't allow our operands, put them into
@@ -2241,13 +2231,25 @@ expand_twoval_binop (binoptab, op0, op1, targ0, targ1, unsignedp)
rtx pat;
rtx xop0 = op0, xop1 = op1;
- /* In case this insn wants input operands in modes different from the
- result, convert the operands. */
- if (GET_MODE (op0) != VOIDmode && GET_MODE (op0) != mode0)
- xop0 = convert_to_mode (mode0, xop0, unsignedp);
+ /* In case the insn wants input operands in modes different from
+ those of the actual operands, convert the operands. It would
+ seem that we don't need to convert CONST_INTs, but we do, so
+ that they're properly zero-extended or sign-extended for their
+ modes. */
- if (GET_MODE (op1) != VOIDmode && GET_MODE (op1) != mode1)
- xop1 = convert_to_mode (mode1, xop1, unsignedp);
+ if (GET_MODE (op0) != mode0 && mode0 != VOIDmode)
+ xop0 = convert_modes (mode0,
+ GET_MODE (op0) != VOIDmode
+ ? GET_MODE (op0)
+ : mode,
+ xop0, unsignedp);
+
+ if (GET_MODE (op1) != mode1 && mode1 != VOIDmode)
+ xop1 = convert_modes (mode1,
+ GET_MODE (op1) != VOIDmode
+ ? GET_MODE (op1)
+ : mode,
+ xop1, unsignedp);
/* Now, if insn doesn't accept these operands, put them into pseudos. */
if (! (*insn_data[icode].operand[1].predicate) (xop0, mode0))
@@ -2977,7 +2979,7 @@ emit_unop_insn (icode, target, op0, code)
TARGET, OP0, and OP1 are the output and inputs of the operations,
respectively. OP1 may be zero for a unary operation.
- EQUIV, if non-zero, is an expression to be placed into a REG_EQUAL note
+ EQUIV, if nonzero, is an expression to be placed into a REG_EQUAL note
on the last insn.
If TARGET is not a register, INSNS is simply emitted with no special
@@ -3434,29 +3436,23 @@ prepare_cmp_insn (px, py, pcomparison, size, pmode, punsignedp, purpose)
#endif
{
#ifdef TARGET_MEM_FUNCTIONS
- emit_library_call (memcmp_libfunc, LCT_PURE_MAKE_BLOCK,
- TYPE_MODE (integer_type_node), 3,
- XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
- convert_to_mode (TYPE_MODE (sizetype), size,
- TREE_UNSIGNED (sizetype)),
- TYPE_MODE (sizetype));
+ result = emit_library_call_value (memcmp_libfunc, NULL_RTX, LCT_PURE_MAKE_BLOCK,
+ TYPE_MODE (integer_type_node), 3,
+ XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
+ convert_to_mode (TYPE_MODE (sizetype), size,
+ TREE_UNSIGNED (sizetype)),
+ TYPE_MODE (sizetype));
#else
- emit_library_call (bcmp_libfunc, LCT_PURE_MAKE_BLOCK,
- TYPE_MODE (integer_type_node), 3,
- XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
- convert_to_mode (TYPE_MODE (integer_type_node),
- size,
- TREE_UNSIGNED (integer_type_node)),
- TYPE_MODE (integer_type_node));
+ result = emit_library_call_value (bcmp_libfunc, NULL_RTX, LCT_PURE_MAKE_BLOCK,
+ TYPE_MODE (integer_type_node), 3,
+ XEXP (x, 0), Pmode, XEXP (y, 0), Pmode,
+ convert_to_mode (TYPE_MODE (integer_type_node),
+ size,
+ TREE_UNSIGNED (integer_type_node)),
+ TYPE_MODE (integer_type_node));
#endif
- /* Immediately move the result of the libcall into a pseudo
- register so reload doesn't clobber the value if it needs
- the return register for a spill reg. */
- result = gen_reg_rtx (TYPE_MODE (integer_type_node));
result_mode = TYPE_MODE (integer_type_node);
- emit_move_insn (result,
- hard_libcall_value (result_mode));
}
*px = result;
*py = const0_rtx;
@@ -3481,14 +3477,8 @@ prepare_cmp_insn (px, py, pcomparison, size, pmode, punsignedp, purpose)
if (unsignedp && ucmp_optab->handlers[(int) mode].libfunc)
libfunc = ucmp_optab->handlers[(int) mode].libfunc;
- emit_library_call (libfunc, LCT_CONST_MAKE_BLOCK, word_mode, 2, x, mode,
- y, mode);
-
- /* Immediately move the result of the libcall into a pseudo
- register so reload doesn't clobber the value if it needs
- the return register for a spill reg. */
- result = gen_reg_rtx (word_mode);
- emit_move_insn (result, hard_libcall_value (word_mode));
+ result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST_MAKE_BLOCK,
+ word_mode, 2, x, mode, y, mode);
/* Integer comparison returns a result that must be compared against 1,
so that even if we do an unsigned compare afterward,
@@ -4004,14 +3994,8 @@ prepare_float_lib_cmp (px, py, pcomparison, pmode, punsignedp)
if (libfunc == 0)
abort ();
- emit_library_call (libfunc, LCT_CONST_MAKE_BLOCK, word_mode, 2, x, mode, y,
- mode);
-
- /* Immediately move the result of the libcall into a pseudo
- register so reload doesn't clobber the value if it needs
- the return register for a spill reg. */
- result = gen_reg_rtx (word_mode);
- emit_move_insn (result, hard_libcall_value (word_mode));
+ result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST_MAKE_BLOCK,
+ word_mode, 2, x, mode, y, mode);
*px = result;
*py = const0_rtx;
*pmode = word_mode;
@@ -4168,7 +4152,7 @@ emit_conditional_move (target, code, op0, op1, cmode, op2, op3, mode,
return target;
}
-/* Return non-zero if a conditional move of mode MODE is supported.
+/* Return nonzero if a conditional move of mode MODE is supported.
This function is for combine so it can tell whether an insn that looks
like a conditional move is actually supported by the hardware. If we
@@ -4624,10 +4608,8 @@ expand_float (to, from, unsignedp)
emit_cmp_and_jump_insns (from, const0_rtx, GE, NULL_RTX, GET_MODE (from),
0, label);
- /* On SCO 3.2.1, ldexp rejects values outside [0.5, 1).
- Rather than setting up a dconst_dot_5, let's hope SCO
- fixes the bug. */
- offset = REAL_VALUE_LDEXP (dconst1, GET_MODE_BITSIZE (GET_MODE (from)));
+
+ real_2expN (&offset, GET_MODE_BITSIZE (GET_MODE (from)));
temp = expand_binop (fmode, add_optab, target,
CONST_DOUBLE_FROM_REAL_VALUE (offset, fmode),
target, 0, OPTAB_LIB_WIDEN);
@@ -4810,7 +4792,7 @@ expand_fix (to, from, unsignedp)
rtx limit, lab1, lab2, insn;
bitsize = GET_MODE_BITSIZE (GET_MODE (to));
- offset = REAL_VALUE_LDEXP (dconst1, bitsize - 1);
+ real_2expN (&offset, bitsize - 1);
limit = CONST_DOUBLE_FROM_REAL_VALUE (offset, fmode);
lab1 = gen_label_rtx ();
lab2 = gen_label_rtx ();
diff --git a/gcc/output.h b/gcc/output.h
index fadf5f8e6dc..b7dda81ce6c 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -26,10 +26,6 @@ extern void compute_alignments PARAMS ((void));
/* Initialize data in final at the beginning of a compilation. */
extern void init_final PARAMS ((const char *));
-/* Called at end of source file,
- to output the block-profiling table for this entire compilation. */
-extern void end_final PARAMS ((const char *));
-
/* Enable APP processing of subsequent output.
Used before the output from an `asm' statement. */
extern void app_enable PARAMS ((void));
@@ -46,7 +42,6 @@ extern int dbr_sequence_length PARAMS ((void));
/* Indicate that branch shortening hasn't yet been done. */
extern void init_insn_lengths PARAMS ((void));
-#ifdef RTX_CODE
/* Obtain the current length of an insn. If branch shortening has been done,
get its actual length. Otherwise, get its maximum length. */
extern int get_attr_length PARAMS ((rtx));
@@ -147,7 +142,6 @@ extern void find_basic_blocks PARAMS ((rtx, int, FILE *));
extern bool cleanup_cfg PARAMS ((int));
extern bool delete_unreachable_blocks PARAMS ((void));
extern void check_function_return_warnings PARAMS ((void));
-#endif
/* Functions in varasm.c. */
@@ -157,9 +151,6 @@ extern void text_section PARAMS ((void));
/* Tell assembler to switch to data section. */
extern void data_section PARAMS ((void));
-/* Tell assembler to make sure its in the data section. */
-extern void force_data_section PARAMS ((void));
-
/* Tell assembler to switch to read-only data section. This is normally
the text section. */
extern void readonly_data_section PARAMS ((void));
@@ -211,7 +202,6 @@ extern void sdata_section PARAMS ((void));
extern void rdata_section PARAMS ((void));
#endif
-#ifdef TREE_CODE
/* Tell assembler to change to section NAME for DECL.
If DECL is NULL, just switch to section NAME.
If NAME is NULL, get the name from DECL.
@@ -234,7 +224,6 @@ extern void mergeable_constant_section PARAMS ((enum machine_mode,
extern void declare_weak PARAMS ((tree));
/* Merge weak status. */
extern void merge_weak PARAMS ((tree, tree));
-#endif /* TREE_CODE */
/* Emit any pending weak declarations. */
extern void weak_finish PARAMS ((void));
@@ -248,17 +237,13 @@ extern void weak_finish PARAMS ((void));
Prefixes such as % are optional. */
extern int decode_reg_name PARAMS ((const char *));
-#ifdef TREE_CODE
/* Make the rtl for variable VAR be volatile.
Use this only for static variables. */
extern void make_var_volatile PARAMS ((tree));
-/* Output alignment directive to align for constant expression EXP. */
-extern void assemble_constant_align PARAMS ((tree));
-
extern void assemble_alias PARAMS ((tree, tree));
-extern void assemble_visibility PARAMS ((tree, const char *));
+extern void default_assemble_visibility PARAMS ((tree, const char *));
/* Output a string of literal assembler code
for an `asm' keyword used between functions. */
@@ -289,7 +274,6 @@ extern void assemble_variable PARAMS ((tree, int, int, int));
(Most assemblers don't need this, so we normally output nothing.)
Do nothing if DECL is not external. */
extern void assemble_external PARAMS ((tree));
-#endif /* TREE_CODE */
/* Assemble code to leave SIZE bytes of zeros. */
extern void assemble_zeros PARAMS ((int));
@@ -301,10 +285,8 @@ extern void assemble_eh_align PARAMS ((int));
/* Assemble a string constant with the specified C string as contents. */
extern void assemble_string PARAMS ((const char *, int));
-#ifdef RTX_CODE
/* Similar, for calling a library function FUN. */
extern void assemble_external_libcall PARAMS ((rtx));
-#endif
/* Assemble a label named NAME. */
extern void assemble_label PARAMS ((const char *));
@@ -326,7 +308,6 @@ extern void assemble_name PARAMS ((FILE *, const char *));
be followed immediately by the object's initial value. */
extern const char *integer_asm_op PARAMS ((int, int));
-#ifdef RTX_CODE
/* Use directive OP to assemble an integer object X. Print OP at the
start of the line, followed immediately by the value of X. */
extern void assemble_integer_with_op PARAMS ((const char *, rtx));
@@ -336,7 +317,7 @@ extern bool default_assemble_integer PARAMS ((rtx, unsigned int, int));
/* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
the alignment of the integer in bits. Return 1 if we were able to output
- the constant, otherwise 0. If FORCE is non-zero, abort if we can't output
+ the constant, otherwise 0. If FORCE is nonzero, abort if we can't output
the constant. */
extern bool assemble_integer PARAMS ((rtx, unsigned, unsigned, int));
@@ -352,7 +333,6 @@ extern void assemble_real PARAMS ((REAL_VALUE_TYPE,
enum machine_mode,
unsigned));
#endif
-#endif
/* Start deferring output of subconstants. */
extern void defer_addressed_constants PARAMS ((void));
@@ -368,7 +348,6 @@ extern int get_pool_size PARAMS ((void));
extern rtx peephole PARAMS ((rtx));
#endif
-#ifdef TREE_CODE
/* Write all the constants in the constant pool. */
extern void output_constant_pool PARAMS ((const char *, tree));
@@ -393,9 +372,7 @@ extern tree initializer_constant_valid_p PARAMS ((tree, tree));
ALIGN is the alignment in bits that may be assumed for the data. */
extern void output_constant PARAMS ((tree, HOST_WIDE_INT,
unsigned int));
-#endif
-#ifdef RTX_CODE
/* When outputting delayed branch sequences, this rtx holds the
sequence being output. It is null when no delayed branch
sequence is being output, so it can be used as a test in the
@@ -403,7 +380,6 @@ extern void output_constant PARAMS ((tree, HOST_WIDE_INT,
This variable is defined in final.c. */
extern rtx final_sequence;
-#endif
/* The line number of the beginning of the current function. Various
md code needs this so that it can output relative linenumbers. */
@@ -468,6 +444,7 @@ extern rtx this_is_asm_operands;
/* Decide whether DECL needs to be in a writable section.
RELOC is the same as for SELECT_SECTION. */
extern bool decl_readonly_section PARAMS ((tree, int));
+extern bool decl_readonly_section_1 PARAMS ((tree, int, int));
/* User label prefix in effect for this compilation. */
extern const char *user_label_prefix;
@@ -508,6 +485,9 @@ extern bool named_section_first_declaration PARAMS((const char *));
union tree_node;
extern unsigned int default_section_type_flags PARAMS ((union tree_node *,
const char *, int));
+extern unsigned int default_section_type_flags_1 PARAMS ((union tree_node *,
+ const char *,
+ int, int));
extern void default_no_named_section PARAMS ((const char *, unsigned int));
extern void default_elf_asm_named_section PARAMS ((const char *, unsigned int));
@@ -530,14 +510,20 @@ extern void default_select_section PARAMS ((tree, int,
unsigned HOST_WIDE_INT));
extern void default_elf_select_section PARAMS ((tree, int,
unsigned HOST_WIDE_INT));
+extern void default_elf_select_section_1 PARAMS ((tree, int,
+ unsigned HOST_WIDE_INT, int));
extern void default_unique_section PARAMS ((tree, int));
+extern void default_unique_section_1 PARAMS ((tree, int, int));
extern void default_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT));
extern void default_elf_select_rtx_section PARAMS ((enum machine_mode, rtx,
unsigned HOST_WIDE_INT));
extern const char *default_strip_name_encoding PARAMS ((const char *));
extern bool default_binds_local_p PARAMS ((tree));
+extern bool default_binds_local_p_1 PARAMS ((tree, int));
extern void default_globalize_label PARAMS ((FILE *, const char *));
+extern void default_internal_label PARAMS ((FILE *, const char *, unsigned long));
+extern bool default_valid_pointer_mode PARAMS ((enum machine_mode));
/* Emit data for vtable gc for GNU binutils. */
extern void assemble_vtable_entry PARAMS ((struct rtx_def *, HOST_WIDE_INT));
diff --git a/gcc/params.def b/gcc/params.def
index 1b3105556b2..1427819d2b8 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -138,7 +138,7 @@ DEFPARAM(PARAM_MAX_GCSE_MEMORY,
"max-gcse-memory",
"The maximum amount of memory to be allocated by GCSE",
50 * 1024 * 1024)
-/* The number of repetitions of copy/const prop and PRE to run. */
+/* The number of repetitions of copy/const prop and PRE to run. */
DEFPARAM(PARAM_MAX_GCSE_PASSES,
"max-gcse-passes",
"The maximum number of passes to make when doing GCSE",
diff --git a/gcc/predict.c b/gcc/predict.c
index 7d94deafa8d..7a92ae18324 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -80,6 +80,7 @@ static void process_note_prediction PARAMS ((basic_block, int *,
static bool last_basic_block_p PARAMS ((basic_block));
static void compute_function_frequency PARAMS ((void));
static void choose_function_section PARAMS ((void));
+static bool can_predict_insn_p PARAMS ((rtx));
/* Information we hold about each branch predictor.
Filled using information from predict.def. */
@@ -230,6 +231,18 @@ predict_edge (e, predictor, probability)
predict_insn (last_insn, predictor, probability);
}
+/* Return true when we can store prediction on insn INSN.
+ At the moment we represent predictions only on conditional
+ jumps, not at computed jump or other complicated cases. */
+static bool
+can_predict_insn_p (insn)
+ rtx insn;
+{
+ return (GET_CODE (insn) == JUMP_INSN
+ && any_condjump_p (insn)
+ && BLOCK_FOR_INSN (insn)->succ->succ_next);
+}
+
/* Predict edge E by given predictor if possible. */
void
@@ -440,7 +453,8 @@ estimate_probability (loops_info)
statements construct loops via "non-loop" constructs
in the source language and are better to be handled
separately. */
- if (predicted_by_p (bb, PRED_CONTINUE))
+ if (!can_predict_insn_p (bb->end)
+ || predicted_by_p (bb, PRED_CONTINUE))
continue;
/* Loop branch heuristics - predict an edge back to a
@@ -474,7 +488,7 @@ estimate_probability (loops_info)
rtx cond, earliest;
edge e;
- if (GET_CODE (last_insn) != JUMP_INSN || ! any_condjump_p (last_insn))
+ if (! can_predict_insn_p (last_insn))
continue;
for (e = bb->succ; e; e = e->succ_next)
@@ -763,7 +777,7 @@ process_note_prediction (bb, heads, dominators, post_dominators, pred, flags)
/* Now find the edge that leads to our branch and aply the prediction. */
- if (y == last_basic_block)
+ if (y == last_basic_block || !can_predict_insn_p (BASIC_BLOCK (y)->end))
return;
for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next)
if (e->dest->index >= 0
@@ -1063,7 +1077,7 @@ estimate_loops_at_level (first_loop)
static void
counts_to_freqs ()
{
- HOST_WIDEST_INT count_max = 1;
+ gcov_type count_max = 1;
basic_block bb;
FOR_EACH_BB (bb)
@@ -1148,9 +1162,7 @@ estimate_bb_frequencies (loops)
{
rtx last_insn = bb->end;
- if (GET_CODE (last_insn) != JUMP_INSN || !any_condjump_p (last_insn)
- /* Avoid handling of conditional jumps jumping to fallthru edge. */
- || bb->succ->succ_next == NULL)
+ if (!can_predict_insn_p (last_insn))
{
/* We can predict only conditional jumps at the moment.
Expect each edge to be equally probable.
@@ -1247,7 +1259,12 @@ static void
choose_function_section ()
{
if (DECL_SECTION_NAME (current_function_decl)
- || !targetm.have_named_sections)
+ || !targetm.have_named_sections
+ /* Theoretically we can split the gnu.linkonce text section too,
+ but this requires more work as the frequency needs to match
+ for all generated objects so we need to merge the frequency
+ of all instances. For now just never set frequency for these. */
+ || !DECL_ONE_ONLY (current_function_decl))
return;
if (cfun->function_frequency == FUNCTION_FREQUENCY_HOT)
DECL_SECTION_NAME (current_function_decl) =
diff --git a/gcc/predict.def b/gcc/predict.def
index 0e441314cc0..238e0f262fc 100644
--- a/gcc/predict.def
+++ b/gcc/predict.def
@@ -74,7 +74,7 @@ DEF_PREDICTOR (PRED_NORETURN, "noreturn call", HITRATE (99),
DEF_PREDICTOR (PRED_LOOP_BRANCH, "loop branch", HITRATE (89),
PRED_FLAG_FIRST_MATCH)
-/* Edge causing loop to terminate is probably not taken. */
+/* Edge causing loop to terminate is probably not taken. */
DEF_PREDICTOR (PRED_LOOP_EXIT, "loop exit", HITRATE (90),
PRED_FLAG_FIRST_MATCH)
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index 25704eb39a0..c01f9185add 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -195,6 +195,11 @@ print_rtx (in_rtx)
}
}
+#ifndef GENERATOR_FILE
+ if (GET_CODE (in_rtx) == CONST_DOUBLE && FLOAT_MODE_P (GET_MODE (in_rtx)))
+ i = 5;
+#endif
+
/* Get the format string and skip the first elements if we have handled
them already. */
format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
@@ -513,18 +518,18 @@ print_rtx (in_rtx)
fputc (']', outfile);
break;
-#if 0
- /* It would be nice to do this, but it would require real.o to
- be linked into the MD-generator programs. Maybe we should
- do that. -zw 2002-03-03 */
+#ifndef GENERATOR_FILE
case CONST_DOUBLE:
if (FLOAT_MODE_P (GET_MODE (in_rtx)))
{
- REAL_VALUE_TYPE val;
- char s[30];
+ char s[60];
+
+ real_to_decimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
+ sizeof (s), 0, 1);
+ fprintf (outfile, " %s", s);
- REAL_VALUE_FROM_CONST_DOUBLE (val, in_rtx);
- REAL_VALUE_TO_DECIMAL (val, "%.16g", s);
+ real_to_hexadecimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
+ sizeof (s), 0, 1);
fprintf (outfile, " [%s]", s);
}
break;
diff --git a/gcc/print-tree.c b/gcc/print-tree.c
index 3104f1be214..e7c16559e56 100644
--- a/gcc/print-tree.c
+++ b/gcc/print-tree.c
@@ -131,9 +131,8 @@ print_node_brief (file, prefix, node, indent)
fprintf (file, " Nan");
else
{
- char string[100];
-
- REAL_VALUE_TO_DECIMAL (d, "%e", string);
+ char string[60];
+ real_to_decimal (string, &d, sizeof (string), 0, 1);
fprintf (file, " %s", string);
}
}
@@ -508,6 +507,9 @@ print_node (file, prefix, node, indent)
if (TYPE_PACKED (node))
fputs (" packed", file);
+ if (TYPE_RESTRICT (node))
+ fputs (" restrict", file);
+
if (TYPE_LANG_FLAG_0 (node))
fputs (" type_0", file);
if (TYPE_LANG_FLAG_1 (node))
@@ -681,9 +683,8 @@ print_node (file, prefix, node, indent)
fprintf (file, " Nan");
else
{
- char string[100];
-
- REAL_VALUE_TO_DECIMAL (d, "%e", string);
+ char string[64];
+ real_to_decimal (string, &d, sizeof (string), 0, 1);
fprintf (file, " %s", string);
}
}
@@ -711,7 +712,20 @@ print_node (file, prefix, node, indent)
break;
case STRING_CST:
- fprintf (file, " \"%s\"", TREE_STRING_POINTER (node));
+ {
+ const char *p = TREE_STRING_POINTER (node);
+ int i = TREE_STRING_LENGTH (node);
+ fputs (" \"", file);
+ while (--i >= 0)
+ {
+ char ch = *p++;
+ if (ch >= ' ' && ch < 127)
+ putc (ch, file);
+ else
+ fprintf(file, "\\%03o", ch & 0xFF);
+ }
+ fputc ('\"', file);
+ }
/* Print the chain at second level. */
if (indent == 4)
print_node (file, "chain", TREE_CHAIN (node), indent + 4);
diff --git a/gcc/profile.c b/gcc/profile.c
index 528fc6fedd2..0f4da47751c 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -39,31 +39,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
edges must be on the spanning tree. We also attempt to place
EDGE_CRITICAL edges on the spanning tree.
- The two auxiliary files generated are <dumpbase>.bb and
- <dumpbase>.bbg. The former contains the BB->linenumber
- mappings, and the latter describes the BB graph.
-
- The BB file contains line numbers for each block. For each basic
- block, a zero count is output (to mark the start of a block), then
- the line numbers of that block are listed. A zero ends the file
- too.
-
- The BBG file contains a count of the blocks, followed by edge
- information, for every edge in the graph. The edge information
- lists the source and target block numbers, and a bit mask
- describing the type of edge.
-
- The BB and BBG file formats are fully described in the gcov
- documentation. */
+ The auxiliary file generated is <dumpbase>.bbg. The format is
+ described in full in gcov-io.h. */
/* ??? Register allocation should use basic block execution counts to
give preference to the most commonly executed blocks. */
-/* ??? The .da files are not safe. Changing the program after creating .da
- files or using different options when compiling with -fbranch-probabilities
- can result the arc data not matching the program. Maybe add instrumented
- arc count to .bbg file? Maybe check whether PFG matches the .bbg file? */
-
/* ??? Should calculate branch probabilities before instrumenting code, since
then we can use arc counts to help decide which arcs to instrument. */
@@ -91,22 +72,33 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
struct edge_info {
unsigned int count_valid : 1;
- /* Is on the spanning tree. */
+ /* Is on the spanning tree. */
unsigned int on_tree : 1;
/* Pretend this edge does not exist (it is abnormal and we've
- inserted a fake to compensate). */
+ inserted a fake to compensate). */
unsigned int ignore : 1;
};
struct bb_info {
unsigned int count_valid : 1;
- /* Number of successor and predecessor edges. */
+ /* Number of successor and predecessor edges. */
gcov_type succ_count;
gcov_type pred_count;
};
+struct function_list
+{
+ struct function_list *next; /* next function */
+ const char *name; /* function name */
+ unsigned cfg_checksum; /* function checksum */
+ unsigned count_edges; /* number of intrumented edges */
+};
+
+static struct function_list *functions_head = 0;
+static struct function_list **functions_tail = &functions_head;
+
#define EDGE_INFO(e) ((struct edge_info *) (e)->aux)
#define BB_INFO(b) ((struct bb_info *) (b)->aux)
@@ -123,18 +115,15 @@ struct profile_info profile_info;
/* Name and file pointer of the output file for the basic block graph. */
static FILE *bbg_file;
+static char *bbg_file_name;
/* Name and file pointer of the input file for the arc count data. */
static FILE *da_file;
static char *da_file_name;
-/* Pointer of the output file for the basic block/line number map. */
-static FILE *bb_file;
-
-/* Last source file name written to bb_file. */
-
-static char *last_bb_file_name;
+/* The name of the count table. Used by the edge profiling code. */
+static GTY(()) rtx profiler_label;
/* Collect statistics on the performance of this pass for the entire source
file. */
@@ -152,19 +141,14 @@ static int total_num_branches;
/* Forward declarations. */
static void find_spanning_tree PARAMS ((struct edge_list *));
-static void init_edge_profiler PARAMS ((void));
static rtx gen_edge_profiler PARAMS ((int));
static void instrument_edges PARAMS ((struct edge_list *));
-static void output_gcov_string PARAMS ((const char *, long));
static void compute_branch_probabilities PARAMS ((void));
static gcov_type * get_exec_counts PARAMS ((void));
-static long compute_checksum PARAMS ((void));
+static unsigned compute_checksum PARAMS ((void));
static basic_block find_group PARAMS ((basic_block));
static void union_groups PARAMS ((basic_block, basic_block));
-/* If non-zero, we need to output a constructor to set up the
- per-object-file data. */
-static int need_func_profiler = 0;
/* Add edge instrumentation code to the entire insn chain.
@@ -194,7 +178,6 @@ instrument_edges (el)
fprintf (rtl_dump_file, "Edge %d to %d instrumented%s\n",
e->src->index, e->dest->index,
EDGE_CRITICAL_P (e) ? " (and split)" : "");
- need_func_profiler = 1;
insert_insn_on_edge (
gen_edge_profiler (total_num_edges_instrumented
+ num_instr_edges++), e);
@@ -213,53 +196,29 @@ instrument_edges (el)
commit_edge_insertions_watch_calls ();
}
-
-/* Output STRING to bb_file, surrounded by DELIMITER. */
-
-static void
-output_gcov_string (string, delimiter)
- const char *string;
- long delimiter;
-{
- long temp;
-
- /* Write a delimiter to indicate that a file name follows. */
- __write_long (delimiter, bb_file, 4);
-
- /* Write the string. */
- temp = strlen (string) + 1;
- fwrite (string, temp, 1, bb_file);
-
- /* Append a few zeros, to align the output to a 4 byte boundary. */
- temp = temp & 0x3;
- if (temp)
- {
- char c[4];
-
- c[0] = c[1] = c[2] = c[3] = 0;
- fwrite (c, sizeof (char), 4 - temp, bb_file);
- }
-
- /* Store another delimiter in the .bb file, just to make it easy to find
- the end of the file name. */
- __write_long (delimiter, bb_file, 4);
-}
/* Computes hybrid profile for all matching entries in da_file.
- Sets max_counter_in_program as a side effect. */
+ Sets max_counter_in_program as a side effect.
+ FIXME: This is O(nfuncs^2). It should be reorganised to read the da
+ file once. */
static gcov_type *
get_exec_counts ()
{
- int num_edges = 0;
+ unsigned num_edges = 0;
basic_block bb;
- int okay = 1, i;
- int mismatch = 0;
gcov_type *profile;
- char *function_name_buffer;
- int function_name_buffer_len;
- gcov_type max_counter_in_run;
+ char *function_name_buffer = NULL;
+ gcov_type max_count = 0;
+ gcov_type prog_sum_max = 0;
+ gcov_type prog_runs = 0;
+ unsigned seen_fn = 0; /* 0 = not seen fn, 1 = function now,
+ 2 = seen fn, 3 = seen prog summaries */
+ unsigned magic, version;
+ unsigned ix;
+ const char *name = IDENTIFIER_POINTER
+ (DECL_ASSEMBLER_NAME (current_function_decl));
profile_info.max_counter_in_program = 0;
profile_info.count_profiles_merged = 0;
@@ -282,123 +241,135 @@ get_exec_counts ()
profile = xmalloc (sizeof (gcov_type) * num_edges);
rewind (da_file);
- function_name_buffer_len = strlen (current_function_name) + 1;
- function_name_buffer = xmalloc (function_name_buffer_len + 1);
- for (i = 0; i < num_edges; i++)
- profile[i] = 0;
+ for (ix = 0; ix < num_edges; ix++)
+ profile[ix] = 0;
- while (1)
+ if (gcov_read_unsigned (da_file, &magic) || magic != GCOV_DATA_MAGIC)
{
- long magic, extra_bytes;
- long func_count;
- int i;
-
- if (__read_long (&magic, da_file, 4) != 0)
- break;
-
- if (magic != -123)
- {
- okay = 0;
- break;
- }
-
- if (__read_long (&func_count, da_file, 4) != 0)
+ warning ("`%s' is not a gcov data file", da_file_name);
+ cleanup:;
+ fclose (da_file);
+ da_file = NULL;
+ free (profile);
+ free (function_name_buffer);
+ return 0;
+ }
+ if (gcov_read_unsigned (da_file, &version) || version != GCOV_VERSION)
+ {
+ char v[4], e[4];
+ magic = GCOV_VERSION;
+
+ for (ix = 4; ix--; magic >>= 8, version >>= 8)
{
- okay = 0;
- break;
+ v[ix] = version;
+ e[ix] = magic;
}
-
- if (__read_long (&extra_bytes, da_file, 4) != 0)
+ warning ("`%s' is version `%.4s', expected version `%.4s'",
+ da_file_name, v, e);
+ goto cleanup;
+ }
+
+ while (1)
+ {
+ unsigned tag, length;
+ long base;
+
+ if (gcov_read_unsigned (da_file, &tag)
+ || gcov_read_unsigned (da_file, &length))
{
- okay = 0;
- break;
+ if (feof (da_file))
+ break;
+ corrupt:;
+ warning ("`%s' is corrupted", da_file_name);
+ goto cleanup;
}
-
- fseek (da_file, 4 + 8, SEEK_CUR);
-
- /* read the maximal counter. */
- __read_gcov_type (&max_counter_in_run, da_file, 8);
-
- /* skip the rest of "statistics" emited by __bb_exit_func. */
- fseek (da_file, extra_bytes - (4 + 8 + 8), SEEK_CUR);
-
- for (i = 0; i < func_count; i++)
+ base = gcov_save_position (da_file);
+ if (tag == GCOV_TAG_FUNCTION)
{
- long arc_count;
- long chksum;
- int j;
+ unsigned checksum;
- if (__read_gcov_string
- (function_name_buffer, function_name_buffer_len, da_file,
- -1) != 0)
+ if (seen_fn == 3)
{
- okay = 0;
- break;
+ profile_info.count_profiles_merged += prog_runs;
+ profile_info.max_counter_in_program += prog_sum_max;
+ if (!prog_runs)
+ {
+ profile_info.count_profiles_merged++;
+ profile_info.max_counter_in_program += max_count;
+ }
+ seen_fn = 0;
}
-
- if (__read_long (&chksum, da_file, 4) != 0)
+ else if (seen_fn == 1)
+ seen_fn = 2;
+
+ if (gcov_read_string (da_file, &function_name_buffer, NULL)
+ || gcov_read_unsigned (da_file, &checksum))
+ goto corrupt;
+
+ if (strcmp (name, function_name_buffer))
+ ;
+ else if (checksum != profile_info.current_function_cfg_checksum)
{
- okay = 0;
- break;
+ mismatch:;
+ warning ("profile mismatch for `%s'", current_function_name);
+ goto cleanup;
}
+ else
+ seen_fn = 1;
+ }
+ else if (tag == GCOV_TAG_PROGRAM_SUMMARY)
+ {
+ struct gcov_summary summary;
- if (__read_long (&arc_count, da_file, 4) != 0)
- {
- okay = 0;
- break;
- }
+ if (gcov_read_summary (da_file, &summary))
+ goto corrupt;
- if (strcmp (function_name_buffer, current_function_name) != 0)
+ if (seen_fn == 1)
+ seen_fn = 2;
+ if (seen_fn == 2)
+ seen_fn = 3;
+ if (seen_fn == 3)
{
- /* skip */
- if (fseek (da_file, arc_count * 8, SEEK_CUR) < 0)
- {
- okay = 0;
- break;
- }
+ prog_runs += summary.runs;
+ prog_sum_max += summary.arc_sum_max;
}
- else if (arc_count != num_edges
- || chksum != profile_info.current_function_cfg_checksum)
- okay = 0, mismatch = 1;
- else
- {
- gcov_type tmp;
-
- profile_info.max_counter_in_program += max_counter_in_run;
- profile_info.count_profiles_merged++;
+ }
+ else if (tag == GCOV_TAG_ARC_COUNTS)
+ {
+ unsigned num = length / 8;
- for (j = 0; j < arc_count; j++)
- if (__read_gcov_type (&tmp, da_file, 8) != 0)
- {
- okay = 0;
- break;
- }
- else
- {
- profile[j] += tmp;
- }
+ if (seen_fn == 1 && num != num_edges)
+ goto mismatch;
+
+ for (ix = 0; ix != num; ix++)
+ {
+ gcov_type count;
+
+ if (gcov_read_counter (da_file, &count))
+ goto corrupt;
+ if (count > max_count)
+ max_count = count;
+ if (seen_fn == 1)
+ profile[ix] = count;
}
}
-
- if (!okay)
- break;
-
+ gcov_resync (da_file, base, length);
}
- free (function_name_buffer);
-
- if (!okay)
+ if (seen_fn == 3)
{
- if (mismatch)
- error
- ("Profile does not match flowgraph of function %s (out of date?)",
- current_function_name);
- else
- error (".da file corrupted");
- free (profile);
- return 0;
+ profile_info.count_profiles_merged += prog_runs;
+ profile_info.max_counter_in_program += prog_sum_max;
+ if (!prog_runs)
+ {
+ profile_info.count_profiles_merged++;
+ profile_info.max_counter_in_program += max_count;
+ }
}
+
+ free (function_name_buffer);
+
if (rtl_dump_file)
{
fprintf(rtl_dump_file, "Merged %i profiles with maximal count %i.\n",
@@ -667,10 +638,11 @@ compute_branch_probabilities ()
num_branches++;
}
}
- /* Otherwise distribute the probabilities evenly so we get sane sum.
- Use simple heuristics that if there are normal edges, give all abnormals
- frequency of 0, otherwise distribute the frequency over abnormals
- (this is the case of noreturn calls). */
+ /* Otherwise distribute the probabilities evenly so we get sane
+ sum. Use simple heuristics that if there are normal edges,
+ give all abnormals frequency of 0, otherwise distribute the
+ frequency over abnormals (this is the case of noreturn
+ calls). */
else
{
for (e = bb->succ; e; e = e->succ_next)
@@ -723,30 +695,43 @@ compute_branch_probabilities ()
free (exec_counts);
}
-/* Compute checksum for the current function. */
-
-#define CHSUM_HASH 500000003
-#define CHSUM_SHIFT 2
+/* Compute checksum for the current function. We generate a CRC32. */
-static long
+static unsigned
compute_checksum ()
{
- long chsum = 0;
+ unsigned chksum = 0;
basic_block bb;
-
+
FOR_EACH_BB (bb)
{
- edge e;
-
- for (e = bb->succ; e; e = e->succ_next)
+ edge e = NULL;
+
+ do
{
- chsum = ((chsum << CHSUM_SHIFT) + (BB_TO_GCOV_INDEX (e->dest) + 1)) % CHSUM_HASH;
- }
+ unsigned value = BB_TO_GCOV_INDEX (e ? e->dest : bb);
+ unsigned ix;
+
+ /* No need to use all bits in value identically, nearly all
+ functions have less than 256 blocks. */
+ value ^= value << 16;
+ value ^= value << 8;
+
+ for (ix = 8; ix--; value <<= 1)
+ {
+ unsigned feedback;
- chsum = (chsum << CHSUM_SHIFT) % CHSUM_HASH;
+ feedback = (value ^ chksum) & 0x80000000 ? 0x04c11db7 : 0;
+ chksum <<= 1;
+ chksum ^= feedback;
+ }
+
+ e = e ? e->succ_next : bb->succ;
+ }
+ while (e);
}
- return chsum;
+ return chksum;
}
/* Instrument and/or analyze program behavior based on program flow graph.
@@ -772,17 +757,15 @@ branch_prob ()
int i;
int num_edges, ignored_edges;
struct edge_list *el;
+ const char *name = IDENTIFIER_POINTER
+ (DECL_ASSEMBLER_NAME (current_function_decl));
profile_info.current_function_cfg_checksum = compute_checksum ();
if (rtl_dump_file)
- fprintf (rtl_dump_file, "CFG checksum is %ld\n",
+ fprintf (rtl_dump_file, "CFG checksum is %u\n",
profile_info.current_function_cfg_checksum);
- /* Start of a function. */
- if (flag_test_coverage)
- output_gcov_string (current_function_name, (long) -2);
-
total_num_times_called++;
flow_call_edges_add (NULL);
@@ -891,70 +874,6 @@ branch_prob ()
verify_flow_info ();
#endif
- /* Output line number information about each basic block for
- GCOV utility. */
- if (flag_test_coverage)
- {
- FOR_EACH_BB (bb)
- {
- rtx insn = bb->head;
- static int ignore_next_note = 0;
-
- /* We are looking for line number notes. Search backward before
- basic block to find correct ones. */
- insn = prev_nonnote_insn (insn);
- if (!insn)
- insn = get_insns ();
- else
- insn = NEXT_INSN (insn);
-
- /* Output a zero to the .bb file to indicate that a new
- block list is starting. */
- __write_long (0, bb_file, 4);
-
- while (insn != bb->end)
- {
- if (GET_CODE (insn) == NOTE)
- {
- /* Must ignore the line number notes that immediately
- follow the end of an inline function to avoid counting
- it twice. There is a note before the call, and one
- after the call. */
- if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_REPEATED_LINE_NUMBER)
- ignore_next_note = 1;
- else if (NOTE_LINE_NUMBER (insn) > 0)
- {
- if (ignore_next_note)
- ignore_next_note = 0;
- else
- {
- /* If this is a new source file, then output the
- file's name to the .bb file. */
- if (! last_bb_file_name
- || strcmp (NOTE_SOURCE_FILE (insn),
- last_bb_file_name))
- {
- if (last_bb_file_name)
- free (last_bb_file_name);
- last_bb_file_name
- = xstrdup (NOTE_SOURCE_FILE (insn));
- output_gcov_string (NOTE_SOURCE_FILE (insn),
- (long)-1);
- }
- /* Output the line number to the .bb file. Must be
- done after the output_bb_profile_data() call, and
- after the file name is written, to ensure that it
- is correctly handled by gcov. */
- __write_long (NOTE_LINE_NUMBER (insn), bb_file, 4);
- }
- }
- }
- insn = NEXT_INSN (insn);
- }
- }
- __write_long (0, bb_file, 4);
- }
-
/* Create spanning tree from basic block graph, mark each edge that is
on the spanning tree. We insert as many abnormal and critical edges
as possible to minimize number of edge splits necessary. */
@@ -991,57 +910,140 @@ branch_prob ()
edge output the source and target basic block numbers.
NOTE: The format of this file must be compatible with gcov. */
- if (flag_test_coverage)
+ if (flag_test_coverage && bbg_file)
{
- int flag_bits;
-
- __write_gcov_string (current_function_name,
- strlen (current_function_name), bbg_file, -1);
-
- /* write checksum. */
- __write_long (profile_info.current_function_cfg_checksum, bbg_file, 4);
-
- /* The plus 2 stands for entry and exit block. */
- __write_long (n_basic_blocks + 2, bbg_file, 4);
- __write_long (num_edges - ignored_edges + 1, bbg_file, 4);
-
+ long offset;
+
+ /* Announce function */
+ if (gcov_write_unsigned (bbg_file, GCOV_TAG_FUNCTION)
+ || !(offset = gcov_reserve_length (bbg_file))
+ || gcov_write_string (bbg_file, name,
+ strlen (name))
+ || gcov_write_unsigned (bbg_file,
+ profile_info.current_function_cfg_checksum)
+ || gcov_write_length (bbg_file, offset))
+ goto bbg_error;
+
+ /* Basic block flags */
+ if (gcov_write_unsigned (bbg_file, GCOV_TAG_BLOCKS)
+ || !(offset = gcov_reserve_length (bbg_file)))
+ goto bbg_error;
+ for (i = 0; i != n_basic_blocks + 2; i++)
+ if (gcov_write_unsigned (bbg_file, 0))
+ goto bbg_error;
+ if (gcov_write_length (bbg_file, offset))
+ goto bbg_error;
+
+ /* Arcs */
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
edge e;
- long count = 0;
- for (e = bb->succ; e; e = e->succ_next)
- if (!EDGE_INFO (e)->ignore)
- count++;
- __write_long (count, bbg_file, 4);
+ if (gcov_write_unsigned (bbg_file, GCOV_TAG_ARCS)
+ || !(offset = gcov_reserve_length (bbg_file))
+ || gcov_write_unsigned (bbg_file, BB_TO_GCOV_INDEX (bb)))
+ goto bbg_error;
for (e = bb->succ; e; e = e->succ_next)
{
struct edge_info *i = EDGE_INFO (e);
if (!i->ignore)
{
- flag_bits = 0;
+ unsigned flag_bits = 0;
+
if (i->on_tree)
- flag_bits |= 0x1;
+ flag_bits |= GCOV_ARC_ON_TREE;
if (e->flags & EDGE_FAKE)
- flag_bits |= 0x2;
+ flag_bits |= GCOV_ARC_FAKE;
if (e->flags & EDGE_FALLTHRU)
- flag_bits |= 0x4;
+ flag_bits |= GCOV_ARC_FALLTHROUGH;
- __write_long (BB_TO_GCOV_INDEX (e->dest), bbg_file, 4);
- __write_long (flag_bits, bbg_file, 4);
+ if (gcov_write_unsigned (bbg_file,
+ BB_TO_GCOV_INDEX (e->dest))
+ || gcov_write_unsigned (bbg_file, flag_bits))
+ goto bbg_error;
}
}
+ if (gcov_write_length (bbg_file, offset))
+ goto bbg_error;
}
- /* Emit fake loopback edge for EXIT block to maintain compatibility with
- old gcov format. */
- __write_long (1, bbg_file, 4);
- __write_long (0, bbg_file, 4);
- __write_long (0x1, bbg_file, 4);
-
- /* Emit a -1 to separate the list of all edges from the list of
- loop back edges that follows. */
- __write_long (-1, bbg_file, 4);
+
+ /* Output line number information about each basic block for
+ GCOV utility. */
+ {
+ char const *prev_file_name = NULL;
+
+ FOR_EACH_BB (bb)
+ {
+ rtx insn = bb->head;
+ int ignore_next_note = 0;
+
+ offset = 0;
+
+ /* We are looking for line number notes. Search backward
+ before basic block to find correct ones. */
+ insn = prev_nonnote_insn (insn);
+ if (!insn)
+ insn = get_insns ();
+ else
+ insn = NEXT_INSN (insn);
+
+ while (insn != bb->end)
+ {
+ if (GET_CODE (insn) == NOTE)
+ {
+ /* Must ignore the line number notes that immediately
+ follow the end of an inline function to avoid counting
+ it twice. There is a note before the call, and one
+ after the call. */
+ if (NOTE_LINE_NUMBER (insn)
+ == NOTE_INSN_REPEATED_LINE_NUMBER)
+ ignore_next_note = 1;
+ else if (NOTE_LINE_NUMBER (insn) <= 0)
+ /*NOP*/;
+ else if (ignore_next_note)
+ ignore_next_note = 0;
+ else
+ {
+ if (offset)
+ /*NOP*/;
+ else if (gcov_write_unsigned (bbg_file, GCOV_TAG_LINES)
+ || !(offset = gcov_reserve_length (bbg_file))
+ || gcov_write_unsigned (bbg_file,
+ BB_TO_GCOV_INDEX (bb)))
+ goto bbg_error;
+ /* If this is a new source file, then output
+ the file's name to the .bb file. */
+ if (!prev_file_name
+ || strcmp (NOTE_SOURCE_FILE (insn),
+ prev_file_name))
+ {
+ prev_file_name = NOTE_SOURCE_FILE (insn);
+ if (gcov_write_unsigned (bbg_file, 0)
+ || gcov_write_string (bbg_file, prev_file_name,
+ strlen (prev_file_name)))
+ goto bbg_error;
+ }
+ if (gcov_write_unsigned (bbg_file, NOTE_LINE_NUMBER (insn)))
+ goto bbg_error;
+ }
+ }
+ insn = NEXT_INSN (insn);
+ }
+ if (offset)
+ {
+ if (gcov_write_unsigned (bbg_file, 0)
+ || gcov_write_string (bbg_file, NULL, 0)
+ || gcov_write_length (bbg_file, offset))
+ {
+ bbg_error:;
+ warning ("error writing `%s'", bbg_file_name);
+ fclose (bbg_file);
+ bbg_file = NULL;
+ }
+ }
+ }
+ }
}
if (flag_branch_probabilities)
@@ -1049,10 +1051,23 @@ branch_prob ()
/* For each edge not on the spanning tree, add counting code as rtl. */
- if (profile_arc_flag)
+ if (cfun->arc_profile && profile_arc_flag)
{
+ struct function_list *item;
+
instrument_edges (el);
allocate_reg_info (max_reg_num (), FALSE, FALSE);
+
+ /* ??? Probably should re-use the existing struct function. */
+ item = xmalloc (sizeof (struct function_list));
+
+ *functions_tail = item;
+ functions_tail = &item->next;
+
+ item->next = 0;
+ item->name = xstrdup (name);
+ item->cfg_checksum = profile_info.current_function_cfg_checksum;
+ item->count_edges = profile_info.count_edges_instrumented_now;
}
remove_fake_edges ();
@@ -1191,30 +1206,25 @@ init_branch_prob (filename)
if (flag_test_coverage)
{
- char *data_file, *bbg_file_name;
-
- /* Open an output file for the basic block/line number map. */
- data_file = (char *) alloca (len + 4);
- strcpy (data_file, filename);
- strcat (data_file, ".bb");
- if ((bb_file = fopen (data_file, "wb")) == 0)
- fatal_io_error ("can't open %s", data_file);
-
- /* Open an output file for the program flow graph. */
- bbg_file_name = (char *) alloca (len + 5);
+ /* Open the bbg output file. */
+ bbg_file_name = (char *) xmalloc (len + strlen (GCOV_GRAPH_SUFFIX) + 1);
strcpy (bbg_file_name, filename);
- strcat (bbg_file_name, ".bbg");
- if ((bbg_file = fopen (bbg_file_name, "wb")) == 0)
- fatal_io_error ("can't open %s", bbg_file_name);
+ strcat (bbg_file_name, GCOV_GRAPH_SUFFIX);
+ bbg_file = fopen (bbg_file_name, "wb");
+ if (!bbg_file)
+ fatal_io_error ("cannot open %s", bbg_file_name);
- /* Initialize to zero, to ensure that the first file name will be
- written to the .bb file. */
- last_bb_file_name = 0;
+ if (gcov_write_unsigned (bbg_file, GCOV_GRAPH_MAGIC)
+ || gcov_write_unsigned (bbg_file, GCOV_VERSION))
+ {
+ fclose (bbg_file);
+ fatal_io_error ("cannot write `%s'", bbg_file_name);
+ }
}
- da_file_name = (char *) xmalloc (len + 4);
+ da_file_name = (char *) xmalloc (len + strlen (GCOV_DATA_SUFFIX) + 1);
strcpy (da_file_name, filename);
- strcat (da_file_name, ".da");
+ strcat (da_file_name, GCOV_DATA_SUFFIX);
if (flag_branch_probabilities)
{
@@ -1225,8 +1235,14 @@ init_branch_prob (filename)
}
if (profile_arc_flag)
- init_edge_profiler ();
-
+ {
+ /* Generate and save a copy of this so it can be shared. */
+ char buf[20];
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LPBX", 2);
+ profiler_label = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
+ }
+
total_num_blocks = 0;
total_num_edges = 0;
total_num_edges_ignored = 0;
@@ -1248,12 +1264,32 @@ end_branch_prob ()
{
if (flag_test_coverage)
{
- fclose (bb_file);
- fclose (bbg_file);
- unlink (da_file_name);
+ if (bbg_file)
+ {
+#if __GNUC__ && !CROSS_COMPILE && SUPPORTS_WEAK
+ /* If __gcov_init has a value in the compiler, it means we
+ are instrumenting ourselves. We should not remove the
+ counts file, because we might be recompiling
+ ourselves. The .da files are all removed during copying
+ the stage1 files. */
+ extern void __gcov_init (void *)
+ __attribute__ ((weak));
+
+ if (!__gcov_init)
+ unlink (da_file_name);
+#else
+ unlink (da_file_name);
+#endif
+ fclose (bbg_file);
+ }
+ else
+ {
+ unlink (bbg_file_name);
+ unlink (da_file_name);
+ }
}
- if (flag_branch_probabilities && da_file)
+ if (da_file)
fclose (da_file);
if (rtl_dump_file)
@@ -1289,124 +1325,242 @@ end_branch_prob ()
}
}
}
-
-/* The label used by the edge profiling code. */
-
-static GTY(()) rtx profiler_label;
-
-/* Initialize the profiler_label. */
-
-static void
-init_edge_profiler ()
-{
- /* Generate and save a copy of this so it can be shared. */
- char buf[20];
- ASM_GENERATE_INTERNAL_LABEL (buf, "LPBX", 2);
- profiler_label = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
-}
-
-/* Output instructions as RTL to increment the edge execution count. */
-
-static rtx
-gen_edge_profiler (edgeno)
- int edgeno;
-{
- enum machine_mode mode = mode_for_size (GCOV_TYPE_SIZE, MODE_INT, 0);
- rtx mem_ref, tmp;
- rtx sequence;
-
- start_sequence ();
-
- tmp = force_reg (Pmode, profiler_label);
- tmp = plus_constant (tmp, GCOV_TYPE_SIZE / BITS_PER_UNIT * edgeno);
- mem_ref = validize_mem (gen_rtx_MEM (mode, tmp));
- set_mem_alias_set (mem_ref, new_alias_set ());
-
- tmp = expand_simple_binop (mode, PLUS, mem_ref, const1_rtx,
- mem_ref, 0, OPTAB_WIDEN);
-
- if (tmp != mem_ref)
- emit_move_insn (copy_rtx (mem_ref), tmp);
-
- sequence = get_insns ();
- end_sequence ();
- return sequence;
-}
-
-/* Output code for a constructor that will invoke __bb_init_func, if
- this has not already been done. */
+/* Write out the structure which libgcc uses to locate all the arc
+ counters. The structures used here must match those defined in
+ gcov-io.h. Write out the constructor to call __gcov_init. */
void
-output_func_start_profiler ()
+create_profiler ()
{
- tree fnname, fndecl;
- char *name;
- char buf[20];
- const char *cfnname;
- rtx table_address;
- enum machine_mode mode = mode_for_size (GCOV_TYPE_SIZE, MODE_INT, 0);
+ tree fields, field, value = NULL_TREE;
+ tree ginfo_type;
+ tree string_type;
+ tree gcov_type, gcov_ptr_type;
+ char name[20];
+ char *ctor_name;
+ tree structure, ctor;
+ rtx structure_address;
int save_flag_inline_functions = flag_inline_functions;
- /* It's either already been output, or we don't need it because we're
- not doing profile-edges. */
- if (! need_func_profiler)
+ if (!profile_info.count_instrumented_edges)
return;
+
+ string_type = build_pointer_type
+ (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
+ gcov_type = make_signed_type (GCOV_TYPE_SIZE);
+ gcov_ptr_type
+ = build_pointer_type (build_qualified_type
+ (gcov_type, TYPE_QUAL_CONST));
+
+ ginfo_type = (*lang_hooks.types.make_type) (RECORD_TYPE);
+
- need_func_profiler = 0;
-
- /* Synthesize a constructor function to invoke __bb_init_func with a
- pointer to this object file's profile block. */
-
- /* Try and make a unique name given the "file function name".
-
- And no, I don't like this either. */
-
- fnname = get_file_function_name ('I');
- cfnname = IDENTIFIER_POINTER (fnname);
- name = concat (cfnname, "GCOV", NULL);
- fnname = get_identifier (name);
- free (name);
+ /* Version ident */
+ fields = build_decl (FIELD_DECL, NULL_TREE, long_unsigned_type_node);
+ value = tree_cons (fields, convert (long_unsigned_type_node, build_int_2
+ (GCOV_VERSION, 0)), value);
+
+ /* NULL */
+ field = build_decl (FIELD_DECL, NULL_TREE, build_pointer_type
+ (build_qualified_type
+ (ginfo_type, TYPE_QUAL_CONST)));
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields, null_pointer_node, value);
+
+ /* Filename */
+ {
+ tree filename_string;
+ char *filename;
+ int filename_len;
+
+ filename = getpwd ();
+ filename = (filename && da_file_name[0] != '/'
+ ? concat (filename, "/", da_file_name, NULL)
+ : da_file_name);
+ filename_len = strlen (filename);
+ filename_string = build_string (filename_len + 1, filename);
+ if (filename != da_file_name)
+ free (filename);
+ TREE_TYPE (filename_string) = build_array_type
+ (char_type_node, build_index_type
+ (build_int_2 (filename_len, 0)));
+
+ field = build_decl (FIELD_DECL, NULL_TREE, string_type);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields, build1 (ADDR_EXPR, string_type,
+ filename_string), value);
+ }
+
+ /* Workspace */
+ field = build_decl (FIELD_DECL, NULL_TREE, long_integer_type_node);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields,
+ convert (long_integer_type_node, integer_zero_node),
+ value);
+
+ /* function_info table */
+ {
+ struct function_list *item;
+ int num_nodes = 0;
+ tree array_value = NULL_TREE;
+ tree finfo_type, finfo_ptr_type;
+ tree name, checksum, arcs;
+
+ finfo_type = (*lang_hooks.types.make_type) (RECORD_TYPE);
+ name = build_decl (FIELD_DECL, NULL_TREE, string_type);
+ checksum = build_decl (FIELD_DECL, NULL_TREE, unsigned_type_node);
+ TREE_CHAIN (checksum) = name;
+ arcs = build_decl (FIELD_DECL, NULL_TREE, unsigned_type_node);
+ TREE_CHAIN (arcs) = checksum;
+ finish_builtin_struct (finfo_type, "__function_info",
+ arcs, NULL_TREE);
+ finfo_ptr_type = build_pointer_type
+ (build_qualified_type (finfo_type, TYPE_QUAL_CONST));
+
+ for (item = functions_head; item != 0; item = item->next, num_nodes++)
+ {
+ size_t name_len = strlen (item->name);
+ tree finfo_value = NULL_TREE;
+ tree fname = build_string (name_len + 1, item->name);
+
+ TREE_TYPE (fname) = build_array_type
+ (char_type_node, build_index_type (build_int_2 (name_len, 0)));
+ finfo_value = tree_cons (name, build1
+ (ADDR_EXPR, string_type,
+ fname), finfo_value);
+ finfo_value = tree_cons (checksum, convert
+ (unsigned_type_node,
+ build_int_2 (item->cfg_checksum, 0)),
+ finfo_value);
+ finfo_value = tree_cons (arcs, convert
+ (unsigned_type_node,
+ build_int_2 (item->count_edges, 0)),
+ finfo_value);
+ array_value = tree_cons (NULL_TREE, build
+ (CONSTRUCTOR, finfo_type, NULL_TREE,
+ nreverse (finfo_value)), array_value);
+ }
+
+ /* Create constructor for array. */
+ if (num_nodes)
+ {
+ tree array_type;
+
+ array_type = build_array_type (finfo_type, build_index_type
+ (build_int_2 (num_nodes - 1, 0)));
+ array_value = build (CONSTRUCTOR, array_type,
+ NULL_TREE, nreverse (array_value));
+ array_value = build1
+ (ADDR_EXPR, finfo_ptr_type, array_value);
+ }
+ else
+ array_value = null_pointer_node;
+
+ field = build_decl (FIELD_DECL, NULL_TREE, finfo_ptr_type);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields, array_value, value);
+
+ /* number of functions */
+ field = build_decl (FIELD_DECL, NULL_TREE, unsigned_type_node);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields, convert (unsigned_type_node, build_int_2
+ (num_nodes, 0)), value);
+ }
+
+ /* arc count table */
+ {
+ tree counts_table = null_pointer_node;
+
+ if (profile_info.count_instrumented_edges)
+ {
+ tree gcov_type_array_type
+ = build_array_type (gcov_type, build_index_type
+ (build_int_2 (profile_info.
+ count_instrumented_edges - 1, 0)));
+ /* No values. */
+ counts_table
+ = build (VAR_DECL, gcov_type_array_type, NULL_TREE, NULL_TREE);
+ TREE_STATIC (counts_table) = 1;
+ DECL_NAME (counts_table) = get_identifier (XSTR (profiler_label, 0));
+ assemble_variable (counts_table, 0, 0, 0);
+ counts_table = build1 (ADDR_EXPR, gcov_ptr_type, counts_table);
+ }
+
+ field = build_decl (FIELD_DECL, NULL_TREE, gcov_ptr_type);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields, counts_table, value);
+ }
+
+ /* number of arc counts */
+ field = build_decl (FIELD_DECL, NULL_TREE, unsigned_type_node);
+ TREE_CHAIN (field) = fields;
+ fields = field;
+ value = tree_cons (fields, convert
+ (unsigned_type_node,
+ build_int_2 (profile_info
+ .count_instrumented_edges, 0)),
+ value);
+
+ finish_builtin_struct (ginfo_type, "__gcov_info", fields, NULL_TREE);
+ structure = build (VAR_DECL, ginfo_type, NULL_TREE, NULL_TREE);
+ DECL_INITIAL (structure)
+ = build (CONSTRUCTOR, ginfo_type, NULL_TREE, nreverse (value));
+ TREE_STATIC (structure) = 1;
+ ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0);
+ DECL_NAME (structure) = get_identifier (name);
+
+ /* Build structure. */
+ assemble_variable (structure, 0, 0, 0);
- fndecl = build_decl (FUNCTION_DECL, fnname,
- build_function_type (void_type_node, NULL_TREE));
- DECL_EXTERNAL (fndecl) = 0;
+ /* Build the constructor function to invoke __gcov_init. */
+ ctor_name = concat (IDENTIFIER_POINTER (get_file_function_name ('I')),
+ "_GCOV", NULL);
+ ctor = build_decl (FUNCTION_DECL, get_identifier (ctor_name),
+ build_function_type (void_type_node, NULL_TREE));
+ free (ctor_name);
+ DECL_EXTERNAL (ctor) = 0;
/* It can be a static function as long as collect2 does not have
to scan the object file to find its ctor/dtor routine. */
- TREE_PUBLIC (fndecl) = ! targetm.have_ctors_dtors;
-
- TREE_USED (fndecl) = 1;
-
- DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
-
- fndecl = (*lang_hooks.decls.pushdecl) (fndecl);
- rest_of_decl_compilation (fndecl, 0, 1, 0);
- announce_function (fndecl);
- current_function_decl = fndecl;
- DECL_INITIAL (fndecl) = error_mark_node;
- make_decl_rtl (fndecl, NULL);
- init_function_start (fndecl, input_filename, lineno);
+ TREE_PUBLIC (ctor) = ! targetm.have_ctors_dtors;
+ TREE_USED (ctor) = 1;
+ DECL_RESULT (ctor) = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
+
+ ctor = (*lang_hooks.decls.pushdecl) (ctor);
+ rest_of_decl_compilation (ctor, 0, 1, 0);
+ announce_function (ctor);
+ current_function_decl = ctor;
+ DECL_INITIAL (ctor) = error_mark_node;
+ make_decl_rtl (ctor, NULL);
+ init_function_start (ctor, input_filename, lineno);
(*lang_hooks.decls.pushlevel) (0);
- expand_function_start (fndecl, 0);
+ expand_function_start (ctor, 0);
cfun->arc_profile = 0;
- /* Actually generate the code to call __bb_init_func. */
- ASM_GENERATE_INTERNAL_LABEL (buf, "LPBX", 0);
- table_address = force_reg (Pmode,
- gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf)));
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__bb_init_func"), LCT_NORMAL,
- mode, 1, table_address, Pmode);
+ /* Actually generate the code to call __gcov_init. */
+ structure_address = force_reg (Pmode, gen_rtx_SYMBOL_REF
+ (Pmode, IDENTIFIER_POINTER
+ (DECL_NAME (structure))));
+ emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__gcov_init"),
+ LCT_NORMAL, VOIDmode, 1,
+ structure_address, Pmode);
expand_function_end (input_filename, lineno, 0);
(*lang_hooks.decls.poplevel) (1, 0, 1);
- /* Since fndecl isn't in the list of globals, it would never be emitted
+ /* Since ctor isn't in the list of globals, it would never be emitted
when it's considered to be 'safe' for inlining, so turn off
flag_inline_functions. */
flag_inline_functions = 0;
- rest_of_compilation (fndecl);
+ rest_of_compilation (ctor);
/* Reset flag_inline_functions to its original value. */
flag_inline_functions = save_flag_inline_functions;
@@ -1416,8 +1570,37 @@ output_func_start_profiler ()
current_function_decl = NULL_TREE;
if (targetm.have_ctors_dtors)
- (* targetm.asm_out.constructor) (XEXP (DECL_RTL (fndecl), 0),
+ (* targetm.asm_out.constructor) (XEXP (DECL_RTL (ctor), 0),
DEFAULT_INIT_PRIORITY);
}
+
+/* Output instructions as RTL to increment the edge execution count. */
+
+static rtx
+gen_edge_profiler (edgeno)
+ int edgeno;
+{
+ enum machine_mode mode = mode_for_size (GCOV_TYPE_SIZE, MODE_INT, 0);
+ rtx mem_ref, tmp;
+ rtx sequence;
+
+ start_sequence ();
+
+ tmp = force_reg (Pmode, profiler_label);
+ tmp = plus_constant (tmp, GCOV_TYPE_SIZE / BITS_PER_UNIT * edgeno);
+ mem_ref = validize_mem (gen_rtx_MEM (mode, tmp));
+
+ set_mem_alias_set (mem_ref, new_alias_set ());
+
+ tmp = expand_simple_binop (mode, PLUS, mem_ref, const1_rtx,
+ mem_ref, 0, OPTAB_WIDEN);
+
+ if (tmp != mem_ref)
+ emit_move_insn (copy_rtx (mem_ref), tmp);
+
+ sequence = get_insns ();
+ end_sequence ();
+ return sequence;
+}
#include "gt-profile.h"
diff --git a/gcc/profile.h b/gcc/profile.h
index 609b0d37e66..4b7ac56d1e4 100644
--- a/gcc/profile.h
+++ b/gcc/profile.h
@@ -36,7 +36,7 @@ struct profile_info
/* Checksum of the cfg. Used for 'identification' of code.
Used by final. */
- long current_function_cfg_checksum;
+ unsigned current_function_cfg_checksum;
/* Max. value of counter in program corresponding to the profile data
for the current function. */
diff --git a/gcc/protoize.c b/gcc/protoize.c
index 61d583c0ceb..e039d6d4775 100644
--- a/gcc/protoize.c
+++ b/gcc/protoize.c
@@ -363,7 +363,7 @@ struct def_dec_info_struct {
static const char *pname;
-/* Error counter. Will be non-zero if we should give up at the next convenient
+/* Error counter. Will be nonzero if we should give up at the next convenient
stopping point. */
static int errors = 0;
@@ -669,7 +669,7 @@ is_id_char (ch)
}
/* Give a message indicating the proper way to invoke this program and then
- exit with non-zero status. */
+ exit with nonzero status. */
static void
usage ()
@@ -1437,7 +1437,7 @@ find_corresponding_lparen (p)
/* Given a line from an aux info file, and a time at which the aux info
file it came from was created, check to see if the item described in
the line comes from a file which has been modified since the aux info
- file was created. If so, return non-zero, else return zero. */
+ file was created. If so, return nonzero, else return zero. */
static int
referenced_file_is_newer (l, aux_info_mtime)
@@ -3202,7 +3202,7 @@ edit_fn_declaration (def_dec_p, clean_text_p)
list that lies to the left of the one it was originally called to work
on. Thus, a whole set gets done in right-to-left order.
- This routine returns non-zero if it thinks that it should not be trying
+ This routine returns nonzero if it thinks that it should not be trying
to convert this particular function definition (because the name of the
function doesn't match the one expected). */
@@ -3254,7 +3254,7 @@ edit_formals_lists (end_formals, f_list_count, def_dec_p)
/* Check that the function name in the header we are working on is the same
as the one we would expect to find. If not, issue a warning and return
- non-zero. */
+ nonzero. */
if (f_list_count == 0)
{
diff --git a/gcc/ra-build.c b/gcc/ra-build.c
index e1ad650bc7d..e320e514d90 100644
--- a/gcc/ra-build.c
+++ b/gcc/ra-build.c
@@ -275,7 +275,7 @@ copy_insn_p (insn, source, target)
s_regno = (unsigned) REGNO (GET_CODE (s) == SUBREG ? SUBREG_REG (s) : s);
d_regno = (unsigned) REGNO (GET_CODE (d) == SUBREG ? SUBREG_REG (d) : d);
- /* Copies between hardregs are useless for us, as not coalesable anyway. */
+ /* Copies between hardregs are useless for us, as not coalesable anyway. */
if ((s_regno < FIRST_PSEUDO_REGISTER
&& d_regno < FIRST_PSEUDO_REGISTER)
|| s_regno >= max_normal_pseudo
@@ -563,7 +563,7 @@ remember_move (insn)
SET_BIT (move_handled, INSN_UID (insn));
if (copy_insn_p (insn, &s, &d))
{
- /* Some sanity test for the copy insn. */
+ /* Some sanity test for the copy insn. */
struct df_link *slink = DF_INSN_USES (df, insn);
struct df_link *link = DF_INSN_DEFS (df, insn);
if (!link || !link->ref || !slink || !slink->ref)
@@ -844,7 +844,7 @@ live_out_1 (df, use, insn)
else
{
/* If this insn doesn't completely define the USE, increment also
- it's spanned deaths count (if this insn contains a death). */
+ it's spanned deaths count (if this insn contains a death). */
if (uid >= death_insns_max_uid)
abort ();
if (TEST_BIT (insns_with_deaths, uid))
@@ -876,7 +876,7 @@ live_out (df, use, insn)
&& (use->undefined & ~visit_trace[uid].undefined) == 0)
{
union_web_parts (visit_trace[uid].wp, use->wp);
- /* Don't search any further, as we already were here with this regno. */
+ /* Don't search any further, as we already were here with this regno. */
return 0;
}
else
@@ -2813,7 +2813,7 @@ moves_to_webs (df)
if (m->source_web && m->target_web
/* If the usable_regs don't intersect we can't coalesce the two
webs anyway, as this is no simple copy insn (it might even
- need an intermediate stack temp to execute this "copy" insn). */
+ need an intermediate stack temp to execute this "copy" insn). */
&& hard_regs_intersect_p (&m->source_web->usable_regs,
&m->target_web->usable_regs))
{
diff --git a/gcc/ra-colorize.c b/gcc/ra-colorize.c
index eecea504f18..4040fb9beb5 100644
--- a/gcc/ra-colorize.c
+++ b/gcc/ra-colorize.c
@@ -1285,7 +1285,6 @@ colorize_one_web (web, hard)
int c = -1;
int bestc = -1;
int neighbor_needs= 0;
- struct web *fat_neighbor = NULL;
struct web *fats_parent = NULL;
int num_fat = 0;
int long_blocks = 0;
@@ -1318,7 +1317,6 @@ colorize_one_web (web, hard)
&& w->add_hardregs >= neighbor_needs)
{
neighbor_needs = w->add_hardregs;
- fat_neighbor = w;
fats_parent = ptarget;
num_fat++;
}
@@ -1669,9 +1667,7 @@ assign_colors ()
while (WEBS(SELECT))
{
- struct web *web;
d = pop_list (&WEBS(SELECT));
- web = DLIST_WEB (d);
colorize_one_web (DLIST_WEB (d), 1);
}
diff --git a/gcc/ra-rewrite.c b/gcc/ra-rewrite.c
index 451762671ff..61645e22a1d 100644
--- a/gcc/ra-rewrite.c
+++ b/gcc/ra-rewrite.c
@@ -550,7 +550,7 @@ remember_slot (list, x)
}
/* Given two rtx' S1 and S2, either being REGs or MEMs (or SUBREGs
- thereof), return non-zero, if they overlap. REGs and MEMs don't
+ thereof), return nonzero, if they overlap. REGs and MEMs don't
overlap, and if they are MEMs they must have an easy address
(plus (basereg) (const_inst x)), otherwise they overlap. */
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index 8c378d96abb..5efd5dc9a20 100644
--- a/gcc/read-rtl.c
+++ b/gcc/read-rtl.c
@@ -35,7 +35,7 @@ static char *read_string PARAMS ((struct obstack *, FILE *, int));
static char *read_quoted_string PARAMS ((struct obstack *, FILE *));
static char *read_braced_string PARAMS ((struct obstack *, FILE *));
static void read_escape PARAMS ((struct obstack *, FILE *));
-static unsigned def_hash PARAMS ((const void *));
+static hashval_t def_hash PARAMS ((const void *));
static int def_name_eq_p PARAMS ((const void *, const void *));
static void read_constants PARAMS ((FILE *infile, char *tmp_char));
static void validate_const_int PARAMS ((FILE *, const char *));
@@ -401,7 +401,7 @@ atoll (p)
#endif
/* Given a constant definition, return a hash code for its name. */
-static unsigned
+static hashval_t
def_hash (def)
const void *def;
{
diff --git a/gcc/real.c b/gcc/real.c
index d2e0a8d85c5..458a3c691b8 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -1,6677 +1,4327 @@
-/* real.c - implementation of REAL_ARITHMETIC, REAL_VALUE_ATOF,
- and support for XFmode IEEE extended real floating point arithmetic.
+/* real.c - software floating point emulation.
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2002 Free Software Foundation, Inc.
Contributed by Stephen L. Moshier (moshier@world.std.com).
+ Re-written by Richard Henderson <rth@redhat.com>
-This file is part of GCC.
+ 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 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.
+ 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. */
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING. If not, write to the Free
+ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
#include "config.h"
#include "system.h"
-#include "real.h"
#include "tree.h"
#include "toplev.h"
+#include "real.h"
#include "tm_p.h"
-/* To enable support of XFmode extended real floating point, define
-LONG_DOUBLE_TYPE_SIZE 96 in the tm.h file (m68k.h or i386.h).
-
-Machine files (tm.h etc) must not contain any code
-that tries to use host floating point arithmetic to convert
-REAL_VALUE_TYPEs from `double' to `float', pass them to fprintf,
-etc. In cross-compile situations a REAL_VALUE_TYPE may not
-be intelligible to the host computer's native arithmetic.
-
-The first part of this file interfaces gcc to a floating point
-arithmetic suite that was not written with gcc in mind. Avoid
-changing the low-level arithmetic routines unless you have suitable
-test programs available. A special version of the PARANOIA floating
-point arithmetic tester, modified for this purpose, can be found on
-usc.edu: /pub/C-numanal/ieeetest.zoo. Other tests, and libraries of
-XFmode and TFmode transcendental functions, can be obtained by ftp from
-netlib.att.com: netlib/cephes. */
-
-/* Type of computer arithmetic.
- Only one of DEC, IBM, IEEE, C4X, or UNK should get defined.
-
- `IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
- to big-endian IEEE floating-point data structure. This definition
- should work in SFmode `float' type and DFmode `double' type on
- virtually all big-endian IEEE machines. If LONG_DOUBLE_TYPE_SIZE
- has been defined to be 96, then IEEE also invokes the particular
- XFmode (`long double' type) data structure used by the Motorola
- 680x0 series processors.
-
- `IEEE', when REAL_WORDS_BIG_ENDIAN is zero, refers generally to
- little-endian IEEE machines. In this case, if LONG_DOUBLE_TYPE_SIZE
- has been defined to be 96, then IEEE also invokes the particular
- XFmode `long double' data structure used by the Intel 80x86 series
- processors.
-
- `DEC' refers specifically to the Digital Equipment Corp PDP-11
- and VAX floating point data structure. This model currently
- supports no type wider than DFmode.
-
- `IBM' refers specifically to the IBM System/370 and compatible
- floating point data structure. This model currently supports
- no type wider than DFmode. The IBM conversions were contributed by
- frank@atom.ansto.gov.au (Frank Crawford).
-
- `C4X' refers specifically to the floating point format used on
- Texas Instruments TMS320C3x and TMS320C4x digital signal
- processors. This supports QFmode (32-bit float, double) and HFmode
- (40-bit long double) where BITS_PER_BYTE is 32. Unlike IEEE
- floats, C4x floats are not rounded to be even. The C4x conversions
- were contributed by m.hayes@elec.canterbury.ac.nz (Michael Hayes) and
- Haj.Ten.Brugge@net.HCC.nl (Herman ten Brugge).
-
- If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
- then `long double' and `double' are both implemented, but they
- both mean DFmode.
-
- The case LONG_DOUBLE_TYPE_SIZE = 128 activates TFmode support
- and may deactivate XFmode since `long double' is used to refer
- to both modes. Defining INTEL_EXTENDED_IEEE_FORMAT to non-zero
- at the same time enables 80387-style 80-bit floats in a 128-bit
- padded image, as seen on IA-64.
-
- The macros FLOAT_WORDS_BIG_ENDIAN, HOST_FLOAT_WORDS_BIG_ENDIAN,
- contributed by Richard Earnshaw <Richard.Earnshaw@cl.cam.ac.uk>,
- separate the floating point unit's endian-ness from that of
- the integer addressing. This permits one to define a big-endian
- FPU on a little-endian machine (e.g., ARM). An extension to
- BYTES_BIG_ENDIAN may be required for some machines in the future.
- These optional macros may be defined in tm.h. In real.h, they
- default to WORDS_BIG_ENDIAN, etc., so there is no need to define
- them for any normal host or target machine on which the floats
- and the integers have the same endian-ness. */
-
-
-/* The following converts gcc macros into the ones used by this file. */
-
-#if TARGET_FLOAT_FORMAT == VAX_FLOAT_FORMAT
-/* PDP-11, Pro350, VAX: */
-#define DEC 1
-#else /* it's not VAX */
-#if TARGET_FLOAT_FORMAT == IBM_FLOAT_FORMAT
-/* IBM System/370 style */
-#define IBM 1
-#else /* it's also not an IBM */
-#if TARGET_FLOAT_FORMAT == C4X_FLOAT_FORMAT
-/* TMS320C3x/C4x style */
-#define C4X 1
-#else /* it's also not a C4X */
-#if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
-#define IEEE
-#else /* it's not IEEE either */
-/* UNKnown arithmetic. We don't support this and can't go on. */
-unknown arithmetic type
-#define UNK 1
-#endif /* not IEEE */
-#endif /* not C4X */
-#endif /* not IBM */
-#endif /* not VAX */
-
-#define REAL_WORDS_BIG_ENDIAN FLOAT_WORDS_BIG_ENDIAN
-
-/* Make sure that the endianness is correct for IBM and DEC. */
-#if defined(DEC)
-#undef LARGEST_EXPONENT_IS_NORMAL
-#define LARGEST_EXPONENT_IS_NORMAL(x) 1
-#undef REAL_WORDS_BIG_ENDIAN
-/* Strangely enough, DEC float most closely resembles big endian IEEE */
-#define REAL_WORDS_BIG_ENDIAN 1
-/* ... but the halfwords are reversed from IEEE big endian. */
-#ifndef VAX_HALFWORD_ORDER
-#define VAX_HALFWORD_ORDER 1
-#endif
-#else
-#if defined(IBM) && !REAL_WORDS_BIG_ENDIAN
- #error "Little-endian representations are not supported for IBM."
-#endif
-#endif
-
-#if defined(DEC) && !defined (TARGET_G_FLOAT)
-#define TARGET_G_FLOAT 0
-#endif
-
-#ifndef VAX_HALFWORD_ORDER
-#define VAX_HALFWORD_ORDER 0
-#endif
-
-/* Define INFINITY for support of infinity.
- Define NANS for support of Not-a-Number's (NaN's). */
-#if !defined(DEC) && !defined(IBM) && !defined(C4X)
-#define INFINITY
-#define NANS
-#endif
-
-/* Support of NaNs requires support of infinity. */
-#ifdef NANS
-#ifndef INFINITY
-#define INFINITY
-#endif
-#endif
+/* The floating point model used internally is not exactly IEEE 754
+ compliant, and close to the description in the ISO C standard,
+ section 5.2.4.2.2 Characteristics of floating types.
+
+ Specifically
+
+ x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
+
+ where
+ s = sign (+- 1)
+ b = base or radix, here always 2
+ e = exponent
+ p = precision (the number of base-b digits in the significand)
+ f_k = the digits of the significand.
+
+ We differ from typical IEEE 754 encodings in that the entire
+ significand is fractional. Normalized significands are in the
+ range [0.5, 1.0).
+
+ A requirement of the model is that P be larger than than the
+ largest supported target floating-point type by at least 2 bits.
+ This gives us proper rounding when we truncate to the target type.
+ In addition, E must be large enough to hold the smallest supported
+ denormal number in a normalized form.
+
+ Both of these requirements are easily satisfied. The largest target
+ significand is 113 bits; we store at least 160. The smallest
+ denormal number fits in 17 exponent bits; we store 29.
+
+ Note that the decimal string conversion routines are sensitive to
+ rounding error. Since the raw arithmetic routines do not themselves
+ have guard digits or rounding, the computation of 10**exp can
+ accumulate more than a few digits of error. The previous incarnation
+ of real.c successfully used a 144 bit fraction; given the current
+ layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
+
+ Target floating point models that use base 16 instead of base 2
+ (i.e. IBM 370), are handled during round_for_format, in which we
+ canonicalize the exponent to be a multiple of 4 (log2(16)), and
+ adjust the significand to match. */
+
+
+/* Used to classify two numbers simultaneously. */
+#define CLASS2(A, B) ((A) << 2 | (B))
+
+#if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
+ #error "Some constant folding done by hand to avoid shift count warnings"
+#endif
+
+static void get_zero PARAMS ((REAL_VALUE_TYPE *, int));
+static void get_canonical_qnan PARAMS ((REAL_VALUE_TYPE *, int));
+static void get_canonical_snan PARAMS ((REAL_VALUE_TYPE *, int));
+static void get_inf PARAMS ((REAL_VALUE_TYPE *, int));
+static void sticky_rshift_significand PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *,
+ unsigned int));
+static void rshift_significand PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *,
+ unsigned int));
+static void lshift_significand PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *,
+ unsigned int));
+static void lshift_significand_1 PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static bool add_significands PARAMS ((REAL_VALUE_TYPE *r,
+ const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static bool sub_significands PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static void neg_significand PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static int cmp_significands PARAMS ((const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static int cmp_significand_0 PARAMS ((const REAL_VALUE_TYPE *));
+static void set_significand_bit PARAMS ((REAL_VALUE_TYPE *, unsigned int));
+static void clear_significand_bit PARAMS ((REAL_VALUE_TYPE *, unsigned int));
+static bool test_significand_bit PARAMS ((REAL_VALUE_TYPE *, unsigned int));
+static void clear_significand_below PARAMS ((REAL_VALUE_TYPE *,
+ unsigned int));
+static bool div_significands PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static void normalize PARAMS ((REAL_VALUE_TYPE *));
+
+static void do_add PARAMS ((REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *, int));
+static void do_multiply PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static void do_divide PARAMS ((REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+static int do_compare PARAMS ((const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *, int));
+static void do_fix_trunc PARAMS ((REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *));
+
+static unsigned long rtd_divmod PARAMS ((REAL_VALUE_TYPE *,
+ REAL_VALUE_TYPE *));
+
+static const REAL_VALUE_TYPE * ten_to_ptwo PARAMS ((int));
+static const REAL_VALUE_TYPE * ten_to_mptwo PARAMS ((int));
+static const REAL_VALUE_TYPE * real_digit PARAMS ((int));
+static void times_pten PARAMS ((REAL_VALUE_TYPE *, int));
+
+static void round_for_format PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *));
-/* Find a host integer type that is at least 16 bits wide,
- and another type at least twice whatever that size is. */
-
-#if HOST_BITS_PER_CHAR >= 16
-#define EMUSHORT char
-#define EMUSHORT_SIZE HOST_BITS_PER_CHAR
-#define EMULONG_SIZE (2 * HOST_BITS_PER_CHAR)
-#else
-#if HOST_BITS_PER_SHORT >= 16
-#define EMUSHORT short
-#define EMUSHORT_SIZE HOST_BITS_PER_SHORT
-#define EMULONG_SIZE (2 * HOST_BITS_PER_SHORT)
-#else
-#if HOST_BITS_PER_INT >= 16
-#define EMUSHORT int
-#define EMUSHORT_SIZE HOST_BITS_PER_INT
-#define EMULONG_SIZE (2 * HOST_BITS_PER_INT)
-#else
-#if HOST_BITS_PER_LONG >= 16
-#define EMUSHORT long
-#define EMUSHORT_SIZE HOST_BITS_PER_LONG
-#define EMULONG_SIZE (2 * HOST_BITS_PER_LONG)
-#else
- #error "You will have to modify this program to have a smaller unit size."
-#endif
-#endif
-#endif
-#endif
-
-/* If no 16-bit type has been found and the compiler is GCC, try HImode. */
-#if defined(__GNUC__) && EMUSHORT_SIZE != 16
-typedef int HItype __attribute__ ((mode (HI)));
-typedef unsigned int UHItype __attribute__ ((mode (HI)));
-#undef EMUSHORT
-#undef EMUSHORT_SIZE
-#undef EMULONG_SIZE
-#define EMUSHORT HItype
-#define UEMUSHORT UHItype
-#define EMUSHORT_SIZE 16
-#define EMULONG_SIZE 32
-#else
-#define UEMUSHORT unsigned EMUSHORT
-#endif
-
-#if HOST_BITS_PER_SHORT >= EMULONG_SIZE
-#define EMULONG short
-#else
-#if HOST_BITS_PER_INT >= EMULONG_SIZE
-#define EMULONG int
-#else
-#if HOST_BITS_PER_LONG >= EMULONG_SIZE
-#define EMULONG long
-#else
-#if HOST_BITS_PER_LONGLONG >= EMULONG_SIZE
-#define EMULONG long long int
-#else
- #error "You will have to modify this program to have a smaller unit size."
-#endif
-#endif
-#endif
-#endif
-
-#if EMUSHORT_SIZE != 16
- #error "The host interface doesn't work if no 16-bit size exists."
-#endif
-
-/* Calculate the size of the generic "e" type. This always has
- identical in-memory size to REAL_VALUE_TYPE. The sizes are supposed
- to be the same as well, but when REAL_VALUE_TYPE_SIZE is not evenly
- divisible by HOST_BITS_PER_WIDE_INT we have some padding in
- REAL_VALUE_TYPE.
- There are only two supported sizes: ten and six 16-bit words (160
- or 96 bits). */
-
-#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && !INTEL_EXTENDED_IEEE_FORMAT
-/* TFmode */
-# define NE 10
-# define MAXDECEXP 4932
-# define MINDECEXP -4977
-#else
-# define NE 6
-# define MAXDECEXP 4932
-# define MINDECEXP -4956
-#endif
-
-/* Fail compilation if 2*NE is not the appropriate size.
- If HOST_BITS_PER_WIDE_INT is 64, we're going to have padding
- at the end of the array, because neither 96 nor 160 is
- evenly divisible by 64. */
-struct compile_test_dummy {
- char twice_NE_must_equal_sizeof_REAL_VALUE_TYPE
- [(sizeof (REAL_VALUE_TYPE) >= 2*NE) ? 1 : -1];
-};
+/* Initialize R with a positive zero. */
-/* Construct macros to translate between REAL_VALUE_TYPE and e type.
- In GET_REAL and PUT_REAL, r and e are pointers.
- A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations
- in memory, with no holes. */
-#define GET_REAL(r, e) memcpy ((e), (r), 2*NE)
-#define PUT_REAL(e, r) \
- do { \
- memcpy (r, e, 2*NE); \
- if (2*NE < sizeof (*r)) \
- memset ((char *) (r) + 2*NE, 0, sizeof (*r) - 2*NE); \
- } while (0)
-
-/* Number of 16 bit words in internal format */
-#define NI (NE+3)
-
-/* Array offset to exponent */
-#define E 1
-
-/* Array offset to high guard word */
-#define M 2
-
-/* Number of bits of precision */
-#define NBITS ((NI-4)*16)
-
-/* Maximum number of decimal digits in ASCII conversion
- * = NBITS*log10(2)
- */
-#define NDEC (NBITS*8/27)
-
-/* The exponent of 1.0 */
-#define EXONE (0x3fff)
-
-#if defined(HOST_EBCDIC)
-/* bit 8 is significant in EBCDIC */
-#define CHARMASK 0xff
-#else
-#define CHARMASK 0x7f
-#endif
-
-/* Information about the various IEEE precisions. At the moment, we only
- support exponents of 15 bits or less. */
-struct ieee_format
-{
- /* Precision. */
- int precision;
-
- /* Size of the exponent in bits. */
- int expbits;
-
- /* Overall size of the value in bits. */
- int bits;
-
- /* Mode used for representing the value. */
- enum machine_mode mode;
-
- /* Exponent adjustment for offsets. */
- EMULONG adjustment;
-};
-
-#ifdef IEEE
-/* IEEE float (24 bits). */
-static const struct ieee_format ieee_24 =
-{
- 24,
- 8,
- 32,
- SFmode,
- EXONE - 0x7f
-};
-
-/* IEEE double (53 bits). */
-static const struct ieee_format ieee_53 =
-{
- 53,
- 11,
- 64,
- DFmode,
- EXONE - 0x3ff
-};
-
-#endif /* IEEE */
-
-/* IEEE extended double (64 bits). */
-static const struct ieee_format ieee_64 =
+static inline void
+get_zero (r, sign)
+ REAL_VALUE_TYPE *r;
+ int sign;
{
- 64,
- 15,
- 80,
- XFmode,
- 0
-};
+ memset (r, 0, sizeof (*r));
+ r->sign = sign;
+}
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-/* IEEE long double (113 bits). */
-static const struct ieee_format ieee_113 =
-{
- 113,
- 15,
- 128,
- TFmode,
- 0
-};
-#endif /* INTEL_EXTENDED_IEEE_FORMAT == 0 */
+/* Initialize R with the canonical quiet NaN. */
-#ifdef DEC
-/* DEC F float (24 bits). */
-static const struct ieee_format dec_f =
+static inline void
+get_canonical_qnan (r, sign)
+ REAL_VALUE_TYPE *r;
+ int sign;
{
- 24,
- 8,
- 32,
- SFmode,
- EXONE - 0201
-};
+ memset (r, 0, sizeof (*r));
+ r->class = rvc_nan;
+ r->sign = sign;
+ r->sig[SIGSZ-1] = SIG_MSB >> 1;
+}
-/* DEC D float (56 bits). */
-static const struct ieee_format dec_d =
+static inline void
+get_canonical_snan (r, sign)
+ REAL_VALUE_TYPE *r;
+ int sign;
{
- 56,
- 8,
- 64,
- DFmode,
- EXONE - 0201
-};
+ memset (r, 0, sizeof (*r));
+ r->class = rvc_nan;
+ r->sign = sign;
+ r->sig[SIGSZ-1] = SIG_MSB >> 2;
+}
-/* DEC G float (53 bits). */
-static const struct ieee_format dec_g =
+static inline void
+get_inf (r, sign)
+ REAL_VALUE_TYPE *r;
+ int sign;
{
- 53,
- 11,
- 64,
- DFmode,
- EXONE - 1025
-};
+ memset (r, 0, sizeof (*r));
+ r->class = rvc_inf;
+ r->sign = sign;
+}
-#if 0
-/* DEC H float (113 bits). (not yet used) */
-static const struct ieee_format dec_h =
-{
- 113,
- 15,
- 128,
- TFmode,
- EXONE - 16385
-};
-#endif
-#endif /* DEC */
-
-extern int extra_warnings;
-extern const UEMUSHORT ezero[NE], ehalf[NE], eone[NE], etwo[NE];
-extern const UEMUSHORT elog2[NE], esqrt2[NE];
-
-static void endian PARAMS ((const UEMUSHORT *, long *,
- enum machine_mode));
-static void eclear PARAMS ((UEMUSHORT *));
-static void emov PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#if 0
-static void eabs PARAMS ((UEMUSHORT *));
-#endif
-static void eneg PARAMS ((UEMUSHORT *));
-static int eisneg PARAMS ((const UEMUSHORT *));
-static int eisinf PARAMS ((const UEMUSHORT *));
-static int eisnan PARAMS ((const UEMUSHORT *));
-static void einfin PARAMS ((UEMUSHORT *));
-#ifdef NANS
-static void enan PARAMS ((UEMUSHORT *, int));
-static void einan PARAMS ((UEMUSHORT *));
-static int eiisnan PARAMS ((const UEMUSHORT *));
-static void make_nan PARAMS ((UEMUSHORT *, int, enum machine_mode));
-#endif
-static int eiisneg PARAMS ((const UEMUSHORT *));
-static void saturate PARAMS ((UEMUSHORT *, int, int, int));
-static void emovi PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void emovo PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void ecleaz PARAMS ((UEMUSHORT *));
-static void ecleazs PARAMS ((UEMUSHORT *));
-static void emovz PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#if 0
-static void eiinfin PARAMS ((UEMUSHORT *));
-#endif
-#ifdef INFINITY
-static int eiisinf PARAMS ((const UEMUSHORT *));
-#endif
-static int ecmpm PARAMS ((const UEMUSHORT *, const UEMUSHORT *));
-static void eshdn1 PARAMS ((UEMUSHORT *));
-static void eshup1 PARAMS ((UEMUSHORT *));
-static void eshdn8 PARAMS ((UEMUSHORT *));
-static void eshup8 PARAMS ((UEMUSHORT *));
-static void eshup6 PARAMS ((UEMUSHORT *));
-static void eshdn6 PARAMS ((UEMUSHORT *));
-static void eaddm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void esubm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void m16m PARAMS ((unsigned int, const UEMUSHORT *, UEMUSHORT *));
-static int edivm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static int emulm PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void emdnorm PARAMS ((UEMUSHORT *, int, int, EMULONG, int));
-static void esub PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
- UEMUSHORT *));
-static void eadd PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
- UEMUSHORT *));
-static void eadd1 PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
- UEMUSHORT *));
-static void ediv PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
- UEMUSHORT *));
-static void emul PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
- UEMUSHORT *));
-static void e53toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void e64toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-static void e113toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#endif
-static void e24toe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-static void etoe113 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void toe113 PARAMS ((UEMUSHORT *, UEMUSHORT *));
-#endif
-static void etoe64 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void toe64 PARAMS ((UEMUSHORT *, UEMUSHORT *));
-static void etoe53 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void toe53 PARAMS ((UEMUSHORT *, UEMUSHORT *));
-static void etoe24 PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void toe24 PARAMS ((UEMUSHORT *, UEMUSHORT *));
-static void ieeetoe PARAMS ((const UEMUSHORT *, UEMUSHORT *,
- const struct ieee_format *));
-static void etoieee PARAMS ((const UEMUSHORT *, UEMUSHORT *,
- const struct ieee_format *));
-static void toieee PARAMS ((UEMUSHORT *, UEMUSHORT *,
- const struct ieee_format *));
-static int ecmp PARAMS ((const UEMUSHORT *, const UEMUSHORT *));
-#if 0
-static void eround PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#endif
-static void ltoe PARAMS ((const HOST_WIDE_INT *, UEMUSHORT *));
-static void ultoe PARAMS ((const unsigned HOST_WIDE_INT *, UEMUSHORT *));
-static void eifrac PARAMS ((const UEMUSHORT *, HOST_WIDE_INT *,
- UEMUSHORT *));
-static void euifrac PARAMS ((const UEMUSHORT *, unsigned HOST_WIDE_INT *,
- UEMUSHORT *));
-static int eshift PARAMS ((UEMUSHORT *, int));
-static int enormlz PARAMS ((UEMUSHORT *));
-#if 0
-static void e24toasc PARAMS ((const UEMUSHORT *, char *, int));
-static void e53toasc PARAMS ((const UEMUSHORT *, char *, int));
-static void e64toasc PARAMS ((const UEMUSHORT *, char *, int));
-static void e113toasc PARAMS ((const UEMUSHORT *, char *, int));
-#endif /* 0 */
-static void etoasc PARAMS ((const UEMUSHORT *, char *, int));
-static void asctoe24 PARAMS ((const char *, UEMUSHORT *));
-static void asctoe53 PARAMS ((const char *, UEMUSHORT *));
-static void asctoe64 PARAMS ((const char *, UEMUSHORT *));
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-static void asctoe113 PARAMS ((const char *, UEMUSHORT *));
-#endif
-static void asctoe PARAMS ((const char *, UEMUSHORT *));
-static void asctoeg PARAMS ((const char *, UEMUSHORT *, int));
-static void efloor PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#if 0
-static void efrexp PARAMS ((const UEMUSHORT *, int *,
- UEMUSHORT *));
-#endif
-static void eldexp PARAMS ((const UEMUSHORT *, int, UEMUSHORT *));
-#if 0
-static void eremain PARAMS ((const UEMUSHORT *, const UEMUSHORT *,
- UEMUSHORT *));
-#endif
-static void eiremain PARAMS ((UEMUSHORT *, UEMUSHORT *));
-static void mtherr PARAMS ((const char *, int));
-#ifdef DEC
-static void dectoe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void etodec PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void todec PARAMS ((UEMUSHORT *, UEMUSHORT *));
-#endif
-#ifdef IBM
-static void ibmtoe PARAMS ((const UEMUSHORT *, UEMUSHORT *,
- enum machine_mode));
-static void etoibm PARAMS ((const UEMUSHORT *, UEMUSHORT *,
- enum machine_mode));
-static void toibm PARAMS ((UEMUSHORT *, UEMUSHORT *,
- enum machine_mode));
-#endif
-#ifdef C4X
-static void c4xtoe PARAMS ((const UEMUSHORT *, UEMUSHORT *,
- enum machine_mode));
-static void etoc4x PARAMS ((const UEMUSHORT *, UEMUSHORT *,
- enum machine_mode));
-static void toc4x PARAMS ((UEMUSHORT *, UEMUSHORT *,
- enum machine_mode));
-#endif
-#if 0
-static void uditoe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void ditoe PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void etoudi PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void etodi PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-static void esqrt PARAMS ((const UEMUSHORT *, UEMUSHORT *));
-#endif
-/* Copy 32-bit numbers obtained from array containing 16-bit numbers,
- swapping ends if required, into output array of longs. The
- result is normally passed to fprintf by the ASM_OUTPUT_ macros. */
+/* Right-shift the significand of A by N bits; put the result in the
+ significand of R. If any one bits are shifted out, set the least
+ significant bit of R. */
static void
-endian (e, x, mode)
- const UEMUSHORT e[];
- long x[];
- enum machine_mode mode;
+sticky_rshift_significand (r, a, n)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a;
+ unsigned int n;
{
- unsigned long th, t;
+ unsigned long sticky = 0;
+ unsigned int i, ofs = 0;
- if (REAL_WORDS_BIG_ENDIAN && !VAX_HALFWORD_ORDER)
+ if (n >= HOST_BITS_PER_LONG)
{
- switch (mode)
- {
- case TFmode:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- /* Swap halfwords in the fourth long. */
- th = (unsigned long) e[6] & 0xffff;
- t = (unsigned long) e[7] & 0xffff;
- t |= th << 16;
- x[3] = (long) t;
-#else
- x[3] = 0;
-#endif
- /* FALLTHRU */
-
- case XFmode:
- /* Swap halfwords in the third long. */
- th = (unsigned long) e[4] & 0xffff;
- t = (unsigned long) e[5] & 0xffff;
- t |= th << 16;
- x[2] = (long) t;
- /* FALLTHRU */
-
- case DFmode:
- /* Swap halfwords in the second word. */
- th = (unsigned long) e[2] & 0xffff;
- t = (unsigned long) e[3] & 0xffff;
- t |= th << 16;
- x[1] = (long) t;
- /* FALLTHRU */
-
- case SFmode:
- case HFmode:
- /* Swap halfwords in the first word. */
- th = (unsigned long) e[0] & 0xffff;
- t = (unsigned long) e[1] & 0xffff;
- t |= th << 16;
- x[0] = (long) t;
- break;
+ for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
+ sticky |= a->sig[i];
+ n &= HOST_BITS_PER_LONG - 1;
+ }
- default:
- abort ();
+ if (n != 0)
+ {
+ sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
+ for (i = 0; i < SIGSZ; ++i)
+ {
+ r->sig[i]
+ = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
+ | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
+ << (HOST_BITS_PER_LONG - n)));
}
}
else
{
- /* Pack the output array without swapping. */
-
- switch (mode)
- {
- case TFmode:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- /* Pack the fourth long. */
- th = (unsigned long) e[7] & 0xffff;
- t = (unsigned long) e[6] & 0xffff;
- t |= th << 16;
- x[3] = (long) t;
-#else
- x[3] = 0;
-#endif
- /* FALLTHRU */
-
- case XFmode:
- /* Pack the third long.
- Each element of the input REAL_VALUE_TYPE array has 16 useful bits
- in it. */
- th = (unsigned long) e[5] & 0xffff;
- t = (unsigned long) e[4] & 0xffff;
- t |= th << 16;
- x[2] = (long) t;
- /* FALLTHRU */
-
- case DFmode:
- /* Pack the second long */
- th = (unsigned long) e[3] & 0xffff;
- t = (unsigned long) e[2] & 0xffff;
- t |= th << 16;
- x[1] = (long) t;
- /* FALLTHRU */
-
- case SFmode:
- case HFmode:
- /* Pack the first long */
- th = (unsigned long) e[1] & 0xffff;
- t = (unsigned long) e[0] & 0xffff;
- t |= th << 16;
- x[0] = (long) t;
- break;
-
- default:
- abort ();
- }
+ for (i = 0; ofs + i < SIGSZ; ++i)
+ r->sig[i] = a->sig[ofs + i];
+ for (; i < SIGSZ; ++i)
+ r->sig[i] = 0;
}
-}
+ r->sig[0] |= (sticky != 0);
+}
-/* This is the implementation of the REAL_ARITHMETIC macro. */
+/* Right-shift the significand of A by N bits; put the result in the
+ significand of R. */
-void
-earith (value, icode, r1, r2)
- REAL_VALUE_TYPE *value;
- int icode;
- REAL_VALUE_TYPE *r1;
- REAL_VALUE_TYPE *r2;
+static void
+rshift_significand (r, a, n)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a;
+ unsigned int n;
{
- UEMUSHORT d1[NE], d2[NE], v[NE];
- enum tree_code code;
-
- GET_REAL (r1, d1);
- GET_REAL (r2, d2);
-#ifdef NANS
-/* Return NaN input back to the caller. */
- if (eisnan (d1))
- {
- PUT_REAL (d1, value);
- return;
- }
- if (eisnan (d2))
+ unsigned int i, ofs = n / HOST_BITS_PER_LONG;
+
+ n &= HOST_BITS_PER_LONG - 1;
+ if (n != 0)
{
- PUT_REAL (d2, value);
- return;
+ for (i = 0; i < SIGSZ; ++i)
+ {
+ r->sig[i]
+ = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
+ | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
+ << (HOST_BITS_PER_LONG - n)));
+ }
}
-#endif
- code = (enum tree_code) icode;
- switch (code)
+ else
{
- case PLUS_EXPR:
- eadd (d2, d1, v);
- break;
-
- case MINUS_EXPR:
- esub (d2, d1, v); /* d1 - d2 */
- break;
-
- case MULT_EXPR:
- emul (d2, d1, v);
- break;
-
- case RDIV_EXPR:
-#ifndef INFINITY
- if (ecmp (d2, ezero) == 0)
- abort ();
-#endif
- ediv (d2, d1, v); /* d1/d2 */
- break;
-
- case MIN_EXPR: /* min (d1,d2) */
- if (ecmp (d1, d2) < 0)
- emov (d1, v);
- else
- emov (d2, v);
- break;
-
- case MAX_EXPR: /* max (d1,d2) */
- if (ecmp (d1, d2) > 0)
- emov (d1, v);
- else
- emov (d2, v);
- break;
- default:
- emov (ezero, v);
- break;
+ for (i = 0; ofs + i < SIGSZ; ++i)
+ r->sig[i] = a->sig[ofs + i];
+ for (; i < SIGSZ; ++i)
+ r->sig[i] = 0;
}
-PUT_REAL (v, value);
}
+/* Left-shift the significand of A by N bits; put the result in the
+ significand of R. */
-/* Truncate REAL_VALUE_TYPE toward zero to signed HOST_WIDE_INT.
- implements REAL_VALUE_RNDZINT (x) (etrunci (x)). */
-
-REAL_VALUE_TYPE
-etrunci (x)
- REAL_VALUE_TYPE x;
+static void
+lshift_significand (r, a, n)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a;
+ unsigned int n;
{
- UEMUSHORT f[NE], g[NE];
- REAL_VALUE_TYPE r;
- HOST_WIDE_INT l;
+ unsigned int i, ofs = n / HOST_BITS_PER_LONG;
- GET_REAL (&x, g);
-#ifdef NANS
- if (eisnan (g))
- return (x);
-#endif
- eifrac (g, &l, f);
- ltoe (&l, g);
- PUT_REAL (g, &r);
- return (r);
+ n &= HOST_BITS_PER_LONG - 1;
+ if (n == 0)
+ {
+ for (i = 0; ofs + i < SIGSZ; ++i)
+ r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
+ for (; i < SIGSZ; ++i)
+ r->sig[SIGSZ-1-i] = 0;
+ }
+ else
+ for (i = 0; i < SIGSZ; ++i)
+ {
+ r->sig[SIGSZ-1-i]
+ = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
+ | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
+ >> (HOST_BITS_PER_LONG - n)));
+ }
}
+/* Likewise, but N is specialized to 1. */
-/* Truncate REAL_VALUE_TYPE toward zero to unsigned HOST_WIDE_INT;
- implements REAL_VALUE_UNSIGNED_RNDZINT (x) (etruncui (x)). */
-
-REAL_VALUE_TYPE
-etruncui (x)
- REAL_VALUE_TYPE x;
+static inline void
+lshift_significand_1 (r, a)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a;
{
- UEMUSHORT f[NE], g[NE];
- REAL_VALUE_TYPE r;
- unsigned HOST_WIDE_INT l;
+ unsigned int i;
- GET_REAL (&x, g);
-#ifdef NANS
- if (eisnan (g))
- return (x);
-#endif
- euifrac (g, &l, f);
- ultoe (&l, g);
- PUT_REAL (g, &r);
- return (r);
+ for (i = SIGSZ - 1; i > 0; --i)
+ r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
+ r->sig[0] = a->sig[0] << 1;
}
+/* Add the significands of A and B, placing the result in R. Return
+ true if there was carry out of the most significant word. */
-/* This is the REAL_VALUE_ATOF function. It converts a decimal or hexadecimal
- string to binary, rounding off as indicated by the machine_mode argument.
- Then it promotes the rounded value to REAL_VALUE_TYPE. */
-
-REAL_VALUE_TYPE
-ereal_atof (s, t)
- const char *s;
- enum machine_mode t;
+static inline bool
+add_significands (r, a, b)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a, *b;
{
- UEMUSHORT tem[NE], e[NE];
- REAL_VALUE_TYPE r;
+ bool carry = false;
+ int i;
- switch (t)
+ for (i = 0; i < SIGSZ; ++i)
{
-#ifdef C4X
- case QFmode:
- case HFmode:
- asctoe53 (s, tem);
- e53toe (tem, e);
- break;
-#else
- case HFmode:
-#endif
-
- case SFmode:
- asctoe24 (s, tem);
- e24toe (tem, e);
- break;
-
- case DFmode:
- asctoe53 (s, tem);
- e53toe (tem, e);
- break;
-
- case TFmode:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- asctoe113 (s, tem);
- e113toe (tem, e);
- break;
-#endif
- /* FALLTHRU */
+ unsigned long ai = a->sig[i];
+ unsigned long ri = ai + b->sig[i];
- case XFmode:
- asctoe64 (s, tem);
- e64toe (tem, e);
- break;
+ if (carry)
+ {
+ carry = ri < ai;
+ carry |= ++ri == 0;
+ }
+ else
+ carry = ri < ai;
- default:
- asctoe (s, e);
+ r->sig[i] = ri;
}
- PUT_REAL (e, &r);
- return (r);
-}
-
-
-/* Expansion of REAL_NEGATE. */
-
-REAL_VALUE_TYPE
-ereal_negate (x)
- REAL_VALUE_TYPE x;
-{
- UEMUSHORT e[NE];
- REAL_VALUE_TYPE r;
- GET_REAL (&x, e);
- eneg (e);
- PUT_REAL (e, &r);
- return (r);
+ return carry;
}
+/* Subtract the significands of A and B, placing the result in R.
+ Return true if there was carry out of the most significant word. */
-/* Round real toward zero to HOST_WIDE_INT;
- implements REAL_VALUE_FIX (x). */
-
-HOST_WIDE_INT
-efixi (x)
- REAL_VALUE_TYPE x;
+static inline bool
+sub_significands (r, a, b)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a, *b;
{
- UEMUSHORT f[NE], g[NE];
- HOST_WIDE_INT l;
+ bool carry = false;
+ int i;
- GET_REAL (&x, f);
-#ifdef NANS
- if (eisnan (f))
+ for (i = 0; i < SIGSZ; ++i)
{
- warning ("conversion from NaN to int");
- return (-1);
- }
-#endif
- eifrac (f, &l, g);
- return l;
-}
-
-/* Round real toward zero to unsigned HOST_WIDE_INT
- implements REAL_VALUE_UNSIGNED_FIX (x).
- Negative input returns zero. */
+ unsigned long ai = a->sig[i];
+ unsigned long ri = ai - b->sig[i];
-unsigned HOST_WIDE_INT
-efixui (x)
- REAL_VALUE_TYPE x;
-{
- UEMUSHORT f[NE], g[NE];
- unsigned HOST_WIDE_INT l;
+ if (carry)
+ {
+ carry = ri > ai;
+ carry |= ~--ri == 0;
+ }
+ else
+ carry = ri > ai;
- GET_REAL (&x, f);
-#ifdef NANS
- if (eisnan (f))
- {
- warning ("conversion from NaN to unsigned int");
- return (-1);
+ r->sig[i] = ri;
}
-#endif
- euifrac (f, &l, g);
- return l;
-}
+ return carry;
+}
-/* REAL_VALUE_FROM_INT macro. */
+/* Negate the significand A, placing the result in R. */
-void
-ereal_from_int (d, i, j, mode)
- REAL_VALUE_TYPE *d;
- HOST_WIDE_INT i, j;
- enum machine_mode mode;
+static inline void
+neg_significand (r, a)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a;
{
- UEMUSHORT df[NE], dg[NE];
- HOST_WIDE_INT low, high;
- int sign;
+ bool carry = true;
+ int i;
- if (GET_MODE_CLASS (mode) != MODE_FLOAT)
- abort ();
- sign = 0;
- low = i;
- if ((high = j) < 0)
+ for (i = 0; i < SIGSZ; ++i)
{
- sign = 1;
- /* complement and add 1 */
- high = ~high;
- if (low)
- low = -low;
+ unsigned long ri, ai = a->sig[i];
+
+ if (carry)
+ {
+ if (ai)
+ {
+ ri = -ai;
+ carry = false;
+ }
+ else
+ ri = ai;
+ }
else
- high += 1;
- }
- eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
- ultoe ((unsigned HOST_WIDE_INT *) &high, dg);
- emul (dg, df, dg);
- ultoe ((unsigned HOST_WIDE_INT *) &low, df);
- eadd (df, dg, dg);
- if (sign)
- eneg (dg);
+ ri = ~ai;
- /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
- Avoid double-rounding errors later by rounding off now from the
- extra-wide internal format to the requested precision. */
- switch (GET_MODE_BITSIZE (mode))
- {
- case 32:
- etoe24 (dg, df);
- e24toe (df, dg);
- break;
+ r->sig[i] = ri;
+ }
+}
- case 64:
- etoe53 (dg, df);
- e53toe (df, dg);
- break;
+/* Compare significands. Return tri-state vs zero. */
- case 96:
- etoe64 (dg, df);
- e64toe (df, dg);
- break;
+static inline int
+cmp_significands (a, b)
+ const REAL_VALUE_TYPE *a, *b;
+{
+ int i;
- case 128:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- etoe113 (dg, df);
- e113toe (df, dg);
-#else
- etoe64 (dg, df);
- e64toe (df, dg);
-#endif
- break;
+ for (i = SIGSZ - 1; i >= 0; --i)
+ {
+ unsigned long ai = a->sig[i];
+ unsigned long bi = b->sig[i];
- default:
- abort ();
- }
+ if (ai > bi)
+ return 1;
+ if (ai < bi)
+ return -1;
+ }
- PUT_REAL (dg, d);
+ return 0;
}
+/* Return true if A is non-zero. */
-/* REAL_VALUE_FROM_UNSIGNED_INT macro. */
-
-void
-ereal_from_uint (d, i, j, mode)
- REAL_VALUE_TYPE *d;
- unsigned HOST_WIDE_INT i, j;
- enum machine_mode mode;
+static inline int
+cmp_significand_0 (a)
+ const REAL_VALUE_TYPE *a;
{
- UEMUSHORT df[NE], dg[NE];
- unsigned HOST_WIDE_INT low, high;
-
- if (GET_MODE_CLASS (mode) != MODE_FLOAT)
- abort ();
- low = i;
- high = j;
- eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
- ultoe (&high, dg);
- emul (dg, df, dg);
- ultoe (&low, df);
- eadd (df, dg, dg);
-
- /* A REAL_VALUE_TYPE may not be wide enough to hold the two HOST_WIDE_INTS.
- Avoid double-rounding errors later by rounding off now from the
- extra-wide internal format to the requested precision. */
- switch (GET_MODE_BITSIZE (mode))
- {
- case 32:
- etoe24 (dg, df);
- e24toe (df, dg);
- break;
-
- case 64:
- etoe53 (dg, df);
- e53toe (df, dg);
- break;
+ int i;
- case 96:
- etoe64 (dg, df);
- e64toe (df, dg);
- break;
+ for (i = SIGSZ - 1; i >= 0; --i)
+ if (a->sig[i])
+ return 1;
- case 128:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- etoe113 (dg, df);
- e113toe (df, dg);
-#else
- etoe64 (dg, df);
- e64toe (df, dg);
-#endif
- break;
+ return 0;
+}
- default:
- abort ();
- }
+/* Set bit N of the significand of R. */
- PUT_REAL (dg, d);
+static inline void
+set_significand_bit (r, n)
+ REAL_VALUE_TYPE *r;
+ unsigned int n;
+{
+ r->sig[n / HOST_BITS_PER_LONG]
+ |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
}
+/* Clear bit N of the significand of R. */
-/* REAL_VALUE_TO_INT macro. */
-
-void
-ereal_to_int (low, high, rr)
- HOST_WIDE_INT *low, *high;
- REAL_VALUE_TYPE rr;
+static inline void
+clear_significand_bit (r, n)
+ REAL_VALUE_TYPE *r;
+ unsigned int n;
{
- UEMUSHORT d[NE], df[NE], dg[NE], dh[NE];
- int s;
-
- GET_REAL (&rr, d);
-#ifdef NANS
- if (eisnan (d))
- {
- warning ("conversion from NaN to int");
- *low = -1;
- *high = -1;
- return;
- }
-#endif
- /* convert positive value */
- s = 0;
- if (eisneg (d))
- {
- eneg (d);
- s = 1;
- }
- eldexp (eone, HOST_BITS_PER_WIDE_INT, df);
- ediv (df, d, dg); /* dg = d / 2^32 is the high word */
- euifrac (dg, (unsigned HOST_WIDE_INT *) high, dh);
- emul (df, dh, dg); /* fractional part is the low word */
- euifrac (dg, (unsigned HOST_WIDE_INT *) low, dh);
- if (s)
- {
- /* complement and add 1 */
- *high = ~(*high);
- if (*low)
- *low = -(*low);
- else
- *high += 1;
- }
+ r->sig[n / HOST_BITS_PER_LONG]
+ &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
}
+/* Test bit N of the significand of R. */
-/* REAL_VALUE_LDEXP macro. */
-
-REAL_VALUE_TYPE
-ereal_ldexp (x, n)
- REAL_VALUE_TYPE x;
- int n;
+static inline bool
+test_significand_bit (r, n)
+ REAL_VALUE_TYPE *r;
+ unsigned int n;
{
- UEMUSHORT e[NE], y[NE];
- REAL_VALUE_TYPE r;
-
- GET_REAL (&x, e);
-#ifdef NANS
- if (eisnan (e))
- return (x);
-#endif
- eldexp (e, n, y);
- PUT_REAL (y, &r);
- return (r);
+ /* ??? Compiler bug here if we return this expression directly.
+ The conversion to bool strips the "&1" and we wind up testing
+ e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
+ int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
+ return t;
}
-/* Check for infinity in a REAL_VALUE_TYPE. */
+/* Clear bits 0..N-1 of the significand of R. */
-int
-target_isinf (x)
- REAL_VALUE_TYPE x ATTRIBUTE_UNUSED;
+static void
+clear_significand_below (r, n)
+ REAL_VALUE_TYPE *r;
+ unsigned int n;
{
-#ifdef INFINITY
- UEMUSHORT e[NE];
+ int i, w = n / HOST_BITS_PER_LONG;
- GET_REAL (&x, e);
- return (eisinf (e));
-#else
- return 0;
-#endif
+ for (i = 0; i < w; ++i)
+ r->sig[i] = 0;
+
+ r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
}
-/* Check whether a REAL_VALUE_TYPE item is a NaN. */
+/* Divide the significands of A and B, placing the result in R. Return
+ true if the division was inexact. */
-int
-target_isnan (x)
- REAL_VALUE_TYPE x ATTRIBUTE_UNUSED;
+static inline bool
+div_significands (r, a, b)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a, *b;
{
-#ifdef NANS
- UEMUSHORT e[NE];
+ REAL_VALUE_TYPE u;
+ int i, bit = SIGNIFICAND_BITS - 1;
+ unsigned long msb, inexact;
- GET_REAL (&x, e);
- return (eisnan (e));
-#else
- return (0);
-#endif
-}
+ u = *a;
+ memset (r->sig, 0, sizeof (r->sig));
+ msb = 0;
+ goto start;
+ do
+ {
+ msb = u.sig[SIGSZ-1] & SIG_MSB;
+ lshift_significand_1 (&u, &u);
+ start:
+ if (msb || cmp_significands (&u, b) >= 0)
+ {
+ sub_significands (&u, &u, b);
+ set_significand_bit (r, bit);
+ }
+ }
+ while (--bit >= 0);
-/* Check for a negative REAL_VALUE_TYPE number.
- This just checks the sign bit, so that -0 counts as negative. */
+ for (i = 0, inexact = 0; i < SIGSZ; i++)
+ inexact |= u.sig[i];
-int
-target_negative (x)
- REAL_VALUE_TYPE x;
-{
- return ereal_isneg (x);
+ return inexact != 0;
}
-/* Expansion of REAL_VALUE_TRUNCATE.
- The result is in floating point, rounded to nearest or even. */
+/* Adjust the exponent and significand of R such that the most
+ significant bit is set. We underflow to zero and overflow to
+ infinity here, without denormals. (The intermediate representation
+ exponent is large enough to handle target denormals normalized.) */
-REAL_VALUE_TYPE
-real_value_truncate (mode, arg)
- enum machine_mode mode;
- REAL_VALUE_TYPE arg;
+static void
+normalize (r)
+ REAL_VALUE_TYPE *r;
{
- UEMUSHORT e[NE], t[NE];
- REAL_VALUE_TYPE r;
-
- GET_REAL (&arg, e);
-#ifdef NANS
- if (eisnan (e))
- return (arg);
-#endif
- eclear (t);
- switch (mode)
- {
- case TFmode:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- etoe113 (e, t);
- e113toe (t, t);
- break;
-#endif
- /* FALLTHRU */
-
- case XFmode:
- etoe64 (e, t);
- e64toe (t, t);
- break;
+ int shift = 0, exp;
+ int i, j;
- case DFmode:
- etoe53 (e, t);
- e53toe (t, t);
+ /* Find the first word that is nonzero. */
+ for (i = SIGSZ - 1; i >= 0; i--)
+ if (r->sig[i] == 0)
+ shift += HOST_BITS_PER_LONG;
+ else
break;
- case SFmode:
-#ifndef C4X
- case HFmode:
-#endif
- etoe24 (e, t);
- e24toe (t, t);
- break;
+ /* Zero significand flushes to zero. */
+ if (i < 0)
+ {
+ r->class = rvc_zero;
+ r->exp = 0;
+ return;
+ }
-#ifdef C4X
- case HFmode:
- case QFmode:
- etoe53 (e, t);
- e53toe (t, t);
+ /* Find the first bit that is nonzero. */
+ for (j = 0; ; j++)
+ if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
break;
-#endif
-
- case SImode:
- r = etrunci (arg);
- return (r);
+ shift += j;
- /* If an unsupported type was requested, presume that
- the machine files know something useful to do with
- the unmodified value. */
-
- default:
- return (arg);
+ if (shift > 0)
+ {
+ exp = r->exp - shift;
+ if (exp > MAX_EXP)
+ get_inf (r, r->sign);
+ else if (exp < -MAX_EXP)
+ get_zero (r, r->sign);
+ else
+ {
+ r->exp = exp;
+ lshift_significand (r, r, shift);
+ }
}
- PUT_REAL (t, &r);
- return (r);
}
+
+/* Return R = A + (SUBTRACT_P ? -B : B). */
-/* Return true if ARG can be represented exactly in MODE. */
-
-bool
-exact_real_truncate (mode, arg)
- enum machine_mode mode;
- REAL_VALUE_TYPE *arg;
+static void
+do_add (r, a, b, subtract_p)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a, *b;
+ int subtract_p;
{
- REAL_VALUE_TYPE trunc;
+ int dexp, sign, exp;
+ REAL_VALUE_TYPE t;
- if (target_isnan (*arg))
- return false;
+ /* Determine if we need to add or subtract. */
+ sign = a->sign;
+ subtract_p = (sign ^ b->sign) ^ subtract_p;
- trunc = real_value_truncate (mode, *arg);
- return ereal_cmp (*arg, trunc) == 0;
-}
+ switch (CLASS2 (a->class, b->class))
+ {
+ case CLASS2 (rvc_zero, rvc_zero):
+ /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
+ get_zero (r, sign & !subtract_p);
+ return;
-/* Try to change R into its exact multiplicative inverse in machine mode
- MODE. Return nonzero function value if successful. */
+ case CLASS2 (rvc_zero, rvc_normal):
+ case CLASS2 (rvc_zero, rvc_inf):
+ case CLASS2 (rvc_zero, rvc_nan):
+ /* 0 + ANY = ANY. */
+ case CLASS2 (rvc_normal, rvc_nan):
+ case CLASS2 (rvc_inf, rvc_nan):
+ case CLASS2 (rvc_nan, rvc_nan):
+ /* ANY + NaN = NaN. */
+ case CLASS2 (rvc_normal, rvc_inf):
+ /* R + Inf = Inf. */
+ *r = *b;
+ r->sign = sign ^ subtract_p;
+ return;
-int
-exact_real_inverse (mode, r)
- enum machine_mode mode;
- REAL_VALUE_TYPE *r;
-{
- UEMUSHORT e[NE], einv[NE];
- REAL_VALUE_TYPE rinv;
- int i;
+ case CLASS2 (rvc_normal, rvc_zero):
+ case CLASS2 (rvc_inf, rvc_zero):
+ case CLASS2 (rvc_nan, rvc_zero):
+ /* ANY + 0 = ANY. */
+ case CLASS2 (rvc_nan, rvc_normal):
+ case CLASS2 (rvc_nan, rvc_inf):
+ /* NaN + ANY = NaN. */
+ case CLASS2 (rvc_inf, rvc_normal):
+ /* Inf + R = Inf. */
+ *r = *a;
+ return;
- GET_REAL (r, e);
+ case CLASS2 (rvc_inf, rvc_inf):
+ if (subtract_p)
+ /* Inf - Inf = NaN. */
+ get_canonical_qnan (r, 0);
+ else
+ /* Inf + Inf = Inf. */
+ *r = *a;
+ return;
- /* Test for input in range. Don't transform IEEE special values. */
- if (eisinf (e) || eisnan (e) || (ecmp (e, ezero) == 0))
- return 0;
+ case CLASS2 (rvc_normal, rvc_normal):
+ break;
- /* Test for a power of 2: all significand bits zero except the MSB.
- We are assuming the target has binary (or hex) arithmetic. */
- if (e[NE - 2] != 0x8000)
- return 0;
+ default:
+ abort ();
+ }
- for (i = 0; i < NE - 2; i++)
+ /* Swap the arguments such that A has the larger exponent. */
+ dexp = a->exp - b->exp;
+ if (dexp < 0)
{
- if (e[i] != 0)
- return 0;
+ const REAL_VALUE_TYPE *t;
+ t = a, a = b, b = t;
+ dexp = -dexp;
+ sign ^= subtract_p;
}
+ exp = a->exp;
- /* Compute the inverse and truncate it to the required mode. */
- ediv (e, eone, einv);
- PUT_REAL (einv, &rinv);
- rinv = real_value_truncate (mode, rinv);
-
-#ifdef CHECK_FLOAT_VALUE
- /* This check is not redundant. It may, for example, flush
- a supposedly IEEE denormal value to zero. */
- i = 0;
- if (CHECK_FLOAT_VALUE (mode, rinv, i))
- return 0;
-#endif
- GET_REAL (&rinv, einv);
+ /* If the exponents are not identical, we need to shift the
+ significand of B down. */
+ if (dexp > 0)
+ {
+ /* If the exponents are too far apart, the significands
+ do not overlap, which makes the subtraction a noop. */
+ if (dexp >= SIGNIFICAND_BITS)
+ {
+ *r = *a;
+ r->sign = sign;
+ return;
+ }
- /* Check the bits again, because the truncation might have
- generated an arbitrary saturation value on overflow. */
- if (einv[NE - 2] != 0x8000)
- return 0;
+ sticky_rshift_significand (&t, b, dexp);
+ b = &t;
+ }
- for (i = 0; i < NE - 2; i++)
+ if (subtract_p)
{
- if (einv[i] != 0)
- return 0;
+ if (sub_significands (r, a, b))
+ {
+ /* We got a borrow out of the subtraction. That means that
+ A and B had the same exponent, and B had the larger
+ significand. We need to swap the sign and negate the
+ significand. */
+ sign ^= 1;
+ neg_significand (r, r);
+ }
+ }
+ else
+ {
+ if (add_significands (r, a, b))
+ {
+ /* We got carry out of the addition. This means we need to
+ shift the significand back down one bit and increase the
+ exponent. */
+ sticky_rshift_significand (r, r, 1);
+ r->sig[SIGSZ-1] |= SIG_MSB;
+ if (++exp > MAX_EXP)
+ {
+ get_inf (r, sign);
+ return;
+ }
+ }
}
- /* Fail if the computed inverse is out of range. */
- if (eisinf (einv) || eisnan (einv) || (ecmp (einv, ezero) == 0))
- return 0;
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = exp;
- /* Output the reciprocal and return success flag. */
- PUT_REAL (einv, r);
- return 1;
+ /* Re-normalize the result. */
+ normalize (r);
+
+ /* Special case: if the subtraction results in zero, the result
+ is positive. */
+ if (r->class == rvc_zero)
+ r->sign = 0;
}
-/* Used for debugging--print the value of R in human-readable format
- on stderr. */
+/* Return R = A * B. */
-void
-debug_real (r)
- REAL_VALUE_TYPE r;
+static void
+do_multiply (r, a, b)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a, *b;
{
- char dstr[30];
-
- REAL_VALUE_TO_DECIMAL (r, "%.20g", dstr);
- fprintf (stderr, "%s", dstr);
-}
+ REAL_VALUE_TYPE u, t, *rr;
+ unsigned int i, j, k;
+ int sign = a->sign ^ b->sign;
-
-/* The following routines convert REAL_VALUE_TYPE to the various floating
- point formats that are meaningful to supported computers.
-
- The results are returned in 32-bit pieces, each piece stored in a `long'.
- This is so they can be printed by statements like
+ switch (CLASS2 (a->class, b->class))
+ {
+ case CLASS2 (rvc_zero, rvc_zero):
+ case CLASS2 (rvc_zero, rvc_normal):
+ case CLASS2 (rvc_normal, rvc_zero):
+ /* +-0 * ANY = 0 with appropriate sign. */
+ get_zero (r, sign);
+ return;
- fprintf (file, "%lx, %lx", L[0], L[1]);
+ case CLASS2 (rvc_zero, rvc_nan):
+ case CLASS2 (rvc_normal, rvc_nan):
+ case CLASS2 (rvc_inf, rvc_nan):
+ case CLASS2 (rvc_nan, rvc_nan):
+ /* ANY * NaN = NaN. */
+ *r = *b;
+ r->sign = sign;
+ return;
- that will work on both narrow- and wide-word host computers. */
+ case CLASS2 (rvc_nan, rvc_zero):
+ case CLASS2 (rvc_nan, rvc_normal):
+ case CLASS2 (rvc_nan, rvc_inf):
+ /* NaN * ANY = NaN. */
+ *r = *a;
+ r->sign = sign;
+ return;
-/* Convert R to a 128-bit long double precision value. The output array L
- contains four 32-bit pieces of the result, in the order they would appear
- in memory. */
+ case CLASS2 (rvc_zero, rvc_inf):
+ case CLASS2 (rvc_inf, rvc_zero):
+ /* 0 * Inf = NaN */
+ get_canonical_qnan (r, sign);
+ return;
-void
-etartdouble (r, l)
- REAL_VALUE_TYPE r;
- long l[];
-{
- UEMUSHORT e[NE];
+ case CLASS2 (rvc_inf, rvc_inf):
+ case CLASS2 (rvc_normal, rvc_inf):
+ case CLASS2 (rvc_inf, rvc_normal):
+ /* Inf * Inf = Inf, R * Inf = Inf */
+ overflow:
+ get_inf (r, sign);
+ return;
- GET_REAL (&r, e);
-#if INTEL_EXTENDED_IEEE_FORMAT == 0
- etoe113 (e, e);
-#else
- etoe64 (e, e);
-#endif
- endian (e, l, TFmode);
-}
+ case CLASS2 (rvc_normal, rvc_normal):
+ break;
-/* Convert R to a double extended precision value. The output array L
- contains three 32-bit pieces of the result, in the order they would
- appear in memory. */
+ default:
+ abort ();
+ }
-void
-etarldouble (r, l)
- REAL_VALUE_TYPE r;
- long l[];
-{
- UEMUSHORT e[NE];
+ if (r == a || r == b)
+ rr = &t;
+ else
+ rr = r;
+ get_zero (rr, 0);
- GET_REAL (&r, e);
- etoe64 (e, e);
- endian (e, l, XFmode);
-}
+ /* Collect all the partial products. Since we don't have sure access
+ to a widening multiply, we split each long into two half-words.
-/* Convert R to a double precision value. The output array L contains two
- 32-bit pieces of the result, in the order they would appear in memory. */
+ Consider the long-hand form of a four half-word multiplication:
-void
-etardouble (r, l)
- REAL_VALUE_TYPE r;
- long l[];
-{
- UEMUSHORT e[NE];
+ A B C D
+ * E F G H
+ --------------
+ DE DF DG DH
+ CE CF CG CH
+ BE BF BG BH
+ AE AF AG AH
- GET_REAL (&r, e);
- etoe53 (e, e);
- endian (e, l, DFmode);
-}
+ We construct partial products of the widened half-word products
+ that are known to not overlap, e.g. DF+DH. Each such partial
+ product is given its proper exponent, which allows us to sum them
+ and obtain the finished product. */
-/* Convert R to a single precision float value stored in the least-significant
- bits of a `long'. */
+ for (i = 0; i < SIGSZ * 2; ++i)
+ {
+ unsigned long ai = a->sig[i / 2];
+ if (i & 1)
+ ai >>= HOST_BITS_PER_LONG / 2;
+ else
+ ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
-long
-etarsingle (r)
- REAL_VALUE_TYPE r;
-{
- UEMUSHORT e[NE];
- long l;
+ if (ai == 0)
+ continue;
- GET_REAL (&r, e);
- etoe24 (e, e);
- endian (e, &l, SFmode);
- return ((long) l);
-}
+ for (j = 0; j < 2; ++j)
+ {
+ int exp = (a->exp - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
+ + (b->exp - (1-j)*(HOST_BITS_PER_LONG/2)));
-/* Convert X to a decimal ASCII string S for output to an assembly
- language file. Note, there is no standard way to spell infinity or
- a NaN, so these values may require special treatment in the tm.h
- macros. */
+ if (exp > MAX_EXP)
+ goto overflow;
+ if (exp < -MAX_EXP)
+ /* Would underflow to zero, which we shouldn't bother adding. */
+ continue;
-void
-ereal_to_decimal (x, s)
- REAL_VALUE_TYPE x;
- char *s;
-{
- UEMUSHORT e[NE];
+ u.class = rvc_normal;
+ u.sign = 0;
+ u.exp = exp;
- GET_REAL (&x, e);
- etoasc (e, s, 20);
-}
+ for (k = j; k < SIGSZ * 2; k += 2)
+ {
+ unsigned long bi = b->sig[k / 2];
+ if (k & 1)
+ bi >>= HOST_BITS_PER_LONG / 2;
+ else
+ bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
-/* Compare X and Y. Return 1 if X > Y, 0 if X == Y, -1 if X < Y,
- or -2 if either is a NaN. */
+ u.sig[k / 2] = ai * bi;
+ }
-int
-ereal_cmp (x, y)
- REAL_VALUE_TYPE x, y;
-{
- UEMUSHORT ex[NE], ey[NE];
+ normalize (&u);
+ do_add (rr, rr, &u, 0);
+ }
+ }
- GET_REAL (&x, ex);
- GET_REAL (&y, ey);
- return (ecmp (ex, ey));
+ rr->sign = sign;
+ if (rr != r)
+ *r = t;
}
-/* Return 1 if the sign bit of X is set, else return 0. */
+/* Return R = A / B. */
-int
-ereal_isneg (x)
- REAL_VALUE_TYPE x;
+static void
+do_divide (r, a, b)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a, *b;
{
- UEMUSHORT ex[NE];
-
- GET_REAL (&x, ex);
- return (eisneg (ex));
-}
-
-
-/*
- Extended precision IEEE binary floating point arithmetic routines
-
- Numbers are stored in C language as arrays of 16-bit unsigned
- short integers. The arguments of the routines are pointers to
- the arrays.
+ int exp, sign = a->sign ^ b->sign;
+ REAL_VALUE_TYPE t, *rr;
+ bool inexact;
- External e type data structure, similar to Intel 8087 chip
- temporary real format but possibly with a larger significand:
-
- NE-1 significand words (least significant word first,
- most significant bit is normally set)
- exponent (value = EXONE for 1.0,
- top bit is the sign)
+ switch (CLASS2 (a->class, b->class))
+ {
+ case CLASS2 (rvc_zero, rvc_zero):
+ /* 0 / 0 = NaN. */
+ case CLASS2 (rvc_inf, rvc_inf):
+ /* Inf / Inf = NaN. */
+ get_canonical_qnan (r, sign);
+ return;
+ case CLASS2 (rvc_zero, rvc_normal):
+ case CLASS2 (rvc_zero, rvc_inf):
+ /* 0 / ANY = 0. */
+ case CLASS2 (rvc_normal, rvc_inf):
+ /* R / Inf = 0. */
+ underflow:
+ get_zero (r, sign);
+ return;
- Internal exploded e-type data structure of a number (a "word" is 16 bits):
+ case CLASS2 (rvc_normal, rvc_zero):
+ /* R / 0 = Inf. */
+ case CLASS2 (rvc_inf, rvc_zero):
+ /* Inf / 0 = Inf. */
+ get_inf (r, sign);
+ return;
- ei[0] sign word (0 for positive, 0xffff for negative)
- ei[1] biased exponent (value = EXONE for the number 1.0)
- ei[2] high guard word (always zero after normalization)
- ei[3]
- to ei[NI-2] significand (NI-4 significand words,
- most significant word first,
- most significant bit is set)
- ei[NI-1] low guard word (0x8000 bit is rounding place)
+ case CLASS2 (rvc_zero, rvc_nan):
+ case CLASS2 (rvc_normal, rvc_nan):
+ case CLASS2 (rvc_inf, rvc_nan):
+ case CLASS2 (rvc_nan, rvc_nan):
+ /* ANY / NaN = NaN. */
+ *r = *b;
+ r->sign = sign;
+ return;
+ case CLASS2 (rvc_nan, rvc_zero):
+ case CLASS2 (rvc_nan, rvc_normal):
+ case CLASS2 (rvc_nan, rvc_inf):
+ /* NaN / ANY = NaN. */
+ *r = *a;
+ r->sign = sign;
+ return;
+ case CLASS2 (rvc_inf, rvc_normal):
+ /* Inf / R = Inf. */
+ overflow:
+ get_inf (r, sign);
+ return;
- Routines for external format e-type numbers
+ case CLASS2 (rvc_normal, rvc_normal):
+ break;
- asctoe (string, e) ASCII string to extended double e type
- asctoe64 (string, &d) ASCII string to long double
- asctoe53 (string, &d) ASCII string to double
- asctoe24 (string, &f) ASCII string to single
- asctoeg (string, e, prec) ASCII string to specified precision
- e24toe (&f, e) IEEE single precision to e type
- e53toe (&d, e) IEEE double precision to e type
- e64toe (&d, e) IEEE long double precision to e type
- e113toe (&d, e) 128-bit long double precision to e type
-#if 0
- eabs (e) absolute value
-#endif
- eadd (a, b, c) c = b + a
- eclear (e) e = 0
- ecmp (a, b) Returns 1 if a > b, 0 if a == b,
- -1 if a < b, -2 if either a or b is a NaN.
- ediv (a, b, c) c = b / a
- efloor (a, b) truncate to integer, toward -infinity
- efrexp (a, exp, s) extract exponent and significand
- eifrac (e, &l, frac) e to HOST_WIDE_INT and e type fraction
- euifrac (e, &l, frac) e to unsigned HOST_WIDE_INT and e type fraction
- einfin (e) set e to infinity, leaving its sign alone
- eldexp (a, n, b) multiply by 2**n
- emov (a, b) b = a
- emul (a, b, c) c = b * a
- eneg (e) e = -e
-#if 0
- eround (a, b) b = nearest integer value to a
-#endif
- esub (a, b, c) c = b - a
-#if 0
- e24toasc (&f, str, n) single to ASCII string, n digits after decimal
- e53toasc (&d, str, n) double to ASCII string, n digits after decimal
- e64toasc (&d, str, n) 80-bit long double to ASCII string
- e113toasc (&d, str, n) 128-bit long double to ASCII string
-#endif
- etoasc (e, str, n) e to ASCII string, n digits after decimal
- etoe24 (e, &f) convert e type to IEEE single precision
- etoe53 (e, &d) convert e type to IEEE double precision
- etoe64 (e, &d) convert e type to IEEE long double precision
- ltoe (&l, e) HOST_WIDE_INT to e type
- ultoe (&l, e) unsigned HOST_WIDE_INT to e type
- eisneg (e) 1 if sign bit of e != 0, else 0
- eisinf (e) 1 if e has maximum exponent (non-IEEE)
- or is infinite (IEEE)
- eisnan (e) 1 if e is a NaN
-
-
- Routines for internal format exploded e-type numbers
-
- eaddm (ai, bi) add significands, bi = bi + ai
- ecleaz (ei) ei = 0
- ecleazs (ei) set ei = 0 but leave its sign alone
- ecmpm (ai, bi) compare significands, return 1, 0, or -1
- edivm (ai, bi) divide significands, bi = bi / ai
- emdnorm (ai,l,s,exp) normalize and round off
- emovi (a, ai) convert external a to internal ai
- emovo (ai, a) convert internal ai to external a
- emovz (ai, bi) bi = ai, low guard word of bi = 0
- emulm (ai, bi) multiply significands, bi = bi * ai
- enormlz (ei) left-justify the significand
- eshdn1 (ai) shift significand and guards down 1 bit
- eshdn8 (ai) shift down 8 bits
- eshdn6 (ai) shift down 16 bits
- eshift (ai, n) shift ai n bits up (or down if n < 0)
- eshup1 (ai) shift significand and guards up 1 bit
- eshup8 (ai) shift up 8 bits
- eshup6 (ai) shift up 16 bits
- esubm (ai, bi) subtract significands, bi = bi - ai
- eiisinf (ai) 1 if infinite
- eiisnan (ai) 1 if a NaN
- eiisneg (ai) 1 if sign bit of ai != 0, else 0
- einan (ai) set ai = NaN
-#if 0
- eiinfin (ai) set ai = infinity
-#endif
+ default:
+ abort ();
+ }
- The result is always normalized and rounded to NI-4 word precision
- after each arithmetic operation.
-
- Exception flags are NOT fully supported.
-
- Signaling NaN's are NOT supported; they are treated the same
- as quiet NaN's.
-
- Define INFINITY for support of infinity; otherwise a
- saturation arithmetic is implemented.
-
- Define NANS for support of Not-a-Number items; otherwise the
- arithmetic will never produce a NaN output, and might be confused
- by a NaN input.
- If NaN's are supported, the output of `ecmp (a,b)' is -2 if
- either a or b is a NaN. This means asking `if (ecmp (a,b) < 0)'
- may not be legitimate. Use `if (ecmp (a,b) == -1)' for `less than'
- if in doubt.
-
- Denormals are always supported here where appropriate (e.g., not
- for conversion to DEC numbers). */
-
-/* Definitions for error codes that are passed to the common error handling
- routine mtherr.
-
- For Digital Equipment PDP-11 and VAX computers, certain
- IBM systems, and others that use numbers with a 56-bit
- significand, the symbol DEC should be defined. In this
- mode, most floating point constants are given as arrays
- of octal integers to eliminate decimal to binary conversion
- errors that might be introduced by the compiler.
-
- For computers, such as IBM PC, that follow the IEEE
- Standard for Binary Floating Point Arithmetic (ANSI/IEEE
- Std 754-1985), the symbol IEEE should be defined.
- These numbers have 53-bit significands. In this mode, constants
- are provided as arrays of hexadecimal 16 bit integers.
- The endian-ness of generated values is controlled by
- REAL_WORDS_BIG_ENDIAN.
-
- To accommodate other types of computer arithmetic, all
- constants are also provided in a normal decimal radix
- which one can hope are correctly converted to a suitable
- format by the available C language compiler. To invoke
- this mode, the symbol UNK is defined.
-
- An important difference among these modes is a predefined
- set of machine arithmetic constants for each. The numbers
- MACHEP (the machine roundoff error), MAXNUM (largest number
- represented), and several other parameters are preset by
- the configuration symbol. Check the file const.c to
- ensure that these values are correct for your computer.
-
- For ANSI C compatibility, define ANSIC equal to 1. Currently
- this affects only the atan2 function and others that use it. */
-
-/* Constant definitions for math error conditions. */
-
-#define DOMAIN 1 /* argument domain error */
-#define SING 2 /* argument singularity */
-#define OVERFLOW 3 /* overflow range error */
-#define UNDERFLOW 4 /* underflow range error */
-#define TLOSS 5 /* total loss of precision */
-#define PLOSS 6 /* partial loss of precision */
-#define INVALID 7 /* NaN-producing operation */
-
-/* e type constants used by high precision check routines */
-
-#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && (INTEL_EXTENDED_IEEE_FORMAT == 0)
-/* 0.0 */
-const UEMUSHORT ezero[NE] =
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,};
-
-/* 5.0E-1 */
-const UEMUSHORT ehalf[NE] =
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,};
-
-/* 1.0E0 */
-const UEMUSHORT eone[NE] =
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,};
-
-/* 2.0E0 */
-const UEMUSHORT etwo[NE] =
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,};
-
-/* 3.2E1 */
-const UEMUSHORT e32[NE] =
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,};
-
-/* 6.93147180559945309417232121458176568075500134360255E-1 */
-const UEMUSHORT elog2[NE] =
- {0x40f3, 0xf6af, 0x03f2, 0xb398,
- 0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
-
-/* 1.41421356237309504880168872420969807856967187537695E0 */
-const UEMUSHORT esqrt2[NE] =
- {0x1d6f, 0xbe9f, 0x754a, 0x89b3,
- 0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
-
-/* 3.14159265358979323846264338327950288419716939937511E0 */
-const UEMUSHORT epi[NE] =
- {0x2902, 0x1cd1, 0x80dc, 0x628b,
- 0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
-
-#else
-/* LONG_DOUBLE_TYPE_SIZE is other than 128 */
-const UEMUSHORT ezero[NE] =
- {0, 0000000, 0000000, 0000000, 0000000, 0000000,};
-const UEMUSHORT ehalf[NE] =
- {0, 0000000, 0000000, 0000000, 0100000, 0x3ffe,};
-const UEMUSHORT eone[NE] =
- {0, 0000000, 0000000, 0000000, 0100000, 0x3fff,};
-const UEMUSHORT etwo[NE] =
- {0, 0000000, 0000000, 0000000, 0100000, 0040000,};
-const UEMUSHORT e32[NE] =
- {0, 0000000, 0000000, 0000000, 0100000, 0040004,};
-const UEMUSHORT elog2[NE] =
- {0xc9e4, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
-const UEMUSHORT esqrt2[NE] =
- {0x597e, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
-const UEMUSHORT epi[NE] =
- {0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
-#endif
+ if (r == a || r == b)
+ rr = &t;
+ else
+ rr = r;
-/* Control register for rounding precision.
- This can be set to 113 (if NE=10), 80 (if NE=6), 64, 56, 53, or 24 bits. */
+ rr->class = rvc_normal;
+ rr->sign = sign;
-int rndprc = NBITS;
-extern int rndprc;
+ exp = a->exp - b->exp + 1;
+ if (exp > MAX_EXP)
+ goto overflow;
+ if (exp < -MAX_EXP)
+ goto underflow;
+ rr->exp = exp;
-/* Clear out entire e-type number X. */
+ inexact = div_significands (rr, a, b);
-static void
-eclear (x)
- UEMUSHORT *x;
-{
- int i;
+ /* Re-normalize the result. */
+ normalize (rr);
+ rr->sig[0] |= inexact;
- for (i = 0; i < NE; i++)
- *x++ = 0;
+ if (rr != r)
+ *r = t;
}
-/* Move e-type number from A to B. */
+/* Return a tri-state comparison of A vs B. Return NAN_RESULT if
+ one of the two operands is a NaN. */
-static void
-emov (a, b)
- const UEMUSHORT *a;
- UEMUSHORT *b;
+static int
+do_compare (a, b, nan_result)
+ const REAL_VALUE_TYPE *a, *b;
+ int nan_result;
{
- int i;
-
- for (i = 0; i < NE; i++)
- *b++ = *a++;
-}
+ int ret;
+ switch (CLASS2 (a->class, b->class))
+ {
+ case CLASS2 (rvc_zero, rvc_zero):
+ /* Sign of zero doesn't matter for compares. */
+ return 0;
-#if 0
-/* Absolute value of e-type X. */
+ case CLASS2 (rvc_inf, rvc_zero):
+ case CLASS2 (rvc_inf, rvc_normal):
+ case CLASS2 (rvc_normal, rvc_zero):
+ return (a->sign ? -1 : 1);
-static void
-eabs (x)
- UEMUSHORT x[];
-{
- /* sign is top bit of last word of external format */
- x[NE - 1] &= 0x7fff;
-}
-#endif /* 0 */
+ case CLASS2 (rvc_inf, rvc_inf):
+ return -a->sign - -b->sign;
-/* Negate the e-type number X. */
+ case CLASS2 (rvc_zero, rvc_normal):
+ case CLASS2 (rvc_zero, rvc_inf):
+ case CLASS2 (rvc_normal, rvc_inf):
+ return (b->sign ? 1 : -1);
-static void
-eneg (x)
- UEMUSHORT x[];
-{
+ case CLASS2 (rvc_zero, rvc_nan):
+ case CLASS2 (rvc_normal, rvc_nan):
+ case CLASS2 (rvc_inf, rvc_nan):
+ case CLASS2 (rvc_nan, rvc_nan):
+ case CLASS2 (rvc_nan, rvc_zero):
+ case CLASS2 (rvc_nan, rvc_normal):
+ case CLASS2 (rvc_nan, rvc_inf):
+ return nan_result;
- x[NE - 1] ^= 0x8000; /* Toggle the sign bit */
-}
+ case CLASS2 (rvc_normal, rvc_normal):
+ break;
-/* Return 1 if sign bit of e-type number X is nonzero, else zero. */
+ default:
+ abort ();
+ }
-static int
-eisneg (x)
- const UEMUSHORT x[];
-{
+ if (a->sign != b->sign)
+ return -a->sign - -b->sign;
- if (x[NE - 1] & 0x8000)
- return (1);
+ if (a->exp > b->exp)
+ ret = 1;
+ else if (a->exp < b->exp)
+ ret = -1;
else
- return (0);
-}
-
-/* Return 1 if e-type number X is infinity, else return zero. */
-
-static int
-eisinf (x)
- const UEMUSHORT x[];
-{
+ ret = cmp_significands (a, b);
-#ifdef NANS
- if (eisnan (x))
- return (0);
-#endif
- if ((x[NE - 1] & 0x7fff) == 0x7fff)
- return (1);
- else
- return (0);
+ return (a->sign ? -ret : ret);
}
-/* Check if e-type number is not a number. The bit pattern is one that we
- defined, so we know for sure how to detect it. */
+/* Return A truncated to an integral value toward zero. */
-static int
-eisnan (x)
- const UEMUSHORT x[] ATTRIBUTE_UNUSED;
+static void
+do_fix_trunc (r, a)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *a;
{
-#ifdef NANS
- int i;
+ *r = *a;
- /* NaN has maximum exponent */
- if ((x[NE - 1] & 0x7fff) != 0x7fff)
- return (0);
- /* ... and non-zero significand field. */
- for (i = 0; i < NE - 1; i++)
+ switch (r->class)
{
- if (*x++ != 0)
- return (1);
- }
-#endif
+ case rvc_zero:
+ case rvc_inf:
+ case rvc_nan:
+ break;
+
+ case rvc_normal:
+ if (r->exp <= 0)
+ get_zero (r, r->sign);
+ else if (r->exp < SIGNIFICAND_BITS)
+ clear_significand_below (r, SIGNIFICAND_BITS - r->exp);
+ break;
- return (0);
+ default:
+ abort ();
+ }
}
-/* Fill e-type number X with infinity pattern (IEEE)
- or largest possible number (non-IEEE). */
+/* Perform the binary or unary operation described by CODE.
+ For a unary operation, leave OP1 NULL. */
-static void
-einfin (x)
- UEMUSHORT *x;
+void
+real_arithmetic (r, icode, op0, op1)
+ REAL_VALUE_TYPE *r;
+ int icode;
+ const REAL_VALUE_TYPE *op0, *op1;
{
- int i;
+ enum tree_code code = icode;
-#ifdef INFINITY
- for (i = 0; i < NE - 1; i++)
- *x++ = 0;
- *x |= 32767;
-#else
- for (i = 0; i < NE - 1; i++)
- *x++ = 0xffff;
- *x |= 32766;
- if (rndprc < NBITS)
+ switch (code)
{
- if (rndprc == 113)
- {
- *(x - 9) = 0;
- *(x - 8) = 0;
- }
- if (rndprc == 64)
- {
- *(x - 5) = 0;
- }
- if (rndprc == 53)
- {
- *(x - 4) = 0xf800;
- }
- else
- {
- *(x - 4) = 0;
- *(x - 3) = 0;
- *(x - 2) = 0xff00;
- }
- }
-#endif
-}
-
-/* Output an e-type NaN.
- This generates Intel's quiet NaN pattern for extended real.
- The exponent is 7fff, the leading mantissa word is c000. */
+ case PLUS_EXPR:
+ do_add (r, op0, op1, 0);
+ break;
-#ifdef NANS
-static void
-enan (x, sign)
- UEMUSHORT *x;
- int sign;
-{
- int i;
+ case MINUS_EXPR:
+ do_add (r, op0, op1, 1);
+ break;
- for (i = 0; i < NE - 2; i++)
- *x++ = 0;
- *x++ = 0xc000;
- *x = (sign << 15) | 0x7fff;
-}
-#endif /* NANS */
+ case MULT_EXPR:
+ do_multiply (r, op0, op1);
+ break;
-/* Move in an e-type number A, converting it to exploded e-type B. */
+ case RDIV_EXPR:
+ do_divide (r, op0, op1);
+ break;
-static void
-emovi (a, b)
- const UEMUSHORT *a;
- UEMUSHORT *b;
-{
- const UEMUSHORT *p;
- UEMUSHORT *q;
- int i;
+ case MIN_EXPR:
+ if (op1->class == rvc_nan)
+ *r = *op1;
+ else if (do_compare (op0, op1, -1) < 0)
+ *r = *op0;
+ else
+ *r = *op1;
+ break;
- q = b;
- p = a + (NE - 1); /* point to last word of external number */
- /* get the sign bit */
- if (*p & 0x8000)
- *q++ = 0xffff;
- else
- *q++ = 0;
- /* get the exponent */
- *q = *p--;
- *q++ &= 0x7fff; /* delete the sign bit */
-#ifdef INFINITY
- if ((*(q - 1) & 0x7fff) == 0x7fff)
- {
-#ifdef NANS
- if (eisnan (a))
- {
- *q++ = 0;
- for (i = 3; i < NI; i++)
- *q++ = *p--;
- return;
- }
-#endif
+ case MAX_EXPR:
+ if (op1->class == rvc_nan)
+ *r = *op1;
+ else if (do_compare (op0, op1, 1) < 0)
+ *r = *op1;
+ else
+ *r = *op0;
+ break;
- for (i = 2; i < NI; i++)
- *q++ = 0;
- return;
- }
-#endif
+ case NEGATE_EXPR:
+ *r = *op0;
+ r->sign ^= 1;
+ break;
- /* clear high guard word */
- *q++ = 0;
- /* move in the significand */
- for (i = 0; i < NE - 1; i++)
- *q++ = *p--;
- /* clear low guard word */
- *q = 0;
-}
+ case ABS_EXPR:
+ *r = *op0;
+ r->sign = 0;
+ break;
-/* Move out exploded e-type number A, converting it to e type B. */
+ case FIX_TRUNC_EXPR:
+ do_fix_trunc (r, op0);
+ break;
-static void
-emovo (a, b)
- const UEMUSHORT *a;
- UEMUSHORT *b;
-{
- const UEMUSHORT *p;
- UEMUSHORT *q;
- UEMUSHORT i;
- int j;
-
- p = a;
- q = b + (NE - 1); /* point to output exponent */
- /* combine sign and exponent */
- i = *p++;
- if (i)
- *q-- = *p++ | 0x8000;
- else
- *q-- = *p++;
-#ifdef INFINITY
- if (*(p - 1) == 0x7fff)
- {
-#ifdef NANS
- if (eiisnan (a))
- {
- enan (b, eiisneg (a));
- return;
- }
-#endif
- einfin (b);
- return;
+ default:
+ abort ();
}
-#endif
- /* skip over guard word */
- ++p;
- /* move the significand */
- for (j = 0; j < NE - 1; j++)
- *q-- = *p++;
}
-/* Clear out exploded e-type number XI. */
+/* Legacy. Similar, but return the result directly. */
-static void
-ecleaz (xi)
- UEMUSHORT *xi;
+REAL_VALUE_TYPE
+real_arithmetic2 (icode, op0, op1)
+ int icode;
+ const REAL_VALUE_TYPE *op0, *op1;
{
- int i;
-
- for (i = 0; i < NI; i++)
- *xi++ = 0;
+ REAL_VALUE_TYPE r;
+ real_arithmetic (&r, icode, op0, op1);
+ return r;
}
-/* Clear out exploded e-type XI, but don't touch the sign. */
-
-static void
-ecleazs (xi)
- UEMUSHORT *xi;
+bool
+real_compare (icode, op0, op1)
+ int icode;
+ const REAL_VALUE_TYPE *op0, *op1;
{
- int i;
-
- ++xi;
- for (i = 0; i < NI - 1; i++)
- *xi++ = 0;
-}
-
-/* Move exploded e-type number from A to B. */
+ enum tree_code code = icode;
-static void
-emovz (a, b)
- const UEMUSHORT *a;
- UEMUSHORT *b;
-{
- int i;
+ switch (code)
+ {
+ case LT_EXPR:
+ return do_compare (op0, op1, 1) < 0;
+ case LE_EXPR:
+ return do_compare (op0, op1, 1) <= 0;
+ case GT_EXPR:
+ return do_compare (op0, op1, -1) > 0;
+ case GE_EXPR:
+ return do_compare (op0, op1, -1) >= 0;
+ case EQ_EXPR:
+ return do_compare (op0, op1, -1) == 0;
+ case NE_EXPR:
+ return do_compare (op0, op1, -1) != 0;
+ case UNORDERED_EXPR:
+ return op0->class == rvc_nan || op1->class == rvc_nan;
+ case ORDERED_EXPR:
+ return op0->class != rvc_nan && op1->class != rvc_nan;
+ case UNLT_EXPR:
+ return do_compare (op0, op1, -1) < 0;
+ case UNLE_EXPR:
+ return do_compare (op0, op1, -1) <= 0;
+ case UNGT_EXPR:
+ return do_compare (op0, op1, 1) > 0;
+ case UNGE_EXPR:
+ return do_compare (op0, op1, 1) >= 0;
+ case UNEQ_EXPR:
+ return do_compare (op0, op1, 0) == 0;
- for (i = 0; i < NI - 1; i++)
- *b++ = *a++;
- /* clear low guard word */
- *b = 0;
+ default:
+ abort ();
+ }
}
-/* Generate exploded e-type NaN.
- The explicit pattern for this is maximum exponent and
- top two significant bits set. */
-
-#ifdef NANS
-static void
-einan (x)
- UEMUSHORT x[];
-{
+/* Return floor log2(R). */
- ecleaz (x);
- x[E] = 0x7fff;
- x[M + 1] = 0xc000;
+int
+real_exponent (r)
+ const REAL_VALUE_TYPE *r;
+{
+ switch (r->class)
+ {
+ case rvc_zero:
+ return 0;
+ case rvc_inf:
+ case rvc_nan:
+ return (unsigned int)-1 >> 1;
+ case rvc_normal:
+ return r->exp;
+ default:
+ abort ();
+ }
}
-#endif /* NANS */
-/* Return nonzero if exploded e-type X is a NaN. */
+/* R = OP0 * 2**EXP. */
-#ifdef NANS
-static int
-eiisnan (x)
- const UEMUSHORT x[];
+void
+real_ldexp (r, op0, exp)
+ REAL_VALUE_TYPE *r;
+ const REAL_VALUE_TYPE *op0;
+ int exp;
{
- int i;
-
- if ((x[E] & 0x7fff) == 0x7fff)
+ *r = *op0;
+ switch (r->class)
{
- for (i = M + 1; i < NI; i++)
- {
- if (x[i] != 0)
- return (1);
- }
+ case rvc_zero:
+ case rvc_inf:
+ case rvc_nan:
+ break;
+
+ case rvc_normal:
+ exp += op0->exp;
+ if (exp > MAX_EXP)
+ get_inf (r, r->sign);
+ else if (exp < -MAX_EXP)
+ get_zero (r, r->sign);
+ else
+ r->exp = exp;
+ break;
+
+ default:
+ abort ();
}
- return (0);
}
-#endif /* NANS */
-/* Return nonzero if sign of exploded e-type X is nonzero. */
+/* Determine whether a floating-point value X is infinite. */
-static int
-eiisneg (x)
- const UEMUSHORT x[];
+bool
+real_isinf (r)
+ const REAL_VALUE_TYPE *r;
{
-
- return x[0] != 0;
+ return (r->class == rvc_inf);
}
-#if 0
-/* Fill exploded e-type X with infinity pattern.
- This has maximum exponent and significand all zeros. */
+/* Determine whether a floating-point value X is a NaN. */
-static void
-eiinfin (x)
- UEMUSHORT x[];
+bool
+real_isnan (r)
+ const REAL_VALUE_TYPE *r;
{
-
- ecleaz (x);
- x[E] = 0x7fff;
+ return (r->class == rvc_nan);
}
-#endif /* 0 */
-/* Return nonzero if exploded e-type X is infinite. */
+/* Determine whether a floating-point value X is negative. */
-#ifdef INFINITY
-static int
-eiisinf (x)
- const UEMUSHORT x[];
+bool
+real_isneg (r)
+ const REAL_VALUE_TYPE *r;
{
-
-#ifdef NANS
- if (eiisnan (x))
- return (0);
-#endif
- if ((x[E] & 0x7fff) == 0x7fff)
- return (1);
- return (0);
+ return r->sign;
}
-#endif /* INFINITY */
-
-/* Compare significands of numbers in internal exploded e-type format.
- Guard words are included in the comparison.
- Returns +1 if a > b
- 0 if a == b
- -1 if a < b */
+/* Determine whether a floating-point value X is minus zero. */
-static int
-ecmpm (a, b)
- const UEMUSHORT *a, *b;
+bool
+real_isnegzero (r)
+ const REAL_VALUE_TYPE *r;
{
- int i;
-
- a += M; /* skip up to significand area */
- b += M;
- for (i = M; i < NI; i++)
- {
- if (*a++ != *b++)
- goto difrnt;
- }
- return (0);
-
- difrnt:
- if (*(--a) > *(--b))
- return (1);
- else
- return (-1);
+ return r->sign && r->class == rvc_zero;
}
-/* Shift significand of exploded e-type X down by 1 bit. */
+/* Compare two floating-point objects for bitwise identity. */
-static void
-eshdn1 (x)
- UEMUSHORT *x;
+extern bool
+real_identical (a, b)
+ const REAL_VALUE_TYPE *a, *b;
{
- UEMUSHORT bits;
int i;
- x += M; /* point to significand area */
+ if (a->class != b->class)
+ return false;
+ if (a->sign != b->sign)
+ return false;
- bits = 0;
- for (i = M; i < NI; i++)
+ switch (a->class)
{
- if (*x & 1)
- bits |= 1;
- *x >>= 1;
- if (bits & 2)
- *x |= 0x8000;
- bits <<= 1;
- ++x;
- }
-}
-
-/* Shift significand of exploded e-type X up by 1 bit. */
-
-static void
-eshup1 (x)
- UEMUSHORT *x;
-{
- UEMUSHORT bits;
- int i;
+ case rvc_zero:
+ case rvc_inf:
+ break;
- x += NI - 1;
- bits = 0;
+ case rvc_normal:
+ if (a->exp != b->exp)
+ return false;
+ /* FALLTHRU */
+ case rvc_nan:
+ for (i = 0; i < SIGSZ; ++i)
+ if (a->sig[i] != b->sig[i])
+ return false;
+ break;
- for (i = M; i < NI; i++)
- {
- if (*x & 0x8000)
- bits |= 1;
- *x <<= 1;
- if (bits & 2)
- *x |= 1;
- bits <<= 1;
- --x;
+ default:
+ abort ();
}
-}
+ return true;
+}
-/* Shift significand of exploded e-type X down by 8 bits. */
+/* Try to change R into its exact multiplicative inverse in machine
+ mode MODE. Return true if successful. */
-static void
-eshdn8 (x)
- UEMUSHORT *x;
+bool
+exact_real_inverse (mode, r)
+ enum machine_mode mode;
+ REAL_VALUE_TYPE *r;
{
- UEMUSHORT newbyt, oldbyt;
+ const REAL_VALUE_TYPE *one = real_digit (1);
+ REAL_VALUE_TYPE u;
int i;
+
+ if (r->class != rvc_normal)
+ return false;
- x += M;
- oldbyt = 0;
- for (i = M; i < NI; i++)
- {
- newbyt = *x << 8;
- *x >>= 8;
- *x |= oldbyt;
- oldbyt = newbyt;
- ++x;
- }
+ /* Check for a power of two: all significand bits zero except the MSB. */
+ for (i = 0; i < SIGSZ-1; ++i)
+ if (r->sig[i] != 0)
+ return false;
+ if (r->sig[SIGSZ-1] != SIG_MSB)
+ return false;
+
+ /* Find the inverse and truncate to the required mode. */
+ do_divide (&u, one, r);
+ real_convert (&u, mode, &u);
+
+ /* The rounding may have overflowed. */
+ if (u.class != rvc_normal)
+ return false;
+ for (i = 0; i < SIGSZ-1; ++i)
+ if (u.sig[i] != 0)
+ return false;
+ if (u.sig[SIGSZ-1] != SIG_MSB)
+ return false;
+
+ *r = u;
+ return true;
}
+
+/* Render R as an integer. */
-/* Shift significand of exploded e-type X up by 8 bits. */
+HOST_WIDE_INT
+real_to_integer (r)
+ const REAL_VALUE_TYPE *r;
+{
+ unsigned HOST_WIDE_INT i;
+
+ switch (r->class)
+ {
+ case rvc_zero:
+ underflow:
+ return 0;
+
+ case rvc_inf:
+ case rvc_nan:
+ overflow:
+ i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
+ if (!r->sign)
+ i--;
+ return i;
+
+ case rvc_normal:
+ if (r->exp <= 0)
+ goto underflow;
+ if (r->exp > HOST_BITS_PER_WIDE_INT)
+ goto overflow;
+
+ if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
+ i = r->sig[SIGSZ-1];
+ else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
+ {
+ i = r->sig[SIGSZ-1];
+ i = i << (HOST_BITS_PER_LONG - 1) << 1;
+ i |= r->sig[SIGSZ-2];
+ }
+ else
+ abort ();
-static void
-eshup8 (x)
- UEMUSHORT *x;
-{
- int i;
- UEMUSHORT newbyt, oldbyt;
+ i >>= HOST_BITS_PER_WIDE_INT - r->exp;
- x += NI - 1;
- oldbyt = 0;
+ if (r->sign)
+ i = -i;
+ return i;
- for (i = M; i < NI; i++)
- {
- newbyt = *x >> 8;
- *x <<= 8;
- *x |= oldbyt;
- oldbyt = newbyt;
- --x;
+ default:
+ abort ();
}
}
-/* Shift significand of exploded e-type X up by 16 bits. */
+/* Likewise, but to an integer pair, HI+LOW. */
-static void
-eshup6 (x)
- UEMUSHORT *x;
+void
+real_to_integer2 (plow, phigh, r)
+ HOST_WIDE_INT *plow, *phigh;
+ const REAL_VALUE_TYPE *r;
{
- int i;
- UEMUSHORT *p;
+ REAL_VALUE_TYPE t;
+ HOST_WIDE_INT low, high;
+ int exp;
- p = x + M;
- x += M + 1;
+ switch (r->class)
+ {
+ case rvc_zero:
+ underflow:
+ low = high = 0;
+ break;
- for (i = M; i < NI - 1; i++)
- *p++ = *x++;
+ case rvc_inf:
+ case rvc_nan:
+ overflow:
+ high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
+ if (r->sign)
+ low = 0;
+ else
+ {
+ high--;
+ low = -1;
+ }
+ break;
- *p = 0;
-}
+ case rvc_normal:
+ exp = r->exp;
+ if (exp <= 0)
+ goto underflow;
+ if (exp >= 2*HOST_BITS_PER_WIDE_INT)
+ goto overflow;
-/* Shift significand of exploded e-type X down by 16 bits. */
+ rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
+ if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
+ {
+ high = t.sig[SIGSZ-1];
+ low = t.sig[SIGSZ-2];
+ }
+ else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
+ {
+ high = t.sig[SIGSZ-1];
+ high = high << (HOST_BITS_PER_LONG - 1) << 1;
+ high |= t.sig[SIGSZ-2];
-static void
-eshdn6 (x)
- UEMUSHORT *x;
-{
- int i;
- UEMUSHORT *p;
+ low = t.sig[SIGSZ-3];
+ low = low << (HOST_BITS_PER_LONG - 1) << 1;
+ low |= t.sig[SIGSZ-4];
+ }
+ else
+ abort ();
- x += NI - 1;
- p = x + 1;
+ if (r->sign)
+ {
+ if (low == 0)
+ high = -high;
+ else
+ low = -low, high = ~high;
+ }
+ break;
- for (i = M; i < NI - 1; i++)
- *(--p) = *(--x);
+ default:
+ abort ();
+ }
- *(--p) = 0;
+ *plow = low;
+ *phigh = high;
}
-/* Add significands of exploded e-type X and Y. X + Y replaces Y. */
+/* A subroutine of real_to_decimal. Compute the quotient and remainder
+ of NUM / DEN. Return the quotient and place the remainder in NUM.
+ It is expected that NUM / DEN are close enough that the quotient is
+ small. */
-static void
-eaddm (x, y)
- const UEMUSHORT *x;
- UEMUSHORT *y;
+static unsigned long
+rtd_divmod (num, den)
+ REAL_VALUE_TYPE *num, *den;
{
- unsigned EMULONG a;
- int i;
- unsigned int carry;
+ unsigned long q, msb;
+ int expn = num->exp, expd = den->exp;
+
+ if (expn < expd)
+ return 0;
- x += NI - 1;
- y += NI - 1;
- carry = 0;
- for (i = M; i < NI; i++)
+ q = msb = 0;
+ goto start;
+ do
{
- a = (unsigned EMULONG) (*x) + (unsigned EMULONG) (*y) + carry;
- if (a & 0x10000)
- carry = 1;
- else
- carry = 0;
- *y = (UEMUSHORT) a;
- --x;
- --y;
+ msb = num->sig[SIGSZ-1] & SIG_MSB;
+ q <<= 1;
+ lshift_significand_1 (num, num);
+ start:
+ if (msb || cmp_significands (num, den) >= 0)
+ {
+ sub_significands (num, num, den);
+ q |= 1;
+ }
}
+ while (--expn >= expd);
+
+ num->exp = expd;
+ normalize (num);
+
+ return q;
}
-/* Subtract significands of exploded e-type X and Y. Y - X replaces Y. */
+/* Render R as a decimal floating point constant. Emit DIGITS significant
+ digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
+ maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
+ zeros. */
-static void
-esubm (x, y)
- const UEMUSHORT *x;
- UEMUSHORT *y;
-{
- unsigned EMULONG a;
- int i;
- unsigned int carry;
+#define M_LOG10_2 0.30102999566398119521
- x += NI - 1;
- y += NI - 1;
- carry = 0;
- for (i = M; i < NI; i++)
- {
- a = (unsigned EMULONG) (*y) - (unsigned EMULONG) (*x) - carry;
- if (a & 0x10000)
- carry = 1;
- else
- carry = 0;
- *y = (UEMUSHORT) a;
- --x;
- --y;
+void
+real_to_decimal (str, r_orig, buf_size, digits, crop_trailing_zeros)
+ char *str;
+ const REAL_VALUE_TYPE *r_orig;
+ size_t buf_size, digits;
+ int crop_trailing_zeros;
+{
+ const REAL_VALUE_TYPE *one, *ten;
+ REAL_VALUE_TYPE r, pten, u, v;
+ int dec_exp, cmp_one, digit;
+ size_t max_digits;
+ char *p, *first, *last;
+ bool sign;
+
+ r = *r_orig;
+ switch (r.class)
+ {
+ case rvc_zero:
+ strcpy (str, (r.sign ? "-0.0" : "0.0"));
+ return;
+ case rvc_normal:
+ break;
+ case rvc_inf:
+ strcpy (str, (r.sign ? "-Inf" : "+Inf"));
+ return;
+ case rvc_nan:
+ /* ??? Print the significand as well, if not canonical? */
+ strcpy (str, (r.sign ? "-NaN" : "+NaN"));
+ return;
+ default:
+ abort ();
}
-}
+ /* Estimate the decimal exponent, and compute the length of the string it
+ will print as. Be conservative and add one to account for possible
+ overflow or rounding error. */
+ dec_exp = r.exp * M_LOG10_2;
+ for (max_digits = 1; dec_exp ; max_digits++)
+ dec_exp /= 10;
-static UEMUSHORT equot[NI];
+ /* Bound the number of digits printed by the size of the output buffer. */
+ max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
+ if (max_digits > buf_size)
+ abort ();
+ if (digits > max_digits)
+ digits = max_digits;
+ /* Bound the number of digits printed by the size of the representation. */
+ max_digits = SIGNIFICAND_BITS * M_LOG10_2;
+ if (digits == 0 || digits > max_digits)
+ digits = max_digits;
-#if 0
-/* Radix 2 shift-and-add versions of multiply and divide */
+ one = real_digit (1);
+ ten = ten_to_ptwo (0);
+ sign = r.sign;
+ r.sign = 0;
-/* Divide significands */
+ dec_exp = 0;
+ pten = *one;
-int
-edivm (den, num)
- UEMUSHORT den[], num[];
-{
- int i;
- UEMUSHORT *p, *q;
- UEMUSHORT j;
+ cmp_one = do_compare (&r, one, 0);
+ if (cmp_one > 0)
+ {
+ int m;
- p = &equot[0];
- *p++ = num[0];
- *p++ = num[1];
+ /* Number is greater than one. Convert significand to an integer
+ and strip trailing decimal zeros. */
- for (i = M; i < NI; i++)
- {
- *p++ = 0;
- }
+ u = r;
+ u.exp = SIGNIFICAND_BITS - 1;
- /* Use faster compare and subtraction if denominator has only 15 bits of
- significance. */
+ /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
+ m = floor_log2 (max_digits);
- p = &den[M + 2];
- if (*p++ == 0)
- {
- for (i = M + 3; i < NI; i++)
+ /* Iterate over the bits of the possible powers of 10 that might
+ be present in U and eliminate them. That is, if we find that
+ 10**2**M divides U evenly, keep the division and increase
+ DEC_EXP by 2**M. */
+ do
{
- if (*p++ != 0)
- goto fulldiv;
+ REAL_VALUE_TYPE t;
+
+ do_divide (&t, &u, ten_to_ptwo (m));
+ do_fix_trunc (&v, &t);
+ if (cmp_significands (&v, &t) == 0)
+ {
+ u = t;
+ dec_exp += 1 << m;
+ }
}
- if ((den[M + 1] & 1) != 0)
- goto fulldiv;
- eshdn1 (num);
- eshdn1 (den);
+ while (--m >= 0);
- p = &den[M + 1];
- q = &num[M + 1];
+ /* Revert the scaling to integer that we performed earlier. */
+ u.exp += r.exp - (SIGNIFICAND_BITS - 1);
+ r = u;
- for (i = 0; i < NBITS + 2; i++)
+ /* Find power of 10. Do this by dividing out 10**2**M when
+ this is larger than the current remainder. Fill PTEN with
+ the power of 10 that we compute. */
+ m = floor_log2 ((int)(r.exp * M_LOG10_2)) + 1;
+ do
{
- if (*p <= *q)
+ const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
+ if (do_compare (&u, ptentwo, 0) >= 0)
{
- *q -= *p;
- j = 1;
+ do_divide (&u, &u, ptentwo);
+ do_multiply (&pten, &pten, ptentwo);
+ dec_exp += 1 << m;
}
- else
- {
- j = 0;
- }
- eshup1 (equot);
- equot[NI - 2] |= j;
- eshup1 (num);
}
- goto divdon;
+ while (--m >= 0);
}
+ else if (cmp_one < 0)
+ {
+ int m;
- /* The number of quotient bits to calculate is NBITS + 1 scaling guard
- bit + 1 roundoff bit. */
-
- fulldiv:
+ /* Number is less than one. Pad significand with leading
+ decimal zeros. */
- p = &equot[NI - 2];
- for (i = 0; i < NBITS + 2; i++)
- {
- if (ecmpm (den, num) <= 0)
+ v = r;
+ while (1)
{
- esubm (den, num);
- j = 1; /* quotient bit = 1 */
- }
- else
- j = 0;
- eshup1 (equot);
- *p |= j;
- eshup1 (num);
- }
+ /* Stop if we'd shift bits off the bottom. */
+ if (v.sig[0] & 7)
+ break;
- divdon:
+ do_multiply (&u, &v, ten);
- eshdn1 (equot);
- eshdn1 (equot);
+ /* Stop if we're now >= 1. */
+ if (u.exp > 0)
+ break;
- /* test for nonzero remainder after roundoff bit */
- p = &num[M];
- j = 0;
- for (i = M; i < NI; i++)
- {
- j |= *p++;
- }
- if (j)
- j = 1;
+ v = u;
+ dec_exp -= 1;
+ }
+ r = v;
+ /* Find power of 10. Do this by multiplying in P=10**2**M when
+ the current remainder is smaller than 1/P. Fill PTEN with the
+ power of 10 that we compute. */
+ m = floor_log2 ((int)(-r.exp * M_LOG10_2)) + 1;
+ do
+ {
+ const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
+ const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
- for (i = 0; i < NI; i++)
- num[i] = equot[i];
- return ((int) j);
-}
+ if (do_compare (&v, ptenmtwo, 0) <= 0)
+ {
+ do_multiply (&v, &v, ptentwo);
+ do_multiply (&pten, &pten, ptentwo);
+ dec_exp -= 1 << m;
+ }
+ }
+ while (--m >= 0);
+ /* Invert the positive power of 10 that we've collected so far. */
+ do_divide (&pten, one, &pten);
+ }
-/* Multiply significands */
+ p = str;
+ if (sign)
+ *p++ = '-';
+ first = p++;
-int
-emulm (a, b)
- UEMUSHORT a[], b[];
-{
- UEMUSHORT *p, *q;
- int i, j, k;
+ /* At this point, PTEN should contain the nearest power of 10 smaller
+ than R, such that this division produces the first digit.
- equot[0] = b[0];
- equot[1] = b[1];
- for (i = M; i < NI; i++)
- equot[i] = 0;
+ Using a divide-step primitive that returns the complete integral
+ remainder avoids the rounding error that would be produced if
+ we were to use do_divide here and then simply multiply by 10 for
+ each subsequent digit. */
- p = &a[NI - 2];
- k = NBITS;
- while (*p == 0) /* significand is not supposed to be zero */
- {
- eshdn6 (a);
- k -= 16;
- }
- if ((*p & 0xff) == 0)
+ digit = rtd_divmod (&r, &pten);
+
+ /* Be prepared for error in that division via underflow ... */
+ if (digit == 0 && cmp_significand_0 (&r))
{
- eshdn8 (a);
- k -= 8;
+ /* Multiply by 10 and try again. */
+ do_multiply (&r, &r, ten);
+ digit = rtd_divmod (&r, &pten);
+ dec_exp -= 1;
+ if (digit == 0)
+ abort ();
}
- q = &equot[NI - 1];
- j = 0;
- for (i = 0; i < k; i++)
+ /* ... or overflow. */
+ if (digit == 10)
{
- if (*p & 1)
- eaddm (b, equot);
- /* remember if there were any nonzero bits shifted out */
- if (*q & 1)
- j |= 1;
- eshdn1 (a);
- eshdn1 (equot);
+ *p++ = '1';
+ if (--digits > 0)
+ *p++ = '0';
+ dec_exp += 1;
}
+ else if (digit > 10)
+ abort ();
+ else
+ *p++ = digit + '0';
- for (i = 0; i < NI; i++)
- b[i] = equot[i];
-
- /* return flag for lost nonzero bits */
- return (j);
-}
-
-#else
-
-/* Radix 65536 versions of multiply and divide. */
-
-/* Multiply significand of e-type number B
- by 16-bit quantity A, return e-type result to C. */
-
-static void
-m16m (a, b, c)
- unsigned int a;
- const UEMUSHORT b[];
- UEMUSHORT c[];
-{
- UEMUSHORT *pp;
- unsigned EMULONG carry;
- const UEMUSHORT *ps;
- UEMUSHORT p[NI];
- unsigned EMULONG aa, m;
- int i;
-
- aa = a;
- pp = &p[NI-2];
- *pp++ = 0;
- *pp = 0;
- ps = &b[NI-1];
-
- for (i=M+1; i<NI; i++)
+ /* Generate subsequent digits. */
+ while (--digits > 0)
{
- if (*ps == 0)
- {
- --ps;
- --pp;
- *(pp-1) = 0;
- }
- else
- {
- m = (unsigned EMULONG) aa * *ps--;
- carry = (m & 0xffff) + *pp;
- *pp-- = (UEMUSHORT) carry;
- carry = (carry >> 16) + (m >> 16) + *pp;
- *pp = (UEMUSHORT) carry;
- *(pp-1) = carry >> 16;
- }
+ do_multiply (&r, &r, ten);
+ digit = rtd_divmod (&r, &pten);
+ *p++ = digit + '0';
}
- for (i=M; i<NI; i++)
- c[i] = p[i];
-}
+ last = p;
-/* Divide significands of exploded e-types NUM / DEN. Neither the
- numerator NUM nor the denominator DEN is permitted to have its high guard
- word nonzero. */
+ /* Generate one more digit with which to do rounding. */
+ do_multiply (&r, &r, ten);
+ digit = rtd_divmod (&r, &pten);
-static int
-edivm (den, num)
- const UEMUSHORT den[];
- UEMUSHORT num[];
-{
- int i;
- UEMUSHORT *p;
- unsigned EMULONG tnum;
- UEMUSHORT j, tdenm, tquot;
- UEMUSHORT tprod[NI+1];
-
- p = &equot[0];
- *p++ = num[0];
- *p++ = num[1];
-
- for (i=M; i<NI; i++)
+ /* Round the result. */
+ if (digit == 5)
{
- *p++ = 0;
+ /* Round to nearest. If R is non-zero there are additional
+ non-zero digits to be extracted. */
+ if (cmp_significand_0 (&r))
+ digit++;
+ /* Round to even. */
+ else if ((p[-1] - '0') & 1)
+ digit++;
}
- eshdn1 (num);
- tdenm = den[M+1];
- for (i=M; i<NI; i++)
+ if (digit > 5)
{
- /* Find trial quotient digit (the radix is 65536). */
- tnum = (((unsigned EMULONG) num[M]) << 16) + num[M+1];
-
- /* Do not execute the divide instruction if it will overflow. */
- if ((tdenm * (unsigned long) 0xffff) < tnum)
- tquot = 0xffff;
- else
- tquot = tnum / tdenm;
- /* Multiply denominator by trial quotient digit. */
- m16m ((unsigned int) tquot, den, tprod);
- /* The quotient digit may have been overestimated. */
- if (ecmpm (tprod, num) > 0)
+ while (p > first)
{
- tquot -= 1;
- esubm (den, tprod);
- if (ecmpm (tprod, num) > 0)
+ digit = *--p;
+ if (digit == '9')
+ *p = '0';
+ else
{
- tquot -= 1;
- esubm (den, tprod);
+ *p = digit + 1;
+ break;
}
}
- esubm (tprod, num);
- equot[i] = tquot;
- eshup6 (num);
- }
- /* test for nonzero remainder after roundoff bit */
- p = &num[M];
- j = 0;
- for (i=M; i<NI; i++)
- {
- j |= *p++;
+
+ /* Carry out of the first digit. This means we had all 9's and
+ now have all 0's. "Prepend" a 1 by overwriting the first 0. */
+ if (p == first)
+ {
+ first[1] = '1';
+ dec_exp++;
+ }
}
- if (j)
- j = 1;
+
+ /* Insert the decimal point. */
+ first[0] = first[1];
+ first[1] = '.';
- for (i=0; i<NI; i++)
- num[i] = equot[i];
+ /* If requested, drop trailing zeros. Never crop past "1.0". */
+ if (crop_trailing_zeros)
+ while (last > first + 3 && last[-1] == '0')
+ last--;
- return ((int) j);
+ /* Append the exponent. */
+ sprintf (last, "e%+d", dec_exp);
}
-/* Multiply significands of exploded e-type A and B, result in B. */
+/* Render R as a hexadecimal floating point constant. Emit DIGITS
+ significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
+ choose the maximum for the representation. If CROP_TRAILING_ZEROS,
+ strip trailing zeros. */
-static int
-emulm (a, b)
- const UEMUSHORT a[];
- UEMUSHORT b[];
+void
+real_to_hexadecimal (str, r, buf_size, digits, crop_trailing_zeros)
+ char *str;
+ const REAL_VALUE_TYPE *r;
+ size_t buf_size, digits;
+ int crop_trailing_zeros;
{
- const UEMUSHORT *p;
- UEMUSHORT *q;
- UEMUSHORT pprod[NI];
- UEMUSHORT j;
- int i;
+ int i, j, exp = r->exp;
+ char *p, *first;
+ char exp_buf[16];
+ size_t max_digits;
- equot[0] = b[0];
- equot[1] = b[1];
- for (i=M; i<NI; i++)
- equot[i] = 0;
-
- j = 0;
- p = &a[NI-1];
- q = &equot[NI-1];
- for (i=M+1; i<NI; i++)
+ switch (r->class)
{
- if (*p == 0)
- {
- --p;
- }
- else
- {
- m16m ((unsigned int) *p--, b, pprod);
- eaddm (pprod, equot);
- }
- j |= *q;
- eshdn6 (equot);
+ case rvc_zero:
+ exp = 0;
+ break;
+ case rvc_normal:
+ break;
+ case rvc_inf:
+ strcpy (str, (r->sign ? "-Inf" : "+Inf"));
+ return;
+ case rvc_nan:
+ /* ??? Print the significand as well, if not canonical? */
+ strcpy (str, (r->sign ? "-NaN" : "+NaN"));
+ return;
+ default:
+ abort ();
}
- for (i=0; i<NI; i++)
- b[i] = equot[i];
-
- /* return flag for lost nonzero bits */
- return ((int) j);
-}
-#endif
-
+ if (digits == 0)
+ digits = SIGNIFICAND_BITS / 4;
-/* Normalize and round off.
+ /* Bound the number of digits printed by the size of the output buffer. */
- The internal format number to be rounded is S.
- Input LOST is 0 if the value is exact. This is the so-called sticky bit.
+ sprintf (exp_buf, "p%+d", exp);
+ max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
+ if (max_digits > buf_size)
+ abort ();
+ if (digits > max_digits)
+ digits = max_digits;
- Input SUBFLG indicates whether the number was obtained
- by a subtraction operation. In that case if LOST is nonzero
- then the number is slightly smaller than indicated.
+ p = str;
+ if (r->sign)
+ *p++ = '-';
+ *p++ = '0';
+ *p++ = 'x';
+ *p++ = '0';
+ *p++ = '.';
+ first = p;
- Input EXP is the biased exponent, which may be negative.
- the exponent field of S is ignored but is replaced by
- EXP as adjusted by normalization and rounding.
+ for (i = SIGSZ - 1; i >= 0; --i)
+ for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
+ {
+ *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
+ if (--digits == 0)
+ goto out;
+ }
- Input RCNTRL is the rounding control. If it is nonzero, the
- returned value will be rounded to RNDPRC bits.
+ out:
+ if (crop_trailing_zeros)
+ while (p > first + 1 && p[-1] == '0')
+ p--;
- For future reference: In order for emdnorm to round off denormal
- significands at the right point, the input exponent must be
- adjusted to be the actual value it would have after conversion to
- the final floating point type. This adjustment has been
- implemented for all type conversions (etoe53, etc.) and decimal
- conversions, but not for the arithmetic functions (eadd, etc.).
- Data types having standard 15-bit exponents are not affected by
- this, but SFmode and DFmode are affected. For example, ediv with
- rndprc = 24 will not round correctly to 24-bit precision if the
- result is denormal. */
+ sprintf (p, "p%+d", exp);
+}
-static int rlast = -1;
-static int rw = 0;
-static UEMUSHORT rmsk = 0;
-static UEMUSHORT rmbit = 0;
-static UEMUSHORT rebit = 0;
-static int re = 0;
-static UEMUSHORT rbit[NI];
+/* Initialize R from a decimal or hexadecimal string. The string is
+ assumed to have been syntax checked already. */
-static void
-emdnorm (s, lost, subflg, exp, rcntrl)
- UEMUSHORT s[];
- int lost;
- int subflg ATTRIBUTE_UNUSED;
- EMULONG exp;
- int rcntrl;
+void
+real_from_string (r, str)
+ REAL_VALUE_TYPE *r;
+ const char *str;
{
- int i, j;
- UEMUSHORT r;
+ int exp = 0;
+ bool sign = false;
- /* Normalize */
- j = enormlz (s);
+ get_zero (r, 0);
- /* a blank significand could mean either zero or infinity. */
-#ifndef INFINITY
- if (j > NBITS)
+ if (*str == '-')
{
- ecleazs (s);
- return;
- }
-#endif
- exp -= j;
-#ifndef INFINITY
- if (exp >= 32767L)
- goto overf;
-#else
- if ((j > NBITS) && (exp < 32767))
- {
- ecleazs (s);
- return;
+ sign = true;
+ str++;
}
-#endif
- if (exp < 0L)
+ else if (*str == '+')
+ str++;
+
+ if (str[0] == '0' && str[1] == 'x')
{
- if (exp > (EMULONG) (-NBITS - 1))
+ /* Hexadecimal floating point. */
+ int pos = SIGNIFICAND_BITS - 4, d;
+
+ str += 2;
+
+ while (*str == '0')
+ str++;
+ while (1)
{
- j = (int) exp;
- i = eshift (s, j);
- if (i)
- lost = 1;
+ d = hex_value (*str);
+ if (d == _hex_bad)
+ break;
+ if (pos >= 0)
+ {
+ r->sig[pos / HOST_BITS_PER_LONG]
+ |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
+ pos -= 4;
+ }
+ exp += 4;
+ str++;
}
- else
+ if (*str == '.')
{
- ecleazs (s);
- return;
+ str++;
+ if (pos == SIGNIFICAND_BITS - 4)
+ {
+ while (*str == '0')
+ str++, exp -= 4;
+ }
+ while (1)
+ {
+ d = hex_value (*str);
+ if (d == _hex_bad)
+ break;
+ if (pos >= 0)
+ {
+ r->sig[pos / HOST_BITS_PER_LONG]
+ |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
+ pos -= 4;
+ }
+ str++;
+ }
}
- }
- /* Round off, unless told not to by rcntrl. */
- if (rcntrl == 0)
- goto mdfin;
- /* Set up rounding parameters if the control register changed. */
- if (rndprc != rlast)
- {
- ecleaz (rbit);
- switch (rndprc)
+ if (*str == 'p' || *str == 'P')
{
- default:
- case NBITS:
- rw = NI - 1; /* low guard word */
- rmsk = 0xffff;
- rmbit = 0x8000;
- re = rw - 1;
- rebit = 1;
- break;
+ bool exp_neg = false;
- case 113:
- rw = 10;
- rmsk = 0x7fff;
- rmbit = 0x4000;
- rebit = 0x8000;
- re = rw;
- break;
-
- case 64:
- rw = 7;
- rmsk = 0xffff;
- rmbit = 0x8000;
- re = rw - 1;
- rebit = 1;
- break;
-
- /* For DEC or IBM arithmetic */
- case 56:
- rw = 6;
- rmsk = 0xff;
- rmbit = 0x80;
- rebit = 0x100;
- re = rw;
- break;
-
- case 53:
- rw = 6;
- rmsk = 0x7ff;
- rmbit = 0x0400;
- rebit = 0x800;
- re = rw;
- break;
+ str++;
+ if (*str == '-')
+ {
+ exp_neg = true;
+ str++;
+ }
+ else if (*str == '+')
+ str++;
- /* For C4x arithmetic */
- case 32:
- rw = 5;
- rmsk = 0xffff;
- rmbit = 0x8000;
- rebit = 1;
- re = rw - 1;
- break;
+ d = 0;
+ while (ISDIGIT (*str))
+ {
+ d *= 10;
+ d += *str - '0';
+ if (d > MAX_EXP)
+ {
+ /* Overflowed the exponent. */
+ if (exp_neg)
+ goto underflow;
+ else
+ goto overflow;
+ }
+ str++;
+ }
+ if (exp_neg)
+ d = -d;
- case 24:
- rw = 4;
- rmsk = 0xff;
- rmbit = 0x80;
- rebit = 0x100;
- re = rw;
- break;
+ exp += d;
}
- rbit[re] = rebit;
- rlast = rndprc;
- }
- /* Shift down 1 temporarily if the data structure has an implied
- most significant bit and the number is denormal.
- Intel long double denormals also lose one bit of precision. */
- if ((exp <= 0) && (rndprc != NBITS)
- && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN)))
- {
- lost |= s[NI - 1] & 1;
- eshdn1 (s);
+ r->class = rvc_normal;
+ r->exp = exp;
+
+ normalize (r);
}
- /* Clear out all bits below the rounding bit,
- remembering in r if any were nonzero. */
- r = s[rw] & rmsk;
- if (rndprc < NBITS)
+ else
{
- i = rw + 1;
- while (i < NI)
+ /* Decimal floating point. */
+ const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
+ int d;
+
+ while (*str == '0')
+ str++;
+ while (ISDIGIT (*str))
{
- if (s[i])
- r |= 1;
- s[i] = 0;
- ++i;
+ d = *str++ - '0';
+ do_multiply (r, r, ten);
+ if (d)
+ do_add (r, r, real_digit (d), 0);
}
- }
- s[rw] &= ~rmsk;
- if ((r & rmbit) != 0)
- {
-#ifndef C4X
- if (r == rmbit)
+ if (*str == '.')
{
- if (lost == 0)
- { /* round to even */
- if ((s[re] & rebit) == 0)
- goto mddone;
+ str++;
+ if (r->class == rvc_zero)
+ {
+ while (*str == '0')
+ str++, exp--;
}
- else
+ while (ISDIGIT (*str))
{
- if (subflg != 0)
- goto mddone;
+ d = *str++ - '0';
+ do_multiply (r, r, ten);
+ if (d)
+ do_add (r, r, real_digit (d), 0);
+ exp--;
}
}
-#endif
- eaddm (rbit, s);
- }
-#ifndef C4X
- mddone:
-#endif
-/* Undo the temporary shift for denormal values. */
- if ((exp <= 0) && (rndprc != NBITS)
- && ((rndprc != 64) || ((rndprc == 64) && ! REAL_WORDS_BIG_ENDIAN)))
- {
- eshup1 (s);
- }
- if (s[2] != 0)
- { /* overflow on roundoff */
- eshdn1 (s);
- exp += 1;
- }
- mdfin:
- s[NI - 1] = 0;
- if (exp >= 32767L)
- {
-#ifndef INFINITY
- overf:
-#endif
-#ifdef INFINITY
- s[1] = 32767;
- for (i = 2; i < NI - 1; i++)
- s[i] = 0;
- if (extra_warnings)
- warning ("floating point overflow");
-#else
- s[1] = 32766;
- s[2] = 0;
- for (i = M + 1; i < NI - 1; i++)
- s[i] = 0xffff;
- s[NI - 1] = 0;
- if ((rndprc < 64) || (rndprc == 113))
+
+ if (*str == 'e' || *str == 'E')
{
- s[rw] &= ~rmsk;
- if (rndprc == 24)
+ bool exp_neg = false;
+
+ str++;
+ if (*str == '-')
+ {
+ exp_neg = true;
+ str++;
+ }
+ else if (*str == '+')
+ str++;
+
+ d = 0;
+ while (ISDIGIT (*str))
{
- s[5] = 0;
- s[6] = 0;
+ d *= 10;
+ d += *str - '0';
+ if (d > MAX_EXP)
+ {
+ /* Overflowed the exponent. */
+ if (exp_neg)
+ goto underflow;
+ else
+ goto overflow;
+ }
+ str++;
}
+ if (exp_neg)
+ d = -d;
+ exp += d;
}
-#endif
- return;
- }
- if (exp < 0)
- s[1] = 0;
- else
- s[1] = (UEMUSHORT) exp;
-}
-/* Subtract. C = B - A, all e type numbers. */
+ if (exp)
+ times_pten (r, exp);
+ }
-static int subflg = 0;
+ r->sign = sign;
+ return;
-static void
-esub (a, b, c)
- const UEMUSHORT *a, *b;
- UEMUSHORT *c;
-{
+ underflow:
+ get_zero (r, sign);
+ return;
-#ifdef NANS
- if (eisnan (a))
- {
- emov (a, c);
- return;
- }
- if (eisnan (b))
- {
- emov (b, c);
- return;
- }
-/* Infinity minus infinity is a NaN.
- Test for subtracting infinities of the same sign. */
- if (eisinf (a) && eisinf (b)
- && ((eisneg (a) ^ eisneg (b)) == 0))
- {
- mtherr ("esub", INVALID);
- enan (c, 0);
- return;
- }
-#endif
- subflg = 1;
- eadd1 (a, b, c);
+ overflow:
+ get_inf (r, sign);
+ return;
}
-/* Add. C = A + B, all e type. */
+/* Legacy. Similar, but return the result directly. */
-static void
-eadd (a, b, c)
- const UEMUSHORT *a, *b;
- UEMUSHORT *c;
+REAL_VALUE_TYPE
+real_from_string2 (s, mode)
+ const char *s;
+ enum machine_mode mode;
{
+ REAL_VALUE_TYPE r;
-#ifdef NANS
-/* NaN plus anything is a NaN. */
- if (eisnan (a))
- {
- emov (a, c);
- return;
- }
- if (eisnan (b))
- {
- emov (b, c);
- return;
- }
-/* Infinity minus infinity is a NaN.
- Test for adding infinities of opposite signs. */
- if (eisinf (a) && eisinf (b)
- && ((eisneg (a) ^ eisneg (b)) != 0))
- {
- mtherr ("esub", INVALID);
- enan (c, 0);
- return;
- }
-#endif
- subflg = 0;
- eadd1 (a, b, c);
+ real_from_string (&r, s);
+ if (mode != VOIDmode)
+ real_convert (&r, mode, &r);
+
+ return r;
}
-/* Arithmetic common to both addition and subtraction. */
+/* Initialize R from the integer pair HIGH+LOW. */
-static void
-eadd1 (a, b, c)
- const UEMUSHORT *a, *b;
- UEMUSHORT *c;
+void
+real_from_integer (r, mode, low, high, unsigned_p)
+ REAL_VALUE_TYPE *r;
+ enum machine_mode mode;
+ unsigned HOST_WIDE_INT low;
+ HOST_WIDE_INT high;
+ int unsigned_p;
{
- UEMUSHORT ai[NI], bi[NI], ci[NI];
- int i, lost, j, k;
- EMULONG lt, lta, ltb;
-
-#ifdef INFINITY
- if (eisinf (a))
- {
- emov (a, c);
- if (subflg)
- eneg (c);
- return;
- }
- if (eisinf (b))
- {
- emov (b, c);
- return;
- }
-#endif
- emovi (a, ai);
- emovi (b, bi);
- if (subflg)
- ai[0] = ~ai[0];
-
- /* compare exponents */
- lta = ai[E];
- ltb = bi[E];
- lt = lta - ltb;
- if (lt > 0L)
- { /* put the larger number in bi */
- emovz (bi, ci);
- emovz (ai, bi);
- emovz (ci, ai);
- ltb = bi[E];
- lt = -lt;
- }
- lost = 0;
- if (lt != 0L)
- {
- if (lt < (EMULONG) (-NBITS - 1))
- goto done; /* answer same as larger addend */
- k = (int) lt;
- lost = eshift (ai, k); /* shift the smaller number down */
- }
+ if (low == 0 && high == 0)
+ get_zero (r, 0);
else
{
- /* exponents were the same, so must compare significands */
- i = ecmpm (ai, bi);
- if (i == 0)
- { /* the numbers are identical in magnitude */
- /* if different signs, result is zero */
- if (ai[0] != bi[0])
- {
- eclear (c);
- return;
- }
- /* if same sign, result is double */
- /* double denormalized tiny number */
- if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0))
- {
- eshup1 (bi);
- goto done;
- }
- /* add 1 to exponent unless both are zero! */
- for (j = 1; j < NI - 1; j++)
- {
- if (bi[j] != 0)
- {
- ltb += 1;
- if (ltb >= 0x7fff)
- {
- eclear (c);
- if (ai[0] != 0)
- eneg (c);
- einfin (c);
- return;
- }
- break;
- }
- }
- bi[E] = (UEMUSHORT) ltb;
- goto done;
+ r->class = rvc_normal;
+ r->sign = high < 0 && !unsigned_p;
+ r->exp = 2 * HOST_BITS_PER_WIDE_INT;
+
+ if (r->sign)
+ {
+ high = ~high;
+ if (low == 0)
+ high += 1;
+ else
+ low = -low;
+ }
+
+ if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
+ {
+ r->sig[SIGSZ-1] = high;
+ r->sig[SIGSZ-2] = low;
+ memset (r->sig, 0, sizeof(long)*(SIGSZ-2));
}
- if (i > 0)
- { /* put the larger number in bi */
- emovz (bi, ci);
- emovz (ai, bi);
- emovz (ci, ai);
+ else if (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT)
+ {
+ r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
+ r->sig[SIGSZ-2] = high;
+ r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
+ r->sig[SIGSZ-4] = low;
+ if (SIGSZ > 4)
+ memset (r->sig, 0, sizeof(long)*(SIGSZ-4));
}
+ else
+ abort ();
+
+ normalize (r);
}
- if (ai[0] == bi[0])
- {
- eaddm (ai, bi);
- subflg = 0;
- }
- else
- {
- esubm (ai, bi);
- subflg = 1;
- }
- emdnorm (bi, lost, subflg, ltb, !ROUND_TOWARDS_ZERO);
- done:
- emovo (bi, c);
+ if (mode != VOIDmode)
+ real_convert (r, mode, r);
}
-/* Divide: C = B/A, all e type. */
+/* Returns 10**2**N. */
-static void
-ediv (a, b, c)
- const UEMUSHORT *a, *b;
- UEMUSHORT *c;
+static const REAL_VALUE_TYPE *
+ten_to_ptwo (n)
+ int n;
{
- UEMUSHORT ai[NI], bi[NI];
- int i, sign;
- EMULONG lt, lta, ltb;
+ static REAL_VALUE_TYPE tens[EXP_BITS];
-/* IEEE says if result is not a NaN, the sign is "-" if and only if
- operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
- sign = eisneg (a) ^ eisneg (b);
+ if (n < 0 || n >= EXP_BITS)
+ abort ();
-#ifdef NANS
-/* Return any NaN input. */
- if (eisnan (a))
- {
- emov (a, c);
- return;
- }
- if (eisnan (b))
- {
- emov (b, c);
- return;
- }
-/* Zero over zero, or infinity over infinity, is a NaN. */
- if (((ecmp (a, ezero) == 0) && (ecmp (b, ezero) == 0))
- || (eisinf (a) && eisinf (b)))
- {
- mtherr ("ediv", INVALID);
- enan (c, sign);
- return;
- }
-#endif
-/* Infinity over anything else is infinity. */
-#ifdef INFINITY
- if (eisinf (b))
+ if (tens[n].class == rvc_zero)
{
- einfin (c);
- goto divsign;
- }
-/* Anything else over infinity is zero. */
- if (eisinf (a))
- {
- eclear (c);
- goto divsign;
- }
-#endif
- emovi (a, ai);
- emovi (b, bi);
- lta = ai[E];
- ltb = bi[E];
- if (bi[E] == 0)
- { /* See if numerator is zero. */
- for (i = 1; i < NI - 1; i++)
+ if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
{
- if (bi[i] != 0)
- {
- ltb -= enormlz (bi);
- goto dnzro1;
- }
- }
- eclear (c);
- goto divsign;
- }
- dnzro1:
+ HOST_WIDE_INT t = 10;
+ int i;
- if (ai[E] == 0)
- { /* possible divide by zero */
- for (i = 1; i < NI - 1; i++)
+ for (i = 0; i < n; ++i)
+ t *= t;
+
+ real_from_integer (&tens[n], VOIDmode, t, 0, 1);
+ }
+ else
{
- if (ai[i] != 0)
- {
- lta -= enormlz (ai);
- goto dnzro2;
- }
+ const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
+ do_multiply (&tens[n], t, t);
}
-/* Divide by zero is not an invalid operation.
- It is a divide-by-zero operation! */
- einfin (c);
- mtherr ("ediv", SING);
- goto divsign;
}
- dnzro2:
-
- i = edivm (ai, bi);
- /* calculate exponent */
- lt = ltb - lta + EXONE;
- emdnorm (bi, i, 0, lt, !ROUND_TOWARDS_ZERO);
- emovo (bi, c);
- divsign:
-
- if (sign
-#ifndef IEEE
- && (ecmp (c, ezero) != 0)
-#endif
- )
- *(c+(NE-1)) |= 0x8000;
- else
- *(c+(NE-1)) &= ~0x8000;
+ return &tens[n];
}
-/* Multiply e-types A and B, return e-type product C. */
+/* Returns 10**(-2**N). */
-static void
-emul (a, b, c)
- const UEMUSHORT *a, *b;
- UEMUSHORT *c;
+static const REAL_VALUE_TYPE *
+ten_to_mptwo (n)
+ int n;
{
- UEMUSHORT ai[NI], bi[NI];
- int i, j, sign;
- EMULONG lt, lta, ltb;
+ static REAL_VALUE_TYPE tens[EXP_BITS];
-/* IEEE says if result is not a NaN, the sign is "-" if and only if
- operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
- sign = eisneg (a) ^ eisneg (b);
+ if (n < 0 || n >= EXP_BITS)
+ abort ();
-#ifdef NANS
-/* NaN times anything is the same NaN. */
- if (eisnan (a))
- {
- emov (a, c);
- return;
- }
- if (eisnan (b))
- {
- emov (b, c);
- return;
- }
-/* Zero times infinity is a NaN. */
- if ((eisinf (a) && (ecmp (b, ezero) == 0))
- || (eisinf (b) && (ecmp (a, ezero) == 0)))
- {
- mtherr ("emul", INVALID);
- enan (c, sign);
- return;
- }
-#endif
-/* Infinity times anything else is infinity. */
-#ifdef INFINITY
- if (eisinf (a) || eisinf (b))
- {
- einfin (c);
- goto mulsign;
- }
-#endif
- emovi (a, ai);
- emovi (b, bi);
- lta = ai[E];
- ltb = bi[E];
- if (ai[E] == 0)
- {
- for (i = 1; i < NI - 1; i++)
- {
- if (ai[i] != 0)
- {
- lta -= enormlz (ai);
- goto mnzer1;
- }
- }
- eclear (c);
- goto mulsign;
- }
- mnzer1:
+ if (tens[n].class == rvc_zero)
+ do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
- if (bi[E] == 0)
- {
- for (i = 1; i < NI - 1; i++)
- {
- if (bi[i] != 0)
- {
- ltb -= enormlz (bi);
- goto mnzer2;
- }
- }
- eclear (c);
- goto mulsign;
- }
- mnzer2:
+ return &tens[n];
+}
- /* Multiply significands */
- j = emulm (ai, bi);
- /* calculate exponent */
- lt = lta + ltb - (EXONE - 1);
- emdnorm (bi, j, 0, lt, !ROUND_TOWARDS_ZERO);
- emovo (bi, c);
+/* Returns N. */
- mulsign:
+static const REAL_VALUE_TYPE *
+real_digit (n)
+ int n;
+{
+ static REAL_VALUE_TYPE num[10];
- if (sign
-#ifndef IEEE
- && (ecmp (c, ezero) != 0)
-#endif
- )
- *(c+(NE-1)) |= 0x8000;
- else
- *(c+(NE-1)) &= ~0x8000;
+ if (n < 0 || n > 9)
+ abort ();
+
+ if (n > 0 && num[n].class == rvc_zero)
+ real_from_integer (&num[n], VOIDmode, n, 0, 1);
+
+ return &num[n];
}
-/* Convert double precision PE to e-type Y. */
+/* Multiply R by 10**EXP. */
static void
-e53toe (pe, y)
- const UEMUSHORT *pe;
- UEMUSHORT *y;
+times_pten (r, exp)
+ REAL_VALUE_TYPE *r;
+ int exp;
{
-#ifdef DEC
-
- dectoe (pe, y);
-
-#else
-#ifdef IBM
+ REAL_VALUE_TYPE pten, *rr;
+ bool negative = (exp < 0);
+ int i;
- ibmtoe (pe, y, DFmode);
+ if (negative)
+ {
+ exp = -exp;
+ pten = *real_digit (1);
+ rr = &pten;
+ }
+ else
+ rr = r;
-#else
-#ifdef C4X
+ for (i = 0; exp > 0; ++i, exp >>= 1)
+ if (exp & 1)
+ do_multiply (rr, rr, ten_to_ptwo (i));
- c4xtoe (pe, y, HFmode);
+ if (negative)
+ do_divide (r, r, &pten);
+}
-#else
+/* Fills R with +Inf. */
- ieeetoe (pe, y, &ieee_53);
-
-#endif /* not C4X */
-#endif /* not IBM */
-#endif /* not DEC */
+void
+real_inf (r)
+ REAL_VALUE_TYPE *r;
+{
+ get_inf (r, 0);
}
-/* Convert double extended precision float PE to e type Y. */
+/* Fills R with a NaN whose significand is described by STR. If QUIET,
+ we force a QNaN, else we force an SNaN. The string, if not empty,
+ is parsed as a number and placed in the significand. Return true
+ if the string was successfully parsed. */
-static void
-e64toe (pe, y)
- const UEMUSHORT *pe;
- UEMUSHORT *y;
+bool
+real_nan (r, str, quiet, mode)
+ REAL_VALUE_TYPE *r;
+ const char *str;
+ int quiet;
+ enum machine_mode mode;
{
- UEMUSHORT yy[NI];
- const UEMUSHORT *e;
- UEMUSHORT *p, *q;
- int i;
+ const struct real_format *fmt;
- e = pe;
- p = yy;
- for (i = 0; i < NE - 5; i++)
- *p++ = 0;
-#ifndef C4X
- /* REAL_WORDS_BIG_ENDIAN is always 0 for DEC and 1 for IBM.
- This precision is not ordinarily supported on DEC or IBM. */
- if (! REAL_WORDS_BIG_ENDIAN)
- {
- for (i = 0; i < 5; i++)
- *p++ = *e++;
-
-#ifdef IEEE
- /* For denormal long double Intel format, shift significand up one
- -- but only if the top significand bit is zero. A top bit of 1
- is "pseudodenormal" when the exponent is zero. */
- if ((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0)
- {
- UEMUSHORT temp[NI];
+ fmt = real_format_for_mode[mode - QFmode];
+ if (fmt == NULL)
+ abort ();
- emovi (yy, temp);
- eshup1 (temp);
- emovo (temp,y);
- return;
- }
-#endif /* IEEE */
- }
- else
+ if (*str == 0)
{
- p = &yy[0] + (NE - 1);
- *p-- = *e++;
- ++e;
- for (i = 0; i < 4; i++)
- *p-- = *e++;
+ if (quiet)
+ get_canonical_qnan (r, 0);
+ else
+ get_canonical_snan (r, 0);
}
-#endif /* not C4X */
-#ifdef INFINITY
- /* Point to the exponent field and check max exponent cases. */
- p = &yy[NE - 1];
- if ((*p & 0x7fff) == 0x7fff)
+ else
{
-#ifdef NANS
- if (! REAL_WORDS_BIG_ENDIAN)
+ int base = 10, d;
+ bool neg = false;
+
+ memset (r, 0, sizeof (*r));
+ r->class = rvc_nan;
+
+ /* Parse akin to strtol into the significand of R. */
+
+ while (ISSPACE (*str))
+ str++;
+ if (*str == '-')
+ str++, neg = true;
+ else if (*str == '+')
+ str++;
+ if (*str == '0')
{
- for (i = 0; i < 4; i++)
- {
- if ((i != 3 && pe[i] != 0)
- /* Anything but 0x8000 here, including 0, is a NaN. */
- || (i == 3 && pe[i] != 0x8000))
- {
- enan (y, (*p & 0x8000) != 0);
- return;
- }
- }
+ if (*++str == 'x')
+ str++, base = 16;
+ else
+ base = 8;
}
- else
+
+ while ((d = hex_value (*str)) < base)
{
- /* In Motorola extended precision format, the most significant
- bit of an infinity mantissa could be either 1 or 0. It is
- the lower order bits that tell whether the value is a NaN. */
- if ((pe[2] & 0x7fff) != 0)
- goto bigend_nan;
+ REAL_VALUE_TYPE u;
- for (i = 3; i <= 5; i++)
+ switch (base)
{
- if (pe[i] != 0)
- {
-bigend_nan:
- enan (y, (*p & 0x8000) != 0);
- return;
- }
+ case 8:
+ lshift_significand (r, r, 3);
+ break;
+ case 16:
+ lshift_significand (r, r, 4);
+ break;
+ case 10:
+ lshift_significand_1 (&u, r);
+ lshift_significand (r, r, 3);
+ add_significands (r, r, &u);
+ break;
+ default:
+ abort ();
}
+
+ get_zero (&u, 0);
+ u.sig[0] = d;
+ add_significands (r, r, &u);
+
+ str++;
}
-#endif /* NANS */
- eclear (y);
- einfin (y);
- if (*p & 0x8000)
- eneg (y);
- return;
+
+ /* Must have consumed the entire string for success. */
+ if (*str != 0)
+ return false;
+
+ /* Shift the significand into place such that the bits
+ are in the most significant bits for the format. */
+ lshift_significand (r, r, SIGNIFICAND_BITS - fmt->p);
+
+ /* Our MSB is always unset for NaNs. */
+ r->sig[SIGSZ-1] &= ~SIG_MSB;
+
+ /* Force quiet or signalling NaN. */
+ if (quiet)
+ r->sig[SIGSZ-1] |= SIG_MSB >> 1;
+ else
+ r->sig[SIGSZ-1] &= ~(SIG_MSB >> 1);
+
+ /* Force at least one bit of the significand set. */
+ for (d = 0; d < SIGSZ; ++d)
+ if (r->sig[d])
+ break;
+ if (d == SIGSZ)
+ r->sig[SIGSZ-1] |= SIG_MSB >> 2;
+
+ /* Our intermediate format forces QNaNs to have MSB-1 set.
+ If the target format has QNaNs with the top bit unset,
+ mirror the output routines and invert the top two bits. */
+ if (!fmt->qnan_msb_set)
+ r->sig[SIGSZ-1] ^= (SIG_MSB >> 1) | (SIG_MSB >> 2);
}
-#endif /* INFINITY */
- p = yy;
- q = y;
- for (i = 0; i < NE; i++)
- *q++ = *p++;
+
+ return true;
}
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-/* Convert 128-bit long double precision float PE to e type Y. */
+/* Fills R with 2**N. */
-static void
-e113toe (pe, y)
- const UEMUSHORT *pe;
- UEMUSHORT *y;
+void
+real_2expN (r, n)
+ REAL_VALUE_TYPE *r;
+ int n;
{
- ieeetoe (pe, y, &ieee_113);
-}
-#endif /* INTEL_EXTENDED_IEEE_FORMAT == 0 */
+ memset (r, 0, sizeof (*r));
-/* Convert single precision float PE to e type Y. */
+ n++;
+ if (n > MAX_EXP)
+ r->class = rvc_inf;
+ else if (n < -MAX_EXP)
+ ;
+ else
+ {
+ r->class = rvc_normal;
+ r->exp = n;
+ r->sig[SIGSZ-1] = SIG_MSB;
+ }
+}
+
static void
-e24toe (pe, y)
- const UEMUSHORT *pe;
- UEMUSHORT *y;
+round_for_format (fmt, r)
+ const struct real_format *fmt;
+ REAL_VALUE_TYPE *r;
{
-#ifdef IBM
-
- ibmtoe (pe, y, SFmode);
+ int p2, np2, i, w;
+ unsigned long sticky;
+ bool guard, lsb;
+ int emin2m1, emax2;
-#else
+ p2 = fmt->p * fmt->log2_b;
+ emin2m1 = (fmt->emin - 1) * fmt->log2_b;
+ emax2 = fmt->emax * fmt->log2_b;
-#ifdef C4X
-
- c4xtoe (pe, y, QFmode);
+ np2 = SIGNIFICAND_BITS - p2;
+ switch (r->class)
+ {
+ underflow:
+ get_zero (r, r->sign);
+ case rvc_zero:
+ if (!fmt->has_signed_zero)
+ r->sign = 0;
+ return;
-#else
-#ifdef DEC
+ overflow:
+ get_inf (r, r->sign);
+ case rvc_inf:
+ return;
- ieeetoe (pe, y, &dec_f);
-
-#else
+ case rvc_nan:
+ clear_significand_below (r, np2);
- ieeetoe (pe, y, &ieee_24);
+ /* If we've cleared the entire significand, we need one bit
+ set for this to continue to be a NaN. */
+ for (i = 0; i < SIGSZ; ++i)
+ if (r->sig[i])
+ break;
+ if (i == SIGSZ)
+ r->sig[SIGSZ-1] = SIG_MSB >> 2;
+ return;
-#endif /* not DEC */
-#endif /* not C4X */
-#endif /* not IBM */
-}
+ case rvc_normal:
+ break;
-/* Convert machine format float of specified format PE to e type Y. */
+ default:
+ abort ();
+ }
-static void
-ieeetoe (pe, y, fmt)
- const UEMUSHORT *pe;
- UEMUSHORT *y;
- const struct ieee_format *fmt;
-{
- UEMUSHORT r;
- const UEMUSHORT *e;
- UEMUSHORT *p;
- UEMUSHORT yy[NI];
- int denorm, i, k;
- int shortsm1 = fmt->bits / 16 - 1;
-#ifdef INFINITY
- int expmask = (1 << fmt->expbits) - 1;
-#endif
-int expshift = (fmt->precision - 1) & 0x0f;
- int highbit = 1 << expshift;
-
- e = pe;
- denorm = 0;
- ecleaz (yy);
- if (! REAL_WORDS_BIG_ENDIAN)
- e += shortsm1;
- r = *e;
- yy[0] = 0;
- if (r & 0x8000)
- yy[0] = 0xffff;
- yy[M] = (r & (highbit - 1)) | highbit;
- r = (r & 0x7fff) >> expshift;
-#ifdef INFINITY
- if (!LARGEST_EXPONENT_IS_NORMAL (fmt->precision) && r == expmask)
+ /* If we're not base2, normalize the exponent to a multiple of
+ the true base. */
+ if (fmt->log2_b != 1)
{
-#ifdef NANS
- /* First check the word where high order mantissa and exponent live */
- if ((*e & (highbit - 1)) != 0)
+ int shift = r->exp & (fmt->log2_b - 1);
+ if (shift)
{
- enan (y, yy[0] != 0);
- return;
+ shift = fmt->log2_b - shift;
+ sticky_rshift_significand (r, r, shift);
+ r->exp += shift;
}
- if (! REAL_WORDS_BIG_ENDIAN)
+ }
+
+ /* Check the range of the exponent. If we're out of range,
+ either underflow or overflow. */
+ if (r->exp > emax2)
+ goto overflow;
+ else if (r->exp <= emin2m1)
+ {
+ int diff;
+
+ if (!fmt->has_denorm)
{
- for (i = 0; i < shortsm1; i++)
- {
- if (pe[i] != 0)
- {
- enan (y, yy[0] != 0);
- return;
- }
- }
+ /* Don't underflow completely until we've had a chance to round. */
+ if (r->exp < emin2m1)
+ goto underflow;
}
else
{
- for (i = 1; i < shortsm1 + 1; i++)
+ diff = emin2m1 - r->exp + 1;
+ if (diff > p2)
+ goto underflow;
+
+ /* De-normalize the significand. */
+ sticky_rshift_significand (r, r, diff);
+ r->exp += diff;
+ }
+ }
+
+ /* There are P2 true significand bits, followed by one guard bit,
+ followed by one sticky bit, followed by stuff. Fold nonzero
+ stuff into the sticky bit. */
+
+ sticky = 0;
+ for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
+ sticky |= r->sig[i];
+ sticky |=
+ r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
+
+ guard = test_significand_bit (r, np2 - 1);
+ lsb = test_significand_bit (r, np2);
+
+ /* Round to even. */
+ if (guard && (sticky || lsb))
+ {
+ REAL_VALUE_TYPE u;
+ get_zero (&u, 0);
+ set_significand_bit (&u, np2);
+
+ if (add_significands (r, r, &u))
+ {
+ /* Overflow. Means the significand had been all ones, and
+ is now all zeros. Need to increase the exponent, and
+ possibly re-normalize it. */
+ if (++r->exp > emax2)
+ goto overflow;
+ r->sig[SIGSZ-1] = SIG_MSB;
+
+ if (fmt->log2_b != 1)
{
- if (pe[i] != 0)
+ int shift = r->exp & (fmt->log2_b - 1);
+ if (shift)
{
- enan (y, yy[0] != 0);
- return;
+ shift = fmt->log2_b - shift;
+ sticky_rshift_significand (r, r, shift);
+ r->exp += shift;
+ if (r->exp > emax2)
+ goto overflow;
}
}
}
-#endif /* NANS */
- eclear (y);
- einfin (y);
- if (yy[0])
- eneg (y);
- return;
- }
-#endif /* INFINITY */
- /* If zero exponent, then the significand is denormalized.
- So take back the understood high significand bit. */
- if (r == 0)
- {
- denorm = 1;
- yy[M] &= ~highbit;
- }
- r += fmt->adjustment;
- yy[E] = r;
- p = &yy[M + 1];
- if (! REAL_WORDS_BIG_ENDIAN)
- {
- for (i = 0; i < shortsm1; i++)
- *p++ = *(--e);
- }
- else
- {
- ++e;
- for (i = 0; i < shortsm1; i++)
- *p++ = *e++;
- }
- if (fmt->precision == 113)
- {
- /* denorm is left alone in 113 bit format */
- if (!denorm)
- eshift (yy, -1);
- }
- else
- {
- eshift (yy, -(expshift + 1));
- if (denorm)
- { /* if zero exponent, then normalize the significand */
- if ((k = enormlz (yy)) > NBITS)
- ecleazs (yy);
- else
- yy[E] -= (UEMUSHORT) (k - 1);
- }
}
- emovo (yy, y);
-}
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-/* Convert e-type X to IEEE 128-bit long double format E. */
+ /* Catch underflow that we deferred until after rounding. */
+ if (r->exp <= emin2m1)
+ goto underflow;
-static void
-etoe113 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
-{
- etoieee (x, e, &ieee_113);
+ /* Clear out trailing garbage. */
+ clear_significand_below (r, np2);
}
-/* Convert exploded e-type X, that has already been rounded to
- 113-bit precision, to IEEE 128-bit long double format Y. */
+/* Extend or truncate to a new mode. */
-static void
-toe113 (x, y)
- UEMUSHORT *x, *y;
+void
+real_convert (r, mode, a)
+ REAL_VALUE_TYPE *r;
+ enum machine_mode mode;
+ const REAL_VALUE_TYPE *a;
{
- toieee (x, y, &ieee_113);
-}
+ const struct real_format *fmt;
-#endif /* INTEL_EXTENDED_IEEE_FORMAT == 0 */
+ fmt = real_format_for_mode[mode - QFmode];
+ if (fmt == NULL)
+ abort ();
-/* Convert e-type X to IEEE double extended format E. */
+ *r = *a;
+ round_for_format (fmt, r);
-static void
-etoe64 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
-{
- etoieee (x, e, &ieee_64);
+ /* round_for_format de-normalizes denormals. Undo just that part. */
+ if (r->class == rvc_normal)
+ normalize (r);
}
-/* Convert exploded e-type X, that has already been rounded to
- 64-bit precision, to IEEE double extended format Y. */
+/* Legacy. Likewise, except return the struct directly. */
-static void
-toe64 (x, y)
- UEMUSHORT *x, *y;
+REAL_VALUE_TYPE
+real_value_truncate (mode, a)
+ enum machine_mode mode;
+ REAL_VALUE_TYPE a;
{
- toieee (x, y, &ieee_64);
+ REAL_VALUE_TYPE r;
+ real_convert (&r, mode, &a);
+ return r;
}
-/* e type to double precision. */
+/* Return true if truncating to MODE is exact. */
-#ifdef DEC
-/* Convert e-type X to DEC-format double E. */
-
-static void
-etoe53 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
+bool
+exact_real_truncate (mode, a)
+ enum machine_mode mode;
+ const REAL_VALUE_TYPE *a;
{
- etodec (x, e);
+ REAL_VALUE_TYPE t;
+ real_convert (&t, mode, a);
+ return real_identical (&t, a);
}
-/* Convert exploded e-type X, that has already been rounded to
- 56-bit double precision, to DEC double Y. */
+/* Write R to the given target format. Place the words of the result
+ in target word order in BUF. There are always 32 bits in each
+ long, no matter the size of the host long.
-static void
-toe53 (x, y)
- UEMUSHORT *x, *y;
-{
- todec (x, y);
-}
-
-#else
-#ifdef IBM
-/* Convert e-type X to IBM 370-format double E. */
+ Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
-static void
-etoe53 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
+long
+real_to_target_fmt (buf, r_orig, fmt)
+ long *buf;
+ const REAL_VALUE_TYPE *r_orig;
+ const struct real_format *fmt;
{
- etoibm (x, e, DFmode);
-}
-
-/* Convert exploded e-type X, that has already been rounded to
- 56-bit precision, to IBM 370 double Y. */
+ REAL_VALUE_TYPE r;
+ long buf1;
-static void
-toe53 (x, y)
- UEMUSHORT *x, *y;
-{
- toibm (x, y, DFmode);
-}
+ r = *r_orig;
+ round_for_format (fmt, &r);
-#else /* it's neither DEC nor IBM */
-#ifdef C4X
-/* Convert e-type X to C4X-format long double E. */
+ if (!buf)
+ buf = &buf1;
+ (*fmt->encode) (fmt, buf, &r);
-static void
-etoe53 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
-{
- etoc4x (x, e, HFmode);
+ return *buf;
}
-/* Convert exploded e-type X, that has already been rounded to
- 56-bit precision, to IBM 370 double Y. */
+/* Similar, but look up the format from MODE. */
-static void
-toe53 (x, y)
- UEMUSHORT *x, *y;
+long
+real_to_target (buf, r, mode)
+ long *buf;
+ const REAL_VALUE_TYPE *r;
+ enum machine_mode mode;
{
- toc4x (x, y, HFmode);
-}
+ const struct real_format *fmt;
-#else /* it's neither DEC nor IBM nor C4X */
-
-/* Convert e-type X to IEEE double E. */
+ fmt = real_format_for_mode[mode - QFmode];
+ if (fmt == NULL)
+ abort ();
-static void
-etoe53 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
-{
- etoieee (x, e, &ieee_53);
+ return real_to_target_fmt (buf, r, fmt);
}
-/* Convert exploded e-type X, that has already been rounded to
- 53-bit precision, to IEEE double Y. */
+/* Read R from the given target format. Read the words of the result
+ in target word order in BUF. There are always 32 bits in each
+ long, no matter the size of the host long. */
-static void
-toe53 (x, y)
- UEMUSHORT *x, *y;
+void
+real_from_target_fmt (r, buf, fmt)
+ REAL_VALUE_TYPE *r;
+ const long *buf;
+ const struct real_format *fmt;
{
- toieee (x, y, &ieee_53);
-}
-
-#endif /* not C4X */
-#endif /* not IBM */
-#endif /* not DEC */
+ (*fmt->decode) (fmt, r, buf);
+}
+/* Similar, but look up the format from MODE. */
-
-/* e type to single precision. */
-
-#ifdef IBM
-/* Convert e-type X to IBM 370 float E. */
-
-static void
-etoe24 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
+void
+real_from_target (r, buf, mode)
+ REAL_VALUE_TYPE *r;
+ const long *buf;
+ enum machine_mode mode;
{
- etoibm (x, e, SFmode);
-}
+ const struct real_format *fmt;
-/* Convert exploded e-type X, that has already been rounded to
- float precision, to IBM 370 float Y. */
-
-static void
-toe24 (x, y)
- UEMUSHORT *x, *y;
-{
- toibm (x, y, SFmode);
-}
+ fmt = real_format_for_mode[mode - QFmode];
+ if (fmt == NULL)
+ abort ();
-#else /* it's not IBM */
+ (*fmt->decode) (fmt, r, buf);
+}
-#ifdef C4X
-/* Convert e-type X to C4X float E. */
+/* Return the number of bits in the significand for MODE. */
+/* ??? Legacy. Should get access to real_format directly. */
-static void
-etoe24 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
+int
+significand_size (mode)
+ enum machine_mode mode;
{
- etoc4x (x, e, QFmode);
-}
+ const struct real_format *fmt;
-/* Convert exploded e-type X, that has already been rounded to
- float precision, to IBM 370 float Y. */
+ fmt = real_format_for_mode[mode - QFmode];
+ if (fmt == NULL)
+ return 0;
-static void
-toe24 (x, y)
- UEMUSHORT *x, *y;
-{
- toc4x (x, y, QFmode);
+ return fmt->p * fmt->log2_b;
}
-#else /* it's neither IBM nor C4X */
-
-#ifdef DEC
+/* Return a hash value for the given real value. */
+/* ??? The "unsigned int" return value is intended to be hashval_t,
+ but I didn't want to pull hashtab.h into real.h. */
-/* Convert e-type X to DEC F-float E. */
-
-static void
-etoe24 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
+unsigned int
+real_hash (r)
+ const REAL_VALUE_TYPE *r;
{
- etoieee (x, e, &dec_f);
-}
+ unsigned int h;
+ size_t i;
-/* Convert exploded e-type X, that has already been rounded to
- float precision, to DEC F-float Y. */
+ h = r->class | (r->sign << 2);
+ switch (r->class)
+ {
+ case rvc_zero:
+ case rvc_inf:
+ break;
-static void
-toe24 (x, y)
- UEMUSHORT *x, *y;
-{
- toieee (x, y, &dec_f);
-}
+ case rvc_normal:
+ h |= r->exp << 3;
+ /* FALLTHRU */
-#else
+ case rvc_nan:
+ if (sizeof(unsigned long) > sizeof(unsigned int))
+ for (i = 0; i < SIGSZ; ++i)
+ {
+ unsigned long s = r->sig[i];
+ h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
+ }
+ else
+ for (i = 0; i < SIGSZ; ++i)
+ h ^= r->sig[i];
+ break;
-/* Convert e-type X to IEEE float E. */
+ default:
+ abort ();
+ }
-static void
-etoe24 (x, e)
- const UEMUSHORT *x;
- UEMUSHORT *e;
-{
- etoieee (x, e, &ieee_24);
+ return h;
}
+
+/* IEEE single-precision format. */
-/* Convert exploded e-type X, that has already been rounded to
- float precision, to IEEE float Y. */
+static void encode_ieee_single PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_ieee_single PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
static void
-toe24 (x, y)
- UEMUSHORT *x, *y;
+encode_ieee_single (fmt, buf, r)
+ const struct real_format *fmt;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- toieee (x, y, &ieee_24);
-}
+ unsigned long image, sig, exp;
+ bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
+
+ image = r->sign << 31;
+ sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
-#endif /* not DEC */
-#endif /* not C4X */
-#endif /* not IBM */
+ switch (r->class)
+ {
+ case rvc_zero:
+ break;
+ case rvc_inf:
+ if (fmt->has_inf)
+ image |= 255 << 23;
+ else
+ image |= 0x7fffffff;
+ break;
-/* Convert e-type X to the IEEE format described by FMT. */
+ case rvc_nan:
+ if (fmt->has_nans)
+ {
+ image |= 255 << 23;
+ image |= sig;
+ if (!fmt->qnan_msb_set)
+ image ^= 1 << 23 | 1 << 22;
+ }
+ else
+ image |= 0x7fffffff;
+ break;
-static void
-etoieee (x, e, fmt)
- const UEMUSHORT *x;
- UEMUSHORT *e;
- const struct ieee_format *fmt;
-{
- UEMUSHORT xi[NI];
- EMULONG exp;
- int rndsav;
+ case rvc_normal:
+ /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
+ whereas the intermediate representation is 0.F x 2**exp.
+ Which means we're off by one. */
+ if (denormal)
+ exp = 0;
+ else
+ exp = r->exp + 127 - 1;
+ image |= exp << 23;
+ image |= sig;
+ break;
-#ifdef NANS
- if (eisnan (x))
- {
- make_nan (e, eisneg (x), fmt->mode);
- return;
+ default:
+ abort ();
}
-#endif
-
- emovi (x, xi);
-#ifdef INFINITY
- if (eisinf (x))
- goto nonorm;
-#endif
- /* Adjust exponent for offset. */
- exp = (EMULONG) xi[E] - fmt->adjustment;
-
- /* Round off to nearest or even. */
- rndsav = rndprc;
- rndprc = fmt->precision;
- emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
- rndprc = rndsav;
-#ifdef INFINITY
- nonorm:
-#endif
- toieee (xi, e, fmt);
+ buf[0] = image;
}
-/* Convert exploded e-type X, that has already been rounded to
- the necessary precision, to the IEEE format described by FMT. */
-
static void
-toieee (x, y, fmt)
- UEMUSHORT *x, *y;
- const struct ieee_format *fmt;
+decode_ieee_single (fmt, r, buf)
+ const struct real_format *fmt;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT maxexp;
- UEMUSHORT *q;
- int words;
- int i;
+ unsigned long image = buf[0] & 0xffffffff;
+ bool sign = (image >> 31) & 1;
+ int exp = (image >> 23) & 0xff;
- maxexp = (1 << fmt->expbits) - 1;
- words = (fmt->bits - fmt->expbits) / EMUSHORT_SIZE;
-
-#ifdef NANS
- if (eiisnan (x))
- {
- make_nan (y, eiisneg (x), fmt->mode);
- return;
- }
-#endif
+ memset (r, 0, sizeof (*r));
+ image <<= HOST_BITS_PER_LONG - 24;
+ image &= ~SIG_MSB;
- if (fmt->expbits < 15
- && LARGEST_EXPONENT_IS_NORMAL (fmt->bits)
- && x[E] > maxexp)
+ if (exp == 0)
{
- saturate (y, eiisneg (x), fmt->bits, 1);
- return;
+ if (image && fmt->has_denorm)
+ {
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = -126;
+ r->sig[SIGSZ-1] = image << 1;
+ normalize (r);
+ }
+ else if (fmt->has_signed_zero)
+ r->sign = sign;
}
-
- /* Point to the exponent. */
- if (REAL_WORDS_BIG_ENDIAN)
- q = y;
- else
- q = y + words;
-
- /* Copy the sign. */
- if (x[0])
- *q = 0x8000;
- else
- *q = 0;
-
- if (fmt->expbits < 15
- && !LARGEST_EXPONENT_IS_NORMAL (fmt->bits)
- && x[E] >= maxexp)
+ else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
{
- /* Saturate at largest number less that infinity. */
- UEMUSHORT fill;
-#ifdef INFINITY
- *q |= maxexp << (15 - fmt->expbits);
- fill = 0;
-#else
- *q |= (maxexp << (15 - fmt->expbits)) - 1;
- fill = 0xffff;
-#endif
-
- if (!REAL_WORDS_BIG_ENDIAN)
+ if (image)
{
- for (i = 0; i < words; i++)
- *(--q) = fill;
+ r->class = rvc_nan;
+ r->sign = sign;
+ if (!fmt->qnan_msb_set)
+ image ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
+ r->sig[SIGSZ-1] = image;
}
else
{
- for (i = 0; i < words; i++)
- *(++q) = fill;
+ r->class = rvc_inf;
+ r->sign = sign;
}
-#if defined(INFINITY) && defined(ERANGE)
- errno = ERANGE;
-#endif
- return;
- }
-
- /* If denormal and DEC float, return zero (DEC has no denormals) */
-#ifdef DEC
- if (x[E] == 0)
- {
- for (i = 0; i < fmt->bits / EMUSHORT_SIZE ; i++)
- q[i] = 0;
- return;
}
-#endif /* DEC */
-
- /* Delete the implied bit unless denormal, except for
- 64-bit precision. */
- if (fmt->precision != 64 && x[E] != 0)
+ else
{
- eshup1 (x);
- }
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = exp - 127 + 1;
+ r->sig[SIGSZ-1] = image | SIG_MSB;
+ }
+}
+
+const struct real_format ieee_single_format =
+ {
+ encode_ieee_single,
+ decode_ieee_single,
+ 2,
+ 1,
+ 24,
+ -125,
+ 128,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
- /* Shift denormal double extended Intel format significand down
- one bit. */
- if (fmt->precision == 64 && x[E] == 0 && ! REAL_WORDS_BIG_ENDIAN)
- eshdn1 (x);
-
- if (fmt->expbits < 15)
- {
- /* Shift the significand. */
- eshift (x, 15 - fmt->expbits);
+
+/* IEEE double-precision format. */
- /* Combine the exponent and upper bits of the significand. */
- *q |= x[E] << (15 - fmt->expbits);
- *q |= x[M] & (UEMUSHORT) ~((maxexp << (15 - fmt->expbits)) | 0x8000);
- }
- else
- {
- /* Copy the exponent. */
- *q |= x[E];
- }
+static void encode_ieee_double PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_ieee_double PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
- /* Add padding after the exponent. At the moment, this is only necessary for
- 64-bit precision; in this case, the padding is 16 bits. */
- if (fmt->precision == 64)
- {
- *(q + 1) = 0;
+static void
+encode_ieee_double (fmt, buf, r)
+ const struct real_format *fmt;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
+{
+ unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
+ bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
- /* Skip padding. */
- if (REAL_WORDS_BIG_ENDIAN)
- ++q;
- }
+ image_hi = r->sign << 31;
+ image_lo = 0;
- /* Copy the significand. */
- if (REAL_WORDS_BIG_ENDIAN)
- {
- for (i = 0; i < words; i++)
- *(++q) = x[i + M + 1];
- }
-#ifdef INFINITY
- else if (fmt->precision == 64 && eiisinf (x))
+ if (HOST_BITS_PER_LONG == 64)
{
- /* Intel double extended infinity significand. */
- *(--q) = 0x8000;
- *(--q) = 0;
- *(--q) = 0;
- *(--q) = 0;
+ sig_hi = r->sig[SIGSZ-1];
+ sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
+ sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
}
-#endif
else
{
- for (i = 0; i < words; i++)
- *(--q) = x[i + M + 1];
+ sig_hi = r->sig[SIGSZ-1];
+ sig_lo = r->sig[SIGSZ-2];
+ sig_lo = (sig_hi << 21) | (sig_lo >> 11);
+ sig_hi = (sig_hi >> 11) & 0xfffff;
}
-}
-
-/* Compare two e type numbers.
- Return +1 if a > b
- 0 if a == b
- -1 if a < b
- -2 if either a or b is a NaN. */
+ switch (r->class)
+ {
+ case rvc_zero:
+ break;
-static int
-ecmp (a, b)
- const UEMUSHORT *a, *b;
-{
- UEMUSHORT ai[NI], bi[NI];
- UEMUSHORT *p, *q;
- int i;
- int msign;
+ case rvc_inf:
+ if (fmt->has_inf)
+ image_hi |= 2047 << 20;
+ else
+ {
+ image_hi |= 0x7fffffff;
+ image_lo = 0xffffffff;
+ }
+ break;
-#ifdef NANS
- if (eisnan (a) || eisnan (b))
- return (-2);
-#endif
- emovi (a, ai);
- p = ai;
- emovi (b, bi);
- q = bi;
-
- if (*p != *q)
- { /* the signs are different */
- /* -0 equals + 0 */
- for (i = 1; i < NI - 1; i++)
+ case rvc_nan:
+ if (fmt->has_nans)
{
- if (ai[i] != 0)
- goto nzro;
- if (bi[i] != 0)
- goto nzro;
+ image_hi |= 2047 << 20;
+ image_hi |= sig_hi;
+ if (!fmt->qnan_msb_set)
+ image_hi ^= 1 << 19 | 1 << 18;
+ image_lo = sig_lo;
}
- return (0);
- nzro:
- if (*p == 0)
- return (1);
else
- return (-1);
- }
- /* both are the same sign */
- if (*p == 0)
- msign = 1;
- else
- msign = -1;
- i = NI - 1;
- do
- {
- if (*p++ != *q++)
{
- goto diff;
+ image_hi |= 0x7fffffff;
+ image_lo = 0xffffffff;
}
- }
- while (--i > 0);
-
- return (0); /* equality */
-
- diff:
-
- if (*(--p) > *(--q))
- return (msign); /* p is bigger */
- else
- return (-msign); /* p is littler */
-}
-
-#if 0
-/* Find e-type nearest integer to X, as floor (X + 0.5). */
-
-static void
-eround (x, y)
- const UEMUSHORT *x;
- UEMUSHORT *y;
-{
- eadd (ehalf, x, y);
- efloor (y, y);
-}
-#endif /* 0 */
-
-/* Convert HOST_WIDE_INT LP to e type Y. */
+ break;
-static void
-ltoe (lp, y)
- const HOST_WIDE_INT *lp;
- UEMUSHORT *y;
-{
- UEMUSHORT yi[NI];
- unsigned HOST_WIDE_INT ll;
- int k;
+ case rvc_normal:
+ /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
+ whereas the intermediate representation is 0.F x 2**exp.
+ Which means we're off by one. */
+ if (denormal)
+ exp = 0;
+ else
+ exp = r->exp + 1023 - 1;
+ image_hi |= exp << 20;
+ image_hi |= sig_hi;
+ image_lo = sig_lo;
+ break;
- ecleaz (yi);
- if (*lp < 0)
- {
- /* make it positive */
- ll = (unsigned HOST_WIDE_INT) (-(*lp));
- yi[0] = 0xffff; /* put correct sign in the e type number */
- }
- else
- {
- ll = (unsigned HOST_WIDE_INT) (*lp);
+ default:
+ abort ();
}
- /* move the long integer to yi significand area */
-#if HOST_BITS_PER_WIDE_INT == 64
- yi[M] = (UEMUSHORT) (ll >> 48);
- yi[M + 1] = (UEMUSHORT) (ll >> 32);
- yi[M + 2] = (UEMUSHORT) (ll >> 16);
- yi[M + 3] = (UEMUSHORT) ll;
- yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
-#else
- yi[M] = (UEMUSHORT) (ll >> 16);
- yi[M + 1] = (UEMUSHORT) ll;
- yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
-#endif
- if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
- ecleaz (yi); /* it was zero */
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = image_hi, buf[1] = image_lo;
else
- yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
- emovo (yi, y); /* output the answer */
+ buf[0] = image_lo, buf[1] = image_hi;
}
-/* Convert unsigned HOST_WIDE_INT LP to e type Y. */
-
static void
-ultoe (lp, y)
- const unsigned HOST_WIDE_INT *lp;
- UEMUSHORT *y;
+decode_ieee_double (fmt, r, buf)
+ const struct real_format *fmt;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT yi[NI];
- unsigned HOST_WIDE_INT ll;
- int k;
-
- ecleaz (yi);
- ll = *lp;
-
- /* move the long integer to ayi significand area */
-#if HOST_BITS_PER_WIDE_INT == 64
- yi[M] = (UEMUSHORT) (ll >> 48);
- yi[M + 1] = (UEMUSHORT) (ll >> 32);
- yi[M + 2] = (UEMUSHORT) (ll >> 16);
- yi[M + 3] = (UEMUSHORT) ll;
- yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
-#else
- yi[M] = (UEMUSHORT) (ll >> 16);
- yi[M + 1] = (UEMUSHORT) ll;
- yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
-#endif
+ unsigned long image_hi, image_lo;
+ bool sign;
+ int exp;
- if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
- ecleaz (yi); /* it was zero */
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ image_hi = buf[0], image_lo = buf[1];
else
- yi[E] -= (UEMUSHORT) k; /* subtract shift count from exponent */
- emovo (yi, y); /* output the answer */
-}
+ image_lo = buf[0], image_hi = buf[1];
+ image_lo &= 0xffffffff;
+ image_hi &= 0xffffffff;
+ sign = (image_hi >> 31) & 1;
+ exp = (image_hi >> 20) & 0x7ff;
-/* Find signed HOST_WIDE_INT integer I and floating point fractional
- part FRAC of e-type (packed internal format) floating point input X.
- The integer output I has the sign of the input, except that
- positive overflow is permitted if FIXUNS_TRUNC_LIKE_FIX_TRUNC.
- The output e-type fraction FRAC is the positive fractional
- part of abs (X). */
+ memset (r, 0, sizeof (*r));
-static void
-eifrac (x, i, frac)
- const UEMUSHORT *x;
- HOST_WIDE_INT *i;
- UEMUSHORT *frac;
-{
- UEMUSHORT xi[NI];
- int j, k;
- unsigned HOST_WIDE_INT ll;
+ image_hi <<= 32 - 21;
+ image_hi |= image_lo >> 21;
+ image_hi &= 0x7fffffff;
+ image_lo <<= 32 - 21;
- emovi (x, xi);
- k = (int) xi[E] - (EXONE - 1);
- if (k <= 0)
- {
- /* if exponent <= 0, integer = 0 and real output is fraction */
- *i = 0L;
- emovo (xi, frac);
- return;
- }
- if (k > (HOST_BITS_PER_WIDE_INT - 1))
+ if (exp == 0)
{
- /* long integer overflow: output large integer
- and correct fraction */
- if (xi[0])
- *i = ((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1);
- else
+ if ((image_hi || image_lo) && fmt->has_denorm)
{
-#ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
- /* In this case, let it overflow and convert as if unsigned. */
- euifrac (x, &ll, frac);
- *i = (HOST_WIDE_INT) ll;
- return;
-#else
- /* In other cases, return the largest positive integer. */
- *i = (((unsigned HOST_WIDE_INT) 1) << (HOST_BITS_PER_WIDE_INT - 1)) - 1;
-#endif
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = -1022;
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ image_hi = (image_hi << 1) | (image_lo >> 31);
+ image_lo <<= 1;
+ r->sig[SIGSZ-1] = image_hi;
+ r->sig[SIGSZ-2] = image_lo;
+ }
+ else
+ {
+ image_hi = (image_hi << 31 << 2) | (image_lo << 1);
+ r->sig[SIGSZ-1] = image_hi;
+ }
+ normalize (r);
}
- eshift (xi, k);
- if (extra_warnings)
- warning ("overflow on truncation to integer");
+ else if (fmt->has_signed_zero)
+ r->sign = sign;
}
- else if (k > 16)
+ else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
{
- /* Shift more than 16 bits: first shift up k-16 mod 16,
- then shift up by 16's. */
- j = k - ((k >> 4) << 4);
- eshift (xi, j);
- ll = xi[M];
- k -= j;
- do
+ if (image_hi || image_lo)
{
- eshup6 (xi);
- ll = (ll << 16) | xi[M];
- }
- while ((k -= 16) > 0);
- *i = ll;
- if (xi[0])
- *i = -(*i);
- }
- else
- {
- /* shift not more than 16 bits */
- eshift (xi, k);
- *i = (HOST_WIDE_INT) xi[M] & 0xffff;
- if (xi[0])
- *i = -(*i);
- }
- xi[0] = 0;
- xi[E] = EXONE - 1;
- xi[M] = 0;
- if ((k = enormlz (xi)) > NBITS)
- ecleaz (xi);
- else
- xi[E] -= (UEMUSHORT) k;
-
- emovo (xi, frac);
-}
-
-
-/* Find unsigned HOST_WIDE_INT integer I and floating point fractional part
- FRAC of e-type X. A negative input yields integer output = 0 but
- correct fraction. */
-
-static void
-euifrac (x, i, frac)
- const UEMUSHORT *x;
- unsigned HOST_WIDE_INT *i;
- UEMUSHORT *frac;
-{
- unsigned HOST_WIDE_INT ll;
- UEMUSHORT xi[NI];
- int j, k;
+ r->class = rvc_nan;
+ r->sign = sign;
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ r->sig[SIGSZ-1] = image_hi;
+ r->sig[SIGSZ-2] = image_lo;
+ }
+ else
+ r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
- emovi (x, xi);
- k = (int) xi[E] - (EXONE - 1);
- if (k <= 0)
- {
- /* if exponent <= 0, integer = 0 and argument is fraction */
- *i = 0L;
- emovo (xi, frac);
- return;
- }
- if (k > HOST_BITS_PER_WIDE_INT)
- {
- /* Long integer overflow: output large integer
- and correct fraction.
- Note, the BSD MicroVAX compiler says that ~(0UL)
- is a syntax error. */
- *i = ~(0L);
- eshift (xi, k);
- if (extra_warnings)
- warning ("overflow on truncation to unsigned integer");
- }
- else if (k > 16)
- {
- /* Shift more than 16 bits: first shift up k-16 mod 16,
- then shift up by 16's. */
- j = k - ((k >> 4) << 4);
- eshift (xi, j);
- ll = xi[M];
- k -= j;
- do
+ if (!fmt->qnan_msb_set)
+ r->sig[SIGSZ-1] ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
+ }
+ else
{
- eshup6 (xi);
- ll = (ll << 16) | xi[M];
+ r->class = rvc_inf;
+ r->sign = sign;
}
- while ((k -= 16) > 0);
- *i = ll;
}
else
{
- /* shift not more than 16 bits */
- eshift (xi, k);
- *i = (HOST_WIDE_INT) xi[M] & 0xffff;
- }
-
- if (xi[0]) /* A negative value yields unsigned integer 0. */
- *i = 0L;
-
- xi[0] = 0;
- xi[E] = EXONE - 1;
- xi[M] = 0;
- if ((k = enormlz (xi)) > NBITS)
- ecleaz (xi);
- else
- xi[E] -= (UEMUSHORT) k;
-
- emovo (xi, frac);
-}
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = exp - 1023 + 1;
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ r->sig[SIGSZ-1] = image_hi | SIG_MSB;
+ r->sig[SIGSZ-2] = image_lo;
+ }
+ else
+ r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
+ }
+}
+
+const struct real_format ieee_double_format =
+ {
+ encode_ieee_double,
+ decode_ieee_double,
+ 2,
+ 1,
+ 53,
+ -1021,
+ 1024,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
-/* Shift the significand of exploded e-type X up or down by SC bits. */
+
+/* IEEE extended double precision format. This comes in three
+ flavours: Intel's as a 12 byte image, Intel's as a 16 byte image,
+ and Motorola's. */
+
+static void encode_ieee_extended PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_ieee_extended PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
+
+static void encode_ieee_extended_128 PARAMS ((const struct real_format *fmt,
+ long *,
+ const REAL_VALUE_TYPE *));
+static void decode_ieee_extended_128 PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *,
+ const long *));
-static int
-eshift (x, sc)
- UEMUSHORT *x;
- int sc;
+static void
+encode_ieee_extended (fmt, buf, r)
+ const struct real_format *fmt;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- UEMUSHORT lost;
- UEMUSHORT *p;
+ unsigned long image_hi, sig_hi, sig_lo;
+ bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
- if (sc == 0)
- return (0);
+ image_hi = r->sign << 15;
+ sig_hi = sig_lo = 0;
- lost = 0;
- p = x + NI - 1;
-
- if (sc < 0)
+ switch (r->class)
{
- sc = -sc;
- while (sc >= 16)
- {
- lost |= *p; /* remember lost bits */
- eshdn6 (x);
- sc -= 16;
- }
+ case rvc_zero:
+ break;
- while (sc >= 8)
+ case rvc_inf:
+ if (fmt->has_inf)
{
- lost |= *p & 0xff;
- eshdn8 (x);
- sc -= 8;
- }
+ image_hi |= 32767;
- while (sc > 0)
- {
- lost |= *p & 1;
- eshdn1 (x);
- sc -= 1;
+ /* Intel requires the explicit integer bit to be set, otherwise
+ it considers the value a "pseudo-infinity". Motorola docs
+ say it doesn't care. */
+ sig_hi = 0x80000000;
}
- }
- else
- {
- while (sc >= 16)
+ else
{
- eshup6 (x);
- sc -= 16;
+ image_hi |= 32767;
+ sig_lo = sig_hi = 0xffffffff;
}
+ break;
- while (sc >= 8)
+ case rvc_nan:
+ if (fmt->has_nans)
{
- eshup8 (x);
- sc -= 8;
- }
+ image_hi |= 32767;
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ sig_hi = r->sig[SIGSZ-1];
+ sig_lo = r->sig[SIGSZ-2];
+ }
+ else
+ {
+ sig_lo = r->sig[SIGSZ-1];
+ sig_hi = sig_lo >> 31 >> 1;
+ sig_lo &= 0xffffffff;
+ }
+ if (!fmt->qnan_msb_set)
+ sig_hi ^= 1 << 30 | 1 << 29;
- while (sc > 0)
- {
- eshup1 (x);
- sc -= 1;
+ /* Intel requires the explicit integer bit to be set, otherwise
+ it considers the value a "pseudo-nan". Motorola docs say it
+ doesn't care. */
+ sig_hi |= 0x80000000;
}
- }
- if (lost)
- lost = 1;
- return ((int) lost);
-}
-
-/* Shift normalize the significand area of exploded e-type X.
- Return the shift count (up = positive). */
-
-static int
-enormlz (x)
- UEMUSHORT x[];
-{
- UEMUSHORT *p;
- int sc;
-
- sc = 0;
- p = &x[M];
- if (*p != 0)
- goto normdn;
- ++p;
- if (*p & 0x8000)
- return (0); /* already normalized */
- while (*p == 0)
- {
- eshup6 (x);
- sc += 16;
-
- /* With guard word, there are NBITS+16 bits available.
- Return true if all are zero. */
- if (sc > NBITS)
- return (sc);
- }
- /* see if high byte is zero */
- while ((*p & 0xff00) == 0)
- {
- eshup8 (x);
- sc += 8;
- }
- /* now shift 1 bit at a time */
- while ((*p & 0x8000) == 0)
- {
- eshup1 (x);
- sc += 1;
- if (sc > NBITS)
+ else
{
- mtherr ("enormlz", UNDERFLOW);
- return (sc);
+ image_hi |= 32767;
+ sig_lo = sig_hi = 0xffffffff;
}
- }
- return (sc);
-
- /* Normalize by shifting down out of the high guard word
- of the significand */
- normdn:
+ break;
- if (*p & 0xff00)
- {
- eshdn8 (x);
- sc -= 8;
- }
- while (*p != 0)
- {
- eshdn1 (x);
- sc -= 1;
+ case rvc_normal:
+ {
+ int exp = r->exp;
+
+ /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
+ whereas the intermediate representation is 0.F x 2**exp.
+ Which means we're off by one.
+
+ Except for Motorola, which consider exp=0 and explicit
+ integer bit set to continue to be normalized. In theory
+ this descrepency has been taken care of by the difference
+ in fmt->emin in round_for_format. */
+
+ if (denormal)
+ exp = 0;
+ else
+ {
+ exp += 16383 - 1;
+ if (exp < 0)
+ abort ();
+ }
+ image_hi |= exp;
+
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ sig_hi = r->sig[SIGSZ-1];
+ sig_lo = r->sig[SIGSZ-2];
+ }
+ else
+ {
+ sig_lo = r->sig[SIGSZ-1];
+ sig_hi = sig_lo >> 31 >> 1;
+ sig_lo &= 0xffffffff;
+ }
+ }
+ break;
- if (sc < -NBITS)
- {
- mtherr ("enormlz", OVERFLOW);
- return (sc);
- }
+ default:
+ abort ();
}
- return (sc);
-}
-
-/* Powers of ten used in decimal <-> binary conversions. */
-#define NTEN 12
-#define MAXP 4096
-
-#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && (INTEL_EXTENDED_IEEE_FORMAT == 0)
-static const UEMUSHORT etens[NTEN + 1][NE] =
-{
- {0x6576, 0x4a92, 0x804a, 0x153f,
- 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
- {0x6a32, 0xce52, 0x329a, 0x28ce,
- 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
- {0x526c, 0x50ce, 0xf18b, 0x3d28,
- 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
- {0x9c66, 0x58f8, 0xbc50, 0x5c54,
- 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
- {0x851e, 0xeab7, 0x98fe, 0x901b,
- 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
- {0x0235, 0x0137, 0x36b1, 0x336c,
- 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
- {0x50f8, 0x25fb, 0xc76b, 0x6b71,
- 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
- {0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
-};
-
-static const UEMUSHORT emtens[NTEN + 1][NE] =
-{
- {0x2030, 0xcffc, 0xa1c3, 0x8123,
- 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
- {0x8264, 0xd2cb, 0xf2ea, 0x12d4,
- 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
- {0xf53f, 0xf698, 0x6bd3, 0x0158,
- 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
- {0xe731, 0x04d4, 0xe3f2, 0xd332,
- 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
- {0xa23e, 0x5308, 0xfefb, 0x1155,
- 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
- {0xe26d, 0xdbde, 0xd05d, 0xb3f6,
- 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
- {0x2a20, 0x6224, 0x47b3, 0x98d7,
- 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
- {0x0b5b, 0x4af2, 0xa581, 0x18ed,
- 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
- {0xbf71, 0xa9b3, 0x7989, 0xbe68,
- 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
- {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b,
- 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
- {0xc155, 0xa4a8, 0x404e, 0x6113,
- 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
- {0xd70a, 0x70a3, 0x0a3d, 0xa3d7,
- 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
- {0xcccd, 0xcccc, 0xcccc, 0xcccc,
- 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
-};
-#else
-/* LONG_DOUBLE_TYPE_SIZE is other than 128 */
-static const UEMUSHORT etens[NTEN + 1][NE] =
-{
- {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
- {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
- {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
- {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
- {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
- {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
- {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
- {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
- {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
- {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
- {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
- {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
- {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
-};
-
-static const UEMUSHORT emtens[NTEN + 1][NE] =
-{
- {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
- {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
- {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
- {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
- {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
- {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
- {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
- {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
- {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
- {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
- {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
- {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
- {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
-};
-#endif
-
-#if 0
-/* Convert float value X to ASCII string STRING with NDIG digits after
- the decimal point. */
-
-static void
-e24toasc (x, string, ndigs)
- const UEMUSHORT x[];
- char *string;
- int ndigs;
-{
- UEMUSHORT w[NI];
-
- e24toe (x, w);
- etoasc (w, string, ndigs);
-}
-
-/* Convert double value X to ASCII string STRING with NDIG digits after
- the decimal point. */
-
-static void
-e53toasc (x, string, ndigs)
- const UEMUSHORT x[];
- char *string;
- int ndigs;
-{
- UEMUSHORT w[NI];
-
- e53toe (x, w);
- etoasc (w, string, ndigs);
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = image_hi << 16, buf[1] = sig_hi, buf[2] = sig_lo;
+ else
+ buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
}
-/* Convert double extended value X to ASCII string STRING with NDIG digits
- after the decimal point. */
-
static void
-e64toasc (x, string, ndigs)
- const UEMUSHORT x[];
- char *string;
- int ndigs;
+encode_ieee_extended_128 (fmt, buf, r)
+ const struct real_format *fmt;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- UEMUSHORT w[NI];
-
- e64toe (x, w);
- etoasc (w, string, ndigs);
+ buf[3 * !FLOAT_WORDS_BIG_ENDIAN] = 0;
+ encode_ieee_extended (fmt, buf+!!FLOAT_WORDS_BIG_ENDIAN, r);
}
-/* Convert 128-bit long double value X to ASCII string STRING with NDIG digits
- after the decimal point. */
-
static void
-e113toasc (x, string, ndigs)
- const UEMUSHORT x[];
- char *string;
- int ndigs;
+decode_ieee_extended (fmt, r, buf)
+ const struct real_format *fmt;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT w[NI];
-
- e113toe (x, w);
- etoasc (w, string, ndigs);
-}
-#endif /* 0 */
-
-/* Convert e-type X to ASCII string STRING with NDIGS digits after
- the decimal point. */
+ unsigned long image_hi, sig_hi, sig_lo;
+ bool sign;
+ int exp;
-static char wstring[80]; /* working storage for ASCII output */
-
-static void
-etoasc (x, string, ndigs)
- const UEMUSHORT x[];
- char *string;
- int ndigs;
-{
- EMUSHORT digit;
- UEMUSHORT y[NI], t[NI], u[NI], w[NI];
- const UEMUSHORT *p, *r, *ten;
- UEMUSHORT sign;
- int i, j, k, expon, rndsav;
- char *s, *ss;
- UEMUSHORT m;
-
-
- rndsav = rndprc;
- ss = string;
- s = wstring;
- *ss = '\0';
- *s = '\0';
-#ifdef NANS
- if (eisnan (x))
- {
- sprintf (wstring, " NaN ");
- goto bxit;
- }
-#endif
- rndprc = NBITS; /* set to full precision */
- emov (x, y); /* retain external format */
- if (y[NE - 1] & 0x8000)
- {
- sign = 0xffff;
- y[NE - 1] &= 0x7fff;
- }
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ image_hi = buf[0] >> 16, sig_hi = buf[1], sig_lo = buf[2];
else
- {
- sign = 0;
- }
- expon = 0;
- ten = &etens[NTEN][0];
- emov (eone, t);
- /* Test for zero exponent */
- if (y[NE - 1] == 0)
- {
- for (k = 0; k < NE - 1; k++)
- {
- if (y[k] != 0)
- goto tnzro; /* denormalized number */
- }
- goto isone; /* valid all zeros */
- }
- tnzro:
-
- /* Test for infinity. */
- if (y[NE - 1] == 0x7fff)
- {
- if (sign)
- sprintf (wstring, " -Infinity ");
- else
- sprintf (wstring, " Infinity ");
- goto bxit;
- }
-
- /* Test for exponent nonzero but significand denormalized.
- * This is an error condition.
- */
- if ((y[NE - 1] != 0) && ((y[NE - 2] & 0x8000) == 0))
- {
- mtherr ("etoasc", DOMAIN);
- sprintf (wstring, "NaN");
- goto bxit;
- }
-
- /* Compare to 1.0 */
- i = ecmp (eone, y);
- if (i == 0)
- goto isone;
+ sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
+ sig_lo &= 0xffffffff;
+ sig_hi &= 0xffffffff;
+ image_hi &= 0xffffffff;
- if (i == -2)
- abort ();
+ sign = (image_hi >> 15) & 1;
+ exp = image_hi & 0x7fff;
- if (i < 0)
- { /* Number is greater than 1 */
- /* Convert significand to an integer and strip trailing decimal zeros. */
- emov (y, u);
- u[NE - 1] = EXONE + NBITS - 1;
+ memset (r, 0, sizeof (*r));
- p = &etens[NTEN - 4][0];
- m = 16;
- do
- {
- ediv (p, u, t);
- efloor (t, w);
- for (j = 0; j < NE - 1; j++)
- {
- if (t[j] != w[j])
- goto noint;
- }
- emov (t, u);
- expon += (int) m;
- noint:
- p += NE;
- m >>= 1;
- }
- while (m != 0);
-
- /* Rescale from integer significand */
- u[NE - 1] += y[NE - 1] - (unsigned int) (EXONE + NBITS - 1);
- emov (u, y);
- /* Find power of 10 */
- emov (eone, t);
- m = MAXP;
- p = &etens[0][0];
- /* An unordered compare result shouldn't happen here. */
- while (ecmp (ten, u) <= 0)
+ if (exp == 0)
+ {
+ if ((sig_hi || sig_lo) && fmt->has_denorm)
{
- if (ecmp (p, u) <= 0)
+ r->class = rvc_normal;
+ r->sign = sign;
+
+ /* When the IEEE format contains a hidden bit, we know that
+ it's zero at this point, and so shift up the significand
+ and decrease the exponent to match. In this case, Motorola
+ defines the explicit integer bit to be valid, so we don't
+ know whether the msb is set or not. */
+ r->exp = fmt->emin;
+ if (HOST_BITS_PER_LONG == 32)
{
- ediv (p, u, u);
- emul (p, t, t);
- expon += (int) m;
+ r->sig[SIGSZ-1] = sig_hi;
+ r->sig[SIGSZ-2] = sig_lo;
}
- m >>= 1;
- if (m == 0)
- break;
- p += NE;
+ else
+ r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
+
+ normalize (r);
}
+ else if (fmt->has_signed_zero)
+ r->sign = sign;
}
- else
- { /* Number is less than 1.0 */
- /* Pad significand with trailing decimal zeros. */
- if (y[NE - 1] == 0)
+ else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
+ {
+ /* See above re "pseudo-infinities" and "pseudo-nans".
+ Short summary is that the MSB will likely always be
+ set, and that we don't care about it. */
+ sig_hi &= 0x7fffffff;
+
+ if (sig_hi || sig_lo)
{
- while ((y[NE - 2] & 0x8000) == 0)
+ r->class = rvc_nan;
+ r->sign = sign;
+ if (HOST_BITS_PER_LONG == 32)
{
- emul (ten, y, y);
- expon -= 1;
+ r->sig[SIGSZ-1] = sig_hi;
+ r->sig[SIGSZ-2] = sig_lo;
}
+ else
+ r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
+
+ if (!fmt->qnan_msb_set)
+ r->sig[SIGSZ-1] ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
}
else
{
- emovi (y, w);
- for (i = 0; i < NDEC + 1; i++)
- {
- if ((w[NI - 1] & 0x7) != 0)
- break;
- /* multiply by 10 */
- emovz (w, u);
- eshdn1 (u);
- eshdn1 (u);
- eaddm (w, u);
- u[1] += 3;
- while (u[2] != 0)
- {
- eshdn1 (u);
- u[1] += 1;
- }
- if (u[NI - 1] != 0)
- break;
- if (eone[NE - 1] <= u[1])
- break;
- emovz (u, w);
- expon -= 1;
- }
- emovo (w, y);
- }
- k = -MAXP;
- p = &emtens[0][0];
- r = &etens[0][0];
- emov (y, w);
- emov (eone, t);
- while (ecmp (eone, w) > 0)
- {
- if (ecmp (p, w) >= 0)
- {
- emul (r, w, w);
- emul (r, t, t);
- expon += k;
- }
- k /= 2;
- if (k == 0)
- break;
- p += NE;
- r += NE;
- }
- ediv (t, eone, t);
- }
- isone:
- /* Find the first (leading) digit. */
- emovi (t, w);
- emovz (w, t);
- emovi (y, w);
- emovz (w, y);
- eiremain (t, y);
- digit = equot[NI - 1];
- while ((digit == 0) && (ecmp (y, ezero) != 0))
- {
- eshup1 (y);
- emovz (y, u);
- eshup1 (u);
- eshup1 (u);
- eaddm (u, y);
- eiremain (t, y);
- digit = equot[NI - 1];
- expon -= 1;
- }
- s = wstring;
- if (sign)
- *s++ = '-';
- else
- *s++ = ' ';
- /* Examine number of digits requested by caller. */
- if (ndigs < 0)
- ndigs = 0;
- if (ndigs > NDEC)
- ndigs = NDEC;
- if (digit == 10)
- {
- *s++ = '1';
- *s++ = '.';
- if (ndigs > 0)
- {
- *s++ = '0';
- ndigs -= 1;
+ r->class = rvc_inf;
+ r->sign = sign;
}
- expon += 1;
}
else
{
- *s++ = (char) digit + '0';
- *s++ = '.';
- }
- /* Generate digits after the decimal point. */
- for (k = 0; k <= ndigs; k++)
- {
- /* multiply current number by 10, without normalizing */
- eshup1 (y);
- emovz (y, u);
- eshup1 (u);
- eshup1 (u);
- eaddm (u, y);
- eiremain (t, y);
- *s++ = (char) equot[NI - 1] + '0';
- }
- digit = equot[NI - 1];
- --s;
- ss = s;
- /* round off the ASCII string */
- if (digit > 4)
- {
- /* Test for critical rounding case in ASCII output. */
- if (digit == 5)
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = exp - 16383 + 1;
+ if (HOST_BITS_PER_LONG == 32)
{
- emovo (y, t);
- if (ecmp (t, ezero) != 0)
- goto roun; /* round to nearest */
-#ifndef C4X
- if ((*(s - 1) & 1) == 0)
- goto doexp; /* round to even */
-#endif
- }
- /* Round up and propagate carry-outs */
- roun:
- --s;
- k = *s & CHARMASK;
- /* Carry out to most significant digit? */
- if (k == '.')
- {
- --s;
- k = *s;
- k += 1;
- *s = (char) k;
- /* Most significant digit carries to 10? */
- if (k > '9')
- {
- expon += 1;
- *s = '1';
- }
- goto doexp;
- }
- /* Round up and carry out from less significant digits */
- k += 1;
- *s = (char) k;
- if (k > '9')
- {
- *s = '0';
- goto roun;
+ r->sig[SIGSZ-1] = sig_hi;
+ r->sig[SIGSZ-2] = sig_lo;
}
+ else
+ r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
}
- doexp:
- /* Strip trailing zeros, but leave at least one. */
- while (ss[-1] == '0' && ss[-2] != '.')
- --ss;
- sprintf (ss, "e%d", expon);
- bxit:
- rndprc = rndsav;
- /* copy out the working string */
- s = string;
- ss = wstring;
- while (*ss == ' ') /* strip possible leading space */
- ++ss;
- while ((*s++ = *ss++) != '\0')
- ;
}
+static void
+decode_ieee_extended_128 (fmt, r, buf)
+ const struct real_format *fmt;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
+{
+ decode_ieee_extended (fmt, r, buf+!!FLOAT_WORDS_BIG_ENDIAN);
+}
+
+const struct real_format ieee_extended_motorola_format =
+ {
+ encode_ieee_extended,
+ decode_ieee_extended,
+ 2,
+ 1,
+ 64,
+ -16382,
+ 16384,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
+
+const struct real_format ieee_extended_intel_96_format =
+ {
+ encode_ieee_extended,
+ decode_ieee_extended,
+ 2,
+ 1,
+ 64,
+ -16381,
+ 16384,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
+
+const struct real_format ieee_extended_intel_128_format =
+ {
+ encode_ieee_extended_128,
+ decode_ieee_extended_128,
+ 2,
+ 1,
+ 64,
+ -16381,
+ 16384,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
-/* Convert ASCII string to floating point.
-
- Numeric input is a free format decimal number of any length, with
- or without decimal point. Entering E after the number followed by an
- integer number causes the second number to be interpreted as a power of
- 10 to be multiplied by the first number (i.e., "scientific" notation). */
-
-/* Convert ASCII string S to single precision float value Y. */
+
+/* IBM 128-bit extended precision format: a pair of IEEE double precision
+ numbers whose sum is equal to the extended precision value. The number
+ with greater magnitude is first. This format has the same magnitude
+ range as an IEEE double precision value, but effectively 106 bits of
+ significand precision. Infinity and NaN are represented by their IEEE
+ double precision value stored in the first number, the second number is
+ ignored. Zeroes, Infinities, and NaNs are set in both doubles
+ due to precedent. */
+
+static void encode_ibm_extended PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_ibm_extended PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
static void
-asctoe24 (s, y)
- const char *s;
- UEMUSHORT *y;
+encode_ibm_extended (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- asctoeg (s, y, 24);
-}
+ REAL_VALUE_TYPE u, v;
+ switch (r->class)
+ {
+ case rvc_zero:
+ /* Both doubles have sign bit set. */
+ buf[0] = FLOAT_WORDS_BIG_ENDIAN ? r->sign << 31 : 0;
+ buf[1] = FLOAT_WORDS_BIG_ENDIAN ? 0 : r->sign << 31;
+ buf[2] = buf[0];
+ buf[3] = buf[1];
+ break;
-/* Convert ASCII string S to double precision value Y. */
+ case rvc_inf:
+ case rvc_nan:
+ /* Both doubles set to Inf / NaN. */
+ encode_ieee_double (&ieee_double_format, &buf[0], r);
+ buf[2] = buf[0];
+ buf[3] = buf[1];
+ return;
+
+ case rvc_normal:
+ /* u = IEEE double precision portion of significand. */
+ u = *r;
+ clear_significand_below (&u, SIGNIFICAND_BITS - 53);
-static void
-asctoe53 (s, y)
- const char *s;
- UEMUSHORT *y;
-{
-#if defined(DEC) || defined(IBM)
- asctoeg (s, y, 56);
-#else
-#if defined(C4X)
- asctoeg (s, y, 32);
-#else
- asctoeg (s, y, 53);
-#endif
-#endif
-}
+ /* v = remainder containing additional 53 bits of significand. */
+ do_add (&v, r, &u, 1);
+ encode_ieee_double (&ieee_double_format, &buf[0], &u);
+ encode_ieee_double (&ieee_double_format, &buf[2], &v);
+ break;
-/* Convert ASCII string S to double extended value Y. */
+ default:
+ abort ();
+ }
+}
static void
-asctoe64 (s, y)
- const char *s;
- UEMUSHORT *y;
+decode_ibm_extended (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- asctoeg (s, y, 64);
-}
+ REAL_VALUE_TYPE u, v;
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
-/* Convert ASCII string S to 128-bit long double Y. */
+ decode_ieee_double (&ieee_double_format, &u, &buf[0]);
-static void
-asctoe113 (s, y)
- const char *s;
- UEMUSHORT *y;
-{
- asctoeg (s, y, 113);
-}
-#endif
+ if (u.class != rvc_zero && u.class != rvc_inf && u.class != rvc_nan)
+ {
+ decode_ieee_double (&ieee_double_format, &v, &buf[2]);
+ do_add (r, &u, &v, 0);
+ }
+ else
+ *r = u;
+}
+
+const struct real_format ibm_extended_format =
+ {
+ encode_ibm_extended,
+ decode_ibm_extended,
+ 2,
+ 1,
+ 53 + 53,
+ -1021,
+ 1024,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
+
+
+/* IEEE quad precision format. */
-/* Convert ASCII string S to e type Y. */
+static void encode_ieee_quad PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_ieee_quad PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
static void
-asctoe (s, y)
- const char *s;
- UEMUSHORT *y;
+encode_ieee_quad (fmt, buf, r)
+ const struct real_format *fmt;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- asctoeg (s, y, NBITS);
-}
+ unsigned long image3, image2, image1, image0, exp;
+ bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
+ REAL_VALUE_TYPE u;
-/* Convert ASCII string SS to e type Y, with a specified rounding precision
- of OPREC bits. BASE is 16 for C99 hexadecimal floating constants. */
+ image3 = r->sign << 31;
+ image2 = 0;
+ image1 = 0;
+ image0 = 0;
-static void
-asctoeg (ss, y, oprec)
- const char *ss;
- UEMUSHORT *y;
- int oprec;
-{
- UEMUSHORT yy[NI], xt[NI], tt[NI];
- int esign, decflg, sgnflg, nexp, exp, prec, lost;
- int i, k, trail, c, rndsav;
- EMULONG lexp;
- UEMUSHORT nsign;
- char *sp, *s, *lstr;
- int base = 10;
-
- /* Copy the input string. */
- lstr = (char *) alloca (strlen (ss) + 1);
-
- while (*ss == ' ') /* skip leading spaces */
- ++ss;
-
- sp = lstr;
- while ((*sp++ = *ss++) != '\0')
- ;
- s = lstr;
+ rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
- if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
+ switch (r->class)
{
- base = 16;
- s += 2;
- }
+ case rvc_zero:
+ break;
- rndsav = rndprc;
- rndprc = NBITS; /* Set to full precision */
- lost = 0;
- nsign = 0;
- decflg = 0;
- sgnflg = 0;
- nexp = 0;
- exp = 0;
- prec = 0;
- ecleaz (yy);
- trail = 0;
-
- nxtcom:
- k = hex_value (*s);
- if ((k >= 0) && (k < base))
- {
- /* Ignore leading zeros */
- if ((prec == 0) && (decflg == 0) && (k == 0))
- goto donchr;
- /* Identify and strip trailing zeros after the decimal point. */
- if ((trail == 0) && (decflg != 0))
+ case rvc_inf:
+ if (fmt->has_inf)
+ image3 |= 32767 << 16;
+ else
{
- sp = s;
- while (ISDIGIT (*sp) || (base == 16 && ISXDIGIT (*sp)))
- ++sp;
- /* Check for syntax error */
- c = *sp & CHARMASK;
- if ((base != 10 || ((c != 'e') && (c != 'E')))
- && (base != 16 || ((c != 'p') && (c != 'P')))
- && (c != '\0')
- && (c != '\n') && (c != '\r') && (c != ' ')
- && (c != ','))
- goto unexpected_char_error;
- --sp;
- while (*sp == '0')
- *sp-- = 'z';
- trail = 1;
- if (*s == 'z')
- goto donchr;
+ image3 |= 0x7fffffff;
+ image2 = 0xffffffff;
+ image1 = 0xffffffff;
+ image0 = 0xffffffff;
}
+ break;
- /* If enough digits were given to more than fill up the yy register,
- continuing until overflow into the high guard word yy[2]
- guarantees that there will be a roundoff bit at the top
- of the low guard word after normalization. */
-
- if (yy[2] == 0)
+ case rvc_nan:
+ if (fmt->has_nans)
{
- if (base == 16)
- {
- if (decflg)
- nexp += 4; /* count digits after decimal point */
+ image3 |= 32767 << 16;
- eshup1 (yy); /* multiply current number by 16 */
- eshup1 (yy);
- eshup1 (yy);
- eshup1 (yy);
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ image0 = u.sig[0];
+ image1 = u.sig[1];
+ image2 = u.sig[2];
+ image3 |= u.sig[3] & 0xffff;
}
else
{
- if (decflg)
- nexp += 1; /* count digits after decimal point */
-
- eshup1 (yy); /* multiply current number by 10 */
- emovz (yy, xt);
- eshup1 (xt);
- eshup1 (xt);
- eaddm (xt, yy);
+ image0 = u.sig[0];
+ image1 = image0 >> 31 >> 1;
+ image2 = u.sig[1];
+ image3 |= (image2 >> 31 >> 1) & 0xffff;
+ image0 &= 0xffffffff;
+ image2 &= 0xffffffff;
}
- /* Insert the current digit. */
- ecleaz (xt);
- xt[NI - 2] = (UEMUSHORT) k;
- eaddm (xt, yy);
+
+ if (!fmt->qnan_msb_set)
+ image3 ^= 1 << 15 | 1 << 14;
}
else
{
- /* Mark any lost non-zero digit. */
- lost |= k;
- /* Count lost digits before the decimal point. */
- if (decflg == 0)
- {
- if (base == 10)
- nexp -= 1;
- else
- nexp -= 4;
- }
+ image3 |= 0x7fffffff;
+ image2 = 0xffffffff;
+ image1 = 0xffffffff;
+ image0 = 0xffffffff;
}
- prec += 1;
- goto donchr;
- }
-
- switch (*s)
- {
- case 'z':
break;
- case 'E':
- case 'e':
- case 'P':
- case 'p':
- goto expnt;
- case '.': /* decimal point */
- if (decflg)
- goto unexpected_char_error;
- ++decflg;
- break;
- case '-':
- nsign = 0xffff;
- if (sgnflg)
- goto unexpected_char_error;
- ++sgnflg;
- break;
- case '+':
- if (sgnflg)
- goto unexpected_char_error;
- ++sgnflg;
- break;
- case ',':
- case ' ':
- case '\0':
- case '\n':
- case '\r':
- goto daldone;
- case 'i':
- case 'I':
- goto infinite;
- default:
- unexpected_char_error:
-#ifdef NANS
- einan (yy);
-#else
- mtherr ("asctoe", DOMAIN);
- eclear (yy);
-#endif
- goto aexit;
- }
- donchr:
- ++s;
- goto nxtcom;
-
- /* Exponent interpretation */
- expnt:
- /* 0.0eXXX is zero, regardless of XXX. Check for the 0.0. */
- for (k = 0; k < NI; k++)
- {
- if (yy[k] != 0)
- goto read_expnt;
- }
- goto aexit;
-
-read_expnt:
- esign = 1;
- exp = 0;
- ++s;
- /* check for + or - */
- if (*s == '-')
- {
- esign = -1;
- ++s;
- }
- if (*s == '+')
- ++s;
- while (ISDIGIT (*s))
- {
- exp *= 10;
- exp += *s++ - '0';
- if (exp > 999999)
- break;
- }
- if (esign < 0)
- exp = -exp;
- if ((exp > MAXDECEXP) && (base == 10))
- {
- infinite:
- ecleaz (yy);
- yy[E] = 0x7fff; /* infinity */
- goto aexit;
- }
- if ((exp < MINDECEXP) && (base == 10))
- {
- zero:
- ecleaz (yy);
- goto aexit;
- }
- daldone:
- if (base == 16)
- {
- /* Base 16 hexadecimal floating constant. */
- if ((k = enormlz (yy)) > NBITS)
+ case rvc_normal:
+ /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
+ whereas the intermediate representation is 0.F x 2**exp.
+ Which means we're off by one. */
+ if (denormal)
+ exp = 0;
+ else
+ exp = r->exp + 16383 - 1;
+ image3 |= exp << 16;
+
+ if (HOST_BITS_PER_LONG == 32)
{
- ecleaz (yy);
- goto aexit;
+ image0 = u.sig[0];
+ image1 = u.sig[1];
+ image2 = u.sig[2];
+ image3 |= u.sig[3] & 0xffff;
}
- /* Adjust the exponent. NEXP is the number of hex digits,
- EXP is a power of 2. */
- lexp = (EXONE - 1 + NBITS) - k + yy[E] + exp - nexp;
- if (lexp > 0x7fff)
- goto infinite;
- if (lexp < 0)
- goto zero;
- yy[E] = lexp;
- goto expdon;
- }
-
- nexp = exp - nexp;
- /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
- while ((nexp > 0) && (yy[2] == 0))
- {
- emovz (yy, xt);
- eshup1 (xt);
- eshup1 (xt);
- eaddm (yy, xt);
- eshup1 (xt);
- if (xt[2] != 0)
- break;
- nexp -= 1;
- emovz (xt, yy);
- }
- if ((k = enormlz (yy)) > NBITS)
- {
- ecleaz (yy);
- goto aexit;
- }
- lexp = (EXONE - 1 + NBITS) - k;
- emdnorm (yy, lost, 0, lexp, 64);
- lost = 0;
-
- /* Convert to external format:
-
- Multiply by 10**nexp. If precision is 64 bits,
- the maximum relative error incurred in forming 10**n
- for 0 <= n <= 324 is 8.2e-20, at 10**180.
- For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
- For 0 >= n >= -999, it is -1.55e-19 at 10**-435. */
-
- lexp = yy[E];
- if (nexp == 0)
- {
- k = 0;
- goto expdon;
- }
- esign = 1;
- if (nexp < 0)
- {
- nexp = -nexp;
- esign = -1;
- if (nexp > 4096)
+ else
{
- /* Punt. Can't handle this without 2 divides. */
- emovi (etens[0], tt);
- lexp -= tt[E];
- k = edivm (tt, yy);
- lexp += EXONE;
- nexp -= 4096;
+ image0 = u.sig[0];
+ image1 = image0 >> 31 >> 1;
+ image2 = u.sig[1];
+ image3 |= (image2 >> 31 >> 1) & 0xffff;
+ image0 &= 0xffffffff;
+ image2 &= 0xffffffff;
}
+ break;
+
+ default:
+ abort ();
}
- emov (eone, xt);
- exp = 1;
- i = NTEN;
- do
- {
- if (exp & nexp)
- emul (etens[i], xt, xt);
- i--;
- exp = exp + exp;
- }
- while (exp <= MAXP);
- emovi (xt, tt);
- if (esign < 0)
+ if (FLOAT_WORDS_BIG_ENDIAN)
{
- lexp -= tt[E];
- k = edivm (tt, yy);
- lexp += EXONE;
+ buf[0] = image3;
+ buf[1] = image2;
+ buf[2] = image1;
+ buf[3] = image0;
}
else
{
- lexp += tt[E];
- k = emulm (tt, yy);
- lexp -= EXONE - 1;
- }
- lost = k;
-
- expdon:
-
- /* Round and convert directly to the destination type */
- if (oprec == 53)
- lexp -= EXONE - 0x3ff;
-#ifdef C4X
- else if (oprec == 24 || oprec == 32)
- lexp -= (EXONE - 0x7f);
-#else
-#ifdef IBM
- else if (oprec == 24 || oprec == 56)
- lexp -= EXONE - (0x41 << 2);
-#else
-#ifdef DEC
- else if (oprec == 24)
- lexp -= dec_f.adjustment;
- else if (oprec == 56)
- {
- if (TARGET_G_FLOAT)
- lexp -= dec_g.adjustment;
- else
- lexp -= dec_d.adjustment;
- }
-#else
-else if (oprec == 24)
- lexp -= EXONE - 0177;
-#endif /* DEC */
-#endif /* IBM */
-#endif /* C4X */
- rndprc = oprec;
- emdnorm (yy, lost, 0, lexp, 64);
-
- aexit:
-
- rndprc = rndsav;
- yy[0] = nsign;
- switch (oprec)
- {
-#ifdef DEC
- case 56:
- todec (yy, y);
- break;
-#endif
-#ifdef IBM
- case 56:
- toibm (yy, y, DFmode);
- break;
-#endif
-#ifdef C4X
- case 32:
- toc4x (yy, y, HFmode);
- break;
-#endif
-
- case 53:
- toe53 (yy, y);
- break;
- case 24:
- toe24 (yy, y);
- break;
- case 64:
- toe64 (yy, y);
- break;
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- case 113:
- toe113 (yy, y);
- break;
-#endif
- case NBITS:
- emovo (yy, y);
- break;
+ buf[0] = image0;
+ buf[1] = image1;
+ buf[2] = image2;
+ buf[3] = image3;
}
}
-
-
-/* Return Y = largest integer not greater than X (truncated toward minus
- infinity). */
-
-static const UEMUSHORT bmask[] =
-{
- 0xffff,
- 0xfffe,
- 0xfffc,
- 0xfff8,
- 0xfff0,
- 0xffe0,
- 0xffc0,
- 0xff80,
- 0xff00,
- 0xfe00,
- 0xfc00,
- 0xf800,
- 0xf000,
- 0xe000,
- 0xc000,
- 0x8000,
- 0x0000,
-};
-
static void
-efloor (x, y)
- const UEMUSHORT x[];
- UEMUSHORT y[];
+decode_ieee_quad (fmt, r, buf)
+ const struct real_format *fmt;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT *p;
- int e, expon, i;
- UEMUSHORT f[NE];
-
- emov (x, f); /* leave in external format */
- expon = (int) f[NE - 1];
- e = (expon & 0x7fff) - (EXONE - 1);
- if (e <= 0)
+ unsigned long image3, image2, image1, image0;
+ bool sign;
+ int exp;
+
+ if (FLOAT_WORDS_BIG_ENDIAN)
{
- eclear (y);
- goto isitneg;
+ image3 = buf[0];
+ image2 = buf[1];
+ image1 = buf[2];
+ image0 = buf[3];
}
- /* number of bits to clear out */
- e = NBITS - e;
- emov (f, y);
- if (e <= 0)
- return;
-
- p = &y[0];
- while (e >= 16)
+ else
{
- *p++ = 0;
- e -= 16;
+ image0 = buf[0];
+ image1 = buf[1];
+ image2 = buf[2];
+ image3 = buf[3];
}
- /* clear the remaining bits */
- *p &= bmask[e];
- /* truncate negatives toward minus infinity */
- isitneg:
+ image0 &= 0xffffffff;
+ image1 &= 0xffffffff;
+ image2 &= 0xffffffff;
+
+ sign = (image3 >> 31) & 1;
+ exp = (image3 >> 16) & 0x7fff;
+ image3 &= 0xffff;
+
+ memset (r, 0, sizeof (*r));
- if ((UEMUSHORT) expon & (UEMUSHORT) 0x8000)
+ if (exp == 0)
{
- for (i = 0; i < NE - 1; i++)
+ if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
{
- if (f[i] != y[i])
+ r->class = rvc_normal;
+ r->sign = sign;
+
+ r->exp = -16382 + (SIGNIFICAND_BITS - 112);
+ if (HOST_BITS_PER_LONG == 32)
{
- esub (eone, y, y);
- break;
+ r->sig[0] = image0;
+ r->sig[1] = image1;
+ r->sig[2] = image2;
+ r->sig[3] = image3;
}
+ else
+ {
+ r->sig[0] = (image1 << 31 << 1) | image0;
+ r->sig[1] = (image3 << 31 << 1) | image2;
+ }
+
+ normalize (r);
}
+ else if (fmt->has_signed_zero)
+ r->sign = sign;
}
-}
+ else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
+ {
+ if (image3 | image2 | image1 | image0)
+ {
+ r->class = rvc_nan;
+ r->sign = sign;
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ r->sig[0] = image0;
+ r->sig[1] = image1;
+ r->sig[2] = image2;
+ r->sig[3] = image3;
+ }
+ else
+ {
+ r->sig[0] = (image1 << 31 << 1) | image0;
+ r->sig[1] = (image3 << 31 << 1) | image2;
+ }
+ lshift_significand (r, r, SIGNIFICAND_BITS - 113);
-#if 0
-/* Return S and EXP such that S * 2^EXP = X and .5 <= S < 1.
- For example, 1.1 = 0.55 * 2^1. */
+ if (!fmt->qnan_msb_set)
+ r->sig[SIGSZ-1] ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
+ }
+ else
+ {
+ r->class = rvc_inf;
+ r->sign = sign;
+ }
+ }
+ else
+ {
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = exp - 16383 + 1;
+
+ if (HOST_BITS_PER_LONG == 32)
+ {
+ r->sig[0] = image0;
+ r->sig[1] = image1;
+ r->sig[2] = image2;
+ r->sig[3] = image3;
+ }
+ else
+ {
+ r->sig[0] = (image1 << 31 << 1) | image0;
+ r->sig[1] = (image3 << 31 << 1) | image2;
+ }
+ lshift_significand (r, r, SIGNIFICAND_BITS - 113);
+ r->sig[SIGSZ-1] |= SIG_MSB;
+ }
+}
+
+const struct real_format ieee_quad_format =
+ {
+ encode_ieee_quad,
+ decode_ieee_quad,
+ 2,
+ 1,
+ 113,
+ -16381,
+ 16384,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
+
+/* Descriptions of VAX floating point formats can be found beginning at
+
+ http://www.openvms.compaq.com:8000/73final/4515/4515pro_013.html#f_floating_point_format
+
+ The thing to remember is that they're almost IEEE, except for word
+ order, exponent bias, and the lack of infinities, nans, and denormals.
+
+ We don't implement the H_floating format here, simply because neither
+ the VAX or Alpha ports use it. */
+
+static void encode_vax_f PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_vax_f PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
+static void encode_vax_d PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_vax_d PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
+static void encode_vax_g PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_vax_g PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
static void
-efrexp (x, exp, s)
- const UEMUSHORT x[];
- int *exp;
- UEMUSHORT s[];
+encode_vax_f (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- UEMUSHORT xi[NI];
- EMULONG li;
+ unsigned long sign, exp, sig, image;
- emovi (x, xi);
- /* Handle denormalized numbers properly using long integer exponent. */
- li = (EMULONG) ((EMUSHORT) xi[1]);
+ sign = r->sign << 15;
- if (li == 0)
+ switch (r->class)
{
- li -= enormlz (xi);
- }
- xi[1] = 0x3ffe;
- emovo (xi, s);
- *exp = (int) (li - 0x3ffe);
-}
-#endif
+ case rvc_zero:
+ image = 0;
+ break;
-/* Return e type Y = X * 2^PWR2. */
+ case rvc_inf:
+ case rvc_nan:
+ image = 0xffff7fff | sign;
+ break;
-static void
-eldexp (x, pwr2, y)
- const UEMUSHORT x[];
- int pwr2;
- UEMUSHORT y[];
-{
- UEMUSHORT xi[NI];
- EMULONG li;
- int i;
+ case rvc_normal:
+ sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
+ exp = r->exp + 128;
- emovi (x, xi);
- li = xi[1];
- li += pwr2;
- i = 0;
- emdnorm (xi, i, i, li, !ROUND_TOWARDS_ZERO);
- emovo (xi, y);
-}
+ image = (sig << 16) & 0xffff0000;
+ image |= sign;
+ image |= exp << 7;
+ image |= sig >> 16;
+ break;
+ default:
+ abort ();
+ }
-#if 0
-/* C = remainder after dividing B by A, all e type values.
- Least significant integer quotient bits left in EQUOT. */
+ buf[0] = image;
+}
static void
-eremain (a, b, c)
- const UEMUSHORT a[], b[];
- UEMUSHORT c[];
+decode_vax_f (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT den[NI], num[NI];
+ unsigned long image = buf[0] & 0xffffffff;
+ int exp = (image >> 7) & 0xff;
-#ifdef NANS
- if (eisinf (b)
- || (ecmp (a, ezero) == 0)
- || eisnan (a)
- || eisnan (b))
- {
- enan (c, 0);
- return;
- }
-#endif
- if (ecmp (a, ezero) == 0)
+ memset (r, 0, sizeof (*r));
+
+ if (exp != 0)
{
- mtherr ("eremain", SING);
- eclear (c);
- return;
+ r->class = rvc_normal;
+ r->sign = (image >> 15) & 1;
+ r->exp = exp - 128;
+
+ image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
+ r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
}
- emovi (a, den);
- emovi (b, num);
- eiremain (den, num);
- /* Sign of remainder = sign of quotient */
- if (a[0] == b[0])
- num[0] = 0;
- else
- num[0] = 0xffff;
- emovo (num, c);
}
-#endif
-
-/* Return quotient of exploded e-types NUM / DEN in EQUOT,
- remainder in NUM. */
static void
-eiremain (den, num)
- UEMUSHORT den[], num[];
+encode_vax_d (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- EMULONG ld, ln;
- UEMUSHORT j;
-
- ld = den[E];
- ld -= enormlz (den);
- ln = num[E];
- ln -= enormlz (num);
- ecleaz (equot);
- while (ln >= ld)
+ unsigned long image0, image1, sign = r->sign << 15;
+
+ switch (r->class)
{
- if (ecmpm (den, num) <= 0)
+ case rvc_zero:
+ image0 = image1 = 0;
+ break;
+
+ case rvc_inf:
+ case rvc_nan:
+ image0 = 0xffff7fff | sign;
+ image1 = 0xffffffff;
+ break;
+
+ case rvc_normal:
+ /* Extract the significand into straight hi:lo. */
+ if (HOST_BITS_PER_LONG == 64)
{
- esubm (den, num);
- j = 1;
+ image0 = r->sig[SIGSZ-1];
+ image1 = (image0 >> (64 - 56)) & 0xffffffff;
+ image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
}
else
- j = 0;
- eshup1 (equot);
- equot[NI - 1] |= j;
- eshup1 (num);
- ln -= 1;
- }
- emdnorm (num, 0, 0, ln, 0);
-}
-
-/* Report an error condition CODE encountered in function NAME.
-
- Mnemonic Value Significance
-
- DOMAIN 1 argument domain error
- SING 2 function singularity
- OVERFLOW 3 overflow range error
- UNDERFLOW 4 underflow range error
- TLOSS 5 total loss of precision
- PLOSS 6 partial loss of precision
- INVALID 7 NaN - producing operation
- EDOM 33 Unix domain error code
- ERANGE 34 Unix range error code
-
- The order of appearance of the following messages is bound to the
- error codes defined above. */
-
-int merror = 0;
-extern int merror;
-
-static void
-mtherr (name, code)
- const char *name;
- int code;
-{
- /* The string passed by the calling program is supposed to be the
- name of the function in which the error occurred.
- The code argument selects which error message string will be printed. */
-
- if (strcmp (name, "esub") == 0)
- name = "subtraction";
- else if (strcmp (name, "ediv") == 0)
- name = "division";
- else if (strcmp (name, "emul") == 0)
- name = "multiplication";
- else if (strcmp (name, "enormlz") == 0)
- name = "normalization";
- else if (strcmp (name, "etoasc") == 0)
- name = "conversion to text";
- else if (strcmp (name, "asctoe") == 0)
- name = "parsing";
- else if (strcmp (name, "eremain") == 0)
- name = "modulus";
- else if (strcmp (name, "esqrt") == 0)
- name = "square root";
- if (extra_warnings)
- {
- switch (code)
{
- case DOMAIN: warning ("%s: argument domain error" , name); break;
- case SING: warning ("%s: function singularity" , name); break;
- case OVERFLOW: warning ("%s: overflow range error" , name); break;
- case UNDERFLOW: warning ("%s: underflow range error" , name); break;
- case TLOSS: warning ("%s: total loss of precision" , name); break;
- case PLOSS: warning ("%s: partial loss of precision", name); break;
- case INVALID: warning ("%s: NaN - producing operation", name); break;
- default: abort ();
+ image0 = r->sig[SIGSZ-1];
+ image1 = r->sig[SIGSZ-2];
+ image1 = (image0 << 24) | (image1 >> 8);
+ image0 = (image0 >> 8) & 0xffffff;
}
- }
-
- /* Set global error message word */
- merror = code + 1;
-}
-
-#ifdef DEC
-/* Convert DEC double precision D to e type E. */
-
-static void
-dectoe (d, e)
- const UEMUSHORT *d;
- UEMUSHORT *e;
-{
- if (TARGET_G_FLOAT)
- ieeetoe (d, e, &dec_g);
- else
- ieeetoe (d, e, &dec_d);
-}
-
-/* Convert e type X to DEC double precision D. */
-static void
-etodec (x, d)
- const UEMUSHORT *x;
- UEMUSHORT *d;
-{
- UEMUSHORT xi[NI];
- EMULONG exp;
- int rndsav;
- const struct ieee_format *fmt;
+ /* Rearrange the half-words of the significand to match the
+ external format. */
+ image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
+ image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
- if (TARGET_G_FLOAT)
- fmt = &dec_g;
- else
- fmt = &dec_d;
-
- emovi (x, xi);
- /* Adjust exponent for offsets. */
- exp = (EMULONG) xi[E] - fmt->adjustment;
- /* Round off to nearest or even. */
- rndsav = rndprc;
- rndprc = fmt->precision;
- emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
- rndprc = rndsav;
- todec (xi, d);
-}
+ /* Add the sign and exponent. */
+ image0 |= sign;
+ image0 |= (r->exp + 128) << 7;
+ break;
-/* Convert exploded e-type X, that has already been rounded to
- 56-bit precision, to DEC format double Y. */
+ default:
+ abort ();
+ }
-static void
-todec (x, y)
- UEMUSHORT *x, *y;
-{
- if (TARGET_G_FLOAT)
- toieee (x, y, &dec_g);
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = image1, buf[1] = image0;
else
- toieee (x, y, &dec_d);
+ buf[0] = image0, buf[1] = image1;
}
-#endif /* DEC */
-
-#ifdef IBM
-/* Convert IBM single/double precision to e type. */
static void
-ibmtoe (d, e, mode)
- const UEMUSHORT *d;
- UEMUSHORT *e;
- enum machine_mode mode;
+decode_vax_d (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT y[NI];
- UEMUSHORT r, *p;
-
- ecleaz (y); /* start with a zero */
- p = y; /* point to our number */
- r = *d; /* get IBM exponent word */
- if (*d & (unsigned int) 0x8000)
- *p = 0xffff; /* fill in our sign */
- ++p; /* bump pointer to our exponent word */
- r &= 0x7f00; /* strip the sign bit */
- r >>= 6; /* shift exponent word down 6 bits */
- /* in fact shift by 8 right and 2 left */
- r += EXONE - (0x41 << 2); /* subtract IBM exponent offset */
- /* add our e type exponent offset */
- *p++ = r; /* to form our exponent */
-
- *p++ = *d++ & 0xff; /* now do the high order mantissa */
- /* strip off the IBM exponent and sign bits */
- if (mode != SFmode) /* there are only 2 words in SFmode */
- {
- *p++ = *d++; /* fill in the rest of our mantissa */
- *p++ = *d++;
- }
- *p = *d;
+ unsigned long image0, image1;
+ int exp;
- if (y[M] == 0 && y[M+1] == 0 && y[M+2] == 0 && y[M+3] == 0)
- y[0] = y[E] = 0;
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ image1 = buf[0], image0 = buf[1];
else
- y[E] -= 5 + enormlz (y); /* now normalise the mantissa */
- /* handle change in RADIX */
- emovo (y, e);
-}
+ image0 = buf[0], image1 = buf[1];
+ image0 &= 0xffffffff;
+ image1 &= 0xffffffff;
+ exp = (image0 >> 7) & 0x7f;
+ memset (r, 0, sizeof (*r));
-/* Convert e type to IBM single/double precision. */
+ if (exp != 0)
+ {
+ r->class = rvc_normal;
+ r->sign = (image0 >> 15) & 1;
+ r->exp = exp - 128;
-static void
-etoibm (x, d, mode)
- const UEMUSHORT *x;
- UEMUSHORT *d;
- enum machine_mode mode;
-{
- UEMUSHORT xi[NI];
- EMULONG exp;
- int rndsav;
-
- emovi (x, xi);
- exp = (EMULONG) xi[E] - (EXONE - (0x41 << 2)); /* adjust exponent for offsets */
- /* round off to nearest or even */
- rndsav = rndprc;
- rndprc = 56;
- emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
- rndprc = rndsav;
- toibm (xi, d, mode);
-}
+ /* Rearrange the half-words of the external format into
+ proper ascending order. */
+ image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
+ image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
-static void
-toibm (x, y, mode)
- UEMUSHORT *x, *y;
- enum machine_mode mode;
-{
- UEMUSHORT i;
- UEMUSHORT *p;
- int r;
-
- p = x;
- *y = 0;
- if (*p++)
- *y = 0x8000;
- i = *p++;
- if (i == 0)
- {
- *y++ = 0;
- *y++ = 0;
- if (mode != SFmode)
+ if (HOST_BITS_PER_LONG == 64)
{
- *y++ = 0;
- *y++ = 0;
+ image0 = (image0 << 31 << 1) | image1;
+ image0 <<= 64 - 56;
+ image0 |= SIG_MSB;
+ r->sig[SIGSZ-1] = image0;
}
- return;
- }
- r = i & 0x3;
- i >>= 2;
- if (i > 0x7f)
- {
- *y++ |= 0x7fff;
- *y++ = 0xffff;
- if (mode != SFmode)
+ else
{
- *y++ = 0xffff;
- *y++ = 0xffff;
+ r->sig[SIGSZ-1] = image0;
+ r->sig[SIGSZ-2] = image1;
+ lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
+ r->sig[SIGSZ-1] |= SIG_MSB;
}
-#ifdef ERANGE
- errno = ERANGE;
-#endif
- return;
- }
- i &= 0x7f;
- *y |= (i << 8);
- eshift (x, r + 5);
- *y++ |= x[M];
- *y++ = x[M + 1];
- if (mode != SFmode)
- {
- *y++ = x[M + 2];
- *y++ = x[M + 3];
}
}
-#endif /* IBM */
-
-
-#ifdef C4X
-/* Convert C4X single/double precision to e type. */
static void
-c4xtoe (d, e, mode)
- const UEMUSHORT *d;
- UEMUSHORT *e;
- enum machine_mode mode;
+encode_vax_g (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- UEMUSHORT y[NI];
- UEMUSHORT dn[4];
- int r;
- int isnegative;
- int size;
- int i;
- int carry;
-
- dn[0] = d[0];
- dn[1] = d[1];
- if (mode != QFmode)
- {
- dn[2] = d[3] << 8;
- dn[3] = 0;
- }
-
- /* Short-circuit the zero case. */
- if ((dn[0] == 0x8000)
- && (dn[1] == 0x0000)
- && ((mode == QFmode) || ((dn[2] == 0x0000) && (dn[3] == 0x0000))))
- {
- e[0] = 0;
- e[1] = 0;
- e[2] = 0;
- e[3] = 0;
- e[4] = 0;
- e[5] = 0;
- return;
- }
+ unsigned long image0, image1, sign = r->sign << 15;
- ecleaz (y); /* start with a zero */
- r = dn[0]; /* get sign/exponent part */
- if (r & (unsigned int) 0x0080)
+ switch (r->class)
{
- y[0] = 0xffff; /* fill in our sign */
- isnegative = TRUE;
- }
- else
- isnegative = FALSE;
-
- r >>= 8; /* Shift exponent word down 8 bits. */
- if (r & 0x80) /* Make the exponent negative if it is. */
- r = r | (~0 & ~0xff);
+ case rvc_zero:
+ image0 = image1 = 0;
+ break;
- if (isnegative)
- {
- /* Now do the high order mantissa. We don't "or" on the high bit
- because it is 2 (not 1) and is handled a little differently
- below. */
- y[M] = dn[0] & 0x7f;
+ case rvc_inf:
+ case rvc_nan:
+ image0 = 0xffff7fff | sign;
+ image1 = 0xffffffff;
+ break;
- y[M+1] = dn[1];
- if (mode != QFmode) /* There are only 2 words in QFmode. */
+ case rvc_normal:
+ /* Extract the significand into straight hi:lo. */
+ if (HOST_BITS_PER_LONG == 64)
{
- y[M+2] = dn[2]; /* Fill in the rest of our mantissa. */
- y[M+3] = dn[3];
- size = 4;
+ image0 = r->sig[SIGSZ-1];
+ image1 = (image0 >> (64 - 53)) & 0xffffffff;
+ image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
}
else
- size = 2;
- eshift (y, -8);
-
- /* Now do the two's complement on the data. */
-
- carry = 1; /* Initially add 1 for the two's complement. */
- for (i=size + M; i > M; i--)
{
- if (carry && (y[i] == 0x0000))
- /* We overflowed into the next word, carry is the same. */
- y[i] = carry ? 0x0000 : 0xffff;
- else
- {
- /* No overflow, just invert and add carry. */
- y[i] = ((~y[i]) + carry) & 0xffff;
- carry = 0;
- }
+ image0 = r->sig[SIGSZ-1];
+ image1 = r->sig[SIGSZ-2];
+ image1 = (image0 << 21) | (image1 >> 11);
+ image0 = (image0 >> 11) & 0xfffff;
}
- if (carry)
- {
- eshift (y, -1);
- y[M+1] |= 0x8000;
- r++;
- }
- y[1] = r + EXONE;
- }
- else
- {
- /* Add our e type exponent offset to form our exponent. */
- r += EXONE;
- y[1] = r;
-
- /* Now do the high order mantissa strip off the exponent and sign
- bits and add the high 1 bit. */
- y[M] = (dn[0] & 0x7f) | 0x80;
-
- y[M+1] = dn[1];
- if (mode != QFmode) /* There are only 2 words in QFmode. */
- {
- y[M+2] = dn[2]; /* Fill in the rest of our mantissa. */
- y[M+3] = dn[3];
- }
- eshift (y, -8);
- }
+ /* Rearrange the half-words of the significand to match the
+ external format. */
+ image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
+ image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
- emovo (y, e);
-}
+ /* Add the sign and exponent. */
+ image0 |= sign;
+ image0 |= (r->exp + 1024) << 4;
+ break;
+ default:
+ abort ();
+ }
-/* Convert e type to C4X single/double precision. */
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = image1, buf[1] = image0;
+ else
+ buf[0] = image0, buf[1] = image1;
+}
static void
-etoc4x (x, d, mode)
- const UEMUSHORT *x;
- UEMUSHORT *d;
- enum machine_mode mode;
+decode_vax_g (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT xi[NI];
- EMULONG exp;
- int rndsav;
+ unsigned long image0, image1;
+ int exp;
- emovi (x, xi);
-
- /* Adjust exponent for offsets. */
- exp = (EMULONG) xi[E] - (EXONE - 0x7f);
-
- /* Round off to nearest or even. */
- rndsav = rndprc;
- rndprc = mode == QFmode ? 24 : 32;
- emdnorm (xi, 0, 0, exp, !ROUND_TOWARDS_ZERO);
- rndprc = rndsav;
- toc4x (xi, d, mode);
-}
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ image1 = buf[0], image0 = buf[1];
+ else
+ image0 = buf[0], image1 = buf[1];
+ image0 &= 0xffffffff;
+ image1 &= 0xffffffff;
-static void
-toc4x (x, y, mode)
- UEMUSHORT *x, *y;
- enum machine_mode mode;
-{
- int i;
- int v;
- int carry;
-
- /* Short-circuit the zero case */
- if ((x[0] == 0) /* Zero exponent and sign */
- && (x[1] == 0)
- && (x[M] == 0) /* The rest is for zero mantissa */
- && (x[M+1] == 0)
- /* Only check for double if necessary */
- && ((mode == QFmode) || ((x[M+2] == 0) && (x[M+3] == 0))))
- {
- /* We have a zero. Put it into the output and return. */
- *y++ = 0x8000;
- *y++ = 0x0000;
- if (mode != QFmode)
- {
- *y++ = 0x0000;
- *y++ = 0x0000;
- }
- return;
- }
+ exp = (image0 >> 4) & 0x7ff;
- *y = 0;
+ memset (r, 0, sizeof (*r));
- /* Negative number require a two's complement conversion of the
- mantissa. */
- if (x[0])
+ if (exp != 0)
{
- *y = 0x0080;
+ r->class = rvc_normal;
+ r->sign = (image0 >> 15) & 1;
+ r->exp = exp - 1024;
- i = ((int) x[1]) - 0x7f;
-
- /* Now add 1 to the inverted data to do the two's complement. */
- if (mode != QFmode)
- v = 4 + M;
- else
- v = 2 + M;
- carry = 1;
- while (v > M)
- {
- if (x[v] == 0x0000)
- x[v] = carry ? 0x0000 : 0xffff;
- else
- {
- x[v] = ((~x[v]) + carry) & 0xffff;
- carry = 0;
- }
- v--;
- }
+ /* Rearrange the half-words of the external format into
+ proper ascending order. */
+ image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
+ image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
- /* The following is a special case. The C4X negative float requires
- a zero in the high bit (because the format is (2 - x) x 2^m), so
- if a one is in that bit, we have to shift left one to get rid
- of it. This only occurs if the number is -1 x 2^m. */
- if (x[M+1] & 0x8000)
+ if (HOST_BITS_PER_LONG == 64)
{
- /* This is the case of -1 x 2^m, we have to rid ourselves of the
- high sign bit and shift the exponent. */
- eshift (x, 1);
- i--;
+ image0 = (image0 << 31 << 1) | image1;
+ image0 <<= 64 - 53;
+ image0 |= SIG_MSB;
+ r->sig[SIGSZ-1] = image0;
}
- }
- else
- i = ((int) x[1]) - 0x7f;
-
- if ((i < -128) || (i > 127))
- {
- y[0] |= 0xff7f;
- y[1] = 0xffff;
- if (mode != QFmode)
+ else
{
- y[2] = 0xffff;
- y[3] = 0xffff;
- y[3] = (y[1] << 8) | ((y[2] >> 8) & 0xff);
- y[2] = (y[0] << 8) | ((y[1] >> 8) & 0xff);
+ r->sig[SIGSZ-1] = image0;
+ r->sig[SIGSZ-2] = image1;
+ lshift_significand (r, r, 64 - 53);
+ r->sig[SIGSZ-1] |= SIG_MSB;
}
-#ifdef ERANGE
- errno = ERANGE;
-#endif
- return;
- }
-
- y[0] |= ((i & 0xff) << 8);
-
- eshift (x, 8);
-
- y[0] |= x[M] & 0x7f;
- y[1] = x[M + 1];
- if (mode != QFmode)
- {
- y[2] = x[M + 2];
- y[3] = x[M + 3];
- y[3] = (y[1] << 8) | ((y[2] >> 8) & 0xff);
- y[2] = (y[0] << 8) | ((y[1] >> 8) & 0xff);
}
}
-#endif /* C4X */
-
-/* Output a binary NaN bit pattern in the target machine's format. */
-
-/* If special NaN bit patterns are required, define them in tm.h
- as arrays of unsigned 16-bit shorts. Otherwise, use the default
- patterns here. */
-#ifdef TFMODE_NAN
-TFMODE_NAN;
-#else
-#if defined (IEEE) && (INTEL_EXTENDED_IEEE_FORMAT == 0)
-static const UEMUSHORT TFbignan[8] =
- {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
-static const UEMUSHORT TFlittlenan[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0xffff};
-#endif
-#endif
-
-#ifdef XFMODE_NAN
-XFMODE_NAN;
-#else
-#ifdef IEEE
-static const UEMUSHORT XFbignan[6] =
- {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
-static const UEMUSHORT XFlittlenan[6] = {0, 0, 0, 0xc000, 0xffff, 0};
-#endif
-#endif
-
-#ifdef DFMODE_NAN
-DFMODE_NAN;
-#else
-#ifdef IEEE
-static const UEMUSHORT DFbignan[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
-static const UEMUSHORT DFlittlenan[4] = {0, 0, 0, 0xfff8};
-#endif
-#endif
-
-#ifdef SFMODE_NAN
-SFMODE_NAN;
-#else
-#ifdef IEEE
-static const UEMUSHORT SFbignan[2] = {0x7fff, 0xffff};
-static const UEMUSHORT SFlittlenan[2] = {0, 0xffc0};
-#endif
-#endif
+const struct real_format vax_f_format =
+ {
+ encode_vax_f,
+ decode_vax_f,
+ 2,
+ 1,
+ 24,
+ -127,
+ 127,
+ false,
+ false,
+ false,
+ false,
+ false
+ };
+
+const struct real_format vax_d_format =
+ {
+ encode_vax_d,
+ decode_vax_d,
+ 2,
+ 1,
+ 56,
+ -127,
+ 127,
+ false,
+ false,
+ false,
+ false,
+ false
+ };
+
+const struct real_format vax_g_format =
+ {
+ encode_vax_g,
+ decode_vax_g,
+ 2,
+ 1,
+ 53,
+ -1023,
+ 1023,
+ false,
+ false,
+ false,
+ false,
+ false
+ };
+
+/* A good reference for these can be found in chapter 9 of
+ "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
+ An on-line version can be found here:
+
+ http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
+*/
+
+static void encode_i370_single PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_i370_single PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
+static void encode_i370_double PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_i370_double PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
-#ifdef NANS
static void
-make_nan (nan, sign, mode)
- UEMUSHORT *nan;
- int sign;
- enum machine_mode mode;
+encode_i370_single (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- int n;
- const UEMUSHORT *p;
- int size;
+ unsigned long sign, exp, sig, image;
- size = GET_MODE_BITSIZE (mode);
- if (LARGEST_EXPONENT_IS_NORMAL (size))
- {
- warning ("%d-bit floats cannot hold NaNs", size);
- saturate (nan, sign, size, 0);
- return;
- }
- switch (mode)
- {
-/* Possibly the `reserved operand' patterns on a VAX can be
- used like NaN's, but probably not in the same way as IEEE. */
-#if !defined(DEC) && !defined(IBM) && !defined(C4X)
- case TFmode:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- n = 8;
- if (REAL_WORDS_BIG_ENDIAN)
- p = TFbignan;
- else
- p = TFlittlenan;
- break;
-#endif
- /* FALLTHRU */
+ sign = r->sign << 31;
- case XFmode:
- n = 6;
- if (REAL_WORDS_BIG_ENDIAN)
- p = XFbignan;
- else
- p = XFlittlenan;
+ switch (r->class)
+ {
+ case rvc_zero:
+ image = 0;
break;
- case DFmode:
- n = 4;
- if (REAL_WORDS_BIG_ENDIAN)
- p = DFbignan;
- else
- p = DFlittlenan;
+ case rvc_inf:
+ case rvc_nan:
+ image = 0x7fffffff | sign;
break;
- case SFmode:
- case HFmode:
- n = 2;
- if (REAL_WORDS_BIG_ENDIAN)
- p = SFbignan;
- else
- p = SFlittlenan;
+ case rvc_normal:
+ sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
+ exp = ((r->exp / 4) + 64) << 24;
+ image = sign | exp | sig;
break;
-#endif
default:
abort ();
}
- if (REAL_WORDS_BIG_ENDIAN)
- *nan++ = (sign << 15) | (*p++ & 0x7fff);
- while (--n != 0)
- *nan++ = *p++;
- if (! REAL_WORDS_BIG_ENDIAN)
- *nan = (sign << 15) | (*p & 0x7fff);
-}
-#endif /* NANS */
-
-/* Create a saturation value for a SIZE-bit float, assuming that
- LARGEST_EXPONENT_IS_NORMAL (SIZE).
-
- If SIGN is true, fill X with the most negative value, otherwise fill
- it with the most positive value. WARN is true if the function should
- warn about overflow. */
+ buf[0] = image;
+}
static void
-saturate (x, sign, size, warn)
- UEMUSHORT *x;
- int sign, size, warn;
+decode_i370_single (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- int i;
-
- if (warn && extra_warnings)
- warning ("value exceeds the range of a %d-bit float", size);
-
- /* Create the most negative value. */
- for (i = 0; i < size / EMUSHORT_SIZE; i++)
- x[i] = 0xffff;
-
- /* Make it positive, if necessary. */
- if (!sign)
- x[REAL_WORDS_BIG_ENDIAN? 0 : i - 1] = 0x7fff;
-}
+ unsigned long sign, sig, image = buf[0];
+ int exp;
+ sign = (image >> 31) & 1;
+ exp = (image >> 24) & 0x7f;
+ sig = image & 0xffffff;
-/* This is the inverse of the function `etarsingle' invoked by
- REAL_VALUE_TO_TARGET_SINGLE. */
-
-REAL_VALUE_TYPE
-ereal_unto_float (f)
- long f;
-{
- REAL_VALUE_TYPE r;
- UEMUSHORT s[2];
- UEMUSHORT e[NE];
+ memset (r, 0, sizeof (*r));
- /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
- This is the inverse operation to what the function `endian' does. */
- if (REAL_WORDS_BIG_ENDIAN)
+ if (exp || sig)
{
- s[0] = (UEMUSHORT) (f >> 16);
- s[1] = (UEMUSHORT) f;
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = (exp - 64) * 4;
+ r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
+ normalize (r);
}
- else
- {
- s[0] = (UEMUSHORT) f;
- s[1] = (UEMUSHORT) (f >> 16);
- }
- /* Convert and promote the target float to E-type. */
- e24toe (s, e);
- /* Output E-type to REAL_VALUE_TYPE. */
- PUT_REAL (e, &r);
- return r;
}
-
-/* This is the inverse of the function `etardouble' invoked by
- REAL_VALUE_TO_TARGET_DOUBLE. */
-
-REAL_VALUE_TYPE
-ereal_unto_double (d)
- long d[];
+static void
+encode_i370_double (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- REAL_VALUE_TYPE r;
- UEMUSHORT s[4];
- UEMUSHORT e[NE];
-
- /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
- if (REAL_WORDS_BIG_ENDIAN)
- {
- s[0] = (UEMUSHORT) (d[0] >> 16);
- s[1] = (UEMUSHORT) d[0];
- s[2] = (UEMUSHORT) (d[1] >> 16);
- s[3] = (UEMUSHORT) d[1];
- }
- else
- {
- /* Target float words are little-endian. */
- s[0] = (UEMUSHORT) d[0];
- s[1] = (UEMUSHORT) (d[0] >> 16);
- s[2] = (UEMUSHORT) d[1];
- s[3] = (UEMUSHORT) (d[1] >> 16);
- }
- /* Convert target double to E-type. */
- e53toe (s, e);
- /* Output E-type to REAL_VALUE_TYPE. */
- PUT_REAL (e, &r);
- return r;
-}
-
+ unsigned long sign, exp, image_hi, image_lo;
-/* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
- This is somewhat like ereal_unto_float, but the input types
- for these are different. */
+ sign = r->sign << 31;
-REAL_VALUE_TYPE
-ereal_from_float (f)
- HOST_WIDE_INT f;
-{
- REAL_VALUE_TYPE r;
- UEMUSHORT s[2];
- UEMUSHORT e[NE];
-
- /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
- This is the inverse operation to what the function `endian' does. */
- if (REAL_WORDS_BIG_ENDIAN)
+ switch (r->class)
{
- s[0] = (UEMUSHORT) (f >> 16);
- s[1] = (UEMUSHORT) f;
- }
- else
- {
- s[0] = (UEMUSHORT) f;
- s[1] = (UEMUSHORT) (f >> 16);
- }
- /* Convert and promote the target float to E-type. */
- e24toe (s, e);
- /* Output E-type to REAL_VALUE_TYPE. */
- PUT_REAL (e, &r);
- return r;
-}
-
+ case rvc_zero:
+ image_hi = image_lo = 0;
+ break;
-/* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
- This is somewhat like ereal_unto_double, but the input types
- for these are different.
+ case rvc_inf:
+ case rvc_nan:
+ image_hi = 0x7fffffff | sign;
+ image_lo = 0xffffffff;
+ break;
- The DFmode is stored as an array of HOST_WIDE_INT in the target's
- data format, with no holes in the bit packing. The first element
- of the input array holds the bits that would come first in the
- target computer's memory. */
+ case rvc_normal:
+ if (HOST_BITS_PER_LONG == 64)
+ {
+ image_hi = r->sig[SIGSZ-1];
+ image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
+ image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
+ }
+ else
+ {
+ image_hi = r->sig[SIGSZ-1];
+ image_lo = r->sig[SIGSZ-2];
+ image_lo = (image_lo >> 8) | (image_hi << 24);
+ image_hi >>= 8;
+ }
-REAL_VALUE_TYPE
-ereal_from_double (d)
- HOST_WIDE_INT d[];
-{
- REAL_VALUE_TYPE r;
- UEMUSHORT s[4];
- UEMUSHORT e[NE];
+ exp = ((r->exp / 4) + 64) << 24;
+ image_hi |= sign | exp;
+ break;
- /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces. */
- if (REAL_WORDS_BIG_ENDIAN)
- {
-#if HOST_BITS_PER_WIDE_INT == 32
- s[0] = (UEMUSHORT) (d[0] >> 16);
- s[1] = (UEMUSHORT) d[0];
- s[2] = (UEMUSHORT) (d[1] >> 16);
- s[3] = (UEMUSHORT) d[1];
-#else
- /* In this case the entire target double is contained in the
- first array element. The second element of the input is
- ignored. */
- s[0] = (UEMUSHORT) (d[0] >> 48);
- s[1] = (UEMUSHORT) (d[0] >> 32);
- s[2] = (UEMUSHORT) (d[0] >> 16);
- s[3] = (UEMUSHORT) d[0];
-#endif
+ default:
+ abort ();
}
+
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = image_hi, buf[1] = image_lo;
else
- {
- /* Target float words are little-endian. */
- s[0] = (UEMUSHORT) d[0];
- s[1] = (UEMUSHORT) (d[0] >> 16);
-#if HOST_BITS_PER_WIDE_INT == 32
- s[2] = (UEMUSHORT) d[1];
- s[3] = (UEMUSHORT) (d[1] >> 16);
-#else
- s[2] = (UEMUSHORT) (d[0] >> 32);
- s[3] = (UEMUSHORT) (d[0] >> 48);
-#endif
- }
- /* Convert target double to E-type. */
- e53toe (s, e);
- /* Output E-type to REAL_VALUE_TYPE. */
- PUT_REAL (e, &r);
- return r;
+ buf[0] = image_lo, buf[1] = image_hi;
}
-
-#if 0
-/* Convert target computer unsigned 64-bit integer to e-type.
- The endian-ness of DImode follows the convention for integers,
- so we use WORDS_BIG_ENDIAN here, not REAL_WORDS_BIG_ENDIAN. */
-
static void
-uditoe (di, e)
- const UEMUSHORT *di; /* Address of the 64-bit int. */
- UEMUSHORT *e;
+decode_i370_double (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT yi[NI];
- int k;
+ unsigned long sign, image_hi, image_lo;
+ int exp;
- ecleaz (yi);
- if (WORDS_BIG_ENDIAN)
- {
- for (k = M; k < M + 4; k++)
- yi[k] = *di++;
- }
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ image_hi = buf[0], image_lo = buf[1];
else
- {
- for (k = M + 3; k >= M; k--)
- yi[k] = *di++;
- }
- yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
- if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
- ecleaz (yi); /* it was zero */
- else
- yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
- emovo (yi, e);
-}
+ image_lo = buf[0], image_hi = buf[1];
-/* Convert target computer signed 64-bit integer to e-type. */
+ sign = (image_hi >> 31) & 1;
+ exp = (image_hi >> 24) & 0x7f;
+ image_hi &= 0xffffff;
+ image_lo &= 0xffffffff;
-static void
-ditoe (di, e)
- const UEMUSHORT *di; /* Address of the 64-bit int. */
- UEMUSHORT *e;
-{
- unsigned EMULONG acc;
- UEMUSHORT yi[NI];
- UEMUSHORT carry;
- int k, sign;
+ memset (r, 0, sizeof (*r));
- ecleaz (yi);
- if (WORDS_BIG_ENDIAN)
- {
- for (k = M; k < M + 4; k++)
- yi[k] = *di++;
- }
- else
- {
- for (k = M + 3; k >= M; k--)
- yi[k] = *di++;
- }
- /* Take absolute value */
- sign = 0;
- if (yi[M] & 0x8000)
+ if (exp || image_hi || image_lo)
{
- sign = 1;
- carry = 0;
- for (k = M + 3; k >= M; k--)
+ r->class = rvc_normal;
+ r->sign = sign;
+ r->exp = (exp - 64) * 4 + (SIGNIFICAND_BITS - 56);
+
+ if (HOST_BITS_PER_LONG == 32)
{
- acc = (unsigned EMULONG) (~yi[k] & 0xffff) + carry;
- yi[k] = acc;
- carry = 0;
- if (acc & 0x10000)
- carry = 1;
+ r->sig[0] = image_lo;
+ r->sig[1] = image_hi;
}
- }
- yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
- if ((k = enormlz (yi)) > NBITS)/* normalize the significand */
- ecleaz (yi); /* it was zero */
- else
- yi[E] -= (UEMUSHORT) k;/* subtract shift count from exponent */
- emovo (yi, e);
- if (sign)
- eneg (e);
-}
+ else
+ r->sig[0] = image_lo | (image_hi << 31 << 1);
+
+ normalize (r);
+ }
+}
+
+const struct real_format i370_single_format =
+ {
+ encode_i370_single,
+ decode_i370_single,
+ 16,
+ 4,
+ 6,
+ -64,
+ 63,
+ false,
+ false,
+ false, /* ??? The encoding does allow for "unnormals". */
+ false, /* ??? The encoding does allow for "unnormals". */
+ false
+ };
+
+const struct real_format i370_double_format =
+ {
+ encode_i370_double,
+ decode_i370_double,
+ 16,
+ 4,
+ 14,
+ -64,
+ 63,
+ false,
+ false,
+ false, /* ??? The encoding does allow for "unnormals". */
+ false, /* ??? The encoding does allow for "unnormals". */
+ false
+ };
+
+/* The "twos-complement" c4x format is officially defined as
+ x = s(~s).f * 2**e
-/* Convert e-type to unsigned 64-bit int. */
+ This is rather misleading. One must remember that F is signed.
+ A better description would be
-static void
-etoudi (x, i)
- const UEMUSHORT *x;
- UEMUSHORT *i;
-{
- UEMUSHORT xi[NI];
- int j, k;
+ x = -1**s * ((s + 1 + .f) * 2**e
- emovi (x, xi);
- if (xi[0])
- {
- xi[M] = 0;
- goto noshift;
- }
- k = (int) xi[E] - (EXONE - 1);
- if (k <= 0)
- {
- for (j = 0; j < 4; j++)
- *i++ = 0;
- return;
- }
- if (k > 64)
- {
- for (j = 0; j < 4; j++)
- *i++ = 0xffff;
- if (extra_warnings)
- warning ("overflow on truncation to integer");
- return;
- }
- if (k > 16)
- {
- /* Shift more than 16 bits: first shift up k-16 mod 16,
- then shift up by 16's. */
- j = k - ((k >> 4) << 4);
- if (j == 0)
- j = 16;
- eshift (xi, j);
- if (WORDS_BIG_ENDIAN)
- *i++ = xi[M];
- else
- {
- i += 3;
- *i-- = xi[M];
- }
- k -= j;
- do
- {
- eshup6 (xi);
- if (WORDS_BIG_ENDIAN)
- *i++ = xi[M];
- else
- *i-- = xi[M];
- }
- while ((k -= 16) > 0);
- }
- else
- {
- /* shift not more than 16 bits */
- eshift (xi, k);
+ So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
+ that's -1 * (1+1+(-.5)) == -1.5. I think.
-noshift:
-
- if (WORDS_BIG_ENDIAN)
- {
- i += 3;
- *i-- = xi[M];
- *i-- = 0;
- *i-- = 0;
- *i = 0;
- }
- else
- {
- *i++ = xi[M];
- *i++ = 0;
- *i++ = 0;
- *i = 0;
- }
- }
-}
+ The constructions here are taken from Tables 5-1 and 5-2 of the
+ TMS320C4x User's Guide wherein step-by-step instructions for
+ conversion from IEEE are presented. That's close enough to our
+ internal representation so as to make things easy.
+ See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
-/* Convert e-type to signed 64-bit int. */
+static void encode_c4x_single PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_c4x_single PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
+static void encode_c4x_extended PARAMS ((const struct real_format *fmt,
+ long *, const REAL_VALUE_TYPE *));
+static void decode_c4x_extended PARAMS ((const struct real_format *,
+ REAL_VALUE_TYPE *, const long *));
static void
-etodi (x, i)
- const UEMUSHORT *x;
- UEMUSHORT *i;
+encode_c4x_single (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
{
- unsigned EMULONG acc;
- UEMUSHORT xi[NI];
- UEMUSHORT carry;
- UEMUSHORT *isave;
- int j, k;
-
- emovi (x, xi);
- k = (int) xi[E] - (EXONE - 1);
- if (k <= 0)
- {
- for (j = 0; j < 4; j++)
- *i++ = 0;
- return;
- }
- if (k > 64)
- {
- for (j = 0; j < 4; j++)
- *i++ = 0xffff;
- if (extra_warnings)
- warning ("overflow on truncation to integer");
- return;
- }
- isave = i;
- if (k > 16)
- {
- /* Shift more than 16 bits: first shift up k-16 mod 16,
- then shift up by 16's. */
- j = k - ((k >> 4) << 4);
- if (j == 0)
- j = 16;
- eshift (xi, j);
- if (WORDS_BIG_ENDIAN)
- *i++ = xi[M];
- else
- {
- i += 3;
- *i-- = xi[M];
- }
- k -= j;
- do
- {
- eshup6 (xi);
- if (WORDS_BIG_ENDIAN)
- *i++ = xi[M];
- else
- *i-- = xi[M];
- }
- while ((k -= 16) > 0);
- }
- else
+ unsigned long image, exp, sig;
+
+ switch (r->class)
{
- /* shift not more than 16 bits */
- eshift (xi, k);
+ case rvc_zero:
+ exp = -128;
+ sig = 0;
+ break;
- if (WORDS_BIG_ENDIAN)
- {
- i += 3;
- *i = xi[M];
- *i-- = 0;
- *i-- = 0;
- *i = 0;
- }
- else
- {
- *i++ = xi[M];
- *i++ = 0;
- *i++ = 0;
- *i = 0;
- }
- }
- /* Negate if negative */
- if (xi[0])
- {
- carry = 0;
- if (WORDS_BIG_ENDIAN)
- isave += 3;
- for (k = 0; k < 4; k++)
+ case rvc_inf:
+ case rvc_nan:
+ exp = 127;
+ sig = 0x800000 - r->sign;
+ break;
+
+ case rvc_normal:
+ exp = r->exp - 1;
+ sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
+ if (r->sign)
{
- acc = (unsigned EMULONG) (~(*isave) & 0xffff) + carry;
- if (WORDS_BIG_ENDIAN)
- *isave-- = acc;
+ if (sig)
+ sig = -sig;
else
- *isave++ = acc;
- carry = 0;
- if (acc & 0x10000)
- carry = 1;
+ exp--;
+ sig |= 0x800000;
}
- }
-}
-
-
-/* Longhand square root routine. */
+ break;
+ default:
+ abort ();
+ }
-static int esqinited = 0;
-static unsigned short sqrndbit[NI];
+ image = ((exp & 0xff) << 24) | (sig & 0xffffff);
+ buf[0] = image;
+}
static void
-esqrt (x, y)
- const UEMUSHORT *x;
- UEMUSHORT *y;
+decode_c4x_single (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
- UEMUSHORT temp[NI], num[NI], sq[NI], xx[NI];
- EMULONG m, exp;
- int i, j, k, n, nlups;
+ unsigned long image = buf[0];
+ unsigned long sig;
+ int exp, sf;
- if (esqinited == 0)
- {
- ecleaz (sqrndbit);
- sqrndbit[NI - 2] = 1;
- esqinited = 1;
- }
- /* Check for arg <= 0 */
- i = ecmp (x, ezero);
- if (i <= 0)
+ exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
+ sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
+
+ memset (r, 0, sizeof (*r));
+
+ if (exp != -128)
{
- if (i == -1)
+ r->class = rvc_normal;
+
+ sig = sf & 0x7fffff;
+ if (sf < 0)
{
- mtherr ("esqrt", DOMAIN);
- eclear (y);
+ r->sign = 1;
+ if (sig)
+ sig = -sig;
+ else
+ exp++;
}
- else
- emov (x, y);
- return;
- }
+ sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
-#ifdef INFINITY
- if (eisinf (x))
- {
- eclear (y);
- einfin (y);
- return;
+ r->exp = exp + 1;
+ r->sig[SIGSZ-1] = sig;
}
-#endif
- /* Bring in the arg and renormalize if it is denormal. */
- emovi (x, xx);
- m = (EMULONG) xx[1]; /* local long word exponent */
- if (m == 0)
- m -= enormlz (xx);
-
- /* Divide exponent by 2 */
- m -= 0x3ffe;
- exp = (unsigned short) ((m / 2) + 0x3ffe);
-
- /* Adjust if exponent odd */
- if ((m & 1) != 0)
+}
+
+static void
+encode_c4x_extended (fmt, buf, r)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ long *buf;
+ const REAL_VALUE_TYPE *r;
+{
+ unsigned long exp, sig;
+
+ switch (r->class)
{
- if (m > 0)
- exp += 1;
- eshdn1 (xx);
- }
+ case rvc_zero:
+ exp = -128;
+ sig = 0;
+ break;
+
+ case rvc_inf:
+ case rvc_nan:
+ exp = 127;
+ sig = 0x80000000 - r->sign;
+ break;
- ecleaz (sq);
- ecleaz (num);
- n = 8; /* get 8 bits of result per inner loop */
- nlups = rndprc;
- j = 0;
+ case rvc_normal:
+ exp = r->exp - 1;
- while (nlups > 0)
- {
- /* bring in next word of arg */
- if (j < NE)
- num[NI - 1] = xx[j + 3];
- /* Do additional bit on last outer loop, for roundoff. */
- if (nlups <= 8)
- n = nlups + 1;
- for (i = 0; i < n; i++)
+ sig = r->sig[SIGSZ-1];
+ if (HOST_BITS_PER_LONG == 64)
+ sig = sig >> 1 >> 31;
+ sig &= 0x7fffffff;
+
+ if (r->sign)
{
- /* Next 2 bits of arg */
- eshup1 (num);
- eshup1 (num);
- /* Shift up answer */
- eshup1 (sq);
- /* Make trial divisor */
- for (k = 0; k < NI; k++)
- temp[k] = sq[k];
- eshup1 (temp);
- eaddm (sqrndbit, temp);
- /* Subtract and insert answer bit if it goes in */
- if (ecmpm (temp, num) <= 0)
- {
- esubm (temp, num);
- sq[NI - 2] |= 1;
- }
+ if (sig)
+ sig = -sig;
+ else
+ exp--;
+ sig |= 0x80000000;
}
- nlups -= n;
- j += 1;
- }
+ break;
- /* Adjust for extra, roundoff loop done. */
- exp += (NBITS - 1) - rndprc;
+ default:
+ abort ();
+ }
- /* Sticky bit = 1 if the remainder is nonzero. */
- k = 0;
- for (i = 3; i < NI; i++)
- k |= (int) num[i];
+ exp = (exp & 0xff) << 24;
+ sig &= 0xffffffff;
- /* Renormalize and round off. */
- emdnorm (sq, k, 0, exp, !ROUND_TOWARDS_ZERO);
- emovo (sq, y);
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ buf[0] = exp, buf[1] = sig;
+ else
+ buf[0] = sig, buf[0] = exp;
}
-#endif
-
-/* Return the binary precision of the significand for a given
- floating point mode. The mode can hold an integer value
- that many bits wide, without losing any bits. */
-unsigned int
-significand_size (mode)
- enum machine_mode mode;
+static void
+decode_c4x_extended (fmt, r, buf)
+ const struct real_format *fmt ATTRIBUTE_UNUSED;
+ REAL_VALUE_TYPE *r;
+ const long *buf;
{
+ unsigned long sig;
+ int exp, sf;
- /* Don't test the modes, but their sizes, lest this
- code won't work for BITS_PER_UNIT != 8 . */
+ if (FLOAT_WORDS_BIG_ENDIAN)
+ exp = buf[0], sf = buf[1];
+ else
+ sf = buf[0], exp = buf[1];
- switch (GET_MODE_BITSIZE (mode))
- {
- case 32:
+ exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
+ sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
-#ifdef C4X
- return 56;
-#else
- return 24;
-#endif
+ memset (r, 0, sizeof (*r));
- case 64:
-#ifdef IEEE
- return 53;
-#else
- return 56;
-#endif
+ if (exp != -128)
+ {
+ r->class = rvc_normal;
- case 96:
- return 64;
+ sig = sf & 0x7fffffff;
+ if (sf < 0)
+ {
+ r->sign = 1;
+ if (sig)
+ sig = -sig;
+ else
+ exp++;
+ }
+ if (HOST_BITS_PER_LONG == 64)
+ sig = sig << 1 << 31;
+ sig |= SIG_MSB;
+
+ r->exp = exp + 1;
+ r->sig[SIGSZ-1] = sig;
+ }
+}
+
+const struct real_format c4x_single_format =
+ {
+ encode_c4x_single,
+ decode_c4x_single,
+ 2,
+ 1,
+ 24,
+ -126,
+ 128,
+ false,
+ false,
+ false,
+ false,
+ false
+ };
+
+const struct real_format c4x_extended_format =
+ {
+ encode_c4x_extended,
+ decode_c4x_extended,
+ 2,
+ 1,
+ 32,
+ -126,
+ 128,
+ false,
+ false,
+ false,
+ false,
+ false
+ };
+
+/* Set up default mode to format mapping for IEEE. Everyone else has
+ to set these values in OVERRIDE_OPTIONS. */
- case 128:
-#if (INTEL_EXTENDED_IEEE_FORMAT == 0)
- return 113;
-#else
- return 64;
-#endif
+const struct real_format *real_format_for_mode[TFmode - QFmode + 1] =
+{
+ NULL, /* QFmode */
+ NULL, /* HFmode */
+ NULL, /* TQFmode */
+ &ieee_single_format, /* SFmode */
+ &ieee_double_format, /* DFmode */
- default:
- abort ();
- }
-}
+ /* We explicitly don't handle XFmode. There are two formats,
+ pretty much equally common. Choose one in OVERRIDE_OPTIONS. */
+ NULL, /* XFmode */
+ &ieee_quad_format /* TFmode */
+};
diff --git a/gcc/real.h b/gcc/real.h
index 174d2c46abf..2bdca76081f 100644
--- a/gcc/real.h
+++ b/gcc/real.h
@@ -2,104 +2,73 @@
Copyright (C) 1989, 1991, 1994, 1996, 1997, 1998,
1999, 2000, 2002 Free Software Foundation, Inc.
-This file is part of GCC.
+ 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 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.
+ 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. */
+ 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. */
#ifndef GCC_REAL_H
#define GCC_REAL_H
#include "machmode.h"
-/* Define codes for all the float formats that we know of. */
-#define UNKNOWN_FLOAT_FORMAT 0
-#define IEEE_FLOAT_FORMAT 1
-#define VAX_FLOAT_FORMAT 2
-#define IBM_FLOAT_FORMAT 3
-#define C4X_FLOAT_FORMAT 4
+/* An expanded form of the represented number. */
-/* Default to IEEE float if not specified. Nearly all machines use it. */
-
-#ifndef TARGET_FLOAT_FORMAT
-#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-#endif
-
-#ifndef HOST_FLOAT_FORMAT
-#define HOST_FLOAT_FORMAT IEEE_FLOAT_FORMAT
-#endif
-
-#ifndef INTEL_EXTENDED_IEEE_FORMAT
-#define INTEL_EXTENDED_IEEE_FORMAT 0
-#endif
-
-/* If FLOAT_WORDS_BIG_ENDIAN and HOST_FLOAT_WORDS_BIG_ENDIAN are not defined
- in the header files, then this implies the word-endianness is the same as
- for integers. */
-
-/* This is defined 0 or 1, like WORDS_BIG_ENDIAN. */
-#ifndef FLOAT_WORDS_BIG_ENDIAN
-#define FLOAT_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
+/* Enumerate the special cases of numbers that we encounter. */
+enum real_value_class {
+ rvc_zero,
+ rvc_normal,
+ rvc_inf,
+ rvc_nan
+};
-/* This is defined 0 or 1, unlike HOST_WORDS_BIG_ENDIAN. */
-#ifndef HOST_FLOAT_WORDS_BIG_ENDIAN
-#ifdef HOST_WORDS_BIG_ENDIAN
-#define HOST_FLOAT_WORDS_BIG_ENDIAN 1
-#else
-#define HOST_FLOAT_WORDS_BIG_ENDIAN 0
-#endif
-#endif
+#define SIGNIFICAND_BITS (128 + HOST_BITS_PER_LONG)
+#define EXP_BITS (32 - 3)
+#define MAX_EXP ((1 << (EXP_BITS - 1)) - 1)
+#define SIGSZ (SIGNIFICAND_BITS / HOST_BITS_PER_LONG)
+#define SIG_MSB ((unsigned long)1 << (HOST_BITS_PER_LONG - 1))
+
+struct real_value GTY(())
+{
+ ENUM_BITFIELD (real_value_class) class : 2;
+ unsigned int sign : 1;
+ signed int exp : EXP_BITS;
+ unsigned long sig[SIGSZ];
+};
-#ifndef LONG_DOUBLE_TYPE_SIZE
-#define LONG_DOUBLE_TYPE_SIZE 64
-#endif
-/* MAX_LONG_DOUBLE_TYPE_SIZE is a constant tested by #if.
- LONG_DOUBLE_TYPE_SIZE can vary at compiler run time.
- So long as macros like REAL_VALUE_TO_TARGET_LONG_DOUBLE cannot
- vary too, however, then XFmode and TFmode long double
- cannot both be supported at the same time. */
-#ifndef MAX_LONG_DOUBLE_TYPE_SIZE
-#define MAX_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
-#endif
+/* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it
+ needs to be a macro. We do need to continue to have a structure tag
+ so that other headers can forward declare it. */
+#define REAL_VALUE_TYPE struct real_value
-/* **** Start of software floating point emulator interface macros **** */
+/* We store a REAL_VALUE_TYPE into an rtx, and we do this by putting it in
+ consecutive "w" slots. Moreover, we've got to compute the number of "w"
+ slots at preprocessor time, which means we can't use sizeof. Guess. */
-/* REAL_VALUE_TYPE is an array of the minimum number of HOST_WIDE_INTs
- required to hold either a 96- or 160-bit extended precision floating
- point type. This is true even if the maximum precision floating
- point type on the target is smaller. */
-#if MAX_LONG_DOUBLE_TYPE_SIZE == 128 && !INTEL_EXTENDED_IEEE_FORMAT
-#define REAL_VALUE_TYPE_SIZE 160
-#else
-#define REAL_VALUE_TYPE_SIZE 96
-#endif
+#define REAL_VALUE_TYPE_SIZE (SIGNIFICAND_BITS + 32)
#define REAL_WIDTH \
(REAL_VALUE_TYPE_SIZE/HOST_BITS_PER_WIDE_INT \
+ (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0)) /* round up */
-struct realvaluetype GTY(()) {
- HOST_WIDE_INT r[REAL_WIDTH];
-};
-/* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it needs
- to be a macro. realvaluetype cannot be a typedef as this interferes with
- other headers declaring opaque pointers to it. */
-#define REAL_VALUE_TYPE struct realvaluetype
+
+/* Verify the guess. */
+extern char test_real_width
+ [sizeof(REAL_VALUE_TYPE) <= REAL_WIDTH*sizeof(HOST_WIDE_INT) ? 1 : -1];
/* Calculate the format for CONST_DOUBLE. We need as many slots as
are necessary to overlay a REAL_VALUE_TYPE on them. This could be
- as many as five (32-bit HOST_WIDE_INT, 160-bit REAL_VALUE_TYPE).
+ as many as four (32-bit HOST_WIDE_INT, 128-bit REAL_VALUE_TYPE).
A number of places assume that there are always at least two 'w'
slots in a CONST_DOUBLE, so we provide them even if one would suffice. */
@@ -119,141 +88,232 @@ struct realvaluetype GTY(()) {
# if REAL_WIDTH == 5
# define CONST_DOUBLE_FORMAT "wwwww"
# else
- #error "REAL_WIDTH > 5 not supported"
+# if REAL_WIDTH == 6
+# define CONST_DOUBLE_FORMAT "wwwwww"
+# else
+ #error "REAL_WIDTH > 6 not supported"
+# endif
# endif
# endif
# endif
# endif
#endif
-extern unsigned int significand_size PARAMS ((enum machine_mode));
-#define REAL_ARITHMETIC(value, code, d1, d2) \
- earith (&(value), (code), &(d1), &(d2))
+/* Describes the properties of the specific target format in use. */
+struct real_format
+{
+ /* Move to and from the target bytes. */
+ void (*encode) PARAMS ((const struct real_format *, long *,
+ const REAL_VALUE_TYPE *));
+ void (*decode) PARAMS ((const struct real_format *, REAL_VALUE_TYPE *,
+ const long *));
-/* Declare functions in real.c. */
-extern void earith PARAMS ((REAL_VALUE_TYPE *, int,
- REAL_VALUE_TYPE *, REAL_VALUE_TYPE *));
-extern REAL_VALUE_TYPE etrunci PARAMS ((REAL_VALUE_TYPE));
-extern REAL_VALUE_TYPE etruncui PARAMS ((REAL_VALUE_TYPE));
-extern REAL_VALUE_TYPE ereal_negate PARAMS ((REAL_VALUE_TYPE));
-extern HOST_WIDE_INT efixi PARAMS ((REAL_VALUE_TYPE));
-extern unsigned HOST_WIDE_INT efixui PARAMS ((REAL_VALUE_TYPE));
-extern void ereal_from_int PARAMS ((REAL_VALUE_TYPE *,
- HOST_WIDE_INT, HOST_WIDE_INT,
- enum machine_mode));
-extern void ereal_from_uint PARAMS ((REAL_VALUE_TYPE *,
- unsigned HOST_WIDE_INT,
- unsigned HOST_WIDE_INT,
- enum machine_mode));
-extern void ereal_to_int PARAMS ((HOST_WIDE_INT *, HOST_WIDE_INT *,
- REAL_VALUE_TYPE));
-extern REAL_VALUE_TYPE ereal_ldexp PARAMS ((REAL_VALUE_TYPE, int));
-
-extern void etartdouble PARAMS ((REAL_VALUE_TYPE, long *));
-extern void etarldouble PARAMS ((REAL_VALUE_TYPE, long *));
-extern void etardouble PARAMS ((REAL_VALUE_TYPE, long *));
-extern long etarsingle PARAMS ((REAL_VALUE_TYPE));
-extern void ereal_to_decimal PARAMS ((REAL_VALUE_TYPE, char *));
-extern int ereal_cmp PARAMS ((REAL_VALUE_TYPE, REAL_VALUE_TYPE));
-extern int ereal_isneg PARAMS ((REAL_VALUE_TYPE));
-extern REAL_VALUE_TYPE ereal_unto_float PARAMS ((long));
-extern REAL_VALUE_TYPE ereal_unto_double PARAMS ((long *));
-extern REAL_VALUE_TYPE ereal_from_float PARAMS ((HOST_WIDE_INT));
-extern REAL_VALUE_TYPE ereal_from_double PARAMS ((HOST_WIDE_INT *));
-
-#define REAL_VALUES_EQUAL(x, y) (ereal_cmp ((x), (y)) == 0)
-/* true if x < y : */
-#define REAL_VALUES_LESS(x, y) (ereal_cmp ((x), (y)) == -1)
-#define REAL_VALUE_LDEXP(x, n) ereal_ldexp (x, n)
-
-/* Compare two floating-point objects for bitwise identity.
- This is not the same as comparing for equality on IEEE hosts:
- -0.0 equals 0.0 but they are not identical, and conversely
- two NaNs might be identical but they cannot be equal. */
-#define REAL_VALUES_IDENTICAL(x, y) \
- (!memcmp ((char *) &(x), (char *) &(y), sizeof (REAL_VALUE_TYPE)))
-
-/* These return REAL_VALUE_TYPE: */
-#define REAL_VALUE_RNDZINT(x) (etrunci (x))
-#define REAL_VALUE_UNSIGNED_RNDZINT(x) (etruncui (x))
-
-/* Truncate the floating-point value X to mode MODE. */
-#define REAL_VALUE_TRUNCATE(mode, x) real_value_truncate (mode, x)
-extern REAL_VALUE_TYPE real_value_truncate PARAMS ((enum machine_mode,
- REAL_VALUE_TYPE));
+ /* The radix of the exponent and digits of the significand. */
+ int b;
-/* Expansion of REAL_VALUE_TRUNCATE.
- The result is in floating point, rounded to nearest or even. */
-extern bool exact_real_truncate PARAMS ((enum machine_mode,
- REAL_VALUE_TYPE *));
+ /* log2(b). */
+ int log2_b;
+
+ /* Size of the significand in digits of radix B. */
+ int p;
-/* These return HOST_WIDE_INT: */
-/* Convert a floating-point value to integer, rounding toward zero. */
-#define REAL_VALUE_FIX(x) (efixi (x))
-/* Convert a floating-point value to unsigned integer, rounding
- toward zero. */
-#define REAL_VALUE_UNSIGNED_FIX(x) (efixui (x))
+ /* The minimum negative integer, x, such that b**(x-1) is normalized. */
+ int emin;
-/* Convert ASCII string S to floating point in mode M.
- Decimal input uses ATOF. Hexadecimal uses HTOF. */
-#define REAL_VALUE_ATOF(s,m) ereal_atof(s,m)
-#define REAL_VALUE_HTOF(s,m) ereal_atof(s,m)
+ /* The maximum integer, x, such that b**(x-1) is representable. */
+ int emax;
-#define REAL_VALUE_NEGATE ereal_negate
+ /* Properties of the format. */
+ bool has_nans;
+ bool has_inf;
+ bool has_denorm;
+ bool has_signed_zero;
+ bool qnan_msb_set;
+};
+
+
+/* The target format used for each floating floating point mode.
+ Indexed by MODE - QFmode. */
+extern const struct real_format *real_format_for_mode[TFmode - QFmode + 1];
-/* Compute the absolute value of a floating-point value X. */
-#define REAL_VALUE_ABS(x) \
- (REAL_VALUE_NEGATIVE (x) ? REAL_VALUE_NEGATE (x) : (x))
+
+/* Declare functions in real.c. */
+
+/* Binary or unary arithmetic on tree_code. */
+extern void real_arithmetic PARAMS ((REAL_VALUE_TYPE *, int,
+ const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+
+/* Compare reals by tree_code. */
+extern bool real_compare PARAMS ((int, const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
/* Determine whether a floating-point value X is infinite. */
-#define REAL_VALUE_ISINF(x) (target_isinf (x))
+extern bool real_isinf PARAMS ((const REAL_VALUE_TYPE *));
/* Determine whether a floating-point value X is a NaN. */
-#define REAL_VALUE_ISNAN(x) (target_isnan (x))
+extern bool real_isnan PARAMS ((const REAL_VALUE_TYPE *));
/* Determine whether a floating-point value X is negative. */
-#define REAL_VALUE_NEGATIVE(x) (target_negative (x))
+extern bool real_isneg PARAMS ((const REAL_VALUE_TYPE *));
/* Determine whether a floating-point value X is minus zero. */
-#define REAL_VALUE_MINUS_ZERO(x) \
- ((ereal_cmp (x, dconst0) == 0) && (ereal_isneg (x) != 0 ))
+extern bool real_isnegzero PARAMS ((const REAL_VALUE_TYPE *));
+
+/* Compare two floating-point objects for bitwise identity. */
+extern bool real_identical PARAMS ((const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
+
+/* Extend or truncate to a new mode. */
+extern void real_convert PARAMS ((REAL_VALUE_TYPE *,
+ enum machine_mode,
+ const REAL_VALUE_TYPE *));
+
+/* Return true if truncating to NEW is exact. */
+extern bool exact_real_truncate PARAMS ((enum machine_mode,
+ const REAL_VALUE_TYPE *));
+
+/* Render R as a decimal floating point constant. */
+extern void real_to_decimal PARAMS ((char *, const REAL_VALUE_TYPE *,
+ size_t, size_t, int));
+
+/* Render R as a hexadecimal floating point constant. */
+extern void real_to_hexadecimal PARAMS ((char *, const REAL_VALUE_TYPE *,
+ size_t, size_t, int));
+
+/* Render R as an integer. */
+extern HOST_WIDE_INT real_to_integer PARAMS ((const REAL_VALUE_TYPE *));
+extern void real_to_integer2 PARAMS ((HOST_WIDE_INT *, HOST_WIDE_INT *,
+ const REAL_VALUE_TYPE *));
-#define REAL_VALUE_TO_INT ereal_to_int
+/* Initialize R from a decimal or hexadecimal string. */
+extern void real_from_string PARAMS ((REAL_VALUE_TYPE *, const char *));
-/* Here the cast to HOST_WIDE_INT sign-extends arguments such as ~0. */
-#define REAL_VALUE_FROM_INT(d, lo, hi, mode) \
- ereal_from_int (&d, (HOST_WIDE_INT) (lo), (HOST_WIDE_INT) (hi), mode)
+/* Initialize R from an integer pair HIGH/LOW. */
+extern void real_from_integer PARAMS ((REAL_VALUE_TYPE *,
+ enum machine_mode,
+ unsigned HOST_WIDE_INT,
+ HOST_WIDE_INT, int));
-#define REAL_VALUE_FROM_UNSIGNED_INT(d, lo, hi, mode) \
- ereal_from_uint (&d, lo, hi, mode)
+extern long real_to_target_fmt PARAMS ((long *, const REAL_VALUE_TYPE *,
+ const struct real_format *));
+extern long real_to_target PARAMS ((long *, const REAL_VALUE_TYPE *,
+ enum machine_mode));
+
+extern void real_from_target_fmt PARAMS ((REAL_VALUE_TYPE *, const long *,
+ const struct real_format *));
+extern void real_from_target PARAMS ((REAL_VALUE_TYPE *, const long *,
+ enum machine_mode));
+
+extern void real_inf PARAMS ((REAL_VALUE_TYPE *));
+
+extern bool real_nan PARAMS ((REAL_VALUE_TYPE *, const char *,
+ int, enum machine_mode));
+
+extern void real_2expN PARAMS ((REAL_VALUE_TYPE *, int));
+
+extern unsigned int real_hash PARAMS ((const REAL_VALUE_TYPE *));
+
+
+/* Target formats defined in real.c. */
+extern const struct real_format ieee_single_format;
+extern const struct real_format ieee_double_format;
+extern const struct real_format ieee_extended_motorola_format;
+extern const struct real_format ieee_extended_intel_96_format;
+extern const struct real_format ieee_extended_intel_128_format;
+extern const struct real_format ibm_extended_format;
+extern const struct real_format ieee_quad_format;
+extern const struct real_format vax_f_format;
+extern const struct real_format vax_d_format;
+extern const struct real_format vax_g_format;
+extern const struct real_format i370_single_format;
+extern const struct real_format i370_double_format;
+extern const struct real_format c4x_single_format;
+extern const struct real_format c4x_extended_format;
+
+
+/* ====================================================================== */
+/* Crap. */
+
+#define REAL_ARITHMETIC(value, code, d1, d2) \
+ real_arithmetic (&(value), code, &(d1), &(d2))
+
+#define REAL_VALUES_IDENTICAL(x, y) real_identical (&(x), &(y))
+#define REAL_VALUES_EQUAL(x, y) real_compare (EQ_EXPR, &(x), &(y))
+#define REAL_VALUES_LESS(x, y) real_compare (LT_EXPR, &(x), &(y))
+
+/* Determine whether a floating-point value X is infinite. */
+#define REAL_VALUE_ISINF(x) real_isinf (&(x))
+
+/* Determine whether a floating-point value X is a NaN. */
+#define REAL_VALUE_ISNAN(x) real_isnan (&(x))
+
+/* Determine whether a floating-point value X is negative. */
+#define REAL_VALUE_NEGATIVE(x) real_isneg (&(x))
+
+/* Determine whether a floating-point value X is minus zero. */
+#define REAL_VALUE_MINUS_ZERO(x) real_isnegzero (&(x))
/* IN is a REAL_VALUE_TYPE. OUT is an array of longs. */
-#define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT) \
- (LONG_DOUBLE_TYPE_SIZE == 64 ? etardouble ((IN), (OUT)) \
- : LONG_DOUBLE_TYPE_SIZE == 96 ? etarldouble ((IN), (OUT)) \
- : LONG_DOUBLE_TYPE_SIZE == 128 ? etartdouble ((IN), (OUT)) \
- : abort ())
-#define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) (etardouble ((IN), (OUT)))
+#define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT) \
+ real_to_target (OUT, &(IN), \
+ mode_for_size (LONG_DOUBLE_TYPE_SIZE, MODE_FLOAT, 0))
+
+#define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) \
+ real_to_target (OUT, &(IN), mode_for_size (64, MODE_FLOAT, 0))
/* IN is a REAL_VALUE_TYPE. OUT is a long. */
-#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) ((OUT) = etarsingle ((IN)))
+#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
+ ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_FLOAT, 0)))
+
+#define REAL_VALUE_FROM_INT(r, lo, hi, mode) \
+ real_from_integer (&(r), mode, lo, hi, 0)
+
+#define REAL_VALUE_FROM_UNSIGNED_INT(r, lo, hi, mode) \
+ real_from_integer (&(r), mode, lo, hi, 1)
+
+extern REAL_VALUE_TYPE real_value_truncate PARAMS ((enum machine_mode,
+ REAL_VALUE_TYPE));
-/* Inverse of REAL_VALUE_TO_TARGET_DOUBLE. */
-#define REAL_VALUE_UNTO_TARGET_DOUBLE(d) (ereal_unto_double (d))
+#define REAL_VALUE_TO_INT(plow, phigh, r) \
+ real_to_integer2 (plow, phigh, &(r))
-/* Inverse of REAL_VALUE_TO_TARGET_SINGLE. */
-#define REAL_VALUE_UNTO_TARGET_SINGLE(f) (ereal_unto_float (f))
+extern REAL_VALUE_TYPE real_arithmetic2 PARAMS ((int, const REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *));
-/* d is an array of HOST_WIDE_INT that holds a double precision
- value in the target computer's floating point format. */
-#define REAL_VALUE_FROM_TARGET_DOUBLE(d) (ereal_from_double (d))
+#define REAL_VALUE_NEGATE(X) \
+ real_arithmetic2 (NEGATE_EXPR, &(X), NULL)
-/* f is a HOST_WIDE_INT containing a single precision target float value. */
-#define REAL_VALUE_FROM_TARGET_SINGLE(f) (ereal_from_float (f))
+#define REAL_VALUE_ABS(X) \
+ real_arithmetic2 (ABS_EXPR, &(X), NULL)
+
+extern int significand_size PARAMS ((enum machine_mode));
+
+extern REAL_VALUE_TYPE real_from_string2 PARAMS ((const char *,
+ enum machine_mode));
+
+#define REAL_VALUE_ATOF(s, m) \
+ real_from_string2 (s, m)
+
+#define CONST_DOUBLE_ATOF(s, m) \
+ CONST_DOUBLE_FROM_REAL_VALUE (real_from_string2 (s, m), m)
-/* Conversions to decimal ASCII string. */
-#define REAL_VALUE_TO_DECIMAL(r, fmt, s) (ereal_to_decimal (r, s))
+#define REAL_VALUE_FIX(r) \
+ real_to_integer (&(r))
+
+/* ??? Not quite right. */
+#define REAL_VALUE_UNSIGNED_FIX(r) \
+ real_to_integer (&(r))
+
+/* ??? These were added for Paranoia support. */
+
+/* Return floor log2(R). */
+extern int real_exponent PARAMS ((const REAL_VALUE_TYPE *));
+
+/* R = A * 2**EXP. */
+extern void real_ldexp PARAMS ((REAL_VALUE_TYPE *,
+ const REAL_VALUE_TYPE *, int));
/* **** End of software floating point emulator interface macros **** */
@@ -264,34 +324,23 @@ extern REAL_VALUE_TYPE dconst1;
extern REAL_VALUE_TYPE dconst2;
extern REAL_VALUE_TYPE dconstm1;
-/* Given a CONST_DOUBLE in FROM, store into TO the value it represents. */
/* Function to return a real value (not a tree node)
from a given integer constant. */
-union tree_node;
REAL_VALUE_TYPE real_value_from_int_cst PARAMS ((union tree_node *,
- union tree_node *));
+ union tree_node *));
-#define REAL_VALUE_FROM_CONST_DOUBLE(to, from) \
+/* Given a CONST_DOUBLE in FROM, store into TO the value it represents. */
+#define REAL_VALUE_FROM_CONST_DOUBLE(to, from) \
memcpy (&(to), &CONST_DOUBLE_LOW ((from)), sizeof (REAL_VALUE_TYPE))
/* Return a CONST_DOUBLE with value R and mode M. */
-
#define CONST_DOUBLE_FROM_REAL_VALUE(r, m) \
const_double_from_real_value (r, m)
extern rtx const_double_from_real_value PARAMS ((REAL_VALUE_TYPE,
enum machine_mode));
-/* Shorthand; can be handy in machine descriptions. */
-#define CONST_DOUBLE_ATOF(s, m) \
- CONST_DOUBLE_FROM_REAL_VALUE (REAL_VALUE_ATOF (s, m), m)
-
/* Replace R by 1/R in the given machine mode, if the result is exact. */
-extern int exact_real_inverse PARAMS ((enum machine_mode, REAL_VALUE_TYPE *));
-extern int target_isnan PARAMS ((REAL_VALUE_TYPE));
-extern int target_isinf PARAMS ((REAL_VALUE_TYPE));
-extern int target_negative PARAMS ((REAL_VALUE_TYPE));
-extern void debug_real PARAMS ((REAL_VALUE_TYPE));
-extern REAL_VALUE_TYPE ereal_atof PARAMS ((const char *, enum machine_mode));
+extern bool exact_real_inverse PARAMS ((enum machine_mode, REAL_VALUE_TYPE *));
/* In tree.c: wrap up a REAL_VALUE_TYPE in a tree node. */
extern tree build_real PARAMS ((tree, REAL_VALUE_TYPE));
diff --git a/gcc/recog.c b/gcc/recog.c
index a01abd5b799..6b6117fa5c5 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -191,7 +191,7 @@ static int num_changes = 0;
an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
the change in place.
- IN_GROUP is non-zero if this is part of a group of changes that must be
+ IN_GROUP is nonzero if this is part of a group of changes that must be
performed as a group. In that case, the changes will be stored. The
function `apply_change_group' will validate and apply the changes.
@@ -856,7 +856,7 @@ find_single_use_1 (dest, loc)
sequel. If so, return a pointer to the innermost rtx expression in which
it is used.
- If PLOC is non-zero, *PLOC is set to the insn containing the single use.
+ If PLOC is nonzero, *PLOC is set to the insn containing the single use.
This routine will return usually zero either before flow is called (because
there will be no LOG_LINKS notes) or after reload (because the REG_DEAD
@@ -2341,7 +2341,7 @@ preprocess_constraints ()
This is used in final, just before printing the assembler code and by
the routines that determine an insn's attribute.
- If STRICT is a positive non-zero value, it means that we have been
+ If STRICT is a positive nonzero value, it means that we have been
called after reload has been completed. In that case, we must
do all checks strictly. If it is zero, it means that we have been called
before reload has completed. In that case, we first try to see if we can
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index 6ed482c4277..eafc1e4df80 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -268,7 +268,7 @@ static rtx next_flags_user PARAMS ((rtx));
static void record_label_references PARAMS ((rtx, rtx));
static bool compensate_edge PARAMS ((edge, FILE *));
-/* Return non-zero if any stack register is mentioned somewhere within PAT. */
+/* Return nonzero if any stack register is mentioned somewhere within PAT. */
static int
stack_regs_mentioned_p (pat)
@@ -353,7 +353,7 @@ next_flags_user (insn)
return NULL_RTX;
}
-/* Reorganise the stack into ascending numbers,
+/* Reorganize the stack into ascending numbers,
after this insn. */
static void
@@ -564,7 +564,7 @@ get_true_reg (pat)
switch (GET_CODE (*pat))
{
case SUBREG:
- /* Eliminate FP subregister accesses in favour of the
+ /* Eliminate FP subregister accesses in favor of the
actual FP register in use. */
{
rtx subreg;
diff --git a/gcc/regclass.c b/gcc/regclass.c
index 4718d9e90f8..e229826d7fc 100644
--- a/gcc/regclass.c
+++ b/gcc/regclass.c
@@ -220,7 +220,7 @@ static int may_move_out_cost[MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES];
static int forbidden_inc_dec_class[N_REG_CLASSES];
-/* Indexed by n, is non-zero if (REG n) is used in an auto-inc or auto-dec
+/* Indexed by n, is nonzero if (REG n) is used in an auto-inc or auto-dec
context. */
static char *in_inc_dec;
@@ -254,7 +254,7 @@ struct reg_info_data {
struct reg_info_data *next; /* next set of reg_info structures */
size_t min_index; /* minimum index # */
size_t max_index; /* maximum index # */
- char used_p; /* non-zero if this has been used previously */
+ char used_p; /* nonzero if this has been used previously */
reg_info data[1]; /* beginning of the reg_info data */
};
@@ -1904,7 +1904,7 @@ record_reg_classes (n_alts, n_ops, ops, modes,
}
}
-/* Compute the cost of loading X into (if TO_P is non-zero) or from (if
+/* Compute the cost of loading X into (if TO_P is nonzero) or from (if
TO_P is zero) a register of class CLASS in mode MODE.
X must not be a pseudo. */
@@ -2189,10 +2189,10 @@ static unsigned int reg_n_max;
/* Allocate enough space to hold NUM_REGS registers for the tables used for
reg_scan and flow_analysis that are indexed by the register number. If
- NEW_P is non zero, initialize all of the registers, otherwise only
+ NEW_P is nonzero, initialize all of the registers, otherwise only
initialize the new registers allocated. The same table is kept from
function to function, only reallocating it when we need more room. If
- RENUMBER_P is non zero, allocate the reg_renumber array also. */
+ RENUMBER_P is nonzero, allocate the reg_renumber array also. */
void
allocate_reg_info (num_regs, new_p, renumber_p)
diff --git a/gcc/regmove.c b/gcc/regmove.c
index 1a1fffe0975..7853e041f89 100644
--- a/gcc/regmove.c
+++ b/gcc/regmove.c
@@ -80,7 +80,7 @@ static int regclass_compatible_p PARAMS ((int, int));
static int replacement_quality PARAMS ((rtx));
static int fixup_match_2 PARAMS ((rtx, rtx, rtx, rtx, FILE *));
-/* Return non-zero if registers with CLASS1 and CLASS2 can be merged without
+/* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
causing too much register allocation problems. */
static int
regclass_compatible_p (class0, class1)
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 8300c37e34e..16d4e2ac3d7 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1243,7 +1243,7 @@ copy_value (dest, src, vd)
return;
/* Do not propagate copies to the stack pointer, as that can leave
- memory accesses with no scheduling dependancy on the stack update. */
+ memory accesses with no scheduling dependency on the stack update. */
if (dr == STACK_POINTER_REGNUM)
return;
@@ -1330,7 +1330,7 @@ mode_change_ok (orig_mode, new_mode, regno)
static rtx
maybe_mode_change (orig_mode, copy_mode, new_mode, regno, copy_regno)
enum machine_mode orig_mode, copy_mode, new_mode;
- unsigned int regno, copy_regno;
+ unsigned int regno, copy_regno ATTRIBUTE_UNUSED;
{
if (orig_mode == new_mode)
return gen_rtx_raw_REG (new_mode, regno);
diff --git a/gcc/reload.c b/gcc/reload.c
index e195ea21a3b..a4cab784599 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -242,8 +242,9 @@ static int push_secondary_reload PARAMS ((int, rtx, int, int, enum reg_class,
#endif
static enum reg_class find_valid_class PARAMS ((enum machine_mode, int,
unsigned int));
-static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode));
+static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode, int));
static void push_replacement PARAMS ((rtx *, int, enum machine_mode));
+static void dup_replacements PARAMS ((rtx *, rtx *));
static void combine_reloads PARAMS ((void));
static int find_reusable_reload PARAMS ((rtx *, rtx, enum reg_class,
enum reload_type, int, int));
@@ -275,7 +276,7 @@ static int find_inc_amount PARAMS ((rtx, rtx));
#ifdef HAVE_SECONDARY_RELOADS
/* Determine if any secondary reloads are needed for loading (if IN_P is
- non-zero) or storing (if IN_P is zero) X to or from a reload register of
+ nonzero) or storing (if IN_P is zero) X to or from a reload register of
register class RELOAD_CLASS in mode RELOAD_MODE. If secondary reloads
are needed, push them.
@@ -367,7 +368,7 @@ push_secondary_reload (in_p, x, opnum, optional, reload_class, reload_mode,
if (icode != CODE_FOR_nothing)
{
- /* If IN_P is non-zero, the reload register will be the output in
+ /* If IN_P is nonzero, the reload register will be the output in
operand 0. If IN_P is zero, the reload register will be the input
in operand 1. Outputs should have an initial "=", which we must
skip. */
@@ -669,13 +670,13 @@ static enum reg_class
find_valid_class (m1, n, dest_regno)
enum machine_mode m1 ATTRIBUTE_UNUSED;
int n;
- unsigned int dest_regno;
+ unsigned int dest_regno ATTRIBUTE_UNUSED;
{
int best_cost = -1;
int class;
int regno;
enum reg_class best_class = NO_REGS;
- enum reg_class dest_class = REGNO_REG_CLASS (dest_regno);
+ enum reg_class dest_class ATTRIBUTE_UNUSED = REGNO_REG_CLASS (dest_regno);
unsigned int best_size = 0;
int cost;
@@ -794,9 +795,10 @@ find_reusable_reload (p_in, out, class, type, opnum, dont_share)
SUBREG_REG expression. */
static int
-reload_inner_reg_of_subreg (x, mode)
+reload_inner_reg_of_subreg (x, mode, output)
rtx x;
enum machine_mode mode;
+ int output;
{
rtx inner;
@@ -824,6 +826,7 @@ reload_inner_reg_of_subreg (x, mode)
word and the number of regs for INNER is not the same as the
number of words in INNER, then INNER will need reloading. */
return (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
+ && output
&& GET_MODE_SIZE (GET_MODE (inner)) > UNITS_PER_WORD
&& ((GET_MODE_SIZE (GET_MODE (inner)) / UNITS_PER_WORD)
!= (int) HARD_REGNO_NREGS (REGNO (inner), GET_MODE (inner))));
@@ -835,7 +838,7 @@ reload_inner_reg_of_subreg (x, mode)
(IN is zero for data not read, and OUT is zero for data not written.)
INLOC and OUTLOC point to the places in the instructions where
IN and OUT were found.
- If IN and OUT are both non-zero, it means the same register must be used
+ If IN and OUT are both nonzero, it means the same register must be used
to reload both IN and OUT.
CLASS is a register class required for the reloaded data.
@@ -1047,7 +1050,7 @@ push_reload (in, out, inloc, outloc, class,
/* Similar issue for (SUBREG constant ...) if it was not handled by the
code above. This can happen if SUBREG_BYTE != 0. */
- if (in != 0 && reload_inner_reg_of_subreg (in, inmode))
+ if (in != 0 && reload_inner_reg_of_subreg (in, inmode, 0))
{
enum reg_class in_class = class;
@@ -1144,7 +1147,7 @@ push_reload (in, out, inloc, outloc, class,
However, we must reload the inner reg *as well as* the subreg in
that case. In this case, the inner reg is an in-out reload. */
- if (out != 0 && reload_inner_reg_of_subreg (out, outmode))
+ if (out != 0 && reload_inner_reg_of_subreg (out, outmode, 1))
{
/* This relies on the fact that emit_reload_insns outputs the
instructions for output reloads of type RELOAD_OTHER in reverse
@@ -1284,9 +1287,9 @@ push_reload (in, out, inloc, outloc, class,
#ifdef SECONDARY_MEMORY_NEEDED
/* If a memory location is needed for the copy, make one. */
- if (in != 0 && GET_CODE (in) == REG
- && REGNO (in) < FIRST_PSEUDO_REGISTER
- && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (in)),
+ if (in != 0 && (GET_CODE (in) == REG || GET_CODE (in) == SUBREG)
+ && reg_or_subregno (in) < FIRST_PSEUDO_REGISTER
+ && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (reg_or_subregno (in)),
class, inmode))
get_secondary_mem (in, inmode, opnum, type);
#endif
@@ -1314,9 +1317,10 @@ push_reload (in, out, inloc, outloc, class,
n_reloads++;
#ifdef SECONDARY_MEMORY_NEEDED
- if (out != 0 && GET_CODE (out) == REG
- && REGNO (out) < FIRST_PSEUDO_REGISTER
- && SECONDARY_MEMORY_NEEDED (class, REGNO_REG_CLASS (REGNO (out)),
+ if (out != 0 && (GET_CODE (out) == REG || GET_CODE (out) == SUBREG)
+ && reg_or_subregno (out) < FIRST_PSEUDO_REGISTER
+ && SECONDARY_MEMORY_NEEDED (class,
+ REGNO_REG_CLASS (reg_or_subregno (out)),
outmode))
get_secondary_mem (out, outmode, opnum, type);
#endif
@@ -1563,6 +1567,25 @@ push_replacement (loc, reloadnum, mode)
r->mode = mode;
}
}
+
+/* Duplicate any replacement we have recorded to apply at
+ location ORIG_LOC to also be performed at DUP_LOC.
+ This is used in insn patterns that use match_dup. */
+
+static void
+dup_replacements (dup_loc, orig_loc)
+ rtx *dup_loc;
+ rtx *orig_loc;
+{
+ int i, n = n_replacements;
+
+ for (i = 0; i < n; i++)
+ {
+ struct replacement *r = &replacements[i];
+ if (r->where == orig_loc)
+ push_replacement (dup_loc, r->what, r->mode);
+ }
+}
/* Transfer all replacements that used to be in reload FROM to be in
reload TO. */
@@ -1581,7 +1604,7 @@ transfer_replacements (to, from)
/* IN_RTX is the value loaded by a reload that we now decided to inherit,
or a subpart of it. If we have any replacements registered for IN_RTX,
cancel the reloads that were supposed to load them.
- Return non-zero if we canceled any reloads. */
+ Return nonzero if we canceled any reloads. */
int
remove_address_replacements (in_rtx)
rtx in_rtx;
@@ -1712,7 +1735,8 @@ combine_reloads ()
&& ! (GET_CODE (rld[i].in) == REG
&& reg_overlap_mentioned_for_reload_p (rld[i].in,
rld[output_reload].out))))
- && ! reload_inner_reg_of_subreg (rld[i].in, rld[i].inmode)
+ && ! reload_inner_reg_of_subreg (rld[i].in, rld[i].inmode,
+ rld[i].when_needed != RELOAD_FOR_INPUT)
&& (reg_class_size[(int) rld[i].class]
|| SMALL_REGISTER_CLASSES)
/* We will allow making things slightly worse by combining an
@@ -1820,7 +1844,7 @@ combine_reloads ()
If FOR_REAL is -1, this should not be done, because this call
is just to see if a register can be found, not to find and install it.
- EARLYCLOBBER is non-zero if OUT is an earlyclobber operand. This
+ EARLYCLOBBER is nonzero if OUT is an earlyclobber operand. This
puts an additional constraint on being able to use IN for OUT since
IN must not appear elsewhere in the insn (it is assumed that IN itself
is safe from the earlyclobber). */
@@ -2644,7 +2668,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
else if (constraints[i][0] == 'p'
|| EXTRA_ADDRESS_CONSTRAINT (constraints[i][0]))
{
- find_reloads_address (VOIDmode, (rtx*) 0,
+ find_reloads_address (recog_data.operand_mode[i], (rtx*) 0,
recog_data.operand[i],
recog_data.operand_loc[i],
i, operand_type[i], ind_levels, insn);
@@ -3979,9 +4003,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
{
int opno = recog_data.dup_num[i];
*recog_data.dup_loc[i] = *recog_data.operand_loc[opno];
- if (operand_reloadnum[opno] >= 0)
- push_replacement (recog_data.dup_loc[i], operand_reloadnum[opno],
- insn_data[insn_code_number].operand[opno].mode);
+ dup_replacements (recog_data.dup_loc[i], recog_data.operand_loc[opno]);
}
#if 0
@@ -5621,7 +5643,7 @@ find_reloads_address_1 (mode, x, context, loc, opnum, type, ind_levels, insn)
needless copies if SUBREG_REG is multi-word. */
if (REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
{
- int regno = subreg_regno (x);
+ int regno ATTRIBUTE_UNUSED = subreg_regno (x);
if (! (context ? REGNO_OK_FOR_INDEX_P (regno)
: REGNO_MODE_OK_FOR_BASE_P (regno, mode)))
diff --git a/gcc/reload.h b/gcc/reload.h
index e832ed98ea4..04632245912 100644
--- a/gcc/reload.h
+++ b/gcc/reload.h
@@ -205,7 +205,7 @@ struct needs
must be examined for register elimination. */
struct insn_chain
{
- /* Links to the neighbour instructions. */
+ /* Links to the neighbor instructions. */
struct insn_chain *next, *prev;
/* Link through a chains set up by calculate_needs_all_insns, containing
@@ -270,7 +270,7 @@ extern void transfer_replacements PARAMS ((int, int));
/* IN_RTX is the value loaded by a reload that we now decided to inherit,
or a subpart of it. If we have any replacements registered for IN_RTX,
chancel the reloads that were supposed to load them.
- Return non-zero if we chanceled any reloads. */
+ Return nonzero if we chanceled any reloads. */
extern int remove_address_replacements PARAMS ((rtx in_rtx));
/* Like rtx_equal_p except that it allows a REG and a SUBREG to match
diff --git a/gcc/reload1.c b/gcc/reload1.c
index c00426cf420..d5aa69ca8fb 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -340,7 +340,7 @@ static const struct elim_table_1
#define NUM_ELIMINABLE_REGS ARRAY_SIZE (reg_eliminate_1)
/* Record the number of pending eliminations that have an offset not equal
- to their initial offset. If non-zero, we use a new copy of each
+ to their initial offset. If nonzero, we use a new copy of each
replacement result in any insns encountered. */
int num_not_at_initial_offset;
@@ -1180,9 +1180,9 @@ reload (first, global)
/* Make a pass over all the insns and delete all USEs which we inserted
only to tag a REG_EQUAL note on them. Remove all REG_DEAD and REG_UNUSED
- notes. Delete all CLOBBER insns that don't refer to the return value
- or to memory (mem:BLK CLOBBERs must be retained to prevent the scheduler
- from misarranging variable-array code) and simplify (subreg (reg))
+ notes. Delete all CLOBBER insns, except those that refer to the return
+ value and the special mem:BLK CLOBBERs added to prevent the scheduler
+ from misarranging variable-array code, and simplify (subreg (reg))
operands. Also remove all REG_RETVAL and REG_LIBCALL notes since they
are no longer useful or accurate. Strip and regenerate REG_INC notes
that may have been moved around. */
@@ -1203,7 +1203,10 @@ reload (first, global)
|| find_reg_note (insn, REG_EQUAL, NULL_RTX)))
|| (GET_CODE (PATTERN (insn)) == CLOBBER
&& (GET_CODE (XEXP (PATTERN (insn), 0)) != MEM
- || GET_MODE (XEXP (PATTERN (insn), 0)) != BLKmode)
+ || GET_MODE (XEXP (PATTERN (insn), 0)) != BLKmode
+ || (GET_CODE (XEXP (XEXP (PATTERN (insn), 0), 0)) != SCRATCH
+ && XEXP (XEXP (PATTERN (insn), 0), 0)
+ != stack_pointer_rtx))
&& (GET_CODE (XEXP (PATTERN (insn), 0)) != REG
|| ! REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))))
{
@@ -2115,7 +2118,7 @@ mark_home_live (regno)
INSN is the insn that it came from, if any.
- INITIAL_P is non-zero if we are to set the offset to be the initial
+ INITIAL_P is nonzero if we are to set the offset to be the initial
offset and zero if we are setting the offset of the label to be the
current offset. */
@@ -2270,7 +2273,7 @@ set_label_offsets (x, insn, initial_p)
to record the fact that a register is referenced outside a MEM.
If INSN is an insn, it is the insn containing X. If we replace a REG
- in a SET_DEST with an equivalent MEM and INSN is non-zero, write a
+ in a SET_DEST with an equivalent MEM and INSN is nonzero, write a
CLOBBER of the pseudo after INSN so find_equiv_regs will know that
the REG is being modified.
@@ -2926,7 +2929,7 @@ eliminate_regs_in_insn (insn, replace)
rtx old_set = single_set (insn);
rtx new_body;
int val = 0;
- int i, any_changes;
+ int i;
rtx substed_operand[MAX_RECOG_OPERANDS];
rtx orig_operand[MAX_RECOG_OPERANDS];
struct elim_table *ep;
@@ -3101,7 +3104,6 @@ eliminate_regs_in_insn (insn, replace)
/* Eliminate all eliminable registers occurring in operands that
can be handled by reload. */
extract_insn (insn);
- any_changes = 0;
for (i = 0; i < recog_data.n_operands; i++)
{
orig_operand[i] = recog_data.operand[i];
@@ -3127,7 +3129,7 @@ eliminate_regs_in_insn (insn, replace)
substed_operand[i] = eliminate_regs (recog_data.operand[i], 0,
replace ? insn : NULL_RTX);
if (substed_operand[i] != orig_operand[i])
- val = any_changes = 1;
+ val = 1;
/* Terminate the search in check_eliminable_occurrences at
this point. */
*recog_data.operand_loc[i] = 0;
@@ -3408,7 +3410,7 @@ set_offsets_for_label (insn)
}
/* See if anything that happened changes which eliminations are valid.
- For example, on the Sparc, whether or not the frame pointer can
+ For example, on the SPARC, whether or not the frame pointer can
be eliminated can depend on what registers have been used. We need
not check some conditions again (such as flag_omit_frame_pointer)
since they can't have changed. */
@@ -4749,7 +4751,7 @@ char reload_inherited[MAX_RELOADS];
if we know it. Otherwise, this is 0. */
rtx reload_inheritance_insn[MAX_RELOADS];
-/* If non-zero, this is a place to get the value of the reload,
+/* If nonzero, this is a place to get the value of the reload,
rather than using reload_in. */
rtx reload_override_in[MAX_RELOADS];
@@ -4990,7 +4992,7 @@ reload_reg_free_for_value_p (start_regno, regno, opnum, type, value, out,
determine how many hard regs to test.
Other read-only reloads with the same value do not conflict
- unless OUT is non-zero and these other reloads have to live while
+ unless OUT is nonzero and these other reloads have to live while
output reloads live.
If OUT is CONST0_RTX, this is a special case: it means that the
test should not be for using register REGNO as reload register, but
@@ -5113,7 +5115,7 @@ set_reload_reg (i, r)
}
/* Find a spill register to use as a reload register for reload R.
- LAST_RELOAD is non-zero if this is the last reload for the insn being
+ LAST_RELOAD is nonzero if this is the last reload for the insn being
processed.
Set rld[R].reg_rtx to the register allocated.
@@ -6006,7 +6008,7 @@ deallocate_reload_reg (r)
reload_spill_index[r] = -1;
}
-/* If SMALL_REGISTER_CLASSES is non-zero, we may not have merged two
+/* If SMALL_REGISTER_CLASSES is nonzero, we may not have merged two
reloads of the same item for fear that we might not have enough reload
registers. However, normally they will get the same reload register
and hence actually need not be loaded twice.
@@ -6116,10 +6118,24 @@ merge_assigned_reloads (insn)
|| rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS)
&& reg_overlap_mentioned_for_reload_p (rld[j].in,
rld[i].in))
- rld[j].when_needed
- = ((rld[j].when_needed == RELOAD_FOR_INPUT_ADDRESS
- || rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS)
- ? RELOAD_FOR_OTHER_ADDRESS : RELOAD_OTHER);
+ {
+ int k;
+
+ rld[j].when_needed
+ = ((rld[j].when_needed == RELOAD_FOR_INPUT_ADDRESS
+ || rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS)
+ ? RELOAD_FOR_OTHER_ADDRESS : RELOAD_OTHER);
+
+ /* Check to see if we accidentally converted two reloads
+ that use the same reload register to the same type.
+ If so, the resulting code won't work, so abort. */
+ if (rld[j].reg_rtx)
+ for (k = 0; k < j; k++)
+ if (rld[k].in != 0 && rld[k].reg_rtx != 0
+ && rld[k].when_needed == rld[j].when_needed
+ && rtx_equal_p (rld[k].reg_rtx, rld[j].reg_rtx))
+ abort ();
+ }
}
}
}
@@ -6855,7 +6871,6 @@ do_input_reload (chain, rl, j)
struct reload *rl;
int j;
{
- int expect_occurrences = 1;
rtx insn = chain->insn;
rtx old = (rl->in && GET_CODE (rl->in) == MEM
? rl->in_reg : rl->in);
@@ -6876,11 +6891,7 @@ do_input_reload (chain, rl, j)
&& GET_CODE (rl->in_reg) == MEM
&& reload_spill_index[j] >= 0
&& TEST_HARD_REG_BIT (reg_reloaded_valid, reload_spill_index[j]))
- {
- expect_occurrences
- = count_occurrences (PATTERN (insn), rl->in, 0) == 1 ? 0 : -1;
- rl->in = regno_reg_rtx[reg_reloaded_contents[reload_spill_index[j]]];
- }
+ rl->in = regno_reg_rtx[reg_reloaded_contents[reload_spill_index[j]]];
/* If we are reloading a register that was recently stored in with an
output-reload, see if we can prove there was
@@ -7529,10 +7540,12 @@ gen_reload (out, in, opnum, type)
#ifdef SECONDARY_MEMORY_NEEDED
/* If we need a memory location to do the move, do it that way. */
- else if (GET_CODE (in) == REG && REGNO (in) < FIRST_PSEUDO_REGISTER
- && GET_CODE (out) == REG && REGNO (out) < FIRST_PSEUDO_REGISTER
- && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (in)),
- REGNO_REG_CLASS (REGNO (out)),
+ else if ((GET_CODE (in) == REG || GET_CODE (in) == SUBREG)
+ && reg_or_subregno (in) < FIRST_PSEUDO_REGISTER
+ && (GET_CODE (out) == REG || GET_CODE (out) == SUBREG)
+ && reg_or_subregno (out) < FIRST_PSEUDO_REGISTER
+ && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (reg_or_subregno (in)),
+ REGNO_REG_CLASS (reg_or_subregno (out)),
GET_MODE (out)))
{
/* Get the memory to use and rewrite both registers to its mode. */
@@ -7919,7 +7932,7 @@ inc_for_reload (reloadreg, in, value, inc_amount)
rtx real_in = in == value ? XEXP (in, 0) : in;
/* No hard register is equivalent to this register after
- inc/dec operation. If REG_LAST_RELOAD_REG were non-zero,
+ inc/dec operation. If REG_LAST_RELOAD_REG were nonzero,
we could inc/dec that register as well (maybe even using it for
the source), but I'm not sure it's worth worrying about. */
if (GET_CODE (incloc) == REG)
@@ -9136,7 +9149,7 @@ reload_cse_move2add (first)
use (set (reg) (reg)) instead.
We don't delete this insn, nor do we convert it into a
note, to avoid losing register notes or the return
- value flag. jump2 already knowns how to get rid of
+ value flag. jump2 already knows how to get rid of
no-op moves. */
if (new_src == const0_rtx)
success = validate_change (insn, &SET_SRC (pat), reg, 0);
diff --git a/gcc/reorg.c b/gcc/reorg.c
index f62e3ca9df2..31918ec43e3 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -928,7 +928,7 @@ rare_destination (insn)
taken, return 1. If the branch is slightly less likely to be taken,
return 0 and if the branch is highly unlikely to be taken, return -1.
- CONDITION, if non-zero, is the condition that JUMP_INSN is testing. */
+ CONDITION, if nonzero, is the condition that JUMP_INSN is testing. */
static int
mostly_true_jump (jump_insn, condition)
@@ -1098,7 +1098,7 @@ get_branch_condition (insn, target)
return 0;
}
-/* Return non-zero if CONDITION is more strict than the condition of
+/* Return nonzero if CONDITION is more strict than the condition of
INSN, i.e., if INSN will always branch if CONDITION is true. */
static int
@@ -1126,7 +1126,7 @@ condition_dominates_p (condition, insn)
return comparison_dominates_p (code, other_code);
}
-/* Return non-zero if redirecting JUMP to NEWLABEL does not invalidate
+/* Return nonzero if redirecting JUMP to NEWLABEL does not invalidate
any insns already in the delay slot of JUMP. */
static int
@@ -1138,7 +1138,7 @@ redirect_with_delay_slots_safe_p (jump, newlabel, seq)
/* Make sure all the delay slots of this jump would still
be valid after threading the jump. If they are still
- valid, then return non-zero. */
+ valid, then return nonzero. */
flags = get_jump_flags (jump, newlabel);
for (i = 1; i < XVECLEN (pat, 0); i++)
@@ -1161,7 +1161,7 @@ redirect_with_delay_slots_safe_p (jump, newlabel, seq)
return (i == XVECLEN (pat, 0));
}
-/* Return non-zero if redirecting JUMP to NEWLABEL does not invalidate
+/* Return nonzero if redirecting JUMP to NEWLABEL does not invalidate
any insns we wish to place in the delay slot of JUMP. */
static int
@@ -1173,7 +1173,7 @@ redirect_with_delay_list_safe_p (jump, newlabel, delay_list)
/* Make sure all the insns in DELAY_LIST would still be
valid after threading the jump. If they are still
- valid, then return non-zero. */
+ valid, then return nonzero. */
flags = get_jump_flags (jump, newlabel);
for (li = delay_list, i = 0; li; li = XEXP (li, 1), i++)
@@ -1233,9 +1233,9 @@ check_annul_list_true_false (annul_true_p, delay_list)
insns in DELAY_LIST). It is updated with the number that have been
filled from the SEQUENCE, if any.
- PANNUL_P points to a non-zero value if we already know that we need
+ PANNUL_P points to a nonzero value if we already know that we need
to annul INSN. If this routine determines that annulling is needed,
- it may set that value non-zero.
+ it may set that value nonzero.
PNEW_THREAD points to a location that is to receive the place at which
execution should continue. */
@@ -1856,9 +1856,9 @@ redundant_insn (insn, target, delay_list)
return 0;
}
-/* Return 1 if THREAD can only be executed in one way. If LABEL is non-zero,
+/* Return 1 if THREAD can only be executed in one way. If LABEL is nonzero,
it is the target of the branch insn being scanned. If ALLOW_FALLTHROUGH
- is non-zero, we are allowed to fall into this thread; otherwise, we are
+ is nonzero, we are allowed to fall into this thread; otherwise, we are
not.
If LABEL is used more than one or we pass a label other than LABEL before
@@ -2040,7 +2040,7 @@ update_reg_unused_notes (insn, redundant_insn)
/* Scan a function looking for insns that need a delay slot and find insns to
put into the delay slot.
- NON_JUMPS_P is non-zero if we are to only try to fill non-jump insns (such
+ NON_JUMPS_P is nonzero if we are to only try to fill non-jump insns (such
as calls). We do these first since we don't want jump insns (that are
easier to fill) to get the only insns that could be used for non-jump insns.
When it is zero, only try to fill JUMP_INSNs.
@@ -2543,7 +2543,7 @@ fill_simple_delay_slots (non_jumps_p)
OPPOSITE_THREAD is the thread in the opposite direction. It is used
to see if any potential delay slot insns set things needed there.
- LIKELY is non-zero if it is extremely likely that the branch will be
+ LIKELY is nonzero if it is extremely likely that the branch will be
taken and THREAD_IF_TRUE is set. This is used for the branch at the
end of a loop back up to the top.
diff --git a/gcc/resource.c b/gcc/resource.c
index 3e60e43a4ec..a72dd9ce1a4 100644
--- a/gcc/resource.c
+++ b/gcc/resource.c
@@ -372,7 +372,7 @@ mark_referenced_resources (x, res, include_delayed_effects)
We assume that they both use and set all registers. Using all
registers ensures that a register will not be considered dead
just because it crosses a setjmp call. A register should be
- considered dead only if the setjmp call returns non-zero. */
+ considered dead only if the setjmp call returns nonzero. */
if (find_reg_note (x, REG_SETJMP, NULL))
SET_HARD_REG_SET (res->regs);
@@ -1178,7 +1178,7 @@ init_resource_info (epilogue_insn)
/* Indicate what resources are required to be valid at the end of the current
function. The condition code never is and memory always is. If the
frame pointer is needed, it is and so is the stack pointer unless
- EXIT_IGNORE_STACK is non-zero. If the frame pointer is not needed, the
+ EXIT_IGNORE_STACK is nonzero. If the frame pointer is not needed, the
stack pointer is. Registers used to return the function value are
needed. Registers holding global variables are needed. */
diff --git a/gcc/rtl.c b/gcc/rtl.c
index 7b6c0a1f9bd..065c02b40c3 100644
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -152,7 +152,7 @@ const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS] = {
/* MODE_CC */ CCmode,
/* MODE_COMPLEX_INT */ CQImode,
/* MODE_COMPLEX_FLOAT */ QCmode,
- /* MODE_VECTOR_INT */ V2QImode,
+ /* MODE_VECTOR_INT */ V1DImode,
/* MODE_VECTOR_FLOAT */ V2SFmode
};
@@ -186,6 +186,7 @@ const char * const rtx_format[NUM_RTX_CODE] = {
"u" a pointer to another insn
prints the uid of the insn.
"b" is a pointer to a bitmap header.
+ "B" is a basic block pointer.
"t" is a tree pointer. */
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
@@ -386,19 +387,12 @@ rtx
shallow_copy_rtx (orig)
rtx orig;
{
- int i;
RTX_CODE code = GET_CODE (orig);
- rtx copy = rtx_alloc (code);
-
- PUT_MODE (copy, GET_MODE (orig));
- RTX_FLAG (copy, in_struct) = RTX_FLAG (orig, in_struct);
- RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
- RTX_FLAG (copy, unchanging) = RTX_FLAG (orig, unchanging);
- RTX_FLAG (copy, integrated) = RTX_FLAG (orig, integrated);
- RTX_FLAG (copy, frame_related) = RTX_FLAG (orig, frame_related);
+ size_t n = GET_RTX_LENGTH (code);
+ rtx copy = ggc_alloc_rtx (n);
- for (i = 0; i < GET_RTX_LENGTH (code); i++)
- copy->fld[i] = orig->fld[i];
+ memcpy (copy, orig,
+ sizeof (struct rtx_def) + sizeof (rtunion) * (n - 1));
return copy;
}
diff --git a/gcc/rtl.def b/gcc/rtl.def
index 5608676f205..353a225dcd9 100644
--- a/gcc/rtl.def
+++ b/gcc/rtl.def
@@ -207,7 +207,7 @@ DEF_RTL_EXPR(DEFINE_PEEPHOLE, "define_peephole", "EsTV", 'x')
insns. This might, for example, create some RTX's and store them in
elements of `recog_data.operand' for use by the vector of
insn-patterns.
- (`operands' is an alias here for `recog_data.operand'). */
+ (`operands' is an alias here for `recog_data.operand'). */
DEF_RTL_EXPR(DEFINE_SPLIT, "define_split", "EsES", 'x')
/* Definition of an insn and associated split.
@@ -497,10 +497,10 @@ DEF_RTL_EXPR(DEFINE_INSN_RESERVATION, "define_insn_reservation", "sies", 'x')
/* Definition of an insn attribute.
1st operand: name of the attribute
2nd operand: comma-separated list of possible attribute values
- 3rd operand: expression for the default value of the attribute. */
+ 3rd operand: expression for the default value of the attribute. */
DEF_RTL_EXPR(DEFINE_ATTR, "define_attr", "sse", 'x')
-/* Marker for the name of an attribute. */
+/* Marker for the name of an attribute. */
DEF_RTL_EXPR(ATTR, "attr", "s", 'x')
/* For use in the last (optional) operand of DEFINE_INSN or DEFINE_PEEPHOLE and
@@ -864,7 +864,7 @@ DEF_RTL_EXPR(IF_THEN_ELSE, "if_then_else", "eee", '3')
/* General conditional. The first operand is a vector composed of pairs of
expressions. The first element of each pair is evaluated, in turn.
The value of the conditional is the second expression of the first pair
- whose first expression evaluates non-zero. If none of the expressions is
+ whose first expression evaluates nonzero. If none of the expressions is
true, the second operand will be used as the value of the conditional.
This should be replaced with use of IF_THEN_ELSE. */
@@ -964,7 +964,7 @@ DEF_RTL_EXPR(LTU, "ltu", "ee", '<')
DEF_RTL_EXPR(UNORDERED, "unordered", "ee", '<')
DEF_RTL_EXPR(ORDERED, "ordered", "ee", '<')
-/* These are equivalent to unordered or ... */
+/* These are equivalent to unordered or ... */
DEF_RTL_EXPR(UNEQ, "uneq", "ee", '<')
DEF_RTL_EXPR(UNGE, "unge", "ee", '<')
DEF_RTL_EXPR(UNGT, "ungt", "ee", '<')
@@ -1067,7 +1067,7 @@ DEF_RTL_EXPR(RANGE_INFO, "range_info", "uuEiiiiiibbii", 'x')
live length. Operand 7 is the number of calls that this register is live
across. Operand 8 is the symbol node of the variable if the register is a
user variable. Operand 9 is the block node that the variable is declared
- in if the register is a user variable. */
+ in if the register is a user variable. */
DEF_RTL_EXPR(RANGE_REG, "range_reg", "iiiiiiiitt", 'x')
/* Information about a local variable's ranges. Operand 0 is an EXPR_LIST of
@@ -1082,7 +1082,7 @@ DEF_RTL_EXPR(RANGE_LIVE, "range_live", "bi", 'x')
/* A unary `__builtin_constant_p' expression. These are only emitted
during RTL generation, and then only if optimize > 0. They are
- eliminated by the first CSE pass. */
+ eliminated by the first CSE pass. */
DEF_RTL_EXPR(CONSTANT_P_RTX, "constant_p_rtx", "e", 'x')
/* A placeholder for a CALL_INSN which may be turned into a normal call,
diff --git a/gcc/rtl.h b/gcc/rtl.h
index d493956dcf0..04283743bf5 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -62,6 +62,8 @@ extern const char * const rtx_format[NUM_RTX_CODE];
extern const char rtx_class[NUM_RTX_CODE];
#define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)])
+
+extern const unsigned char rtx_next[NUM_RTX_CODE];
/* The flags and bitfields of an ADDR_DIFF_VEC. BASE is the base label
relative to which the offsets are calculated, as explained in rtl.def. */
@@ -103,7 +105,7 @@ typedef struct mem_attrs GTY(())
/* Common union for an element of an rtx. */
-typedef union rtunion_def
+union rtunion_def
{
HOST_WIDE_INT rtwint;
int rtint;
@@ -118,11 +120,13 @@ typedef union rtunion_def
tree rttree;
struct basic_block_def *bb;
mem_attrs *rtmem;
-} rtunion;
+};
+typedef union rtunion_def rtunion;
/* RTL expression ("rtx"). */
-struct rtx_def
+struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"),
+ chain_prev ("RTX_PREV (&%h)")))
{
/* The kind of expression this is. */
ENUM_BITFIELD(rtx_code) code: 16;
@@ -198,11 +202,29 @@ struct rtx_def
/* The first element of the operands of this rtx.
The number of operands and their types are controlled
by the `code' field, according to rtl.def. */
- rtunion fld[1];
+ rtunion GTY ((special ("rtx_def"),
+ desc ("GET_CODE (&%0)"))) fld[1];
};
#define NULL_RTX (rtx) 0
+/* The "next" and "previous" RTX, relative to this one. */
+
+#define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL \
+ : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)]))
+
+/* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed.
+ */
+#define RTX_PREV(X) ((GET_CODE (X) == INSN \
+ || GET_CODE (X) == CALL_INSN \
+ || GET_CODE (X) == JUMP_INSN \
+ || GET_CODE (X) == NOTE \
+ || GET_CODE (X) == BARRIER \
+ || GET_CODE (X) == CODE_LABEL) \
+ && PREV_INSN (X) != NULL \
+ && NEXT_INSN (PREV_INSN (X)) == X \
+ ? PREV_INSN (X) : NULL)
+
/* Define macros to access the `code' field of the rtx. */
#define GET_CODE(RTX) ((enum rtx_code) (RTX)->code)
@@ -765,6 +787,7 @@ extern const char * const reg_note_name[];
#define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE)
#define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 4, NOTE)
#define NOTE_PREDICTION(INSN) XCINT (INSN, 4, NOTE)
+#define NOTE_PRECONDITIONED(INSN) XCINT (INSN, 4, NOTE)
/* In a NOTE that is a line number, this is the line number.
Other kinds of NOTEs are identified by negative numbers here. */
@@ -860,7 +883,7 @@ enum insn_note
NOTE_EXPECTED_VALUE; stored as (eq (reg) (const_int)). */
NOTE_INSN_EXPECTED_VALUE,
- /* Record a prediction. Uses NOTE_PREDICTION. */
+ /* Record a prediction. Uses NOTE_PREDICTION. */
NOTE_INSN_PREDICTION,
NOTE_INSN_MAX
@@ -988,14 +1011,13 @@ enum label_kind
#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
/* For a CONST_DOUBLE:
- The usual two ints that hold the value.
- For a DImode, that is all there are;
- and CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order.
- For a float, the number of ints varies,
- and CONST_DOUBLE_LOW is the one that should come first *in memory*.
- So use &CONST_DOUBLE_LOW(r) as the address of an array of ints. */
+ For a DImode, there are two integers CONST_DOUBLE_LOW is the
+ low-order word and ..._HIGH the high-order.
+ For a float, there is a REAL_VALUE_TYPE structure, and
+ CONST_DOUBLE_REAL_VALUE(r) is a pointer to it. */
#define CONST_DOUBLE_LOW(r) XCWINT (r, 0, CONST_DOUBLE)
#define CONST_DOUBLE_HIGH(r) XCWINT (r, 1, CONST_DOUBLE)
+#define CONST_DOUBLE_REAL_VALUE(r) ((struct real_value *)&CONST_DOUBLE_LOW(r))
/* For a CONST_VECTOR, return element #n. */
#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
@@ -1082,7 +1104,7 @@ do { \
#define MEM_SCALAR_P(RTX) \
(RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->frame_related)
-/* If VAL is non-zero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in
+/* If VAL is nonzero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in
RTX. Otherwise, vice versa. Use this macro only when you are
*sure* that you know that the MEM is in a structure, or is a
scalar. VAL is evaluated only once. */
@@ -1555,6 +1577,7 @@ extern rtx set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx));
#define single_set_1(I) single_set_2 (I, PATTERN (I))
extern int rtx_addr_can_trap_p PARAMS ((rtx));
+extern bool nonzero_address_p PARAMS ((rtx));
extern int rtx_unstable_p PARAMS ((rtx));
extern int rtx_varies_p PARAMS ((rtx, int));
extern int rtx_addr_varies_p PARAMS ((rtx, int));
@@ -1922,6 +1945,7 @@ extern int invert_jump_1 PARAMS ((rtx, rtx));
extern int invert_jump PARAMS ((rtx, rtx, int));
extern int rtx_renumbered_equal_p PARAMS ((rtx, rtx));
extern int true_regnum PARAMS ((rtx));
+extern unsigned int reg_or_subregno PARAMS ((rtx));
extern int redirect_jump_1 PARAMS ((rtx, rtx));
extern int redirect_jump PARAMS ((rtx, rtx, int));
extern void rebuild_jump_labels PARAMS ((rtx));
@@ -2111,7 +2135,7 @@ extern int function_invariant_p PARAMS ((rtx));
extern void init_branch_prob PARAMS ((const char *));
extern void branch_prob PARAMS ((void));
extern void end_branch_prob PARAMS ((void));
-extern void output_func_start_profiler PARAMS ((void));
+extern void create_profiler PARAMS ((void));
/* In reg-stack.c */
#ifdef BUFSIZ
@@ -2246,4 +2270,38 @@ extern void invert_br_probabilities PARAMS ((rtx));
extern bool expensive_function_p PARAMS ((int));
/* In tracer.c */
extern void tracer PARAMS ((void));
+
+/* In calls.c */
+
+/* Nonzero if this is a call to a `const' function. */
+#define ECF_CONST 1
+/* Nonzero if this is a call to a `volatile' function. */
+#define ECF_NORETURN 2
+/* Nonzero if this is a call to malloc or a related function. */
+#define ECF_MALLOC 4
+/* Nonzero if it is plausible that this is a call to alloca. */
+#define ECF_MAY_BE_ALLOCA 8
+/* Nonzero if this is a call to a function that won't throw an exception. */
+#define ECF_NOTHROW 16
+/* Nonzero if this is a call to setjmp or a related function. */
+#define ECF_RETURNS_TWICE 32
+/* Nonzero if this is a call to `longjmp'. */
+#define ECF_LONGJMP 64
+/* Nonzero if this is a syscall that makes a new process in the image of
+ the current one. */
+#define ECF_FORK_OR_EXEC 128
+#define ECF_SIBCALL 256
+/* Nonzero if this is a call to "pure" function (like const function,
+ but may read memory. */
+#define ECF_PURE 512
+/* Nonzero if this is a call to a function that returns with the stack
+ pointer depressed. */
+#define ECF_SP_DEPRESSED 1024
+/* Nonzero if this call is known to always return. */
+#define ECF_ALWAYS_RETURN 2048
+/* Create libcall block around the call. */
+#define ECF_LIBCALL_BLOCK 4096
+
+extern int flags_from_decl_or_type PARAMS ((tree));
+
#endif /* ! GCC_RTL_H */
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 6d391eaf374..f45f888517c 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -153,6 +153,10 @@ rtx_varies_p (x, for_alias)
case LABEL_REF:
return 0;
+ case ADDRESSOF:
+ /* This will resolve to some offset from the frame pointer. */
+ return 0;
+
case REG:
/* Note that we have to test for the actual rtx used for the frame
and arg pointers and not just the register number in case we have
@@ -225,6 +229,10 @@ rtx_addr_can_trap_p (x)
case LABEL_REF:
return 0;
+ case ADDRESSOF:
+ /* This will resolve to some offset from the frame pointer. */
+ return 0;
+
case REG:
/* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
@@ -269,6 +277,90 @@ rtx_addr_can_trap_p (x)
return 1;
}
+/* Return true if X is an address that is known to not be zero. */
+
+bool
+nonzero_address_p (x)
+ rtx x;
+{
+ enum rtx_code code = GET_CODE (x);
+
+ switch (code)
+ {
+ case SYMBOL_REF:
+ return !SYMBOL_REF_WEAK (x);
+
+ case LABEL_REF:
+ return true;
+
+ case ADDRESSOF:
+ /* This will resolve to some offset from the frame pointer. */
+ return true;
+
+ case REG:
+ /* As in rtx_varies_p, we have to use the actual rtx, not reg number. */
+ if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
+ || x == stack_pointer_rtx
+ || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
+ return true;
+ /* All of the virtual frame registers are stack references. */
+ if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
+ && REGNO (x) <= LAST_VIRTUAL_REGISTER)
+ return true;
+ return false;
+
+ case CONST:
+ return nonzero_address_p (XEXP (x, 0));
+
+ case PLUS:
+ if (GET_CODE (XEXP (x, 1)) == CONST_INT)
+ {
+ /* Pointers aren't allowed to wrap. If we've got a register
+ that is known to be a pointer, and a positive offset, then
+ the composite can't be zero. */
+ if (INTVAL (XEXP (x, 1)) > 0
+ && REG_P (XEXP (x, 0))
+ && REG_POINTER (XEXP (x, 0)))
+ return true;
+
+ return nonzero_address_p (XEXP (x, 0));
+ }
+ /* Handle PIC references. */
+ else if (XEXP (x, 0) == pic_offset_table_rtx
+ && CONSTANT_P (XEXP (x, 1)))
+ return true;
+ return false;
+
+ case PRE_MODIFY:
+ /* Similar to the above; allow positive offsets. Further, since
+ auto-inc is only allowed in memories, the register must be a
+ pointer. */
+ if (GET_CODE (XEXP (x, 1)) == CONST_INT
+ && INTVAL (XEXP (x, 1)) > 0)
+ return true;
+ return nonzero_address_p (XEXP (x, 0));
+
+ case PRE_INC:
+ /* Similarly. Further, the offset is always positive. */
+ return true;
+
+ case PRE_DEC:
+ case POST_DEC:
+ case POST_INC:
+ case POST_MODIFY:
+ return nonzero_address_p (XEXP (x, 0));
+
+ case LO_SUM:
+ return nonzero_address_p (XEXP (x, 1));
+
+ default:
+ break;
+ }
+
+ /* If it isn't one of the case above, might be zero. */
+ return false;
+}
+
/* Return 1 if X refers to a memory location whose address
cannot be compared reliably with constant addresses,
or if X refers to a BLKmode memory object.
@@ -353,7 +445,7 @@ get_related_value (x)
into the jump table. If the offset cannot be determined, then return
NULL_RTX.
- If EARLIEST is non-zero, it is a pointer to a place where the earliest
+ If EARLIEST is nonzero, it is a pointer to a place where the earliest
insn used in locating the offset was found. */
rtx
@@ -541,7 +633,7 @@ global_reg_mentioned_p_1 (loc, data)
return 0;
}
-/* Returns non-zero if X mentions a global register. */
+/* Returns nonzero if X mentions a global register. */
int
global_reg_mentioned_p (x)
@@ -874,13 +966,10 @@ int
reg_set_p (reg, insn)
rtx reg, insn;
{
- rtx body = insn;
-
/* We can be passed an insn or part of one. If we are passed an insn,
check if a side-effect of the insn clobbers REG. */
- if (INSN_P (insn))
- {
- if (FIND_REG_INC_NOTE (insn, reg)
+ if (INSN_P (insn)
+ && (FIND_REG_INC_NOTE (insn, reg)
|| (GET_CODE (insn) == CALL_INSN
/* We'd like to test call_used_regs here, but rtlanal.c can't
reference that variable due to its use in genattrtab. So
@@ -891,11 +980,8 @@ reg_set_p (reg, insn)
&& ((GET_CODE (reg) == REG
&& REGNO (reg) < FIRST_PSEUDO_REGISTER)
|| GET_CODE (reg) == MEM
- || find_reg_fusage (insn, CLOBBER, reg))))
- return 1;
-
- body = PATTERN (insn);
- }
+ || find_reg_fusage (insn, CLOBBER, reg)))))
+ return 1;
return set_of (reg, insn) != NULL_RTX;
}
@@ -1798,7 +1884,7 @@ dead_or_set_regno_p (insn, test_regno)
if (GET_CODE (pattern) == SET)
{
- rtx dest = SET_DEST (PATTERN (insn));
+ rtx dest = SET_DEST (pattern);
/* A value is totally replaced if it is the destination or the
destination is a SUBREG of REGNO that does not change the number of
@@ -2786,7 +2872,7 @@ computed_jump_p (insn)
sub-expression (including X itself). F is also passed the DATA.
If F returns -1, do not traverse sub-expressions, but continue
traversing the rest of the tree. If F ever returns any other
- non-zero value, stop the traversal, and return the value returned
+ nonzero value, stop the traversal, and return the value returned
by F. Otherwise, return 0. This function does not traverse inside
tree structure that contains RTX_EXPRs, or into sub-expressions
whose format code is `0' since it is not known whether or not those
@@ -3039,7 +3125,7 @@ insns_safe_to_move_p (from, to, new_to)
return 0;
}
-/* Return non-zero if IN contains a piece of rtl that has the address LOC */
+/* Return nonzero if IN contains a piece of rtl that has the address LOC */
int
loc_mentioned_in_p (loc, in)
rtx *loc, in;
diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c
index 170d87df839..74aa7cd1b4e 100644
--- a/gcc/sbitmap.c
+++ b/gcc/sbitmap.c
@@ -241,7 +241,7 @@ sbitmap_difference (dst, a, b)
}
/* Set DST to be (A and B).
- Return non-zero if any change is made. */
+ Return nonzero if any change is made. */
bool
sbitmap_a_and_b_cg (dst, a, b)
@@ -277,7 +277,7 @@ sbitmap_a_and_b (dst, a, b)
}
/* Set DST to be (A xor B)).
- Return non-zero if any change is made. */
+ Return nonzero if any change is made. */
bool
sbitmap_a_xor_b_cg (dst, a, b)
@@ -313,7 +313,7 @@ sbitmap_a_xor_b (dst, a, b)
}
/* Set DST to be (A or B)).
- Return non-zero if any change is made. */
+ Return nonzero if any change is made. */
bool
sbitmap_a_or_b_cg (dst, a, b)
@@ -348,7 +348,7 @@ sbitmap_a_or_b (dst, a, b)
*dstp++ = *ap++ | *bp++;
}
-/* Return non-zero if A is a subset of B. */
+/* Return nonzero if A is a subset of B. */
bool
sbitmap_a_subset_b_p (a, b)
@@ -365,7 +365,7 @@ sbitmap_a_subset_b_p (a, b)
}
/* Set DST to be (A or (B and C)).
- Return non-zero if any change is made. */
+ Return nonzero if any change is made. */
bool
sbitmap_a_or_b_and_c_cg (dst, a, b, c)
@@ -403,7 +403,7 @@ sbitmap_a_or_b_and_c (dst, a, b, c)
}
/* Set DST to be (A and (B or C)).
- Return non-zero if any change is made. */
+ Return nonzero if any change is made. */
bool
sbitmap_a_and_b_or_c_cg (dst, a, b, c)
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index a5e9c08b5bf..cf762cccb58 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -922,7 +922,15 @@ sched_analyze_insn (deps, x, insn, loop_notes)
code = GET_CODE (x);
}
if (code == SET || code == CLOBBER)
- sched_analyze_1 (deps, x, insn);
+ {
+ sched_analyze_1 (deps, x, insn);
+
+ /* Bare clobber insns are used for letting life analysis, reg-stack
+ and others know that a value is dead. Depend on the last call
+ instruction so that reg-stack won't get confused. */
+ if (code == CLOBBER)
+ add_dependence_list (insn, deps->last_function_call, REG_DEP_OUTPUT);
+ }
else if (code == PARALLEL)
{
int i;
@@ -1117,8 +1125,6 @@ sched_analyze_insn (deps, x, insn, loop_notes)
EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i,
{
struct deps_reg *reg_last = &deps->reg_last[i];
- add_dependence_list (insn, reg_last->sets, REG_DEP_OUTPUT);
- add_dependence_list (insn, reg_last->uses, REG_DEP_ANTI);
if (reg_last->uses_length > MAX_PENDING_LIST_LENGTH
|| reg_last->clobbers_length > MAX_PENDING_LIST_LENGTH)
{
@@ -1128,6 +1134,7 @@ sched_analyze_insn (deps, x, insn, loop_notes)
REG_DEP_ANTI);
add_dependence_list_and_free (insn, &reg_last->clobbers,
REG_DEP_OUTPUT);
+ reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
reg_last->clobbers_length = 0;
reg_last->uses_length = 0;
}
diff --git a/gcc/sched-int.h b/gcc/sched-int.h
index 9ec916ea48e..1b196562b18 100644
--- a/gcc/sched-int.h
+++ b/gcc/sched-int.h
@@ -109,7 +109,7 @@ struct deps
int clobbers_length;
} *reg_last;
- /* Element N is set for each register that has any non-zero element
+ /* Element N is set for each register that has any nonzero element
in reg_last[N].{uses,sets,clobbers}. */
regset_head reg_last_in_use;
};
diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c
index f9b762ee932..fee7028485c 100644
--- a/gcc/sched-rgn.c
+++ b/gcc/sched-rgn.c
@@ -173,7 +173,6 @@ typedef struct
bitlst;
static int bitlst_table_last;
-static int bitlst_table_size;
static int *bitlst_table;
static void extract_bitlst PARAMS ((sbitmap, bitlst *));
@@ -2013,7 +2012,6 @@ init_ready_list (ready)
bblst_table = (int *) xmalloc (bblst_size * sizeof (int));
bitlst_table_last = 0;
- bitlst_table_size = rgn_nr_edges;
bitlst_table = (int *) xmalloc (rgn_nr_edges * sizeof (int));
compute_trg_info (target_bb);
@@ -3001,7 +2999,7 @@ schedule_insns (dump_file)
first so that we can verify that live_at_start didn't change. Then
do all other blocks. */
/* ??? There is an outside possibility that update_life_info, or more
- to the point propagate_block, could get called with non-zero flags
+ to the point propagate_block, could get called with nonzero flags
more than once for one basic block. This would be kinda bad if it
were to happen, since REG_INFO would be accumulated twice for the
block, and we'd have twice the REG_DEAD notes.
diff --git a/gcc/sched-vis.c b/gcc/sched-vis.c
index e44c28a08cc..237d4460d51 100644
--- a/gcc/sched-vis.c
+++ b/gcc/sched-vis.c
@@ -562,12 +562,7 @@ print_value (buf, x, verbose)
break;
case CONST_DOUBLE:
if (FLOAT_MODE_P (GET_MODE (x)))
- {
- REAL_VALUE_TYPE r;
-
- REAL_VALUE_FROM_CONST_DOUBLE (r, x);
- REAL_VALUE_TO_DECIMAL(r, "%.6e", t);
- }
+ real_to_decimal (t, CONST_DOUBLE_REAL_VALUE (x), sizeof (t), 0, 1);
else
sprintf (t, "<0x%lx,0x%lx>", (long) XWINT (x, 2), (long) XWINT (x, 3));
cur = safe_concat (buf, cur, t);
diff --git a/gcc/sdbout.c b/gcc/sdbout.c
index 9effe785110..47dc1288a6c 100644
--- a/gcc/sdbout.c
+++ b/gcc/sdbout.c
@@ -61,6 +61,7 @@ static GTY(()) tree anonymous_types;
#include "tm_p.h"
#include "gsyms.h"
#include "langhooks.h"
+#include "target.h"
/* 1 if PARM is passed to this function in memory. */
@@ -924,23 +925,6 @@ sdbout_symbol (decl, local)
PUT_SDB_INT_VAL (DEBUGGER_AUTO_OFFSET (XEXP (value, 0)));
PUT_SDB_SCL (C_AUTO);
}
- else if (GET_CODE (value) == MEM && GET_CODE (XEXP (value, 0)) == CONST)
- {
- /* Handle an obscure case which can arise when optimizing and
- when there are few available registers. (This is *always*
- the case for i386/i486 targets). The DECL_RTL looks like
- (MEM (CONST ...)) even though this variable is a local `auto'
- or a local `register' variable. In effect, what has happened
- is that the reload pass has seen that all assignments and
- references for one such a local variable can be replaced by
- equivalent assignments and references to some static storage
- variable, thereby avoiding the need for a register. In such
- cases we're forced to lie to debuggers and tell them that
- this variable was itself `static'. */
- PUT_SDB_DEF (name);
- PUT_SDB_VAL (XEXP (XEXP (value, 0), 0));
- PUT_SDB_SCL (C_STAT);
- }
else
{
/* It is something we don't know how to represent for SDB. */
diff --git a/gcc/sibcall.c b/gcc/sibcall.c
index d13f3a9064a..90863b7142b 100644
--- a/gcc/sibcall.c
+++ b/gcc/sibcall.c
@@ -54,7 +54,7 @@ static rtx skip_unreturned_value PARAMS ((rtx));
/* Examine a CALL_PLACEHOLDER pattern and determine where the call's
return value is located. P_HARD_RETURN receives the hard register
that the function used; P_SOFT_RETURN receives the pseudo register
- that the sequence used. Return non-zero if the values were located. */
+ that the sequence used. Return nonzero if the values were located. */
static int
identify_call_return_value (cp, p_hard_return, p_soft_return)
@@ -574,8 +574,8 @@ optimize_sibling_and_tail_recursive_calls ()
rtx insn, insns;
basic_block alternate_exit = EXIT_BLOCK_PTR;
bool no_sibcalls_this_function = false;
- int successful_sibling_call = 0;
- int replaced_call_placeholder = 0;
+ bool successful_replacement = false;
+ bool replaced_call_placeholder = false;
edge e;
insns = get_insns ();
@@ -704,10 +704,11 @@ optimize_sibling_and_tail_recursive_calls ()
/* Select a set of insns to implement the call and emit them.
Tail recursion is the most efficient, so select it over
a tail/sibling call. */
- if (sibcall)
- successful_sibling_call = 1;
- replaced_call_placeholder = 1;
+ if (sibcall || tailrecursion)
+ successful_replacement = true;
+ replaced_call_placeholder = true;
+
replace_call_placeholder (insn,
tailrecursion != 0
? sibcall_use_tail_recursion
@@ -717,7 +718,7 @@ optimize_sibling_and_tail_recursive_calls ()
}
}
- if (successful_sibling_call)
+ if (successful_replacement)
{
rtx insn;
tree arg;
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 14e8840d447..558d79656bc 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -22,8 +22,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
#include "system.h"
-
#include "rtl.h"
+#include "tree.h"
#include "tm_p.h"
#include "regs.h"
#include "hard-reg-set.h"
@@ -39,41 +39,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Simplification and canonicalization of RTL. */
-/* Nonzero if X has the form (PLUS frame-pointer integer). We check for
- virtual regs here because the simplify_*_operation routines are called
- by integrate.c, which is called before virtual register instantiation.
-
- ?!? NONZERO_BASE_PLUS_P needs to move into
- a header file so that their definitions can be shared with the
- simplification routines in simplify-rtx.c. Until then, do not
- change this macro without also changing the copy in simplify-rtx.c. */
-
-/* Allows reference to the stack pointer.
-
- This used to include FIXED_BASE_PLUS_P, however, we can't assume that
- arg_pointer_rtx by itself is nonzero, because on at least one machine,
- the i960, the arg pointer is zero when it is unused. */
-
-#define NONZERO_BASE_PLUS_P(X) \
- ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
- || (X) == virtual_stack_vars_rtx \
- || (X) == virtual_incoming_args_rtx \
- || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
- && (XEXP (X, 0) == frame_pointer_rtx \
- || XEXP (X, 0) == hard_frame_pointer_rtx \
- || ((X) == arg_pointer_rtx \
- && fixed_regs[ARG_POINTER_REGNUM]) \
- || XEXP (X, 0) == virtual_stack_vars_rtx \
- || XEXP (X, 0) == virtual_incoming_args_rtx)) \
- || (X) == stack_pointer_rtx \
- || (X) == virtual_stack_dynamic_rtx \
- || (X) == virtual_outgoing_args_rtx \
- || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
- && (XEXP (X, 0) == stack_pointer_rtx \
- || XEXP (X, 0) == virtual_stack_dynamic_rtx \
- || XEXP (X, 0) == virtual_outgoing_args_rtx)) \
- || GET_CODE (X) == ADDRESSOF)
-
/* Much code operates on (low, high) pairs; the low value is an
unsigned wide int, the high value a signed wide int. We
occasionally need to sign extend from low to high as if low were a
@@ -146,6 +111,9 @@ avoid_constant_pool_reference (x)
return x;
addr = XEXP (x, 0);
+ if (GET_CODE (addr) == LO_SUM)
+ addr = XEXP (addr, 1);
+
if (GET_CODE (addr) != SYMBOL_REF
|| ! CONSTANT_POOL_ADDRESS_P (addr))
return x;
@@ -340,9 +308,22 @@ simplify_replace_rtx (x, old, new)
return replace_equiv_address_nv (x,
simplify_replace_rtx (XEXP (x, 0),
old, new));
+ else if (code == LO_SUM)
+ {
+ rtx op0 = simplify_replace_rtx (XEXP (x, 0), old, new);
+ rtx op1 = simplify_replace_rtx (XEXP (x, 1), old, new);
- if (REG_P (x) && REG_P (old) && REGNO (x) == REGNO (old))
- return new;
+ /* (lo_sum (high x) x) -> x */
+ if (GET_CODE (op0) == HIGH && rtx_equal_p (XEXP (op0, 0), op1))
+ return op1;
+
+ return gen_rtx_LO_SUM (mode, op0, op1);
+ }
+ else if (code == REG)
+ {
+ if (REG_P (old) && REGNO (x) == REGNO (old))
+ return new;
+ }
return x;
@@ -599,12 +580,22 @@ simplify_unary_operation (code, mode, op, op_mode)
/* We don't attempt to optimize this. */
return 0;
- case ABS: d = REAL_VALUE_ABS (d); break;
- case NEG: d = REAL_VALUE_NEGATE (d); break;
- case FLOAT_TRUNCATE: d = real_value_truncate (mode, d); break;
- case FLOAT_EXTEND: /* All this does is change the mode. */ break;
- case FIX: d = REAL_VALUE_RNDZINT (d); break;
- case UNSIGNED_FIX: d = REAL_VALUE_UNSIGNED_RNDZINT (d); break;
+ case ABS:
+ d = REAL_VALUE_ABS (d);
+ break;
+ case NEG:
+ d = REAL_VALUE_NEGATE (d);
+ break;
+ case FLOAT_TRUNCATE:
+ d = real_value_truncate (mode, d);
+ break;
+ case FLOAT_EXTEND:
+ /* All this does is change the mode. */
+ break;
+ case FIX:
+ real_arithmetic (&d, FIX_TRUNC_EXPR, &d, NULL);
+ break;
+
default:
abort ();
}
@@ -893,7 +884,7 @@ simplify_binary_operation (code, mode, op0, op1)
{
case PLUS:
/* Maybe simplify x + 0 to x. The two expressions are equivalent
- when x is NaN, infinite, or finite and non-zero. They aren't
+ when x is NaN, infinite, or finite and nonzero. They aren't
when x is -0 and the rounding mode is not towards -infinity,
since (-0) + 0 is then 0. */
if (!HONOR_SIGNED_ZEROS (mode) && trueop1 == CONST0_RTX (mode))
@@ -1041,7 +1032,7 @@ simplify_binary_operation (code, mode, op0, op1)
return CONST0_RTX (mode);
/* Change subtraction from zero into negation. (0 - x) is the
- same as -x when x is NaN, infinite, or finite and non-zero.
+ same as -x when x is NaN, infinite, or finite and nonzero.
But if the mode has signed zeros, and does not round towards
-infinity, then 0 - 0 is 0, not -0. */
if (!HONOR_SIGNED_ZEROS (mode) && trueop0 == CONST0_RTX (mode))
@@ -1318,6 +1309,7 @@ simplify_binary_operation (code, mode, op0, op1)
case ROTATERT:
case ROTATE:
+ case ASHIFTRT:
/* Rotating ~0 always results in ~0. */
if (GET_CODE (trueop0) == CONST_INT && width <= HOST_BITS_PER_WIDE_INT
&& (unsigned HOST_WIDE_INT) INTVAL (trueop0) == GET_MODE_MASK (mode)
@@ -1327,7 +1319,6 @@ simplify_binary_operation (code, mode, op0, op1)
/* ... fall through ... */
case ASHIFT:
- case ASHIFTRT:
case LSHIFTRT:
if (trueop1 == const0_rtx)
return op0;
@@ -2012,25 +2003,12 @@ simplify_relational_operation (code, mode, op0, op1)
switch (code)
{
case EQ:
- /* References to the frame plus a constant or labels cannot
- be zero, but a SYMBOL_REF can due to #pragma weak. */
- if (((NONZERO_BASE_PLUS_P (op0) && trueop1 == const0_rtx)
- || GET_CODE (trueop0) == LABEL_REF)
-#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
- /* On some machines, the ap reg can be 0 sometimes. */
- && op0 != arg_pointer_rtx
-#endif
- )
+ if (trueop1 == const0_rtx && nonzero_address_p (op0))
return const0_rtx;
break;
case NE:
- if (((NONZERO_BASE_PLUS_P (op0) && trueop1 == const0_rtx)
- || GET_CODE (trueop0) == LABEL_REF)
-#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
- && op0 != arg_pointer_rtx
-#endif
- )
+ if (trueop1 == const0_rtx && nonzero_address_p (op0))
return const_true_rtx;
break;
@@ -2582,7 +2560,7 @@ simplify_subreg (outermode, op, innermode, byte)
/* ??? We do allow it if the current REG is not valid for
its mode. This is a kludge to work around how float/complex
- arguments are passed on 32-bit Sparc and should be fixed. */
+ arguments are passed on 32-bit SPARC and should be fixed. */
if (HARD_REGNO_MODE_OK (final_regno, outermode)
|| ! HARD_REGNO_MODE_OK (REGNO (op), innermode))
{
diff --git a/gcc/ssa.c b/gcc/ssa.c
index 71be1a9d957..b5c4992148e 100644
--- a/gcc/ssa.c
+++ b/gcc/ssa.c
@@ -78,7 +78,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
the same hard register in the same machine mode are in the same
class. */
-/* If conservative_reg_partition is non-zero, use a conservative
+/* If conservative_reg_partition is nonzero, use a conservative
register partitioning algorithm (which leaves more regs after
emerging from SSA) instead of the coalescing one. This is being
left in for a limited time only, as a debugging tool until the
@@ -420,7 +420,7 @@ phi_alternative (set, c)
}
/* Given the SET of a phi node, remove the alternative for predecessor
- block C. Return non-zero on success, or zero if no alternative is
+ block C. Return nonzero on success, or zero if no alternative is
found for C. */
int
@@ -704,7 +704,7 @@ insert_phi_nodes (idfs, evals, nregs)
/* Rename the registers to conform to SSA.
This is essentially the algorithm presented in Figure 7.8 of Morgan,
- with a few changes to reduce pattern search time in favour of a bit
+ with a few changes to reduce pattern search time in favor of a bit
more memory usage. */
/* One of these is created for each set. It will live in a list local
@@ -924,20 +924,17 @@ rename_insn_1 (ptr, data)
{
rtx new_reg = ssa_rename_to_lookup (x);
- if (new_reg != RENAME_NO_RTX)
+ if (new_reg != RENAME_NO_RTX && new_reg != NULL_RTX)
{
- if (new_reg != NULL_RTX)
- {
- if (GET_MODE (x) != GET_MODE (new_reg))
- abort ();
- *ptr = new_reg;
- }
- else
- {
- /* Undefined value used, rename it to a new pseudo register so
- that it cannot conflict with an existing register */
- *ptr = gen_reg_rtx (GET_MODE(x));
- }
+ if (GET_MODE (x) != GET_MODE (new_reg))
+ abort ();
+ *ptr = new_reg;
+ }
+ else
+ {
+ /* Undefined value used, rename it to a new pseudo register so
+ that it cannot conflict with an existing register. */
+ *ptr = gen_reg_rtx (GET_MODE (x));
}
}
return -1;
@@ -1499,7 +1496,7 @@ out:
and C is the ith predecessor of B,
then T0 and Ti must be equivalent.
- Return non-zero iff any such cases were found for which the two
+ Return nonzero iff any such cases were found for which the two
regs were not already in the same class. */
static int
@@ -2255,7 +2252,7 @@ convert_from_ssa ()
destination, the regno of the phi argument corresponding to BB,
and DATA.
- If FN ever returns non-zero, stops immediately and returns this
+ If FN ever returns nonzero, stops immediately and returns this
value. Otherwise, returns zero. */
int
diff --git a/gcc/stab.def b/gcc/stab.def
index 81d442a47c4..7a0b84960b1 100644
--- a/gcc/stab.def
+++ b/gcc/stab.def
@@ -47,10 +47,10 @@ __define_stab (N_MAIN, 0x2a, "MAIN")
Supposedly the value is its line number; I'm skeptical. */
__define_stab (N_PC, 0x30, "PC")
-/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */
+/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */
__define_stab (N_NSYMS, 0x32, "NSYMS")
-/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */
+/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */
__define_stab (N_NOMAP, 0x34, "NOMAP")
/* New stab from Solaris. I don't know what it means, but it
@@ -84,13 +84,13 @@ __define_stab (N_BSLINE, 0x48, "BSLINE")
__define_stab (N_BROWS, 0x48, "BROWS")
/* GNU Modula-2 definition module dependency. Value is the modification time
- of the definition file. Other is non-zero if it is imported with the
+ of the definition file. Other is nonzero if it is imported with the
GNU M2 keyword %INITIALIZE. Perhaps N_M2C can be used if there
are enough empty fields? */
__define_stab(N_DEFD, 0x4a, "DEFD")
/* THE FOLLOWING TWO STAB VALUES CONFLICT. Happily, one is for Modula-2
- and one is for C++. Still,... */
+ and one is for C++. Still,... */
/* GNU C++ exception variable. Name is variable name. */
__define_stab (N_EHDECL, 0x50, "EHDECL")
/* Modula2 info "for imc": name,,0,0,0 according to Ultrix V4.0. */
@@ -168,7 +168,7 @@ __define_stab (N_ECOML, 0xe8, "ECOML")
/* These STAB's are used on Gould systems for Non-Base register symbols
or something like that. FIXME. I have assigned the values at random
- since I don't have a Gould here. Fixups from Gould folk welcome... */
+ since I don't have a Gould here. Fixups from Gould folk welcome... */
__define_stab (N_NBTEXT, 0xF0, "NBTEXT")
__define_stab (N_NBDATA, 0xF2, "NBDATA")
__define_stab (N_NBBSS, 0xF4, "NBBSS")
diff --git a/gcc/stmt.c b/gcc/stmt.c
index b2e2cad28c2..382329f3f4c 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -166,9 +166,6 @@ struct nesting GTY(())
rtx start_label;
/* Label at the end of the whole construct. */
rtx end_label;
- /* Label before a jump that branches to the end of the whole
- construct. This is where destructors go if any. */
- rtx alt_end_label;
/* Label for `continue' statement to jump to;
this is in front of the stepper of the loop. */
rtx continue_label;
@@ -391,13 +388,14 @@ struct stmt_status GTY(())
#define emit_lineno (cfun->stmt->x_emit_lineno)
#define goto_fixup_chain (cfun->stmt->x_goto_fixup_chain)
-/* Non-zero if we are using EH to handle cleanus. */
+/* Non-zero if we are using EH to handle cleanups. */
static int using_eh_for_cleanups_p = 0;
static int n_occurrences PARAMS ((int, const char *));
static bool parse_input_constraint PARAMS ((const char **, int, int, int,
int, const char * const *,
bool *, bool *));
+static bool decl_conflicts_with_clobbers_p PARAMS ((tree, const HARD_REG_SET));
static void expand_goto_internal PARAMS ((tree, rtx, rtx));
static int expand_fixup PARAMS ((tree, rtx, rtx));
static rtx expand_nl_handler_label PARAMS ((rtx, rtx));
@@ -458,14 +456,6 @@ init_stmt_for_function ()
clear_last_expr ();
}
-/* Return nonzero if anything is pushed on the loop, condition, or case
- stack. */
-int
-in_control_zone_p ()
-{
- return cond_stack || loop_stack || case_stack;
-}
-
/* Record the current file and line. Called from emit_line_note. */
void
set_file_and_line_for_stmt (file, line)
@@ -1400,6 +1390,43 @@ parse_input_constraint (constraint_p, input_num, ninputs, noutputs, ninout,
return true;
}
+/* Check for overlap between registers marked in CLOBBERED_REGS and
+ anything inappropriate in DECL. Emit error and return TRUE for error,
+ FALSE for ok. */
+
+static bool
+decl_conflicts_with_clobbers_p (decl, clobbered_regs)
+ tree decl;
+ const HARD_REG_SET clobbered_regs;
+{
+ /* Conflicts between asm-declared register variables and the clobber
+ list are not allowed. */
+ if ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
+ && DECL_REGISTER (decl)
+ && REG_P (DECL_RTL (decl))
+ && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
+ {
+ rtx reg = DECL_RTL (decl);
+ unsigned int regno;
+
+ for (regno = REGNO (reg);
+ regno < (REGNO (reg)
+ + HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)));
+ regno++)
+ if (TEST_HARD_REG_BIT (clobbered_regs, regno))
+ {
+ error ("asm-specifier for variable `%s' conflicts with asm clobber list",
+ IDENTIFIER_POINTER (DECL_NAME (decl)));
+
+ /* Reset registerness to stop multiple errors emitted for a
+ single variable. */
+ DECL_REGISTER (decl) = 0;
+ return true;
+ }
+ }
+ return false;
+}
+
/* Generate RTL for an asm statement with arguments.
STRING is the instruction template.
OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
@@ -1430,6 +1457,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
int noutputs = list_length (outputs);
int ninout;
int nclobbers;
+ HARD_REG_SET clobbered_regs;
+ int clobber_conflict_found = 0;
tree tail;
int i;
/* Vector of RTX's of evaluated output operands. */
@@ -1440,8 +1469,6 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
= (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode));
const char **constraints
= (const char **) alloca ((noutputs + ninputs) * sizeof (const char *));
- /* The insn we have emitted. */
- rtx insn;
int old_generating_concat_p = generating_concat_p;
/* An ASM with no outputs needs to be treated as volatile, for now. */
@@ -1467,6 +1494,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
/* Count the number of meaningful clobbered registers, ignoring what
we would ignore later. */
nclobbers = 0;
+ CLEAR_HARD_REG_SET (clobbered_regs);
for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
{
const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
@@ -1476,6 +1504,10 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
++nclobbers;
else if (i == -2)
error ("unknown register name `%s' in `asm'", regname);
+
+ /* Mark clobbered registers. */
+ if (i >= 0)
+ SET_HARD_REG_BIT (clobbered_regs, i);
}
clear_last_expr ();
@@ -1601,6 +1633,9 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
inout_mode[ninout] = TYPE_MODE (type);
inout_opnum[ninout++] = i;
}
+
+ if (decl_conflicts_with_clobbers_p (val, clobbered_regs))
+ clobber_conflict_found = 1;
}
/* Make vectors for the expression-rtx, constraint strings,
@@ -1685,6 +1720,9 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
= gen_rtx_ASM_INPUT (TYPE_MODE (type), constraints[i + noutputs]);
+
+ if (decl_conflicts_with_clobbers_p (val, clobbered_regs))
+ clobber_conflict_found = 1;
}
/* Protect all the operands from the queue now that they have all been
@@ -1723,13 +1761,13 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
if (noutputs == 1 && nclobbers == 0)
{
ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0];
- insn = emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
+ emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
}
else if (noutputs == 0 && nclobbers == 0)
{
/* No output operands: put in a raw ASM_OPERANDS rtx. */
- insn = emit_insn (body);
+ emit_insn (body);
}
else
@@ -1769,6 +1807,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
{
const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
int j = decode_reg_name (regname);
+ rtx clobbered_reg;
if (j < 0)
{
@@ -1790,11 +1829,32 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
}
/* Use QImode since that's guaranteed to clobber just one reg. */
+ clobbered_reg = gen_rtx_REG (QImode, j);
+
+ /* Do sanity check for overlap between clobbers and respectively
+ input and outputs that hasn't been handled. Such overlap
+ should have been detected and reported above. */
+ if (!clobber_conflict_found)
+ {
+ int opno;
+
+ /* We test the old body (obody) contents to avoid tripping
+ over the under-construction body. */
+ for (opno = 0; opno < noutputs; opno++)
+ if (reg_overlap_mentioned_p (clobbered_reg, output_rtx[opno]))
+ internal_error ("asm clobber conflict with output operand");
+
+ for (opno = 0; opno < ninputs - ninout; opno++)
+ if (reg_overlap_mentioned_p (clobbered_reg,
+ ASM_OPERANDS_INPUT (obody, opno)))
+ internal_error ("asm clobber conflict with input operand");
+ }
+
XVECEXP (body, 0, i++)
- = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (QImode, j));
+ = gen_rtx_CLOBBER (VOIDmode, clobbered_reg);
}
- insn = emit_insn (body);
+ emit_insn (body);
}
/* For any outputs that needed reloading into registers, spill them
@@ -2422,7 +2482,6 @@ expand_start_loop (exit_flag)
thisloop->depth = ++nesting_depth;
thisloop->data.loop.start_label = gen_label_rtx ();
thisloop->data.loop.end_label = gen_label_rtx ();
- thisloop->data.loop.alt_end_label = 0;
thisloop->data.loop.continue_label = thisloop->data.loop.start_label;
thisloop->exit_label = exit_flag ? thisloop->data.loop.end_label : 0;
loop_stack = thisloop;
@@ -2464,7 +2523,6 @@ expand_start_null_loop ()
thisloop->depth = ++nesting_depth;
thisloop->data.loop.start_label = emit_note (NULL, NOTE_INSN_DELETED);
thisloop->data.loop.end_label = gen_label_rtx ();
- thisloop->data.loop.alt_end_label = NULL_RTX;
thisloop->data.loop.continue_label = thisloop->data.loop.end_label;
thisloop->exit_label = thisloop->data.loop.end_label;
loop_stack = thisloop;
@@ -2495,6 +2553,7 @@ expand_end_loop ()
rtx start_label = loop_stack->data.loop.start_label;
rtx etc_note;
int eh_regions, debug_blocks;
+ bool empty_test;
/* Mark the continue-point at the top of the loop if none elsewhere. */
if (start_label == loop_stack->data.loop.continue_label)
@@ -2538,6 +2597,7 @@ expand_end_loop ()
/* Scan insns from the top of the loop looking for the END_TOP_COND note. */
+ empty_test = true;
eh_regions = debug_blocks = 0;
for (etc_note = start_label; etc_note ; etc_note = NEXT_INSN (etc_note))
if (GET_CODE (etc_note) == NOTE)
@@ -2578,9 +2638,12 @@ expand_end_loop ()
else if (NOTE_LINE_NUMBER (etc_note) == NOTE_INSN_BLOCK_END)
debug_blocks--;
}
+ else if (INSN_P (etc_note))
+ empty_test = false;
if (etc_note
&& optimize
+ && ! empty_test
&& eh_regions == 0
&& (debug_blocks == 0 || optimize >= 2)
&& NEXT_INSN (etc_note) != NULL_RTX
@@ -2699,22 +2762,32 @@ expand_exit_loop_if_false (whichloop, cond)
struct nesting *whichloop;
tree cond;
{
- rtx label = gen_label_rtx ();
- rtx last_insn;
+ rtx label;
clear_last_expr ();
if (whichloop == 0)
whichloop = loop_stack;
if (whichloop == 0)
return 0;
+
+ if (integer_nonzerop (cond))
+ return 1;
+ if (integer_zerop (cond))
+ return expand_exit_loop (whichloop);
+
+ /* Check if we definitely won't need a fixup. */
+ if (whichloop == nesting_stack)
+ {
+ jumpifnot (cond, whichloop->data.loop.end_label);
+ return 1;
+ }
+
/* In order to handle fixups, we actually create a conditional jump
around an unconditional branch to exit the loop. If fixups are
necessary, they go before the unconditional branch. */
- do_jump (cond, NULL_RTX, label);
- last_insn = get_last_insn ();
- if (GET_CODE (last_insn) == CODE_LABEL)
- whichloop->data.loop.alt_end_label = last_insn;
+ label = gen_label_rtx ();
+ jumpif (cond, label);
expand_goto_internal (NULL_TREE, whichloop->data.loop.end_label,
NULL_RTX);
emit_label (label);
@@ -2738,18 +2811,7 @@ expand_exit_loop_top_cond (whichloop, cond)
return 1;
}
-/* Return nonzero if the loop nest is empty. Else return zero. */
-
-int
-stmt_loop_nest_empty ()
-{
- /* cfun->stmt can be NULL if we are building a call to get the
- EH context for a setjmp/longjmp EH target and the current
- function was a deferred inline function. */
- return (cfun->stmt == NULL || loop_stack == NULL);
-}
-
-/* Return non-zero if we should preserve sub-expressions as separate
+/* Return nonzero if we should preserve sub-expressions as separate
pseudos. We never do so if we aren't optimizing. We always do so
if -fexpensive-optimizations.
@@ -3132,18 +3194,6 @@ expand_return (retval)
expand_value_return (result_rtl);
}
}
-
-/* Return 1 if the end of the generated RTX is not a barrier.
- This means code already compiled can drop through. */
-
-int
-drop_through_at_end_p ()
-{
- rtx insn = get_last_insn ();
- while (insn && GET_CODE (insn) == NOTE)
- insn = PREV_INSN (insn);
- return insn && GET_CODE (insn) != BARRIER;
-}
/* Attempt to optimize a potential tail recursion call into a goto.
ARGUMENTS are the arguments to a CALL_EXPR; LAST_INSN indicates
@@ -3362,7 +3412,7 @@ expand_end_target_temps ()
pop_temp_slots ();
}
-/* Given a pointer to a BLOCK node return non-zero if (and only if) the node
+/* Given a pointer to a BLOCK node return nonzero if (and only if) the node
in question represents the outermost pair of curly braces (i.e. the "body
block") of a function or method.
@@ -3751,7 +3801,6 @@ void
expand_decl (decl)
tree decl;
{
- struct nesting *thisblock;
tree type;
type = TREE_TYPE (decl);
@@ -3777,8 +3826,6 @@ expand_decl (decl)
if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
return;
- thisblock = block_stack;
-
/* Create the RTL representation for the variable. */
if (type == error_mark_node)
@@ -4162,7 +4209,7 @@ expand_anon_union_decl (decl, cleanup, decl_elts)
This is sometimes used to avoid a cleanup associated with
a value that is being returned out of the scope.
- If IN_FIXUP is non-zero, we are generating this cleanup for a fixup
+ If IN_FIXUP is nonzero, we are generating this cleanup for a fixup
goto and handle protection regions specially in that case.
If REACHABLE, we emit code, otherwise just inform the exception handling
@@ -4244,24 +4291,6 @@ end_cleanup_deferral ()
--block_stack->data.block.conditional_code;
}
-/* Move all cleanups from the current block_stack
- to the containing block_stack, where they are assumed to
- have been created. If anything can cause a temporary to
- be created, but not expanded for more than one level of
- block_stacks, then this code will have to change. */
-
-void
-move_cleanups_up ()
-{
- struct nesting *block = block_stack;
- struct nesting *outer = block->next;
-
- outer->data.block.cleanups
- = chainon (block->data.block.cleanups,
- outer->data.block.cleanups);
- block->data.block.cleanups = 0;
-}
-
tree
last_cleanup_this_contour ()
{
@@ -4371,26 +4400,6 @@ expand_start_case_dummy ()
nesting_stack = thiscase;
start_cleanup_deferral ();
}
-
-/* End a dummy case statement. */
-
-void
-expand_end_case_dummy ()
-{
- end_cleanup_deferral ();
- POPSTACK (case_stack);
-}
-
-/* Return the data type of the index-expression
- of the innermost case statement, or null if none. */
-
-tree
-case_index_expr_type ()
-{
- if (case_stack)
- return TREE_TYPE (case_stack->data.case_stmt.index_expr);
- return 0;
-}
static void
check_seenlabel ()
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 28d8f6218d1..b754fffbe60 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -48,7 +48,7 @@ tree sizetype_tab[(int) TYPE_KIND_LAST];
The value is measured in bits. */
unsigned int maximum_field_alignment;
-/* If non-zero, the alignment of a bitstring or (power-)set value, in bits.
+/* If nonzero, the alignment of a bitstring or (power-)set value, in bits.
May be overridden by front-ends. */
unsigned int set_alignment = 0;
@@ -60,6 +60,9 @@ static int reference_types_internal = 0;
static void finalize_record_size PARAMS ((record_layout_info));
static void finalize_type_size PARAMS ((tree));
static void place_union_field PARAMS ((record_layout_info, tree));
+static unsigned int update_alignment_for_field
+ PARAMS ((record_layout_info, tree,
+ unsigned int));
extern void debug_rli PARAMS ((record_layout_info));
/* SAVE_EXPRs for sizes of types and decls, waiting to be expanded. */
@@ -96,7 +99,7 @@ get_pending_sizes ()
return chain;
}
-/* Return non-zero if EXPR is present on the pending sizes list. */
+/* Return nonzero if EXPR is present on the pending sizes list. */
int
is_pending_size (expr)
@@ -536,25 +539,6 @@ byte_from_pos (offset, bitpos)
}
void
-pos_from_byte (poffset, pbitpos, off_align, pos)
- tree *poffset, *pbitpos;
- unsigned int off_align;
- tree pos;
-{
- *poffset
- = size_binop (MULT_EXPR,
- convert (sizetype,
- size_binop (FLOOR_DIV_EXPR, pos,
- bitsize_int (off_align
- / BITS_PER_UNIT))),
- size_int (off_align / BITS_PER_UNIT));
- *pbitpos = size_binop (MULT_EXPR,
- size_binop (FLOOR_MOD_EXPR, pos,
- bitsize_int (off_align / BITS_PER_UNIT)),
- bitsize_unit_node);
-}
-
-void
pos_from_bit (poffset, pbitpos, off_align, pos)
tree *poffset, *pbitpos;
unsigned int off_align;
@@ -644,59 +628,145 @@ rli_size_so_far (rli)
return bit_from_pos (rli->offset, rli->bitpos);
}
-/* Called from place_field to handle unions. */
+/* FIELD is about to be added to RLI->T. The alignment (in bits) of
+ the next available location is given by KNOWN_ALIGN. Update the
+ variable alignment fields in RLI, and return the alignment to give
+ the FIELD. */
-static void
-place_union_field (rli, field)
+static unsigned int
+update_alignment_for_field (rli, field, known_align)
record_layout_info rli;
tree field;
+ unsigned int known_align;
{
+ /* The alignment required for FIELD. */
unsigned int desired_align;
+ /* The type of this field. */
+ tree type = TREE_TYPE (field);
+ /* True if the field was explicitly aligned by the user. */
+ bool user_align;
- layout_decl (field, 0);
-
- DECL_FIELD_OFFSET (field) = size_zero_node;
- DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node;
- SET_DECL_OFFSET_ALIGN (field, BIGGEST_ALIGNMENT);
-
+ /* Lay out the field so we know what alignment it needs. For a
+ packed field, use the alignment as specified, disregarding what
+ the type would want. */
desired_align = DECL_ALIGN (field);
+ user_align = DECL_USER_ALIGN (field);
+ layout_decl (field, known_align);
+ if (! DECL_PACKED (field))
+ {
+ desired_align = DECL_ALIGN (field);
+ user_align = DECL_USER_ALIGN (field);
+ }
-#ifdef BIGGEST_FIELD_ALIGNMENT
- /* Some targets (i.e. i386) limit union field alignment
+ /* Some targets (i.e. i386, VMS) limit struct field alignment
to a lower boundary than alignment of variables unless
it was overridden by attribute aligned. */
- if (! DECL_USER_ALIGN (field))
- desired_align =
- MIN (desired_align, (unsigned) BIGGEST_FIELD_ALIGNMENT);
+#ifdef BIGGEST_FIELD_ALIGNMENT
+ if (!user_align)
+ desired_align
+ = MIN (desired_align, (unsigned) BIGGEST_FIELD_ALIGNMENT);
#endif
#ifdef ADJUST_FIELD_ALIGN
- if (! DECL_USER_ALIGN (field))
+ if (!user_align)
desired_align = ADJUST_FIELD_ALIGN (field, desired_align);
#endif
- TYPE_USER_ALIGN (rli->t) |= DECL_USER_ALIGN (field);
-
- /* Union must be at least as aligned as any field requires. */
- rli->record_align = MAX (rli->record_align, desired_align);
- rli->unpadded_align = MAX (rli->unpadded_align, desired_align);
-
+ /* 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)))
+ {
+ /* Here, the alignment of the underlying type of a bitfield can
+ affect the alignment of a record; even a zero-sized field
+ can do this. The alignment should be to the alignment of
+ the type, except that for zero-size bitfields this only
+ applies if there was an immediately prior, nonzero-size
+ bitfield. (That's the way it is, experimentally.) */
+ if (! integer_zerop (DECL_SIZE (field))
+ ? ! DECL_PACKED (field)
+ : (rli->prev_field
+ && DECL_BIT_FIELD_TYPE (rli->prev_field)
+ && ! integer_zerop (DECL_SIZE (rli->prev_field))))
+ {
+ unsigned int type_align = TYPE_ALIGN (type);
+ type_align = MAX (type_align, desired_align);
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+ rli->record_align = MAX (rli->record_align, type_align);
+ rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
+ rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field));
+ }
+ else
+ desired_align = 1;
+ }
+ else
#ifdef PCC_BITFIELD_TYPE_MATTERS
- /* On the m88000, a bit field of declare type `int' forces the
- entire union to have `int' alignment. */
- if (PCC_BITFIELD_TYPE_MATTERS && DECL_BIT_FIELD_TYPE (field))
+ 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)))
{
- unsigned int type_align = TYPE_ALIGN (TREE_TYPE (field));
+ /* For these machines, a zero-length field does not
+ affect the alignment of the structure as a whole.
+ It does, however, affect the alignment of the next field
+ within the structure. */
+ if (! integer_zerop (DECL_SIZE (field)))
+ rli->record_align = MAX (rli->record_align, desired_align);
+ else if (! DECL_PACKED (field))
+ desired_align = TYPE_ALIGN (type);
+
+ /* A named bit field of declared type `int'
+ forces the entire structure to have `int' alignment. */
+ if (DECL_NAME (field) != 0)
+ {
+ unsigned int type_align = TYPE_ALIGN (type);
#ifdef ADJUST_FIELD_ALIGN
- if (! TYPE_USER_ALIGN (TREE_TYPE (field)))
- type_align = ADJUST_FIELD_ALIGN (field, type_align);
+ if (! TYPE_USER_ALIGN (type))
+ type_align = ADJUST_FIELD_ALIGN (field, type_align);
#endif
- rli->record_align = MAX (rli->record_align, type_align);
- rli->unpadded_align = MAX (rli->unpadded_align, type_align);
- TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (TREE_TYPE (field));
+
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+ else if (DECL_PACKED (field))
+ type_align = MIN (type_align, BITS_PER_UNIT);
+
+ rli->record_align = MAX (rli->record_align, type_align);
+ rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field));
+ if (warn_packed)
+ rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
+ user_align |= TYPE_USER_ALIGN (type);
+ }
}
+ else
#endif
+ {
+ rli->record_align = MAX (rli->record_align, desired_align);
+ rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
+ rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field));
+ }
+
+ TYPE_USER_ALIGN (rli->t) |= user_align;
+
+ return desired_align;
+}
+
+/* Called from place_field to handle unions. */
+
+static void
+place_union_field (rli, field)
+ record_layout_info rli;
+ tree field;
+{
+ update_alignment_for_field (rli, field, /*known_align=*/0);
+
+ DECL_FIELD_OFFSET (field) = size_zero_node;
+ DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node;
+ SET_DECL_OFFSET_ALIGN (field, BIGGEST_ALIGNMENT);
/* We assume the union's size will be a multiple of a byte so we don't
bother with BITPOS. */
@@ -724,7 +794,6 @@ place_field (rli, field)
record as it presently stands. */
unsigned int known_align;
unsigned int actual_align;
- unsigned int user_align;
/* The type of this field. */
tree type = TREE_TYPE (field);
@@ -768,98 +837,8 @@ place_field (rli, field)
& - tree_low_cst (rli->offset, 1)));
else
known_align = rli->offset_align;
-
- /* Lay out the field so we know what alignment it needs. For a
- packed field, use the alignment as specified, disregarding what
- the type would want. */
- desired_align = DECL_ALIGN (field);
- user_align = DECL_USER_ALIGN (field);
- layout_decl (field, known_align);
- if (! DECL_PACKED (field))
- {
- desired_align = DECL_ALIGN (field);
- user_align = DECL_USER_ALIGN (field);
- }
-
- /* Some targets (i.e. i386, VMS) limit struct field alignment
- to a lower boundary than alignment of variables unless
- it was overridden by attribute aligned. */
-#ifdef BIGGEST_FIELD_ALIGNMENT
- if (! user_align)
- desired_align
- = MIN (desired_align, (unsigned) BIGGEST_FIELD_ALIGNMENT);
-#endif
-
-#ifdef ADJUST_FIELD_ALIGN
- if (! user_align)
- desired_align = ADJUST_FIELD_ALIGN (field, desired_align);
-#endif
-
- /* 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)))
- {
- /* For these machines, a zero-length field does not
- affect the alignment of the structure as a whole.
- It does, however, affect the alignment of the next field
- within the structure. */
- if (! integer_zerop (DECL_SIZE (field)))
- rli->record_align = MAX (rli->record_align, desired_align);
- else if (! DECL_PACKED (field))
- desired_align = TYPE_ALIGN (type);
-
- /* A named bit field of declared type `int'
- forces the entire structure to have `int' alignment. */
- if (DECL_NAME (field) != 0)
- {
- unsigned int type_align = TYPE_ALIGN (type);
-
-#ifdef ADJUST_FIELD_ALIGN
- if (! TYPE_USER_ALIGN (type))
- type_align = ADJUST_FIELD_ALIGN (field, type_align);
-#endif
-
- if (maximum_field_alignment != 0)
- type_align = MIN (type_align, maximum_field_alignment);
- else if (DECL_PACKED (field))
- type_align = MIN (type_align, BITS_PER_UNIT);
-
- rli->record_align = MAX (rli->record_align, type_align);
- rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field));
- if (warn_packed)
- rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
- user_align |= TYPE_USER_ALIGN (type);
- }
- }
- else
-#endif
- {
- rli->record_align = MAX (rli->record_align, desired_align);
- rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
- rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field));
- }
+
+ desired_align = update_alignment_for_field (rli, field, known_align);
if (warn_packed && DECL_PACKED (field))
{
@@ -944,7 +923,7 @@ place_field (rli, field)
> tree_low_cst (TYPE_SIZE (type), 1) / type_align)
rli->bitpos = round_up (rli->bitpos, type_align);
- user_align |= TYPE_USER_ALIGN (type);
+ TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (type);
}
#endif
@@ -987,52 +966,152 @@ place_field (rli, field)
/ type_align))
rli->bitpos = round_up (rli->bitpos, type_align);
- user_align |= TYPE_USER_ALIGN (type);
+ TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (type);
}
#endif
- /* See the docs for TARGET_MS_BITFIELD_LAYOUT_P for details. */
+ /* See the docs for TARGET_MS_BITFIELD_LAYOUT_P for details.
+ A subtlety:
+ When a bit field is inserted into a packed record, the whole
+ size of the underlying type is used by one or more same-size
+ adjacent bitfields. (That is, if its long:3, 32 bits is
+ used in the record, and any additional adjacent long bitfields are
+ packed into the same chunk of 32 bits. However, if the size
+ changes, a new field of that size is allocated.) In an unpacked
+ record, this is the same as using alignment, but not eqivalent
+ when packing.
+
+ Note: for compatability, we use the type size, not the type alignment
+ to determine alignment, since that matches the documentation */
+
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)))))
+ && ((DECL_BIT_FIELD_TYPE (field) && ! DECL_PACKED (field))
+ || (rli->prev_field && ! DECL_PACKED (rli->prev_field))))
{
- unsigned int type_align = TYPE_ALIGN (type);
+ /* At this point, either the prior or current are bitfields,
+ (possibly both), and we're dealing with MS packing. */
+ tree prev_saved = rli->prev_field;
- 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)));
+ /* Is the prior field a bitfield? If so, handle "runs" of same
+ type size fields. */
+ if (rli->prev_field /* necessarily a bitfield if it exists. */)
+ {
+ /* If both are bitfields, nonzero, and the same size, this is
+ the middle of a run. Zero declared size fields are special
+ and handled as "end of run". (Note: it's nonzero declared
+ size, but equal type sizes!) (Since we know that both
+ the current and previous fields are bitfields by the
+ time we check it, DECL_SIZE must be present for both.) */
+ if (DECL_BIT_FIELD_TYPE (field)
+ && !integer_zerop (DECL_SIZE (field))
+ && !integer_zerop (DECL_SIZE (rli->prev_field))
+ && simple_cst_equal (TYPE_SIZE (type),
+ TYPE_SIZE (TREE_TYPE (rli->prev_field))) )
+ {
+ /* We're in the middle of a run of equal type size fields; make
+ sure we realign if we run out of bits. (Not decl size,
+ type size!) */
+ int bitsize = TREE_INT_CST_LOW (DECL_SIZE (field));
+ tree type_size = TYPE_SIZE(TREE_TYPE(rli->prev_field));
+
+ if (rli->remaining_in_alignment < bitsize)
+ {
+ /* out of bits; bump up to next 'word'. */
+ rli->bitpos = size_binop (PLUS_EXPR,
+ type_size,
+ DECL_FIELD_BIT_OFFSET(rli->prev_field));
+ rli->prev_field = field;
+ rli->remaining_in_alignment = TREE_INT_CST_LOW (type_size);
+ }
+ rli->remaining_in_alignment -= bitsize;
+ }
+ else
+ {
+ /* End of a run: if leaving a run of bitfields of the same type
+ size, we have to "use up" the rest of the bits of the type
+ size.
+
+ Compute the new position as the sum of the size for the prior
+ type and where we first started working on that type.
+ Note: since the beginning of the field was aligned then
+ of course the end will be too. No round needed. */
+
+ if (!integer_zerop (DECL_SIZE (rli->prev_field)))
+ {
+ tree type_size = TYPE_SIZE(TREE_TYPE(rli->prev_field));
+ rli->bitpos = size_binop (PLUS_EXPR,
+ type_size,
+ DECL_FIELD_BIT_OFFSET(rli->prev_field));
+ }
+ else
+ {
+ /* We "use up" size zero fields; the code below should behave
+ as if the prior field was not a bitfield. */
+ prev_saved = NULL;
+ }
+
+ /* Cause a new bitfield to be captured, either this time (if
+ currently a bitfield) or next time we see one. */
+ if (!DECL_BIT_FIELD_TYPE(field)
+ || integer_zerop (DECL_SIZE (field)))
+ {
+ rli->prev_field = NULL;
+ }
+ }
+ normalize_rli (rli);
+ }
+
+ /* If we're starting a new run of same size type bitfields
+ (or a run of non-bitfields), set up the "first of the run"
+ fields.
+
+ That is, if the current field is not a bitfield, or if there
+ was a prior bitfield the type sizes differ, or if there wasn't
+ a prior bitfield the size of the current field is nonzero.
+
+ Note: we must be sure to test ONLY the type size if there was
+ a prior bitfield and ONLY for the current field being zero if
+ there wasn't. */
+
+ if (!DECL_BIT_FIELD_TYPE (field)
+ || ( prev_saved != NULL
+ ? !simple_cst_equal (TYPE_SIZE (type),
+ TYPE_SIZE (TREE_TYPE (prev_saved)))
+ : !integer_zerop (DECL_SIZE (field)) ))
+ {
+ unsigned int type_align = 8; /* Never below 8 for compatability */
+
+ /* (When not a bitfield), we could be seeing a flex array (with
+ no DECL_SIZE). Since we won't be using remaining_in_alignment
+ until we see a bitfield (and come by here again) we just skip
+ calculating it. */
+
+ if (DECL_SIZE (field) != NULL)
+ rli->remaining_in_alignment
+ = TREE_INT_CST_LOW (TYPE_SIZE(TREE_TYPE(field)))
+ - TREE_INT_CST_LOW (DECL_SIZE (field));
+
+ /* Now align (conventionally) for the new type. */
+ if (!DECL_PACKED(field))
+ type_align = MAX(TYPE_ALIGN (type), type_align);
+
+ if (prev_saved
+ && DECL_BIT_FIELD_TYPE (prev_saved)
+ /* 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 (prev_saved)))
+ type_align = MAX (type_align,
+ TYPE_ALIGN (TREE_TYPE (prev_saved)));
- if (maximum_field_alignment != 0)
- type_align = MIN (type_align, maximum_field_alignment);
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
- rli->bitpos = round_up (rli->bitpos, type_align);
+ rli->bitpos = round_up (rli->bitpos, type_align);
+ /* If we really aligned, don't allow subsequent bitfields
+ to undo that. */
+ rli->prev_field = NULL;
+ }
}
/* Offset so far becomes the position of this field after normalizing. */
@@ -1041,8 +1120,6 @@ place_field (rli, field)
DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
SET_DECL_OFFSET_ALIGN (field, rli->offset_align);
- TYPE_USER_ALIGN (rli->t) |= user_align;
-
/* If this field ended up more aligned than we thought it would be (we
approximate this by seeing if its position changed), lay out the field
again; perhaps we can use an integral mode for it now. */
@@ -1061,7 +1138,9 @@ place_field (rli, field)
if (known_align != actual_align)
layout_decl (field, actual_align);
- rli->prev_field = field;
+ /* Only the MS bitfields use this. */
+ if (rli->prev_field == NULL && DECL_BIT_FIELD_TYPE(field))
+ 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
@@ -1370,11 +1449,14 @@ finalize_type_size (type)
/* Do all of the work required to layout the type indicated by RLI,
once the fields have been laid out. This function will call `free'
- for RLI. */
+ for RLI, unless FREE_P is false. Passing a value other than false
+ for FREE_P is bad practice; this option only exists to support the
+ G++ 3.2 ABI. */
void
-finish_record_layout (rli)
+finish_record_layout (rli, free_p)
record_layout_info rli;
+ int free_p;
{
/* Compute the final size. */
finalize_record_size (rli);
@@ -1394,9 +1476,50 @@ finish_record_layout (rli)
}
/* Clean up. */
- free (rli);
+ if (free_p)
+ free (rli);
}
+
+/* Finish processing a builtin RECORD_TYPE type TYPE. It's name is
+ NAME, its fields are chained in reverse on FIELDS.
+
+ If ALIGN_TYPE is non-null, it is given the same alignment as
+ ALIGN_TYPE. */
+
+void
+finish_builtin_struct (type, name, fields, align_type)
+ tree type;
+ const char *name;
+ tree fields;
+ tree align_type;
+{
+ tree tail, next;
+
+ for (tail = NULL_TREE; fields; tail = fields, fields = next)
+ {
+ DECL_FIELD_CONTEXT (fields) = type;
+ next = TREE_CHAIN (fields);
+ TREE_CHAIN (fields) = tail;
+ }
+ TYPE_FIELDS (type) = tail;
+
+ if (align_type)
+ {
+ TYPE_ALIGN (type) = TYPE_ALIGN (align_type);
+ TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (align_type);
+ }
+
+ layout_type (type);
+#if 0 /* not yet, should get fixed properly later */
+ TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
+#else
+ TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type);
+#endif
+ TYPE_STUB_DECL (type) = TYPE_NAME (type);
+ layout_decl (TYPE_NAME (type), 0);
+}
+
/* Calculate the mode, size, and alignment for TYPE.
For an array type, calculate the element separation as well.
Record TYPE on the chain of permanent or temporary types
@@ -1497,13 +1620,15 @@ layout_type (type)
case POINTER_TYPE:
case REFERENCE_TYPE:
{
- int nbits = ((TREE_CODE (type) == REFERENCE_TYPE
- && reference_types_internal)
- ? GET_MODE_BITSIZE (Pmode) : POINTER_SIZE);
- TYPE_MODE (type) = nbits == POINTER_SIZE ? ptr_mode : Pmode;
+ enum machine_mode mode = ((TREE_CODE (type) == REFERENCE_TYPE
+ && reference_types_internal)
+ ? Pmode : TYPE_MODE (type));
+
+ int nbits = GET_MODE_BITSIZE (mode);
+
TYPE_SIZE (type) = bitsize_int (nbits);
- TYPE_SIZE_UNIT (type) = size_int (nbits / BITS_PER_UNIT);
+ TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode));
TREE_UNSIGNED (type) = 1;
TYPE_PRECISION (type) = nbits;
}
@@ -1649,7 +1774,7 @@ layout_type (type)
(*lang_adjust_rli) (rli);
/* Finish laying out the record. */
- finish_record_layout (rli);
+ finish_record_layout (rli, /*free_p=*/true);
}
break;
diff --git a/gcc/system.h b/gcc/system.h
index 0a77c8fc1b3..b12272b9072 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -23,11 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef GCC_SYSTEM_H
#define GCC_SYSTEM_H
-/* This is the location of the online document giving information how
- to report bugs. If you change this string, also check for strings
- not under control of the preprocessor. */
-#define GCCBUGURL "<URL:http://www.gnu.org/software/gcc/bugs.html>"
-
/* We must include stdarg.h/varargs.h before stdio.h. */
#ifdef ANSI_PROTOTYPES
#include <stdarg.h>
@@ -621,7 +616,7 @@ typedef char _Bool;
BLOCK_PROFILER BLOCK_PROFILER_CODE FUNCTION_BLOCK_PROFILER \
FUNCTION_BLOCK_PROFILER_EXIT MACHINE_STATE_SAVE \
MACHINE_STATE_RESTORE SCCS_DIRECTIVE SECTION_ASM_OP \
- ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
+ ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL ASM_OUTPUT_INTERNAL_LABEL
/* Hooks that are no longer used. */
#pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \
diff --git a/gcc/target-def.h b/gcc/target-def.h
index b2bf07479bd..69966a8524d 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -57,6 +57,13 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef TARGET_ASM_GLOBALIZE_LABEL
#define TARGET_ASM_GLOBALIZE_LABEL default_globalize_label
#endif
+#ifndef TARGET_ASM_INTERNAL_LABEL
+#define TARGET_ASM_INTERNAL_LABEL default_internal_label
+#endif
+
+#ifndef TARGET_ASM_ASSEMBLE_VISIBILITY
+#define TARGET_ASM_ASSEMBLE_VISIBILITY default_assemble_visibility
+#endif
#define TARGET_ASM_FUNCTION_PROLOGUE default_function_pro_epilogue
#define TARGET_ASM_FUNCTION_EPILOGUE default_function_pro_epilogue
@@ -99,6 +106,14 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# endif
#endif
+#ifndef TARGET_ASM_OUTPUT_MI_THUNK
+#define TARGET_ASM_OUTPUT_MI_THUNK NULL
+#endif
+
+#ifndef TARGET_ASM_OUTPUT_MI_VCALL_THUNK
+#define TARGET_ASM_OUTPUT_MI_VCALL_THUNK NULL
+#endif
+
#if defined(TARGET_ASM_CONSTRUCTOR) && defined(TARGET_ASM_DESTRUCTOR)
#define TARGET_HAVE_CTORS_DTORS true
#else
@@ -118,6 +133,18 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_HAVE_TLS false
#endif
+#ifndef TARGET_HAVE_SRODATA_SECTION
+#define TARGET_HAVE_SRODATA_SECTION false
+#endif
+
+#ifndef TARGET_TERMINATE_DW2_EH_FRAME_INFO
+#ifdef EH_FRAME_SECTION_NAME
+#define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
+#else
+#define TARGET_TERMINATE_DW2_EH_FRAME_INFO true
+#endif
+#endif
+
#ifndef TARGET_ASM_EXCEPTION_SECTION
#define TARGET_ASM_EXCEPTION_SECTION default_exception_section
#endif
@@ -145,6 +172,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_ASM_UNALIGNED_INT_OP, \
TARGET_ASM_INTEGER, \
TARGET_ASM_GLOBALIZE_LABEL, \
+ TARGET_ASM_INTERNAL_LABEL, \
+ TARGET_ASM_ASSEMBLE_VISIBILITY, \
TARGET_ASM_FUNCTION_PROLOGUE, \
TARGET_ASM_FUNCTION_END_PROLOGUE, \
TARGET_ASM_FUNCTION_BEGIN_EPILOGUE, \
@@ -156,7 +185,9 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_ASM_SELECT_RTX_SECTION, \
TARGET_ASM_UNIQUE_SECTION, \
TARGET_ASM_CONSTRUCTOR, \
- TARGET_ASM_DESTRUCTOR}
+ TARGET_ASM_DESTRUCTOR, \
+ TARGET_ASM_OUTPUT_MI_THUNK, \
+ TARGET_ASM_OUTPUT_MI_VCALL_THUNK }
/* Scheduler hooks. All of these default to null pointers, which
haifa-sched.c looks for and handles. */
@@ -222,9 +253,17 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_BINDS_LOCAL_P default_binds_local_p
#endif
+#ifndef TARGET_VALID_POINTER_MODE
+#define TARGET_VALID_POINTER_MODE default_valid_pointer_mode
+#endif
+
/* In hook.c. */
#define TARGET_CANNOT_MODIFY_JUMPS_P hook_void_bool_false
+#define TARGET_FUNCTION_OK_FOR_SIBCALL hook_tree_tree_bool_false
+
+#ifndef TARGET_IN_SMALL_DATA_P
#define TARGET_IN_SMALL_DATA_P hook_tree_bool_false
+#endif
#ifndef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO hook_tree_int_void
@@ -247,13 +286,17 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_EXPAND_BUILTIN, \
TARGET_SECTION_TYPE_FLAGS, \
TARGET_CANNOT_MODIFY_JUMPS_P, \
+ TARGET_FUNCTION_OK_FOR_SIBCALL, \
TARGET_IN_SMALL_DATA_P, \
TARGET_BINDS_LOCAL_P, \
TARGET_ENCODE_SECTION_INFO, \
TARGET_STRIP_NAME_ENCODING, \
+ TARGET_VALID_POINTER_MODE, \
TARGET_HAVE_NAMED_SECTIONS, \
TARGET_HAVE_CTORS_DTORS, \
- TARGET_HAVE_TLS \
+ TARGET_HAVE_TLS, \
+ TARGET_HAVE_SRODATA_SECTION, \
+ TARGET_TERMINATE_DW2_EH_FRAME_INFO \
}
#include "hooks.h"
diff --git a/gcc/target.h b/gcc/target.h
index b63fc0f59c8..9c8a6308e8c 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -72,6 +72,13 @@ struct gcc_target
/* Output code that will globalize a label. */
void (* globalize_label) PARAMS ((FILE *, const char *));
+ /* Output an internal label. */
+ void (* internal_label) PARAMS ((FILE *, const char *, unsigned long));
+
+ /* Emit an assembler directive to set visibility for the symbol
+ associated with the tree decl. */
+ void (* visibility) PARAMS ((tree, const char *));
+
/* Output the assembler code for entry to a function. */
void (* function_prologue) PARAMS ((FILE *, HOST_WIDE_INT));
@@ -95,7 +102,7 @@ struct gcc_target
void (* eh_frame_section) PARAMS ((void));
/* Select and switch to a section for EXP. It may be a DECL or a
- constant for which TREE_CST_RTL is valid. RELOC is non-zero if
+ constant for which TREE_CST_RTL is valid. RELOC is nonzero if
runtime relocations must be applied; bit 1 will be set if the
runtime relocations require non-local name resolution. ALIGN is
the required alignment of the data. */
@@ -115,6 +122,13 @@ struct gcc_target
/* Output a destructor for a symbol with a given priority. */
void (* destructor) PARAMS ((rtx, int));
+
+ /* Output the assembler code for a thunk function. */
+ void (* output_mi_thunk) PARAMS ((FILE *, tree, HOST_WIDE_INT, tree));
+
+ /* Output the assembler code for a thunk function with a vcall offset. */
+ void (* output_mi_vcall_thunk) PARAMS ((FILE *, tree, HOST_WIDE_INT,
+ HOST_WIDE_INT, tree));
} asm_out;
/* Functions relating to instruction scheduling. */
@@ -237,6 +251,11 @@ struct gcc_target
not, at the current point in the compilation. */
bool (* cannot_modify_jumps_p) PARAMS ((void));
+ /* True if it is OK to do sibling call optimization for the specified
+ call expression EXP. DECL will be the called function, or NULL if
+ this is an indirect call. */
+ bool (*function_ok_for_sibcall) PARAMS ((tree decl, tree exp));
+
/* True if EXP should be placed in a "small data" section. */
bool (* in_small_data_p) PARAMS ((tree));
@@ -251,6 +270,7 @@ struct gcc_target
/* Undo the effects of encode_section_info on the symbol string. */
const char * (* strip_name_encoding) PARAMS ((const char *));
+ bool (* valid_pointer_mode) PARAMS ((enum machine_mode mode));
/* Leave the boolean fields at the end. */
/* True if arbitrary sections are supported. */
@@ -262,6 +282,12 @@ struct gcc_target
/* True if thread-local storage is supported. */
bool have_tls;
+
+ /* True if a small readonly data section is supported. */
+ bool have_srodata_section;
+
+ /* True if EH frame info sections should be zero-terminated. */
+ bool terminate_dw2_eh_frame_info;
};
extern struct gcc_target targetm;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1fdf1bcf746..bc596bbbbf7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,683 @@
+2002-10-21 Zack Weinberg <zack@codesourcery.com>
+
+ * gcc.dg/noncompile/920923-1.c: Prevent spurious regressions with
+ bison 1.50 or later.
+
+ * gcc.dg/sibcall-5.c: Correct { dg-do run } line.
+
+2002-10-20 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
+ * testsuite/gcc.dg/i386-sse-3.c: Add tests for _mm_srli_si128 and
+ _mm_slli_si128.
+
+2002-10-19 Andreas Schwab <schwab@suse.de>
+
+ * lib/compat.exp (compat-run): Prepend "./" when $dest has no
+ directory component.
+
+2002-10-18 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/inherit/thunk1.C: New test.
+
+ * g++.dg/inherit/override1.C: New test.
+
+ * g++.dg/abi/mangle11.C: New test.
+ * g++.dg/abi/mangle14.C: New test.
+ * g++.dg/abi/mangle17.C: New test.
+
+2002-10-17 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/overload/member2.C: New test.
+
+2002-10-17 Janis Johnson <janis187@us.ibm.com>
+
+ * g++.dg/README: Describe new compat directory.
+ * g++.dg/dg.exp: Skip tests in compat directory.
+ * README.compat: New file.
+ * lib/compat.exp: New expect script.
+ * g++.dg/compat: New test directory.
+ * g++.dg/compat/compat.exp: New expect script.
+ * g++.dg/compat/abi: New test directory.
+ * g++.dg/compat/abi/bitfield1_x.C, g++.dg/compat/abi/bitfield1_main.C,
+ g++.dg/compat/abi/bitfield1_y.C, g++.dg/compat/abi/bitfield1.h,
+ g++.dg/compat/abi/bitfield2_x.C, g++.dg/compat/abi/bitfield2_main.C,
+ g++.dg/compat/abi/bitfield2_y.C, g++.dg/compat/abi/bitfield2.h,
+ g++.dg/compat/abi/vbase8-10_x.C, g++.dg/compat/abi/vbase8-10_main.C,
+ g++.dg/compat/abi/vbase8-10_y.C, g++.dg/compat/abi/vbase8-10.h,
+ g++.dg/compat/abi/vbase8-21_x.C, g++.dg/compat/abi/vbase8-21_main.C,
+ g++.dg/compat/abi/vbase8-21_y.C, g++.dg/compat/abi/vbase8-21.h,
+ g++.dg/compat/abi/vbase8-22_x.C, g++.dg/compat/abi/vbase8-22_main.C,
+ g++.dg/compat/abi/vbase8-22_y.C, g++.dg/compat/abi/vbase8-22.h,
+ g++.dg/compat/abi/vbase8-4_x.C, g++.dg/compat/abi/vbase8-4_main.C,
+ g++.dg/compat/abi/vbase8-4_y.C, g++.dg/compat/abi/vbase8-4.h: New files.
+ * g++.dg/compat/break: New test directory.
+ * g++.dg/compat/break/empty6_x.C, g++.dg/compat/break/empty6_main.C,
+ g++.dg/compat/break/empty6_y.C, g++.dg/compat/break/empty6.h,
+ g++.dg/compat/break/vbase10_x.C, g++.dg/compat/break/vbase10_main.C,
+ g++.dg/compat/break/vbase10_y.C, g++.dg/compat/break/vbase10.h,
+ g++.dg/compat/break/vbase11_x.C, g++.dg/compat/break/vbase11_main.C,
+ g++.dg/compat/break/vbase11_y.C, g++.dg/compat/break/vbase11.h,
+ g++.dg/compat/break/bitfield7_x.C, g++.dg/compat/break/bitfield7_main.C,
+ g++.dg/compat/break/bitfield7_y.C, g++.dg/compat/break/bitfield7.h,
+ g++.dg/compat/break/bitfield5_x.C, g++.dg/compat/break/bitfield5_main.C,
+ g++.dg/compat/break/bitfield5_y.C, g++.dg/compat/break/bitfield5.h,
+ g++.dg/compat/break/README: New files.
+ * g++.dg/compat/eh: New test directory.
+ * g++.dg/compat/eh/ctor1_x.C, g++.dg/compat/eh/ctor1_main.C,
+ g++.dg/compat/eh/ctor1_y.C, g++.dg/compat/eh/ctor1.h,
+ g++.dg/compat/eh/ctor2_x.C, g++.dg/compat/eh/ctor2_main.C,
+ g++.dg/compat/eh/ctor2_y.C, g++.dg/compat/eh/ctor2.h,
+ g++.dg/compat/eh/dtor1_x.C, g++.dg/compat/eh/dtor1_main.C,
+ g++.dg/compat/eh/dtor1_y.C, g++.dg/compat/eh/dtor1.h,
+ g++.dg/compat/eh/filter1_x.C, g++.dg/compat/eh/filter1_main.C,
+ g++.dg/compat/eh/filter1_y.C, g++.dg/compat/eh/filter1.h,
+ g++.dg/compat/eh/filter2_x.C, g++.dg/compat/eh/filter2_main.C,
+ g++.dg/compat/eh/filter2_y.C,
+ g++.dg/compat/eh/new1_x.C, g++.dg/compat/eh/new1_main.C,
+ g++.dg/compat/eh/new1_y.C,
+ g++.dg/compat/eh/nrv1_x.C, g++.dg/compat/eh/nrv1_main.C,
+ g++.dg/compat/eh/nrv1_y.C, g++.dg/compat/eh/nrv1.h,
+ g++.dg/compat/eh/spec3_x.C, g++.dg/compat/eh/spec3_main.C,
+ g++.dg/compat/eh/spec3_y.C, g++.dg/compat/eh/spec3.h,
+ g++.dg/compat/eh/template1_x.C, g++.dg/compat/eh/template1_main.C,
+ g++.dg/compat/eh/template1_y.C, g++.dg/compat/eh/template1.h,
+ g++.dg/compat/eh/unexpected1_x.C, g++.dg/compat/eh/unexpected1_main.C,
+ g++.dg/compat/eh/unexpected1_y.C: New files.
+ * g++.dg/compat/init: New test directory.
+ * g++.dg/compat/init/array5_x.C, g++.dg/compat/init/array5_main.C,
+ g++.dg/compat/init/array5_y.C,
+ g++.dg/compat/init/byval1_x.C, g++.dg/compat/init/byval1_main.C,
+ g++.dg/compat/init/byval1_y.C, g++.dg/compat/init/byval1.h,
+ g++.dg/compat/init/dtor1_x.C, g++.dg/compat/init/dtor1_main.C,
+ g++.dg/compat/init/dtor1_y.C, g++.dg/compat/init/dtor1.h,
+ g++.dg/compat/init/elide1_x.C, g++.dg/compat/init/elide1_main.C,
+ g++.dg/compat/init/elide1_y.C, g++.dg/compat/init/elide1.h,
+ g++.dg/compat/init/init-ref2_x.C, g++.dg/compat/init/init-ref2_main.C,
+ g++.dg/compat/init/init-ref2_y.C: New files.
+
+2002-10-17 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7584
+ * g++.dg/inherit/using3.C: New test.
+
+Thu Oct 17 19:12:58 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * gcc.dg/20021017-2.c: New test.
+
+2002-10-17 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/abi/mangle16.C: Adjust.
+
+ * g++.dg/init/array8.C: New test.
+
+2002-10-17 Richard Sandiford <rsandifo@redhat.com>
+
+ * gcc.dg/special/mips-abi.exp: New test.
+ * gcc.dg/special/mips-abi.s: Empty file used by the above.
+
+2002-10-16 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/abi/mangle16.C: New test.
+ * g++.dg/abi/mangle17.C: Likewise.
+
+ PR c++/7478
+ * g++.dg/template/ref1.C: New test.
+
+2002-10-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.c-torture/execute/20020720-1.x: Don't XFAIL for mips.
+
+2002-10-16 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * gcc.dg/weak/typeof-2.c: For S/390 targets, return before baz3 test.
+
+2002-10-16 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7524
+ * g++.dg/init/array7.C: New test.
+
+2002-10-15 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/init/array6.C: New test.
+
+ * g++.dg/abi/mangle13.C: Likewise.
+ * g++.dg/abi/mangle14.C: Likewise.
+ * g++.dg/abi/mangle15.C: Likewise.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/abi/empty8.C: New test.
+
+2002-10-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/init/ctor1.C: New test.
+
+2002-10-15 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * gcc.c-torture/execute/20021015-1.c: New test.
+
+Tue Oct 15 14:22:41 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * gcc.dg/weak/typeof-2.c: For SH targets, return before baz3 test.
+
+Mon Oct 14 20:37:51 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * gcc.dg/i386-ssetype-[1-5].c: New tests.
+
+2002-10-14 Richard Henderson <rth@redhat.com>
+
+ * gcc.dg/20020219-1.c: Disable for 16-bit targets.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ PR optimization/6631
+ * g++.dg/opt/const2.C: New test.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7176
+ * g++.dg/parse/friend1.C: New test.
+ * g++.old-deja/g++.pt/memtemp64.C: Adjust.
+
+2002-10-14 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/20021014-1.c: New test.
+
+2002-10-11 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/5661
+ * g++.dg/ext/vlm1.C: New test.
+ * g++.dg/ext/vlm2.C: Likewise.
+
+ * g++.dg/init/array1.C: Remove invalid braces.
+ * g++.dg/init/brace1.C: New test.
+ * g++.dg/init/copy2.C: Likewise.
+ * g++.dg/init/copy3.C: Likewise.
+ * g++.old-deja/g++.ext/arrnew.C: Change WARNING to ERROR.
+ * g++.old-deja/g++.mike/p9129.C: Add ERROR on invalid use of
+ braces.
+
+2002-10-11 Neil Booth <neil@daikokuya.co.uk>
+
+ * gcc.dg/cpp/assembler.S: Don't use -ansi.
+
+Fri Oct 11 10:56:49 2002 Richard Shann <richard.shann@superh.com>
+
+ * gcc.c-torture/compile/simd-5.c: New test.
+
+2002-10-10 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.c-torture/execute/shiftopt-1.c: New test case.
+
+2002-10-10 Jim Wilson <wilson@redhat.com>
+
+ * gcc.c-torture/execute/20021010-1.c: New test.
+
+2002-10-09 Zack Weinberg <zack@codesourcery.com>
+
+ PR c/7353
+ * g++.dg/ext/typedef-init.C: New test.
+ * gcc.dg/typedef-init.c: New test.
+
+2002-10-09 Neil Booth <neil@daikokuya.co.uk>
+
+ * gcc.dg/cpp/paste13.c: New test.
+
+2002-10-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.c-torture/execute/20020720-1.x: Take out sparc XFAILs. For
+ remaining platforms, XFAIL during compile, not execute. Don't
+ XFAIL at -O0.
+
+2002-10-08 Nathan Sidwell <nathan@codesourcery.com>
+
+ * gcc.dg/alias-1.c: Tweak expected warning.
+
+2002-10-06 D.Venkatasubramanian <dvenkat@noida.hcltech.com>
+
+ * gcc.dg/20020411-1.c: Disable for 16-bit "int".
+
+2002-10-06 Andreas Jaeger <aj@suse.de>
+
+ * gcc.dg/cpp/c++98-pedantic.C: Moved to g++.dg/cpp.
+ * gcc.dg/cpp/c++98.C: Likewise.
+
+ * g++.dg/cpp/c++98-pedantic.C: Moved from gcc.dg/cpp to here.
+ * g++.dg/cpp/c++98.C: Likewise.
+
+ * g++.dg/README (Subdirectories): Mention cpp directory.
+
+ PR target/7559
+ * gcc.dg/20021006-1.c: New test.
+
+2002-10-05 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/7804
+ * g++.dg/other/warning1.C: New test.
+
+2002-10-04 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.c-torture/execute/20020720-1.x: XFAIL instead of skipping
+ the test on failing platforms. Mark sparcv9-*-*, sparc64-*-*
+ and sparc-*-* with -m64 as expected failures. See PR 8087.
+
+2002-10-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7931
+ * g++.dg/template/ptrmem3.C: New test.
+
+ PR c++/7754
+ * g++.dg/template/union1.C: New test.
+
+2002-10-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/8006
+ * g++.dg/abi/mangle9.C: New test.
+ * g++.dg/abi/mangle10.C: New test.
+ * g++.dg/abi/mangle11.C: New test.
+ * g++.dg/abi/mangle12.C: New test.
+
+2002-10-02 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/7188.
+ * g++.dg/template/meminit1.C: New test.
+ * g++.dg/warn/Wreorder-1.C: Likewise.
+ * g++.old-deja/g++.mike/warn3.C: Tweak.
+ * lib/prune.exp: Ingore "in copy constructor".
+
+2002-10-02 Andreas Jaeger <aj@suse.de>
+
+ * gcc.dg/20020919-1.c, gcc.dg/inline-2.c, gcc.dg/980211-1.c,
+ gcc.dg/20020103-1.c, gcc.dg/20000614-2.c,
+ g++.old-deja/g++.pt/asm1.C, g++.old-deja/g++.other/asm3.C: Enable
+ on x86-64.
+
+2002-10-01 Mark Mitchell <mark@codesourcery.com>
+
+ * gcc.dg/empty1.C: Fix typo.
+
+2002-10-01 Nathan Sidwell <nathan@codesourcery.com>
+
+ * gcc.dg/alias-1.c: New test.
+
+2002-10-01 Mark Mitchell <mark@codesourcery.com>
+
+ * gcc.dg/empty1.C: New test.
+
+ * g++.dg/tls/init-2.C: Tweak error messages.
+
+2002-10-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * gcc.c-torture/compile/20020923-1.c: New test.
+
+2002-09-30 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * gcc.c-torture/execute/ffs-1.c: New test.
+ * gcc.c-torture/execute/ffs-2.c: Ditto.
+
+2002-09-30 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/overload/member1.C: New test.
+
+2002-09-30 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/abi/empty7.C: New test.
+ * g++.dg/init/pm2.C: Likewise.
+
+2002-09-29 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/rtti/crash1.C: New test.
+
+2002-09-29 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * gcc.dg/sibcall-1.c, gcc.dg/sibcall-2.c, gcc.dg/sibcall-3.c,
+ gcc.dg/sibcall-4.c: New tests.
+
+2002-09-28 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.c-torture/execute/20020720-1.x: No longer skip test on
+ powerpc and MMIX targets.
+
+2002-09-27 Zack Weinberg <zack@codesourcery.com>
+
+ * gcc.dg/cpp/20020927-1.c: New.
+
+2002-09-26 David S. Miller <davem@redhat.com>
+
+ * gcc.c-torture/compile/trunctfdf.c: New.
+
+2002-09-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * lib/target-supports.exp (check_weak_available): Handle solaris2.
+
+2002-09-27 Alan Modra <amodra@bigpond.net.au>
+
+ * gcc.c-torture/execute/loop-15.c: New.
+
+2002-09-26 Janis Johnson <janis187@us.ibm.com>
+
+ * README.QMTEST: Fix typo.
+
+2002-09-26 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * gcc.dg/20020926-1.c: New test.
+
+2002-09-25 David S. Miller <davem@redhat.com>
+
+ PR target/7842
+ * gcc.c-torture/execute/shiftdi.c: New test.
+
+2002-09-26 Richard Earnshaw <rearnsha@arm.com>
+
+ * lib/gcc.exp (gcc_init): Use a filename for the testglue that is
+ unique to the tool.
+ * lib/g77.exp (g77_init): Likewise.
+ * lib/g++.exp (g++_init): Likewise.
+ * lib/objc.exp (objc_init): Likewise.
+
+2002-09-25 Mark Mitchell <mark@codesourcery.com>
+
+ * gcc/testsuite/g++.dg/abi/empty5.C: New test.
+ * gcc/testsuite/g++.dg/abi/empty6.C: New test.
+ * gcc/testsuite/g++.dg/abi/vbase12.C: New test.
+
+2002-09-25 Richard Henderson <rth@redhat.com>
+
+ * gcc.c-torture/execute/ieee/20010226-1.c: Early exit for
+ too-small long double.
+
+2002-09-23 Hans-Peter Nilsson <hp@axis.com>
+
+ * gcc.dg/20020919-1.c: New test.
+
+2002-09-23 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/abi/bitfield6.C: New test.
+ * g++.dg/abi/bitfield7.C: New test.
+ * g++.dg/abi/bitfield8.C: New test.
+ * g++.dg/abi/vbase11.C: New test.
+
+2002-09-22 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * gcc.dg/20020219-1.c: Add "-mdisable-indexing" option for target
+ hppa*-*-hpux*. Update test comment.
+
+2002-09-20 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/tls/struct-1.c: New test.
+
+2002-09-20 Neil Booth <neil@daikokuya.co.uk>
+
+ * gcc.dg/cpp/tr-warn2.c: Update.
+
+2002-09-20 Richard Earnshaw <rearnsha@arm.com>
+
+ * gcc.c-torture/execute/20020720-1.x: Skip test on ARM-based systems.
+
+2002-09-20 Richard Earnshaw <rearnsha@arm.com>
+
+ * gcc.c-torture/execute/990208-1.x: XFAIL this at -O3 for ARM-based
+ systems.
+
+2002-09-20 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * gcc.c-torture/execute/ieee/mzero3.c: New test.
+
+ * lib/scanasm.exp (scan-assembler-dem, scan-assembler-dem-not):
+ Adjust for c++filt moved to binutils. Remove spurious duplicate
+ setting of cxxfilt.
+
+2002-09-19 Geoffrey Keating <geoffk@apple.com>
+
+ * gcc.dg/20020312-2.c: Update for darwin.
+
+2002-09-18 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.old-deja/g++.other/crash32.C: Mark ICE.
+
+Tue Sep 17 13:59:45 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * objc.dg/comp-types-1.m: New test.
+ * objc.dg/comp-types-2.m: New test.
+ * objc.dg/comp-types-3.m: New test.
+ * objc.dg/comp-types-4.m: New test.
+ * objc.dg/comp-types-5.m: New test.
+ * objc.dg/comp-types-6.m: New test.
+
+2002-09-17 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * gcc.c-torture/execute/strct-stdarg-1.x: Remove file.
+
+2002-09-16 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/other/do1.C: New test.
+
+ * g++.dg/template/subst1.C: New test.
+
+2002-09-16 Steve Ellcey <sje@cup.hp.com>
+
+ * gcc.dg/20020312-2.c: Change __parisc__ to __hppa__.
+
+2002-09-16 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/template/qualttp20.C: Adjust expected errors.
+ * g++.old-deja/g++.jason/report.C: Likewise.
+ * g++.old-deja/g++.other/qual1.C: Likewise.
+
+ * g++.dg/lookup/scoped2.C: New test.
+
+ * g++.dg/ext/asm3.C: New test.
+
+2002-09-16 Richard Earnshaw <rearnsha@arm.com>
+
+ * objc.dg/bitfield-2.m (dg-options): Add -fsigned-char.
+
+2002-09-16 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: follow spelling conventions.
+ * g++.old-deja/g++.abi/ptrmem.C: Likewise.
+ * g++.old-deja/g++.bugs/900210_05.C: Likewise.
+ * g++.old-deja/g++.bugs/900211_04.C: Likewise.
+ * g++.old-deja/g++.bugs/900321_02.C: Likewise.
+ * g++.old-deja/g++.bugs/900404_02.C: Likewise.
+ * g++.old-deja/g++.bugs/900520_06.C: Likewise.
+ * g++.old-deja/g++.law/global-init1.C: Likewise.
+ * g++.old-deja/g++.other/delete4.C: Likewise.
+ * g++.old-deja/g++.other/inline21.C: Likewise.
+ * g++.old-deja/g++.other/singleton.C: Likewise.
+ * g77.dg/strlen0.f: Likewise.
+ * g77.f-torture/compile/20010519-1.f: Likewise.
+ * g77.f-torture/compile/980310-4.f: Likewise.
+ * gcc.c-torture/compile/20000605-1.c: Likewise.
+ * gcc.c-torture/execute/20020225-1.c: Likewise.
+ * gcc.dg/c90-hexfloat-2.c: Likewise.
+ * gcc.dg/c99-bool-1.c: Likewise.
+ * gcc.dg/c99-hexfloat-2.c: Likewise.
+ * gcc.dg/dll-2.c: Likewise.
+ * gcc.dg/wtr-union-init-1.c: Likewise.
+ * gcc.dg/wtr-union-init-2.c: Likewise.
+ * gcc.dg/wtr-union-init-3.c: Likewise.
+ * gcc.dg/cpp/avoidpaste1.c: Likewise.
+ * gcc.dg/cpp/defined.c: Likewise.
+ * gcc.dg/cpp/macsyntx.c: Likewise.
+ * gcc.dg/cpp/paste2.c: Likewise.
+ * gcc.dg/cpp/trad/defined.c: Likewise.
+ * gcc.dg/format/c90-printf-1.c: Likewise.
+ * gcc.dg/format/c90-scanf-1.c: Likewise.
+ * gcc.dg/format/c99-printf-1.c: Likewise.
+ * gcc.dg/format/c99-scanf-1.c: Likewise.
+ * gcc.misc-tests/gcov-8.c: Likewise.
+ * lib/profopt.exp: Likewise.
+
+2002-09-15 Krister Walfridsson <cato@df.lth.se>
+
+ * lib/old-dejagnu.exp (old-dejagnu) Improve test for ICE.
+
+2002-09-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/inherit/using2.C: New test.
+
+2002-09-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ * ChangeLog: Follow spelling conventions.
+ * g++.dg/template/friend4.C: Likewise.
+ * g++.old-deja/g++.pt/crash67.C: Likewise.
+ * gcc.c-torture/execute/20000801-4.c: Likewise.
+ * gcc.dg/c90-digraph-1.c: Likewise.
+ * gcc.dg/c94-digraph-1.c: Likewise.
+ * gcc.dg/c99-digraph-1.c: Likewise.
+ * gcc.dg/cpp/line5.c: Likewise.
+ * gcc.dg/cpp/multiline.c: Likewise.
+ * gcc.dg/cpp/trad/literals-1.c: Likewise.
+ * gcc.dg/format/attr-3.c: Likewise.
+ * gcc.dg/format/c90-scanf-3.c: Likewise.
+ * gcc.dg/format/ext-4.c: Likewise.
+
+2002-09-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/template/pretty1.C: New test.
+
+2002-09-14 Alan Modra <amodra@bigpond.net.au>
+
+ * gcc.c-torture/execute/struct-cpy-1.c: New test.
+
+2002-09-13 Matt Austern <austern@apple.com>
+
+ * testsuite/g++.dg/other/constref[12].C: New, regression tests for
+ passing a cast expression to a function by const reference.
+
+2002-09-13 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/template/deduce1.C: New test.
+
+2002-09-13 Kazu Hirata <kazu@cs.umass.edu>
+
+ * gcc.c-torture/execute/simd-1.c: Force all use of int to
+ 32-bit int.
+
+2002-09-10 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * gcc.dg/struct-ret-1.c: Add prototype for exit function and correct
+ usage.
+
+2002-09-10 Richard Earnshaw <rearnsha@arm.com>
+
+ * gcc.c-torture/compile/20020910-1.c: New test.
+
+2002-09-10 Frank Ch. Eigler <fche@redhat.com>
+
+ * gcc.c-torture/execute/20010915-1.c: Correct typo in abort call.
+
+2002-09-10 Andreas Jaeger <aj@suse.de>
+
+ * gcc.dg/20020312-2.c: Adjust for x86-64.
+
+2002-09-08 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * g77.dg/7388.f: New test case for PR 7388.
+
+2002-09-07 Ansgar Esztermann <ansgar@thphy.uni-duesseldorf.de>
+
+ * gcc.dg/compare2.c: Remove xfail from cases 10 and 12.
+
+2002-09-05 Ziemowit Laski <zlaski@apple.com>
+
+ * objc.dg/proto-lossage-1.m: New test.
+
+2002-09-06 Neil Booth <neil@daikokuya.co.uk>
+
+ * gcc.dg/cpp/_Pragma4.c: Fix typo.
+
+Fri Sep 6 16:39:37 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * objc/execute/formal_protocol-6.x: Removed. This testcase is now
+ expected to pass.
+
+2002-09-06 Stan Shebs <shebs@apple.com>
+ David Edelsohn <edelsohn@gnu.org>
+
+ * gcc.dg/weak: New directory.
+ * gcc.dg/weak-[1-9].c: Move to new directory, remove all
+ target-specific xfail bits.
+ * gcc.dg/typeof-2.c: Move to new directory.
+ * gcc.dg/weak.exp: New expect script.
+
+2002-09-06 Alan Modra <amodra@bigpond.net.au>
+
+ * gcc.c-torture/execute/extzvsi.c: New test.
+
+2002-09-05 Stan Shebs <shebs@apple.com>
+
+ * gcc.dg/weak-1.c: xfail on Darwin.
+ * gcc.dg/weak-2.c: Ditto.
+ * gcc.dg/weak-3.c: Ditto.
+ * gcc.dg/weak-4.c: Ditto.
+ * gcc.dg/weak-5.c: Ditto.
+ * gcc.dg/weak-6.c: Ditto.
+ * gcc.dg/weak-7.c: Ditto.
+ * gcc.dg/weak-8.c: Ditto.
+ * gcc.dg/weak-9.c: Ditto.
+
+Thu Sep 5 00:34:33 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * gcc.c-torture/execute/loop-14.c: New test.
+
+2002-09-04 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.dg/other/cxa-atexit1.C: New test.
+
+ * gcc.dg/typeof-2.c: New test.
+
+2002-09-03 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.dg/builtins-2.c: New testcase.
+ * gcc.dg/builtins-3.c: New testcase.
+
+2002-09-03 Neil Booth <neil@daikokuya.co.uk>
+
+ * gcc.dg/cpp/_Pragma4.c: New test.
+
+Tue Sep 3 11:04:26 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * objc/execute/nil_method-1.m: New testcase.
+
+Sun Sep 1 12:47:39 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * objc/execute/class-tests-1.h (test_class_with_superclass): Call
+ [Object class], not [Object initialize].
+
+2002-08-31 Roger Sayle <roger@eyesopen.com>
+ Hans-Peter Nilsson <hp@bitrange.com>
+
+ * gcc.c-torture/execute/20020720-1.x: Skip test on
+ mmix-knuth-mmixware. Correct comment.
+
+2002-08-27 Mark Mitchell <mark@codesourcery.com>
+
+ * testsuite/g++.dg/abi/bitfield5.C: New test.
+ * testsuite/g++.dg/abi/vbase10.C: Likewise.
+
+Tue Aug 27 22:23:22 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * objc.dg/undeclared-selector.m: New test.
+
+2002-08-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/other/offsetof1.C: Avoid cast warning.
+
+2002-08-26 Ziemowit Laski <zlaski@apple.com>
+
+ * objc.dg/super-class-2.m: New test.
+
+2002-08-24 Matt Austern <austern@apple.com>
+
+ * g++.dg/ext/lvaddr.C: New test.
+ * g++.dg/ext/lvcast.C: New test.
+
+2002-08-22 Mark Mitchell <mark@codesourcery.com>
+
+ * testsuite/g++.dg/inherit/cond1.C: New test.
+
2002-08-22 Geoffrey Keating <geoffk@redhat.com>
* gcc.dg/noncompile/incomplete-1.c: New test.
@@ -8,7 +688,7 @@
2002-08-20 Devang Patel <dpatel@apple.com>
* objc.dg/proto-hier-2.m: New test.
-
+
2002-08-19 Ziemowit Laski <zlaski@apple.com>
* objc.dg/bitfield-1.m: New test.
@@ -59,7 +739,7 @@
2002-08-08 Devang Patel <dpatel@apple.com>
* objc.dg/selector-1.m : New test
-
+
2002-08-08 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/abi/bitfield4.C: New test.
@@ -73,7 +753,7 @@
* g++.dg/abi/offsetof.C: Tweak error messages.
* g++.old-deja/g++.mike/p10769a.C: Likewise.
-
+
2002-08-08 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/bitfld-3.c: New test.
@@ -93,7 +773,7 @@
2002-08-06 Aldy Hernandez <aldyh@redhat.com>
- * testsuite/gcc.dg/tls/diag-3.c: New.
+ * testsuite/gcc.dg/tls/diag-3.c: New.
2002-08-07 Gabriel Dos Reis <gdr@nerim.net>
@@ -138,7 +818,7 @@
2002-08-01 Benjamin Kosnik <bkoz@redhat.com>
- * g++.old-deja/g++.abi/ptrflags.C (expect): Change
+ * g++.old-deja/g++.abi/ptrflags.C (expect): Change
__qualifier_flags to __flags.
2002-07-31 Mark Mitchell <mark@codesourcery.com>
@@ -147,11 +827,11 @@
* g++.dg/lookup/disamb1.C: Fix typo in comment.
* g++.dg/other/error1.C: Change expected error message.
* g++.dg/template/conv4.C: Likewise.
-
+
2002-07-26 Neil Booth <neil@daikokuya.cop.uk>
* gcc.dg/cpp/trad/Wunused.c, gcc.dg/cpp/Wunused.c: Add test
- for documented behaviour.
+ for documented behavior.
2002-07-25 Roger Sayle <roger@eyesopen.com>
@@ -173,7 +853,7 @@
2002-07-24 Richard Henderson <rth@redhat.com>
* gcc.c-torture/execute/loop-2e.c: Rewrite for 64 bit and no mmap.
-
+
2002-07-24 Gabriel Dos Reis <gdr@nerim.net>
* g++.dg/ext/alignof1.C (main): Return 0 for success.
@@ -1922,7 +2602,7 @@ Thu Mar 7 10:05:31 2002 Jeffrey A Law (law@redhat.com)
* lib/prune.exp: Remove "In (program|subroutine"block-data)"
message from g77
* lib/g77-dg.exp: Trim g77 error messages so that they are
- recognised by dg.exp.
+ recognized by dg.exp.
2002-02-07 David Billinghurst <David.Billinghurst@riotinto.com>
@@ -2582,7 +3262,7 @@ Wed Jan 9 14:03:20 2002 Jeffrey A Law (law@redhat.com)
2001-12-28 Jakub Jelinek <jakub@redhat.com>
- * gcc.dg/gnu89-init-1.c: Adjust for the new behaviour, add some
+ * gcc.dg/gnu89-init-1.c: Adjust for the new behavior, add some
additional tests.
2001-12-27 Roger Sayle <roger@eyesopen.com>
@@ -6528,7 +7208,7 @@ Mon Oct 9 23:32:06 MET DST 2000 Jan Hubicka <jh@suse.cz>
* gcc.c-torture/execute/divmod-1.c (mod5): New function - perform
a signed long modulo operation.
- (mod6): New funciton - perform an unsigned long modulo operation.
+ (mod6): New function - perform an unsigned long modulo operation.
(main): Add tests for modulos of very large numbers by very small
dividends.
diff --git a/gcc/testsuite/README.QMTEST b/gcc/testsuite/README.QMTEST
index 1e44d939e2e..555b11aa5f4 100644
--- a/gcc/testsuite/README.QMTEST
+++ b/gcc/testsuite/README.QMTEST
@@ -81,7 +81,7 @@ You must download and install the following software:
This package is available from:
- ftp://ftp.codesourcery.com/pub/qmtest/qmtest/qmtc/qmtc-<version>.tar.gz
+ ftp://ftp.codesourcery.com/pub/qmtest/qmtc/qmtc-<version>.tar.gz
See the file called INSTALL in the distribution.
diff --git a/gcc/testsuite/README.compat b/gcc/testsuite/README.compat
new file mode 100644
index 00000000000..da2340a9050
--- /dev/null
+++ b/gcc/testsuite/README.compat
@@ -0,0 +1,72 @@
+Compatibility test suites that use lib/compat.exp test interoperability
+of two compilers that follow the same ABI, or of multiple sets of
+compiler options that are not intended to affect binary compatibility.
+They do not test conformance to a formal ABI; they check that things are
+done consistently, not that they are done correctly. They are meant to
+complement ABI test suites, not to replace them.
+
+Each test in these suites splits up functionality into two source files
+that can be compiled with two different versions of GCC and with two
+sets of compiler options.
+
+ Override the default pairs of compiler options (from compat.exp) by
+ defining the environment variable COMPAT_OPTIONS as:
+ COMPAT_OPTIONS="[list [list {tst1} {alt1}]...[list {tstn} {altn}]]"
+ where tsti and alti are lists of options, with "tsti" used by the
+ compiler under test and "alti" used by the alternate compiler. The
+ characters "[", "{", "}", and "]" are really in the string, as in
+ "[list [list {-g} {-O3}] [list {-O3} {-g}]]".
+
+ To use an alternate compiler, define the environment variable for the
+ language you're testing; e.g., for C++ define ALT_CXX_UNDER_TEST to be
+ the full pathname of an installed compiler. That will be written to
+ the site.exp file used by DejaGNU. The default is to build each test
+ with the compiler under test using the first of each pair of compiler
+ options from COMPAT_OPTIONS. When ALT_CXX_UNDER_TEST is "same", each
+ test is built using the compiler under test but with combinations of
+ the options from COMPAT_OPTIONS.
+
+A test that fails when the pieces are compiled with different compilers
+but passes when the pieces are compiled with the same compiler
+demonstrates incompatibility of the generated code or runtime support.
+A test that fails for the alternate compiler but passes for the compiler
+under test probably tests for a fix that is not present in the alternate
+compiler.
+
+There's a lot more that can be done with these tests.
+
+ Increase the robustness of the existing tests:
+
+ - recognize target triples in dg-options strings in test files
+
+ - continue to split up tests that rely on language runtime support
+ and add them to this set of tests
+
+ - make sure they work for testing with a simulator
+
+ - multilibs support?
+
+ Build test pieces into more combinations that will be likely to find
+ unusual errors:
+
+ - link using the alternate compiler; this requires support for
+ LD_LIBRARY_PATH for the alternate compiler in the support for each
+ language
+
+ - build pieces of the test into shared libraries; this requires
+ support for LD_LIBRARY_PATH for the alternate compiler, and
+ knowledge about how to build a shared library for each target
+
+ - build pieces of the test into static libraries; this requires
+ knowledge about how to build a static library for each target
+
+ Continue to add tests to g++.dg/compat, based on existing tests for
+ language runtime support and for test cases in PRs that didn't used to
+ fit into the test suite.
+
+ Set up similar tests in libstdc++-v3/testsuite.
+
+ Set up similar tests for additional languages and libraries.
+
+Janis Johnson, <janis187@us.ibm.com>
+October 2002
diff --git a/gcc/testsuite/g++.dg/README b/gcc/testsuite/g++.dg/README
index 073913f2056..07e7572a71d 100644
--- a/gcc/testsuite/g++.dg/README
+++ b/gcc/testsuite/g++.dg/README
@@ -1,6 +1,8 @@
Subdirectories:
abi Tests for ABI compatibility -- mangling, object layout, etc.
+compat Tests for binary compatibility (consistency, not ABI conformance)
+cpp Tests for the preprocessor.
eh Tests for exception handling.
expr Tests for expressions.
ext Tests for GNU language extensions.
diff --git a/gcc/testsuite/g++.dg/abi/bitfield5.C b/gcc/testsuite/g++.dg/abi/bitfield5.C
new file mode 100644
index 00000000000..eed76e649e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield5.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+struct A {
+ virtual void f();
+ int f1 : 1;
+};
+
+struct B : public A {
+ int f2 : 1; // { dg-warning "ABI" }
+ int : 0;
+ int f3 : 4;
+ int f4 : 3;
+};
diff --git a/gcc/testsuite/g++.dg/abi/bitfield6.C b/gcc/testsuite/g++.dg/abi/bitfield6.C
new file mode 100644
index 00000000000..50f76ab824b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield6.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-w -fabi-version=0" }
+
+#include <limits>
+
+union U {
+ int i: 4096;
+};
+
+int main () {
+ if (sizeof (U) * std::numeric_limits<unsigned char>::digits != 4096)
+ return 1;
+}
+
diff --git a/gcc/testsuite/g++.dg/abi/bitfield7.C b/gcc/testsuite/g++.dg/abi/bitfield7.C
new file mode 100644
index 00000000000..9868cfce198
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield7.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+union U { // { dg-warning "ABI" }
+ int i: 4096; // { dg-warning "exceeds" }
+};
+
diff --git a/gcc/testsuite/g++.dg/abi/bitfield8.C b/gcc/testsuite/g++.dg/abi/bitfield8.C
new file mode 100644
index 00000000000..8195fda631d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/bitfield8.C
@@ -0,0 +1,20 @@
+// { dg-do run { target i?86-*-* } }
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ virtual void f() {}
+ int f1 : 1;
+};
+
+struct B : public A {
+ int f2 : 31;
+ int f3 : 4;
+ int f4 : 3;
+};
+
+int main ()
+{
+ if (sizeof (B) != 16)
+ return 1;
+}
+
diff --git a/gcc/testsuite/g++.dg/abi/empty5.C b/gcc/testsuite/g++.dg/abi/empty5.C
new file mode 100644
index 00000000000..c3717727e21
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty5.C
@@ -0,0 +1,17 @@
+// { dg-options "-fabi-version=0" }
+
+struct A {};
+
+struct B {
+ A a;
+ virtual void f () {}
+};
+
+struct C : public B, public A {};
+
+C c;
+
+int main () {
+ if ((void*) (A*) &c != &c)
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/abi/empty6.C b/gcc/testsuite/g++.dg/abi/empty6.C
new file mode 100644
index 00000000000..aa272733987
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty6.C
@@ -0,0 +1,8 @@
+// { dg-options "-Wabi" }
+
+struct A {};
+
+struct B {
+ A a; // { dg-warning "empty" }
+ virtual void f () {}
+};
diff --git a/gcc/testsuite/g++.dg/abi/empty7.C b/gcc/testsuite/g++.dg/abi/empty7.C
new file mode 100644
index 00000000000..4b1ac3b2c2c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty7.C
@@ -0,0 +1,18 @@
+// { dg-do run { target i?86-*-* } }
+// { dg-options "-fabi-version=0" }
+
+struct S1 {};
+struct S2 { virtual void f () {} S1 s1[4]; };
+struct S3 : virtual public S2 {};
+struct S4 : virtual public S2 { int i; };
+struct S5 : public S3, virtual public S4 {};
+struct S6 { S5 s5; };
+struct S7 { S1 s1[5]; };
+struct S8 : public S1, public S6, virtual public S7 { };
+
+S8 s8;
+
+int main () {
+ if ((char *)(S7 *)&s8 - (char *)&s8 != 24)
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/abi/empty8.C b/gcc/testsuite/g++.dg/abi/empty8.C
new file mode 100644
index 00000000000..a5287b15fa0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/empty8.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-fabi-version=0" }
+
+struct E1 {};
+struct E2 : public E1 {};
+struct S1 { int i; };
+struct S2 : public S1, E2 {};
+
+S2 s2;
+
+int main () {
+ if ((char *)(E2*) &s2 != (char *)&s2)
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/abi/mangle10.C b/gcc/testsuite/g++.dg/abi/mangle10.C
new file mode 100644
index 00000000000..d5782ba6dfc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle10.C
@@ -0,0 +1,13 @@
+// { dg-options "-fabi-version=0" }
+
+template <template <typename> class Q>
+void f (typename Q<int>::X) {}
+
+template <typename Q>
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int);
+
+// { dg-final { scan-assembler _Z1fI1SEvNT_IiE1XE } }
diff --git a/gcc/testsuite/g++.dg/abi/mangle11.C b/gcc/testsuite/g++.dg/abi/mangle11.C
new file mode 100644
index 00000000000..f7151171d30
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle11.C
@@ -0,0 +1,10 @@
+// { dg-options "-Wabi" }
+
+template <typename Q>
+void f (typename Q::X) {}
+
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int); // { dg-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle12.C b/gcc/testsuite/g++.dg/abi/mangle12.C
new file mode 100644
index 00000000000..772b58b7a39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle12.C
@@ -0,0 +1,11 @@
+// { dg-options "-Wabi" }
+
+template <template <typename> class Q>
+void f (typename Q<int>::X) {}
+
+template <typename Q>
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int); // { dg-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle13.C b/gcc/testsuite/g++.dg/abi/mangle13.C
new file mode 100644
index 00000000000..716c4c36f41
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle13.C
@@ -0,0 +1,28 @@
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ template <typename T> int f ();
+ int operator+();
+ operator int ();
+ template <typename T>
+ int operator-();
+};
+
+typedef int (A::*P)();
+
+template <P> struct S {};
+
+template <typename T> void g (S<&T::template f<int> >) {}
+template <typename T> void g (S<&T::operator+ >) {}
+template <typename T> void g (S<&T::operator int>) {}
+template <typename T> void g (S<&T::template operator- <double> >) {}
+
+template void g<A> (S<&A::f<int> >);
+template void g<A> (S<&A::operator+>);
+template void g<A> (S<&A::operator int>);
+template void g<A> (S<&A::operator-<double> >);
+
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_1fIiEEE } }
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_plEE } }
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_cviEE } }
+// { dg-final { scan-assembler _Z1gI1AEv1SIXadsrT_miIdEEE } }
diff --git a/gcc/testsuite/g++.dg/abi/mangle14.C b/gcc/testsuite/g++.dg/abi/mangle14.C
new file mode 100644
index 00000000000..8e2bfddde76
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle14.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+struct A {
+ template <typename T> int f ();
+};
+
+typedef int (A::*P)();
+
+template <P> struct S {};
+
+void g (S<&A::f<int> >) {} // { dg-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle15.C b/gcc/testsuite/g++.dg/abi/mangle15.C
new file mode 100644
index 00000000000..3c112e263f0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle15.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=0" }
+
+struct A {
+ template <typename T> int f ();
+};
+
+typedef int (A::*P)();
+
+template <P> struct S {};
+
+void g (S<&A::f<int> >) {}
+
+// { dg-final { scan-assembler _Z1g1SIXadL_ZN1A1fIiEEivEEE } }
diff --git a/gcc/testsuite/g++.dg/abi/mangle16.C b/gcc/testsuite/g++.dg/abi/mangle16.C
new file mode 100644
index 00000000000..1f3039f8682
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle16.C
@@ -0,0 +1,18 @@
+// { dg-options "-fabi-version=0" }
+
+enum E { e = 3 };
+
+template <int I> struct S {};
+
+template <int I> void f (S<e + 1>) {}
+template void f<7>(S<e + 1>);
+
+template <int I> void g (S<e>) {}
+template void g<7>(S<e>);
+
+template <int I> void h (S<I + 1>) {}
+template void h<7>(S<7 + 1>);
+
+// { dg-final { scan-assembler _Z1fILi7EEv1SILi4EE } }
+// { dg-final { scan-assembler _Z1gILi7EEv1SILi3EE } }
+// { dg-final { scan-assembler _Z1hILi7EEv1SIXplT_Li1EEE } }
diff --git a/gcc/testsuite/g++.dg/abi/mangle17.C b/gcc/testsuite/g++.dg/abi/mangle17.C
new file mode 100644
index 00000000000..1da6dea632b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle17.C
@@ -0,0 +1,11 @@
+// { dg-options "-Wabi" }
+
+enum E { e = 3 };
+
+template <int I> struct S {};
+
+template <int I> void f (S<e + int (3.7)>) {}
+template void f<7>(S<e + int (3.7)>); // { dg-warning "mangle" }
+
+template <int I> void g (S<e + int (3.7)>) {}
+template void g<7>(S<e + int (3.7)>); // { dg-warning "mangle" }
diff --git a/gcc/testsuite/g++.dg/abi/mangle9.C b/gcc/testsuite/g++.dg/abi/mangle9.C
new file mode 100644
index 00000000000..f3ededfb4d0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle9.C
@@ -0,0 +1,12 @@
+// { dg-options "-fabi-version=0" }
+
+template <typename Q>
+void f (typename Q::X) {}
+
+struct S {
+ typedef int X;
+};
+
+template void f<S> (int);
+
+// { dg-final { scan-assembler _Z1fI1SEvNT_1XE } }
diff --git a/gcc/testsuite/g++.dg/abi/vbase10.C b/gcc/testsuite/g++.dg/abi/vbase10.C
new file mode 100644
index 00000000000..3c110be7188
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vbase10.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-Wabi" }
+
+struct A { virtual void f(); char c1; };
+struct B { B(); char c2; };
+struct C : public A, public virtual B {}; // { dg-warning "ABI" }
+
diff --git a/gcc/testsuite/g++.dg/abi/vbase11.C b/gcc/testsuite/g++.dg/abi/vbase11.C
new file mode 100644
index 00000000000..375577365a3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vbase11.C
@@ -0,0 +1,12 @@
+// { dg-do run { target i?86-*-* } }
+// { dg-options "-fabi-version=0" }
+
+struct A { virtual void f(); char c1; };
+struct B { B(); char c2; };
+struct C : public A, public virtual B { };
+
+int main () {
+ if (sizeof (C) != 8)
+ return 1;
+}
+
diff --git a/gcc/testsuite/g++.dg/abi/vbase12.C b/gcc/testsuite/g++.dg/abi/vbase12.C
new file mode 100644
index 00000000000..98b9054f05e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/vbase12.C
@@ -0,0 +1,14 @@
+// { dg-do run }
+// { dg-options "-fabi-version=0" }
+
+struct A {};
+struct B { A a; virtual void f () {} };
+struct C : public B, virtual public A {};
+struct D : public C, virtual public A {};
+
+D d;
+
+int main () {
+ if (((char*)(A*)&d - (char*)&d) != 0)
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1.h b/gcc/testsuite/g++.dg/compat/abi/bitfield1.h
new file mode 100644
index 00000000000..09d64162ff3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1.h
@@ -0,0 +1,10 @@
+typedef int Int;
+typedef signed int SInt;
+typedef unsigned int UInt;
+
+struct A
+{
+ SInt bitS : 1; // signed
+ UInt bitU : 1; // unsigned
+ Int bit : 1; // signedness by -f{signed,unsigned}-bitfields
+};
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
new file mode 100644
index 00000000000..cdb7a45a744
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
@@ -0,0 +1,13 @@
+// { dg-options "-ansi -pedantic-errors -funsigned-bitfields" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+extern void bitfield1_x (void);
+
+int
+main ()
+{
+ bitfield1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C
new file mode 100644
index 00000000000..1447655a33e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C
@@ -0,0 +1,14 @@
+#include "bitfield1.h"
+
+extern void bitfield1_y (A& a);
+
+void bitfield1_x ()
+{
+ A a;
+
+ a.bitS = 1;
+ a.bitU = 1;
+ a.bit = 1;
+
+ bitfield1_y (a);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C
new file mode 100644
index 00000000000..7ca5d4b3f51
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C
@@ -0,0 +1,13 @@
+extern "C" void abort (void);
+
+#include "bitfield1.h"
+
+void bitfield1_y (A& a)
+{
+ if (a.bitS != -1)
+ abort ();
+ if (a.bitU != 1)
+ abort ();
+ if (a.bit != 1)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2.h b/gcc/testsuite/g++.dg/compat/abi/bitfield2.h
new file mode 100644
index 00000000000..09d64162ff3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2.h
@@ -0,0 +1,10 @@
+typedef int Int;
+typedef signed int SInt;
+typedef unsigned int UInt;
+
+struct A
+{
+ SInt bitS : 1; // signed
+ UInt bitU : 1; // unsigned
+ Int bit : 1; // signedness by -f{signed,unsigned}-bitfields
+};
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C
new file mode 100644
index 00000000000..df74037b66b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C
@@ -0,0 +1,13 @@
+// { dg-options "-ansi -pedantic-errors -fsigned-bitfields" }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+extern void bitfield1_x (void);
+
+int
+main ()
+{
+ bitfield1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C
new file mode 100644
index 00000000000..1447655a33e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C
@@ -0,0 +1,14 @@
+#include "bitfield1.h"
+
+extern void bitfield1_y (A& a);
+
+void bitfield1_x ()
+{
+ A a;
+
+ a.bitS = 1;
+ a.bitU = 1;
+ a.bit = 1;
+
+ bitfield1_y (a);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C
new file mode 100644
index 00000000000..6119544db16
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C
@@ -0,0 +1,13 @@
+extern "C" void abort (void);
+
+#include "bitfield1.h"
+
+void bitfield1_y (A& a)
+{
+ if (a.bitS != -1)
+ abort ();
+ if (a.bitU != 1)
+ abort ();
+ if (a.bit != -1)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h
new file mode 100644
index 00000000000..aee0b6b49a5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h
@@ -0,0 +1,54 @@
+class C0
+{ public: int i0; };
+class C1
+ : public C0
+{ public: int i1; };
+class C2
+ : public C1
+ , virtual public C0
+{ public: int i2; };
+class C3
+ : public C1
+ , public C2
+ , virtual public C0
+{ public: int i3; };
+class C4
+ : virtual public C1
+ , virtual public C0
+ , virtual public C3
+ , public C2
+{ public: int i4; };
+class C5
+ : public C3
+ , virtual public C0
+ , virtual public C2
+{ public: int i5; };
+class C6
+ : public C1
+ , public C2
+ , virtual public C5
+ , virtual public C3
+ , virtual public C0
+{ public: int i6; };
+class C7
+ : public C1
+ , virtual public C5
+ , virtual public C4
+ , virtual public C2
+ , virtual public C0
+ , virtual public C6
+{ public: int i7; };
+class C8
+ : virtual public C4
+ , public C3
+ , public C0
+ , virtual public C7
+ , virtual public C6
+{ public: int i8; };
+class C9
+ : virtual public C0
+ , public C4
+ , public C8
+ , public C1
+ , public C6
+{ public: int i9; };
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C
new file mode 100644
index 00000000000..606c0fe2f93
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 10. Horribly complicated class hierarchy
+
+extern void vbase8_10_x (void);
+
+int
+main ()
+{
+ vbase8_10_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C
new file mode 100644
index 00000000000..18e78fcc59c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C
@@ -0,0 +1,49 @@
+#include "vbase8-10.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_10_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C
new file mode 100644
index 00000000000..1d6c8261668
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C
@@ -0,0 +1,63 @@
+extern "C" void abort (void);
+
+#include "vbase8-10.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h
new file mode 100644
index 00000000000..cd510e2ce85
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h
@@ -0,0 +1,54 @@
+class C0
+{ public: int i0; };
+class C1
+ : virtual public C0
+{ public: int i1; };
+class C2
+ : virtual public C1
+ , virtual public C0
+{ public: int i2; };
+class C3
+ : virtual public C2
+ , virtual public C1
+{ public: int i3; };
+class C4
+ : virtual public C2
+ , public C0
+ , public C1
+{ public: int i4; };
+class C5
+ : virtual public C0
+ , public C2
+ , virtual public C1
+ , virtual public C3
+ , virtual public C4
+{ public: int i5; };
+class C6
+ : virtual public C1
+ , virtual public C3
+ , public C0
+ , public C2
+ , virtual public C4
+{ public: int i6; };
+class C7
+ : virtual public C5
+ , public C2
+ , public C6
+ , virtual public C0
+ , public C3
+{ public: int i7; };
+class C8
+ : virtual public C5
+ , public C7
+ , virtual public C0
+ , virtual public C2
+ , virtual public C6
+{ public: int i8; };
+class C9
+ : virtual public C2
+ , virtual public C4
+ , public C1
+ , virtual public C0
+ , public C7
+ , public C5
+{ public: int i9; };
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C
new file mode 100644
index 00000000000..16a0a3cd3c7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 10. Horribly complicated class hierarchy
+
+extern void vbase8_21_x (void);
+
+int
+main ()
+{
+ vbase8_21_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C
new file mode 100644
index 00000000000..986fcfbe5e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C
@@ -0,0 +1,49 @@
+#include "vbase8-21.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_21_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C
new file mode 100644
index 00000000000..0bd76246d4d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C
@@ -0,0 +1,63 @@
+extern "C" void abort (void);
+
+#include "vbase8-21.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h
new file mode 100644
index 00000000000..e19e93eaead
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h
@@ -0,0 +1,59 @@
+class C0
+{ public: int i0; };
+class C1
+ : public C0
+{ public: int i1; };
+class C2
+ : public C1
+ , virtual public C0
+{ public: int i2; };
+class C3
+ : virtual public C0
+ , virtual public C2
+ , virtual public C1
+{ public: int i3; };
+class C4
+ : virtual public C2
+ , public C1
+ , virtual public C3
+ , public C0
+{ public: int i4; };
+class C5
+ : virtual public C0
+ , virtual public C4
+ , public C1
+ , virtual public C2
+ , virtual public C3
+{ public: int i5; };
+class C6
+ : public C0
+ , virtual public C1
+ , public C5
+ , public C2
+ , virtual public C3
+ , virtual public C4
+{ public: int i6; };
+class C7
+ : virtual public C1
+ , public C5
+ , virtual public C6
+ , virtual public C4
+ , virtual public C3
+ , virtual public C0
+{ public: int i7; };
+class C8
+ : virtual public C6
+ , virtual public C1
+ , virtual public C2
+ , public C3
+ , virtual public C4
+{ public: int i8; };
+class C9
+ : public C4
+ , virtual public C2
+ , virtual public C8
+ , public C3
+ , public C1
+ , public C6
+ , public C5
+{ public: int i9; };
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C
new file mode 100644
index 00000000000..6455a2efcb9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 22. Horribly complicated class hierarchy
+
+extern void vbase8_22_x (void);
+
+int
+main ()
+{
+ vbase8_22_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C
new file mode 100644
index 00000000000..5d3eacf7c90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C
@@ -0,0 +1,49 @@
+#include "vbase8-22.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_22_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C
new file mode 100644
index 00000000000..293ed100be4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C
@@ -0,0 +1,63 @@
+extern "C" void abort (void);
+
+#include "vbase8-22.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h
new file mode 100644
index 00000000000..b183fbe4f9b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h
@@ -0,0 +1,57 @@
+class C0
+{ public: int i0; };
+class C1
+ : virtual public C0
+{ public: int i1; };
+class C2
+ : public C0
+ , public C1
+{ public: int i2; };
+class C3
+ : virtual public C0
+ , public C1
+ , public C2
+{ public: int i3; };
+class C4
+ : public C2
+ , public C3
+ , virtual public C1
+ , virtual public C0
+{ public: int i4; };
+class C5
+ : virtual public C2
+ , public C1
+ , public C0
+{ public: int i5; };
+class C6
+ : virtual public C0
+ , virtual public C5
+ , public C1
+ , public C3
+ , public C4
+{ public: int i6; };
+class C7
+ : public C6
+ , virtual public C0
+ , public C1
+ , public C2
+ , virtual public C4
+{ public: int i7; };
+class C8
+ : public C2
+ , virtual public C6
+ , virtual public C7
+ , public C5
+ , public C3
+ , virtual public C4
+{ public: int i8; };
+class C9
+ : public C5
+ , virtual public C3
+ , virtual public C8
+ , public C0
+ , public C2
+ , public C7
+ , public C6
+ , public C4
+{ public: int i9; };
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C
new file mode 100644
index 00000000000..f5e5e38247e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C
@@ -0,0 +1,16 @@
+// { dg-options -w }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com>
+// Split into pieces for binary compatibility testing October 2002
+
+// Origin stefan@space.twc.de
+// Bug 3145 case 4. Horribly complicated class hierarchy
+
+extern void vbase8_4_x (void);
+
+int
+main ()
+{
+ vbase8_4_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C
new file mode 100644
index 00000000000..66b514c1b09
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C
@@ -0,0 +1,49 @@
+#include "vbase8-4.h"
+
+extern void check_C0 (C0&, int);
+extern void check_C1 (C1&, int);
+extern void check_C2 (C2&, int);
+extern void check_C3 (C3&, int);
+extern void check_C4 (C4&, int);
+extern void check_C5 (C5&, int);
+extern void check_C6 (C6&, int);
+extern void check_C7 (C7&, int);
+extern void check_C8 (C8&, int);
+extern void check_C9 (C9&, int);
+
+void
+vbase8_4_x (void)
+{
+ C0 c0;
+ C1 c1;
+ C2 c2;
+ C3 c3;
+ C4 c4;
+ C5 c5;
+ C6 c6;
+ C7 c7;
+ C8 c8;
+ C9 c9;
+
+ c0.i0 = 0;
+ c1.i1 = 101;
+ c2.i2 = 202;
+ c3.i3 = 303;
+ c4.i4 = 404;
+ c5.i5 = 505;
+ c6.i6 = 606;
+ c7.i7 = 707;
+ c8.i8 = 808;
+ c9.i9 = 909;
+
+ check_C0 (c0, 0);
+ check_C1 (c1, 101);
+ check_C2 (c2, 202);
+ check_C3 (c3, 303);
+ check_C4 (c4, 404);
+ check_C5 (c5, 505);
+ check_C6 (c6, 606);
+ check_C7 (c7, 707);
+ check_C8 (c8, 808);
+ check_C9 (c9, 909);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C
new file mode 100644
index 00000000000..86dd40433d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C
@@ -0,0 +1,63 @@
+extern "C" void abort (void);
+
+#include "vbase8-4.h"
+
+void check_C0 (C0 &x, int i)
+{
+ if (x.i0 != i)
+ abort ();
+}
+
+void check_C1 (C1 &x, int i)
+{
+ if (x.i1 != i)
+ abort ();
+}
+
+void check_C2 (C2 &x, int i)
+{
+ if (x.i2 != i)
+ abort ();
+}
+
+void check_C3 (C3 &x, int i)
+{
+ if (x.i3 != i)
+ abort ();
+}
+
+void check_C4 (C4 &x, int i)
+{
+ if (x.i4 != i)
+ abort ();
+}
+
+void check_C5 (C5 &x, int i)
+{
+ if (x.i5 != i)
+ abort ();
+}
+
+void check_C6 (C6 &x, int i)
+{
+ if (x.i6 != i)
+ abort ();
+}
+
+void check_C7 (C7 &x, int i)
+{
+ if (x.i7 != i)
+ abort ();
+}
+
+void check_C8 (C8 &x, int i)
+{
+ if (x.i8 != i)
+ abort ();
+}
+
+void check_C9 (C9 &x, int i)
+{
+ if (x.i9 != i)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/README b/gcc/testsuite/g++.dg/compat/break/README
new file mode 100644
index 00000000000..98886310caa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/README
@@ -0,0 +1,11 @@
+Tests in this directory are for functionality that has changed in GCC
+from one release to another or that is not ABI-compliant and may change
+in a future release.
+
+Each test header for changed behavior should indicate the version in
+which the behavior changed, in order to help users of these tests to
+determine whether a test failure is expected or not.
+
+Every test in this directory that covers behavior that is not
+ABI-compliant should also be covered by a test for -Wabi to ensure that
+there is a warning for the construct.
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5.h b/gcc/testsuite/g++.dg/compat/break/bitfield5.h
new file mode 100644
index 00000000000..6f7f012cc6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield5.h
@@ -0,0 +1,11 @@
+struct A {
+ virtual void f();
+ int f1 : 1;
+};
+
+struct B : public A {
+ int f2 : 1;
+ int : 0;
+ int f3 : 4;
+ int f4 : 3;
+};
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C
new file mode 100644
index 00000000000..415a8846c26
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C
@@ -0,0 +1,14 @@
+// The offset of `B::f2' is not ABI-compliant and may change in a future
+// version of GCC.
+// g++.dg/abi/bitfield5.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "bitfield5.h"
+
+extern void bitfield5_x (void);
+
+int
+main ()
+{
+ bitfield5_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C
new file mode 100644
index 00000000000..9be9372347a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C
@@ -0,0 +1,13 @@
+#include "bitfield5.h"
+
+extern void bitfield5_y (B&);
+
+void bitfield5_x ()
+{
+ B b;
+
+ b.f3 = 7;
+ b.f4 = 3;
+
+ bitfield5_y (b);
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C
new file mode 100644
index 00000000000..6ee4dd0089d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C
@@ -0,0 +1,13 @@
+extern "C" void abort (void);
+
+#include "bitfield5.h"
+
+void A::f () {}
+
+void bitfield5_y (B& b)
+{
+ if (b.f3 != 7)
+ abort ();
+ if (b.f4 != 3)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7.h b/gcc/testsuite/g++.dg/compat/break/bitfield7.h
new file mode 100644
index 00000000000..2060bf7473b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7.h
@@ -0,0 +1,3 @@
+union U {
+ int i: 4096;
+};
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C
new file mode 100644
index 00000000000..57bb96101f1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C
@@ -0,0 +1,16 @@
+// { dg-options "-w" }
+
+// The size assigned to `U' may not be ABI-compliant and may change in a
+// future version of GCC.
+// g++.dg/abi/bitfield7.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "bitfield7.h"
+
+extern void bitfield7_x (void);
+
+int
+main ()
+{
+ bitfield7_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C
new file mode 100644
index 00000000000..b42ea2e9ae3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C
@@ -0,0 +1,13 @@
+#include "bitfield7.h"
+
+extern void bitfield7_y (U*);
+
+void bitfield7_x ()
+{
+ U u[2];
+
+ u[0].i = 7;
+ u[1].i = 8;
+
+ bitfield7_y (u);
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C
new file mode 100644
index 00000000000..916d150d537
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C
@@ -0,0 +1,11 @@
+extern "C" void abort (void);
+
+#include "bitfield7.h"
+
+void bitfield7_y (U* u)
+{
+ if (u[0].i != 7)
+ abort ();
+ if (u[1].i != 8)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/empty6.h b/gcc/testsuite/g++.dg/compat/break/empty6.h
new file mode 100644
index 00000000000..47a0da8b52e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/empty6.h
@@ -0,0 +1,7 @@
+struct A {};
+
+struct B {
+ A a;
+ virtual void f () {}
+ int i;
+};
diff --git a/gcc/testsuite/g++.dg/compat/break/empty6_main.C b/gcc/testsuite/g++.dg/compat/break/empty6_main.C
new file mode 100644
index 00000000000..bf6d982413b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/empty6_main.C
@@ -0,0 +1,14 @@
+// `B::a' contains empty classes which may cause base classes to be
+// placed at different locations in a future version of GCC.
+// g++.dg/abi/empty6.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "empty6.h"
+
+extern void empty6_x (void);
+
+int
+main ()
+{
+ empty6_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/empty6_x.C b/gcc/testsuite/g++.dg/compat/break/empty6_x.C
new file mode 100644
index 00000000000..f7e25e9abf9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/empty6_x.C
@@ -0,0 +1,12 @@
+#include "empty6.h"
+
+extern void empty6_y (B&);
+
+void empty6_x ()
+{
+ B b;
+
+ b.i = 7;
+
+ empty6_y (b);
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/empty6_y.C b/gcc/testsuite/g++.dg/compat/break/empty6_y.C
new file mode 100644
index 00000000000..cb3d45c9e15
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/empty6_y.C
@@ -0,0 +1,9 @@
+extern "C" void abort (void);
+
+#include "empty6.h"
+
+void empty6_y (B& b)
+{
+ if (b.i != 7)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10.h b/gcc/testsuite/g++.dg/compat/break/vbase10.h
new file mode 100644
index 00000000000..f418d1e56a4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase10.h
@@ -0,0 +1,12 @@
+struct A {
+ virtual void f();
+ char c1;
+};
+
+struct B {
+ B();
+ char c2;
+};
+
+struct C : public A, public virtual B {
+};
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10_main.C b/gcc/testsuite/g++.dg/compat/break/vbase10_main.C
new file mode 100644
index 00000000000..a082b5dbf3e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase10_main.C
@@ -0,0 +1,14 @@
+// The offset of virtual base `B' is not ABI-compliant and may change in
+// a future version of GCC.
+// g++.dg/abi/vbase10.C tests this with -Wabi.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "vbase10.h"
+
+extern void vbase10_x (void);
+
+int
+main ()
+{
+ vbase10_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10_x.C b/gcc/testsuite/g++.dg/compat/break/vbase10_x.C
new file mode 100644
index 00000000000..6d51d3c7269
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase10_x.C
@@ -0,0 +1,13 @@
+#include "vbase10.h"
+
+extern void vbase10_y (C&);
+
+void vbase10_x ()
+{
+ C c;
+
+ c.c1 = 1;
+ c.c2 = 2;
+
+ vbase10_y (c);
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10_y.C b/gcc/testsuite/g++.dg/compat/break/vbase10_y.C
new file mode 100644
index 00000000000..70ce0075e66
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase10_y.C
@@ -0,0 +1,14 @@
+extern "C" void abort (void);
+
+#include "vbase10.h"
+
+void A::f () {}
+B::B() {}
+
+void vbase10_y (C& c)
+{
+ if (c.c1 != 1)
+ abort ();
+ if (c.c2 != 2)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11.h b/gcc/testsuite/g++.dg/compat/break/vbase11.h
new file mode 100644
index 00000000000..a298f764415
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase11.h
@@ -0,0 +1,12 @@
+struct base
+{
+ short b;
+ virtual int foo();
+};
+
+struct derived: virtual base
+{
+ int d;
+ virtual int foo();
+ virtual int bar();
+};
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11_main.C b/gcc/testsuite/g++.dg/compat/break/vbase11_main.C
new file mode 100644
index 00000000000..2ac59944992
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase11_main.C
@@ -0,0 +1,13 @@
+// Test case from PR 7470, which was fixed in GCC 3.2 and breaks binary
+// compatibility with earlier releases.
+// Split into pieces for binary compatibility testing October 2002
+
+#include "vbase11.h"
+
+extern void vbase11_x (void);
+
+int
+main ()
+{
+ vbase11_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11_x.C b/gcc/testsuite/g++.dg/compat/break/vbase11_x.C
new file mode 100644
index 00000000000..4b2398ae10d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase11_x.C
@@ -0,0 +1,14 @@
+#include "vbase11.h"
+
+extern void vbase11_y (derived&);
+
+int base::foo() { return 1; }
+int derived::foo() { return 2; }
+int derived::bar() { return 3; }
+
+void vbase11_x ()
+{
+ derived d;
+
+ vbase11_y (d);
+}
diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11_y.C b/gcc/testsuite/g++.dg/compat/break/vbase11_y.C
new file mode 100644
index 00000000000..01ca62b87b8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/break/vbase11_y.C
@@ -0,0 +1,11 @@
+extern "C" void abort (void);
+
+#include "vbase11.h"
+
+void vbase11_y (derived& d)
+{
+ if (d.foo() != 2)
+ abort ();
+ if (d.bar() != 3)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/compat.exp b/gcc/testsuite/g++.dg/compat/compat.exp
new file mode 100644
index 00000000000..1e13c102a50
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/compat.exp
@@ -0,0 +1,137 @@
+# 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 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 file was written by Janis Johnson, <janis187@us.ibm.com>
+
+
+# Test interoperability of two compilers that follow the same ABI.
+#
+# Break simple tests into two pieces and see that they work when linked
+# together. If an alternate compiler is specified then the two main
+# pieces of each test are compiled with different compilers. The
+# alternate compiler must be installed, and is specified by defining
+# ALT_CXX_UNDER_TEST in the environment.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+global GXX_UNDER_TEST
+global ld_library_path
+
+# Load procedures from common libraries.
+load_lib standard.exp
+load_lib g++.exp
+
+#
+# compat-fix-library-path -- switch LD_LIBRARY_PATH
+#
+proc compat-fix-library-path { } {
+ global ld_library_path
+
+ # See comments in lib/g++.exp for why this is needed.
+ setenv LD_LIBRARY_PATH $ld_library_path
+ setenv SHLIB_PATH $ld_library_path
+ setenv LD_LIBRARYN32_PATH $ld_library_path
+ setenv LD_LIBRARY64_PATH $ld_library_path
+}
+
+#
+# compat-use-alt-compiler -- make the alternate compiler the default
+#
+proc compat-use-alt-compiler { } {
+ global GXX_UNDER_TEST ALT_CXX_UNDER_TEST
+ global CXXFLAGS
+ global ALWAYS_CXXFLAGS
+ global ld_library_path alt_ld_library_path
+ global same_alt
+
+ # We don't need to do this if the alternate compiler is actually
+ # the same as the compiler under test.
+ if { $same_alt == 0 } then {
+ set GXX_UNDER_TEST $ALT_CXX_UNDER_TEST
+ set CXXFLAGS ""
+ set ALWAYS_CXXFLAGS ""
+ set ld_library_path $alt_ld_library_path
+ compat-fix-library-path
+ }
+}
+
+#
+# compat-use-tst-compiler -- make compiler under test the default
+#
+proc compat-use-tst-compiler { } {
+ global GXX_UNDER_TEST save_gxx_under_test
+ global CXXFLAGS save_cxxflags
+ global ALWAYS_CXXFLAGS save_always_cxxflags
+ global ld_library_path save_ld_library_path
+ global same_alt
+
+ # We don't need to do this if the alternate compiler is actually
+ # the same as the compiler under test.
+
+ if { $same_alt == 0 } then {
+ set GXX_UNDER_TEST $save_gxx_under_test
+ set CXXFLAGS $save_cxxflags
+ set ALWAYS_CXXFLAGS $save_always_cxxflags
+ set ld_library_path $save_ld_library_path
+ compat-fix-library-path
+ }
+}
+
+# Load the language-independent compabibility support procedures.
+# This must be done after the compat-use-*-compiler definitions.
+load_lib compat.exp
+
+g++_init
+
+# Save variables for the C++ compiler under test, which each test will
+# change a couple of times. This must be done after calling g++-init.
+set save_gxx_under_test $GXX_UNDER_TEST
+set save_cxxflags $CXXFLAGS
+set save_always_cxxflags $ALWAYS_CXXFLAGS
+set save_ld_library_path $ld_library_path
+
+# Find out whether there is an alternate compiler to test. If the
+# variable is defined but is set to "same", that means we use the same
+# compiler twice, which is meaningful if the two parts of COMPAT_OPTIONS
+# are different.
+set use_alt 0
+set same_alt 0
+set alt_ld_library_path "."
+if [info exists ALT_CXX_UNDER_TEST] then {
+ set use_alt 1
+ if [string match "same" $ALT_CXX_UNDER_TEST] then {
+ set same_alt 1
+ } else {
+ if [info exists ALT_LD_LIBRARY_PATH] then {
+ append alt_ld_library_path ":${ALT_LD_LIBRARY_PATH}"
+ }
+ }
+}
+
+# Main loop.
+foreach src [lsort [find $srcdir/$subdir *_main.C]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $src] then {
+ continue
+ }
+
+ compat-execute $src $use_alt
+}
+
+# Restore the original compiler under test.
+compat-use-tst-compiler
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1.h b/gcc/testsuite/g++.dg/compat/eh/ctor1.h
new file mode 100644
index 00000000000..e83476f2d60
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor1.h
@@ -0,0 +1,10 @@
+struct Foo
+{
+ ~Foo ();
+};
+
+struct Bar
+{
+ ~Bar ();
+ Foo f;
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C
new file mode 100644
index 00000000000..a188b46da86
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C
@@ -0,0 +1,13 @@
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com>
+// PR 411
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void ctor1_x (void);
+
+int
+main ()
+{
+ ctor1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C
new file mode 100644
index 00000000000..d74a520871f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C
@@ -0,0 +1,22 @@
+extern "C" void abort (void);
+extern "C" void exit (int);
+
+#include "ctor1.h"
+
+bool was_f_in_Bar_destroyed=false;
+
+void ctor1_x ()
+{
+ try
+ {
+ Bar f;
+ }
+ catch(int i)
+ {
+ if(was_f_in_Bar_destroyed)
+ {
+ exit (0);
+ }
+ }
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C
new file mode 100644
index 00000000000..260ab1c3418
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C
@@ -0,0 +1,13 @@
+extern bool was_f_in_Bar_destroyed;
+
+#include "ctor1.h"
+
+Foo::~Foo()
+{
+ was_f_in_Bar_destroyed=true;
+}
+
+Bar::~Bar()
+{
+ throw 1;
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2.h b/gcc/testsuite/g++.dg/compat/eh/ctor2.h
new file mode 100644
index 00000000000..c6b9f40f8d9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor2.h
@@ -0,0 +1,22 @@
+struct VBase
+{
+ virtual void f () {}
+ VBase();
+ ~VBase();
+};
+
+struct StreamBase
+{
+ virtual ~StreamBase() {}
+};
+
+struct Stream : public virtual VBase, public StreamBase
+{
+ Stream();
+ virtual ~Stream() {}
+};
+
+struct DerivedStream : public Stream
+{
+ DerivedStream();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C
new file mode 100644
index 00000000000..58836e26eba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C
@@ -0,0 +1,12 @@
+// PR c++/4460
+// Test that the cleanup for fully-constructed subobjects when a
+// constructor throws gets the right address for a virtual base.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void ctor2_x (void);
+
+int main ()
+{
+ ctor2_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C
new file mode 100644
index 00000000000..3fa1a53ace5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C
@@ -0,0 +1,19 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "ctor2.h"
+
+int r;
+
+void ctor2_x () {
+
+ try
+ {
+ DerivedStream str;
+ }
+ catch (...) { }
+
+ if (r != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C
new file mode 100644
index 00000000000..00ba92000e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C
@@ -0,0 +1,20 @@
+extern int r;
+void *p;
+
+#include "ctor2.h"
+
+VBase::VBase ()
+{
+ p = this;
+}
+
+VBase::~VBase ()
+{
+ if (p != this) r = 1;
+}
+
+Stream::Stream () {}
+DerivedStream::DerivedStream ()
+{
+ throw 1;
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1.h b/gcc/testsuite/g++.dg/compat/eh/dtor1.h
new file mode 100644
index 00000000000..0dfa793e0e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/dtor1.h
@@ -0,0 +1,7 @@
+struct A {
+ ~A();
+};
+
+struct B: public A {
+ ~B();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C
new file mode 100644
index 00000000000..962fa64274b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C
@@ -0,0 +1,14 @@
+// PR c++/411
+
+// Test that a fully-constructed base is destroyed before transferring
+// control to the handler of a function-try-block.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void dtor1_x (void);
+
+int
+main ()
+{
+ dtor1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C
new file mode 100644
index 00000000000..f7f4cc8a7f7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C
@@ -0,0 +1,14 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "dtor1.h"
+
+int r;
+
+void dtor1_x ()
+{
+ { B b; }
+ if (r != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C
new file mode 100644
index 00000000000..a1ec41a2764
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C
@@ -0,0 +1,18 @@
+extern int r;
+int ad;
+
+#include "dtor1.h"
+
+A::~A () { ++ad; }
+
+B::~B ()
+try
+ {
+ throw 1;
+ }
+catch (...)
+ {
+ if (!ad)
+ r = 1;
+ return;
+ }
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1.h b/gcc/testsuite/g++.dg/compat/eh/filter1.h
new file mode 100644
index 00000000000..1f5f0c93615
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter1.h
@@ -0,0 +1,5 @@
+struct a
+{
+ a();
+ ~a();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_main.C b/gcc/testsuite/g++.dg/compat/eh/filter1_main.C
new file mode 100644
index 00000000000..2a8fca42c31
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter1_main.C
@@ -0,0 +1,11 @@
+// Test that cleanups get run when a catch filter fails to match.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void filter1_x (void);
+
+int
+main ()
+{
+ filter1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_x.C b/gcc/testsuite/g++.dg/compat/eh/filter1_x.C
new file mode 100644
index 00000000000..b3789aa15b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter1_x.C
@@ -0,0 +1,21 @@
+#include "filter1.h"
+
+extern "C" void exit (int);
+extern "C" void abort (void);
+extern void ex_test (void);
+
+void
+filter1_x ()
+{
+ try
+ {
+ ex_test ();
+ }
+ catch (...)
+ {
+ }
+ abort ();
+}
+
+a::a() { }
+a::~a() { exit (0); }
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_y.C b/gcc/testsuite/g++.dg/compat/eh/filter1_y.C
new file mode 100644
index 00000000000..48de0877d54
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter1_y.C
@@ -0,0 +1,17 @@
+#include "filter1.h"
+
+struct e1 {};
+struct e2 {};
+
+void
+ex_test ()
+{
+ a aa;
+ try
+ {
+ throw e1 ();
+ }
+ catch (e2 &)
+ {
+ }
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter2_main.C b/gcc/testsuite/g++.dg/compat/eh/filter2_main.C
new file mode 100644
index 00000000000..866199c6b30
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter2_main.C
@@ -0,0 +1,12 @@
+// Test that terminate gets run when a catch filter fails to match while
+// running destructors. Original bug depended on a::~a being inlined.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void filter2_x (void);
+
+int
+main ()
+{
+ filter2_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter2_x.C b/gcc/testsuite/g++.dg/compat/eh/filter2_x.C
new file mode 100644
index 00000000000..cdbfffffdd1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter2_x.C
@@ -0,0 +1,20 @@
+#include <exception>
+#include <cstdlib>
+
+extern void my_terminate (void);
+extern void ex_test (void);
+
+void
+filter2_x ()
+{
+ std::set_terminate (my_terminate);
+
+ try
+ {
+ ex_test ();
+ }
+ catch (...)
+ {
+ }
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/filter2_y.C b/gcc/testsuite/g++.dg/compat/eh/filter2_y.C
new file mode 100644
index 00000000000..87c6fea1012
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/filter2_y.C
@@ -0,0 +1,39 @@
+#include <exception>
+#include <cstdlib>
+
+struct e1 {};
+struct e2 {};
+
+struct a
+{
+ a () { }
+
+ ~a ()
+ {
+ try
+ {
+ throw e1();
+ }
+ catch (e2 &)
+ {
+ }
+ }
+};
+
+void
+ex_test ()
+{
+ a aa;
+ try
+ {
+ throw e1 ();
+ }
+ catch (e2 &)
+ {
+ }
+}
+
+void my_terminate ()
+{
+ std::exit (0);
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/new1_main.C b/gcc/testsuite/g++.dg/compat/eh/new1_main.C
new file mode 100644
index 00000000000..ee4cad8e50d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/new1_main.C
@@ -0,0 +1,13 @@
+// PR c++/5757
+// Test that when a constructor throws in a new-expression, we pass the
+// right pointer to operator delete.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void new1_x (void);
+
+int
+main ()
+{
+ new1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/new1_x.C b/gcc/testsuite/g++.dg/compat/eh/new1_x.C
new file mode 100644
index 00000000000..4ca3be0af90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/new1_x.C
@@ -0,0 +1,28 @@
+#include <new>
+
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+extern void * operator new[] (size_t s) throw (std::bad_alloc);
+extern void operator delete[] (void *p) throw ();
+
+struct A
+{
+ A() { throw 1; }
+ ~A() {}
+};
+
+int ret = 1;
+
+void
+new1_x ()
+{
+ try
+ {
+ A *p = new A[4];
+ }
+ catch (...) {}
+ if (ret != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/new1_y.C b/gcc/testsuite/g++.dg/compat/eh/new1_y.C
new file mode 100644
index 00000000000..c448cbed8d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/new1_y.C
@@ -0,0 +1,18 @@
+#include <new>
+
+extern int ret;
+
+void *ptr;
+void * operator new[] (size_t s) throw (std::bad_alloc)
+{
+ ptr = operator new (s);
+ return ptr;
+}
+
+void operator delete[] (void *p) throw ()
+{
+ if (p == ptr)
+ ret = 0;
+ operator delete (p);
+}
+
diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1.h b/gcc/testsuite/g++.dg/compat/eh/nrv1.h
new file mode 100644
index 00000000000..853ea3914e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/nrv1.h
@@ -0,0 +1,5 @@
+struct A
+{
+ A();
+ ~A();
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C
new file mode 100644
index 00000000000..3b76b5c8824
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C
@@ -0,0 +1,12 @@
+// PR c++/5636
+// Bug: the named return value optimization interfered with EH cleanups.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void nrv1_x (void);
+
+int
+main ()
+{
+ nrv1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C
new file mode 100644
index 00000000000..0647de889a5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C
@@ -0,0 +1,21 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "nrv1.h"
+
+extern A f (void);
+
+int c, d;
+
+void nrv1_x ()
+{
+ try
+ { A a = f(); }
+ catch (...) { }
+ if (d < c)
+ abort ();
+ exit (0);
+}
+
+A::A() { ++c; }
+A::~A() { ++d; }
diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C
new file mode 100644
index 00000000000..5a43af7c205
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C
@@ -0,0 +1,8 @@
+#include "nrv1.h"
+
+A f()
+{
+ A nrv;
+ throw 42;
+ return nrv;
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3.h b/gcc/testsuite/g++.dg/compat/eh/spec3.h
new file mode 100644
index 00000000000..a042c1004dd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/spec3.h
@@ -0,0 +1,8 @@
+class Base {};
+
+struct A : virtual public Base
+{
+ A();
+};
+
+struct B {};
diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3_main.C b/gcc/testsuite/g++.dg/compat/eh/spec3_main.C
new file mode 100644
index 00000000000..3f0e919b2ea
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/spec3_main.C
@@ -0,0 +1,12 @@
+// PR c++/4381
+// Test that exception-specs work properly for classes with virtual bases.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void spec3_x (void);
+
+int
+main ()
+{
+ spec3_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3_x.C b/gcc/testsuite/g++.dg/compat/eh/spec3_x.C
new file mode 100644
index 00000000000..b8e5fbeaa1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/spec3_x.C
@@ -0,0 +1,9 @@
+#include "spec3.h"
+
+extern void func () throw (B,A);
+
+void spec3_x (void)
+{
+ try { func(); }
+ catch (A& a) { }
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3_y.C b/gcc/testsuite/g++.dg/compat/eh/spec3_y.C
new file mode 100644
index 00000000000..fef6b368c86
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/spec3_y.C
@@ -0,0 +1,8 @@
+#include "spec3.h"
+
+A::A() {}
+
+void func() throw (B,A)
+{
+ throw A();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/template1.h b/gcc/testsuite/g++.dg/compat/eh/template1.h
new file mode 100644
index 00000000000..93999a11d49
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/template1.h
@@ -0,0 +1,15 @@
+class A {};
+
+template <class T>
+struct B
+{
+ typedef A E;
+};
+
+template <class T>
+struct C
+{
+ typedef B<T> D;
+ typedef typename D::E E;
+ void f() throw(E);
+};
diff --git a/gcc/testsuite/g++.dg/compat/eh/template1_main.C b/gcc/testsuite/g++.dg/compat/eh/template1_main.C
new file mode 100644
index 00000000000..2d169808c46
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/template1_main.C
@@ -0,0 +1,12 @@
+// Test whether exception specifier dependent on template parameter
+// is accepted during template decl processing.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void template1_x (void);
+
+int
+main ()
+{
+ template1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/template1_x.C b/gcc/testsuite/g++.dg/compat/eh/template1_x.C
new file mode 100644
index 00000000000..5a18be78989
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/template1_x.C
@@ -0,0 +1,21 @@
+extern "C" void exit (int);
+extern "C" void abort (void);
+
+#include "template1.h"
+
+void template1_x ()
+{
+ int caught = 0;
+ try
+ {
+ C<int> x;
+ x.f();
+ }
+ catch (A)
+ {
+ ++caught;
+ }
+ if (caught != 1)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/template1_y.C b/gcc/testsuite/g++.dg/compat/eh/template1_y.C
new file mode 100644
index 00000000000..19425375c92
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/template1_y.C
@@ -0,0 +1,8 @@
+#include "template1.h"
+
+template<class T> void C<T>::f (void) throw (E)
+{
+ throw E();
+}
+
+template class C<int>;
diff --git a/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C
new file mode 100644
index 00000000000..1658db77e32
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C
@@ -0,0 +1,12 @@
+// PR 3719
+// Test that an unexpected handler can rethrow to categorize.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void unexpected1_x ();
+
+int
+main ()
+{
+ unexpected1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C
new file mode 100644
index 00000000000..61361a68d9f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C
@@ -0,0 +1,26 @@
+#include <exception>
+
+struct One { };
+struct Two { };
+
+extern "C" void abort ();
+extern void doit (void) throw (Two);
+extern void handle_unexpected (void);
+
+void
+unexpected1_x ()
+{
+ std::set_unexpected (handle_unexpected);
+
+ try
+ {
+ doit ();
+ }
+ catch (Two &)
+ {
+ }
+ catch (...)
+ {
+ abort ();
+ }
+}
diff --git a/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C
new file mode 100644
index 00000000000..0c42c457953
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C
@@ -0,0 +1,21 @@
+struct One { };
+struct Two { };
+
+void
+handle_unexpected ()
+{
+ try
+ {
+ throw;
+ }
+ catch (One &)
+ {
+ throw Two ();
+ }
+}
+
+void
+doit () throw (Two)
+{
+ throw One ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/array5_main.C b/gcc/testsuite/g++.dg/compat/init/array5_main.C
new file mode 100644
index 00000000000..96b2cc4b12b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/array5_main.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// Split into pieces for binary compatibility testing October 2002
+
+// Incorrect construction and destruction of multi-dimensional
+// array of class.
+
+extern void array5_x (void);
+
+int
+main ()
+{
+ array5_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/array5_x.C b/gcc/testsuite/g++.dg/compat/init/array5_x.C
new file mode 100644
index 00000000000..dc138772cdd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/array5_x.C
@@ -0,0 +1,33 @@
+extern "C" void abort (void);
+
+extern int count;
+extern int num;
+
+struct A
+{
+ A();
+ ~A();
+};
+
+struct Array
+{
+ A array[2][2][2];
+};
+
+void
+array5_x ()
+{
+ for (num = 0; num <= 8; ++num)
+ {
+ count = 0;
+ try
+ {
+ Array A;
+ }
+ catch (...)
+ {
+ }
+ if (count != 0)
+ abort();
+ }
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/array5_y.C b/gcc/testsuite/g++.dg/compat/init/array5_y.C
new file mode 100644
index 00000000000..64b295ed56d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/array5_y.C
@@ -0,0 +1,20 @@
+int count;
+int num;
+
+struct A
+{
+ A();
+ ~A();
+};
+
+A::A()
+{
+ if (count == num)
+ throw "";
+ count++;
+}
+
+A::~A()
+{
+ count--;
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/byval1.h b/gcc/testsuite/g++.dg/compat/init/byval1.h
new file mode 100644
index 00000000000..2876b76ede1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/byval1.h
@@ -0,0 +1,6 @@
+struct C
+{
+ int m;
+ C();
+ ~C();
+};
diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_main.C b/gcc/testsuite/g++.dg/compat/init/byval1_main.C
new file mode 100644
index 00000000000..acefaab1440
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/byval1_main.C
@@ -0,0 +1,12 @@
+// PR c++/3948
+// Test that the destructor call for a value parameter gets the
+// right address.
+// Split into pieces for binary compatibility testing October 2002
+
+extern void byval1_x (void);
+
+int
+main ()
+{
+ byval1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_x.C b/gcc/testsuite/g++.dg/compat/init/byval1_x.C
new file mode 100644
index 00000000000..248dbe763bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/byval1_x.C
@@ -0,0 +1,15 @@
+#include "byval1.h"
+
+extern "C" void abort (void);
+extern void Foo (C c);
+extern int r;
+
+void
+byval1_x ()
+{
+ C c;
+
+ Foo (c);
+ if (r != 0)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_y.C b/gcc/testsuite/g++.dg/compat/init/byval1_y.C
new file mode 100644
index 00000000000..6e217e84ec5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/byval1_y.C
@@ -0,0 +1,14 @@
+#include "byval1.h"
+
+void *p[2];
+
+int i;
+int r;
+
+C::C() { p[i++] = this; }
+C::~C() { if (p[--i] != this) r = 1; }
+
+void Foo (C c)
+{
+ p[i++] = &c;
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1.h b/gcc/testsuite/g++.dg/compat/init/dtor1.h
new file mode 100644
index 00000000000..77e21c12ef2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/dtor1.h
@@ -0,0 +1,30 @@
+struct B
+{
+ int x;
+ B (int);
+ ~B ();
+};
+
+struct C1 : public B {
+ C1 (int);
+};
+
+struct C2 : public B {
+ C2 (int);
+};
+
+struct D : public B {
+ D (int);
+};
+
+struct E : public B {
+ E (int);
+};
+
+struct A
+ : public C1, C2, virtual public D, virtual public E
+{
+ A ();
+ B x1;
+ B x2;
+};
diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1_main.C b/gcc/testsuite/g++.dg/compat/init/dtor1_main.C
new file mode 100644
index 00000000000..78868784038
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/dtor1_main.C
@@ -0,0 +1,9 @@
+// Split into pieces for binary compatibility testing October 2002
+
+extern void dtor1_x (void);
+
+int
+main ()
+{
+ dtor1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1_x.C b/gcc/testsuite/g++.dg/compat/init/dtor1_x.C
new file mode 100644
index 00000000000..8a4727cfb4c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/dtor1_x.C
@@ -0,0 +1,7 @@
+#include "dtor1.h"
+
+void
+dtor1_x (void)
+{
+ A a;
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1_y.C b/gcc/testsuite/g++.dg/compat/init/dtor1_y.C
new file mode 100644
index 00000000000..27610fc1e9e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/dtor1_y.C
@@ -0,0 +1,18 @@
+#include "dtor1.h"
+
+extern "C" void abort ();
+
+int d = 5;
+
+B::B (int i) : x (i) { }
+B::~B () { if (d-- != x) abort (); }
+
+C1::C1 (int i) : B (i) {}
+
+C2::C2 (int i) : B (i) {}
+
+D::D (int i) : B (i) {}
+
+E::E (int i) : B (i) {}
+
+A::A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {}
diff --git a/gcc/testsuite/g++.dg/compat/init/elide1.h b/gcc/testsuite/g++.dg/compat/init/elide1.h
new file mode 100644
index 00000000000..481e7308b5f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/elide1.h
@@ -0,0 +1,5 @@
+struct A {
+ A ();
+ A (const A&);
+ ~A ();
+};
diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_main.C b/gcc/testsuite/g++.dg/compat/init/elide1_main.C
new file mode 100644
index 00000000000..c08d02fff45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/elide1_main.C
@@ -0,0 +1,25 @@
+// Test that the destructor for a temporary passed by value isn't run
+// until end of full-expression, as per [class.copy]:
+
+// Whenever a temporary class object is copied using a copy constructor,
+// and this object and the copy have the same cv-unqualified type, an
+// implementation is permitted to treat the original and the copy as two
+// different ways of referring to the same object and not perform a copy
+// at all, even if the class copy constructor or destructor have side
+// effects.... In these cases, the
+// object is destroyed at the later of times when the original and the
+// copy would have been destroyed without the optimization.
+
+// Here, the temporary would be destroyed later than the parm, so either we
+// must suppress the optimization in this case or destroy value parms in the
+// caller.
+
+// Split into pieces for binary compatibility testing October 2002
+
+extern void elide1_x (void);
+
+int
+main ()
+{
+ elide1_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_x.C b/gcc/testsuite/g++.dg/compat/init/elide1_x.C
new file mode 100644
index 00000000000..dbc287e4e2c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/elide1_x.C
@@ -0,0 +1,15 @@
+#include "elide1.h"
+
+extern "C" void abort (void);
+extern void f (A);
+extern int d;
+
+void
+elide1_x (void)
+{
+ int r;
+ f (A ()), r = d;
+
+ if (r >= d || !d)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_y.C b/gcc/testsuite/g++.dg/compat/init/elide1_y.C
new file mode 100644
index 00000000000..e767d08082e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/elide1_y.C
@@ -0,0 +1,9 @@
+#include "elide1.h"
+
+int d;
+
+A::A () { }
+A::A (const A&) { }
+A::~A() { ++d; }
+
+void f (A a) { }
diff --git a/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C
new file mode 100644
index 00000000000..73782829ec4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C
@@ -0,0 +1,11 @@
+// Submitted by Jason Merrill <jason_merrill@redhat.com>
+// Test for proper handling of local static references.
+// Split into pieces for binary compatibility testing October 2002
+
+extern void init_ref2_x (void);
+
+int
+main ()
+{
+ init_ref2_x ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C
new file mode 100644
index 00000000000..7fbec89b645
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C
@@ -0,0 +1,22 @@
+extern "C" void abort (void);
+extern void g (void);
+extern void h (void);
+
+int r;
+int c;
+int f ()
+{
+ // Test that we only initialize i once.
+ if (++c > 1)
+ ++r;
+ return 42;
+}
+
+void
+init_ref2_x (void)
+{
+ g ();
+ h ();
+ if (r != 0)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C
new file mode 100644
index 00000000000..23e66b2f9a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C
@@ -0,0 +1,24 @@
+extern int f (void);
+extern int r;
+
+const int *p;
+
+void g ()
+{
+ static const int &i = f();
+
+ // Test that i points to the same place in both calls.
+ if (p && p != &i)
+ ++r;
+ // Test that if so, it points to static data.
+ if (i != 42)
+ ++r;
+
+ p = &i;
+}
+
+void h ()
+{
+ int arr[] = { 1, 1, 1, 1, 1, 1, 1 };
+ g ();
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/c++98-pedantic.C b/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C
index 61e13c5d145..61e13c5d145 100644
--- a/gcc/testsuite/gcc.dg/cpp/c++98-pedantic.C
+++ b/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C
diff --git a/gcc/testsuite/gcc.dg/cpp/c++98.C b/gcc/testsuite/g++.dg/cpp/c++98.C
index 0ec4f359f04..0ec4f359f04 100644
--- a/gcc/testsuite/gcc.dg/cpp/c++98.C
+++ b/gcc/testsuite/g++.dg/cpp/c++98.C
diff --git a/gcc/testsuite/g++.dg/dg.exp b/gcc/testsuite/g++.dg/dg.exp
index 9e48af8f914..ea96197332f 100644
--- a/gcc/testsuite/g++.dg/dg.exp
+++ b/gcc/testsuite/g++.dg/dg.exp
@@ -32,6 +32,7 @@ dg-init
# that are handled specially.
set tests [lsort [find $srcdir/$subdir *.C]]
set tests [prune $tests $srcdir/$subdir/bprob/*]
+set tests [prune $tests $srcdir/$subdir/compat/*]
set tests [prune $tests $srcdir/$subdir/debug/*]
set tests [prune $tests $srcdir/$subdir/gcov/*]
set tests [prune $tests $srcdir/$subdir/special/*]
diff --git a/gcc/testsuite/g++.dg/eh/spec5.C b/gcc/testsuite/g++.dg/eh/spec5.C
new file mode 100644
index 00000000000..be8f327c0b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/spec5.C
@@ -0,0 +1,22 @@
+// Test for extension to allow incomplete types in an
+// exception-specification for a declaration.
+
+// { dg-do run }
+// { dg-options "-fpermissive -w" }
+
+struct A;
+
+struct B
+{
+ void f () throw (A);
+};
+
+struct A {};
+
+void B::f () throw (A) {}
+
+int main ()
+{
+ B b;
+ b.f();
+}
diff --git a/gcc/testsuite/g++.dg/eh/spec6.C b/gcc/testsuite/g++.dg/eh/spec6.C
new file mode 100644
index 00000000000..eb1177b07f5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/spec6.C
@@ -0,0 +1,19 @@
+// Test that we don't allow incomplete types in an exception-specification
+// for a definition, or at a call site.
+
+// { dg-options "-fpermissive -w" }
+
+struct A; // { dg-error "" }
+
+struct B
+{
+ void f () throw (A);
+};
+
+void B::f () throw (A) {} // { dg-error "A" }
+
+int main ()
+{
+ B b;
+ b.f(); // { dg-error "A" }
+}
diff --git a/gcc/testsuite/g++.dg/ext/asm3.C b/gcc/testsuite/g++.dg/ext/asm3.C
new file mode 100644
index 00000000000..699ab4c8252
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/asm3.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7015. ICE with asms
+
+int two(int in)
+{
+ register int out;
+ __asm__ ("" : "r" (out) : "r" (in)); // { dg-error "output operand" "" }
+ return out;
+}
diff --git a/gcc/testsuite/g++.dg/ext/lvaddr.C b/gcc/testsuite/g++.dg/ext/lvaddr.C
new file mode 100644
index 00000000000..184afce900b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/lvaddr.C
@@ -0,0 +1,10 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Matt Austern <austern@apple.com>
+
+// { dg-do compile }
+
+void f()
+{
+ int n;
+ char* p = &(char) n; // { dg-error "non-lvalue" }
+}
diff --git a/gcc/testsuite/g++.dg/ext/lvcast.C b/gcc/testsuite/g++.dg/ext/lvcast.C
new file mode 100644
index 00000000000..efff04ec089
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/lvcast.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Matt Austern <austern@apple.com>
+
+// { dg-do compile }
+// { dg-options -fpermissive }
+
+void f ()
+{
+ int n;
+ (char) n = 1;
+}
diff --git a/gcc/testsuite/g++.dg/ext/typedef-init.C b/gcc/testsuite/g++.dg/ext/typedef-init.C
new file mode 100644
index 00000000000..5602783b499
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/typedef-init.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-fpermissive" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension. However,
+ it's been broken since GCC 3.0 (caused ICE) and we have now removed
+ the extension. See PR c/7353.
+
+ C++ issues a warning in addition to the error, since this construct
+ appears to be a case of implicit int (forbidden in std. C++) until
+ we get to the equals sign. */
+
+typedef A = 0; /* { dg-error "initialized" "typedef A = B" } */
+ /* { dg-warning "no type" "also warns" { target *-*-* } 12 } */
+A a; /* { dg-bogus "" "no error cascade" } */
diff --git a/gcc/testsuite/g++.dg/ext/vlm1.C b/gcc/testsuite/g++.dg/ext/vlm1.C
new file mode 100644
index 00000000000..61628e6bba4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/vlm1.C
@@ -0,0 +1,13 @@
+// { dg-options "" }
+
+template <class T> struct A {};
+
+struct B {
+ static const int s;
+ A<int[s]> a; // { dg-error "variably modified|no type" }
+};
+
+const int B::s=16;
+
+B b;
+
diff --git a/gcc/testsuite/g++.dg/ext/vlm2.C b/gcc/testsuite/g++.dg/ext/vlm2.C
new file mode 100644
index 00000000000..3a0b335262c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/vlm2.C
@@ -0,0 +1,13 @@
+// { dg-options "" }
+
+int n;
+
+struct Y
+{
+ void f () {
+ typedef int X[n];
+ struct Z {
+ X x; // { dg-error "variably modified" }
+ };
+ }
+};
diff --git a/gcc/testsuite/g++.dg/inherit/cond1.C b/gcc/testsuite/g++.dg/inherit/cond1.C
new file mode 100644
index 00000000000..843c72ca308
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/cond1.C
@@ -0,0 +1,10 @@
+// Origin: jason@redhat.com
+// { dg-do compile }
+
+struct A { A(); A(const A&); int i; };
+struct B: public A { };
+
+int f (bool b, A& ar, B& br)
+{
+ return (b?ar:br).i;
+}
diff --git a/gcc/testsuite/g++.dg/inherit/override1.C b/gcc/testsuite/g++.dg/inherit/override1.C
new file mode 100644
index 00000000000..04460edab74
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/override1.C
@@ -0,0 +1,18 @@
+struct c0 { virtual void f (); };
+struct c1 : public c0 {};
+struct c2 : public c0 {};
+struct c3 : virtual public c0, public c1, public c2 {};
+struct c5 {};
+struct c7 : virtual public c3 {};
+struct c8 : virtual public c1 { virtual void f (); };
+struct c9 {};
+struct c10 : virtual public c8, virtual public c7 {};
+struct c11 : virtual public c5 {};
+struct c12 : virtual public c8, public c7 {};
+struct c13 : public c9, public c3, virtual public c2 {};
+struct c14 : virtual public c1, virtual public c5, virtual public c0,
+ public c2 {};
+struct c15 : public c14, public c12, virtual public c3 {};
+struct c16 : public c12, public c10, public c2 { virtual void f (); };
+struct c17 : virtual public c13, public c15, virtual public c0,
+ virtual public c16 {};
diff --git a/gcc/testsuite/g++.dg/inherit/thunk1.C b/gcc/testsuite/g++.dg/inherit/thunk1.C
new file mode 100644
index 00000000000..0c9919a192c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/thunk1.C
@@ -0,0 +1,41 @@
+// { dg-do run { target i?86-*-* } }
+
+#include <stdarg.h>
+
+extern "C" void abort ();
+
+struct A {
+ virtual void f (int, ...) {}
+ int i;
+};
+
+struct B : virtual public A {
+};
+
+struct C : public B {
+ C ();
+ virtual void f (int, ...);
+};
+
+extern C* cp;
+
+C::C () { cp = this; }
+
+void C::f (int i, ...) {
+ if (this != cp)
+ abort ();
+ va_list ap;
+ if (i != 3)
+ abort ();
+ va_start (ap, i);
+ if (va_arg (ap, int) != 7)
+ abort ();
+ va_end (ap);
+}
+
+C* cp = new C;
+
+int main ()
+{
+ cp->f (3, 7);
+}
diff --git a/gcc/testsuite/g++.dg/inherit/using2.C b/gcc/testsuite/g++.dg/inherit/using2.C
new file mode 100644
index 00000000000..19f06e9cc02
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/using2.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7919. Methods found via using decls didn't have their this
+// pointers converted to the final base type.
+
+struct Base {
+ int m;
+ protected:
+ void *Return () { return this; }
+};
+
+struct Derived : Base {
+ using Base::Return;
+ virtual ~Derived () {}
+};
+
+int main ()
+{
+ Derived d;
+
+ return static_cast <Base *> (&d) != d.Return ();
+}
diff --git a/gcc/testsuite/g++.dg/inherit/using3.C b/gcc/testsuite/g++.dg/inherit/using3.C
new file mode 100644
index 00000000000..d2acf80099a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/using3.C
@@ -0,0 +1,19 @@
+class A
+{
+public:
+ typedef int T;
+ int a;
+};
+
+class B : virtual private A
+{
+};
+
+class C : virtual private A, public B
+{
+public:
+ using A::a;
+ using A::T;
+};
+
+C::T x;
diff --git a/gcc/testsuite/g++.dg/init/aggr1.C b/gcc/testsuite/g++.dg/init/aggr1.C
new file mode 100644
index 00000000000..c63f0b02c65
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/aggr1.C
@@ -0,0 +1,19 @@
+// Test that initializing an aggregate with complex copy constructor
+// and assignment ops doesn't cause cp_expr_size to abort.
+
+struct A
+{
+ A();
+ A(const A&);
+ A& operator=(const A&);
+};
+
+struct B
+{
+ A a;
+};
+
+int main ()
+{
+ B b = { A() };
+}
diff --git a/gcc/testsuite/g++.dg/init/array1.C b/gcc/testsuite/g++.dg/init/array1.C
index 8618e1e6018..5847247c158 100644
--- a/gcc/testsuite/g++.dg/init/array1.C
+++ b/gcc/testsuite/g++.dg/init/array1.C
@@ -6,15 +6,15 @@
typedef int iArr[];
const iArr array4={
- {1},{2},{3},{4}
+ 1, 2, 3, 4
};
const iArr array3={
- {1},{2},{3}
+ 1, 2, 3
};
const iArr array5={
- {1},{2},{3},{4},{5}
+ 1, 2, 3, 4, 5
};
int main()
diff --git a/gcc/testsuite/g++.dg/init/array6.C b/gcc/testsuite/g++.dg/init/array6.C
new file mode 100644
index 00000000000..1b04709cb92
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/array6.C
@@ -0,0 +1,3 @@
+// { dg-do compile }
+
+char arr [][4] = { "one", "two" };
diff --git a/gcc/testsuite/g++.dg/init/array7.C b/gcc/testsuite/g++.dg/init/array7.C
new file mode 100644
index 00000000000..23c6a7098ef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/array7.C
@@ -0,0 +1,15 @@
+struct S {
+ virtual void v () {}
+ void f (const float g[3]);
+ float h[3];
+};
+
+void g () {
+ S s1, s2;
+ s1 = s2;
+}
+
+void S::f (const float g[3]) {}
+
+
+
diff --git a/gcc/testsuite/g++.dg/init/array8.C b/gcc/testsuite/g++.dg/init/array8.C
new file mode 100644
index 00000000000..5f28ca490e7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/array8.C
@@ -0,0 +1,12 @@
+struct A {
+ A ();
+};
+
+struct B {
+ A a1;
+ A a2;
+};
+
+A a;
+
+struct B b[] = { { a, a }, { a, a } };
diff --git a/gcc/testsuite/g++.dg/init/brace1.C b/gcc/testsuite/g++.dg/init/brace1.C
new file mode 100644
index 00000000000..a819fa2587c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/brace1.C
@@ -0,0 +1,4 @@
+// { dg-do compile }
+
+int i[4] = { { 3 } }; // { dg-error "brace" }
+
diff --git a/gcc/testsuite/g++.dg/init/copy2.C b/gcc/testsuite/g++.dg/init/copy2.C
new file mode 100644
index 00000000000..9a662d4cf16
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/copy2.C
@@ -0,0 +1,5 @@
+// { dg-do compile }
+
+struct S { S (); };
+
+volatile S s[1] = { S () };
diff --git a/gcc/testsuite/g++.dg/init/copy3.C b/gcc/testsuite/g++.dg/init/copy3.C
new file mode 100644
index 00000000000..fa6a6ea1884
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/copy3.C
@@ -0,0 +1,16 @@
+// { dg-do run }
+// { dg-options "-fno-elide-constructors" }
+
+int copies;
+
+struct S {
+ S () {}
+ S (const S&) { ++copies; }
+};
+
+S s[1] = { S () };
+
+int main () {
+ if (copies != 1)
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/init/ctor1.C b/gcc/testsuite/g++.dg/init/ctor1.C
new file mode 100644
index 00000000000..aeb509bfa5d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ctor1.C
@@ -0,0 +1,57 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Oct 2002 <nathan@codesourcery.com>
+
+// From WindRiver SPR 80797
+// We were inadvertently SAVE_EXPRing volatile arrays during delete[]
+
+struct A
+{
+ A *ptr;
+ static int ok;
+
+ A () {ptr = this;}
+ ~A () {ok = ptr == this;}
+};
+int A::ok = -1;
+
+struct B
+{
+ B *ptr;
+ static int ok;
+
+ B () {ptr = this;}
+ ~B () {ok = ptr == this;}
+};
+int B::ok = -1;
+
+struct C
+{
+ A volatile a;
+ B volatile b[1];
+
+ C ();
+};
+
+C::C ()
+{
+ throw 1;
+}
+
+int main ()
+{
+ try
+ {
+ C c;
+ }
+ catch (...)
+ {
+ if (A::ok != 1)
+ return 1;
+ if (B::ok != 1)
+ return 2;
+ return 0;
+ }
+ return 3;
+}
diff --git a/gcc/testsuite/g++.dg/init/pm2.C b/gcc/testsuite/g++.dg/init/pm2.C
new file mode 100644
index 00000000000..35b9b32fea1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/pm2.C
@@ -0,0 +1,7 @@
+struct S {
+ S ();
+ int S::* sp;
+ int i;
+};
+
+S s[2] = {};
diff --git a/gcc/testsuite/g++.dg/lookup/scoped2.C b/gcc/testsuite/g++.dg/lookup/scoped2.C
new file mode 100644
index 00000000000..80cfb1f5f00
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/scoped2.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// Seg faulted.
+
+struct Base
+{
+};
+
+struct Derived : Base
+{
+ void Foo ()
+ {
+ Base::Baz (); // { dg-error "has no member" "" }
+
+ };
+};
diff --git a/gcc/testsuite/g++.dg/opt/const2.C b/gcc/testsuite/g++.dg/opt/const2.C
new file mode 100644
index 00000000000..9ddc5e13764
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/const2.C
@@ -0,0 +1,40 @@
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort (void);
+
+struct QSize
+{
+ QSize();
+ QSize( int w, int h );
+ int wd, ht;
+ friend inline const QSize operator+( const QSize &, const QSize & );
+};
+
+inline QSize::QSize()
+{ wd = ht = -1; }
+
+inline QSize::QSize( int w, int h )
+{ wd = w; ht = h; }
+
+inline const QSize operator+( const QSize & s1, const QSize & s2 )
+{ return QSize(s1.wd+s2.wd, s1.ht+s2.ht); }
+
+QSize minimumSize()
+{
+ return QSize (100, 200);
+}
+
+QSize totalMinimumSize()
+{
+ QSize s = minimumSize();
+ return s + QSize( 0, 0 );
+}
+
+int main()
+{
+ QSize s = totalMinimumSize();
+ if (s.wd != 100 || s.ht != 200)
+ abort ();
+}
+
diff --git a/gcc/testsuite/g++.dg/other/constref1.C b/gcc/testsuite/g++.dg/other/constref1.C
new file mode 100644
index 00000000000..900a07de39c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/constref1.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com>
+
+// Make sure that we can pass a cast-expression as an argument that's
+// passed by const reference.
+
+void bar (const long&)
+{ }
+
+void foo (int x)
+{
+ bar ((long) x);
+}
+
diff --git a/gcc/testsuite/g++.dg/other/constref2.C b/gcc/testsuite/g++.dg/other/constref2.C
new file mode 100644
index 00000000000..5c82e2dbbdb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/constref2.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com>
+
+// Make sure that we can pass a cast-expression as an argument that's
+// passed to a function template by const reference.
+
+template <class T>
+void bar (const T&)
+{ }
+
+void foo (int x)
+{
+ bar ((long) x);
+}
diff --git a/gcc/testsuite/g++.dg/other/cxa-atexit1.C b/gcc/testsuite/g++.dg/other/cxa-atexit1.C
new file mode 100644
index 00000000000..a51f3340142
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/cxa-atexit1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-O2 -fuse-cxa-atexit" }
+
+# 1 "cxa-atexit1.C"
+struct A
+{
+ struct B
+ {
+ B ();
+ ~B ();
+ };
+};
+static A::B b;
+# 1 "cxa-atexit1.h" 1
+#pragma interface
+template <class T> struct C
+{
+ ~C (void);
+};
+struct D : public C<bool>
+{
+ D (void) : C<bool> () { }
+};
+# 55 "cxa-atexit1.C" 2
+
+// { dg-final { scan-assembler-not ".gnu.linkonce.t.__tcf_" } }
diff --git a/gcc/testsuite/g++.dg/other/do1.C b/gcc/testsuite/g++.dg/other/do1.C
new file mode 100644
index 00000000000..5ff6c5682ba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/do1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7640. ICE.
+
+void init ()
+{
+ do { } while (0)
+ obj = 0; // { dg-error "parse error" "" }
+
+}
diff --git a/gcc/testsuite/g++.dg/other/offsetof1.C b/gcc/testsuite/g++.dg/other/offsetof1.C
index 1051cd28cfe..6d4ebf93c14 100644
--- a/gcc/testsuite/g++.dg/other/offsetof1.C
+++ b/gcc/testsuite/g++.dg/other/offsetof1.C
@@ -11,4 +11,4 @@ struct F
char j;
};
-static int ary[((unsigned) &((struct F *)0)->j)];
+static int ary[((__SIZE_TYPE__)&((struct F *)0)->j)];
diff --git a/gcc/testsuite/g++.dg/other/warning1.C b/gcc/testsuite/g++.dg/other/warning1.C
new file mode 100644
index 00000000000..109fc46aa22
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/warning1.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// PR c++/7804
+// Floating point formatting in error and warning messages
+
+extern "C" int printf(const char *, ...);
+
+struct S
+{
+ static const float inf = 1.0f / 0.0f; // { dg-warning "1.0|initialization" }
+ static const float nan = 0.0f / 0.0f; // { dg-warning "0.0|initialization" }
+};
+
+int main()
+{
+ printf("%f\n%f\n", S::inf, S::nan);
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/overload/member1.C b/gcc/testsuite/g++.dg/overload/member1.C
new file mode 100644
index 00000000000..29896a5110f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/member1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com>
+
+struct X
+{
+ template<typename T> static void ProcessProxy ();
+ typedef void (*Callback) ();
+ void Process (Callback);
+
+ template<typename T> void Process ()
+ {
+ Process (&ProcessProxy<T>);
+ }
+
+};
+
+void foo (X *x)
+{
+ x->Process<int> ();
+}
diff --git a/gcc/testsuite/g++.dg/overload/member2.C b/gcc/testsuite/g++.dg/overload/member2.C
new file mode 100644
index 00000000000..b8914146f16
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/member2.C
@@ -0,0 +1,41 @@
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com>
+
+// PR 7676. We didn't notice template members were different.
+
+struct foo
+{
+ template<class T>
+ int bar() {return 1;}
+
+ template<int I>
+ int bar() {return 2;}
+
+};
+
+struct baz : foo
+{
+ using foo::bar;
+ template<int I>
+ int bar () {return 3;}
+};
+
+int main ()
+{
+ baz b;
+ foo f;
+
+ if (f.bar<1> () != 2)
+ return 1;
+ if (f.bar<int> () != 1)
+ return 2;
+
+ if (b.bar<1> () != 3)
+ return 1;
+ if (b.bar<int> () != 1)
+ return 2;
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
new file mode 100644
index 00000000000..e81fbabf2c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C
@@ -0,0 +1,16 @@
+// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
+// Origin: PRs 7721 and 7803
+// { dg-do compile }
+
+namespace N
+{
+ template<typename>
+ struct X { };
+}
+
+N::X X; // { dg-error "" "" }
+
+int main()
+{
+ return sizeof(X); // { dg-error "" "" }
+}
diff --git a/gcc/testsuite/g++.dg/parse/friend1.C b/gcc/testsuite/g++.dg/parse/friend1.C
new file mode 100644
index 00000000000..f19dc9c628b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/friend1.C
@@ -0,0 +1,9 @@
+namespace N {
+ template <typename T>
+ static void f ();
+
+ struct S {
+ friend void N::f<int> ();
+ static void f (int);
+ };
+}
diff --git a/gcc/testsuite/g++.dg/rtti/crash1.C b/gcc/testsuite/g++.dg/rtti/crash1.C
new file mode 100644
index 00000000000..eea6a3950de
--- /dev/null
+++ b/gcc/testsuite/g++.dg/rtti/crash1.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7788. ICE
+
+class foo;
+extern const foo bar;
+class bar;
diff --git a/gcc/testsuite/g++.dg/template/cond.C b/gcc/testsuite/g++.dg/template/cond.C
new file mode 100644
index 00000000000..394a21c9a6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/cond.C
@@ -0,0 +1,23 @@
+// PR c++/8080
+
+// Bug: the transformation in finish_while_stmt_cond produced something
+// that tsubst_expr handled badly. Fixed by not doing the transformation
+// while parsing a template.
+
+class TObject {};
+
+struct TIter {
+ TObject *operator()();
+};
+
+
+template<class T>
+void get_root_object(TIter& iobj) {
+ while ( TObject* pnew_obj = iobj() )
+ ;
+}
+
+void foo(TIter& iobj)
+{
+ get_root_object<int>(iobj);
+}
diff --git a/gcc/testsuite/g++.dg/template/deduce1.C b/gcc/testsuite/g++.dg/template/deduce1.C
new file mode 100644
index 00000000000..262c4fe86e5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/deduce1.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Sep 2002 <nathan@codesourcery.com>
+
+template <typename T> int Foo (T const *)
+{
+ return 1;
+}
+template <typename T> int Foo (T const &)
+{
+ return 2;
+}
+template <typename T, __SIZE_TYPE__ I> int Foo (T const (&ref)[I])
+{
+ return 0;
+}
+
+int main ()
+{
+ static int array[4] = {};
+
+ return Foo (array);
+}
+
diff --git a/gcc/testsuite/g++.dg/template/friend4.C b/gcc/testsuite/g++.dg/template/friend4.C
index 9cd3810c2c2..fabf3375bd2 100644
--- a/gcc/testsuite/g++.dg/template/friend4.C
+++ b/gcc/testsuite/g++.dg/template/friend4.C
@@ -3,7 +3,7 @@
// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 18 Dec 2001 <nathan@codesourcery.com>
-// PR 109, dependant member friends
+// PR 109, dependent member friends
struct B
{
diff --git a/gcc/testsuite/g++.dg/template/meminit1.C b/gcc/testsuite/g++.dg/template/meminit1.C
new file mode 100644
index 00000000000..90b0d7d8539
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/meminit1.C
@@ -0,0 +1,7 @@
+template <class T >
+struct S
+{
+ S() : S() {} // { dg-error "base" }
+};
+
+S<int> s; // { dg-error "instantiated" }
diff --git a/gcc/testsuite/g++.dg/template/pretty1.C b/gcc/testsuite/g++.dg/template/pretty1.C
new file mode 100644
index 00000000000..99cbcd64a55
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pretty1.C
@@ -0,0 +1,43 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7768 template dtor pretty function wrong
+
+#include <string.h>
+
+static size_t current = 0;
+static bool error = false;
+
+static char const *names[] =
+{
+ "X<T>::X() [with T = void]",
+ "X<T>::~X() [with T = void]",
+ 0
+};
+
+void Verify (char const *ptr)
+{
+ error = strcmp (ptr, names[current++]);
+}
+
+template <typename T>
+struct X
+{
+ X() { Verify (__PRETTY_FUNCTION__); }
+ ~X() { Verify (__PRETTY_FUNCTION__); }
+};
+
+int main()
+{
+ {
+ X<void> x;
+
+ if (error)
+ return current;
+ }
+ if (error)
+ return current;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/template/ptrmem3.C b/gcc/testsuite/g++.dg/template/ptrmem3.C
new file mode 100644
index 00000000000..fda7bf10a4d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem3.C
@@ -0,0 +1,22 @@
+// Origin: Theo Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
+
+template <typename T,double (T::*fun)() const>
+struct I {
+};
+
+struct R {
+ R() { }
+};
+
+class H: public R {
+public:
+ H(): R() { }
+ double& f() { return a; }
+ double f() const { return 1.0; }
+ double a;
+};
+
+struct A {
+ typedef I<H,&H::f> F;
+ A() { }
+};
diff --git a/gcc/testsuite/g++.dg/template/qualttp20.C b/gcc/testsuite/g++.dg/template/qualttp20.C
index 2c6c71445c9..6c68a3a2a8a 100644
--- a/gcc/testsuite/g++.dg/template/qualttp20.C
+++ b/gcc/testsuite/g++.dg/template/qualttp20.C
@@ -16,18 +16,20 @@ struct AS
template <typename T> struct B1 : T
{
typedef typename T::L __restrict__ r;// { dg-error "`__restrict' qualifiers cannot" "" }
- typedef typename T::myT __restrict__ p;// { dg-warning "ignoring `__restrict'" "" }
-
- typedef typename T::myT volatile *myvolatile; // { dg-warning "ignoring `volatile'" "" }
- typename T::myT volatile *a; // { dg-warning "ignoring `volatile'" "" }
- myvolatile b; // { dg-bogus "ignoring `volatile'" "" { xfail *-*-* } }
+ typedef typename T::myT __restrict__ p;// { dg-warning "ignoring `__restrict'" "" { xfail *-*-* } }
+
+ // The following are DR 295 dependent
+ typedef typename T::myT volatile *myvolatile; // { dg-error "qualifiers" "" }
+ typename T::myT volatile *a; // { dg-error "qualifiers" "" }
+ myvolatile b; // { dg-error "qualifiers" "" }
};
template <typename T> struct B2 : T
{
- typedef typename T::myT const *myconst;
- typename T::myT const *a;
- myconst b;
+ // The following are DR 295 dependent
+ typedef typename T::myT const *myconst; // { dg-error "qualifiers" "" }
+ typename T::myT const *a; // { dg-error "qualifiers" "" }
+ myconst b; // { dg-error "qualifiers" "" }
};
B1<AS> b1; // { dg-error "instantiated" "" }
-B2<AS> b2;
+B2<AS> b2; // { dg-error "instantiated" "" }
diff --git a/gcc/testsuite/g++.dg/template/ref1.C b/gcc/testsuite/g++.dg/template/ref1.C
new file mode 100644
index 00000000000..3f133d488f5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ref1.C
@@ -0,0 +1,3 @@
+class a {} a1;
+template <a & p> class b { public: b() { static_cast <a &> (p); }; };
+int main() { b <a1> b1; };
diff --git a/gcc/testsuite/g++.dg/template/subst1.C b/gcc/testsuite/g++.dg/template/subst1.C
new file mode 100644
index 00000000000..827af23d21e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/subst1.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7718. ICE.
+
+template <typename OBJECT>
+void default_initializer(const OBJECT &) { }
+
+
+template <typename OBJECT, void init_function(const OBJECT &)>
+class cContainer {
+ public:
+ template <typename INITIALIZER>
+ void Add(const INITIALIZER &initializer) {
+ init_function(initializer);
+ }
+};
+
+int main() {
+ cContainer<int, default_initializer<int> > c;
+
+ c.Add<int>(42);
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/template/union1.C b/gcc/testsuite/g++.dg/template/union1.C
new file mode 100644
index 00000000000..9019c38a285
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/union1.C
@@ -0,0 +1,29 @@
+// { dg-do run }
+
+extern "C" void abort ();
+
+void g (char c)
+{
+ if (c != 'a')
+ abort ();
+}
+
+void h (int i)
+{
+ if (i != 3)
+ abort ();
+}
+
+template <typename T> void f(T const &t)
+{
+ union { char c; T t_; };
+
+ c = 'a';
+ g (c);
+ t_ = 3;
+ h (t_);
+}
+
+int main () {
+ f (3);
+}
diff --git a/gcc/testsuite/g++.dg/tls/init-2.C b/gcc/testsuite/g++.dg/tls/init-2.C
index 49df50147b3..0fff6f6ab1e 100644
--- a/gcc/testsuite/g++.dg/tls/init-2.C
+++ b/gcc/testsuite/g++.dg/tls/init-2.C
@@ -1,13 +1,13 @@
/* Invalid initializations. */
extern __thread int i;
-__thread int *p = &i; /* { dg-error "run-time initialization" } */
+__thread int *p = &i; /* { dg-error "dynamically initialized" } */
extern int f();
-__thread int j = f(); /* { dg-error "run-time initialization" } */
+__thread int j = f(); /* { dg-error "dynamically initialized" } */
struct S
{
S();
};
-__thread S s; /* { dg-error "run-time initialization" } */
+__thread S s; /* { dg-error "non-POD" } */
diff --git a/gcc/testsuite/g++.dg/warn/Wreorder-1.C b/gcc/testsuite/g++.dg/warn/Wreorder-1.C
new file mode 100644
index 00000000000..bd8113a2a47
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreorder-1.C
@@ -0,0 +1,14 @@
+// { dg-options "-Wreorder -W" }
+
+struct S {
+ S ();
+};
+
+struct T {
+ T ();
+};
+
+struct U : virtual public S, virtual public T {
+ U () : T (), S () {} // { dg-warning "" }
+ U (const U&) : S () {} // { dg-warning "copy" }
+};
diff --git a/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C b/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C
index 2944d17a600..c9efd04dbd6 100644
--- a/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C
+++ b/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C
@@ -37,7 +37,7 @@ struct S
};
// Because S does not have a VPTR, it will not be a primary base of T,
-// and will therefore end up at a non-zero offset.
+// and will therefore end up at a nonzero offset.
struct T : public S
{
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900210_05.C b/gcc/testsuite/g++.old-deja/g++.bugs/900210_05.C
index fc0ead9b514..c053c2a7506 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900210_05.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900210_05.C
@@ -12,8 +12,8 @@
// options come to mind.)
// The use of errors rather than warnings is important because errors
-// usually result in non-zero exit status codes for language processors
-// and these non-zero exit stati can be automatically checked during
+// usually result in nonzero exit status codes for language processors
+// and these nonzero exit stati can be automatically checked during
// normal execution of a Makefile.
// cfront 2.0 provides the +p option which causes errors to be generated for
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900211_04.C b/gcc/testsuite/g++.old-deja/g++.bugs/900211_04.C
index 81bea9ef7f1..e2bd8fd3776 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900211_04.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900211_04.C
@@ -1,7 +1,7 @@
// g++ 1.36.1 bug 900211_04
// g++ fails to flag as errors attempts to compare pointer values against
-// (non-zero) integer values;
+// (nonzero) integer values;
// Since implicit conversions of pointer to integers (or vise versa) are
// illegal, these comparisons are also illegal.
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900321_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900321_02.C
index d635ba3d1e7..e54a02d80b6 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900321_02.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900321_02.C
@@ -1,6 +1,6 @@
// g++ 1.37.1 bug 900321_02
-// The following program exits with a non-zero status because the constructor
+// The following program exits with a nonzero status because the constructor
// is not called 3 times as it should be. This program exits with a zero
// status when compiled with cfront 2.0.
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900404_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900404_02.C
index 4099daa31e4..b48eb8ae63e 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900404_02.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900404_02.C
@@ -3,7 +3,7 @@
// g++ fails to treat multicharacter literals as type "int" as required by
// section 2.5.2 of the C++ Reference Manual.
-// The result is that the following program will exit with a non-zero
+// The result is that the following program will exit with a nonzero
// exit status.
// keywords: character literals, multi-character literals, int type
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900520_06.C b/gcc/testsuite/g++.old-deja/g++.bugs/900520_06.C
index aa4ec9a320e..2fda6cacc95 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900520_06.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900520_06.C
@@ -9,7 +9,7 @@
// the class type when a parameter of the class type is passed as an
// actual parameter.
-// This causes the following program to exit with a non-zero exit status.
+// This causes the following program to exit with a nonzero exit status.
// cfront 2.0 passes this test.
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/arrnew.C b/gcc/testsuite/g++.old-deja/g++.ext/arrnew.C
index 0ecb8777e26..53030e0d3d7 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/arrnew.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/arrnew.C
@@ -3,5 +3,5 @@
// Special g++ Options:
int *f(){
- return new int[1] = { 1 }; // WARNING - deprecated
+ return new int[1] = { 1 }; // ERROR - removed
}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/report.C b/gcc/testsuite/g++.old-deja/g++.jason/report.C
index bbc1adaf942..73adee87c9c 100644
--- a/gcc/testsuite/g++.old-deja/g++.jason/report.C
+++ b/gcc/testsuite/g++.old-deja/g++.jason/report.C
@@ -46,8 +46,9 @@ class X{
};
typedef int const * bart ();
-typedef bart const * const * bar2; // ok - constifying qualifiers
-typedef bart volatile * const * bar2v; // WARNING - qualifiers
+//The following is DR295 dependant
+typedef bart const * const * bar2; // ERROR - constifying qualifiers
+typedef bart volatile * const * bar2v; // ERROR - qualifiers
bar2 baz (X::Y y)
{ // ERROR - in this context
diff --git a/gcc/testsuite/g++.old-deja/g++.law/global-init1.C b/gcc/testsuite/g++.old-deja/g++.law/global-init1.C
index 5807b1913a5..3a671585b56 100644
--- a/gcc/testsuite/g++.old-deja/g++.law/global-init1.C
+++ b/gcc/testsuite/g++.old-deja/g++.law/global-init1.C
@@ -2,7 +2,7 @@
// global-init file
// Message-Id: <9212021756.AA12639@grumpy.pocs.com>
// From: wp@pocs.com (Wolfgang Polak)
-// Subject: Initializers - gcc 2.2.2 (g++), Sparc, SunOS 4.1.1
+// Subject: Initializers - gcc 2.2.2 (g++), SPARC, SunOS 4.1.1
// Date: Wed, 2 Dec 92 09:56:01 PST
#include <stdio.h>
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p9129.C b/gcc/testsuite/g++.old-deja/g++.mike/p9129.C
index d66dab52d09..a986104688e 100644
--- a/gcc/testsuite/g++.old-deja/g++.mike/p9129.C
+++ b/gcc/testsuite/g++.old-deja/g++.mike/p9129.C
@@ -7,6 +7,6 @@ public:
int DoSomething();
};
-int (Foo::*pA)() = { &Foo::DoSomething };
+int (Foo::*pA)() = { &Foo::DoSomething }; // ERROR -
int (Foo::*X[1])(int) = { { &Foo::DoSomething } }; // ERROR -
int (Foo::*Y[])(int) = { { &Foo::DoSomething, &Foo::DoSomething, 0 } }; // ERROR -
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/warn3.C b/gcc/testsuite/g++.old-deja/g++.mike/warn3.C
index 7adc8a1c37f..d5ed38371d7 100644
--- a/gcc/testsuite/g++.old-deja/g++.mike/warn3.C
+++ b/gcc/testsuite/g++.old-deja/g++.mike/warn3.C
@@ -7,6 +7,6 @@ public:
};
class D : public B {
- int member;
+ int member; // WARNING - reordered
D() : member(0), B(member) { } // WARNING - reordered
};
diff --git a/gcc/testsuite/g++.old-deja/g++.other/asm3.C b/gcc/testsuite/g++.old-deja/g++.other/asm3.C
index d37de69329a..bf0e423db33 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/asm3.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/asm3.C
@@ -1,5 +1,5 @@
// Build don't link:
-// Skip if not target: i?86-*-*
+// Skip if not target: i?86-*-* x86_64-*-*
// Special g++ Options: -O2
typedef unsigned long long uint64;
diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash32.C b/gcc/testsuite/g++.old-deja/g++.other/crash32.C
index 98366c1e910..9ff4c86fab4 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/crash32.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/crash32.C
@@ -26,7 +26,7 @@ namespace N
typedef baz<bar> c;
}
-struct z
+struct z // crash test - XFAIL *-*-*
{
int a;
};
diff --git a/gcc/testsuite/g++.old-deja/g++.other/delete4.C b/gcc/testsuite/g++.old-deja/g++.other/delete4.C
index 74ddcdd1545..e729ea2dde4 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/delete4.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/delete4.C
@@ -3,7 +3,7 @@
// Copyright (C) 1999 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 15 Apr 1999 <nathan@acm.org>
-// delete (void *)e and delete[] (void *)e result in undefined behaviour
+// delete (void *)e and delete[] (void *)e result in undefined behavior
// [expr.delete/3]. Check we warn about them
// operator new functions can only return NULL, if their exceptions
// specification is `throw()'. All other cases must return a non-null pointer
diff --git a/gcc/testsuite/g++.old-deja/g++.other/inline21.C b/gcc/testsuite/g++.old-deja/g++.other/inline21.C
index 1f3dd0eaa5c..b7edf01be52 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/inline21.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/inline21.C
@@ -18,7 +18,7 @@ struct Container {
};
-// TEST FOR CORRECT BEHAVIOUR
+// TEST FOR CORRECT BEHAVIOR
int myArray[3];
int * intp = myArray;
diff --git a/gcc/testsuite/g++.old-deja/g++.other/qual1.C b/gcc/testsuite/g++.old-deja/g++.other/qual1.C
index fa2d33f2ce8..13f9bbe497a 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/qual1.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/qual1.C
@@ -10,8 +10,9 @@ class
{
public:
func_type *Function;
- const func_type* function(void) { return Function; } // ok constifying
- volatile func_type* functionv(void); // WARNING - qualifier
+ // The following is DR 295 dependent
+ const func_type* function(void) { return Function; } // ERROR - constifying
+ volatile func_type* functionv(void); // ERROR - qualifier
} action;
void work(const char *source)
diff --git a/gcc/testsuite/g++.old-deja/g++.other/singleton.C b/gcc/testsuite/g++.old-deja/g++.other/singleton.C
index 075d83ac79a..36d00f9be42 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/singleton.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/singleton.C
@@ -4,7 +4,7 @@
// egcs fails to see that there is a public static accessor function.
// 2. the program crashes, because apparently the static variable s in
// singleton::instance() is considered constructed although the ctor
-// exited via an exception. (crash changed to non-zero return here)
+// exited via an exception. (crash changed to nonzero return here)
class singleton {
public:
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/asm1.C b/gcc/testsuite/g++.old-deja/g++.pt/asm1.C
index d093002ff8f..70092521dc4 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/asm1.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/asm1.C
@@ -1,6 +1,6 @@
// Build don't link:
// Origin: "Weidmann, Nicholas" <nicholas.weidmann@swx.ch>
-// Skip if not target: i?86-*-linux*
+// Skip if not target: i?86-*-linux* x86_64-*-linux
template<int i> int foo(int v)
{
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash67.C b/gcc/testsuite/g++.old-deja/g++.pt/crash67.C
index e8fc2145ae5..b532e3d22e9 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/crash67.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash67.C
@@ -4,7 +4,7 @@
// Copyright (C) 2001 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 6 May 2001 <nathan@codesourcery.com>
-// Bug 2526. We ICE'd after diagnosing dependant name confusion in
+// Bug 2526. We ICE'd after diagnosing dependent name confusion in
// friendliness when not being pedantic.
template<typename T>
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp64.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp64.C
index fbebe3ae82f..6185d3d6058 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/memtemp64.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp64.C
@@ -4,7 +4,7 @@ template <class T>
struct S1 {};
template <class T>
-void f(T); // ERROR - original declaration.
+void f(T);
template <class C>
struct S2
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eb42.C b/gcc/testsuite/g++.old-deja/g++.robertl/eb42.C
deleted file mode 100644
index c27aa8d2df7..00000000000
--- a/gcc/testsuite/g++.old-deja/g++.robertl/eb42.C
+++ /dev/null
@@ -1,19 +0,0 @@
-//Build don't link:
-#include <vector>
-#include <algorithm>
-
-template <class T> class Expr
-{
-public :
-Expr(){};
-Expr(const T&){};
-};
-
-template <class T >
-inline bool compare(const Expr<T> a, const Expr<T> b){ return true; };
-
-int main()
-{
- std::vector<int> a(3);
- std::sort( a.begin(), a.end(), compare ); // ERROR - no matching function
-}
diff --git a/gcc/testsuite/g77.dg/7388.f b/gcc/testsuite/g77.dg/7388.f
new file mode 100644
index 00000000000..0b8374646b0
--- /dev/null
+++ b/gcc/testsuite/g77.dg/7388.f
@@ -0,0 +1,12 @@
+C { dg-do run }
+C { dg-options "-fbounds-check" }
+ character*25 buff(0:10)
+ character*80 line
+ integer i, m1, m2
+ i = 1
+ m1 = 1
+ m2 = 7
+ buff(i) = 'tcase0a'
+ write(line,*) buff(i)(m1:m2)
+ if (line .ne. ' tcase0a') call abort
+ end
diff --git a/gcc/testsuite/g77.dg/strlen0.f b/gcc/testsuite/g77.dg/strlen0.f
index 79439514726..765c8b61190 100644
--- a/gcc/testsuite/g77.dg/strlen0.f
+++ b/gcc/testsuite/g77.dg/strlen0.f
@@ -28,7 +28,7 @@ C written for null values of str1 and/or str2.
C
C This code compiles and runs without error on
C SunOS 4.1.3 f77 (-C option)
-C SUNWspro SparcCompiler 4.2 f77 (-C option)
+C SUNWspro SPARCcompiler 4.2 f77 (-C option)
C (and with proposed patches, gcc-2.9.2 -fbounds-check except for test 6,
C which is a genuine, deliberate error - comment out to make further
C tests)
diff --git a/gcc/testsuite/g77.f-torture/compile/20010519-1.f b/gcc/testsuite/g77.f-torture/compile/20010519-1.f
index 5690580f751..4da86e815a9 100644
--- a/gcc/testsuite/g77.f-torture/compile/20010519-1.f
+++ b/gcc/testsuite/g77.f-torture/compile/20010519-1.f
@@ -15,7 +15,7 @@ C See: L.Mouawad and D.Perahia, Biopolymers (1993), 33, 599,
C and: D.Perahia and L.Mouawad, Comput. Chem. (1995), 19, 241.
C The method iteratively solves the diagonalization of the
C Hessian matrix. To save memory space, it uses a compressed
-C form of the Hessian, which only contains the non-zero elements.
+C form of the Hessian, which only contains the nonzero elements.
C In the diagonalization process, approximate eigenvectors are
C mixed with Cartesian coordinates to form a reduced basis. The
C Hessian is then diagonalized in the reduced basis. By iterating
diff --git a/gcc/testsuite/g77.f-torture/compile/980310-4.f b/gcc/testsuite/g77.f-torture/compile/980310-4.f
index b169845e634..802e3031f86 100644
--- a/gcc/testsuite/g77.f-torture/compile/980310-4.f
+++ b/gcc/testsuite/g77.f-torture/compile/980310-4.f
@@ -121,7 +121,7 @@ c difficulty involved.
c = 2 the occurrence of roundoff error is
c detected, which prevents the requested
c tolerance from being achieved.
-c = 3 extremely bad integrand behaviour occurs
+c = 3 extremely bad integrand behavior occurs
c at some points of the integration
c interval.
c = 6 the input is invalid, because
@@ -303,7 +303,7 @@ c equals limit.
c
if(last.eq.limit) ier = 1
c
-c set error flag in the case of bad integrand behaviour
+c set error flag in the case of bad integrand behavior
c at a point of the integration range.
c
if(dmax1(dabs(a1),dabs(b2)).le.(0.1d+01+0.1d+03*
diff --git a/gcc/testsuite/gcc.c-torture/compile/20000605-1.c b/gcc/testsuite/gcc.c-torture/compile/20000605-1.c
index 931c5826270..1fe5882340f 100644
--- a/gcc/testsuite/gcc.c-torture/compile/20000605-1.c
+++ b/gcc/testsuite/gcc.c-torture/compile/20000605-1.c
@@ -1,6 +1,6 @@
/* Copyright (C) 2000 Free Software Foundation */
-/* make sure we don't get confused by various flavours of void */
+/* make sure we don't get confused by various flavors of void */
/* Origin: Jakub Jelinek <jakub@redhat.com>
* Joel Sherrill <joel.sherrill@OARcorp.com>
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020910-1.c b/gcc/testsuite/gcc.c-torture/compile/20020910-1.c
new file mode 100644
index 00000000000..31398ea3d45
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020910-1.c
@@ -0,0 +1,14 @@
+unsigned int x0 = 0;
+
+typedef struct {
+ unsigned int field1 : 20;
+ unsigned int field2 : 12;
+} XX;
+
+static XX yy;
+
+static void foo (void)
+{
+ yy.field1 = (unsigned int ) (&x0);
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020926-1.c b/gcc/testsuite/gcc.c-torture/compile/20020926-1.c
new file mode 100644
index 00000000000..260e844549a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020926-1.c
@@ -0,0 +1,21 @@
+/* PR c/7160 */
+/* Verify that the register-to-stack converter properly handles
+ branches without return value containing function calls. */
+
+extern int gi;
+
+extern int foo1(int, int);
+extern void foo2(int, int);
+extern float foo3(int);
+
+float bar(int i1, int i2)
+{
+ int i3;
+
+ if (i2) {
+ i3 = foo1(i1, gi);
+ foo2(i1, i3);
+ }
+ else
+ return foo3(i2);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020927-1.c b/gcc/testsuite/gcc.c-torture/compile/20020927-1.c
new file mode 100644
index 00000000000..b93d8a18d5e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020927-1.c
@@ -0,0 +1,26 @@
+/* PR optimization/7520 */
+/* ICE at -O3 on x86 due to register life problems caused by
+ the return-without-value in bar. */
+
+int
+foo ()
+{
+ int i;
+ long long int j;
+
+ while (1)
+ {
+ if (j & 1)
+ ++i;
+ j >>= 1;
+ if (j)
+ return i;
+ }
+}
+
+int
+bar ()
+{
+ if (foo ())
+ return;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020930-1.c b/gcc/testsuite/gcc.c-torture/compile/20020930-1.c
new file mode 100644
index 00000000000..d2fa3748ab5
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020930-1.c
@@ -0,0 +1,10 @@
+/* PR c/8002 */
+
+float expm1f(float x) {
+ union {
+ float value;
+ unsigned word;
+ } sf_u;
+ sf_u.word = (unsigned) x * 2;
+ return x + sf_u.value;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20021001-1.c b/gcc/testsuite/gcc.c-torture/compile/20021001-1.c
new file mode 100644
index 00000000000..9f0f9c0978f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20021001-1.c
@@ -0,0 +1,4 @@
+int foo (double x, double y)
+{
+ return !__builtin_isunordered (x, y);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20021007-1.c b/gcc/testsuite/gcc.c-torture/compile/20021007-1.c
new file mode 100644
index 00000000000..de4c0defae9
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20021007-1.c
@@ -0,0 +1,11 @@
+/* PR c/7411 */
+/* Verify that GCC simplifies the null addition to i before
+ virtual register substitution tries it and winds up with
+ a memory to memory move. */
+
+void foo ()
+{
+ int i = 0,j;
+
+ i+=j=0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/simd-5.c b/gcc/testsuite/gcc.c-torture/compile/simd-5.c
new file mode 100644
index 00000000000..016cccd1e9f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/simd-5.c
@@ -0,0 +1,12 @@
+#define vector64 __attribute__((vector_size(8)))
+
+main(){
+
+ vector64 int c;
+vector64 int a = {1, -1};
+vector64 int b = {2, -2};
+c = -a + b*b*(-1LL);
+/* c is now {5, 3} */
+
+ printf("result is %llx\n", (long long)c);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/trunctfdf.c b/gcc/testsuite/gcc.c-torture/compile/trunctfdf.c
new file mode 100644
index 00000000000..29d6ed0dc9a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/trunctfdf.c
@@ -0,0 +1,14 @@
+/* Sparc w/128-bit long double bombed on this because even though
+ the trunctfdf libcall passed the long double by reference, the
+ libcall was still marked as LCT_CONST instead of LCT_PURE. */
+
+double *copy(long double *first, long double *last, double *result)
+{
+ int n;
+ for (n = last - first; n > 0; --n) {
+ *result = *first;
+ ++first;
+ ++result;
+ }
+ return result;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20000801-4.c b/gcc/testsuite/gcc.c-torture/execute/20000801-4.c
index dd6227d05fb..d293f05c438 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20000801-4.c
+++ b/gcc/testsuite/gcc.c-torture/execute/20000801-4.c
@@ -1,8 +1,8 @@
/* Origin: PR c/128 from Martin Sebor <sebor@roguewave.com>, adapted
as a testcase by Joseph Myers <jsm28@cam.ac.uk>.
*/
-/* Character arrays initialised by a string literal must have
- uninitialised elements zeroed. This isn't clear in the 1990
+/* Character arrays initialized by a string literal must have
+ uninitialized elements zeroed. This isn't clear in the 1990
standard, but was fixed in TC2 and C99; see DRs #060, #092.
*/
extern void abort (void);
diff --git a/gcc/testsuite/gcc.c-torture/execute/20010915-1.c b/gcc/testsuite/gcc.c-torture/execute/20010915-1.c
index 56155659f5b..5a04bf58f10 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20010915-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/20010915-1.c
@@ -53,7 +53,7 @@ char *m (char *x) { abort (); }
char *s (char *v, char **pp)
{
if (strcmp (v, "a") != 0 || check++ > 1)
- abort;
+ abort ();
*pp = v+1;
return 0;
}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020225-1.c b/gcc/testsuite/gcc.c-torture/execute/20020225-1.c
index 61724a1f006..514730a09aa 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20020225-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/20020225-1.c
@@ -1,5 +1,5 @@
/* This testcase failed at -O2 on powerpc64 due to andsi3 writing
- non-zero bits to the high 32 bits of a 64 bit register. */
+ nonzero bits to the high 32 bits of a 64 bit register. */
extern void abort (void);
extern void exit (int);
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020720-1.x b/gcc/testsuite/gcc.c-torture/execute/20020720-1.x
index 6534217d7c8..167f76274b5 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20020720-1.x
+++ b/gcc/testsuite/gcc.c-torture/execute/20020720-1.x
@@ -1,16 +1,24 @@
# The following targets fail 20020720-1.c for several reasons:
# (1) They implement floating point instructions via software, or
-# (2) Their machine descriptions obfuscate the "abs(x) < 0.0" comparison.
-# For example, 1 insn performs abs, 1 insn loads 0.0, 1 insn sets
-# CCmode flags based upon the FP comparison, and a 4th insn makes
-# a conditional branch based upon the appropriate bits in the flags.
-# If the intermediate comparison can't be recognized, the combiner
-# is unable to optimize all four RTL instructions simultaneously.
+# (2) The "abs(x) < 0.0" comparison is split up in too many intermediate
+# insns for combine to handle -- it can handle max three insns
+# simultaneously. For example, for RISCy machines it is common that 1
+# insn performs abs, 1 insn loads 0.0, 1 insn sets CCmode flags based
+# upon the FP comparison, and a 4th insn makes a conditional branch
+# based upon the appropriate bits in the flags. On the other hand, if
+# for example the comparison insn takes 0.0 as an operand, the
+# combiner is able to see all intermediate instructions simultaneously
+# and can make the optimization.
-if { [istarget "powerpc-*-*"] || [istarget "rs6000-*-*"] \
- || [istarget "mips*-*-*"] || [istarget "xtensa-*-*"] \
- || [istarget "sh-*-*"] } {
- return 1
+# Don't XFAIL at -O0, that should never fail.
+set torture_eval_before_compile {
+ global compiler_conditional_xfail_data
+ set compiler_conditional_xfail_data {
+ "This test fails to optimize completely on certain platforms." \
+ { "xtensa-*-*" "sh-*-*" "arm*-*-*" "strongarm*-*-*" "xscale*-*-*" } \
+ { "*" } \
+ { "-O0" }
+ }
}
return 0
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020904-1.c b/gcc/testsuite/gcc.c-torture/execute/20020904-1.c
new file mode 100644
index 00000000000..24eeb0cb0a0
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20020904-1.c
@@ -0,0 +1,19 @@
+/* PR c/7102 */
+
+/* Verify that GCC zero-extends integer constants
+ in unsigned binary operations. */
+
+typedef unsigned char u8;
+
+u8 fun(u8 y)
+{
+ u8 x=((u8)255)/y;
+ return x;
+}
+
+int main(void)
+{
+ if (fun((u8)2) != 127)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020911-1.c b/gcc/testsuite/gcc.c-torture/execute/20020911-1.c
new file mode 100644
index 00000000000..ec8302211c0
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20020911-1.c
@@ -0,0 +1,8 @@
+extern void abort (void);
+unsigned short c = 0x8000;
+int main()
+{
+ if ((c-0x8000) < 0 || (c-0x8000) > 0x7fff)
+ abort();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020916-1.c b/gcc/testsuite/gcc.c-torture/execute/20020916-1.c
new file mode 100644
index 00000000000..3f2db15d019
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20020916-1.c
@@ -0,0 +1,19 @@
+/* Distilled from try_pre_increment in flow.c. If-conversion inserted
+ new instructions at the wrong place on ppc. */
+
+int foo(int a)
+{
+ int x;
+ x = 0;
+ if (a > 0) x = 1;
+ if (a < 0) x = 1;
+ return x;
+}
+
+int main()
+{
+ if (foo(1) != 1)
+ abort();
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/20021010-1.c b/gcc/testsuite/gcc.c-torture/execute/20021010-1.c
new file mode 100644
index 00000000000..d742ce40b5f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20021010-1.c
@@ -0,0 +1,21 @@
+#include <limits.h>
+
+int
+sub ()
+{
+ int dummy = 0, a = 16;
+
+ if (a / INT_MAX / 16 == 0)
+ return 0;
+ else
+ return a / INT_MAX / 16;
+}
+
+int
+main ()
+{
+ if (sub () != 0)
+ abort ();
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20021010-2.c b/gcc/testsuite/gcc.c-torture/execute/20021010-2.c
new file mode 100644
index 00000000000..425a8f6e4c8
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20021010-2.c
@@ -0,0 +1,37 @@
+/* cse.c failure on x86 target.
+ Contributed by Stuart Hastings 10 Oct 2002 <stuart@apple.com> */
+#include <stdlib.h>
+
+typedef signed short SInt16;
+
+typedef struct {
+ SInt16 minx;
+ SInt16 maxx;
+ SInt16 miny;
+ SInt16 maxy;
+} IOGBounds;
+
+int expectedwidth = 50;
+
+unsigned int *global_vramPtr = (unsigned int *)0xa000;
+
+IOGBounds global_bounds = { 100, 150, 100, 150 };
+IOGBounds global_saveRect = { 75, 175, 75, 175 };
+
+main()
+{
+ unsigned int *vramPtr;
+ int width;
+ IOGBounds saveRect = global_saveRect;
+ IOGBounds bounds = global_bounds;
+
+ if (saveRect.minx < bounds.minx) saveRect.minx = bounds.minx;
+ if (saveRect.maxx > bounds.maxx) saveRect.maxx = bounds.maxx;
+
+ vramPtr = global_vramPtr + (saveRect.miny - bounds.miny) ;
+ width = saveRect.maxx - saveRect.minx;
+
+ if (width != expectedwidth)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20021011-1.c b/gcc/testsuite/gcc.c-torture/execute/20021011-1.c
new file mode 100644
index 00000000000..b1b2c406a71
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20021011-1.c
@@ -0,0 +1,24 @@
+/* PR opt/8165. */
+
+extern void abort (void);
+
+char buf[64];
+
+int
+main (void)
+{
+ int i;
+
+ __builtin_strcpy (buf, "mystring");
+ if (__builtin_strcmp (buf, "mystring") != 0)
+ abort ();
+
+ for (i = 0; i < 16; ++i)
+ {
+ __builtin_strcpy (buf + i, "mystring");
+ if (__builtin_strcmp (buf + i, "mystring") != 0)
+ abort ();
+ }
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20021015-1.c b/gcc/testsuite/gcc.c-torture/execute/20021015-1.c
new file mode 100644
index 00000000000..9d357c0388f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20021015-1.c
@@ -0,0 +1,30 @@
+/* PR opt/7409. */
+
+extern void abort (void);
+
+char g_list[] = { '1' };
+
+void g (void *p, char *list, int length, char **elementPtr, char **nextPtr)
+{
+ if (*nextPtr != g_list)
+ abort ();
+
+ **nextPtr = 0;
+}
+
+int main (void)
+{
+ char *list = g_list;
+ char *element;
+ int i, length = 100;
+
+ for (i = 0; *list != 0; i++)
+ {
+ char *prevList = list;
+ g (0, list, length, &element, &list);
+ length -= (list - prevList);
+ }
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/990208-1.x b/gcc/testsuite/gcc.c-torture/execute/990208-1.x
index 95b82b5d45e..c1710099151 100644
--- a/gcc/testsuite/gcc.c-torture/execute/990208-1.x
+++ b/gcc/testsuite/gcc.c-torture/execute/990208-1.x
@@ -5,7 +5,7 @@ set torture_eval_before_execute {
set compiler_conditional_xfail_data {
"ifcvt transforms 2 inlined labels to the same address" \
- "ia64-*-*" \
+ { "ia64-*-*" "arm*-*-*" "strongarm*-*-*" "xscale*-*-*" } \
{ "-O3" } \
{ "" }
}
diff --git a/gcc/testsuite/gcc.c-torture/execute/extzvsi.c b/gcc/testsuite/gcc.c-torture/execute/extzvsi.c
new file mode 100644
index 00000000000..ba251271896
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/extzvsi.c
@@ -0,0 +1,31 @@
+/* Failed on powerpc due to bad extzvsi pattern. */
+
+struct ieee
+{
+ unsigned int negative:1;
+ unsigned int exponent:11;
+ unsigned int mantissa0:20;
+ unsigned int mantissa1:32;
+} x;
+
+unsigned int
+foo (void)
+{
+ unsigned int exponent;
+
+ exponent = x.exponent;
+ if (exponent == 0)
+ return 1;
+ else if (exponent > 1)
+ return 2;
+ return 0;
+}
+
+int
+main (void)
+{
+ x.exponent = 1;
+ if (foo () != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ffs-1.c b/gcc/testsuite/gcc.c-torture/execute/ffs-1.c
new file mode 100644
index 00000000000..da82e55805d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ffs-1.c
@@ -0,0 +1,12 @@
+__volatile int a = 0;
+
+extern void abort (void);
+extern void exit (int);
+
+int
+main (void)
+{
+ if (__builtin_ffs (a) != 0)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ffs-2.c b/gcc/testsuite/gcc.c-torture/execute/ffs-2.c
new file mode 100644
index 00000000000..ae246cebf85
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ffs-2.c
@@ -0,0 +1,44 @@
+struct
+ {
+ int input;
+ int output;
+ }
+ffstesttab[] =
+ {
+#if __INT_MAX__ >= 2147483647
+ /* at least 32-bit integers */
+ { 0x80000000, 32 },
+ { 0xa5a5a5a5, 1 },
+ { 0x5a5a5a5a, 2 },
+ { 0xcafe0000, 18 },
+#endif
+#if __INT_MAX__ >= 32767
+ /* at least 16-bit integers */
+ { 0x8000, 16 },
+ { 0xa5a5, 1 },
+ { 0x5a5a, 2 },
+ { 0x0ca0, 6 },
+#endif
+#if __INT_MAX__ < 32767
+#error integers are too small
+#endif
+ };
+
+#define NFFSTESTS (sizeof (ffstesttab) / sizeof (ffstesttab[0]))
+
+extern void abort (void);
+extern void exit (int);
+
+int
+main (void)
+{
+ int i;
+
+ for (i = 0; i < NFFSTESTS; i++)
+ {
+ if (__builtin_ffs (ffstesttab[i].input) != ffstesttab[i].output)
+ abort ();
+ }
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/20010226-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/20010226-1.c
index 91c8da3b4d9..daa2745e939 100644
--- a/gcc/testsuite/gcc.c-torture/execute/ieee/20010226-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/20010226-1.c
@@ -1,17 +1,24 @@
+#include <float.h>
+
long double dfrom = 1.1;
long double m1;
long double m2;
unsigned long mant_long;
-int main( )
+int main()
{
- m1 = dfrom / 2.0;
+ /* Some targets don't support a conforming long double type. This is
+ common with very small parts which set long double == float. Look
+ to see if the type has at least 32 bits of precision. */
+ if (LDBL_EPSILON > 0x1p-31L)
+ return 0;
+ m1 = dfrom / 2.0;
m2 = m1 * 4294967296.0;
mant_long = ((unsigned long) m2) & 0xffffffff;
- if ( mant_long == 0x8ccccccc)
- exit (0);
+ if (mant_long == 0x8ccccccc)
+ return 0;
else
abort();
}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/inf-1.c b/gcc/testsuite/gcc.c-torture/execute/ieee/inf-1.c
new file mode 100644
index 00000000000..34f60f3f1c0
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/inf-1.c
@@ -0,0 +1,35 @@
+extern void abort (void);
+
+int main()
+{
+ float fi = __builtin_inff();
+ double di = __builtin_inf();
+ long double li = __builtin_infl();
+
+ float fh = __builtin_huge_valf();
+ double dh = __builtin_huge_val();
+ long double lh = __builtin_huge_vall();
+
+ if (fi + fi != fi)
+ abort ();
+ if (di + di != di)
+ abort ();
+ if (li + li != li)
+ abort ();
+
+ if (fi != fh)
+ abort ();
+ if (di != dh)
+ abort ();
+ if (li != lh)
+ abort ();
+
+ if (fi <= 0)
+ abort ();
+ if (di <= 0)
+ abort ();
+ if (li <= 0)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/mzero3.c b/gcc/testsuite/gcc.c-torture/execute/ieee/mzero3.c
new file mode 100644
index 00000000000..fdfb8a11813
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/mzero3.c
@@ -0,0 +1,51 @@
+/* Copyright (C) 2002 Free Software Foundation.
+ by Hans-Peter Nilsson <hp@bitrange.com>, derived from mzero2.c
+
+ In the MMIX port, negdf2 was bogusly expanding -x into 0 - x. */
+
+double nzerod = -0.0;
+float nzerof = -0.0;
+double zerod = 0.0;
+float zerof = 0.0;
+
+void expectd (double, double);
+void expectf (float, float);
+double negd (double);
+float negf (float);
+
+main ()
+{
+ expectd (negd (zerod), nzerod);
+ expectf (negf (zerof), nzerof);
+ expectd (negd (nzerod), zerod);
+ expectf (negf (nzerof), zerof);
+ exit (0);
+}
+
+void
+expectd (double value, double expected)
+{
+ if (value != expected
+ || memcmp ((void *)&value, (void *) &expected, sizeof (double)) != 0)
+ abort ();
+}
+
+void
+expectf (float value, float expected)
+{
+ if (value != expected
+ || memcmp ((void *)&value, (void *) &expected, sizeof (float)) != 0)
+ abort ();
+}
+
+double
+negd (double v)
+{
+ return -v;
+}
+
+float
+negf (float v)
+{
+ return -v;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/loop-14.c b/gcc/testsuite/gcc.c-torture/execute/loop-14.c
new file mode 100644
index 00000000000..8c9929276bc
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/loop-14.c
@@ -0,0 +1,20 @@
+int a3[3];
+
+void f(int *a)
+{
+ int i;
+
+ for (i=3; --i;)
+ a[i] = 42 / i;
+}
+
+int
+main ()
+{
+ f(a3);
+
+ if (a3[1] != 42 || a3[2] != 21)
+ abort ();
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/loop-15.c b/gcc/testsuite/gcc.c-torture/execute/loop-15.c
new file mode 100644
index 00000000000..8cb5125a29e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/loop-15.c
@@ -0,0 +1,40 @@
+/* Bombed with a segfault on powerpc-linux. doloop.c generated wrong
+ loop count. */
+void
+foo (unsigned long *start, unsigned long *end)
+{
+ unsigned long *temp = end - 1;
+
+ while (end > start)
+ *end-- = *temp--;
+}
+
+int
+main (void)
+{
+ unsigned long a[5];
+ int start, end, k;
+
+ for (start = 0; start < 5; start++)
+ for (end = 0; end < 5; end++)
+ {
+ for (k = 0; k < 5; k++)
+ a[k] = k;
+
+ foo (a + start, a + end);
+
+ for (k = 0; k <= start; k++)
+ if (a[k] != k)
+ abort ();
+
+ for (k = start + 1; k <= end; k++)
+ if (a[k] != k - 1)
+ abort ();
+
+ for (k = end + 1; k < 5; k++)
+ if (a[k] != k)
+ abort ();
+ }
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/shiftdi.c b/gcc/testsuite/gcc.c-torture/execute/shiftdi.c
new file mode 100644
index 00000000000..44f0dfc2bce
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/shiftdi.c
@@ -0,0 +1,20 @@
+/* Failed on sparc with -mv8plus because sparc.c:set_extends() thought
+ erroneously that SImode ASHIFT chops the upper bits, it does not. */
+
+typedef unsigned long long uint64;
+
+void g(uint64 x, int y, int z, uint64 *p)
+{
+ unsigned w = ((x >> y) & 0xffffffffULL) << (z & 0x1f);
+ *p |= (w & 0xffffffffULL) << z;
+}
+
+int main(void)
+{
+ uint64 a = 0;
+ g(0xdeadbeef01234567ULL, 0, 0, &a);
+ return (a == 0x01234567) ? 0 : 1;
+}
+
+
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/shiftopt-1.c b/gcc/testsuite/gcc.c-torture/execute/shiftopt-1.c
new file mode 100644
index 00000000000..fa9517a73db
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/shiftopt-1.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 2002 Free Software Foundation
+
+ Check that constant folding of shift operations is working.
+
+ Roger Sayle, 10th October 2002. */
+
+extern void abort (void);
+extern void link_error (void);
+
+void
+utest (unsigned int x)
+{
+ if (x >> 0 != x)
+ link_error ();
+
+ if (x << 0 != x)
+ link_error ();
+
+ if (0 << x != 0)
+ link_error ();
+
+ if (0 >> x != 0)
+ link_error ();
+
+ if (-1 >> x != -1)
+ link_error ();
+
+ if (~0 >> x != ~0)
+ link_error ();
+}
+
+void
+stest (int x)
+{
+ if (x >> 0 != x)
+ link_error ();
+
+ if (x << 0 != x)
+ link_error ();
+
+ if (0 << x != 0)
+ link_error ();
+
+ if (0 >> x != 0)
+ link_error ();
+
+ if (-1 >> x != -1)
+ link_error ();
+
+ if (~0 >> x != ~0)
+ link_error ();
+}
+
+int
+main ()
+{
+ utest(9);
+ utest(0);
+
+ stest(9);
+ stest(0);
+
+ return 0;
+}
+
+#ifndef __OPTIMIZE__
+void
+link_error ()
+{
+ abort ();
+}
+#endif
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/simd-1.c b/gcc/testsuite/gcc.c-torture/execute/simd-1.c
index a93a6191cd1..e103fd7244a 100644
--- a/gcc/testsuite/gcc.c-torture/execute/simd-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/simd-1.c
@@ -5,6 +5,7 @@
*/
typedef int __attribute__((mode(V4SI))) vecint;
+typedef int __attribute__((mode(SI))) siint;
vecint i = { 150, 100, 150, 200 };
vecint j = { 10, 13, 20, 30 };
@@ -12,13 +13,13 @@ vecint k;
union {
vecint v;
- int i[4];
+ siint i[4];
} res;
/* This should go away once we can use == and != on vector types. */
void
-verify (int a1, int a2, int a3, int a4,
- int b1, int b2, int b3, int b4)
+verify (siint a1, siint a2, siint a3, siint a4,
+ siint b1, siint b2, siint b3, siint b4)
{
if (a1 != b1
|| a2 != b2
diff --git a/gcc/testsuite/gcc.c-torture/execute/strct-stdarg-1.x b/gcc/testsuite/gcc.c-torture/execute/strct-stdarg-1.x
deleted file mode 100644
index 3a33cbb625e..00000000000
--- a/gcc/testsuite/gcc.c-torture/execute/strct-stdarg-1.x
+++ /dev/null
@@ -1,7 +0,0 @@
-# This doesn't work on PAs
-
-if { [istarget "hppa*-*-*"] } {
- set torture_execute_xfail "hppa*-*-*"
-}
-
-return 0
diff --git a/gcc/testsuite/gcc.c-torture/execute/struct-cpy-1.c b/gcc/testsuite/gcc.c-torture/execute/struct-cpy-1.c
new file mode 100644
index 00000000000..52886feee0f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/struct-cpy-1.c
@@ -0,0 +1,43 @@
+/* powerpc64-linux gcc miscompiled this due to rs6000.c:expand_block_move
+ not setting mem aliasing info correctly for the code implementing the
+ structure assignment. */
+
+struct termios
+{
+ unsigned int a;
+ unsigned int b;
+ unsigned int c;
+ unsigned int d;
+ unsigned char pad[28];
+};
+
+struct tty_driver
+{
+ unsigned char pad1[38];
+ struct termios t __attribute__ ((aligned (8)));
+};
+
+static struct termios zero_t;
+static struct tty_driver pty;
+
+void ini (void)
+{
+ pty.t = zero_t;
+ pty.t.a = 1;
+ pty.t.b = 2;
+ pty.t.c = 3;
+ pty.t.d = 4;
+}
+
+int main (void)
+{
+ extern void abort (void);
+
+ ini ();
+ if (pty.t.a != 1
+ || pty.t.b != 2
+ || pty.t.c != 3
+ || pty.t.d != 4)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/20000614-2.c b/gcc/testsuite/gcc.dg/20000614-2.c
index 17a20205a3d..eb30fc6cd55 100644
--- a/gcc/testsuite/gcc.dg/20000614-2.c
+++ b/gcc/testsuite/gcc.dg/20000614-2.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-*} } */
/* { dg-options "-O2 -fno-strength-reduce" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/20020103-1.c b/gcc/testsuite/gcc.dg/20020103-1.c
index 7a5fdbe4b45..5197fa67e1f 100644
--- a/gcc/testsuite/gcc.dg/20020103-1.c
+++ b/gcc/testsuite/gcc.dg/20020103-1.c
@@ -1,6 +1,6 @@
/* Verify that constant equivalences get reloaded properly, either by being
spilled to the stack, or regenerated, but not dropped to memory. */
-/* { dg-do compile { target i?86-*-* powerpc-*-* rs6000-*-* alpha*-*-* } } */
+/* { dg-do compile { target i?86-*-* powerpc-*-* rs6000-*-* alpha*-*-* x86_64-*-*} } */
/* { dg-options "-O2 -fpic -fno-omit-frame-pointer" } */
/* { dg-final { scan-assembler-not "LC" } } */
@@ -16,6 +16,9 @@
#define clobber \
asm volatile("#asm" : : : "$9", "$10", "$11", "$12", "$13", "$14", \
"$f2", "$f3", "$f4", "$f5", "$f6", "$f7", "$f8", "$f9")
+#elif defined(__x86_64__)
+#define clobber \
+ asm volatile("#asm" : : : "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", "r11")
#else
#error no clobber macro defined
#endif
diff --git a/gcc/testsuite/gcc.dg/20020219-1.c b/gcc/testsuite/gcc.dg/20020219-1.c
index c879f230db6..a3cda0e65d6 100644
--- a/gcc/testsuite/gcc.dg/20020219-1.c
+++ b/gcc/testsuite/gcc.dg/20020219-1.c
@@ -1,8 +1,16 @@
/* PR c/4389
This testcase failed because host_integerp (x, 0) was returning
- 1 even for constants bigger than 2^31. */
+ 1 even for constants bigger than 2^31. It fails under under hpux
+ without -mdisable-indexing because the pointer x - 1 is used as
+ the base address of an indexed load. Because the struct A is not
+ actually allocated, x - 1 lies in the text segment and this causes
+ the wrong space register to be selected for the load. */
/* { dg-do run } */
/* { dg-options "-O2" } */
+/* { dg-options "-O2 -mdisable-indexing" { target hppa*-*-hpux* } } */
+
+/* Disable the test entirely for 16-bit targets. */
+#if __INT_MAX__ > 32767
extern void abort (void);
extern void exit (int);
@@ -26,3 +34,9 @@ int main (void)
foo (x - 1, 9999);
exit (0);
}
+
+#else
+
+int main () { return 0; }
+
+#endif /* __INT_MAX__ */
diff --git a/gcc/testsuite/gcc.dg/20020312-2.c b/gcc/testsuite/gcc.dg/20020312-2.c
index e9db7b50d69..8231938b50f 100644
--- a/gcc/testsuite/gcc.dg/20020312-2.c
+++ b/gcc/testsuite/gcc.dg/20020312-2.c
@@ -66,14 +66,14 @@
/* No pic register. */
#elif #cpu(ns32k)
/* No pic register. */
-#elif defined(__parisc__)
+#elif defined(__hppa__)
/* PIC register is %r27 or %r19, but is used even without -fpic. */
#elif defined(__pdp11__)
/* No pic register. */
#elif defined(__pj__)
/* No pic register. */
-#elif defined(__powerpc__) || defined(__PPC__)
-# ifdef __darwin__
+#elif defined(__powerpc__) || defined(__PPC__) || defined(__POWERPC__)
+# ifdef __MACH__
# define PIC_REG "31"
# else
# define PIC_REG "30"
@@ -96,6 +96,8 @@
/* No pic register. */
#elif defined(__sh__)
# define PIC_REG "r12"
+#elif defined(__x86_64__)
+/* No pic register. */
#else
# error "Modify the test for your target."
#endif
@@ -142,8 +144,9 @@ main()
/* Additionally test that the prologue/epilogue properly does *not*
save and restore global registers. Not possible when the PIC
- register is in a register window, of course. */
-#ifndef __sparc__
+ register is in a register window, of course. On Darwin, you can't
+ call library routines from non-PIC code. */
+#if !defined (__sparc__) && !(defined(__MACH__) && defined(__POWERPC__))
if (reg)
abort ();
#endif
diff --git a/gcc/testsuite/gcc.dg/20020411-1.c b/gcc/testsuite/gcc.dg/20020411-1.c
index d8a939254a8..a1834b8a1a5 100644
--- a/gcc/testsuite/gcc.dg/20020411-1.c
+++ b/gcc/testsuite/gcc.dg/20020411-1.c
@@ -5,6 +5,8 @@
/* { dg-options "-O2" } */
/* { dg-options "-O2 -march=i686" { target i?86-*-* } } */
+#if __INT_MAX__ > 32767
+
typedef struct
{
unsigned a : 16;
@@ -48,3 +50,5 @@ baz (unsigned int x, unsigned char y)
foo (&t, 1);
bar (&t);
}
+
+#endif /* __INT_MAX__ */
diff --git a/gcc/testsuite/gcc.dg/20020523-2.c b/gcc/testsuite/gcc.dg/20020523-2.c
new file mode 100644
index 00000000000..5ae3da5473a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020523-2.c
@@ -0,0 +1,65 @@
+/* PR target/6753
+ This testcase was miscompiled because sse_mov?fcc_const0*
+ patterns were missing earlyclobber. */
+/* { dg-do run { target i386-*-* } } */
+/* { dg-options "-march=pentium3 -msse -ffast-math -O2" } */
+
+extern void abort (void);
+extern void exit (int);
+
+float one = 1.f;
+
+void bar (float f)
+{
+ if (__builtin_memcmp (&one, &f, sizeof (float)))
+ abort ();
+}
+
+float foo (void)
+{
+ return 1.f;
+}
+
+typedef struct
+{
+ float t;
+} T;
+
+void bail_if_no_sse (void)
+{
+ int fl1, fl2;
+
+ /* See if we can use cpuid. */
+ __asm__ ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;"
+ "pushl %0; popfl; pushfl; popl %0; popfl"
+ : "=&r" (fl1), "=&r" (fl2)
+ : "i" (0x00200000));
+ if (((fl1 ^ fl2) & 0x00200000) == 0)
+ exit (0);
+
+ /* See if cpuid gives capabilities. */
+ __asm__ ("cpuid" : "=a" (fl1) : "0" (0) : "ebx", "ecx", "edx", "cc");
+ if (fl1 == 0)
+ exit (0);
+
+ /* See if capabilities include SSE (25th bit; 26 for SSE2). */
+ __asm__ ("cpuid" : "=a" (fl1), "=d" (fl2) : "0" (1) : "ebx", "ecx", "cc");
+ if ((fl2 & (1 << 25)) == 0)
+ exit (0);
+}
+
+int main (void)
+{
+ int i;
+ T x[1];
+
+ bail_if_no_sse ();
+ for (i = 0; i < 1; i++)
+ {
+ x[i].t = foo ();
+ x[i].t = 0.f > x[i].t ? 0.f : x[i].t;
+ bar (x[i].t);
+ }
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.dg/20020919-1.c b/gcc/testsuite/gcc.dg/20020919-1.c
new file mode 100644
index 00000000000..0eb6b50bdc9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020919-1.c
@@ -0,0 +1,248 @@
+/* Copyright (C) 2002 Free Software Foundation.
+ by Hans-Peter Nilsson <hp@axis.com>
+
+ Making sure that asm clobbers conflicting with asm-declared input
+ operands are detected: ``You may not write a clobber description in a
+ way that overlaps with an input or output operand''.
+
+ You must be this tall ---> fit two long longs in asm-declared registers
+ to enter this amusement. */
+
+/* { dg-do compile { target alpha-*-* cris-*-* i?86-*-* mmix-*-* powerpc-*-* rs6000-*-* x86_64-*-* } } */
+/* { dg-options "-O2" } */
+
+/* Constructed examples; input/output (same register), output, input, and
+ input and output (different registers). */
+
+/* The long longs are used to test overlap overlap for multi-register
+ registers. REG2 and REG4 must be the second halves (defined as
+ higher-numbered parts) of REG1 and REG3 respectively when two registers
+ are needed. */
+
+#if defined (__alpha__)
+# define REG1 "$1"
+# define REG2 "$2"
+#elif defined (__CRIS__)
+# define REG1 "r10"
+# define REG2 "r11"
+# define REG3 "r12"
+# define REG4 "r13"
+# define REG5 "r9"
+#elif defined (__i386__)
+# define REG1 "%eax"
+# define REG2 "%edx"
+# define REG3 "%ecx"
+# define REG4 "%ebx"
+#elif defined (__MMIX__)
+# define REG1 "$8"
+# define REG2 "$9"
+#elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \
+ || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2)
+# define REG1 "6"
+# define REG2 "7"
+# define REG3 "8"
+# define REG4 "9"
+#elif defined (__x86_64__)
+# define REG1 "rax"
+# define REG2 "rdx"
+#endif
+
+/* For readability of the tests. */
+#ifdef REG3
+# define REG1a REG1
+# define REG1b REG2
+# define REG2a REG3
+# define REG2b REG4
+#else
+# define REG1a REG1
+# define REG1b REG1
+# define REG2a REG2
+# define REG2b REG2
+#endif
+
+/* REG5 is just another reg if there is one; the difference to REG4 is to
+ keep the original set of registers for CRIS. */
+#ifndef REG5
+#define REG5 REG2b
+#endif
+
+void *
+foo (void *p)
+{
+ register void *q asm (REG1) = p;
+ asm ("foo1 %0" : "=r" (q) : "0" (q) : REG1); /* { dg-error "conflict" } */
+ return q;
+}
+
+void *
+nfoo (void *p)
+{
+ register void *q asm (REG1) = p;
+ asm ("foo1 %0" : "=r" (q) : "0" (q) : REG2);
+ return q;
+}
+
+long long
+foolla (long long llp)
+{
+ register long long ll asm (REG1a) = llp;
+ asm ("foo1a %0" : "=r" (ll) : "0" (ll) : REG1a); /* { dg-error "conflict" } */
+ return ll;
+}
+
+long long
+nfoolla (long long llp)
+{
+ register long long ll asm (REG1a) = llp;
+ asm ("foo1a %0" : "=r" (ll) : "0" (ll) : REG2a);
+ return ll;
+}
+
+long long
+foollb (long long llp)
+{
+ register long long ll asm (REG1a) = llp;
+ asm ("foo1b %0" : "=r" (ll) : "0" (ll) : REG1b); /* { dg-error "conflict" } */
+ return ll;
+}
+
+void *
+bar (void *p)
+{
+ register void *q asm (REG1);
+ register void *w asm (REG2) = p;
+ asm ("bar1 %1,%0" : "=r" (q) : "r" (w) : REG1); /* { dg-error "conflict" } */
+ return q;
+}
+
+long long
+barlla (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm asm (REG2a) = llp;
+ asm ("bar1a %1,%0" : "=r" (ll) : "r" (mm) : REG1b); /* { dg-error "conflict" } */
+ return ll;
+}
+
+long long
+barllb (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm asm (REG2a) = llp;
+ asm ("bar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b); /* { dg-error "conflict" } */
+ return ll;
+}
+
+void *
+foobar (void *p)
+{
+ register void *q asm (REG1);
+ register void *w asm (REG2) = p;
+ asm ("foobar1 %1,%0" : "=r" (q) : "r" (w) : REG2); /* { dg-error "conflict" } */
+ return q;
+}
+
+void *
+nfoobar (void *p)
+{
+ register void *q asm (REG1);
+ register void *w = p;
+ asm ("foobar1 %1,%0" : "=r" (q) : "r" (w) : REG2);
+ return q;
+}
+
+long long
+foobarlla (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm asm (REG2a) = llp;
+ asm ("foobar1a %1,%0" : "=r" (ll) : "r" (mm) : REG1b); /* { dg-error "conflict" } */
+ return ll;
+}
+
+long long
+nfoobarlla (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm = llp;
+ asm ("foobar1a %1,%0" : "=r" (ll) : "r" (mm) : REG2a);
+ return ll;
+}
+
+long long
+foobarllb (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm asm (REG2a) = llp;
+ asm ("foobar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b); /* { dg-error "conflict" } */
+ return ll;
+}
+
+long long
+nfoobarllb (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm = llp;
+ asm ("foobar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b);
+ return ll;
+}
+
+void *
+baz (void *p)
+{
+ register void *q asm (REG1);
+ register void *w asm (REG2) = p;
+ asm ("baz1 %1,%0" : "=r" (q) : "r" (w) : REG1, REG2); /* { dg-error "conflict" } */
+ return q;
+}
+
+void *
+nbaz (void *p)
+{
+ register void *q;
+ register void *w = p;
+ asm ("baz1 %1,%0" : "=r" (q) : "r" (w) : REG1, REG2);
+ return q;
+}
+
+void *
+nbaz2 (void *p)
+{
+ register void *q asm (REG1);
+ register void *w asm (REG2) = p;
+ asm ("baz1 %1,%0" : "=r" (q) : "r" (w));
+ return q;
+}
+
+long long
+bazlla (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm asm (REG2a) = llp;
+ asm ("baz1a %1,%0" : "=r" (ll) : "r" (mm) : REG1a, REG2a); /* { dg-error "conflict" } */
+ return ll;
+}
+
+long long
+bazllb (long long llp)
+{
+ register long long ll asm (REG1a);
+ register long long mm asm (REG2a) = llp;
+ asm ("baz2a %1,%0" : "=r" (ll) : "r" (mm) : REG1b, REG2b); /* { dg-error "conflict" } */
+ return ll;
+}
+
+/* Real-world example of bug. */
+
+struct stat;
+int
+_dl_stat (const char *file_name, struct stat *buf)
+{
+ register long a asm (REG1) = (long) file_name;
+ register long b asm (REG2) = (long) buf;
+
+ asm volatile ("movu.w %1,$r9\n\tbreak 13" : "=r" (a) : "g" (106), "0" (a), "r" (b) : REG1, REG5); /* { dg-error "conflict" } */
+ if (a >= 0)
+ return (int) a;
+ return (int) -1;
+}
diff --git a/gcc/testsuite/gcc.dg/20020926-1.c b/gcc/testsuite/gcc.dg/20020926-1.c
new file mode 100644
index 00000000000..d2d65740be7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020926-1.c
@@ -0,0 +1,14 @@
+/* Make sure that LEGITIMIZE_ADDRESS is called to handle
+ negative displacements. */
+
+/* { dg-do compile { target s390-*-* } } */
+/* { dg-options "-O2" } */
+
+int test (int *addr)
+{
+ return *(addr - 1);
+}
+
+/* { dg-final { scan-assembler "-4096" } } */
+/* { dg-final { scan-assembler-not "ahi" } } */
+
diff --git a/gcc/testsuite/gcc.dg/20021006-1.c b/gcc/testsuite/gcc.dg/20021006-1.c
new file mode 100644
index 00000000000..63cc8a5af09
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20021006-1.c
@@ -0,0 +1,27 @@
+/* PR target/7559
+ This testcase was miscompiled on x86-64 due to wrong access to the struct
+ members. */
+
+extern void abort();
+
+struct A {
+ long x;
+};
+
+struct R {
+ struct A a, b;
+};
+
+struct R R = {
+ {100}, {200}
+};
+
+void f(struct R r) {
+ if (r.a.x != R.a.x || r.b.x != R.b.x)
+ abort();
+}
+
+int main() {
+ f(R);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/20021014-1.c b/gcc/testsuite/gcc.dg/20021014-1.c
new file mode 100644
index 00000000000..9194aab677d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20021014-1.c
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -p" } */
+
+extern void abort (void);
+extern void exit (int);
+
+int foo (void)
+{
+ static int bar (int x)
+ {
+ return x + 3;
+ }
+ return bar (1) + bar (2);
+}
+
+int main (void)
+{
+ if (foo () != 9)
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.dg/980211-1.c b/gcc/testsuite/gcc.dg/980211-1.c
index 11b3c36f172..973a30fbd67 100644
--- a/gcc/testsuite/gcc.dg/980211-1.c
+++ b/gcc/testsuite/gcc.dg/980211-1.c
@@ -1,6 +1,6 @@
-/* Test long double on x86. */
+/* Test long double on x86 and x86-64. */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-*} } */
/* { dg-options -O2 } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/alias-1.c b/gcc/testsuite/gcc.dg/alias-1.c
new file mode 100644
index 00000000000..a723083672c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/alias-1.c
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing -fstrict-aliasing" }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com>
+
+// 8083. warn about odd casts
+
+typedef int YYSTYPE;
+typedef struct tDefEntry
+{
+ unsigned t;
+
+} tDefEntry;
+struct incomplete;
+
+
+YYSTYPE
+ addSibMacro(
+ YYSTYPE list )
+ {
+ tDefEntry** ppT = (tDefEntry**)&list; // { dg-warning "type-punned pointer" "" }
+
+ struct incomplete *p = (struct incomplete *)&list; // { dg-warning "type-punning to incomplete" "" }
+
+ return list;
+ }
+
diff --git a/gcc/testsuite/gcc.dg/builtin-inf-1.c b/gcc/testsuite/gcc.dg/builtin-inf-1.c
new file mode 100644
index 00000000000..ca235adeec0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-inf-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+float fi = __builtin_inff();
+double di = __builtin_inf();
+long double li = __builtin_infl();
+
+float fh = __builtin_huge_valf();
+double dh = __builtin_huge_val();
+long double lh = __builtin_huge_vall();
+
+/* { dg-warning "does not support infinity" "INF unsupported" { target vax-*-* i370-*-* c4x-*-* } 3 } */
+/* { dg-warning "does not support infinity" "INF unsupported" { target vax-*-* i370-*-* c4x-*-* } 4 } */
+/* { dg-warning "does not support infinity" "INF unsupported" { target vax-*-* i370-*-* c4x-*-* } 5 } */
diff --git a/gcc/testsuite/gcc.dg/builtins-2.c b/gcc/testsuite/gcc.dg/builtins-2.c
new file mode 100644
index 00000000000..68ef67e297b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtins-2.c
@@ -0,0 +1,146 @@
+/* Copyright (C) 2002 Free Software Foundation.
+
+ Verify that built-in math function constant folding doesn't
+ cause any problems for the compiler.
+
+ Written by Roger Sayle, 16th August 2002. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+
+double test1(double x)
+{
+ return log(exp(x));
+}
+
+double test2(double x)
+{
+ return exp(log(x));
+}
+
+double test3(double x)
+{
+ return sqrt(exp(x));
+}
+
+double test4(double x)
+{
+ return log(sqrt(x));
+}
+
+double test5(double x, double y)
+{
+ return sqrt(x)*sqrt(y);
+}
+
+double test6(double x, double y)
+{
+ return exp(x)*exp(y);
+}
+
+double test7(double x, double y)
+{
+ return x/exp(y);
+}
+
+double test8(double x)
+{
+ return fabs(sqrt(x));
+}
+
+double test9(double x)
+{
+ return fabs(exp(x));
+}
+
+float test1f(float x)
+{
+ return logf(expf(x));
+}
+
+float test2f(float x)
+{
+ return expf(logf(x));
+}
+
+float test3f(float x)
+{
+ return sqrtf(expf(x));
+}
+
+float test4f(float x)
+{
+ return logf(sqrtf(x));
+}
+
+float test5f(float x, float y)
+{
+ return sqrtf(x)*sqrtf(y);
+}
+
+float test6f(float x, float y)
+{
+ return expf(x)*expf(y);
+}
+
+float test7f(float x, float y)
+{
+ return x/expf(y);
+}
+
+float test8f(float x)
+{
+ return fabsf(sqrtf(x));
+}
+
+float test9f(float x)
+{
+ return fabsf(expf(x));
+}
+
+long double test1l(long double x)
+{
+ return logl(expl(x));
+}
+
+long double test2l(long double x)
+{
+ return expl(logl(x));
+}
+
+long double test3l(long double x)
+{
+ return sqrtl(expl(x));
+}
+
+long double test4l(long double x)
+{
+ return logl(sqrtl(x));
+}
+
+long double test5l(long double x, long double y)
+{
+ return sqrtl(x)*sqrtl(y);
+}
+
+long double test6l(long double x, long double y)
+{
+ return expl(x)*expl(y);
+}
+
+long double test7l(long double x, long double y)
+{
+ return x/expl(y);
+}
+
+long double test8l(long double x)
+{
+ return fabsl(sqrtl(x));
+}
+
+long double test9l(long double x)
+{
+ return fabsl(expl(x));
+}
+
+
diff --git a/gcc/testsuite/gcc.dg/builtins-3.c b/gcc/testsuite/gcc.dg/builtins-3.c
new file mode 100644
index 00000000000..49bea5e126e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtins-3.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 2002 Free Software Foundation.
+
+ Verify that built-in math function constant folding of constant
+ arguments is correctly performed by the by the compiler.
+
+ Written by Roger Sayle, 16th August 2002. */
+
+/* { dg-do link } */
+/* { dg-options "-O2 -ffast-math" } */
+
+extern void link_error(void);
+
+int main()
+{
+ if (sqrt (0.0) != 0.0)
+ link_error ();
+
+ if (sqrt (1.0) != 1.0)
+ link_error ();
+
+ if (exp (0.0) != 1.0)
+ link_error ();
+
+ if (log (1.0) != 0.0)
+ link_error ();
+
+
+ if (sqrtf (0.0f) != 0.0f)
+ link_error ();
+
+ if (sqrtf (1.0f) != 1.0f)
+ link_error ();
+
+ if (expf (0.0f) != 1.0f)
+ link_error ();
+
+ if (logf (1.0f) != 0.0f)
+ link_error ();
+
+
+ if (sqrtl (0.0l) != 0.0l)
+ link_error ();
+
+ if (sqrtl (1.0l) != 1.0l)
+ link_error ();
+
+ if (expl (0.0l) != 1.0l)
+ link_error ();
+
+ if (logl (1.0l) != 0.0l)
+ link_error ();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.dg/c90-digraph-1.c b/gcc/testsuite/gcc.dg/c90-digraph-1.c
index 72267283326..9396d136736 100644
--- a/gcc/testsuite/gcc.dg/c90-digraph-1.c
+++ b/gcc/testsuite/gcc.dg/c90-digraph-1.c
@@ -1,4 +1,4 @@
-/* Test for recognition of digraphs: should be recognised in C94 and C99
+/* Test for recognition of digraphs: should be recognized in C94 and C99
mode, but not in C90 mode. Also check correct stringizing.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
diff --git a/gcc/testsuite/gcc.dg/c90-hexfloat-2.c b/gcc/testsuite/gcc.dg/c90-hexfloat-2.c
index d1a048da8bd..259471c8fd0 100644
--- a/gcc/testsuite/gcc.dg/c90-hexfloat-2.c
+++ b/gcc/testsuite/gcc.dg/c90-hexfloat-2.c
@@ -20,5 +20,5 @@ main (void)
if (strcmp (s, "0x1p+( 0x1p+)"))
abort ();
else
- return 0; /* Correct C90 behaviour. */
+ return 0; /* Correct C90 behavior. */
}
diff --git a/gcc/testsuite/gcc.dg/c94-digraph-1.c b/gcc/testsuite/gcc.dg/c94-digraph-1.c
index 26cc1be6cbb..55d77146be6 100644
--- a/gcc/testsuite/gcc.dg/c94-digraph-1.c
+++ b/gcc/testsuite/gcc.dg/c94-digraph-1.c
@@ -1,4 +1,4 @@
-/* Test for recognition of digraphs: should be recognised in C94 and C99
+/* Test for recognition of digraphs: should be recognized in C94 and C99
mode, but not in C90 mode. Also check correct stringizing.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
diff --git a/gcc/testsuite/gcc.dg/c99-bool-1.c b/gcc/testsuite/gcc.dg/c99-bool-1.c
index 8a45988906c..1037eb55173 100644
--- a/gcc/testsuite/gcc.dg/c99-bool-1.c
+++ b/gcc/testsuite/gcc.dg/c99-bool-1.c
@@ -54,7 +54,7 @@ main (void)
abort ();
if (a != 1 || b != 0 || c != 1)
abort ();
- /* Casts to _Bool have a specified behaviour. */
+ /* Casts to _Bool have a specified behavior. */
if ((int)(_Bool)2 != 1)
abort ();
if ((int)(_Bool)0.2 != 1)
diff --git a/gcc/testsuite/gcc.dg/c99-digraph-1.c b/gcc/testsuite/gcc.dg/c99-digraph-1.c
index 08f0af91499..318aa70bdcc 100644
--- a/gcc/testsuite/gcc.dg/c99-digraph-1.c
+++ b/gcc/testsuite/gcc.dg/c99-digraph-1.c
@@ -1,4 +1,4 @@
-/* Test for recognition of digraphs: should be recognised in C94 and C99
+/* Test for recognition of digraphs: should be recognized in C94 and C99
mode, but not in C90 mode. Also check correct stringizing.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
diff --git a/gcc/testsuite/gcc.dg/c99-hexfloat-2.c b/gcc/testsuite/gcc.dg/c99-hexfloat-2.c
index 589f44048b4..3ca15c3c53d 100644
--- a/gcc/testsuite/gcc.dg/c99-hexfloat-2.c
+++ b/gcc/testsuite/gcc.dg/c99-hexfloat-2.c
@@ -20,5 +20,5 @@ main (void)
if (strcmp (s, "0x1p+f 0x1p+l"))
abort ();
else
- return 0; /* Correct C99 behaviour. */
+ return 0; /* Correct C99 behavior. */
}
diff --git a/gcc/testsuite/gcc.dg/compare2.c b/gcc/testsuite/gcc.dg/compare2.c
index a33e4aa2955..0625eb9c3f6 100644
--- a/gcc/testsuite/gcc.dg/compare2.c
+++ b/gcc/testsuite/gcc.dg/compare2.c
@@ -26,11 +26,11 @@ void f(int x, unsigned int y)
/* Statement expression. */
x > ({tf; 64;}); /* { dg-bogus "signed and unsigned" "case 9" } */
- y > ({tf; 64;}); /* { dg-bogus "signed and unsigned" "case 10" { xfail *-*-* } } */
+ y > ({tf; 64;}); /* { dg-bogus "signed and unsigned" "case 10" } */
/* Statement expression with recursive ?: . */
x > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "signed and unsigned" "case 11" } */
- y > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "signed and unsigned" "case 12" { xfail *-*-* } } */
+ y > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "signed and unsigned" "case 12" } */
/* Statement expression with signed ?:. */
x > ({tf; tf?64:-1;}); /* { dg-bogus "signed and unsigned" "case 13" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/20020927-1.c b/gcc/testsuite/gcc.dg/cpp/20020927-1.c
new file mode 100644
index 00000000000..91f89518a22
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/20020927-1.c
@@ -0,0 +1,91 @@
+/* Test case for buffer overflow bug in token stringification.
+ See PR preprocessor/8055 for details.
+ Reported by Alexander N. Kabaev <ak03@gte.com>.
+ Test case written by Zack Weinberg <zack@codesourcery.com>. */
+
+/* { dg-do preprocess } */
+
+#define S(x) #x
+
+/* Fill up one internal buffer with data. */
+S(1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 1234567890123456789012345678901234567890123456789012345678901234567890
+ 12345678901234567890123456789012345678901234567890123456789012345)
+
+/* When stringify_arg() was called with an empty macro argument, it would
+ advance the buffer pointer by one but fail to check for running past the
+ end of the buffer. We can only know where the end of the buffer is to
+ within about eight bytes, so do this sixteen times to be sure of hitting
+ it. */
+
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+S()
+
+/* Now allocate more memory in the buffer, which should provoke a crash. */
+
+S(abcdefghijklmnopqrstuvwxyz)
+S(abcdefghijklmnopqrstuvwxyz)
diff --git a/gcc/testsuite/gcc.dg/cpp/_Pragma4.c b/gcc/testsuite/gcc.dg/cpp/_Pragma4.c
new file mode 100644
index 00000000000..a7ac42d4e47
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/_Pragma4.c
@@ -0,0 +1,12 @@
+/* { dg-do preprocess } */
+
+/* Based on Debian GNATS PR 157416. 3 Sep 2002. */
+
+#define b foo _Pragma ("bar") baz
+a b c
+
+/*
+ { dg-final { if ![file exists _Pragma4.i] { return } } }
+ { dg-final { if { [grep _Pragma4.i "#pragma bar "] != "" } { return } } }
+ { dg-final { fail "_Pragma4.c: #pragma appearing on its own line" } }
+*/
diff --git a/gcc/testsuite/gcc.dg/cpp/assembler.S b/gcc/testsuite/gcc.dg/cpp/assembler.S
index 729162a5120..7069b7b50ac 100644
--- a/gcc/testsuite/gcc.dg/cpp/assembler.S
+++ b/gcc/testsuite/gcc.dg/cpp/assembler.S
@@ -3,6 +3,7 @@
in the output, and should not be warned about. */
/* { dg-do preprocess } */
+/* { dg-options "" } */
#define foo() mov r0, #5 /* { dg-bogus "not followed" "spurious warning" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/avoidpaste1.c b/gcc/testsuite/gcc.dg/cpp/avoidpaste1.c
index 952d54ef24a..f2905c34aab 100644
--- a/gcc/testsuite/gcc.dg/cpp/avoidpaste1.c
+++ b/gcc/testsuite/gcc.dg/cpp/avoidpaste1.c
@@ -18,7 +18,7 @@
: : : .. . 0 0 .
It relies on the fact that even when preprocessing C we bother to separate
-the colons of C++'s :: operator. If we confine this behaviour to C++
+the colons of C++'s :: operator. If we confine this behavior to C++
in future, this test needs to change. */
:: :g: :f(): :f(^): tricky
diff --git a/gcc/testsuite/gcc.dg/cpp/defined.c b/gcc/testsuite/gcc.dg/cpp/defined.c
index 864ef1ddd89..9a60bdd5d10 100644
--- a/gcc/testsuite/gcc.dg/cpp/defined.c
+++ b/gcc/testsuite/gcc.dg/cpp/defined.c
@@ -2,7 +2,7 @@
/* { dg-do preprocess } */
-/* Tests behaviour of the defined operator. */
+/* Tests behavior of the defined operator. */
/* Source: Neil Booth, 29 Oct 2000, Zack Weinberg 11 Dec 2000. */
@@ -19,7 +19,7 @@
#error Z is not defined
#endif
-/* The behaviour of "defined" when it comes from a macro expansion is
+/* The behavior of "defined" when it comes from a macro expansion is
now documented. */
#if is_Z_defined
#error Macro expanding into defined operator test 1
@@ -51,7 +51,7 @@
#error Z is not defined
#endif
-/* The behaviour of "defined" when it comes from a macro expansion is
+/* The behavior of "defined" when it comes from a macro expansion is
now documented. */
#if is_Z_defined
#error Macro expanding into defined operator test 1
diff --git a/gcc/testsuite/gcc.dg/cpp/line5.c b/gcc/testsuite/gcc.dg/cpp/line5.c
index d0c04b79c13..4cad6a17141 100644
--- a/gcc/testsuite/gcc.dg/cpp/line5.c
+++ b/gcc/testsuite/gcc.dg/cpp/line5.c
@@ -10,6 +10,6 @@
-fpreprocessed on raw source. Nevertheless, we should not
segfault. This is a test that we don't back up two tokens in
cpplib.c - one to back up over the number, and one when we
- recognise that it's not a valid directive in preprocessed input. */
+ recognize that it's not a valid directive in preprocessed input. */
# 1 "foo.c"
diff --git a/gcc/testsuite/gcc.dg/cpp/macsyntx.c b/gcc/testsuite/gcc.dg/cpp/macsyntx.c
index d028ebd9283..495921efa14 100644
--- a/gcc/testsuite/gcc.dg/cpp/macsyntx.c
+++ b/gcc/testsuite/gcc.dg/cpp/macsyntx.c
@@ -7,7 +7,7 @@
o Full range of macro definition semantics.
o No. of arguments supplied to function-like macros.
- o Odd GNU rest args behaviour.
+ o Odd GNU rest args behavior.
o Macro arguments do not flow into the rest of the file. */
diff --git a/gcc/testsuite/gcc.dg/cpp/multiline.c b/gcc/testsuite/gcc.dg/cpp/multiline.c
index efd2b6d04ed..e76ba0447ea 100644
--- a/gcc/testsuite/gcc.dg/cpp/multiline.c
+++ b/gcc/testsuite/gcc.dg/cpp/multiline.c
@@ -1,7 +1,7 @@
/* Copyright (C) 2000 Free Software Foundation, Inc. */
/* { dg-do preprocess } */
/* { dg-options "-C" } */
-/* Test that multi-line tokens are recognised by cpp0 as being
+/* Test that multi-line tokens are recognized by cpp0 as being
multiline . Source: Neil Booth, 17 Dec 2000. */
/* Line 1
Line 2
diff --git a/gcc/testsuite/gcc.dg/cpp/paste13.c b/gcc/testsuite/gcc.dg/cpp/paste13.c
new file mode 100644
index 00000000000..e59c2099656
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/paste13.c
@@ -0,0 +1,9 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc. */
+
+/* { dg-do preprocess } */
+
+/* This used to be recognized as a comment when lexing after pasting
+ spellings. Neil Booth, 9 Oct 2002. */
+
+#define a /##/=
+a /* { dg-warning "valid preprocessing tok" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/paste2.c b/gcc/testsuite/gcc.dg/cpp/paste2.c
index 1958918d181..788e4eb51d3 100644
--- a/gcc/testsuite/gcc.dg/cpp/paste2.c
+++ b/gcc/testsuite/gcc.dg/cpp/paste2.c
@@ -3,7 +3,7 @@
/* { dg-do run } */
/* { dg-options "-std=c99 -pedantic-errors" } */
-/* Test ## behaviour and corner cases thoroughly. The macro expander
+/* Test ## behavior and corner cases thoroughly. The macro expander
failed many of these during development. */
#ifndef __WCHAR_TYPE__
diff --git a/gcc/testsuite/gcc.dg/cpp/tr-warn2.c b/gcc/testsuite/gcc.dg/cpp/tr-warn2.c
index 413ac5c4e22..85b624761eb 100644
--- a/gcc/testsuite/gcc.dg/cpp/tr-warn2.c
+++ b/gcc/testsuite/gcc.dg/cpp/tr-warn2.c
@@ -1,14 +1,18 @@
/* K+R rejects use of function-like macros in non-function context.
- ANSI C explicitly permits this (the macro is not expanded). */
+ ANSI C explicitly permits this (the macro is not expanded).
-/* { dg-do compile } */
-/* { dg-options -Wtraditional } */
-
-enum { SIGN_EXTEND = 23 };
+ We should not warn about this during pre-expansion of arguments,
+ since traditional preprocessors don't do pre-expansion, and we get
+ the warning anyway during the re-scan pass if and only if it is
+ appropriate. */
-#define SIGN_EXTEND(v) (((v) < 0) ? -1 : 0)
+/* { dg-do preprocess } */
+/* { dg-options -Wtraditional } */
-int fun()
-{
- return SIGN_EXTEND; /* { dg-warning "must be used with arguments" } */
-}
+#define f(x) x
+#define g(x) x / 2
+#define h(a, b) a(b)
+f(g) (3) /* { dg-bogus "must be used with arguments" } */
+f 2 /* { dg-warning "must be used with arguments" } */
+f(g) 3 /* { dg-warning "must be used with arguments" } */
+h(f, 3) /* { dg-bogus "must be used with arguments" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/trad/defined.c b/gcc/testsuite/gcc.dg/cpp/trad/defined.c
index a24ecd519ea..5fa1d93b8aa 100644
--- a/gcc/testsuite/gcc.dg/cpp/trad/defined.c
+++ b/gcc/testsuite/gcc.dg/cpp/trad/defined.c
@@ -29,7 +29,7 @@
#error Z is not defined
#endif
-/* The behaviour of "defined" when it comes from a macro expansion is
+/* The behavior of "defined" when it comes from a macro expansion is
now documented. */
#if is_Z_defined
#error Macro expanding into defined operator test 1
@@ -61,7 +61,7 @@
#error Z is not defined
#endif
-/* The behaviour of "defined" when it comes from a macro expansion is
+/* The behavior of "defined" when it comes from a macro expansion is
now documented. */
#if is_Z_defined
#error Macro expanding into defined operator test 1
diff --git a/gcc/testsuite/gcc.dg/cpp/trad/literals-1.c b/gcc/testsuite/gcc.dg/cpp/trad/literals-1.c
index 7fde0d5422e..15c8030fa55 100644
--- a/gcc/testsuite/gcc.dg/cpp/trad/literals-1.c
+++ b/gcc/testsuite/gcc.dg/cpp/trad/literals-1.c
@@ -1,4 +1,4 @@
-/* Test that (what looks like) comments are not recognised in literals
+/* Test that (what looks like) comments are not recognized in literals
and that quotes within quotes do not confused the preprocessor. */
/* { dg-do run } */
diff --git a/gcc/testsuite/gcc.dg/dll-2.c b/gcc/testsuite/gcc.dg/dll-2.c
index c55e9209359..bf917079965 100644
--- a/gcc/testsuite/gcc.dg/dll-2.c
+++ b/gcc/testsuite/gcc.dg/dll-2.c
@@ -1,5 +1,5 @@
/* These dllimport and dllexport appearing for a symbol.
- The desired behaviour is that if both dllimport
+ The desired behavior is that if both dllimport
and dllexport appear (in either order) the result is dllexport.
Microsoft's MSVC 2.0 allows dllimport followed by dllexport for variables,
diff --git a/gcc/testsuite/gcc.dg/doloop-1.c b/gcc/testsuite/gcc.dg/doloop-1.c
new file mode 100644
index 00000000000..3561a179411
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/doloop-1.c
@@ -0,0 +1,18 @@
+/* Make sure both loops are recognized as doloops.
+ If so, "bdnz" will be generated on ppc; if not,
+ you will get "ble". */
+
+/* { dg-do compile { target powerpc-*-* } } */
+/* { dg-options "-O2" } */
+void foo (int count, char* pca, char* pcb) {
+ int i;
+ if (count > 10)
+ for (i = 0; i < count; ++i)
+ pcb += i;
+ else
+ for (i = 0; i < count; ++i)
+ pca += i;
+ *pca = *pcb;
+}
+/* { dg-final { scan-assembler "bdnz" } } */
+/* { dg-final { scan-assembler-not "blt" } } */
diff --git a/gcc/testsuite/gcc.dg/empty1.c b/gcc/testsuite/gcc.dg/empty1.c
new file mode 100644
index 00000000000..89b2de1e903
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/empty1.c
@@ -0,0 +1,11 @@
+/* { dg-do run } */
+/* { dg-options "" } */
+
+struct S { int : 0; };
+union U { int : 0; };
+
+int main () {
+ if (__alignof__ (struct S) != __alignof__ (union U))
+ return 1;
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/format/attr-3.c b/gcc/testsuite/gcc.dg/format/attr-3.c
index 9627497ea52..8fc1faa6819 100644
--- a/gcc/testsuite/gcc.dg/format/attr-3.c
+++ b/gcc/testsuite/gcc.dg/format/attr-3.c
@@ -33,7 +33,7 @@ struct s1 { int i; } __attribute__((format_arg(1))); /* { dg-error "does not app
union u1 { int i; } __attribute__((format_arg(1))); /* { dg-error "does not apply|only applies" "format_arg on union" } */
enum e1 { E1V0 } __attribute__((format_arg(1))); /* { dg-error "does not apply|only applies" "format_arg on enum" } */
-/* The format type must be an identifier, one of those recognised. */
+/* The format type must be an identifier, one of those recognized. */
extern void fe0 (const char *, ...) __attribute__((format(12345, 1, 2))); /* { dg-error "format specifier" "non-id format" } */
extern void fe1 (const char *, ...) __attribute__((format(nosuch, 1, 2))); /* { dg-warning "format function type" "unknown format" } */
diff --git a/gcc/testsuite/gcc.dg/format/c90-printf-1.c b/gcc/testsuite/gcc.dg/format/c90-printf-1.c
index da7bb52e9c6..e4c18f76862 100644
--- a/gcc/testsuite/gcc.dg/format/c90-printf-1.c
+++ b/gcc/testsuite/gcc.dg/format/c90-printf-1.c
@@ -1,6 +1,6 @@
/* Test for printf formats. Formats using C90 features, including cases
where C90 specifies some aspect of the format to be ignored or where
- the behaviour is undefined.
+ the behavior is undefined.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
@@ -203,14 +203,14 @@ foo (int i, int i1, int i2, unsigned int u, double d, char *s, void *p,
printf ("%p%p%p%p", s, ss, us, css);
/* %s allows any character type. */
printf ("%s%s%s%s", s, ss, us, css);
- /* Warning for void * arguments for %s is GCC's historical behaviour,
+ /* Warning for void * arguments for %s is GCC's historical behavior,
and seems useful to keep, even if some standard versions might be
read to permit it.
*/
printf ("%s", p); /* { dg-warning "format" "bad argument types" } */
- /* The historical behaviour is to allow signed / unsigned types
+ /* The historical behavior is to allow signed / unsigned types
interchangably as arguments. For values representable in both types,
- such usage may be correct. For now preserve the behaviour of GCC
+ such usage may be correct. For now preserve the behavior of GCC
in such cases.
*/
printf ("%d", u);
diff --git a/gcc/testsuite/gcc.dg/format/c90-scanf-1.c b/gcc/testsuite/gcc.dg/format/c90-scanf-1.c
index 813b79dd311..ea42f1e131e 100644
--- a/gcc/testsuite/gcc.dg/format/c90-scanf-1.c
+++ b/gcc/testsuite/gcc.dg/format/c90-scanf-1.c
@@ -1,6 +1,6 @@
/* Test for scanf formats. Formats using C90 features, including cases
where C90 specifies some aspect of the format to be ignored or where
- the behaviour is undefined.
+ the behavior is undefined.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
diff --git a/gcc/testsuite/gcc.dg/format/c90-scanf-3.c b/gcc/testsuite/gcc.dg/format/c90-scanf-3.c
index 9b6f29006f6..5570707823c 100644
--- a/gcc/testsuite/gcc.dg/format/c90-scanf-3.c
+++ b/gcc/testsuite/gcc.dg/format/c90-scanf-3.c
@@ -10,7 +10,7 @@
void
foo (char **sp, wchar_t **lsp)
{
- /* %a formats for allocation, only recognised in C90 mode, are a
+ /* %a formats for allocation, only recognized in C90 mode, are a
GNU extension.
*/
scanf ("%as", sp); /* { dg-warning "C" "%as" } */
diff --git a/gcc/testsuite/gcc.dg/format/c99-printf-1.c b/gcc/testsuite/gcc.dg/format/c99-printf-1.c
index e99015c9374..729e41c3dfb 100644
--- a/gcc/testsuite/gcc.dg/format/c99-printf-1.c
+++ b/gcc/testsuite/gcc.dg/format/c99-printf-1.c
@@ -1,6 +1,6 @@
/* Test for printf formats. Formats using C99 features, including cases
where C99 specifies some aspect of the format to be ignored or where
- the behaviour is undefined.
+ the behavior is undefined.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
diff --git a/gcc/testsuite/gcc.dg/format/c99-scanf-1.c b/gcc/testsuite/gcc.dg/format/c99-scanf-1.c
index 7910ece7a70..7a8b3e2456c 100644
--- a/gcc/testsuite/gcc.dg/format/c99-scanf-1.c
+++ b/gcc/testsuite/gcc.dg/format/c99-scanf-1.c
@@ -1,6 +1,6 @@
/* Test for scanf formats. Formats using C99 features, including cases
where C99 specifies some aspect of the format to be ignored or where
- the behaviour is undefined.
+ the behavior is undefined.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
diff --git a/gcc/testsuite/gcc.dg/format/ext-4.c b/gcc/testsuite/gcc.dg/format/ext-4.c
index db8250067b0..c11c0ada7de 100644
--- a/gcc/testsuite/gcc.dg/format/ext-4.c
+++ b/gcc/testsuite/gcc.dg/format/ext-4.c
@@ -8,7 +8,7 @@
void
foo (char **sp, wchar_t **lsp)
{
- /* %a formats for allocation, only recognised in C90 mode, are a
+ /* %a formats for allocation, only recognized in C90 mode, are a
GNU extension. Followed by other characters, %a is not treated
specially.
*/
diff --git a/gcc/testsuite/gcc.dg/i386-sse-3.c b/gcc/testsuite/gcc.dg/i386-sse-3.c
index d67a5910cdc..9f31cfa92f8 100644
--- a/gcc/testsuite/gcc.dg/i386-sse-3.c
+++ b/gcc/testsuite/gcc.dg/i386-sse-3.c
@@ -1,5 +1,5 @@
/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O2 -msse" } */
+/* { dg-options "-O2 -msse -msse2" } */
/* Test that the intrinsics compile with optimization. These were not
tested in i386-sse-[12].c because these builtins require immediate
@@ -35,3 +35,15 @@ test_prefetch (char *p)
_mm_prefetch (p+8, _MM_HINT_T2);
_mm_prefetch (p+12, _MM_HINT_NTA);
}
+
+__m128i
+test__slli_si128 (__m128i a)
+{
+ return _mm_slli_si128 (a, 3);
+}
+
+__m128i
+test__srli_si128 (__m128i a)
+{
+ return _mm_srli_si128 (a, 3);
+}
diff --git a/gcc/testsuite/gcc.dg/i386-ssetype-1.c b/gcc/testsuite/gcc.dg/i386-ssetype-1.c
new file mode 100644
index 00000000000..6953b751b43
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-ssetype-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2 -march=athlon" } */
+/* { dg-final { scan-assembler "andpd.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "andnpd.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "xorpd.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "orpd.*\[bs\]p" } } */
+/* { dg-final { scan-assembler-not "movdqa" } } */
+/* { dg-final { scan-assembler "movapd.*\[bs\]p" } } */
+
+/* Verify that we generate proper instruction with memory operand. */
+
+#include <xmmintrin.h>
+__m128d
+t1(__m128d a, __m128d b)
+{
+return _mm_and_pd (a,b);
+}
+__m128d
+t2(__m128d a, __m128d b)
+{
+return _mm_andnot_pd (a,b);
+}
+__m128d
+t3(__m128d a, __m128d b)
+{
+return _mm_or_pd (a,b);
+}
+__m128d
+t4(__m128d a, __m128d b)
+{
+return _mm_xor_pd (a,b);
+}
diff --git a/gcc/testsuite/gcc.dg/i386-ssetype-2.c b/gcc/testsuite/gcc.dg/i386-ssetype-2.c
new file mode 100644
index 00000000000..b66aa0cfd98
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-ssetype-2.c
@@ -0,0 +1,40 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2 -march=athlon" } */
+/* { dg-final { scan-assembler "andpd" } } */
+/* { dg-final { scan-assembler "andnpd" } } */
+/* { dg-final { scan-assembler "xorpd" } } */
+/* { dg-final { scan-assembler "orpd" } } */
+/* { dg-final { scan-assembler-not "movdqa" } } */
+/* { dg-final { scan-assembler "movapd" } } */
+
+/* Verify that we generate proper instruction without memory operand. */
+
+#include <xmmintrin.h>
+__m128d
+t1(__m128d a, __m128d b)
+{
+a=_mm_sqrt_pd(a);
+b=_mm_sqrt_pd(b);
+return _mm_and_pd (a,b);
+}
+__m128d
+t2(__m128d a, __m128d b)
+{
+a=_mm_sqrt_pd(a);
+b=_mm_sqrt_pd(b);
+return _mm_andnot_pd (a,b);
+}
+__m128d
+t3(__m128d a, __m128d b)
+{
+a=_mm_sqrt_pd(a);
+b=_mm_sqrt_pd(b);
+return _mm_or_pd (a,b);
+}
+__m128d
+t4(__m128d a, __m128d b)
+{
+a=_mm_sqrt_pd(a);
+b=_mm_sqrt_pd(b);
+return _mm_xor_pd (a,b);
+}
diff --git a/gcc/testsuite/gcc.dg/i386-ssetype-3.c b/gcc/testsuite/gcc.dg/i386-ssetype-3.c
new file mode 100644
index 00000000000..4988c0c5abd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-ssetype-3.c
@@ -0,0 +1,32 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2 -march=athlon" } */
+/* { dg-final { scan-assembler "andps.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "andnps.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "xorps.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "orps.*\[bs\]p" } } */
+/* { dg-final { scan-assembler-not "movdqa" } } */
+/* { dg-final { scan-assembler "movaps.*\[bs\]p" } } */
+
+/* Verify that we generate proper instruction with memory operand. */
+
+#include <xmmintrin.h>
+__m128
+t1(__m128 a, __m128 b)
+{
+return _mm_and_ps (a,b);
+}
+__m128
+t2(__m128 a, __m128 b)
+{
+return _mm_andnot_ps (a,b);
+}
+__m128
+t3(__m128 a, __m128 b)
+{
+return _mm_or_ps (a,b);
+}
+__m128
+t4(__m128 a, __m128 b)
+{
+return _mm_xor_ps (a,b);
+}
diff --git a/gcc/testsuite/gcc.dg/i386-ssetype-4.c b/gcc/testsuite/gcc.dg/i386-ssetype-4.c
new file mode 100644
index 00000000000..ef6a93f6c16
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-ssetype-4.c
@@ -0,0 +1,38 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2 -march=athlon" } */
+/* { dg-final { scan-assembler "andps" } } */
+/* { dg-final { scan-assembler "andnps" } } */
+/* { dg-final { scan-assembler "xorps" } } */
+/* { dg-final { scan-assembler "orps" } } */
+
+/* Verify that we generate proper instruction without memory operand. */
+
+#include <xmmintrin.h>
+__m128
+t1(__m128 a, __m128 b)
+{
+a=_mm_sqrt_ps(a);
+b=_mm_sqrt_ps(b);
+return _mm_and_ps (a,b);
+}
+__m128
+t2(__m128 a, __m128 b)
+{
+a=_mm_sqrt_ps(a);
+b=_mm_sqrt_ps(b);
+return _mm_andnot_ps (a,b);
+}
+__m128
+t3(__m128 a, __m128 b)
+{
+a=_mm_sqrt_ps(a);
+b=_mm_sqrt_ps(b);
+return _mm_or_ps (a,b);
+}
+__m128
+t4(__m128 a, __m128 b)
+{
+a=_mm_sqrt_ps(a);
+b=_mm_sqrt_ps(b);
+return _mm_xor_ps (a,b);
+}
diff --git a/gcc/testsuite/gcc.dg/i386-ssetype-5.c b/gcc/testsuite/gcc.dg/i386-ssetype-5.c
new file mode 100644
index 00000000000..97cc22fd3a8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-ssetype-5.c
@@ -0,0 +1,33 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse2 -march=athlon" } */
+/* { dg-final { scan-assembler "pand.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "pandn.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "pxor.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "por.*\[bs\]p" } } */
+/* { dg-final { scan-assembler "movdqa" } } */
+/* { dg-final { scan-assembler-not "movaps.*\[bs\]p" } } */
+
+/* Verify that we generate proper instruction with memory operand. */
+
+#include <xmmintrin.h>
+__m128i
+t1(__m128i a, __m128i b)
+{
+return _mm_and_si128 (a,b);
+}
+__m128i
+t2(__m128i a, __m128i b)
+{
+return _mm_andnot_si128 (a,b);
+}
+__m128i
+t3(__m128i a, __m128i b)
+{
+return _mm_or_si128 (a,b);
+}
+__m128i
+t4(__m128i a, __m128i b)
+{
+return _mm_xor_si128 (a,b);
+}
+
diff --git a/gcc/testsuite/gcc.dg/inline-2.c b/gcc/testsuite/gcc.dg/inline-2.c
index 1320143c519..0049fc8336d 100644
--- a/gcc/testsuite/gcc.dg/inline-2.c
+++ b/gcc/testsuite/gcc.dg/inline-2.c
@@ -15,5 +15,5 @@ int bar(void)
}
/* { dg-final { scan-assembler "bsr" { target alpha*-*-* } } } */
-/* { dg-final { scan-assembler-not "PLT" { target i?86-*-* } } } */
+/* { dg-final { scan-assembler-not "PLT" { target i?86-*-* x86_64-*-* } } } */
/* { dg-final { scan-assembler-not "plt" { target powerpc*-*-* } } } */
diff --git a/gcc/testsuite/gcc.dg/noncompile/920923-1.c b/gcc/testsuite/gcc.dg/noncompile/920923-1.c
index 61931776cf1..b2bc1fdce5b 100644
--- a/gcc/testsuite/gcc.dg/noncompile/920923-1.c
+++ b/gcc/testsuite/gcc.dg/noncompile/920923-1.c
@@ -1,35 +1,49 @@
-typedef BYTE unsigned char; /* { dg-error "syntax error|empty decl" } */
+/* This test case contains a large number of syntactic errors. We
+ believe the intent of the test is that the compiler simply not
+ crash. The set of error messages reported is different when the C
+ parser is generated with bison 1.50 than 1.35. It is not worth
+ attempting to prevent this. Instead, we use a single dg-error with
+ a regexp that will match _all_ the errors indiscriminately. The
+ old error/warning/etc markers are kept around for reference, but
+ disabled.
+
+ Revisit after new (recursive descent) parser is implemented for C.
+ -- zw 2002-10-17 */
+
+/* { dg-error ".*" "many syntax errors" { target *-*-* } 0 } */
+
+typedef BYTE unsigned char; /* { error "syntax error|empty decl" } */
typedef int item_n;
typedef int perm_set;
-struct PENT { caddr_t v_addr; };/* { dg-error "parse error|no semicolon" } */
+struct PENT { caddr_t v_addr; };/* { error "parse error|no semicolon" } */
typedef struct PENT prec;
typedef struct PENT *prec_t;
prec_t mem_hash;
-BYTE *mem_base; /* { dg-error "parse error|no type" } */
+BYTE *mem_base; /* { error "parse error|no type" } */
struct PTE {
- BYTE *p_page; /* { dg-error "parse error|no semicolon" } */
+ BYTE *p_page; /* { error "parse error|no semicolon" } */
perm_set p_perms;
-}; /* { dg-error "parse error" } */
+}; /* { error "parse error" } */
typedef struct PTE pte;
struct PTP {
union {
- struct *PTP p_tablep; /* { dg-error "parse error|no semicolon" } */
+ struct *PTP p_tablep; /* { error "parse error|no semicolon" } */
struct *PTE p_entry;
- } u; /* { dg-warning "no type or storage class" } */
+ } u; /* { warning "no type or storage class" } */
int valid;
-}; /* { dg-error "parse error" } */
-typedef struct PTP (u.p_tablep);/* { dg-error "parse error" } */
+}; /* { error "parse error" } */
+typedef struct PTP (u.p_tablep);/* { error "parse error" } */
int pfree=0;
int pcount=0;
void
mmu_walk_find(va)
-caddr_t va; /* { dg-error "parse error|no type" } */
+caddr_t va; /* { error "parse error|no type" } */
{
BYTE *page_addr;
if (mmu_base[Level1(va)]->valid==0x0) {
l1_base = mmu_base[Level1(va)]->(u.p_tablep) = p_alloc();
- mmu_base[Level1(va)]->valid = 0x3; /* { dg-error "parse error" } */
+ mmu_base[Level1(va)]->valid = 0x3; /* { error "parse error" } */
for (idx=0; idx<LEVEL1_ENTRIES; idx++)
l1_base[idx]->valid = 0x0;
goto build_level2;
@@ -39,43 +53,43 @@ caddr_t va; /* { dg-error "parse error|no type" } */
if (l1_base[Level2(va)]->valid==0x0) {
build_level2:
l2_base = l1_base[Level2(va)]->(u.p_tablep) = p_alloc();
- l1_base[Level2(va)]->valid = 0x3; /* { dg-error "parse error" } */
+ l1_base[Level2(va)]->valid = 0x3; /* { error "parse error" } */
for (idx=0; idx<LEVEL2_ENTRIES; idx++)
l2_base[idx]->valid=0x0;
goto build_page;
} else
l2_base = mmu_base[Level2(va)]->(u.p_tablep);
- page_addr = l2_base[Level2(va)]->valid;/* { dg-error "undeclared|no type" } */
-} /* { dg-error "parse error" } */
+ page_addr = l2_base[Level2(va)]->valid;/* { error "undeclared|no type" } */
+} /* { error "parse error" } */
void *
a_translate(va_op, v_addr)
int va_op;
-caddr_t v_addr; /* { dg-error "parse error" } */
+caddr_t v_addr; /* { error "parse error" } */
{
register prec_t bucket;
- register caddr_t p_addr; /* { dg-error "syntax error" } */
- bucket = mem_hash+((((v_addr)>>ITEMBITS))&hash_mask); /* { dg-error "undeclared|for each function" } */
+ register caddr_t p_addr; /* { error "syntax error" } */
+ bucket = mem_hash+((((v_addr)>>ITEMBITS))&hash_mask); /* { error "undeclared|for each function" } */
do {
- if (bucket->v_addr == ((v_addr)>>ITEMBITS) { /* { dg-error "incomplete type|parse error" } */
+ if (bucket->v_addr == ((v_addr)>>ITEMBITS) { /* { error "incomplete type|parse error" } */
if(!(bucket->perm_set&va_op))
goto prot_fault;
return mem_base + v_addr;
}
- } while((bucket++)->v_addr != ((caddr_t)0)); /* { dg-error "parse error" } */
+ } while((bucket++)->v_addr != ((caddr_t)0)); /* { error "parse error" } */
page_miss:
- p_addr = (--bucket)->p_addr; /* { dg-error "undeclared|pointer to" } */
+ p_addr = (--bucket)->p_addr; /* { error "undeclared|pointer to" } */
page_type:
switch (p_addr) {
- case BUCKET_FULL: /* { dg-error "undeclared" } */
+ case BUCKET_FULL: /* { error "undeclared" } */
enlarge_hash_table(mem_hash);
- case((caddr_t)0): /* { dg-error "undeclared|parse error" } */
+ case((caddr_t)0): /* { error "undeclared|parse error" } */
p_addr = fill_item_entry(va_op, v_addr);
goto page_type;
- case((caddr_t)1): /* { dg-error "parse error" } */
- default:
+ case((caddr_t)1): /* { error "parse error" } */
+ default:
((void)(((0))?0:(__eprintf("Failed assertion`%s'at line%d of`%s'.\n",
"FALSE", 327, "b.c"), 0)));
}
@@ -90,9 +104,9 @@ int hash_size;
register int idx;
bucket = hasht;
for(idx=(hash_size*3)-1; idx>=0; idx--) {
- bucket->v_addr = ((caddr_t)0);/* { dg-error "undeclared|pointer to|parse error" } */
- bucket->p_addr = ((caddr_t)0);/* { dg-error "pointer to|parse error" } */
- bucket->perm_set = VA_EMPTY; /* { dg-error "undeclared|pointer to" } */
+ bucket->v_addr = ((caddr_t)0);/* { error "undeclared|pointer to|parse error" } */
+ bucket->p_addr = ((caddr_t)0);/* { error "pointer to|parse error" } */
+ bucket->perm_set = VA_EMPTY; /* { error "undeclared|pointer to" } */
}
}
@@ -101,21 +115,21 @@ extern void *calloc(__SIZE_TYPE__, __SIZE_TYPE__);
void
init_mem()
{
- mem_base = (BYTE *) calloc(1024, (1<<13)); /* { dg-error "undeclared|parse error" } */
- ((void)((mem_base != (BYTE *)0) /* { dg-error "parse error" } */
+ mem_base = (BYTE *) calloc(1024, (1<<13)); /* { error "undeclared|parse error" } */
+ ((void)((mem_base != (BYTE *)0) /* { error "parse error" } */
? 0
: (__eprintf("Failed assertion`%s'at line%d of`%s'.\n",
"mem_base != (BYTE *)0", 366, "b.c"),
0)));
- hash_num = INIT_NUM_ENTRIES * 3; /* { dg-error "undeclared" } */
- mem_hash = (prec_t) calloc(hash_num, sizeof(prec)); /* { dg-error "incomplete type" } */
+ hash_num = INIT_NUM_ENTRIES * 3; /* { error "undeclared" } */
+ mem_hash = (prec_t) calloc(hash_num, sizeof(prec)); /* { error "incomplete type" } */
((void)((mem_hash != (prec_t)0)
? 0
: (__eprintf("Failed assertion`%s'at line%d of`%s'.\n",
"mem_hash != (prec_t)0", 370, "b.c"),
0)));
flush_hash(mem_hash, 32);
- build_ptables(mem_base, 1024*(1<<13)); /* { dg-bogus "integer overflow" "int smaller than 32 bits" { xfail "xstormy16-*-*" } } */
+ build_ptables(mem_base, 1024*(1<<13)); /* { bogus "integer overflow" "int smaller than 32 bits" } */
}
struct tm {
diff --git a/gcc/testsuite/gcc.dg/sibcall-1.c b/gcc/testsuite/gcc.dg/sibcall-1.c
new file mode 100644
index 00000000000..f9b1f7899b4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sibcall-1.c
@@ -0,0 +1,46 @@
+/* Simple check that sibling calls are performed from a
+ void non-leaf-function taking one int argument calling itself.
+
+ Copyright (C) 2002 Free Software Foundation Inc.
+ Contributed by Hans-Peter Nilsson <hp@bitrange.com> */
+
+/* { dg-do run } */
+/* { dg-options "-O2 -foptimize-sibling-calls" } */
+
+/* The option -foptimize-sibling-calls is the default, but serves as
+ marker. Self-recursion tail calls are optimized for all targets,
+ regardless of presence of sibcall patterns. */
+
+extern void recurser_void (int);
+extern void track (int);
+
+int main ()
+{
+ recurser_void (0);
+ exit (0);
+}
+
+void
+recurser_void (int n)
+{
+ if (n == 0 || n == 7)
+ track (n);
+
+ if (n == 10)
+ return;
+
+ recurser_void (n + 1);
+}
+
+void *trackpoint;
+
+void
+track (int n)
+{
+ char stackpos[1];
+
+ if (n == 0)
+ trackpoint = stackpos;
+ else if (n != 7 || trackpoint != stackpos)
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/sibcall-2.c b/gcc/testsuite/gcc.dg/sibcall-2.c
new file mode 100644
index 00000000000..cb2d1d599c6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sibcall-2.c
@@ -0,0 +1,47 @@
+/* Simple check that sibling calls are performed from a
+ void non-leaf-function taking no arguments calling itself.
+
+ Copyright (C) 2002 Free Software Foundation Inc.
+ Contributed by Hans-Peter Nilsson <hp@bitrange.com> */
+
+/* { dg-do run } */
+/* { dg-options "-O2 -foptimize-sibling-calls" } */
+
+/* The option -foptimize-sibling-calls is the default, but serves as
+ marker. Self-recursion tail calls are optimized for all targets,
+ regardless of presence of sibcall patterns. */
+
+extern void recurser_void (void);
+extern void track (void);
+
+int n = 0;
+int main ()
+{
+ recurser_void ();
+ exit (0);
+}
+
+void
+recurser_void (void)
+{
+ if (n == 0 || n == 7)
+ track ();
+
+ if (n == 10)
+ return;
+ n++;
+ recurser_void ();
+}
+
+void *trackpoint;
+
+void
+track ()
+{
+ char stackpos[1];
+
+ if (n == 0)
+ trackpoint = stackpos;
+ else if (n != 7 || trackpoint != stackpos)
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/sibcall-3.c b/gcc/testsuite/gcc.dg/sibcall-3.c
new file mode 100644
index 00000000000..b494b4018f2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sibcall-3.c
@@ -0,0 +1,65 @@
+/* Simple check that sibling calls are performed from a
+ void non-leaf-function taking one int argument calling a function which
+ is about the same as itself.
+
+ Copyright (C) 2002 Free Software Foundation Inc.
+ Contributed by Hans-Peter Nilsson <hp@bitrange.com> */
+
+/* { dg-do run { xfail arc-*-* avr-*-* c4x-*-* cris-*-* h8300-*-* i370-*-* i960-*-* ip2k-*-* m32r-*-* m68hc1?-*-* m681?-*-* m680*-*-* m68k-*-* mcore-*-* mips*-*-* mn10?00-*-* ns32k-*-* s390*-*-* xstormy16-*-* v850*-*-* vax-*-* xtensa-*-* } } */
+/* { dg-options "-O2 -foptimize-sibling-calls" } */
+
+/* The option -foptimize-sibling-calls is the default, but serves as
+ marker. This test is xfailed on targets without sibcall patterns
+ (except targets where the test does not work due to the return address
+ not saved on the regular stack). */
+
+static void recurser_void1 (int);
+static void recurser_void2 (int);
+extern void track (int);
+
+int main ()
+{
+ recurser_void1 (0);
+ exit (0);
+}
+
+/* The functions should get the same stack-frame, and best way to make it
+ reasonably sure is to make them have the same contents (regarding the
+ n tests). */
+
+static void
+recurser_void1 (int n)
+{
+ if (n == 0 || n == 7 || n == 8)
+ track (n);
+
+ if (n == 10)
+ return;
+
+ recurser_void2 (n + 1);
+}
+
+static void
+recurser_void2 (int n)
+{
+ if (n == 0 || n == 7 || n == 8)
+ track (n);
+
+ if (n == 10)
+ return;
+
+ recurser_void1 (n + 1);
+}
+
+void *trackpoint;
+
+void
+track (int n)
+{
+ char stackpos[1];
+
+ if (n == 0)
+ trackpoint = stackpos;
+ else if ((n != 7 && n != 8) || trackpoint != stackpos)
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/sibcall-4.c b/gcc/testsuite/gcc.dg/sibcall-4.c
new file mode 100644
index 00000000000..222859d3aba
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sibcall-4.c
@@ -0,0 +1,66 @@
+/* Simple check that sibling calls are performed from a
+ void non-leaf-function taking no arguments calling a function which
+ is about the same as itself.
+
+ Copyright (C) 2002 Free Software Foundation Inc.
+ Contributed by Hans-Peter Nilsson <hp@bitrange.com> */
+
+/* { dg-do run { xfail arc-*-* avr-*-* c4x-*-* cris-*-* h8300-*-* i370-*-* i960-*-* ip2k-*-* m32r-*-* m68hc1?-*-* m681?-*-* m680*-*-* m68k-*-* mcore-*-* mips*-*-* mn10?00-*-* ns32k-*-* s390*-*-* xstormy16-*-* v850*-*-* vax-*-* xtensa-*-* } } */
+/* { dg-options "-O2 -foptimize-sibling-calls" } */
+
+/* The option -foptimize-sibling-calls is the default, but serves as
+ marker. This test is xfailed on targets without sibcall patterns
+ (except targets where the test does not work due to the return address
+ not saved on the regular stack). */
+
+static void recurser_void1 (void);
+static void recurser_void2 (void);
+extern void track (void);
+
+int n = 0;
+int main ()
+{
+ recurser_void1 ();
+ exit (0);
+}
+
+/* The functions should get the same stack-frame, and best way to make it
+ reasonably sure is to make them have the same contents (regarding the
+ n tests). */
+
+static void
+recurser_void1 (void)
+{
+ if (n == 0 || n == 7 || n == 8)
+ track ();
+
+ if (n == 10)
+ return;
+ n++;
+ recurser_void2 ();
+}
+
+static void
+recurser_void2 (void)
+{
+ if (n == 0 || n == 7 || n == 8)
+ track ();
+
+ if (n == 10)
+ return;
+ n++;
+ recurser_void1 ();
+}
+
+void *trackpoint;
+
+void
+track ()
+{
+ char stackpos[1];
+
+ if (n == 0)
+ trackpoint = stackpos;
+ else if ((n != 7 && n != 8) || trackpoint != stackpos)
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/sibcall-5.c b/gcc/testsuite/gcc.dg/sibcall-5.c
new file mode 100644
index 00000000000..424908dba5a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sibcall-5.c
@@ -0,0 +1,41 @@
+/* Check that indirect sibcalls understand regparm. */
+/* { dg-do run { target i?86-*-* } } */
+/* { dg-options "-O2" } */
+
+int (*f)(int, int) __attribute__((regparm(2)));
+int (*g)(int, int, int) __attribute__((regparm(3)));
+
+int __attribute__((noinline))
+foo(void)
+{
+ return f(1, 2);
+}
+
+int __attribute__((noinline))
+bar(void)
+{
+ return g(1, 2, 3);
+}
+
+int __attribute__((regparm(2)))
+f1(int x, int y)
+{
+ return x*3 + y;
+}
+
+int __attribute__((regparm(3)))
+g1(int x, int y, int z)
+{
+ return x*9 + y*3 + z;
+}
+
+int main()
+{
+ f = f1;
+ g = g1;
+ if (foo() != 1*3 + 2)
+ abort ();
+ if (bar() != 1*9 + 2*3 + 3)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/special/mips-abi.exp b/gcc/testsuite/gcc.dg/special/mips-abi.exp
new file mode 100644
index 00000000000..46475f8d96a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/special/mips-abi.exp
@@ -0,0 +1,125 @@
+# 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 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 test checks whether MIPS ELF configurations pass the right
+# ABI flags to the assembler. An ABI flag should always be passed
+# unless MEABI is selected.
+
+load_lib gcc-dg.exp
+
+# Only run this test on MIPS ELF targets
+if {![istarget mips*-*-*] || [gcc_target_object_format] != "elf"} {
+ return
+}
+
+# A list of all assembler ABI flags. We should use SGI-compatible
+# flags where possible.
+set asm_abi_flags {-32 -n32 -64 -mabi=o64 -mabi=eabi}
+
+# Return true if the configuration uses MEABI by default.
+proc is_meabi_config {} {
+ return [expr {[istarget mipsisa32*-*-elf*]
+ || [istarget mipsisa32el-*-elf*]
+ || [istarget mipsisa64-*-elf*]
+ || [istarget mipsisa64el-*-elf*]
+ || [istarget mipsisa64sr71k-*-elf*]}]
+}
+
+# Try to assemble mips-abi.s (an empty file), passing -v in order to
+# get the assembler command line. Check whether an appropriate ABI
+# flag is passed.
+#
+# NAME is a name for the pass/fail line.
+# ABIS is a list of acceptable assembler ABI flags, or "" if no
+# ABI flag is expected.
+# FLAGS is a list of options for gcc.
+proc check_mips_abi {name abis flags} {
+ global srcdir subdir asm_abi_flags
+
+ lappend flags "-v"
+ set lines [gcc_target_compile "$srcdir/$subdir/mips-abi.s" \
+ "mips-abi.o" object \
+ [list "additional_flags=$flags"]]
+ set good 0
+ set bad 0
+ foreach line [split $lines "\n"] {
+ # Find the assembler command line.
+ if {[string first "$srcdir/$subdir/mips-abi.s" $line] >= 0} {
+ foreach arg [split $line " "] {
+ # Count the number of matching and non-matching
+ # ABI options.
+ if {[lsearch -exact $abis $arg] >= 0} {
+ incr good
+ } elseif {[lsearch -exact $asm_abi_flags $arg] >= 0} {
+ incr bad
+ }
+ }
+ }
+ }
+ if {$good == ($abis != "") && $bad == 0} {
+ pass "mips-abi $name"
+ } else {
+ fail "mips-abi $name"
+ }
+}
+
+# Collect the default target flags.
+set default_flags ""
+set target [target_info name]
+if {[info exists CFLAGS_FOR_TARGET]} {
+ append default_flags " $CFLAGS_FOR_TARGET"
+}
+if {[board_info $target exists cflags]} {
+ append default_flags " [board_info $target cflags]"
+}
+if {[board_info $target exists multilib_flags]} {
+ append default_flags " [board_info $target multilib_flags]"
+}
+
+# See whether the default command line specifies an ABI.
+set default_abi ""
+foreach flag $default_flags {
+ if {[string first "-mabi" $flag] == 0} {
+ set default_abi $flag
+ }
+}
+
+# If the command line does specify an ABI, just check for the
+# appropriate assembler flag.
+switch -- $default_abi {
+ -mabi=meabi { check_mips_abi "MEABI" "" "" }
+ -mabi=eabi { check_mips_abi "EABI" "-mabi=eabi" "" }
+ -mabi=32 { check_mips_abi "o32" "-32" "" }
+ -mabi=n32 { check_mips_abi "n32" "-n32" "" }
+ -mabi=o64 { check_mips_abi "o64" "-mabi=o64" "" }
+ -mabi=64 { check_mips_abi "n64" "-64" "" }
+ "" {
+ # MEABI configs shouldn't pass an ABI flag by default
+ # but the others should. It doesn't seem worthwhile
+ # duplicating the configuration to ABI logic here,
+ # so just accept any ABI.
+ if {[is_meabi_config]} {
+ check_mips_abi "default" "" ""
+ } else {
+ check_mips_abi "default" $asm_abi_flags ""
+ }
+ # See whether passing a -mabi flag does the right thing.
+ # Only try ABIs that the SGI assembler also understands.
+ check_mips_abi "o32" "-32" "-mabi=32"
+ check_mips_abi "n32" "-n32" "-mabi=n32"
+ check_mips_abi "64" "-64" "-mabi=64"
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/special/mips-abi.s b/gcc/testsuite/gcc.dg/special/mips-abi.s
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/special/mips-abi.s
diff --git a/gcc/testsuite/gcc.dg/struct-ret-1.c b/gcc/testsuite/gcc.dg/struct-ret-1.c
index f581aad07d2..900ffbef7e3 100644
--- a/gcc/testsuite/gcc.dg/struct-ret-1.c
+++ b/gcc/testsuite/gcc.dg/struct-ret-1.c
@@ -1,5 +1,6 @@
/* { dg-do run { target hppa*-*-* } } */
/* { dg-options { -O2 } { target hppa*-*-* } } */
+extern void exit (int);
typedef struct {
int x;
int y;
@@ -16,7 +17,7 @@ main(int argc, char *argv[])
if (printPoints(toPoint(0, 0), toPoint(1000, 1000)) != 1)
abort();
else
- exit();
+ exit(0);
return 0;
}
diff --git a/gcc/testsuite/gcc.dg/tls/opt-3.c b/gcc/testsuite/gcc.dg/tls/opt-3.c
new file mode 100644
index 00000000000..8e476f657e8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tls/opt-3.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic" } */
+/* { dg-options "-O2 -fpic -mregparm=3" { target i?86-*-* } } */
+
+extern __thread int i, j, k;
+extern void bar(int *, int *, int *);
+void foo(void)
+{
+ bar(&i, &j, &k);
+}
diff --git a/gcc/testsuite/gcc.dg/tls/struct-1.c b/gcc/testsuite/gcc.dg/tls/struct-1.c
new file mode 100644
index 00000000000..11151236d90
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tls/struct-1.c
@@ -0,0 +1,32 @@
+/* This testcase ICEd on IA-32 because the backend was inconsistent whether
+ to allow addends for @dtpoff relocs or not. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic" } */
+
+struct S {
+ int s0, s1, s2, s3;
+};
+static __thread struct S x;
+extern void abort (void);
+extern void exit (int);
+
+void
+foo (struct S *s)
+{
+ s->s2 = 231;
+}
+
+void
+bar (void)
+{
+ if (x.s0 == 231 || x.s2 != 231)
+ abort ();
+}
+
+int
+main ()
+{
+ foo (&x);
+ bar ();
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.dg/typedef-init.c b/gcc/testsuite/gcc.dg/typedef-init.c
new file mode 100644
index 00000000000..9cb4830b74b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/typedef-init.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension. However,
+ it's been broken since GCC 3.0 (caused ICE) and we have now removed
+ the extension. See PR c/7353. */
+
+typedef A = 0; /* { dg-error "initialized" "typedef A = B" } */
+A a; /* { dg-bogus "" "no error cascade" } */
diff --git a/gcc/testsuite/gcc.dg/weak-8.c b/gcc/testsuite/gcc.dg/weak-8.c
deleted file mode 100644
index 9cfb51706aa..00000000000
--- a/gcc/testsuite/gcc.dg/weak-8.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* { dg-do assemble } */
-
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do assemble { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-__attribute__ ((weak)) int i;
-
-int f() {
- return i;
-}
diff --git a/gcc/testsuite/gcc.dg/weak/typeof-2.c b/gcc/testsuite/gcc.dg/weak/typeof-2.c
new file mode 100644
index 00000000000..de7e2c9343e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/weak/typeof-2.c
@@ -0,0 +1,36 @@
+/* Test typeof with __asm redirection. */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern int foo1 (int x) __asm ("baz1");
+int bar1 (int x) { return x; }
+extern __typeof (bar1) foo1 __attribute ((weak, alias ("bar1")));
+
+extern int foo2 (int x) __attribute__ ((const));
+extern __typeof (foo2) foo2 __asm ("baz2");
+int bar2 (int x)
+{
+ return foo2 (x) + foo2 (x) + foo2 (x) + foo2 (x) + foo2 (x) + foo2 (x);
+}
+
+extern int foo3 (int x);
+extern __typeof (foo3) foo3 __asm ("baz3");
+int bar3 (int x)
+{
+ return foo3 (x) + foo3 (x) + foo3 (x) + foo3 (x) + foo3 (x) + foo3 (x);
+}
+
+// { dg-final { scan-assembler-not "foo1" } }
+// { dg-final { scan-assembler "baz1" } }
+// { dg-final { scan-assembler-not "foo2" } }
+// { dg-final { scan-assembler "baz2" } }
+// { dg-final { scan-assembler-not "baz2.*baz2.*baz2.*baz2.*baz2.*baz2" } }
+// { dg-final { scan-assembler-not "foo3" } }
+// SH targets put the funtion address into a constant pool and / or register,
+// so it does not appear repeated (as much as expected) in the assembler.
+// { dg-final { global target_triplet } }
+// { dg-final { if [string match sh-*-* $target_triplet ] {return} } }
+// { dg-final { if [string match {sh[elb1-9]*-*-*} $target_triplet ] {return} } }
+// Likewise for S/390 targets
+// { dg-final { if [string match s390-*-* $target_triplet ] {return} } }
+// { dg-final { scan-assembler "baz3.*baz3.*baz3.*baz3.*baz3.*baz3" } }
diff --git a/gcc/testsuite/gcc.dg/weak-1.c b/gcc/testsuite/gcc.dg/weak/weak-1.c
index 0ee5d549ff3..52d7230ed04 100644
--- a/gcc/testsuite/gcc.dg/weak-1.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-1.c
@@ -1,13 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-fno-common" } */
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-/* { dg-final { global target_triplet } } */
-/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */
-/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } */
-/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?b" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */
diff --git a/gcc/testsuite/gcc.dg/weak-2.c b/gcc/testsuite/gcc.dg/weak/weak-2.c
index 098cc38e7f5..37fa19a1a65 100644
--- a/gcc/testsuite/gcc.dg/weak-2.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-2.c
@@ -1,13 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-fno-common" } */
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-/* { dg-final { global target_triplet } } */
-/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */
-/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } */
-/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */
@@ -30,7 +23,7 @@ void * foo1b (void)
return (void *)ffoo1b;
}
-extern void * ffoo1c (void); /* { dg-warning "applying #pragma weak" "applying #pragma weak" { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
+extern void * ffoo1c (void); /* { dg-warning "applying #pragma weak" "applying #pragma weak" } */
void * foo1c (void)
{
return (void *)ffoo1c;
diff --git a/gcc/testsuite/gcc.dg/weak-3.c b/gcc/testsuite/gcc.dg/weak/weak-3.c
index f474bab49ad..47359edcd09 100644
--- a/gcc/testsuite/gcc.dg/weak-3.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-3.c
@@ -1,14 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-fno-common" } */
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-/* { dg-excess-errors "COFF does not support weak symbols" { target *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-/* { dg-final { global target_triplet } } */
-/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */
-/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } */
-/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */
diff --git a/gcc/testsuite/gcc.dg/weak-4.c b/gcc/testsuite/gcc.dg/weak/weak-4.c
index 90d64de5643..bd530ab5940 100644
--- a/gcc/testsuite/gcc.dg/weak-4.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-4.c
@@ -1,13 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-fno-common" } */
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-/* { dg-final { global target_triplet } } */
-/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */
-/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } */
-/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */
@@ -38,7 +31,7 @@ void * foo1b (void)
}
-extern int vfoo1c; /* { dg-warning "applying #pragma weak" "applying #pragma weak" { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
+extern int vfoo1c; /* { dg-warning "applying #pragma weak" "applying #pragma weak" } */
void * foo1c (void)
{
return (void *)&vfoo1c;
@@ -70,7 +63,7 @@ void * foo1f (void)
#pragma weak vfoo1f
-extern int vfoo1g; /* { dg-warning "applying #pragma weak" "applying #pragma weak" { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
+extern int vfoo1g; /* { dg-warning "applying #pragma weak" "applying #pragma weak" } */
void * foo1g (void)
{
return (void *)&vfoo1g;
diff --git a/gcc/testsuite/gcc.dg/weak-5.c b/gcc/testsuite/gcc.dg/weak/weak-5.c
index e6755cc4680..c4f67e59c76 100644
--- a/gcc/testsuite/gcc.dg/weak-5.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-5.c
@@ -1,14 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-fno-common" } */
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-/* { dg-excess-errors "COFF does not support weak symbols" { target *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-/* { dg-final { global target_triplet } } */
-/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */
-/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } */
-/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */
diff --git a/gcc/testsuite/gcc.dg/weak-6.c b/gcc/testsuite/gcc.dg/weak/weak-6.c
index 6e45b186e34..8f88a675d31 100644
--- a/gcc/testsuite/gcc.dg/weak-6.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-6.c
@@ -1,6 +1,6 @@
/* { dg-do compile } */
extern void * foo (void);
-void * foo (void) { return (void *)foo; } /* { dg-error "precede" "" { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
+void * foo (void) { return (void *)foo; } /* { dg-error "precede" } */
#pragma weak foo
diff --git a/gcc/testsuite/gcc.dg/weak-7.c b/gcc/testsuite/gcc.dg/weak/weak-7.c
index 7a24f7640a7..64d6155a890 100644
--- a/gcc/testsuite/gcc.dg/weak-7.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-7.c
@@ -1,5 +1,4 @@
/* { dg-do compile } */
-/* { dg-excess-errors "COFF does not support weak symbols" { target *-*-coff i?86-pc-cygwin h8300-*-hms } } */
extern void * foo (void);
void * foo (void) { return (void *)foo; } /* { dg-error "precede" } */
diff --git a/gcc/testsuite/gcc.dg/weak/weak-8.c b/gcc/testsuite/gcc.dg/weak/weak-8.c
new file mode 100644
index 00000000000..6e9c267bd21
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/weak/weak-8.c
@@ -0,0 +1,7 @@
+/* { dg-do assemble } */
+
+__attribute__ ((weak)) int i;
+
+int f() {
+ return i;
+}
diff --git a/gcc/testsuite/gcc.dg/weak-9.c b/gcc/testsuite/gcc.dg/weak/weak-9.c
index dd5f6256693..e5cbdb8bc87 100644
--- a/gcc/testsuite/gcc.dg/weak-9.c
+++ b/gcc/testsuite/gcc.dg/weak/weak-9.c
@@ -1,14 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-fno-common" } */
-/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */
-/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */
-
-/* { dg-final { global target_triplet } } */
-/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */
-/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } *
-/
-/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f1" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f2" } } */
/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f3" } } */
diff --git a/gcc/testsuite/gcc.dg/weak/weak.exp b/gcc/testsuite/gcc.dg/weak/weak.exp
new file mode 100644
index 00000000000..595ca92c005
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/weak/weak.exp
@@ -0,0 +1,41 @@
+# Copyright (C) 1997 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.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CFLAGS
+if ![info exists DEFAULT_CFLAGS] then {
+ set DEFAULT_CFLAGS " -ansi -pedantic-errors"
+}
+
+if { [ check_weak_available ] == 1 } {
+
+ dg-init
+
+ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \
+ "" $DEFAULT_CFLAGS
+
+ dg-finish
+
+} elseif { [ check_weak_available ] == 0 } {
+ unsupported "gcc.dg/weak"
+} else {
+ unresolved "gcc.dg/weak"
+}
diff --git a/gcc/testsuite/gcc.dg/wtr-union-init-1.c b/gcc/testsuite/gcc.dg/wtr-union-init-1.c
index 18869813d28..b6a814d7a19 100644
--- a/gcc/testsuite/gcc.dg/wtr-union-init-1.c
+++ b/gcc/testsuite/gcc.dg/wtr-union-init-1.c
@@ -13,7 +13,7 @@ union foo
void
testfunc ()
{
- /* Note we only warn for non-zero initializers. */
+ /* Note we only warn for nonzero initializers. */
static union foo f1 = { 0 };
static union foo f2 = { 1 }; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */
diff --git a/gcc/testsuite/gcc.dg/wtr-union-init-2.c b/gcc/testsuite/gcc.dg/wtr-union-init-2.c
index 3112ba27762..bea26f1bfae 100644
--- a/gcc/testsuite/gcc.dg/wtr-union-init-2.c
+++ b/gcc/testsuite/gcc.dg/wtr-union-init-2.c
@@ -21,7 +21,7 @@ union foo2
void
testfunc ()
{
- /* Note we only warn for non-zero initializers. */
+ /* Note we only warn for nonzero initializers. */
static union foo1 f1 = {0};
static union foo2 f2 = {0};
static union foo1 f3 = {1}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */
diff --git a/gcc/testsuite/gcc.dg/wtr-union-init-3.c b/gcc/testsuite/gcc.dg/wtr-union-init-3.c
index bb8e300289d..407554a9c19 100644
--- a/gcc/testsuite/gcc.dg/wtr-union-init-3.c
+++ b/gcc/testsuite/gcc.dg/wtr-union-init-3.c
@@ -40,7 +40,7 @@ struct baz2
void
testfunc ()
{
- /* Note we only warn for non-zero initializers. Xfail on substructures. */
+ /* Note we only warn for nonzero initializers. Xfail on substructures. */
static union foo f1 = {{0,0}}; /* { dg-bogus "traditional C rejects initialization of unions" "initialization of unions" { xfail *-*-* } } */
static union foo f2 = {{1,1}}; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */
diff --git a/gcc/testsuite/gcc.misc-tests/gcov-8.c b/gcc/testsuite/gcc.misc-tests/gcov-8.c
index 58eec645558..4c95b3dae30 100644
--- a/gcc/testsuite/gcc.misc-tests/gcov-8.c
+++ b/gcc/testsuite/gcc.misc-tests/gcov-8.c
@@ -1,4 +1,4 @@
-/* Check that gcov correctly rounds nearly zero to non-zero and nearly
+/* Check that gcov correctly rounds nearly zero to nonzero and nearly
100 to not-100.
Copyright (C) 2002 Free Software Foundation, Inc.
diff --git a/gcc/testsuite/lib/compat.exp b/gcc/testsuite/lib/compat.exp
new file mode 100644
index 00000000000..0944ccc95d8
--- /dev/null
+++ b/gcc/testsuite/lib/compat.exp
@@ -0,0 +1,235 @@
+# 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 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 file was written by Janis Johnson, <janis187@us.ibm.com>
+
+
+# Test interoperability of two compilers that follow the same ABI, or
+# compatibility of two versions of GCC.
+#
+# Each test has a main program that does nothing but call a function,
+# plus two additional source files that contain parts of a program that
+# rely on the ABI. those source files are compiled into relocatable
+# object files with both compilers. Executables are built using various
+# combinations of those object files, with the main program compiled
+# with the compiler under test and using that compiler's runtime support.
+
+# The including .exp file must define these callback procedures.
+if [string match "" [info procs "compat-use-alt-compiler"]] then {
+ error "Proc compat-use-alt-compiler is not defined."
+}
+if [string match "" [info procs "compat-use-tst-compiler"]] then {
+ error "Proc compat-use-tst-compiler is not defined."
+}
+
+# Each test is run with each pair of compiler options from this list.
+# The first set of options in each pair is used by the compiler under
+# test, and the second set is used by the alternate compiler.
+# The default option lists can be overridden by
+# COMPAT_OPTIONS="[list [list {tst_1} {alt_1}]...[list {tst_n} {alt_n}]]"
+# where tst_i and alt_i are lists of options. You can put this in the
+# environment before site.exp is written or add it to site.exp directly.
+if ![info exists COMPAT_OPTIONS] {
+ set COMPAT_OPTIONS [list \
+ [list {} {}]]
+}
+
+set option_list $COMPAT_OPTIONS
+
+#
+# compat-obj -- compile to an object file
+#
+# SOURCE is the source file
+# DEST is the object file
+# OPTIONS is the list of compiler options
+# OPTSTR is the options to print with test messages
+#
+proc compat-obj { source dest options optstr } {
+ global testcase
+ global tool
+
+ set comp_output [${tool}_target_compile "$source" "$dest" object $options]
+ ${tool}_check_compile "$testcase $dest compile" $optstr $dest $comp_output
+}
+
+# compat-run -- link and run an executable
+#
+# TESTNAME is the mixture of object files to link
+# OBJLIST is the list of object files to link
+# DEST is the name of the executable
+# OPTIONS is a list of compiler and linker options to use
+# OPTSTR is the list of options to list in messages
+#
+proc compat-run { testname objlist dest options optstr } {
+ global testcase
+ global tool
+
+ # Check that all of the objects were built successfully.
+ foreach obj [split $objlist] {
+ if ![file exists $obj] then {
+ unresolved "$testcase $testname link $optstr"
+ unresolved "$testcase $testname execute $optstr"
+ return
+ }
+ }
+
+ # Link the objects into an executable.
+ set comp_output [${tool}_target_compile "$objlist" $dest executable \
+ "$options"]
+ if ![${tool}_check_compile "$testcase $testname link" "" \
+ $dest $comp_output] then {
+ unresolved "$testcase $testname execute $optstr"
+ return
+ }
+
+ # Run the self-checking executable.
+ if ![string match "*/*" $dest] then {
+ set dest "./$dest"
+ }
+ set result [${tool}_load $dest "" ""]
+ set status [lindex $result 0]
+ if { $status == "pass" } then {
+ remote_file build delete $dest
+ }
+ $status "$testcase $testname execute $optstr"
+}
+
+#
+# compat-execute -- compile with compatible compilers
+#
+# SRC1 is the full pathname of the main file of the testcase.
+# USE_ALT is nonzero if we're using an alternate compiler as well as
+# the compiler under test.
+#
+proc compat-execute { src1 use_alt } {
+ global srcdir tmpdir
+ global option_list
+ global tool
+ global verbose
+ global testcase
+
+ # Use the dg-options mechanism to specify extra flags for this test.
+ # FIXME: This does not handle other uses of dg-options, and it only
+ # processes the first one.
+ set extra_tool_flags ""
+ set tmp [grep $src1 "{\[ \t\]\*dg-options.*\[ \t\]\+}"]
+ if ![string match "" $tmp] {
+ set tmp0 [lindex $tmp 0]
+ # Extract the compiler options.
+ regexp "dg-options\[ \t\]\+(.*)\[ \t\]\+\}" \
+ $tmp0 all args
+ # Sometime the options are in quotes, sometimes not.
+ regsub -all "\"" $args "" args
+ set extra_tool_flags $args
+ }
+
+ # Set up the names of the other source files.
+ regsub "_main.*" $src1 "" base
+ regsub ".*/" $base "" base
+ regsub "_main" $src1 "_x" src2
+ regsub "_main" $src1 "_y" src3
+
+ # Define the names of the object files.
+ set obj1 "main_tst.o"
+ set obj2_tst "x_tst.o"
+ set obj2_alt "x_alt.o"
+ set obj3_tst "y_tst.o"
+ set obj3_alt "y_alt.o"
+
+ # Get the base name of this test, for use in messages.
+ regsub "^$srcdir/?" $src1 "" testcase
+ regsub "_main.*" $testcase "" testcase
+ # Set up the base name of executable files so they'll be unique.
+ regsub -all "\[./\]" $testcase "-" execbase
+
+ # If we couldn't rip $srcdir out of `src1' then just do the best we can.
+ # The point is to reduce the unnecessary noise in the logs. Don't strip
+ # out too much because different testcases with the same name can confuse
+ # `test-tool'.
+ if [string match "/*" $testcase] then {
+ set testcase "[file tail [file dirname $src1]]/[file tail $src1]"
+ }
+
+ # Loop through all of the option lists used for this test.
+
+ set count 0
+ foreach option_pair $option_list {
+
+ # Pick out each set of options.
+ set tst_option [lindex $option_pair 0]
+ set alt_option [lindex $option_pair 1]
+ set optstr ""
+ if { ![string match $tst_option ""] \
+ || ![string match $alt_option ""] } then {
+ set optstr "\"$tst_option\",\"$alt_option\""
+ }
+ verbose "Testing $testcase, $optstr" 1
+
+ set tst_options ""
+ set alt_options ""
+ if ![string match $extra_tool_flags ""] then {
+ lappend tst_options "additional_flags=$extra_tool_flags $tst_option"
+ lappend alt_options "additional_flags=$extra_tool_flags $alt_option"
+ }
+
+ # There's a unique name for each executable we generate, based on
+ # the set of options and how the pieces of the tests are compiled.
+ set execname1 "${execbase}-${count}1"
+ set execname2 "${execbase}-${count}2"
+ set execname3 "${execbase}-${count}3"
+ set execname4 "${execbase}-${count}4"
+ incr count
+
+ remote_file build delete $execname1
+ remote_file build delete $execname2
+ remote_file build delete $execname3
+ remote_file build delete $execname4
+
+ # Compile pieces with the alternate compiler; we'll catch problems
+ # later. Skip this if we don't have an alternate compiler.
+ if { $use_alt != 0 } then {
+ compat-use-alt-compiler
+ compat-obj "$src2" "$obj2_alt" $alt_options $optstr
+ compat-obj "$src3" "$obj3_alt" $alt_options $optstr
+ }
+
+ # Compile pieces with the compiler under test.
+ compat-use-tst-compiler
+ compat-obj "$src1" "$obj1" $tst_options $optstr
+ compat-obj "$src2" "$obj2_tst" $tst_options $optstr
+ compat-obj "$src3" "$obj3_tst" $tst_options $optstr
+
+ # Link (using the compiler under test), run, and clean up tests.
+ compat-run "${obj2_tst}-${obj3_tst}" \
+ "$obj1 $obj2_tst $obj3_tst" $execname1 $tst_options $optstr
+
+ # If we've got an alternate compiler try some combinations.
+ if { $use_alt != 0 } then {
+ compat-run "${obj2_tst}-${obj3_alt}" "$obj1 $obj2_tst $obj3_alt" \
+ $execname2 $tst_options $optstr
+ compat-run "${obj2_alt}-${obj3_tst}" "$obj1 $obj2_alt $obj3_tst" \
+ $execname3 $tst_options $optstr
+ compat-run "${obj2_alt}-${obj3_alt}" "$obj1 $obj2_alt $obj3_alt" \
+ $execname4 $tst_options $optstr
+ }
+
+ # Clean up object files.
+ set files [glob -nocomplain *.o]
+ if { $files != "" } {
+ eval "remote_file build delete $files"
+ }
+ }
+}
diff --git a/gcc/testsuite/lib/g++.exp b/gcc/testsuite/lib/g++.exp
index 4fb903eed66..749e1f1c2cd 100644
--- a/gcc/testsuite/lib/g++.exp
+++ b/gcc/testsuite/lib/g++.exp
@@ -239,7 +239,7 @@ proc g++_init { args } {
}
if { [target_info needs_status_wrapper] != "" } {
- set gluefile ${tmpdir}/testglue.o;
+ set gluefile ${tmpdir}/g++-testglue.o;
set result [build_wrapper $gluefile];
if { $result != "" } {
set gluefile [lindex $result 0];
diff --git a/gcc/testsuite/lib/g77.exp b/gcc/testsuite/lib/g77.exp
index 42780c227c9..8f20eb48cc8 100644
--- a/gcc/testsuite/lib/g77.exp
+++ b/gcc/testsuite/lib/g77.exp
@@ -168,7 +168,7 @@ proc g77_init { args } {
}
if { [target_info needs_status_wrapper] != "" } {
- set gluefile ${tmpdir}/testglue.o;
+ set gluefile ${tmpdir}/g77-testglue.o;
set result [build_wrapper $gluefile];
if { $result != "" } {
set gluefile [lindex $result 0];
diff --git a/gcc/testsuite/lib/gcc.exp b/gcc/testsuite/lib/gcc.exp
index 09e5f9e77f9..f090cb11f49 100644
--- a/gcc/testsuite/lib/gcc.exp
+++ b/gcc/testsuite/lib/gcc.exp
@@ -109,7 +109,7 @@ proc gcc_init { args } {
if {[target_info needs_status_wrapper] != "" && \
[target_info needs_status_wrapper] != "0" && \
![info exists gluefile]} {
- set gluefile ${tmpdir}/testglue.o;
+ set gluefile ${tmpdir}/gcc-testglue.o;
set result [build_wrapper $gluefile];
if { $result != "" } {
set gluefile [lindex $result 0];
diff --git a/gcc/testsuite/lib/objc.exp b/gcc/testsuite/lib/objc.exp
index d57b59744f0..3ec19e336ff 100644
--- a/gcc/testsuite/lib/objc.exp
+++ b/gcc/testsuite/lib/objc.exp
@@ -108,7 +108,7 @@ proc objc_init { args } {
set tmpdir /tmp
}
if { [target_info needs_status_wrapper]!="" && ![info exists gluefile] } {
- set gluefile ${tmpdir}/testglue.o;
+ set gluefile ${tmpdir}/objc-testglue.o;
set result [build_wrapper $gluefile];
if { $result != "" } {
set gluefile [lindex $result 0];
diff --git a/gcc/testsuite/lib/old-dejagnu.exp b/gcc/testsuite/lib/old-dejagnu.exp
index 2e2acff2bd4..39c5515b63f 100644
--- a/gcc/testsuite/lib/old-dejagnu.exp
+++ b/gcc/testsuite/lib/old-dejagnu.exp
@@ -445,7 +445,7 @@ proc old-dejagnu { compiler prog name cflagsx default_cflags libs } {
# Delete things like "ld.so: warning" messages.
set comp_output [prune_gcc_output [prune_warnings $comp_output]]
- if [regexp "Internal (compiler )?error" $comp_output] then {
+ if [regexp "\[Ii\]nternal (compiler )?error" $comp_output] then {
if $expect_crash then {
setup_xfail "*-*-*"
}
diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp
index ca62c67836c..57d79e956b3 100644
--- a/gcc/testsuite/lib/profopt.exp
+++ b/gcc/testsuite/lib/profopt.exp
@@ -27,7 +27,7 @@
# addition to the profiling and feedback options.
# If perf_ext is defined and the performance value for the
-# profile-directed test run is non-zero then the performance check will
+# profile-directed test run is nonzero then the performance check will
# be done.
global PROFOPT_OPTIONS perf_delta
diff --git a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp
index 38b24e0ca42..5a3609493c8 100644
--- a/gcc/testsuite/lib/prune.exp
+++ b/gcc/testsuite/lib/prune.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
+# Copyright (C) 1997, 1999, 2000, 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
@@ -19,7 +19,7 @@
proc prune_gcc_output { text } {
#send_user "Before:$text\n"
- regsub -all "(^|\n)\[^\n\]*: In (function|member|method|constructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text
+ regsub -all "(^|\n)\[^\n\]*: In (function|member|method|(copy )?constructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text
regsub -all "(^|\n)\[^\n\]*: At (top level|global scope):\[^\n\]*" $text "" text
regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text
regsub -all "(^|\n)Please submit.*instructions\[^\n\]*" $text "" text
diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp
index 637b298ee42..ebca4caac75 100644
--- a/gcc/testsuite/lib/scanasm.exp
+++ b/gcc/testsuite/lib/scanasm.exp
@@ -114,9 +114,11 @@ proc scan-assembler-dem { args } {
# Find c++filt like we find g++ in g++.exp.
if ![info exists cxxfilt] {
- set cxxfilt [findfile $base_dir/../c++filt $base_dir/../c++filt \
- [findfile $base_dir/c++filt $base_dir/c++filt \
- [transform c++filt]]]
+ set cxxfilt [findfile $base_dir/../../binutils/cxxfilt \
+ $base_dir/../../binutils/cxxfilt \
+ [findfile $base_dir/../c++filt $base_dir/../c++filt \
+ [findfile $base_dir/c++filt $base_dir/c++filt \
+ [transform c++filt]]]]
verbose -log "c++filt is $cxxfilt"
}
@@ -158,17 +160,11 @@ proc scan-assembler-dem-not { args } {
# Find c++filt like we find g++ in g++.exp.
if ![info exists cxxfilt] {
- set cxxfilt [findfile $base_dir/../c++filt $base_dir/../c++filt \
- [findfile $base_dir/c++filt $base_dir/c++filt \
- [transform c++filt]]]
- verbose -log "c++filt is $cxxfilt"
- }
-
- # Find c++filt like we find g++ in g++.exp.
- if ![info exists cxxfilt] {
- set cxxfilt [findfile $base_dir/../c++filt $base_dir/../c++filt \
- [findfile $base_dir/c++filt $base_dir/c++filt \
- [transform c++filt]]]
+ set cxxfilt [findfile $base_dir/../../binutils/cxxfilt \
+ $base_dir/../../binutils/cxxfilt \
+ [findfile $base_dir/../c++filt $base_dir/../c++filt \
+ [findfile $base_dir/c++filt $base_dir/c++filt \
+ [transform c++filt]]]]
verbose -log "c++filt is $cxxfilt"
}
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 86642567878..efcc941c220 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -36,6 +36,12 @@ proc check_weak_available { } {
return 1
}
+ # All solaris2 targets should support it
+
+ if { [regexp ".*-solaris2.*" $target_triplet] } {
+ return 1
+ }
+
# DEC OSF/1/Digital UNIX/Tru64 UNIX supports it
if { [regexp "alpha.*osf.*" $target_triplet] } {
diff --git a/gcc/testsuite/objc.dg/bitfield-2.m b/gcc/testsuite/objc.dg/bitfield-2.m
index 25a48625c6b..0a401dd6afa 100644
--- a/gcc/testsuite/objc.dg/bitfield-2.m
+++ b/gcc/testsuite/objc.dg/bitfield-2.m
@@ -1,7 +1,7 @@
/* Check if bitfield ivars are correctly @encode'd when
the NeXT runtime is used. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
-/* { dg-options "-fnext-runtime" } */
+/* { dg-options "-fnext-runtime -fsigned-char" } */
/* { dg-do run } */
struct objc_object { struct objc_class *class_pointer; } *id;
diff --git a/gcc/testsuite/objc.dg/comp-types-1.m b/gcc/testsuite/objc.dg/comp-types-1.m
new file mode 100644
index 00000000000..74943860b2d
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-1.m
@@ -0,0 +1,86 @@
+/* Test various ObjC types assignments and comparisons. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+@protocol MyProtocol
+- (void) foo;
+@end
+
+@interface MyClass
+@end
+
+@interface MyOtherClass <MyProtocol>
+- (void) foo;
+@end
+
+int main()
+{
+ id obj = nil;
+ id<MyProtocol> obj_p = nil;
+ MyClass *obj_c = nil;
+ MyOtherClass *obj_cp = nil;
+ Class obj_C = Nil;
+
+ /* Assigning to an 'id' variable should never
+ generate a warning. */
+ obj = obj_p; /* Ok */
+ obj = obj_c; /* Ok */
+ obj = obj_cp; /* Ok */
+ obj = obj_C; /* Ok */
+
+ /* Assigning to a 'MyClass *' variable should always generate a
+ warning, unless done from an 'id'. */
+ obj_c = obj; /* Ok */
+ obj_c = obj_p; /* { dg-warning "incompatible pointer type" } */
+ obj_c = obj_cp; /* { dg-warning "incompatible pointer type" } */
+ obj_c = obj_C; /* { dg-warning "incompatible pointer type" } */
+
+ /* Assigning to an 'id<MyProtocol>' variable should generate a
+ warning if done from a 'MyClass *' (which doesn't implement
+ MyProtocol), but not from an 'id' or from a 'MyOtherClass *'
+ (which implements MyProtocol). */
+ obj_p = obj; /* Ok */
+ obj_p = obj_c; /* { dg-warning "does not implement" } */ /*FIXME: Duplicated*/
+ obj_p = obj_cp; /* Ok */
+ obj_p = obj_C; /* { dg-warning "incompatible pointer type" } */
+
+ /* Assigning to a 'MyOtherClass *' variable should always generate
+ a warning, unless done from an 'id' */
+ obj_cp = obj; /* Ok */
+ obj_cp = obj_c; /* { dg-warning "incompatible pointer type" } */
+ obj_cp = obj_p; /* { dg-warning "incompatible pointer type" } */
+ obj_cp = obj_C; /* { dg-warning "incompatible pointer type" } */
+
+ /* Any comparison involving an 'id' must be without warnings. */
+ if (obj == obj_p) ; /* Ok */ /*Bogus warning here in 2.95.4*/
+ if (obj_p == obj) ; /* Ok */
+ if (obj == obj_c) ; /* Ok */
+ if (obj_c == obj) ; /* Ok */
+ if (obj == obj_cp) ; /* Ok */
+ if (obj_cp == obj) ; /* Ok */
+ if (obj == obj_C) ; /* Ok */
+ if (obj_C == obj) ; /* Ok */
+
+ /* Any comparison between 'MyClass *' and anything which is not an 'id'
+ must generate a warning. */
+ if (obj_c == obj_p) ; /* { dg-warning "does not implement" } */
+ if (obj_p == obj_c) ; /* { dg-warning "does not implement" } */
+ if (obj_c == obj_cp) ; /* { dg-warning "lacks a cast" } */
+ if (obj_cp == obj_c) ; /* { dg-warning "lacks a cast" } */
+ if (obj_c == obj_C) ; /* { dg-warning "lacks a cast" } */
+ if (obj_C == obj_c) ; /* { dg-warning "lacks a cast" } */
+
+ /* Any comparison between 'MyOtherClass *' (which implements
+ MyProtocol) and an 'id' implementing MyProtocol are Ok. */
+ if (obj_cp == obj_p) ; /* Ok */
+ if (obj_p == obj_cp) ; /* Ok */
+
+
+ if (obj_p == obj_C) ; /* { dg-warning "lacks a cast" } */
+ if (obj_C == obj_p) ; /* { dg-warning "lacks a cast" } */
+ if (obj_cp == obj_C) ; /* { dg-warning "lacks a cast" } */
+ if (obj_C == obj_cp) ; /* { dg-warning "lacks a cast" } */
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/comp-types-2.m b/gcc/testsuite/objc.dg/comp-types-2.m
new file mode 100644
index 00000000000..6e88df999b7
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-2.m
@@ -0,0 +1,37 @@
+/* Test simple ObjC types casts. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+@protocol MyProtocol
+- (void) foo;
+@end
+
+@interface MyClass
+@end
+
+int main()
+{
+ id obj = nil;
+ id<MyProtocol> obj_p = nil;
+ MyClass *obj_c = nil;
+ Class obj_C = Nil;
+
+ /* All these casts should generate no warnings. */
+
+ obj = (id)obj_p;
+ obj = (id)obj_c;
+ obj = (id)obj_C;
+ obj_c = (MyClass *)obj;
+ obj_c = (MyClass *)obj_p;
+ obj_c = (MyClass *)obj_C;
+ obj_p = (id<MyProtocol>)obj;
+ obj_p = (id<MyProtocol>)obj_c;
+ obj_p = (id<MyProtocol>)obj_C;
+ obj_C = (Class)obj;
+ obj_C = (Class)obj_p;
+ obj_C = (Class)obj_c;
+
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/comp-types-3.m b/gcc/testsuite/objc.dg/comp-types-3.m
new file mode 100644
index 00000000000..51f418ef529
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-3.m
@@ -0,0 +1,63 @@
+/* Test assignments and comparisons between protocols (obscure case). */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+@protocol MyProtocolA
+- (void) methodA;
+@end
+
+@protocol MyProtocolB
+- (void) methodB;
+@end
+
+@protocol MyProtocolAB <MyProtocolA, MyProtocolB>
+@end
+
+@protocol MyProtocolAC <MyProtocolA>
+- (void) methodC;
+@end
+
+int main()
+{
+ id<MyProtocolA> obj_a = nil;
+ id<MyProtocolB> obj_b = nil;
+ id<MyProtocolAB> obj_ab = nil;
+ id<MyProtocolAC> obj_ac = nil;
+
+ obj_a = obj_b; /* { dg-warning "does not conform" } */
+ obj_a = obj_ab; /* Ok */
+ obj_a = obj_ac; /* Ok */
+
+ obj_b = obj_a; /* { dg-warning "does not conform" } */
+ obj_b = obj_ab; /* Ok */
+ obj_b = obj_ac; /* { dg-warning "does not conform" } */
+
+ obj_ab = obj_a; /* { dg-warning "does not conform" } */
+ obj_ab = obj_b; /* { dg-warning "does not conform" } */
+ obj_ab = obj_ac; /* { dg-warning "does not conform" } */
+
+ obj_ac = obj_a; /* { dg-warning "does not conform" } */
+ obj_ac = obj_b; /* { dg-warning "does not conform" } */
+ obj_ac = obj_ab; /* { dg-warning "does not conform" } */
+
+ if (obj_a == obj_b) ; /* { dg-warning "lacks a cast" } */
+ if (obj_b == obj_a) ; /* { dg-warning "lacks a cast" } */
+
+ if (obj_a == obj_ab) ; /* Ok */
+ if (obj_ab == obj_a) ; /* Ok */ /* Spurious 2.95.4 warning here */
+
+ if (obj_a == obj_ac) ; /* Ok */
+ if (obj_ac == obj_a) ; /* Ok */ /* Spurious 2.95.4 warning here */
+
+ if (obj_b == obj_ab) ; /* Ok */
+ if (obj_ab == obj_b) ; /* Ok */ /* Spurious 2.95.4 warning here */
+
+ if (obj_b == obj_ac) ; /* { dg-warning "lacks a cast" } */
+ if (obj_ac == obj_b) ; /* { dg-warning "lacks a cast" } */
+
+ if (obj_ab == obj_ac) ; /* { dg-warning "lacks a cast" } */
+ if (obj_ac == obj_ab) ; /* { dg-warning "lacks a cast" } */
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/comp-types-4.m b/gcc/testsuite/objc.dg/comp-types-4.m
new file mode 100644
index 00000000000..e07780485ee
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-4.m
@@ -0,0 +1,68 @@
+/* Test warnings for assignments and comparisons between ObjC and C types. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+@protocol MyProtocol
+- (void) method;
+@end
+
+@interface MyClass
+@end
+
+int main()
+{
+ id obj = nil;
+ id <MyProtocol> obj_p = nil;
+ MyClass *obj_c = nil;
+ Class obj_C = Nil;
+
+ int i = 0;
+ int *j = NULL;
+
+ /* These should all generate warnings. */
+
+ obj = i; /* { dg-warning "pointer from integer without a cast" } */
+ obj = j; /* { dg-warning "incompatible pointer type" } */
+
+ obj_p = i; /* { dg-warning "pointer from integer without a cast" } */
+ obj_p = j; /* { dg-warning "incompatible pointer type" } */
+
+ obj_c = i; /* { dg-warning "pointer from integer without a cast" } */
+ obj_c = j; /* { dg-warning "incompatible pointer type" } */
+
+ obj_C = i; /* { dg-warning "pointer from integer without a cast" } */
+ obj_C = j; /* { dg-warning "incompatible pointer type" } */
+
+ i = obj; /* { dg-warning "integer from pointer without a cast" } */
+ i = obj_p; /* { dg-warning "integer from pointer without a cast" } */
+ i = obj_c; /* { dg-warning "integer from pointer without a cast" } */
+ i = obj_C; /* { dg-warning "integer from pointer without a cast" } */
+
+ j = obj; /* { dg-warning "incompatible pointer type" } */
+ j = obj_p; /* { dg-warning "incompatible pointer type" } */
+ j = obj_c; /* { dg-warning "incompatible pointer type" } */
+ j = obj_C; /* { dg-warning "incompatible pointer type" } */
+
+ if (obj == i) ; /* { dg-warning "comparison between pointer and integer" } */
+ if (i == obj) ; /* { dg-warning "comparison between pointer and integer" } */
+ if (obj == j) ; /* { dg-warning "lacks a cast" } */
+ if (j == obj) ; /* { dg-warning "lacks a cast" } */
+
+ if (obj_c == i) ; /*{ dg-warning "comparison between pointer and integer" }*/
+ if (i == obj_c) ; /*{ dg-warning "comparison between pointer and integer" }*/
+ if (obj_c == j) ; /* { dg-warning "lacks a cast" } */
+ if (j == obj_c) ; /* { dg-warning "lacks a cast" } */
+
+ if (obj_p == i) ; /*{ dg-warning "comparison between pointer and integer" }*/
+ if (i == obj_p) ; /*{ dg-warning "comparison between pointer and integer" }*/
+ if (obj_p == j) ; /* { dg-warning "lacks a cast" } */
+ if (j == obj_p) ; /* { dg-warning "lacks a cast" } */
+
+ if (obj_C == i) ; /*{ dg-warning "comparison between pointer and integer" }*/
+ if (i == obj_C) ; /*{ dg-warning "comparison between pointer and integer" }*/
+ if (obj_C == j) ; /* { dg-warning "lacks a cast" } */
+ if (j == obj_C) ; /* { dg-warning "lacks a cast" } */
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/comp-types-5.m b/gcc/testsuite/objc.dg/comp-types-5.m
new file mode 100644
index 00000000000..f4d3dfc94e9
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-5.m
@@ -0,0 +1,32 @@
+/* Test assignments and comparisons involving `one-off' protocols. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+@protocol MyProtocol
+- (void) method;
+@end
+
+@interface MyClass
+@end
+
+int main()
+{
+ id obj = nil;
+ id <MyProtocol> obj_p = nil;
+ MyClass<MyProtocol> *obj_cp = nil;
+
+ obj_cp = obj; /* Ok */
+ obj = obj_cp; /* Ok */
+
+ obj_cp = obj_p; /* { dg-warning "incompatible pointer type" } */
+ obj_p = obj_cp; /* Ok */ /* Spurious 2.95.4 warning here. */
+
+ if (obj_cp == obj) ; /* Ok */
+ if (obj == obj_cp) ; /* Ok */
+
+ if (obj_cp == obj_p) ; /* Ok */
+ if (obj_p == obj_cp) ; /* Ok */
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/comp-types-6.m b/gcc/testsuite/objc.dg/comp-types-6.m
new file mode 100644
index 00000000000..9403b532fd3
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-6.m
@@ -0,0 +1,37 @@
+/* Test assignments and comparisons involving category protocols. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+@protocol MyProtocol
+- (void) method;
+@end
+
+@interface MyClass
+@end
+
+@interface MyClass (Addition) <MyProtocol>
+- (void) method;
+@end
+
+@interface MyOtherClass : MyClass
+@end
+
+int main()
+{
+ id <MyProtocol> obj_p = nil;
+ MyClass *obj_cp = nil;
+ MyOtherClass *obj_cp2 = nil;
+
+ obj_cp = obj_p; /* { dg-warning "incompatible pointer type" } */
+ obj_cp2 = obj_p; /* { dg-warning "incompatible pointer type" } */
+ obj_p = obj_cp; /* Ok */
+ obj_p = obj_cp2; /* Ok */
+
+ if (obj_cp == obj_p) ; /* Ok */
+ if (obj_cp2 == obj_p) ; /* Ok */
+ if (obj_p == obj_cp) ; /* Ok */
+ if (obj_p == obj_cp2) ; /* Ok */
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/proto-lossage-1.m b/gcc/testsuite/objc.dg/proto-lossage-1.m
new file mode 100644
index 00000000000..d312039262c
--- /dev/null
+++ b/gcc/testsuite/objc.dg/proto-lossage-1.m
@@ -0,0 +1,43 @@
+/* Test for situations in which protocol conformance information
+ may be lost, leading to superfluous warnings. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do compile } */
+
+/* One-line substitute for objc/objc.h */
+typedef struct objc_object { struct objc_class *class_pointer; } *id;
+
+@protocol NSObject
+- (int)someValue;
+@end
+
+@interface NSObject <NSObject>
+@end
+
+@protocol PlateMethods
+- (void)someMethod;
+@end
+
+@interface Foo {
+ NSObject <PlateMethods> *plate;
+ id <PlateMethods> plate1;
+ NSObject *plate2;
+}
+- (id <PlateMethods>) getPlate;
+- (id <NSObject>) getPlate1;
+- (int) getValue;
+@end
+
+@implementation Foo
+- (id <PlateMethods>) getPlate {
+ return plate; /* { dg-bogus "does not implement" } */
+}
+- (id <NSObject>) getPlate1 {
+ return (id <NSObject>)plate1; /* { dg-bogus "does not conform" } */
+}
+- (int) getValue {
+ int i = [plate1 someValue]; /* { dg-warning "not implemented by protocol" } */
+ int j = [(id <NSObject>)plate1 someValue]; /* { dg-bogus "not implemented by protocol" } */
+ int k = [(id)plate1 someValue]; /* { dg-bogus "not implemented by protocol" } */
+ return i + j + k;
+}
+@end
diff --git a/gcc/testsuite/objc.dg/super-class-2.m b/gcc/testsuite/objc.dg/super-class-2.m
new file mode 100644
index 00000000000..15d018e7db8
--- /dev/null
+++ b/gcc/testsuite/objc.dg/super-class-2.m
@@ -0,0 +1,45 @@
+/* Test calling super from within a category class method. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile } */
+/* { dg-options "-fnext-runtime" } */
+
+typedef struct objc_object { struct objc_class *isa; } *id;
+
+@interface NSObject
++ (int) test_func0;
+@end
+@interface NSMenuItem: NSObject
++ (int) test_func0;
+@end
+
+@implementation NSObject
++ (int) test_func0
+{}
+@end
+
+@implementation NSMenuItem
++ (int) test_func0
+{
+ return [super test_func0];
+}
+@end
+
+@interface NSObject (Test)
++ (int) test_func;
+@end
+
+@implementation NSObject (Test)
++ (int) test_func
+{}
+@end
+
+@interface NSMenuItem (Test)
++ (int) test_func;
+@end
+
+@implementation NSMenuItem (Test)
++ (int) test_func
+{
+ return [super test_func]; /* { dg-bogus "dereferencing pointer to incomplete type" } */
+}
+@end
diff --git a/gcc/testsuite/objc.dg/undeclared-selector.m b/gcc/testsuite/objc.dg/undeclared-selector.m
new file mode 100644
index 00000000000..1cfc6c83481
--- /dev/null
+++ b/gcc/testsuite/objc.dg/undeclared-selector.m
@@ -0,0 +1,48 @@
+/* Test for -Wundeclared-selector. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+/* { dg-options "-Wundeclared-selector" } */
+
+#include <objc/objc.h>
+
+@interface MyClass
+
++ (void) methodA;
+- (void) methodB;
++ (void) methodD;
+- (void) methodF;
+
+@end
+
+@implementation MyClass
+
++ (void) methodA {}
+- (void) methodB {}
++ (void) methodD
+{
+ SEL d = @selector(methodD); /* Ok */
+ SEL e = @selector(methodE); /* { dg-warning "undeclared selector" } */
+}
+
+- (void) methodE
+{
+ SEL e = @selector(methodE); /* Ok */
+}
+
+- (void) methodF
+{
+ SEL e = @selector(methodE); /* Ok */
+}
+
+@end
+
+int main (void)
+{
+ SEL a = @selector(methodA); /* Ok */
+ SEL b = @selector(methodB); /* Ok */
+ SEL c = @selector(methodC); /* { dg-warning "undeclared selector" } */
+ SEL d = @selector(methodD); /* Ok */
+ SEL e = @selector(methodE); /* Ok */
+ return 0;
+
+}
diff --git a/gcc/testsuite/objc/execute/class-tests-1.h b/gcc/testsuite/objc/execute/class-tests-1.h
index f321df4f335..8362006ef72 100644
--- a/gcc/testsuite/objc/execute/class-tests-1.h
+++ b/gcc/testsuite/objc/execute/class-tests-1.h
@@ -113,7 +113,7 @@ void test_class_with_superclass (const char *class_name,
/* We need at least a method call before playing with the internals,
so that the runtime will call __objc_resolve_class_links () */
- [Object initialize];
+ [Object class];
/* class_name must be an existing class */
class = objc_lookup_class (class_name);
diff --git a/gcc/testsuite/objc/execute/formal_protocol-6.x b/gcc/testsuite/objc/execute/formal_protocol-6.x
deleted file mode 100644
index 2f397b96e51..00000000000
--- a/gcc/testsuite/objc/execute/formal_protocol-6.x
+++ /dev/null
@@ -1,2 +0,0 @@
-set torture_execute_xfail "*-*-*"
-return 0
diff --git a/gcc/testsuite/objc/execute/nil_method-1.m b/gcc/testsuite/objc/execute/nil_method-1.m
new file mode 100644
index 00000000000..137d2072e44
--- /dev/null
+++ b/gcc/testsuite/objc/execute/nil_method-1.m
@@ -0,0 +1,61 @@
+/* Contributed by Nicola Pero - Fri Aug 30 12:55:37 2002 */
+#include <objc/objc.h>
+#include <objc/Object.h>
+
+/* Test that calling a method of a nil object results in
+ nothing to happen (but not a crash), and nil to be
+ returned. */
+
+@interface TestClass : Object
+
+- (void) testVoid;
+- (id) testId;
+
+- (void) testVoidWithA: (int)a;
+- (id) testIdWithA: (id)a;
+
+- (void) testVoidWithA: (int)a andB: (int)b;
+- (id) testIdWithA: (id)g andB: (id)b;
+
+- (void) voidSum: (int)firstNumber, ...;
+- (id) sum: (int)firstNumber, ...;
+
+@end
+
+int main (void)
+{
+ TestClass *t = nil;
+
+ [t testVoid];
+
+ if ([t testId] != nil)
+ {
+ abort ();
+ }
+
+ [t testVoidWithA: 234];
+
+ if ([t testIdWithA: t] != nil)
+ {
+ abort ();
+ }
+
+ [t testVoidWithA: 12004 andB: -123];
+
+ if ([t testIdWithA: t andB: nil] != nil)
+ {
+ abort ();
+ }
+
+
+ [t voidSum: 1, -2, 3, -4, 5, -6, 7, -8, 9, -10,
+ 11, -12, 13, -14, 15, -16, 17, -18, 19, -20];
+
+ if ([t sum: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] != nil)
+ {
+ abort ();
+ }
+
+ return 0;
+}
diff --git a/gcc/timevar.c b/gcc/timevar.c
index 9b8c9fc9b8c..7a10fe78b47 100644
--- a/gcc/timevar.c
+++ b/gcc/timevar.c
@@ -114,7 +114,7 @@ static float clocks_to_msec;
/* See timevar.h for an explanation of timing variables. */
-/* This macro evaluates to non-zero if timing variables are enabled. */
+/* This macro evaluates to nonzero if timing variables are enabled. */
#define TIMEVAR_ENABLE (time_report)
/* A timing variable. */
@@ -176,7 +176,7 @@ static void timevar_accumulate
/* Fill the current times into TIME. The definition of this function
also defines any or all of the HAVE_USER_TIME, HAVE_SYS_TIME, and
- HAVA_WALL_TIME macros. */
+ HAVE_WALL_TIME macros. */
static void
get_time (now)
diff --git a/gcc/tlink.c b/gcc/tlink.c
index 21d82f75ffe..4a56d4849b9 100644
--- a/gcc/tlink.c
+++ b/gcc/tlink.c
@@ -595,8 +595,8 @@ scan_linker_output (fname)
/* Try the first word on the line. */
if (*p == '.')
++p;
- if (*p == '_' && prepends_underscore)
- ++p;
+ if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
+ p += strlen (USER_LABEL_PREFIX);
end = ! *q;
*q = 0;
@@ -611,8 +611,8 @@ scan_linker_output (fname)
p++;
if (*p == '.')
p++;
- if (*p == '_' && prepends_underscore)
- p++;
+ if (!strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
+ p += strlen (USER_LABEL_PREFIX);
sym = symbol_hash_lookup (p, false);
}
@@ -649,8 +649,9 @@ scan_linker_output (fname)
sym = symbol_hash_lookup (dem->mangled, false);
else
{
- if (*p == '_' && prepends_underscore)
- ++p;
+ if (!strncmp (p, USER_LABEL_PREFIX,
+ strlen (USER_LABEL_PREFIX)))
+ p += strlen (USER_LABEL_PREFIX);
sym = symbol_hash_lookup (p, false);
}
}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index aec618f178c..2ff1eed6479 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -66,6 +66,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "reload.h"
#include "dwarf2asm.h"
#include "integrate.h"
+#include "real.h"
#include "debug.h"
#include "target.h"
#include "langhooks.h"
@@ -345,8 +346,8 @@ int use_gnu_debug_info_extensions = 0;
int optimize = 0;
/* Nonzero means optimize for size. -Os.
- The only valid values are zero and non-zero. When optimize_size is
- non-zero, optimize defaults to 2, but certain individual code
+ The only valid values are zero and nonzero. When optimize_size is
+ nonzero, optimize defaults to 2, but certain individual code
bloating optimizations are disabled. */
int optimize_size = 0;
@@ -374,11 +375,6 @@ int profile_flag = 0;
int profile_arc_flag = 0;
-/* Nonzero if we should not attempt to generate thread-safe
- code to profile program flow graph arcs. */
-
-int flag_unsafe_profile_arcs = 0;
-
/* Nonzero if generating info for gcov to calculate line test coverage. */
int flag_test_coverage = 0;
@@ -862,19 +858,10 @@ int flag_peephole2 = 0;
/* This will try to guess branch probabilities. */
int flag_guess_branch_prob = 0;
-/* -fbounded-pointers causes gcc to compile pointers as composite
- objects occupying three words: the pointer value, the base address
- of the referent object, and the address immediately beyond the end
- of the referent object. The base and extent allow us to perform
- runtime bounds checking. -fbounded-pointers implies -fcheck-bounds. */
-int flag_bounded_pointers = 0;
-
/* -fcheck-bounds causes gcc to generate array bounds checks.
- For C, C++: defaults to value of flag_bounded_pointers.
- For ObjC: defaults to off.
+ For C, C++, ObjC: defaults to off.
For Java: defaults to on.
- For Fortran: defaults to off.
- For CHILL: defaults to off. */
+ For Fortran: defaults to off. */
int flag_bounds_check = 0;
/* This will attempt to merge constant section constants, if 1 only
@@ -911,6 +898,10 @@ int align_labels_max_skip;
int align_functions;
int align_functions_log;
+/* Like align_functions_log above, but used by front-ends to force the
+ minimum function alignment. Zero means no alignment is forced. */
+int force_align_functions_log;
+
/* Table of supported debugging formats. */
static const struct
{
@@ -976,11 +967,6 @@ static const param_info lang_independent_params[] = {
{ NULL, 0, NULL }
};
-/* A default for same. */
-#ifndef USER_LABEL_PREFIX
-#define USER_LABEL_PREFIX ""
-#endif
-
/* Table of language-independent -f options.
STRING is the option name. VARIABLE is the address of the variable.
ON_VALUE is the value to store in VARIABLE
@@ -1104,8 +1090,6 @@ static const lang_independent_options f_options[] =
N_("Support synchronous non-call exceptions") },
{"profile-arcs", &profile_arc_flag, 1,
N_("Insert arc based program profiling code") },
- {"unsafe-profile-arcs", &flag_unsafe_profile_arcs, 1,
- N_("Avoid thread safety profiling overhead") },
{"test-coverage", &flag_test_coverage, 1,
N_("Create data files needed by gcov") },
{"branch-probabilities", &flag_branch_probabilities, 1,
@@ -1190,10 +1174,8 @@ static const lang_independent_options f_options[] =
N_("Allow math optimizations that may violate IEEE or ANSI standards") },
{"signaling-nans", &flag_signaling_nans, 1,
N_("Disable optimizations observable by IEEE signaling NaNs") },
- {"bounded-pointers", &flag_bounded_pointers, 1,
- N_("Compile pointers as triples: value, base & end") },
{"bounds-check", &flag_bounds_check, 1,
- N_("Generate code to check bounds before dereferencing pointers and arrays") },
+ N_("Generate code to check bounds before indexing arrays") },
{"single-precision-constant", &flag_single_precision_constant, 1,
N_("Convert floating point constant to single precision constant") },
{"time-report", &time_report, 1,
@@ -1511,6 +1493,11 @@ int warn_missing_noreturn;
int warn_deprecated_decl = 1;
+/* Nonzero means warn about constructs which might not be
+ strict-aliasing safe. */
+
+int warn_strict_aliasing;
+
/* Likewise for -W. */
static const lang_independent_options W_options[] =
@@ -1556,7 +1543,9 @@ static const lang_independent_options W_options[] =
{"deprecated-declarations", &warn_deprecated_decl, 1,
N_("Warn about uses of __attribute__((deprecated)) declarations") },
{"missing-noreturn", &warn_missing_noreturn, 1,
- N_("Warn about functions which might be candidates for attribute noreturn") }
+ N_("Warn about functions which might be candidates for attribute noreturn") },
+ {"strict-aliasing", &warn_strict_aliasing, 1,
+ N_ ("Warn about code which might break the strict aliasing rules") }
};
void
@@ -1640,7 +1629,7 @@ read_integral_parameter (p, pname, defval)
return atoi (p);
}
-/* This calls abort and is used to avoid problems when abort if a macro.
+/* This calls abort and is used to avoid problems when abort is a macro.
It is used when we need to pass the address of abort. */
void
@@ -1700,7 +1689,7 @@ static void
crash_signal (signo)
int signo;
{
- internal_error ("internal error: %s", strsignal (signo));
+ internal_error ("%s", strsignal (signo));
}
/* Strip off a legitimate source ending from the input string NAME of
@@ -1897,7 +1886,7 @@ close_dump_file (index, func, insns)
/* Do any final processing required for the declarations in VEC, of
which there are LEN. We write out inline functions and variables
that have been deferred until this point, but which are required.
- Returns non-zero if anything was put out. */
+ Returns nonzero if anything was put out. */
int
wrapup_global_declarations (vec, len)
@@ -2160,14 +2149,11 @@ compile_file ()
wrapup_global_declarations (vec, len);
- /* This must occur after the loop to output deferred functions. Else
- the profiler initializer would not be emitted if all the functions
- in this compilation unit were deferred.
-
- output_func_start_profiler can not cause any additional functions or
- data to need to be output, so it need not be in the deferred function
- loop above. */
- output_func_start_profiler ();
+ if (profile_arc_flag)
+ /* This must occur after the loop to output deferred functions.
+ Else the profiler initializer would not be emitted if all the
+ functions in this compilation unit were deferred. */
+ create_profiler ();
check_global_declarations (vec, len);
@@ -2194,8 +2180,6 @@ compile_file ()
dw2_output_indirect_constants ();
- end_final (aux_base_name);
-
if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
{
timevar_push (TV_DUMP);
@@ -2506,7 +2490,7 @@ rest_of_compilation (decl)
free_bb_for_insn ();
}
- current_function_nothrow = nothrow_function_p ();
+ set_nothrow_function_flags ();
if (current_function_nothrow)
/* Now we know that this can't throw; set the flag for the benefit
of other functions later in this translation unit. */
@@ -2583,7 +2567,9 @@ rest_of_compilation (decl)
delete_unreachable_blocks ();
/* Turn NOTE_INSN_PREDICTIONs into branch predictions. */
+ timevar_push (TV_BRANCH_PROB);
note_prediction_to_br_prob ();
+ timevar_pop (TV_BRANCH_PROB);
/* We may have potential sibling or tail recursion sites. Select one
(of possibly multiple) methods of performing the call. */
@@ -3528,7 +3514,7 @@ rest_of_compilation (decl)
shorten_branches (get_insns ());
timevar_pop (TV_SHORTEN_BRANCH);
- current_function_nothrow = nothrow_function_p ();
+ set_nothrow_function_flags ();
if (current_function_nothrow)
/* Now we know that this can't throw; set the flag for the benefit
of other functions later in this translation unit. */
@@ -4013,7 +3999,7 @@ decode_f_option (arg)
else if (!strcmp (arg, "no-stack-limit"))
stack_limit_rtx = NULL_RTX;
else if (!strcmp (arg, "preprocessed"))
- /* Recognise this switch but do nothing. This prevents warnings
+ /* Recognize this switch but do nothing. This prevents warnings
about an unrecognized switch if cpplib has not been linked in. */
;
else
@@ -4736,7 +4722,7 @@ general_init (argv0)
minimal options processing. Outputting diagnostics is OK, but GC
and identifier hashtables etc. are not initialized yet.
- Return non-zero to suppress compiler back end initialization. */
+ Return nonzero to suppress compiler back end initialization. */
static void
parse_options_and_default_flags (argc, argv)
int argc;
@@ -5184,7 +5170,7 @@ backend_init ()
expand_dummy_function_end ();
}
-/* Language-dependent initialization. Returns non-zero on success. */
+/* Language-dependent initialization. Returns nonzero on success. */
static int
lang_dependent_init (name)
const char *name;
diff --git a/gcc/tracer.c b/gcc/tracer.c
index c0fbe21ad84..970b5f46b40 100644
--- a/gcc/tracer.c
+++ b/gcc/tracer.c
@@ -65,7 +65,7 @@ static int branch_ratio_cutoff;
#define seen(bb) (RBI (bb)->visited || RBI (bb)->next)
-/* Return true if we should ignore the basic block for purposes of tracing. */
+/* Return true if we should ignore the basic block for purposes of tracing. */
static bool
ignore_bb_p (bb)
basic_block bb;
diff --git a/gcc/tree-dump.c b/gcc/tree-dump.c
index 5348c2d1be3..5b9f4f58ab6 100644
--- a/gcc/tree-dump.c
+++ b/gcc/tree-dump.c
@@ -592,7 +592,7 @@ dequeue_and_dump (di)
fprintf (di->stream, "\n");
}
-/* Return non-zero if FLAG has been specified for the dump, and NODE
+/* Return nonzero if FLAG has been specified for the dump, and NODE
is not the root node of the dump. */
int dump_flag (di, flag, node)
@@ -709,7 +709,7 @@ dump_begin (phase, flag_ptr)
return stream;
}
-/* Returns non-zero if tree dump PHASE is enabled. */
+/* Returns nonzero if tree dump PHASE is enabled. */
int
dump_enabled_p (phase)
@@ -738,7 +738,7 @@ dump_end (phase, stream)
fclose (stream);
}
-/* Parse ARG as a dump switch. Return non-zero if it is, and store the
+/* Parse ARG as a dump switch. Return nonzero if it is, and store the
relevant details in the dump_files array. */
int
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 866d6251a88..f0194ad0355 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -336,6 +336,23 @@ remap_block (block, decls, id)
{
tree new_var;
+ /* All local class initialization flags go in the outermost
+ scope. */
+ if (LOCAL_CLASS_INITIALIZATION_FLAG_P (old_var))
+ {
+ /* We may already have one. */
+ if (! splay_tree_lookup (id->decl_map, (splay_tree_key) old_var))
+ {
+ tree outermost_block;
+ new_var = remap_decl (old_var, id);
+ DECL_ABSTRACT_ORIGIN (new_var) = NULL;
+ outermost_block = DECL_SAVED_TREE (current_function_decl);
+ TREE_CHAIN (new_var) = BLOCK_VARS (outermost_block);
+ BLOCK_VARS (outermost_block) = new_var;
+ }
+ continue;
+ }
+
/* Remap the variable. */
new_var = remap_decl (old_var, id);
/* If we didn't remap this variable, so we can't mess with
@@ -442,10 +459,10 @@ copy_body_r (tp, walk_subtrees, data)
assignment into the equivalent of the original
RESULT_DECL. */
#ifndef INLINER_FOR_JAVA
- if (RETURN_EXPR (return_stmt))
+ if (RETURN_STMT_EXPR (return_stmt))
{
*tp = build_stmt (EXPR_STMT,
- RETURN_EXPR (return_stmt));
+ RETURN_STMT_EXPR (return_stmt));
STMT_IS_FULL_EXPR_P (*tp) = 1;
/* And then jump to the end of the function. */
TREE_CHAIN (*tp) = goto_stmt;
@@ -831,7 +848,7 @@ declare_return_variable (id, var)
return NULL_TREE;
}
-/* Returns non-zero if a function can be inlined as a tree. */
+/* Returns nonzero if a function can be inlined as a tree. */
int
tree_inlinable_function_p (fn)
@@ -840,7 +857,7 @@ tree_inlinable_function_p (fn)
return inlinable_function_p (fn, NULL);
}
-/* Returns non-zero if FN is a function that can be inlined into the
+/* Returns nonzero if FN is a function that can be inlined into the
inlining context ID_. If ID_ is NULL, check whether the function
can be inlined at all. */
@@ -1180,7 +1197,9 @@ expand_call_inline (tp, walk_subtrees, data)
*inlined_body = copy_body (id);
#else /* INLINER_FOR_JAVA */
{
- tree new_body = copy_body (id);
+ tree new_body;
+ java_inlining_map_static_initializers (fn, id->decl_map);
+ new_body = copy_body (id);
TREE_TYPE (new_body) = TREE_TYPE (TREE_TYPE (fn));
BLOCK_EXPR_BODY (expr)
= add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
@@ -1218,9 +1237,17 @@ expand_call_inline (tp, walk_subtrees, data)
= chainon (COMPOUND_BODY (stmt), scope_stmt);
#else /* INLINER_FOR_JAVA */
if (retvar)
- BLOCK_EXPR_BODY (expr)
- = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
- TREE_TYPE (retvar), retvar);
+ {
+ /* Mention the retvar. If the return type of the function was
+ promoted, convert it back to the expected type. */
+ if (TREE_TYPE (TREE_TYPE (fn)) != TREE_TYPE (retvar))
+ retvar = build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)), retvar);
+ BLOCK_EXPR_BODY (expr)
+ = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
+ TREE_TYPE (retvar), retvar);
+ }
+
+ java_inlining_merge_static_initializers (fn, id->decl_map);
#endif /* INLINER_FOR_JAVA */
/* Clean up. */
@@ -1737,7 +1764,7 @@ remap_save_expr (tp, st_, fn, walk_subtrees)
#ifdef INLINER_FOR_JAVA
/* Add STMT to EXISTING if possible, otherwise create a new
- COMPOUND_EXPR and add STMT to it. */
+ COMPOUND_EXPR and add STMT to it. */
static tree
add_stmt_to_compound (existing, type, stmt)
diff --git a/gcc/tree.c b/gcc/tree.c
index 1a5910e985d..a3d7c1384c9 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -119,7 +119,7 @@ static GTY ((if_marked ("type_hash_marked_p"), param_is (struct type_hash)))
static void set_type_quals PARAMS ((tree, int));
static void append_random_chars PARAMS ((char *));
static int type_hash_eq PARAMS ((const void *, const void *));
-static unsigned int type_hash_hash PARAMS ((const void *));
+static hashval_t type_hash_hash PARAMS ((const void *));
static void print_type_hash_statistics PARAMS((void));
static void finish_vector_type PARAMS((tree));
static tree make_vector PARAMS ((enum machine_mode, tree, int));
@@ -177,7 +177,7 @@ tree_size (node)
case '1': /* a unary arithmetic expression */
case '2': /* a binary arithmetic expression */
return (sizeof (struct tree_exp)
- + (TREE_CODE_LENGTH (code) - 1) * sizeof (char *));
+ + TREE_CODE_LENGTH (code) * sizeof (char *) - sizeof (char *));
case 'c': /* a constant */
/* We can't use TREE_CODE_LENGTH for INTEGER_CST, since the number of
@@ -199,7 +199,7 @@ tree_size (node)
length = (sizeof (struct tree_common)
+ TREE_CODE_LENGTH (code) * sizeof (char *));
if (code == TREE_VEC)
- length += (TREE_VEC_LENGTH (node) - 1) * sizeof (char *);
+ length += TREE_VEC_LENGTH (node) * sizeof (char *) - sizeof (char *);
return length;
}
@@ -474,11 +474,8 @@ build_real (type, d)
REAL_VALUE_TYPE *dp;
int overflow = 0;
- /* Check for valid float value for this type on this target machine;
- if not, can print error message and store a valid value in D. */
-#ifdef CHECK_FLOAT_VALUE
- CHECK_FLOAT_VALUE (TYPE_MODE (type), d, overflow);
-#endif
+ /* ??? Used to check for overflow here via CHECK_FLOAT_TYPE.
+ Consider doing it via real_convert now. */
v = make_node (REAL_CST);
dp = ggc_alloc (sizeof (REAL_VALUE_TYPE));
@@ -726,6 +723,24 @@ integer_pow2p (expr)
|| (low == 0 && (high & (high - 1)) == 0));
}
+/* Return 1 if EXPR is an integer constant other than zero or a
+ complex constant other than zero. */
+
+int
+integer_nonzerop (expr)
+ tree expr;
+{
+ STRIP_NOPS (expr);
+
+ return ((TREE_CODE (expr) == INTEGER_CST
+ && ! TREE_CONSTANT_OVERFLOW (expr)
+ && (TREE_INT_CST_LOW (expr) != 0
+ || TREE_INT_CST_HIGH (expr) != 0))
+ || (TREE_CODE (expr) == COMPLEX_CST
+ && (integer_nonzerop (TREE_REALPART (expr))
+ || integer_nonzerop (TREE_IMAGPART (expr)))));
+}
+
/* Return the power of two represented by a tree node known to be a
power of two. */
@@ -947,41 +962,6 @@ chain_member (elem, chain)
return 0;
}
-/* Return nonzero if ELEM is equal to TREE_VALUE (CHAIN) for any piece of
- chain CHAIN. This and the next function are currently unused, but
- are retained for completeness. */
-
-int
-chain_member_value (elem, chain)
- tree elem, chain;
-{
- while (chain)
- {
- if (elem == TREE_VALUE (chain))
- return 1;
- chain = TREE_CHAIN (chain);
- }
-
- return 0;
-}
-
-/* Return nonzero if ELEM is equal to TREE_PURPOSE (CHAIN)
- for any piece of chain CHAIN. */
-
-int
-chain_member_purpose (elem, chain)
- tree elem, chain;
-{
- while (chain)
- {
- if (elem == TREE_PURPOSE (chain))
- return 1;
- chain = TREE_CHAIN (chain);
- }
-
- return 0;
-}
-
/* Return the length of a chain of nodes chained through TREE_CHAIN.
We expect a null pointer to mark the end of the chain.
This is the Lisp primitive `length'. */
@@ -1074,31 +1054,6 @@ nreverse (t)
}
return prev;
}
-
-/* Given a chain CHAIN of tree nodes,
- construct and return a list of those nodes. */
-
-tree
-listify (chain)
- tree chain;
-{
- tree result = NULL_TREE;
- tree in_tail = chain;
- tree out_tail = NULL_TREE;
-
- while (in_tail)
- {
- tree next = tree_cons (NULL_TREE, in_tail, NULL_TREE);
- if (out_tail)
- TREE_CHAIN (out_tail) = next;
- else
- result = next;
- out_tail = next;
- in_tail = TREE_CHAIN (in_tail);
- }
-
- return result;
-}
/* Return a newly created TREE_LIST node whose
purpose and value fields are PARM and VALUE. */
@@ -2602,7 +2557,7 @@ default_ms_bitfield_layout_p (record)
return false;
}
-/* Return non-zero if IDENT is a valid name for attribute ATTR,
+/* Return nonzero if IDENT is a valid name for attribute ATTR,
or zero if not.
We try both `text' and `__text__', ATTR may be either one. */
@@ -2939,7 +2894,7 @@ type_hash_eq (va, vb)
/* Return the cached hash value. */
-static unsigned int
+static hashval_t
type_hash_hash (item)
const void *item;
{
@@ -3277,24 +3232,6 @@ tree_low_cst (t, pos)
abort ();
}
-/* Return the most significant bit of the integer constant T. */
-
-int
-tree_int_cst_msb (t)
- tree t;
-{
- int prec;
- HOST_WIDE_INT h;
- unsigned HOST_WIDE_INT l;
-
- /* Note that using TYPE_PRECISION here is wrong. We care about the
- actual bits, not the (arbitrary) range of the type. */
- prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (t))) - 1;
- rshift_double (TREE_INT_CST_LOW (t), TREE_INT_CST_HIGH (t), prec,
- 2 * HOST_BITS_PER_WIDE_INT, &l, &h, 0);
- return (l & 1) == 1;
-}
-
/* Return an indication of the sign of the integer constant T.
The return value is -1 if T < 0, 0 if T == 0, and 1 if T > 0.
Note that -1 will never be returned it T's type is unsigned. */
@@ -3498,26 +3435,28 @@ compare_tree_int (t, u)
(RECORD_TYPE, UNION_TYPE and ENUMERAL_TYPE nodes are
constructed by language-dependent code, not here.) */
-/* Construct, lay out and return the type of pointers to TO_TYPE.
- If such a type has already been constructed, reuse it. */
+/* Construct, lay out and return the type of pointers to TO_TYPE
+ with mode MODE. If such a type has already been constructed,
+ reuse it. */
tree
-build_pointer_type (to_type)
+build_pointer_type_for_mode (to_type, mode)
tree to_type;
+ enum machine_mode mode;
{
tree t = TYPE_POINTER_TO (to_type);
/* First, if we already have a type for pointers to TO_TYPE, use it. */
-
- if (t != 0)
+ if (t != 0 && mode == ptr_mode)
return t;
- /* We need a new one. */
t = make_node (POINTER_TYPE);
TREE_TYPE (t) = to_type;
+ TYPE_MODE (t) = mode;
/* Record this type as the pointer to TO_TYPE. */
+ if (mode == ptr_mode)
TYPE_POINTER_TO (to_type) = t;
/* Lay out the type. This function has many callers that are concerned
@@ -3528,25 +3467,37 @@ build_pointer_type (to_type)
return t;
}
-/* Build the node for the type of references-to-TO_TYPE. */
+/* By default build pointers in ptr_mode. */
tree
-build_reference_type (to_type)
+build_pointer_type (to_type)
+ tree to_type;
+{
+ return build_pointer_type_for_mode (to_type, ptr_mode);
+}
+
+/* Construct, lay out and return the type of references to TO_TYPE
+ with mode MODE. If such a type has already been constructed,
+ reuse it. */
+
+tree
+build_reference_type_for_mode (to_type, mode)
tree to_type;
+ enum machine_mode mode;
{
tree t = TYPE_REFERENCE_TO (to_type);
/* First, if we already have a type for pointers to TO_TYPE, use it. */
-
- if (t)
+ if (t != 0 && mode == ptr_mode)
return t;
- /* We need a new one. */
t = make_node (REFERENCE_TYPE);
TREE_TYPE (t) = to_type;
+ TYPE_MODE (t) = mode;
/* Record this type as the pointer to TO_TYPE. */
+ if (mode == ptr_mode)
TYPE_REFERENCE_TO (to_type) = t;
layout_type (t);
@@ -3554,6 +3505,17 @@ build_reference_type (to_type)
return t;
}
+
+/* Build the node for the type of references-to-TO_TYPE by default
+ in ptr_mode. */
+
+tree
+build_reference_type (to_type)
+ tree to_type;
+{
+ return build_reference_type_for_mode (to_type, ptr_mode);
+}
+
/* Build a type that is compatible with t but has no cv quals anywhere
in its type, thus
@@ -3648,36 +3610,6 @@ build_index_2_type (lowval, highval)
return build_range_type (sizetype, lowval, highval);
}
-/* Return nonzero iff ITYPE1 and ITYPE2 are equal (in the LISP sense).
- Needed because when index types are not hashed, equal index types
- built at different times appear distinct, even though structurally,
- they are not. */
-
-int
-index_type_equal (itype1, itype2)
- tree itype1, itype2;
-{
- if (TREE_CODE (itype1) != TREE_CODE (itype2))
- return 0;
-
- if (TREE_CODE (itype1) == INTEGER_TYPE)
- {
- if (TYPE_PRECISION (itype1) != TYPE_PRECISION (itype2)
- || TYPE_MODE (itype1) != TYPE_MODE (itype2)
- || simple_cst_equal (TYPE_SIZE (itype1), TYPE_SIZE (itype2)) != 1
- || TYPE_ALIGN (itype1) != TYPE_ALIGN (itype2))
- return 0;
-
- if (1 == simple_cst_equal (TYPE_MIN_VALUE (itype1),
- TYPE_MIN_VALUE (itype2))
- && 1 == simple_cst_equal (TYPE_MAX_VALUE (itype1),
- TYPE_MAX_VALUE (itype2)))
- return 1;
- }
-
- return 0;
-}
-
/* Construct, lay out and return the type of arrays of elements with ELT_TYPE
and number of elements specified by the range of values of INDEX_TYPE.
If such a type has already been constructed, reuse it. */
@@ -4766,6 +4698,8 @@ build_common_tree_nodes_2 (short_double)
unsigned_V4SI_type_node
= make_vector (V4SImode, unsigned_intSI_type_node, 1);
+ unsigned_V2HI_type_node
+ = make_vector (V2HImode, unsigned_intHI_type_node, 1);
unsigned_V2SI_type_node
= make_vector (V2SImode, unsigned_intSI_type_node, 1);
unsigned_V2DI_type_node
@@ -4778,10 +4712,13 @@ build_common_tree_nodes_2 (short_double)
= make_vector (V8HImode, unsigned_intHI_type_node, 1);
unsigned_V16QI_type_node
= make_vector (V16QImode, unsigned_intQI_type_node, 1);
+ unsigned_V1DI_type_node
+ = make_vector (V1DImode, unsigned_intDI_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);
+ V2HI_type_node = make_vector (V2HImode, intHI_type_node, 0);
V2SI_type_node = make_vector (V2SImode, intSI_type_node, 0);
V2DI_type_node = make_vector (V2DImode, intDI_type_node, 0);
V4HI_type_node = make_vector (V4HImode, intHI_type_node, 0);
@@ -4790,6 +4727,7 @@ build_common_tree_nodes_2 (short_double)
V2SF_type_node = make_vector (V2SFmode, float_type_node, 0);
V2DF_type_node = make_vector (V2DFmode, double_type_node, 0);
V16QI_type_node = make_vector (V16QImode, intQI_type_node, 0);
+ V1DI_type_node = make_vector (V1DImode, intDI_type_node, 0);
}
/* Returns a vector tree node given a vector mode, the inner type, and
diff --git a/gcc/tree.def b/gcc/tree.def
index 705252fa171..c04b486fe15 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -76,10 +76,10 @@ DEFTREECODE (TREE_VEC, "tree_vec", 'x', 2)
could either point to another BLOCK node or it could point to a
FUNCTION_DECL node (e.g. in the case of a block representing the
outermost scope of a particular inlining of a function).
- BLOCK_ABSTRACT is non-zero if the block represents an abstract
+ BLOCK_ABSTRACT is nonzero if the block represents an abstract
instance of a block (i.e. one which is nested within an abstract
instance of an inline function).
- TREE_ASM_WRITTEN is non-zero if the block was actually referenced
+ TREE_ASM_WRITTEN is nonzero if the block was actually referenced
in the generated assembly. */
DEFTREECODE (BLOCK, "block", 'b', 0)
@@ -204,14 +204,14 @@ DEFTREECODE (FILE_TYPE, "file_type", 't', 0)
The field TYPE_POINTER_TO (TREE_TYPE (array_type)) is always nonzero
and holds the type to coerce a value of that array type to in C.
TYPE_STRING_FLAG indicates a string (in contrast to an array of chars)
- in languages (such as Chill) that make a distinction. */
+ in languages (such as Chill) that make a distinction. */
/* Array types in C or Pascal */
DEFTREECODE (ARRAY_TYPE, "array_type", 't', 0)
/* Types of sets for Pascal. Special fields are the same as
in an array type. The target type is always a boolean type.
Used for both bitstrings and powersets in Chill;
- TYPE_STRING_FLAG indicates a bitstring. */
+ TYPE_STRING_FLAG indicates a bitstring. */
DEFTREECODE (SET_TYPE, "set_type", 't', 0)
/* Struct in C, or record in Pascal. */
@@ -329,7 +329,7 @@ DEFTREECODE (STRING_CST, "string_cst", 'c', 3)
holds a line number. In some cases these can be the location of
a reference, if no definition has been seen.
- DECL_ABSTRACT is non-zero if the decl represents an abstract instance
+ DECL_ABSTRACT is nonzero if the decl represents an abstract instance
of a decl (i.e. one which is nested within an abstract instance of a
inline function. */
@@ -369,7 +369,7 @@ DEFTREECODE (INDIRECT_REF, "indirect_ref", 'r', 1)
DEFTREECODE (BUFFER_REF, "buffer_ref", 'r', 1)
/* Array indexing.
- Operand 0 is the array; operand 1 is a (single) array index. */
+ Operand 0 is the array; operand 1 is a (single) array index. */
DEFTREECODE (ARRAY_REF, "array_ref", 'r', 2)
/* Likewise, except that the result is a range ("slice") of the array. The
@@ -670,7 +670,7 @@ DEFTREECODE (NE_EXPR, "ne_expr", '<', 2)
DEFTREECODE (UNORDERED_EXPR, "unordered_expr", '<', 2)
DEFTREECODE (ORDERED_EXPR, "ordered_expr", '<', 2)
-/* These are equivalent to unordered or ... */
+/* These are equivalent to unordered or ... */
DEFTREECODE (UNLT_EXPR, "unlt_expr", '<', 2)
DEFTREECODE (UNLE_EXPR, "unle_expr", '<', 2)
DEFTREECODE (UNGT_EXPR, "ungt_expr", '<', 2)
@@ -846,7 +846,7 @@ DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location", 'e', 3)
/* Switch expression.
Operand 0 is the expression used to perform the branch,
Operand 1 contains the case values. The way they're organized is
- front-end implementation defined. */
+ front-end implementation defined. */
DEFTREECODE (SWITCH_EXPR, "switch_expr", 'e', 2)
/* The exception object from the runtime. */
diff --git a/gcc/tree.h b/gcc/tree.h
index 856a18d517e..4f928aac488 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -53,7 +53,7 @@ enum tree_code {
extern const char tree_code_type[];
#define TREE_CODE_CLASS(CODE) tree_code_type[(int) (CODE)]
-/* Returns non-zero iff CLASS is the tree-code class of an
+/* Returns nonzero iff CLASS is the tree-code class of an
expression. */
#define IS_EXPR_CODE_CLASS(CLASS) \
@@ -726,10 +726,10 @@ struct tree_int_cst GTY(())
#define TREE_CST_RTL(NODE) (CST_OR_CONSTRUCTOR_CHECK (NODE)->real_cst.rtl)
-/* In a REAL_CST node. struct realvaluetype is an opaque entity, with
+/* In a REAL_CST node. struct real_value is an opaque entity, with
manipulators defined in real.h. We don't want tree.h depending on
real.h and transitively on tm.h. */
-struct realvaluetype;
+struct real_value;
#define TREE_REAL_CST_PTR(NODE) (REAL_CST_CHECK (NODE)->real_cst.real_cst_ptr)
#define TREE_REAL_CST(NODE) (*TREE_REAL_CST_PTR (NODE))
@@ -738,7 +738,7 @@ struct tree_real_cst GTY(())
{
struct tree_common common;
rtx rtl; /* acts as link to register transfer language (rtl) info */
- struct realvaluetype * real_cst_ptr;
+ struct real_value * real_cst_ptr;
};
/* In a STRING_CST */
@@ -889,7 +889,7 @@ struct tree_exp GTY(())
struct tree_common common;
int complexity;
tree GTY ((special ("tree_exp"),
- length ("TREE_CODE_LENGTH (TREE_CODE ((tree) &%h))")))
+ desc ("TREE_CODE ((tree) &%0)")))
operands[1];
};
@@ -1375,7 +1375,7 @@ struct tree_type GTY(())
as DECL_NAME. It is an IDENTIFIER_NODE. */
#define DECL_ASSEMBLER_NAME(NODE) decl_assembler_name (NODE)
-/* Returns non-zero if the DECL_ASSEMBLER_NAME for NODE has been set. If zero,
+/* Returns nonzero if the DECL_ASSEMBLER_NAME for NODE has been set. If zero,
the NODE might still have a DECL_ASSEMBLER_NAME -- it just hasn't been set
yet. */
#define DECL_ASSEMBLER_NAME_SET_P(NODE) \
@@ -1495,7 +1495,7 @@ struct tree_type GTY(())
: (make_decl_rtl (NODE, NULL), (NODE)->decl.rtl))
/* Set the DECL_RTL for NODE to RTL. */
#define SET_DECL_RTL(NODE, RTL) (DECL_CHECK (NODE)->decl.rtl = (RTL))
-/* Returns non-zero if the DECL_RTL for NODE has already been set. */
+/* Returns nonzero if the DECL_RTL for NODE has already been set. */
#define DECL_RTL_SET_P(NODE) (DECL_CHECK (NODE)->decl.rtl != NULL)
/* Copy the RTL from NODE1 to NODE2. If the RTL was not set for
NODE1, it will not be set for NODE2; this is a lazy copy. */
@@ -1608,7 +1608,7 @@ struct tree_type GTY(())
/* In a FIELD_DECL, indicates this field should be bit-packed. */
#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->decl.regdecl_flag)
-/* In a FUNCTION_DECL with a non-zero DECL_CONTEXT, indicates that a
+/* In a FUNCTION_DECL with a nonzero DECL_CONTEXT, indicates that a
static chain is not needed. */
#define DECL_NO_STATIC_CHAIN(NODE) \
(FUNCTION_DECL_CHECK (NODE)->decl.regdecl_flag)
@@ -1826,7 +1826,7 @@ struct tree_decl GTY(())
/* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
DECL_FUNCTION_CODE. */
enum built_in_function f;
- /* In a FUNCITON_DECL for which DECL_BUILT_IN does not hold, this
+ /* In a FUNCTION_DECL for which DECL_BUILT_IN does not hold, this
is used by language-dependent code. */
HOST_WIDE_INT i;
/* DECL_ALIGN and DECL_OFFSET_ALIGN. (These are not used for
@@ -1965,9 +1965,11 @@ enum tree_index
TI_UV8HI_TYPE,
TI_UV8QI_TYPE,
TI_UV4HI_TYPE,
+ TI_UV2HI_TYPE,
TI_UV2SI_TYPE,
TI_UV2SF_TYPE,
TI_UV2DI_TYPE,
+ TI_UV1DI_TYPE,
TI_UV16QI_TYPE,
TI_V4SF_TYPE,
@@ -1976,10 +1978,12 @@ enum tree_index
TI_V8HI_TYPE,
TI_V8QI_TYPE,
TI_V4HI_TYPE,
+ TI_V2HI_TYPE,
TI_V2SI_TYPE,
TI_V2SF_TYPE,
TI_V2DF_TYPE,
TI_V2DI_TYPE,
+ TI_V1DI_TYPE,
TI_V16QI_TYPE,
TI_MAIN_IDENTIFIER,
@@ -2046,8 +2050,10 @@ extern GTY(()) tree global_trees[TI_MAX];
#define unsigned_V8QI_type_node global_trees[TI_UV8QI_TYPE]
#define unsigned_V8HI_type_node global_trees[TI_UV8HI_TYPE]
#define unsigned_V4HI_type_node global_trees[TI_UV4HI_TYPE]
+#define unsigned_V2HI_type_node global_trees[TI_UV2HI_TYPE]
#define unsigned_V2SI_type_node global_trees[TI_UV2SI_TYPE]
#define unsigned_V2DI_type_node global_trees[TI_UV2DI_TYPE]
+#define unsigned_V1DI_type_node global_trees[TI_UV1DI_TYPE]
#define V16QI_type_node global_trees[TI_V16QI_TYPE]
#define V4SF_type_node global_trees[TI_V4SF_TYPE]
@@ -2055,11 +2061,13 @@ extern GTY(()) tree global_trees[TI_MAX];
#define V8QI_type_node global_trees[TI_V8QI_TYPE]
#define V8HI_type_node global_trees[TI_V8HI_TYPE]
#define V4HI_type_node global_trees[TI_V4HI_TYPE]
+#define V2HI_type_node global_trees[TI_V2HI_TYPE]
#define V2SI_type_node global_trees[TI_V2SI_TYPE]
#define V2SF_type_node global_trees[TI_V2SF_TYPE]
#define V2DI_type_node global_trees[TI_V2DI_TYPE]
#define V2DF_type_node global_trees[TI_V2DF_TYPE]
#define V16SF_type_node global_trees[TI_V16SF_TYPE]
+#define V1DI_type_node global_trees[TI_V1DI_TYPE]
/* An enumeration of the standard C integer types. These must be
ordered so that shorter types appear before longer ones, and so
@@ -2098,7 +2106,44 @@ extern GTY(()) tree integer_types[itk_none];
#define long_unsigned_type_node integer_types[itk_unsigned_long]
#define long_long_integer_type_node integer_types[itk_long_long]
#define long_long_unsigned_type_node integer_types[itk_unsigned_long_long]
+
+/* Set to the default thread-local storage (tls) model to use. */
+
+enum tls_model {
+ TLS_MODEL_GLOBAL_DYNAMIC = 1,
+ TLS_MODEL_LOCAL_DYNAMIC,
+ TLS_MODEL_INITIAL_EXEC,
+ TLS_MODEL_LOCAL_EXEC
+};
+extern enum tls_model flag_tls_default;
+
+/* A pointer-to-function member type looks like:
+
+ struct {
+ __P __pfn;
+ ptrdiff_t __delta;
+ };
+
+ If __pfn is NULL, it is a NULL pointer-to-member-function.
+
+ (Because the vtable is always the first thing in the object, we
+ don't need its offset.) If the function is virtual, then PFN is
+ one plus twice the index into the vtable; otherwise, it is just a
+ pointer to the function.
+
+ Unfortunately, using the lowest bit of PFN doesn't work in
+ architectures that don't impose alignment requirements on function
+ addresses, or that use the lowest bit to tell one ISA from another,
+ for example. For such architectures, we use the lowest bit of
+ DELTA instead of the lowest bit of the PFN, and DELTA will be
+ multiplied by 2. */
+
+enum ptrmemfunc_vbit_where_t
+{
+ ptrmemfunc_vbit_in_pfn,
+ ptrmemfunc_vbit_in_delta
+};
#define NULL_TREE (tree) NULL
@@ -2173,7 +2218,9 @@ extern tree make_unsigned_type PARAMS ((int));
extern void initialize_sizetypes PARAMS ((void));
extern void set_sizetype PARAMS ((tree));
extern void fixup_unsigned_type PARAMS ((tree));
+extern tree build_pointer_type_for_mode PARAMS ((tree, enum machine_mode));
extern tree build_pointer_type PARAMS ((tree));
+extern tree build_reference_type_for_mode PARAMS ((tree, enum machine_mode));
extern tree build_reference_type PARAMS ((tree));
extern tree build_type_no_quals PARAMS ((tree));
extern tree build_index_type PARAMS ((tree));
@@ -2197,11 +2244,9 @@ extern int tree_int_cst_lt PARAMS ((tree, tree));
extern int tree_int_cst_compare PARAMS ((tree, tree));
extern int host_integerp PARAMS ((tree, int));
extern HOST_WIDE_INT tree_low_cst PARAMS ((tree, int));
-extern int tree_int_cst_msb PARAMS ((tree));
extern int tree_int_cst_sgn PARAMS ((tree));
extern int tree_expr_nonnegative_p PARAMS ((tree));
extern int rtl_expr_nonnegative_p PARAMS ((rtx));
-extern int index_type_equal PARAMS ((tree, tree));
extern tree get_inner_array_type PARAMS ((tree));
/* From expmed.c. Since rtl.h is included after tree.h, we can't
@@ -2313,7 +2358,7 @@ extern tree strip_attrs PARAMS ((tree));
extern int valid_machine_attribute PARAMS ((tree, tree, tree, tree));
-/* Given a tree node and a string, return non-zero if the tree node is
+/* Given a tree node and a string, return nonzero if the tree node is
a valid attribute name for the string. */
extern int is_attribute_p PARAMS ((const char *, tree));
@@ -2363,6 +2408,12 @@ extern tree build_qualified_type PARAMS ((tree, int));
extern tree build_type_copy PARAMS ((tree));
+/* Finish up a builtin RECORD_TYPE. Give it a name and provide its
+ fields. Optionally specify an alignment, and then lsy it out. */
+
+extern void finish_builtin_struct PARAMS ((tree, const char *,
+ tree, tree));
+
/* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT,
TYPE_ALIGN and TYPE_MODE fields. If called more than once on one
node, does nothing except for the first time. */
@@ -2399,6 +2450,8 @@ typedef struct record_layout_info_s
/* The static variables (i.e., class variables, as opposed to
instance variables) encountered in T. */
tree pending_statics;
+ /* Bits remaining in the current alignment group */
+ int remaining_in_alignment;
int packed_maybe_necessary;
} *record_layout_info;
@@ -2407,8 +2460,6 @@ extern void set_lang_adjust_rli PARAMS ((void (*) PARAMS
extern record_layout_info start_record_layout PARAMS ((tree));
extern tree bit_from_pos PARAMS ((tree, tree));
extern tree byte_from_pos PARAMS ((tree, tree));
-extern void pos_from_byte PARAMS ((tree *, tree *, unsigned int,
- tree));
extern void pos_from_bit PARAMS ((tree *, tree *, unsigned int,
tree));
extern void normalize_offset PARAMS ((tree *, tree *,
@@ -2418,7 +2469,7 @@ extern tree rli_size_so_far PARAMS ((record_layout_info));
extern void normalize_rli PARAMS ((record_layout_info));
extern void place_field PARAMS ((record_layout_info, tree));
extern void compute_record_mode PARAMS ((tree));
-extern void finish_record_layout PARAMS ((record_layout_info));
+extern void finish_record_layout PARAMS ((record_layout_info, int));
/* Given a hashcode and a ..._TYPE node (for which the hashcode was made),
return a canonicalized ..._TYPE node, so that duplicates are not made.
@@ -2510,7 +2561,7 @@ extern void put_pending_sizes PARAMS ((tree));
/* If nonzero, an upper limit on alignment of structure fields, in bits. */
extern unsigned int maximum_field_alignment;
-/* If non-zero, the alignment of a bitstring or (power-)set value, in bits. */
+/* If nonzero, the alignment of a bitstring or (power-)set value, in bits. */
extern unsigned int set_alignment;
/* Concatenate two lists (chains of TREE_LIST nodes) X and Y
@@ -2563,6 +2614,11 @@ extern int integer_all_onesp PARAMS ((tree));
extern int integer_pow2p PARAMS ((tree));
+/* integer_nonzerop (tree x) is nonzero if X is an integer constant
+ with a nonzero value. */
+
+extern int integer_nonzerop PARAMS ((tree));
+
/* staticp (tree x) is nonzero if X is a reference to data allocated
at a fixed address in memory. */
@@ -2744,7 +2800,6 @@ extern tree lhd_unsave_expr_now PARAMS ((tree));
/* In stmt.c */
-extern int in_control_zone_p PARAMS ((void));
extern void expand_fixups PARAMS ((rtx));
extern tree expand_start_stmt_expr PARAMS ((int));
extern tree expand_end_stmt_expr PARAMS ((tree));
@@ -2801,7 +2856,6 @@ extern int pushcase_range PARAMS ((tree, tree,
tree (*) (tree, tree),
tree, tree *));
extern void using_eh_for_cleanups PARAMS ((void));
-extern int stmt_loop_nest_empty PARAMS ((void));
/* In fold-const.c */
@@ -2845,9 +2899,10 @@ extern void rrotate_double PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
extern int operand_equal_p PARAMS ((tree, tree, int));
extern tree invert_truthvalue PARAMS ((tree));
-extern tree fold_builtin PARAMS ((tree));
-
-extern tree build_range_type PARAMS ((tree, tree, tree));
+/* In builtins.c */
+extern tree fold_builtin PARAMS ((tree));
+extern enum built_in_function builtin_mathfn_code PARAMS ((tree));
+extern tree build_function_call_expr PARAMS ((tree, tree));
/* In alias.c */
extern void record_component_aliases PARAMS ((tree));
@@ -2869,9 +2924,6 @@ extern int compare_tree_int PARAMS ((tree,
unsigned HOST_WIDE_INT));
extern int type_list_equal PARAMS ((tree, tree));
extern int chain_member PARAMS ((tree, tree));
-extern int chain_member_purpose PARAMS ((tree, tree));
-extern int chain_member_value PARAMS ((tree, tree));
-extern tree listify PARAMS ((tree));
extern tree type_hash_lookup PARAMS ((unsigned int, tree));
extern void type_hash_add PARAMS ((unsigned int, tree));
extern unsigned int type_hash_list PARAMS ((tree));
@@ -2894,6 +2946,7 @@ extern void gcc_obstack_init PARAMS ((struct obstack *));
extern void init_ttree PARAMS ((void));
extern void build_common_tree_nodes PARAMS ((int));
extern void build_common_tree_nodes_2 PARAMS ((int));
+extern tree build_range_type PARAMS ((tree, tree, tree));
/* In function.c */
extern void setjmp_protect_args PARAMS ((void));
@@ -2920,7 +2973,6 @@ extern int aggregate_value_p PARAMS ((tree));
extern void free_temps_for_rtl_expr PARAMS ((tree));
extern void instantiate_virtual_regs PARAMS ((tree, rtx));
extern void unshare_all_rtl PARAMS ((tree, rtx));
-extern int max_parm_reg_num PARAMS ((void));
extern void push_function_context PARAMS ((void));
extern void pop_function_context PARAMS ((void));
extern void push_function_context_to PARAMS ((tree));
@@ -2982,6 +3034,7 @@ extern void make_decl_rtl PARAMS ((tree, const char *));
extern void make_decl_one_only PARAMS ((tree));
extern int supports_one_only PARAMS ((void));
extern void variable_section PARAMS ((tree, int));
+enum tls_model decl_tls_model PARAMS ((tree));
/* In fold-const.c */
extern int div_and_round_double PARAMS ((enum tree_code, int,
@@ -3004,7 +3057,6 @@ extern void expand_asm_operands PARAMS ((tree, tree, tree, tree, int,
const char *, int));
extern int any_pending_cleanups PARAMS ((int));
extern void init_stmt_for_function PARAMS ((void));
-extern int drop_through_at_end_p PARAMS ((void));
extern void expand_start_target_temps PARAMS ((void));
extern void expand_end_target_temps PARAMS ((void));
extern void expand_elseif PARAMS ((tree));
@@ -3013,10 +3065,7 @@ 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));
-extern void expand_end_case_dummy PARAMS ((void));
-extern tree case_index_expr_type PARAMS ((void));
extern HOST_WIDE_INT all_cases_count PARAMS ((tree, int *));
extern void check_for_full_enumeration_handling PARAMS ((tree));
extern void declare_nonlocal_label PARAMS ((tree));
diff --git a/gcc/treelang/ChangeLog b/gcc/treelang/ChangeLog
index 1d19169bd8e..138a96dd8fa 100644
--- a/gcc/treelang/ChangeLog
+++ b/gcc/treelang/ChangeLog
@@ -1,3 +1,7 @@
+2002-09-09 Tim Josling <tej@melbpc.org.au>
+
+ * treetree.c (objc_is_id): New.
+
2002-08-16 Tim Josling <tej@melbpc.org.au>
Remove variables and functions now defined elsewhere.
diff --git a/gcc/treelang/treelang.texi b/gcc/treelang/treelang.texi
index 8f9ea8f6506..52bcb7ddd23 100644
--- a/gcc/treelang/treelang.texi
+++ b/gcc/treelang/treelang.texi
@@ -451,7 +451,7 @@ later. The list of keywords follows:
@{ - used to start the statements in a function
@} - used to end the statements in a function
( - start list of function arguments, or to change the precedence of operators in an expression
-) - end list or prioritised operators in expression
+) - end list or prioritized operators in expression
, - used to separate parameters in a function prototype or in a function call
; - used to end a statement
+ - addition
@@ -601,7 +601,7 @@ statement: if_statement OR expression_statement OR return_statement
if_statement: if (expression) @{ statements @} else @{ statements @}
The first lot of statements is executed if the expression is
-non-zero. Otherwise the second lot of statements is executed. Either
+nonzero. Otherwise the second lot of statements is executed. Either
list of statements may be empty, but both sets of braces and the else must be present.
@smallexample
diff --git a/gcc/treelang/treetree.c b/gcc/treelang/treetree.c
index 78c96c97717..248d4870b31 100644
--- a/gcc/treelang/treetree.c
+++ b/gcc/treelang/treetree.c
@@ -199,7 +199,7 @@ tree_code_if_start (tree exp, unsigned char* filename, int lineno)
exp,
build1 (CONVERT_EXPR, TREE_TYPE (exp), integer_zero_node));
emit_line_note ((const char *)filename, lineno); /* Output the line number information. */
- expand_start_cond (cond_exp, /* Exit-able if non zero. */ 0);
+ expand_start_cond (cond_exp, /* Exit-able if nonzero. */ 0);
}
/* Output the code for the else of an if statement. The else occurred
@@ -850,6 +850,12 @@ lookup_objc_ivar (tree id ATTRIBUTE_UNUSED)
/* Dummy routines called from c code. Save copying c-decl.c, c-common.c etc. */
+tree
+objc_is_id (tree arg ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
void
check_function_format (int *status ATTRIBUTE_UNUSED,
tree attrs ATTRIBUTE_UNUSED,
diff --git a/gcc/unroll.c b/gcc/unroll.c
index 4096905be62..fa04253e0ed 100644
--- a/gcc/unroll.c
+++ b/gcc/unroll.c
@@ -170,7 +170,7 @@ enum unroll_types
UNROLL_NAIVE
};
-/* Indexed by register number, if non-zero, then it contains a pointer
+/* Indexed by register number, if nonzero, then it contains a pointer
to a struct induction for a DEST_REG giv which has been combined with
one of more address givs. This is needed because whenever such a DEST_REG
giv is modified, we must modify the value of all split address givs
@@ -193,6 +193,9 @@ static int *splittable_regs_updates;
/* Forward declarations. */
+static rtx simplify_cmp_and_jump_insns PARAMS ((enum rtx_code,
+ enum machine_mode,
+ rtx, rtx, rtx));
static void init_reg_map PARAMS ((struct inline_remap *, int));
static rtx calculate_giv_inc PARAMS ((rtx, rtx, unsigned int));
static rtx initial_reg_note_copy PARAMS ((rtx, struct inline_remap *));
@@ -843,7 +846,7 @@ unroll_loop (loop, insn_count, strength_reduce_p)
&initial_value, &final_value, &increment,
&mode))
{
- rtx diff;
+ rtx diff, insn;
rtx *labels;
int abs_inc, neg_inc;
enum rtx_code cc = loop_info->comparison_code;
@@ -875,26 +878,20 @@ unroll_loop (loop, insn_count, strength_reduce_p)
start_sequence ();
+ /* We must copy the final and initial values here to avoid
+ improperly shared rtl. */
+ final_value = copy_rtx (final_value);
+ initial_value = copy_rtx (initial_value);
+
/* Final value may have form of (PLUS val1 const1_rtx). We need
to convert it into general operand, so compute the real value. */
- if (GET_CODE (final_value) == PLUS)
- {
- final_value = expand_simple_binop (mode, PLUS,
- copy_rtx (XEXP (final_value, 0)),
- copy_rtx (XEXP (final_value, 1)),
- NULL_RTX, 0, OPTAB_LIB_WIDEN);
- }
+ final_value = force_operand (final_value, NULL_RTX);
if (!nonmemory_operand (final_value, VOIDmode))
- final_value = force_reg (mode, copy_rtx (final_value));
+ final_value = force_reg (mode, final_value);
/* Calculate the difference between the final and initial values.
Final value may be a (plus (reg x) (const_int 1)) rtx.
- Let the following cse pass simplify this if initial value is
- a constant.
-
- We must copy the final and initial values here to avoid
- improperly shared rtl.
We have to deal with for (i = 0; --i < 6;) type loops.
For such loops the real final value is the first time the
@@ -907,18 +904,18 @@ unroll_loop (loop, insn_count, strength_reduce_p)
so we can pretend that the overflow value is 0/~0. */
if (cc == NE || less_p != neg_inc)
- diff = expand_simple_binop (mode, MINUS, final_value,
- copy_rtx (initial_value), NULL_RTX, 0,
- OPTAB_LIB_WIDEN);
+ diff = simplify_gen_binary (MINUS, mode, final_value,
+ initial_value);
else
- diff = expand_simple_unop (mode, neg_inc ? NOT : NEG,
- copy_rtx (initial_value), NULL_RTX, 0);
+ diff = simplify_gen_unary (neg_inc ? NOT : NEG, mode,
+ initial_value, mode);
+ diff = force_operand (diff, NULL_RTX);
/* Now calculate (diff % (unroll * abs (increment))) by using an
and instruction. */
- diff = expand_simple_binop (GET_MODE (diff), AND, diff,
- GEN_INT (unroll_number * abs_inc - 1),
- NULL_RTX, 0, OPTAB_LIB_WIDEN);
+ diff = simplify_gen_binary (AND, mode, diff,
+ GEN_INT (unroll_number*abs_inc - 1));
+ diff = force_operand (diff, NULL_RTX);
/* Now emit a sequence of branches to jump to the proper precond
loop entry point. */
@@ -936,18 +933,22 @@ unroll_loop (loop, insn_count, strength_reduce_p)
if (cc != NE)
{
rtx incremented_initval;
- incremented_initval = expand_simple_binop (mode, PLUS,
- initial_value,
- increment,
- NULL_RTX, 0,
- OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (incremented_initval, final_value,
- less_p ? GE : LE, NULL_RTX,
- mode, unsigned_p, labels[1]);
- predict_insn_def (get_last_insn (), PRED_LOOP_CONDITION,
- TAKEN);
- JUMP_LABEL (get_last_insn ()) = labels[1];
- LABEL_NUSES (labels[1])++;
+ enum rtx_code cmp_code;
+
+ incremented_initval
+ = simplify_gen_binary (PLUS, mode, initial_value, increment);
+ incremented_initval
+ = force_operand (incremented_initval, NULL_RTX);
+
+ cmp_code = (less_p
+ ? (unsigned_p ? GEU : GE)
+ : (unsigned_p ? LEU : LE));
+
+ insn = simplify_cmp_and_jump_insns (cmp_code, mode,
+ incremented_initval,
+ final_value, labels[1]);
+ if (insn)
+ predict_insn_def (insn, PRED_LOOP_CONDITION, TAKEN);
}
/* Assuming the unroll_number is 4, and the increment is 2, then
@@ -986,12 +987,12 @@ unroll_loop (loop, insn_count, strength_reduce_p)
cmp_code = LE;
}
- emit_cmp_and_jump_insns (diff, GEN_INT (abs_inc * cmp_const),
- cmp_code, NULL_RTX, mode, 0, labels[i]);
- JUMP_LABEL (get_last_insn ()) = labels[i];
- LABEL_NUSES (labels[i])++;
- predict_insn (get_last_insn (), PRED_LOOP_PRECONDITIONING,
- REG_BR_PROB_BASE / (unroll_number - i));
+ insn = simplify_cmp_and_jump_insns (cmp_code, mode, diff,
+ GEN_INT (abs_inc*cmp_const),
+ labels[i]);
+ if (insn)
+ predict_insn (insn, PRED_LOOP_PRECONDITIONING,
+ REG_BR_PROB_BASE / (unroll_number - i));
}
/* If the increment is greater than one, then we need another branch,
@@ -1019,10 +1020,8 @@ unroll_loop (loop, insn_count, strength_reduce_p)
cmp_code = GE;
}
- emit_cmp_and_jump_insns (diff, GEN_INT (cmp_const), cmp_code,
- NULL_RTX, mode, 0, labels[0]);
- JUMP_LABEL (get_last_insn ()) = labels[0];
- LABEL_NUSES (labels[0])++;
+ simplify_cmp_and_jump_insns (cmp_code, mode, diff,
+ GEN_INT (cmp_const), labels[0]);
}
sequence = get_insns ();
@@ -1137,6 +1136,9 @@ unroll_loop (loop, insn_count, strength_reduce_p)
/* And whether the loop has been preconditioned. */
loop_info->preconditioned = loop_preconditioned;
+ /* Remember whether it was preconditioned for the second loop pass. */
+ NOTE_PRECONDITIONED (loop->end) = loop_preconditioned;
+
/* For each biv and giv, determine whether it can be safely split into
a different variable for each unrolled copy of the loop body.
We precalculate and save this info here, since computing it is
@@ -1324,6 +1326,43 @@ unroll_loop (loop, insn_count, strength_reduce_p)
free (map->reg_map);
free (map);
}
+
+/* A helper function for unroll_loop. Emit a compare and branch to
+ satisfy (CMP OP1 OP2), but pass this through the simplifier first.
+ If the branch turned out to be conditional, return it, otherwise
+ return NULL. */
+
+static rtx
+simplify_cmp_and_jump_insns (code, mode, op0, op1, label)
+ enum rtx_code code;
+ enum machine_mode mode;
+ rtx op0, op1, label;
+{
+ rtx t, insn;
+
+ t = simplify_relational_operation (code, mode, op0, op1);
+ if (!t)
+ {
+ enum rtx_code scode = signed_condition (code);
+ emit_cmp_and_jump_insns (op0, op1, scode, NULL_RTX, mode,
+ code != scode, label);
+ insn = get_last_insn ();
+
+ JUMP_LABEL (insn) = label;
+ LABEL_NUSES (label) += 1;
+
+ return insn;
+ }
+ else if (t == const_true_rtx)
+ {
+ insn = emit_jump_insn (gen_jump (label));
+ emit_barrier ();
+ JUMP_LABEL (insn) = label;
+ LABEL_NUSES (label) += 1;
+ }
+
+ return NULL_RTX;
+}
/* Return true if the loop can be safely, and profitably, preconditioned
so that the unrolled copies of the loop body don't need exit tests.
@@ -1997,6 +2036,13 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,
REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
INSN_SCOPE (copy) = INSN_SCOPE (insn);
+ /* If there is a REG_EQUAL note present whose value
+ is not loop invariant, then delete it, since it
+ may cause problems with later optimization passes. */
+ if ((tem = find_reg_note (copy, REG_EQUAL, NULL_RTX))
+ && !loop_invariant_p (loop, XEXP (tem, 0)))
+ remove_note (copy, tem);
+
#ifdef HAVE_cc0
/* If this insn is setting CC0, it may need to look at
the insn that uses CC0 to see what type of insn it is.
@@ -2482,7 +2528,7 @@ find_splittable_regs (loop, unroll_type, unroll_number)
it is unsafe to split the biv since it may not have the proper
value on loop exit. */
- /* loop_number_exit_count is non-zero if the loop has an exit other than
+ /* loop_number_exit_count is nonzero if the loop has an exit other than
a fall through at the end. */
biv_splittable = 1;
@@ -2507,7 +2553,7 @@ find_splittable_regs (loop, unroll_type, unroll_number)
|| GET_CODE (SET_SRC (tem)) != PLUS)
biv_splittable = 0;
- /* If final value is non-zero, then must emit an instruction which sets
+ /* If final value is nonzero, then must emit an instruction which sets
the value of the biv to the proper value. This is done after
handling all of the givs, since some of them may need to use the
biv's value in their initialization code. */
@@ -2567,7 +2613,7 @@ find_splittable_regs (loop, unroll_type, unroll_number)
result += find_splittable_givs (loop, bl, unroll_type, increment,
unroll_number);
- /* If final value is non-zero, then must emit an instruction which sets
+ /* If final value is nonzero, then must emit an instruction which sets
the value of the biv to the proper value. This is done after
handling all of the givs, since some of them may need to use the
biv's value in their initialization code. */
@@ -2696,7 +2742,7 @@ find_splittable_givs (loop, bl, unroll_type, increment, unroll_number)
/* Should emit insns after the loop if possible, as the biv final value
code below does. */
- /* If the final value is non-zero, and the giv has not been reduced,
+ /* If the final value is nonzero, and the giv has not been reduced,
then must emit an instruction to set the final value. */
if (final_value && !v->new_reg)
{
@@ -2786,7 +2832,7 @@ find_splittable_givs (loop, bl, unroll_type, increment, unroll_number)
value = tem;
}
- splittable_regs[REGNO (v->new_reg)] = value;
+ splittable_regs[reg_or_subregno (v->new_reg)] = value;
}
else
continue;
@@ -2820,7 +2866,7 @@ find_splittable_givs (loop, bl, unroll_type, increment, unroll_number)
if (! v->ignore)
count = REG_IV_CLASS (ivs, REGNO (v->src_reg))->biv_count;
- splittable_regs_updates[REGNO (v->new_reg)] = count;
+ splittable_regs_updates[reg_or_subregno (v->new_reg)] = count;
}
result++;
diff --git a/gcc/unwind-libunwind.c b/gcc/unwind-libunwind.c
new file mode 100644
index 00000000000..e73db1c5697
--- /dev/null
+++ b/gcc/unwind-libunwind.c
@@ -0,0 +1,157 @@
+/* Subroutines needed for unwinding stack frames via the libunwind API.
+ Copyright (C) 2002
+ Free Software Foundation, Inc.
+ Contributed by David Mosberger-Tang <davidm@hpl.hp.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. */
+
+/* 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. */
+
+#include "tconfig.h"
+#include "tsystem.h"
+#include "unwind.h"
+
+#ifndef __USING_SJLJ_EXCEPTIONS__
+
+#define UNW_LOCAL_ONLY
+
+#include <libunwind.h>
+
+typedef struct {
+ _Unwind_Personality_Fn personality;
+} _Unwind_FrameState;
+
+struct _Unwind_Context {
+ unw_cursor_t cursor;
+};
+
+
+/* First come the helper-routines that are needed by unwind.inc. */
+
+static _Unwind_Reason_Code
+uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
+{
+ unw_word_t handler;
+
+ if (unw_step (&context->cursor) <= 0)
+ return _URC_END_OF_STACK;
+
+ unw_get_reg (&context->cursor, UNW_REG_HANDLER, &handler);
+ fs->personality = (_Unwind_Personality_Fn) handler;
+
+ return _URC_NO_REASON;
+}
+
+#define uw_update_context(context,fs) do { ; } while (0)
+
+static inline _Unwind_Ptr
+uw_identify_context (struct _Unwind_Context *context)
+{
+ unw_word_t ip;
+ unw_get_reg (&context->cursor, UNW_REG_IP, &ip);
+ return (_Unwind_Ptr) ip;
+}
+
+#define uw_init_context(context) \
+do \
+ { \
+ unw_context_t uc; \
+ unw_getcontext (&uc); \
+ unw_init_local (&(context)->cursor, &uc); \
+ } \
+while (0)
+
+static inline void __attribute__ ((noreturn))
+uw_install_context (struct _Unwind_Context *current __attribute__ ((unused)),
+ struct _Unwind_Context *target)
+{
+ unw_resume (&(target)->cursor);
+ abort ();
+}
+
+
+/* Now come the helper-routines which may be called from an exception
+ handler. The interface for these routines are defined by the C++
+ ABI. See: http://www.codesourcery.com/cxx-abi/abi-eh.html */
+
+_Unwind_Word
+_Unwind_GetGR (struct _Unwind_Context *context, int index)
+{
+ unw_word_t ret;
+
+ /* Note: here we depend on the fact that general registers are
+ expected to start with register number 0! */
+ unw_get_reg (&context->cursor, index, &ret);
+ return ret;
+}
+
+/* Overwrite the saved value for register REG in CONTEXT with VAL. */
+
+void
+_Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
+{
+ /* Note: here we depend on the fact that general registers are
+ expected to start with register number 0! */
+ unw_set_reg (&context->cursor, index, val);
+}
+
+/* Retrieve the return address for CONTEXT. */
+
+inline _Unwind_Ptr
+_Unwind_GetIP (struct _Unwind_Context *context)
+{
+ unw_word_t ret;
+
+ unw_get_reg (&context->cursor, UNW_REG_IP, &ret);
+ return ret;
+}
+
+/* Overwrite the return address for CONTEXT with VAL. */
+
+inline void
+_Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
+{
+ unw_set_reg (&context->cursor, UNW_REG_IP, val);
+}
+
+void *
+_Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
+{
+ unw_word_t ret;
+
+ unw_get_reg (&context->cursor, UNW_REG_LSDA, &ret);
+ return (void *) ret;
+}
+
+_Unwind_Ptr
+_Unwind_GetRegionStart (struct _Unwind_Context *context)
+{
+ unw_word_t ret;
+
+ unw_get_reg (&context->cursor, UNW_REG_PROC_START, &ret);
+ return (_Unwind_Ptr) ret;
+}
+
+#include "unwind.inc"
+
+#endif /* !__USING_SJLJ_EXCEPTIONS__ */
diff --git a/gcc/unwind-sjlj.c b/gcc/unwind-sjlj.c
index fc22911768b..2293075e86e 100644
--- a/gcc/unwind-sjlj.c
+++ b/gcc/unwind-sjlj.c
@@ -251,7 +251,7 @@ uw_init_context (struct _Unwind_Context *context)
}
/* ??? There appear to be bugs in integrate.c wrt __builtin_longjmp and
- virtual-stack-vars. An inline version of this segfaults on Sparc. */
+ virtual-stack-vars. An inline version of this segfaults on SPARC. */
#define uw_install_context(CURRENT, TARGET) \
do \
{ \
diff --git a/gcc/unwind.h b/gcc/unwind.h
index 3002d504174..23369456c67 100644
--- a/gcc/unwind.h
+++ b/gcc/unwind.h
@@ -182,7 +182,7 @@ _Unwind_GetDataRelBase (struct _Unwind_Context *_C)
}
static inline _Unwind_Ptr
-_Unwind_GetTextRelBase (struct _Unwind_Context *_C)
+_Unwind_GetTextRelBase (struct _Unwind_Context *_C __attribute__ ((unused)))
{
abort ();
return 0;
diff --git a/gcc/varasm.c b/gcc/varasm.c
index b3ea8aa1c85..a925b0e5aa5 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -136,13 +136,14 @@ static HOST_WIDE_INT const_alias_set;
static const char *strip_reg_name PARAMS ((const char *));
static int contains_pointers_p PARAMS ((tree));
static void decode_addr_const PARAMS ((tree, struct addr_const *));
-static int const_hash PARAMS ((tree));
+static unsigned int const_hash PARAMS ((tree));
+static unsigned int const_hash_1 PARAMS ((tree));
static int compare_constant PARAMS ((tree, tree));
static tree copy_constant PARAMS ((tree));
static void output_constant_def_contents PARAMS ((tree, int, int));
static void decode_rtx_const PARAMS ((enum machine_mode, rtx,
struct rtx_const *));
-static int const_hash_rtx PARAMS ((enum machine_mode, rtx));
+static unsigned int const_hash_rtx PARAMS ((enum machine_mode, rtx));
static int compare_constant_rtx
PARAMS ((enum machine_mode, rtx, struct constant_descriptor_rtx *));
static struct constant_descriptor_rtx * record_constant_rtx
@@ -194,7 +195,7 @@ static enum in_section { no_section, in_text, in_data, in_named
#endif
} in_section = no_section;
-/* Return a non-zero value if DECL has a section attribute. */
+/* Return a nonzero value if DECL has a section attribute. */
#ifndef IN_NAMED_SECTION
#define IN_NAMED_SECTION(DECL) \
((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
@@ -257,16 +258,6 @@ data_section ()
}
}
-/* Tell assembler to ALWAYS switch to data section, in case
- it's not sure where it is. */
-
-void
-force_data_section ()
-{
- in_section = no_section;
- data_section ();
-}
-
/* Tell assembler to switch to read-only data section. This is normally
the text section. */
@@ -975,26 +966,6 @@ make_var_volatile (var)
MEM_VOLATILE_P (DECL_RTL (var)) = 1;
}
-/* Output alignment directive to align for constant expression EXP. */
-
-void
-assemble_constant_align (exp)
- tree exp;
-{
- int align;
-
- /* Align the location counter as required by EXP's data type. */
- align = TYPE_ALIGN (TREE_TYPE (exp));
-#ifdef CONSTANT_ALIGNMENT
- align = CONSTANT_ALIGNMENT (exp, align);
-#endif
-
- if (align > BITS_PER_UNIT)
- {
- ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
- }
-}
-
/* Output a string of literal assembler code
for an `asm' keyword used between functions. */
@@ -1137,7 +1108,7 @@ default_ctor_section_asm_out_constructor (symbol, priority)
#endif
/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
- a non-zero value if the constant pool should be output before the
+ a nonzero value if the constant pool should be output before the
start of the function, or a zero value if the pool should output
after the end of the function. The default is to put it before the
start. */
@@ -1170,6 +1141,8 @@ assemble_start_function (decl, fnname)
/* Tell assembler to move to target machine's alignment for functions. */
align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
+ if (align < force_align_functions_log)
+ align = force_align_functions_log;
if (align > 0)
{
ASM_OUTPUT_ALIGN (asm_out_file, align);
@@ -1860,7 +1833,7 @@ assemble_trampoline_template ()
ASM_OUTPUT_ALIGN (asm_out_file, align);
}
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
+ (*targetm.asm_out.internal_label) (asm_out_file, "LTRAMP", 0);
TRAMPOLINE_TEMPLATE (asm_out_file);
/* Record the rtl to refer to it. */
@@ -1944,7 +1917,7 @@ default_assemble_integer (x, size, aligned_p)
/* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
the alignment of the integer in bits. Return 1 if we were able to output
- the constant, otherwise 0. If FORCE is non-zero, abort if we can't output
+ the constant, otherwise 0. If FORCE is nonzero, abort if we can't output
the constant. */
bool
@@ -2166,9 +2139,15 @@ struct rtx_const GTY(())
HOST_WIDE_INT low;
} GTY ((tag ("0"))) di;
- /* The max vector size we have is 8 wide. This should be enough. */
- HOST_WIDE_INT veclo[16];
- HOST_WIDE_INT vechi[16];
+ /* The max vector size we have is 8 wide; two variants for
+ integral and floating point vectors. */
+ struct rtx_const_int_vec {
+ HOST_WIDE_INT high;
+ HOST_WIDE_INT low;
+ } GTY ((tag ("2"))) int_vec[8];
+
+ REAL_VALUE_TYPE GTY ((tag ("3"))) fp_vec[8];
+
} GTY ((desc ("%1.kind >= RTX_INT"), descbits ("1"))) un;
};
@@ -2191,7 +2170,6 @@ struct constant_descriptor_tree GTY(())
tree value;
};
-#define HASHBITS 30
#define MAX_HASH_TABLE 1009
static GTY(()) struct constant_descriptor_tree *
const_hash_table[MAX_HASH_TABLE];
@@ -2201,7 +2179,7 @@ static GTY(()) struct constant_descriptor_tree *
they are actually used. This will be if something takes its address or if
there is a usage of the string in the RTL of a function. */
-#define STRHASH(x) ((hashval_t) ((long) (x) >> 3))
+#define STRHASH(x) htab_hash_pointer (x)
struct deferred_string GTY(())
{
@@ -2222,7 +2200,7 @@ const_str_htab_hash (x)
return STRHASH (((const struct deferred_string *) x)->label);
}
-/* Returns non-zero if the value represented by X (which is really a
+/* Returns nonzero if the value represented by X (which is really a
struct deferred_string *) is the same as that given by Y
(which is really a char *). */
@@ -2236,12 +2214,20 @@ const_str_htab_eq (x, y)
/* Compute a hash code for a constant expression. */
-static int
+static unsigned int
const_hash (exp)
tree exp;
{
+ return const_hash_1 (exp) % MAX_HASH_TABLE;
+}
+
+static unsigned int
+const_hash_1 (exp)
+ tree exp;
+{
const char *p;
- int len, hi, i;
+ unsigned int hi;
+ int len, i;
enum tree_code code = TREE_CODE (exp);
/* Either set P and LEN to the address and len of something to hash and
@@ -2255,9 +2241,7 @@ const_hash (exp)
break;
case REAL_CST:
- p = (char *) &TREE_REAL_CST (exp);
- len = sizeof TREE_REAL_CST (exp);
- break;
+ return real_hash (TREE_REAL_CST_PTR (exp));
case STRING_CST:
p = TREE_STRING_POINTER (exp);
@@ -2265,8 +2249,8 @@ const_hash (exp)
break;
case COMPLEX_CST:
- return (const_hash (TREE_REALPART (exp)) * 5
- + const_hash (TREE_IMAGPART (exp)));
+ return (const_hash_1 (TREE_REALPART (exp)) * 5
+ + const_hash_1 (TREE_IMAGPART (exp)));
case CONSTRUCTOR:
if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
@@ -2283,23 +2267,11 @@ const_hash (exp)
{
tree link;
- /* For record type, include the type in the hashing.
- We do not do so for array types
- because (1) the sizes of the elements are sufficient
- and (2) distinct array types can have the same constructor.
- Instead, we include the array size because the constructor could
- be shorter. */
- if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
- hi = ((unsigned long) TREE_TYPE (exp) & ((1 << HASHBITS) - 1))
- % MAX_HASH_TABLE;
- else
- hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
- & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
+ hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
if (TREE_VALUE (link))
- hi
- = (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
+ hi = hi * 603 + const_hash_1 (TREE_VALUE (link));
return hi;
}
@@ -2323,25 +2295,22 @@ const_hash (exp)
hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
else
abort ();
-
- hi &= (1 << HASHBITS) - 1;
- hi %= MAX_HASH_TABLE;
}
return hi;
case PLUS_EXPR:
case MINUS_EXPR:
- return (const_hash (TREE_OPERAND (exp, 0)) * 9
- + const_hash (TREE_OPERAND (exp, 1)));
+ return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
+ + const_hash_1 (TREE_OPERAND (exp, 1)));
case NOP_EXPR:
case CONVERT_EXPR:
case NON_LVALUE_EXPR:
- return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
+ return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
default:
/* A language specific constant. Just hash the code. */
- return (int) code % MAX_HASH_TABLE;
+ return code;
}
/* Compute hashing function */
@@ -2349,8 +2318,6 @@ const_hash (exp)
for (i = 0; i < len; i++)
hi = ((hi * 613) + (unsigned) (p[i]));
- hi &= (1 << HASHBITS) - 1;
- hi %= MAX_HASH_TABLE;
return hi;
}
@@ -2450,7 +2417,7 @@ compare_constant (t1, t2)
l1 && l2;
l1 = TREE_CHAIN (l1), l2 = TREE_CHAIN (l2))
{
- /* Check that each value is the same... */
+ /* Check that each value is the same... */
if (! compare_constant (TREE_VALUE (l1), TREE_VALUE (l2)))
return 0;
/* ... and that they apply to the same fields! */
@@ -2653,7 +2620,7 @@ copy_constant (exp)
Otherwise, output such a constant in memory (or defer it for later)
and generate an rtx for it.
- If DEFER is non-zero, the output of string constants can be deferred
+ If DEFER is nonzero, the output of string constants can be deferred
and output only if referenced in the function after all optimizations.
The TREE_CST_RTL of EXP is set up to point to that rtx.
@@ -2689,7 +2656,7 @@ output_constant_def (exp, defer)
to see if any of them describes EXP. If yes, the descriptor records
the label number already assigned. */
- hash = const_hash (exp) % MAX_HASH_TABLE;
+ hash = const_hash (exp);
for (desc = const_hash_table[hash]; desc; desc = desc->next)
if (compare_constant (exp, desc->value))
@@ -2855,7 +2822,7 @@ output_constant_def_contents (exp, reloc, labelno)
}
/* Output the label itself. */
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", labelno);
+ (*targetm.asm_out.internal_label) (asm_out_file, "LC", labelno);
/* Output the value of EXP. */
output_constant (exp,
@@ -2908,8 +2875,7 @@ struct pool_constant GTY(())
/* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
The argument is XSTR (... , 0) */
-#define SYMHASH(LABEL) \
- ((((unsigned long) (LABEL)) & ((1 << HASHBITS) - 1)) % MAX_RTX_HASH_TABLE)
+#define SYMHASH(LABEL) (((unsigned long) (LABEL)) % MAX_RTX_HASH_TABLE)
/* Initialize constant pool hashing for a new function. */
@@ -2956,8 +2922,29 @@ decode_rtx_const (mode, x, value)
value->kind = RTX_DOUBLE;
if (GET_MODE (x) != VOIDmode)
{
+ const REAL_VALUE_TYPE *r = CONST_DOUBLE_REAL_VALUE (x);
+
value->mode = GET_MODE (x);
- REAL_VALUE_FROM_CONST_DOUBLE (value->un.du, x);
+
+ /* Copy the REAL_VALUE_TYPE by members so that we don't
+ copy garbage from the original structure into our
+ carefully cleaned hashing structure. */
+ value->un.du.class = r->class;
+ value->un.du.sign = r->sign;
+ switch (r->class)
+ {
+ case rvc_zero:
+ case rvc_inf:
+ break;
+ case rvc_normal:
+ value->un.du.exp = r->exp;
+ /* FALLTHRU */
+ case rvc_nan:
+ memcpy (value->un.du.sig, r->sig, sizeof (r->sig));
+ break;
+ default:
+ abort ();
+ }
}
else
{
@@ -2969,28 +2956,59 @@ decode_rtx_const (mode, x, value)
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)
+ if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
{
- elt = CONST_VECTOR_ELT (x, i);
- if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
+ for (i = 0; i < units; ++i)
{
- value->un.veclo[i] = (HOST_WIDE_INT) INTVAL (elt);
- value->un.vechi[i] = 0;
+ rtx elt = CONST_VECTOR_ELT (x, i);
+ if (GET_CODE (elt) == CONST_INT)
+ {
+ value->un.int_vec[i].low = INTVAL (elt);
+ value->un.int_vec[i].high = 0;
+ }
+ else
+ {
+ value->un.int_vec[i].low = CONST_DOUBLE_LOW (elt);
+ value->un.int_vec[i].high = CONST_DOUBLE_HIGH (elt);
+ }
}
- else if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
+ }
+ else if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
+ {
+ for (i = 0; i < units; ++i)
{
- value->un.veclo[i] = (HOST_WIDE_INT) CONST_DOUBLE_LOW (elt);
- value->un.vechi[i] = (HOST_WIDE_INT) CONST_DOUBLE_HIGH (elt);
+ const REAL_VALUE_TYPE *r
+ = CONST_DOUBLE_REAL_VALUE (CONST_VECTOR_ELT (x, i));
+ REAL_VALUE_TYPE *d = &value->un.fp_vec[i];
+
+ /* Copy the REAL_VALUE_TYPE by members so that we don't
+ copy garbage from the original structure into our
+ carefully cleaned hashing structure. */
+ d->class = r->class;
+ d->sign = r->sign;
+ switch (r->class)
+ {
+ case rvc_zero:
+ case rvc_inf:
+ break;
+ case rvc_normal:
+ d->exp = r->exp;
+ /* FALLTHRU */
+ case rvc_nan:
+ memcpy (d->sig, r->sig, sizeof (r->sig));
+ break;
+ default:
+ abort ();
+ }
}
- else
- abort ();
}
+ else
+ abort ();
}
break;
@@ -3045,7 +3063,7 @@ decode_rtx_const (mode, x, value)
}
}
- if (value->kind > RTX_DOUBLE && value->un.addr.base != 0)
+ if (value->kind >= RTX_INT && value->un.addr.base != 0)
switch (GET_CODE (value->un.addr.base))
{
#if 0
@@ -3077,7 +3095,7 @@ 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.kind > RTX_DOUBLE
+ if (val0.kind >= RTX_INT
&& val0.kind == val1.kind
&& val0.un.addr.base == val1.un.addr.base)
return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
@@ -3087,25 +3105,27 @@ simplify_subtraction (x)
/* Compute a hash code for a constant RTL expression. */
-static int
+static unsigned int
const_hash_rtx (mode, x)
enum machine_mode mode;
rtx x;
{
- int hi;
+ union {
+ struct rtx_const value;
+ unsigned int data[sizeof(struct rtx_const) / sizeof (unsigned int)];
+ } u;
+
+ unsigned int hi;
size_t i;
- struct rtx_const value;
- decode_rtx_const (mode, x, &value);
+ decode_rtx_const (mode, x, &u.value);
/* Compute hashing function */
hi = 0;
- for (i = 0; i < sizeof value / sizeof (int); i++)
- hi += ((int *) &value)[i];
+ for (i = 0; i < ARRAY_SIZE (u.data); i++)
+ hi = hi * 613 + u.data[i];
- hi &= (1 << HASHBITS) - 1;
- hi %= MAX_RTX_HASH_TABLE;
- return hi;
+ return hi % MAX_RTX_HASH_TABLE;
}
/* Compare a constant rtl object X with a constant-descriptor DESC.
@@ -3404,7 +3424,7 @@ output_constant_pool (fnname, fndecl)
assemble_align (pool->align);
/* Output the label. */
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
+ (*targetm.asm_out.internal_label) (asm_out_file, "LC", pool->labelno);
/* Output the value of the constant itself. */
switch (GET_MODE_CLASS (pool->mode))
@@ -4487,7 +4507,9 @@ weak_finish ()
for (t = weak_decls; t; t = TREE_CHAIN (t))
{
tree decl = TREE_VALUE (t);
- const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
+ const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+#endif
if (! TREE_USED (decl))
continue;
@@ -4595,7 +4617,7 @@ assemble_alias (decl, target)
VISIBILITY_TYPE. */
void
-assemble_visibility (decl, visibility_type)
+default_assemble_visibility (decl, visibility_type)
tree decl;
const char *visibility_type ATTRIBUTE_UNUSED;
{
@@ -4622,7 +4644,7 @@ maybe_assemble_visibility (decl)
{
const char *type
= TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (visibility)));
- assemble_visibility (decl, type);
+ (* targetm.asm_out.visibility) (decl, type);
}
}
@@ -4678,6 +4700,52 @@ init_varasm_once ()
const_alias_set = new_alias_set ();
}
+enum tls_model
+decl_tls_model (decl)
+ tree decl;
+{
+ enum tls_model kind;
+ tree attr = lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl));
+ bool is_local;
+
+ if (attr)
+ {
+ attr = TREE_VALUE (TREE_VALUE (attr));
+ if (TREE_CODE (attr) != STRING_CST)
+ abort ();
+ if (!strcmp (TREE_STRING_POINTER (attr), "local-exec"))
+ kind = TLS_MODEL_LOCAL_EXEC;
+ else if (!strcmp (TREE_STRING_POINTER (attr), "initial-exec"))
+ kind = TLS_MODEL_INITIAL_EXEC;
+ else if (!strcmp (TREE_STRING_POINTER (attr), "local-dynamic"))
+ kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
+ else if (!strcmp (TREE_STRING_POINTER (attr), "global-dynamic"))
+ kind = TLS_MODEL_GLOBAL_DYNAMIC;
+ else
+ abort ();
+ return kind;
+ }
+
+ is_local = (*targetm.binds_local_p) (decl);
+ if (!flag_pic)
+ {
+ if (is_local)
+ kind = TLS_MODEL_LOCAL_EXEC;
+ else
+ kind = TLS_MODEL_INITIAL_EXEC;
+ }
+ /* Local dynamic is inefficient when we're not combining the
+ parts of the address. */
+ else if (optimize && is_local)
+ kind = TLS_MODEL_LOCAL_DYNAMIC;
+ else
+ kind = TLS_MODEL_GLOBAL_DYNAMIC;
+ if (kind < flag_tls_default)
+ kind = flag_tls_default;
+
+ return kind;
+}
+
/* Select a set of attributes for section NAME based on the properties
of DECL and whether or not RELOC indicates that DECL's initializer
might contain runtime relocations.
@@ -4691,11 +4759,21 @@ default_section_type_flags (decl, name, reloc)
const char *name;
int reloc;
{
+ return default_section_type_flags_1 (decl, name, reloc, flag_pic);
+}
+
+unsigned int
+default_section_type_flags_1 (decl, name, reloc, shlib)
+ tree decl;
+ const char *name;
+ int reloc;
+ int shlib;
+{
unsigned int flags;
if (decl && TREE_CODE (decl) == FUNCTION_DECL)
flags = SECTION_CODE;
- else if (decl && decl_readonly_section (decl, reloc))
+ else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
flags = 0;
else
flags = SECTION_WRITE;
@@ -4888,6 +4966,7 @@ enum section_category
SECCAT_RODATA_MERGE_STR,
SECCAT_RODATA_MERGE_STR_INIT,
SECCAT_RODATA_MERGE_CONST,
+ SECCAT_SRODATA,
SECCAT_DATA,
@@ -4913,12 +4992,14 @@ enum section_category
SECCAT_TBSS
};
-static enum section_category categorize_decl_for_section PARAMS ((tree, int));
+static enum section_category
+categorize_decl_for_section PARAMS ((tree, int, int));
static enum section_category
-categorize_decl_for_section (decl, reloc)
+categorize_decl_for_section (decl, reloc, shlib)
tree decl;
int reloc;
+ int shlib;
{
enum section_category ret;
@@ -4940,16 +5021,16 @@ categorize_decl_for_section (decl, reloc)
|| TREE_SIDE_EFFECTS (decl)
|| ! TREE_CONSTANT (DECL_INITIAL (decl)))
{
- if (flag_pic && (reloc & 2))
+ if (shlib && (reloc & 2))
ret = SECCAT_DATA_REL;
- else if (flag_pic && reloc)
+ else if (shlib && reloc)
ret = SECCAT_DATA_REL_LOCAL;
else
ret = SECCAT_DATA;
}
- else if (flag_pic && (reloc & 2))
+ else if (shlib && (reloc & 2))
ret = SECCAT_DATA_REL_RO;
- else if (flag_pic && reloc)
+ else if (shlib && reloc)
ret = SECCAT_DATA_REL_RO_LOCAL;
else if (flag_merge_constants < 2)
/* C and C++ don't allow different variables to share the same
@@ -4963,7 +5044,7 @@ categorize_decl_for_section (decl, reloc)
}
else if (TREE_CODE (decl) == CONSTRUCTOR)
{
- if ((flag_pic && reloc)
+ if ((shlib && reloc)
|| TREE_SIDE_EFFECTS (decl)
|| ! TREE_CONSTANT (decl))
ret = SECCAT_DATA;
@@ -4987,6 +5068,8 @@ categorize_decl_for_section (decl, reloc)
{
if (ret == SECCAT_BSS)
ret = SECCAT_SBSS;
+ else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
+ ret = SECCAT_SRODATA;
else
ret = SECCAT_SDATA;
}
@@ -4999,12 +5082,22 @@ decl_readonly_section (decl, reloc)
tree decl;
int reloc;
{
- switch (categorize_decl_for_section (decl, reloc))
+ return decl_readonly_section_1 (decl, reloc, flag_pic);
+}
+
+bool
+decl_readonly_section_1 (decl, reloc, shlib)
+ tree decl;
+ int reloc;
+ int shlib;
+{
+ switch (categorize_decl_for_section (decl, reloc, shlib))
{
case SECCAT_RODATA:
case SECCAT_RODATA_MERGE_STR:
case SECCAT_RODATA_MERGE_STR_INIT:
case SECCAT_RODATA_MERGE_CONST:
+ case SECCAT_SRODATA:
return true;
break;
default:
@@ -5021,7 +5114,17 @@ default_elf_select_section (decl, reloc, align)
int reloc;
unsigned HOST_WIDE_INT align;
{
- switch (categorize_decl_for_section (decl, reloc))
+ default_elf_select_section_1 (decl, reloc, align, flag_pic);
+}
+
+void
+default_elf_select_section_1 (decl, reloc, align, shlib)
+ tree decl;
+ int reloc;
+ unsigned HOST_WIDE_INT align;
+ int shlib;
+{
+ switch (categorize_decl_for_section (decl, reloc, shlib))
{
case SECCAT_TEXT:
/* We're not supposed to be called on FUNCTION_DECLs. */
@@ -5038,6 +5141,9 @@ default_elf_select_section (decl, reloc, align)
case SECCAT_RODATA_MERGE_CONST:
mergeable_constant_section (DECL_MODE (decl), align, 0);
break;
+ case SECCAT_SRODATA:
+ named_section (NULL_TREE, ".sdata2", reloc);
+ break;
case SECCAT_DATA:
data_section ();
break;
@@ -5085,12 +5191,21 @@ default_unique_section (decl, reloc)
tree decl;
int reloc;
{
+ default_unique_section_1 (decl, reloc, flag_pic);
+}
+
+void
+default_unique_section_1 (decl, reloc, shlib)
+ tree decl;
+ int reloc;
+ int shlib;
+{
bool one_only = DECL_ONE_ONLY (decl);
const char *prefix, *name;
size_t nlen, plen;
char *string;
- switch (categorize_decl_for_section (decl, reloc))
+ switch (categorize_decl_for_section (decl, reloc, shlib))
{
case SECCAT_TEXT:
prefix = one_only ? ".gnu.linkonce.t." : ".text.";
@@ -5101,6 +5216,9 @@ default_unique_section (decl, reloc)
case SECCAT_RODATA_MERGE_CONST:
prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
break;
+ case SECCAT_SRODATA:
+ prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
+ break;
case SECCAT_DATA:
case SECCAT_DATA_REL:
case SECCAT_DATA_REL_LOCAL:
@@ -5205,6 +5323,14 @@ bool
default_binds_local_p (exp)
tree exp;
{
+ return default_binds_local_p_1 (exp, flag_pic);
+}
+
+bool
+default_binds_local_p_1 (exp, shlib)
+ tree exp;
+ int shlib;
+{
bool local_p;
/* A non-decl is an entry in the constant pool. */
@@ -5224,7 +5350,7 @@ default_binds_local_p (exp)
local_p = false;
/* If PIC, then assume that any global name can be overridden by
symbols resolved from other modules. */
- else if (flag_pic)
+ else if (shlib)
local_p = false;
/* Uninitialized COMMON variable may be unified with symbols
resolved from other modules. */
@@ -5240,6 +5366,15 @@ default_binds_local_p (exp)
return local_p;
}
+/* Determine whether or not a pointer mode is valid. Assume defaults
+ of ptr_mode or Pmode - can be overriden. */
+bool
+default_valid_pointer_mode (mode)
+ enum machine_mode mode;
+{
+ return (mode == ptr_mode || mode == Pmode);
+}
+
/* Default function to output code that will globalize a label. A
target must define GLOBAL_ASM_OP or provide it's own function to
globalize a label. */
@@ -5255,4 +5390,18 @@ default_globalize_label (stream, name)
}
#endif /* GLOBAL_ASM_OP */
+/* This is how to output an internal numbered label where PREFIX is
+ the class of label and LABELNO is the number within the class. */
+
+void
+default_internal_label (stream, prefix, labelno)
+ FILE *stream;
+ const char *prefix;
+ unsigned long labelno;
+{
+ char *const buf = alloca (40 + strlen (prefix));
+ ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
+ ASM_OUTPUT_LABEL (stream, buf);
+}
+
#include "gt-varasm.h"
diff --git a/gcc/version.c b/gcc/version.c
index ee314f52648..a540afefdf2 100644
--- a/gcc/version.c
+++ b/gcc/version.c
@@ -1,4 +1,18 @@
#include "ansidecl.h"
#include "version.h"
-const char *const version_string = "3.3 20020822 (experimental)";
+/* This is the string reported as the version number by all components
+ of the compiler. If you distribute a modified version of GCC,
+ please modify this string to indicate that, e.g. by putting your
+ organization's name in parentheses at the end of the string. */
+
+const char version_string[] = "3.4-bi 20021020 (experimental)";
+
+/* This is the location of the online document giving instructions for
+ reporting bugs. If you distribute a modified version of GCC,
+ please change this to refer to a document giving instructions for
+ reporting bugs to you, not us. (You are of course welcome to
+ forward us bugs reported to you, if you determine that they are
+ not bugs in your modifications.) */
+
+const char bug_report_url[] = "<URL:http://www.gnu.org/software/gcc/bugs.html>";
diff --git a/gcc/version.h b/gcc/version.h
index 99416495a4f..8e944ccdef6 100644
--- a/gcc/version.h
+++ b/gcc/version.h
@@ -1,4 +1,5 @@
#ifndef GCC_VERSION_H
#define GCC_VERSION_H
-extern const char *const version_string;
+extern const char version_string[];
+extern const char bug_report_url[];
#endif /* ! GCC_VERSION_H */
diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c
index 6f322c08858..0d312ae8ebb 100644
--- a/gcc/vmsdbgout.c
+++ b/gcc/vmsdbgout.c
@@ -32,6 +32,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "debug.h"
#include "langhooks.h"
#include "function.h"
+#include "target.h"
/* Difference in seconds between the VMS Epoch and the Unix Epoch */
static const long long vms_epoch_offset = 3506716800ll;
@@ -526,7 +527,7 @@ restart:
/* Output the debug header HEADER. Also output COMMENT if flag_verbose_asm is
set. Return the header size. Just return the size if DOSIZEONLY is
- non-zero. */
+ nonzero. */
static int
write_debug_header (header, comment, dosizeonly)
@@ -558,7 +559,7 @@ write_debug_header (header, comment, dosizeonly)
/* Output the address of SYMBOL. Also output COMMENT if flag_verbose_asm is
set. Return the address size. Just return the size if DOSIZEONLY is
- non-zero. */
+ nonzero. */
static int
write_debug_addr (symbol, comment, dosizeonly)
@@ -579,7 +580,7 @@ write_debug_addr (symbol, comment, dosizeonly)
/* Output the single byte DATA1. Also output COMMENT if flag_verbose_asm is
set. Return the data size. Just return the size if DOSIZEONLY is
- non-zero. */
+ nonzero. */
static int
write_debug_data1 (data1, comment, dosizeonly)
@@ -600,7 +601,7 @@ write_debug_data1 (data1, comment, dosizeonly)
/* Output the single word DATA2. Also output COMMENT if flag_verbose_asm is
set. Return the data size. Just return the size if DOSIZEONLY is
- non-zero. */
+ nonzero. */
static int
write_debug_data2 (data2, comment, dosizeonly)
@@ -620,7 +621,7 @@ write_debug_data2 (data2, comment, dosizeonly)
}
/* Output double word DATA4. Also output COMMENT if flag_verbose_asm is set.
- Return the data size. Just return the size if DOSIZEONLY is non-zero. */
+ Return the data size. Just return the size if DOSIZEONLY is nonzero. */
static int
write_debug_data4 (data4, comment, dosizeonly)
@@ -640,7 +641,7 @@ write_debug_data4 (data4, comment, dosizeonly)
}
/* Output quad word DATA8. Also output COMMENT if flag_verbose_asm is set.
- Return the data size. Just return the size if DOSIZEONLY is non-zero. */
+ Return the data size. Just return the size if DOSIZEONLY is nonzero. */
static int
write_debug_data8 (data8, comment, dosizeonly)
@@ -661,7 +662,7 @@ write_debug_data8 (data8, comment, dosizeonly)
/* Output the difference between LABEL1 and LABEL2. Also output COMMENT if
flag_verbose_asm is set. Return the data size. Just return the size if
- DOSIZEONLY is non-zero. */
+ DOSIZEONLY is nonzero. */
static int
write_debug_delta4 (label1, label2, comment, dosizeonly)
@@ -683,7 +684,7 @@ write_debug_delta4 (label1, label2, comment, dosizeonly)
/* Output a character string STRING. Also write COMMENT if flag_verbose_asm is
set. Return the string length. Just return the length if DOSIZEONLY is
- non-zero. */
+ nonzero. */
static int
write_debug_string (string, comment, dosizeonly)
@@ -703,7 +704,7 @@ write_debug_string (string, comment, dosizeonly)
}
/* Output a module begin header and return the header size. Just return the
- size if DOSIZEONLY is non-zero. */
+ size if DOSIZEONLY is nonzero. */
static int
write_modbeg (dosizeonly)
@@ -767,7 +768,7 @@ write_modbeg (dosizeonly)
}
/* Output a module end trailer and return the trailer size. Just return
- the size if DOSIZEONLY is non-zero. */
+ the size if DOSIZEONLY is nonzero. */
static int
write_modend (dosizeonly)
@@ -787,7 +788,7 @@ write_modend (dosizeonly)
}
/* Output a routine begin header routine RTNNUM and return the header size.
- Just return the size if DOSIZEONLY is non-zero. */
+ Just return the size if DOSIZEONLY is nonzero. */
static int
write_rtnbeg (rtnnum, dosizeonly)
@@ -882,7 +883,7 @@ write_rtnbeg (rtnnum, dosizeonly)
}
/* Output a routine end trailer for routine RTNNUM and return the header size.
- Just return the size if DOSIZEONLY is non-zero. */
+ Just return the size if DOSIZEONLY is nonzero. */
static int
write_rtnend (rtnnum, dosizeonly)
@@ -926,7 +927,7 @@ write_rtnend (rtnnum, dosizeonly)
: (I) < 65536 ? DST_K_INCR_LINUM_W : DST_K_INCR_LINUM_L)
/* Output the PC to line number correlations and return the size. Just return
- the size if DOSIZEONLY is non-zero */
+ the size if DOSIZEONLY is nonzero */
static int
write_pclines (dosizeonly)
@@ -1057,7 +1058,7 @@ write_pclines (dosizeonly)
/* Output a source correlation for file FILEID using information saved in
FILE_INFO_ENTRY and return the size. Just return the size if DOSIZEONLY is
- non-zero. */
+ nonzero. */
static int
write_srccorr (fileid, file_info_entry, dosizeonly)
@@ -1252,7 +1253,7 @@ write_srccorr (fileid, file_info_entry, dosizeonly)
}
/* Output all the source correlation entries and return the size. Just return
- the size if DOSIZEONLY is non-zero. */
+ the size if DOSIZEONLY is nonzero. */
static int
write_srccorrs (dosizeonly)
@@ -1361,7 +1362,7 @@ vmsdbgout_begin_block (line, blocknum)
(*dwarf2_debug_hooks.begin_block) (line, blocknum);
if (debug_info_level > DINFO_LEVEL_TERSE)
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
+ (*targetm.asm_out.internal_label) (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
}
/* Output a marker (i.e. a label) for the end of the generated code for a
@@ -1376,7 +1377,7 @@ vmsdbgout_end_block (line, blocknum)
(*dwarf2_debug_hooks.end_block) (line, blocknum);
if (debug_info_level > DINFO_LEVEL_TERSE)
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
+ (*targetm.asm_out.internal_label) (asm_out_file, BLOCK_END_LABEL, blocknum);
}
/* Not implemented in VMS Debug. */
@@ -1563,7 +1564,7 @@ vmsdbgout_source_line (line, filename)
{
dst_line_info_ref line_info;
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL,
+ (*targetm.asm_out.internal_label) (asm_out_file, LINE_CODE_LABEL,
line_info_table_in_use);
/* Expand the line info table if necessary. */
@@ -1735,7 +1736,7 @@ vmsdbgout_finish (input_filename)
/* Output a terminator label for the .text section. */
text_section ();
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0);
+ (*targetm.asm_out.internal_label) (asm_out_file, TEXT_END_LABEL, 0);
/* Output debugging information.
Warning! Do not change the name of the .vmsdebug section without
diff --git a/gcc/xcoffout.h b/gcc/xcoffout.h
index afa7274dcc2..dd630c93749 100644
--- a/gcc/xcoffout.h
+++ b/gcc/xcoffout.h
@@ -47,30 +47,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define DBX_STATIC_CONST_VAR_CODE N_STSYM
-/* For static variables, output code to define the start of a static block.
-
- ??? The IBM rs6000/AIX assembler has a bug that causes bss block debug
- info to be occasionally lost. A simple example is this:
- int a; static int b;
- The commands `gcc -g -c tmp.c; dump -t tmp.o' gives
-[10] m 0x00000016 1 0 0x8f 0x0000 .bs
-[11] m 0x00000000 1 0 0x90 0x0000 .es
-...
-[21] m 0x00000000 -2 0 0x85 0x0000 b:S-1
- which is wrong. The `b:S-1' must be between the `.bs' and `.es'.
- We can apparently work around the problem by forcing the text section
- (even if we are already in the text section) immediately before outputting
- the `.bs'. This should be fixed in the next major AIX release (3.3?). */
+/* For static variables, output code to define the start of a static block. */
#define DBX_STATIC_BLOCK_START(ASMFILE,CODE) \
{ \
if ((CODE) == N_STSYM) \
fprintf ((ASMFILE), "\t.bs\t%s[RW]\n", xcoff_private_data_section_name);\
else if ((CODE) == N_LCSYM) \
- { \
- fprintf ((ASMFILE), "%s\n", TEXT_SECTION_ASM_OP); \
- fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name); \
- } \
+ fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name); \
}
/* For static variables, output code to define the end of a static block. */
diff --git a/include/ChangeLog b/include/ChangeLog
index 416ad82b101..8fd4b486926 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,12 @@
+2002-10-11 David O'Brien <obrien@FreeBSD.org>
+
+ * getopt.h: getopt is in unistd.h (based on SUSv2).
+
+2002-09-19 Alexandre Oliva <aoliva@redhat.com>
+
+ * libiberty.h (asprintf, vasprintf): Don't declare them if the
+ corresponding HAVE_DECL_ macro is 1.
+
2002-06-25 Alan Modra <amodra@bigpond.net.au>
* demangle.h: #include "ansidecl.h" rather than #include <ansidecl.h>.
diff --git a/include/getopt.h b/include/getopt.h
index 0c6470b3ddb..da09cee3be1 100644
--- a/include/getopt.h
+++ b/include/getopt.h
@@ -108,7 +108,7 @@ struct option
#if !HAVE_DECL_GETOPT
#if defined (__GNU_LIBRARY__) || defined (HAVE_DECL_GETOPT)
/* Many other libraries have conflicting prototypes for getopt, with
- differences in the consts, in stdlib.h. To avoid compilation
+ differences in the consts, in unistd.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
diff --git a/include/libiberty.h b/include/libiberty.h
index 0463301832e..983fd96e5ae 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -264,16 +264,20 @@ extern int pexecute PARAMS ((const char *, char * const *, const char *,
extern int pwait PARAMS ((int, int *, int));
+#if !HAVE_DECL_ASPRINTF
/* 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;
+#endif
+#if !HAVE_DECL_VASPRINTF
/* 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);
+#endif
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
diff --git a/libf2c/ChangeLog b/libf2c/ChangeLog
index 317542deac8..e06717f03bd 100644
--- a/libf2c/ChangeLog
+++ b/libf2c/ChangeLog
@@ -1,3 +1,29 @@
+2002-09-23 Zack Weinberg <zack@codesourcery.com>
+
+ * libF77/Version.c: Rename junk to __LIBF77_VERSION__. Add
+ external decls for __LIBI77_VERSION__ and __LIBU77_VERSION__.
+ Delete __G77_LIBF77_VERSION__
+ (g77__fvers__): Print all three __LIB*77_VERSION__ strings,
+ and __VERSION__ if we have it; nothing else.
+
+ * libI77/Version.c: Provide only __LIBI77_VERSION__ (formerly junk).
+ * libU77/Version.c: Provide only __LIBU77_VERSION__ (formerly junk).
+
+Sun Sep 22 23:43:37 2002 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.in (all): Fix multilib parallel build.
+
+2002-09-14 Tim Prince <tprince@computer.org>
+
+ PR libf2c/7384
+ * libU77/datetime_.c: Use GetLocalTime on MS-Windows.
+
+2002-08-31 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ PR fortran/6367
+ * libI77/rsne.c (x_rsne): Use local variable no2 to count further
+ list elements to read.
+
2002-07-10 Toon Moene <toon@moene.indiv.nluug.nl>
* libI77/open.c (f_open): Do not indicate unformatted file
@@ -184,7 +210,7 @@ Mon May 20 13:03:54 2002 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
2002-05-02 Alexandre Oliva <aoliva@redhat.com>
- * Makefile.in: Fix for multilibbed natives.
+ * Makefile.in: Fix for multilibbed natives.
2002-04-15 Loren J. Rittle <ljrittle@acm.org>
@@ -338,7 +364,7 @@ Mon May 20 13:03:54 2002 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
of shared libf2c to 0:0:0.
2001-09-29 Juergen Pfeifer <juergen.pfeifer@gmx.net>
- Toon Moene <toon@moene.indiv.nluug.nl>
+ Toon Moene <toon@moene.indiv.nluug.nl>
Make libf2c a shared library.
@@ -412,7 +438,7 @@ Wed Jul 18 11:14:33 2001 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* libI77/Makefile.in: Add necessary dependencies on config.h.
2001-07-06 Toon Moene <toon@moene.indiv.nluug.nl>
- Pedro Vazquez <vazquez@penelope.iqm.unicamp.br>
+ Pedro Vazquez <vazquez@penelope.iqm.unicamp.br>
* libI77/configure.in: Check for fseeko, ftello.
* libI77/configure: Rebuilt.
@@ -439,7 +465,7 @@ Wed Jul 18 11:14:33 2001 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* libI77/fio.h: Include <sys/types.h> for off_t.
2001-07-01 Toon Moene <toon@moene.indiv.nluug.nl>
- Pedro Vazquez <vazquez@penelope.iqm.unicamp.br>
+ Pedro Vazquez <vazquez@penelope.iqm.unicamp.br>
* libI77/fio.h: Use off_t when appropriate.
* libI77/backspace.c (f_back): Ditto.
@@ -597,7 +623,7 @@ Wed Jul 18 11:14:33 2001 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
file atomically.
2000-07-03 Donn Terry (donnte@microsoft.com)
- * libU77/aclocal.m4: check for 2 argument gettimeofday without
+ * libU77/aclocal.m4: check for 2 argument gettimeofday without
struct timezone
2000-07-02 Toon Moene <toon@moene.indiv.nluug.nl>
diff --git a/libf2c/Makefile.in b/libf2c/Makefile.in
index c6fa9ad52ce..5806a0b9594 100644
--- a/libf2c/Makefile.in
+++ b/libf2c/Makefile.in
@@ -124,7 +124,7 @@ F2CEXT = abort derf derfc ef1asc ef1cmc erf erfc exit getarg getenv iargc \
# the dependency) and then (perhaps) builds multilibs.
all: all-unilib
- $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO="all-unilib"
+ : $(MAKE) ; exec $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO="all-unilib"
# `all-unilib' is the overall target in the absence of multilibs,
# meant to be invoked via multi-do for multilibs.
diff --git a/libf2c/libF77/Version.c b/libf2c/libF77/Version.c
index 270ed584b1b..a27b0df7696 100644
--- a/libf2c/libF77/Version.c
+++ b/libf2c/libF77/Version.c
@@ -1,9 +1,6 @@
-static char junk[] = "\n@(#)LIBF77 VERSION 20000929\n";
-
-/*
-*/
-
-char __G77_LIBF77_VERSION__[] = "3.3 20020822 (experimental)";
+const char __LIBF77_VERSION__[] = "@(#) LIBF77 VERSION 20000929\n";
+extern const char __LIBI77_VERSION__[];
+extern const char __LIBU77_VERSION__[];
/*
2.00 11 June 1980. File version.c added to library.
@@ -87,6 +84,11 @@ char __G77_LIBF77_VERSION__[] = "3.3 20020822 (experimental)";
void
g77__fvers__ ()
{
- fprintf (stderr, "__G77_LIBF77_VERSION__: %s", __G77_LIBF77_VERSION__);
- fputs (junk, stderr);
+ fputs ("GNU Fortran library.\n", stderr);
+#if defined __GNUC__ && defined __VERSION__
+ fprintf (stderr, "Compiled by GCC %s\n", __VERSION__);
+#endif
+ fputs (__LIBF77_VERSION__, stderr);
+ fputs (__LIBI77_VERSION__, stderr);
+ fputs (__LIBU77_VERSION__, stderr);
}
diff --git a/libf2c/libI77/Version.c b/libf2c/libI77/Version.c
index dde8b5e6f7e..f6b3d5d8a5e 100644
--- a/libf2c/libI77/Version.c
+++ b/libf2c/libI77/Version.c
@@ -1,9 +1,4 @@
-static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 20001205\n";
-
-/*
-*/
-
-char __G77_LIBI77_VERSION__[] = "3.3 20020822 (experimental)";
+const char __LIBI77_VERSION__[] = "@(#) LIBI77 VERSION pjw,dmg-mods 20001205\n";
/*
2.01 $ format added
@@ -324,17 +319,6 @@ wrtfmt.c:
/* treat Tstuff= and Fstuff= as new assignments rather than as */
/* logical constants. */
-
-
/* Changes for GNU Fortran (g77) version of libf2c: */
/* 17 June 1997: detect recursive I/O and call f__fatal explaining it. */
-
-#include <stdio.h>
-
-void
-g77__ivers__ ()
-{
- fprintf (stderr, "__G77_LIBI77_VERSION__: %s", __G77_LIBI77_VERSION__);
- fputs (junk, stderr);
-}
diff --git a/libf2c/libI77/rsne.c b/libf2c/libI77/rsne.c
index f0490dbaf8a..f233a4ad9f8 100644
--- a/libf2c/libI77/rsne.c
+++ b/libf2c/libI77/rsne.c
@@ -515,12 +515,12 @@ have_amp:
iva += dn0->delta;
if (f__lcount > 0)
{
- no1 = (ivae - iva) / size;
- if (no1 > f__lcount)
- no1 = f__lcount;
- if ((k = l_read (&no1, vaddr + iva, size, type)))
+ ftnint no2 = (ivae - iva) / size;
+ if (no2 > f__lcount)
+ no2 = f__lcount;
+ if ((k = l_read (&no2, vaddr + iva, size, type)))
return k;
- iva += no1 * dn0->delta;
+ iva += no2 * dn0->delta;
}
}
mustend:
diff --git a/libf2c/libU77/Version.c b/libf2c/libU77/Version.c
index fc37fc28679..45b68a6b141 100644
--- a/libf2c/libU77/Version.c
+++ b/libf2c/libU77/Version.c
@@ -1,12 +1 @@
-static char junk[] = "\n@(#) LIBU77 VERSION 19980709\n";
-
-char __G77_LIBU77_VERSION__[] = "3.3 20020822 (experimental)";
-
-#include <stdio.h>
-
-void
-g77__uvers__ ()
-{
- fprintf (stderr, "__G77_LIBU77_VERSION__: %s", __G77_LIBU77_VERSION__);
- fputs (junk, stderr);
-}
+const char __LIBU77_VERSION__[] = "@(#) LIBU77 VERSION 19980709\n";
diff --git a/libf2c/libU77/datetime_.c b/libf2c/libU77/datetime_.c
index 40786ed8e6d..cd7c7ca0a3b 100644
--- a/libf2c/libU77/datetime_.c
+++ b/libf2c/libU77/datetime_.c
@@ -31,6 +31,11 @@ Boston, MA 02111-1307, USA. */
# include <time.h>
# endif
#endif
+#if defined (_WIN32)
+#include <windows.h>
+#undef min
+#undef max
+#endif
#include "f2c.h"
void s_copy (register char *a, register char *b, ftnlen la, ftnlen lb);
@@ -44,6 +49,14 @@ G77_date_and_time_0 (char *date, char *fftime, char *zone,
struct tm ltime = *localtime (&lt), gtime = *gmtime (&lt);
char dat[9], zon[6], ftim[11];
int i, vals[8];
+#if defined (_WIN32)
+ struct _SYSTEMTIME wdattim;
+ GetLocalTime(&wdattim);
+ vals[7] = wdattim.wMilliseconds;
+#else
+ vals[7] = 0; /* no STDC/POSIX way to get this */
+ /* GNUish way; maybe use `ftime' on other systems. */
+#endif
vals[0] = 1900 + ltime.tm_year;
vals[1] = 1 + ltime.tm_mon;
@@ -55,8 +68,6 @@ G77_date_and_time_0 (char *date, char *fftime, char *zone,
vals[4] = ltime.tm_hour;
vals[5] = ltime.tm_min;
vals[6] = ltime.tm_sec;
- vals[7] = 0; /* no STDC/POSIX way to get this */
- /* GNUish way; maybe use `ftime' on other systems. */
#if HAVE_GETTIMEOFDAY
{
struct timeval tp;
diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index b6ed2cee779..adfa3885e7d 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -1,3 +1,59 @@
+2002-10-08 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret
+ raw data as _Jv_word values, not ffi_raw.
+ (ffi_java_ptrarray_to_raw): Likewise.
+ (ffi_java_rvalue_to_raw): New function.
+ (ffi_java_raw_call): Call it.
+ (ffi_java_raw_to_rvalue): New function.
+ (ffi_java_translate_args): Call it.
+ * src/ffitest.c (closure_test_fn): Interpret return value
+ as ffi_arg, not int.
+ * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing
+ FFI_TYPE_POINTER case.
+ (ffi_closure_helper_SYSV): Likewise. Also, assume return
+ values extended to word size.
+
+2002-10-02 Andreas Jaeger <aj@suse.de>
+
+ * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output.
+
+2002-10-01 Bo Thorsen <bo@smetana.suse.de>
+
+ * include/ffi.h.in: Fix i386 win32 compilation.
+
+2002-09-30 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * configure.in: Add s390x-*-linux-* target.
+ * configure: Regenerate.
+ * include/ffi.h.in: Define S390X for s390x targets.
+ (FFI_CLOSURES): Define for s390/s390x.
+ (FFI_TRAMPOLINE_SIZE): Likewise.
+ (FFI_NATIVE_RAW_API): Likewise.
+ * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390.
+ * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x.
+ * src/s390/ffi.c: Major rework of existing code. Add support for
+ s390x targets. Add closure support.
+ * src/s390/sysv.S: Likewise.
+
+2002-09-29 Richard Earnshaw <rearnsha@arm.com>
+
+ * src/arm/sysv.S: Fix typo.
+
+2002-09-28 Richard Earnshaw <rearnsha@arm.com>
+
+ * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor
+ has defined __USER_LABEL_PREFIX__, then use it in CNAME.
+ (ffi_call_SYSV): Handle soft-float.
+
+2002-09-27 Bo Thorsen <bo@suse.de>
+
+ * include/ffi.h.in: Fix multilib x86-64 support.
+
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.am (all-multi): Fix multilib parallel build.
+
2002-07-19 Kaz Kojima <kkojima@gcc.gnu.org>
* configure.in (sh[34]*-*-linux*): Add brackets.
diff --git a/libffi/Makefile.am b/libffi/Makefile.am
index cafeab71e3a..9ee70acc02f 100644
--- a/libffi/Makefile.am
+++ b/libffi/Makefile.am
@@ -218,7 +218,7 @@ distclean-recursive: distclean-multi
maintainer-clean-recursive: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/libffi/Makefile.in b/libffi/Makefile.in
index 47d1353b2c2..37adbf795a4 100644
--- a/libffi/Makefile.in
+++ b/libffi/Makefile.in
@@ -773,7 +773,7 @@ distclean-recursive: distclean-multi
maintainer-clean-recursive: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/libffi/configure b/libffi/configure
index a968f1a26e4..37ea9b48dd0 100755
--- a/libffi/configure
+++ b/libffi/configure
@@ -2431,6 +2431,7 @@ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
+s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
esac
@@ -2589,7 +2590,7 @@ if test x$TARGET = xMIPS_LINUX; then
fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:2593: checking how to run the C preprocessor" >&5
+echo "configure:2594: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -2604,13 +2605,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 2608 "configure"
+#line 2609 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2614: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2615: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2621,13 +2622,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 2625 "configure"
+#line 2626 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2631: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2632: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2638,13 +2639,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 2642 "configure"
+#line 2643 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2648: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2649: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2669,12 +2670,12 @@ fi
echo "$ac_t""$CPP" 1>&6
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:2673: checking for ANSI C header files" >&5
+echo "configure:2674: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2678 "configure"
+#line 2679 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -2682,7 +2683,7 @@ else
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2687: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2699,7 +2700,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 2703 "configure"
+#line 2704 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@@ -2717,7 +2718,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 2721 "configure"
+#line 2722 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@@ -2738,7 +2739,7 @@ if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
-#line 2742 "configure"
+#line 2743 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -2749,7 +2750,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
-if { (eval echo configure:2753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
@@ -2775,12 +2776,12 @@ fi
for ac_func in memcpy
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2779: checking for $ac_func" >&5
+echo "configure:2780: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2784 "configure"
+#line 2785 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2803,7 +2804,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2807: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2830,19 +2831,19 @@ done
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:2834: checking for working alloca.h" >&5
+echo "configure:2835: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2839 "configure"
+#line 2840 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:2846: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2847: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
@@ -2863,12 +2864,12 @@ EOF
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:2867: checking for alloca" >&5
+echo "configure:2868: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2872 "configure"
+#line 2873 "configure"
#include "confdefs.h"
#ifdef __GNUC__
@@ -2896,7 +2897,7 @@ int main() {
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:2900: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2901: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
@@ -2928,12 +2929,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:2932: checking whether alloca needs Cray hooks" >&5
+echo "configure:2933: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2937 "configure"
+#line 2938 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -2958,12 +2959,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2962: checking for $ac_func" >&5
+echo "configure:2963: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2967 "configure"
+#line 2968 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2986,7 +2987,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2991: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3013,7 +3014,7 @@ done
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:3017: checking stack direction for C alloca" >&5
+echo "configure:3018: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3021,7 +3022,7 @@ else
ac_cv_c_stack_direction=0
else
cat > conftest.$ac_ext <<EOF
-#line 3025 "configure"
+#line 3026 "configure"
#include "confdefs.h"
find_stack_direction ()
{
@@ -3040,7 +3041,7 @@ main ()
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:3044: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_stack_direction=1
else
@@ -3063,13 +3064,13 @@ fi
echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:3067: checking size of short" >&5
+echo "configure:3068: checking size of short" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3073 "configure"
+#line 3074 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3079,7 +3080,7 @@ int main() {
switch (0) case 0: case (sizeof (short) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3083: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3084: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_short=$ac_size
else
@@ -3102,13 +3103,13 @@ EOF
echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:3106: checking size of int" >&5
+echo "configure:3107: checking size of int" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3112 "configure"
+#line 3113 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3118,7 +3119,7 @@ int main() {
switch (0) case 0: case (sizeof (int) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3122: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3123: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_int=$ac_size
else
@@ -3141,13 +3142,13 @@ EOF
echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:3145: checking size of long" >&5
+echo "configure:3146: checking size of long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3151 "configure"
+#line 3152 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3157,7 +3158,7 @@ int main() {
switch (0) case 0: case (sizeof (long) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3161: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3162: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long=$ac_size
else
@@ -3180,13 +3181,13 @@ EOF
echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:3184: checking size of long long" >&5
+echo "configure:3185: checking size of long long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3190 "configure"
+#line 3191 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3196,7 +3197,7 @@ int main() {
switch (0) case 0: case (sizeof (long long) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3200: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3201: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long_long=$ac_size
else
@@ -3219,13 +3220,13 @@ EOF
echo $ac_n "checking size of float""... $ac_c" 1>&6
-echo "configure:3223: checking size of float" >&5
+echo "configure:3224: checking size of float" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3229 "configure"
+#line 3230 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3235,7 +3236,7 @@ int main() {
switch (0) case 0: case (sizeof (float) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3239: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3240: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_float=$ac_size
else
@@ -3258,13 +3259,13 @@ EOF
echo $ac_n "checking size of double""... $ac_c" 1>&6
-echo "configure:3262: checking size of double" >&5
+echo "configure:3263: checking size of double" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3268 "configure"
+#line 3269 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3274,7 +3275,7 @@ int main() {
switch (0) case 0: case (sizeof (double) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3279: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_double=$ac_size
else
@@ -3297,13 +3298,13 @@ EOF
echo $ac_n "checking size of long double""... $ac_c" 1>&6
-echo "configure:3301: checking size of long double" >&5
+echo "configure:3302: checking size of long double" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3307 "configure"
+#line 3308 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3313,7 +3314,7 @@ int main() {
switch (0) case 0: case (sizeof (long double) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3318: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_long_double=$ac_size
else
@@ -3337,13 +3338,13 @@ EOF
echo $ac_n "checking size of void *""... $ac_c" 1>&6
-echo "configure:3341: checking size of void *" >&5
+echo "configure:3342: checking size of void *" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 3347 "configure"
+#line 3348 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -3353,7 +3354,7 @@ int main() {
switch (0) case 0: case (sizeof (void *) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:3357: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3358: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_void_p=$ac_size
else
@@ -3376,14 +3377,14 @@ EOF
echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:3380: checking whether byte ordering is bigendian" >&5
+echo "configure:3381: checking whether byte ordering is bigendian" >&5
if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_c_bigendian=unknown
# See if sys/param.h defines the BYTE_ORDER macro.
cat > conftest.$ac_ext <<EOF
-#line 3387 "configure"
+#line 3388 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
@@ -3394,11 +3395,11 @@ int main() {
#endif
; return 0; }
EOF
-if { (eval echo configure:3398: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3399: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
# It does; now see whether it defined to BIG_ENDIAN or not.
cat > conftest.$ac_ext <<EOF
-#line 3402 "configure"
+#line 3403 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
@@ -3409,7 +3410,7 @@ int main() {
#endif
; return 0; }
EOF
-if { (eval echo configure:3413: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3414: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_bigendian=yes
else
@@ -3429,7 +3430,7 @@ if test "$cross_compiling" = yes; then
echo $ac_n "cross-compiling... " 2>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3433 "configure"
+#line 3434 "configure"
#include "confdefs.h"
main () {
/* Are we little or big endian? From Harbison&Steele. */
@@ -3442,7 +3443,7 @@ main () {
exit (u.c[sizeof (long) - 1] == 1);
}
EOF
-if { (eval echo configure:3446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_bigendian=no
else
@@ -3460,7 +3461,7 @@ fi
echo "$ac_t""$ac_cv_c_bigendian" 1>&6
if test $ac_cv_c_bigendian = unknown; then
echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6
-echo "configure:3464: checking to probe for byte ordering" >&5
+echo "configure:3465: checking to probe for byte ordering" >&5
cat >conftest.c <<EOF
short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
@@ -3510,7 +3511,7 @@ fi
if test x$TARGET = xSPARC; then
echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
-echo "configure:3514: checking assembler and linker support unaligned pc related relocs" >&5
+echo "configure:3515: checking assembler and linker support unaligned pc related relocs" >&5
if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3520,14 +3521,14 @@ else
CFLAGS="$CFLAGS -fpic"
LDFLAGS="$LDFLAGS -shared"
cat > conftest.$ac_ext <<EOF
-#line 3524 "configure"
+#line 3525 "configure"
#include "confdefs.h"
asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
int main() {
; return 0; }
EOF
-if { (eval echo configure:3531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3532: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
libffi_cv_as_sparc_ua_pcrel=yes
else
diff --git a/libffi/configure.in b/libffi/configure.in
index d5c00f9a46f..9062dca9e7e 100644
--- a/libffi/configure.in
+++ b/libffi/configure.in
@@ -70,6 +70,7 @@ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
+s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
esac
diff --git a/libffi/include/ffi.h.in b/libffi/include/ffi.h.in
index 8fc37f56f4e..4f7667e6d4d 100644
--- a/libffi/include/ffi.h.in
+++ b/libffi/include/ffi.h.in
@@ -164,6 +164,12 @@ extern "C" {
#endif
#endif
+#ifdef S390
+#if defined (__s390x__)
+#define S390X
+#endif
+#endif
+
#ifndef LIBFFI_ASM
/* ---- Generic type definitions ----------------------------------------- */
@@ -189,23 +195,23 @@ typedef enum ffi_abi {
#endif
#endif
+ /* ---- Intel x86 Win32 ---------- */
+#ifdef X86_WIN32
+ FFI_SYSV,
+ FFI_DEFAULT_ABI = FFI_SYSV,
+#endif
+
/* ---- Intel x86 and AMD x86-64 - */
-#if defined(X86) || defined(X86_64)
+#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
FFI_SYSV,
FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */
-#ifdef X86
+#ifdef __i386__
FFI_DEFAULT_ABI = FFI_SYSV,
#else
FFI_DEFAULT_ABI = FFI_UNIX64,
#endif
#endif
- /* ---- Intel x86 Win32 ---------- */
-#ifdef X86_WIN32
- FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
-#endif
-
/* ---- Intel ia64 ---------------- */
#ifdef IA64
FFI_UNIX, /* Linux and all Unix variants use the same conventions */
@@ -390,13 +396,7 @@ size_t ffi_java_raw_size (ffi_cif *cif);
/* ---- Definitions for closures ----------------------------------------- */
-#ifdef X86
-
-#define FFI_CLOSURES 1 /* x86 supports closures */
-#define FFI_TRAMPOLINE_SIZE 10
-#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */
-
-#elif defined(X86_WIN32)
+#ifdef __i386__
#define FFI_CLOSURES 1 /* x86 supports closures */
#define FFI_TRAMPOLINE_SIZE 10
@@ -441,6 +441,16 @@ struct ffi_ia64_trampoline_struct {
#define FFI_TRAMPOLINE_SIZE 24 /* see struct below */
#define FFI_NATIVE_RAW_API 0
+#elif defined(S390)
+
+#define FFI_CLOSURES 1
+#ifdef S390X
+#define FFI_TRAMPOLINE_SIZE 32
+#else
+#define FFI_TRAMPOLINE_SIZE 16
+#endif
+#define FFI_NATIVE_RAW_API 0
+
#elif defined(SH)
#define FFI_CLOSURES 1
diff --git a/libffi/src/arm/sysv.S b/libffi/src/arm/sysv.S
index 84744d77562..c600c83d9f5 100644
--- a/libffi/src/arm/sysv.S
+++ b/libffi/src/arm/sysv.S
@@ -28,8 +28,15 @@
#ifdef HAVE_MACHINE_ASM_H
#include <machine/asm.h>
#else
-/* XXX these lose for some platforms, I'm sure. */
+#ifdef __USER_LABEL_PREFIX__
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+#else
#define CNAME(x) x
+#endif
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
#endif
@@ -96,12 +103,20 @@ ENTRY(ffi_call_SYSV)
# return FLOAT
cmp a4, #FFI_TYPE_FLOAT
+#ifdef __SOFTFP__
+ streq a1, [a3]
+#else
stfeqs f0, [a3]
+#endif
beq epilogue
# return DOUBLE or LONGDOUBLE
cmp a4, #FFI_TYPE_DOUBLE
+#ifdef __SOFTFP__
+ stmeqia a3, {a1, a2}
+#else
stfeqd f0, [a3]
+#endif
epilogue:
ldmfd sp!, {a1-a4, fp, pc}
diff --git a/libffi/src/ffitest.c b/libffi/src/ffitest.c
index 8d72df1cc03..163c4a8c36e 100644
--- a/libffi/src/ffitest.c
+++ b/libffi/src/ffitest.c
@@ -262,7 +262,7 @@ static test_structure_9 struct9 (test_structure_9 ts)
static void
closure_test_fn(ffi_cif* cif,void* resp,void** args, void* userdata)
{
- *(int*)resp = *(int*)args[0] + (int)(*(float*)args[1]) + (int)(long)userdata;
+ *(ffi_arg*)resp = *(int*)args[0] + (int)(*(float*)args[1]) + (int)(long)userdata;
}
typedef int (*closure_test_type)(int, float);
diff --git a/libffi/src/java_raw_api.c b/libffi/src/java_raw_api.c
index 55c3d132d53..cb5dd67a78e 100644
--- a/libffi/src/java_raw_api.c
+++ b/libffi/src/java_raw_api.c
@@ -81,21 +81,14 @@ ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args)
{
case FFI_TYPE_UINT8:
case FFI_TYPE_SINT8:
- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1);
+ *args = (void*) ((char*)(raw++) + 3);
break;
case FFI_TYPE_UINT16:
case FFI_TYPE_SINT16:
- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2);
+ *args = (void*) ((char*)(raw++) + 2);
break;
-#if SIZEOF_ARG >= 4
- case FFI_TYPE_UINT32:
- case FFI_TYPE_SINT32:
- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4);
- break;
-#endif
-
#if SIZEOF_ARG == 8
case FFI_TYPE_UINT64:
case FFI_TYPE_SINT64:
@@ -157,31 +150,54 @@ ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw)
switch ((*tp)->type)
{
case FFI_TYPE_UINT8:
+#if WORDS_BIGENDIAN
+ *(UINT32*)(raw++) = *(UINT8*) (*args);
+#else
(raw++)->uint = *(UINT8*) (*args);
+#endif
break;
case FFI_TYPE_SINT8:
+#if WORDS_BIGENDIAN
+ *(SINT32*)(raw++) = *(SINT8*) (*args);
+#else
(raw++)->sint = *(SINT8*) (*args);
+#endif
break;
case FFI_TYPE_UINT16:
+#if WORDS_BIGENDIAN
+ *(UINT32*)(raw++) = *(UINT16*) (*args);
+#else
(raw++)->uint = *(UINT16*) (*args);
+#endif
break;
case FFI_TYPE_SINT16:
+#if WORDS_BIGENDIAN
+ *(SINT32*)(raw++) = *(SINT16*) (*args);
+#else
(raw++)->sint = *(SINT16*) (*args);
+#endif
break;
-#if SIZEOF_ARG >= 4
case FFI_TYPE_UINT32:
+#if WORDS_BIGENDIAN
+ *(UINT32*)(raw++) = *(UINT32*) (*args);
+#else
(raw++)->uint = *(UINT32*) (*args);
+#endif
break;
case FFI_TYPE_SINT32:
+#if WORDS_BIGENDIAN
+ *(SINT32*)(raw++) = *(SINT32*) (*args);
+#else
(raw++)->sint = *(SINT32*) (*args);
- break;
#endif
- case FFI_TYPE_FLOAT:
+ break;
+
+ case FFI_TYPE_FLOAT:
(raw++)->flt = *(FLOAT32*) (*args);
break;
@@ -211,6 +227,55 @@ ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw)
#if !FFI_NATIVE_RAW_API
+static void
+ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
+{
+#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
+ switch (cif->rtype->type)
+ {
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_UINT32:
+ *(UINT64 *)rvalue <<= 32;
+ break;
+
+ case FFI_TYPE_SINT8:
+ case FFI_TYPE_SINT16:
+ case FFI_TYPE_SINT32:
+ case FFI_TYPE_INT:
+ *(SINT64 *)rvalue <<= 32;
+ break;
+
+ default:
+ break;
+ }
+#endif
+}
+
+static void
+ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
+{
+#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
+ switch (cif->rtype->type)
+ {
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_UINT32:
+ *(UINT64 *)rvalue >>= 32;
+ break;
+
+ case FFI_TYPE_SINT8:
+ case FFI_TYPE_SINT16:
+ case FFI_TYPE_SINT32:
+ case FFI_TYPE_INT:
+ *(SINT64 *)rvalue >>= 32;
+ break;
+
+ default:
+ break;
+ }
+#endif
+}
/* This is a generic definition of ffi_raw_call, to be used if the
* native system does not provide a machine-specific implementation.
@@ -227,6 +292,7 @@ void ffi_java_raw_call (/*@dependent@*/ ffi_cif *cif,
void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
ffi_java_raw_to_ptrarray (cif, raw, avalue);
ffi_call (cif, fn, rvalue, avalue);
+ ffi_java_rvalue_to_raw (cif, rvalue);
}
#if FFI_CLOSURES /* base system provides closures */
@@ -240,6 +306,7 @@ ffi_java_translate_args (ffi_cif *cif, void *rvalue,
ffi_java_ptrarray_to_raw (cif, avalue, raw);
(*cl->fun) (cif, rvalue, raw, cl->user_data);
+ ffi_java_raw_to_rvalue (cif, rvalue);
}
/* Again, here is the generic version of ffi_prep_raw_closure, which
diff --git a/libffi/src/prep_cif.c b/libffi/src/prep_cif.c
index 985136490ce..d3c89c365e9 100644
--- a/libffi/src/prep_cif.c
+++ b/libffi/src/prep_cif.c
@@ -103,9 +103,8 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
/* Perform a sanity check on the return type */
FFI_ASSERT(ffi_type_test(cif->rtype));
- /* x86-64 and s390 stack space allocation is handled in prep_machdep.
- TODO: Disable this for s390 too? */
-#if !defined M68K && !defined __x86_64__
+ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */
+#if !defined M68K && !defined __x86_64__ && !defined S390
/* Make space for the return structure pointer */
if (cif->rtype->type == FFI_TYPE_STRUCT
#ifdef SPARC
@@ -124,8 +123,7 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
return FFI_BAD_TYPEDEF;
- /* TODO: Disable this calculation for s390 too? */
-#ifndef __x86_64__
+#if !defined __x86_64__ && !defined S390
#ifdef SPARC
if (((*ptr)->type == FFI_TYPE_STRUCT
&& ((*ptr)->size > 16 || cif->abi != FFI_V9))
diff --git a/libffi/src/s390/ffi.c b/libffi/src/s390/ffi.c
index 8b514e36c26..9e7d16954f6 100644
--- a/libffi/src/s390/ffi.c
+++ b/libffi/src/s390/ffi.c
@@ -39,50 +39,39 @@
/* Defines */
/* ------- */
/*====================================================================*/
-
-#define MAX_GPRARGS 5 /* Max. no. of GPR available */
-#define MAX_FPRARGS 2 /* Max. no. of FPR available */
-
-#define STR_GPR 1 /* Structure will fit in 1 or 2 GPR */
-#define STR_FPR 2 /* Structure will fit in a FPR */
-#define STR_STACK 3 /* Structure needs to go on stack */
-
+
+/* Maximum number of GPRs available for argument passing. */
+#define MAX_GPRARGS 5
+
+/* Maximum number of FPRs available for argument passing. */
+#ifdef __s390x__
+#define MAX_FPRARGS 4
+#else
+#define MAX_FPRARGS 2
+#endif
+
+/* Round to multiple of 16. */
+#define ROUND_SIZE(size) (((size) + 15) & ~15)
+
+/* If these values change, sysv.S must be adapted! */
+#define FFI390_RET_VOID 0
+#define FFI390_RET_STRUCT 1
+#define FFI390_RET_FLOAT 2
+#define FFI390_RET_DOUBLE 3
+#define FFI390_RET_INT32 4
+#define FFI390_RET_INT64 5
+
/*===================== End of Defines ===============================*/
/*====================================================================*/
-/* Types */
-/* ----- */
-/*====================================================================*/
-
-typedef struct stackLayout
-{
- int *backChain;
- int *endOfStack;
- int glue[2];
- int scratch[2];
- int gprArgs[MAX_GPRARGS];
- int notUsed;
- union
- {
- float f;
- double d;
- } fprArgs[MAX_FPRARGS];
- int unUsed[8];
- int outArgs[100];
-} stackLayout;
-
-/*======================== End of Types ==============================*/
-
-/*====================================================================*/
/* Prototypes */
/* ---------- */
/*====================================================================*/
-void ffi_prep_args(stackLayout *, extended_cif *);
-static int ffi_check_struct(ffi_type *, unsigned int *);
-static void ffi_insert_int(int, stackLayout *, int *, int *);
-static void ffi_insert_int64(long long, stackLayout *, int *, int *);
-static void ffi_insert_double(double, stackLayout *, int *, int *);
+static void ffi_prep_args (unsigned char *, extended_cif *);
+static int ffi_check_float_struct (ffi_type *);
+void ffi_closure_helper_SYSV (ffi_closure *, unsigned long *,
+ unsigned long long *, unsigned long *);
/*====================== End of Prototypes ===========================*/
@@ -91,499 +80,670 @@ static void ffi_insert_double(double, stackLayout *, int *, int *);
/* --------- */
/*====================================================================*/
-extern void ffi_call_SYSV(void (*)(stackLayout *, extended_cif *),
+extern void ffi_call_SYSV(unsigned,
extended_cif *,
- unsigned, unsigned,
- unsigned *,
+ void (*)(unsigned char *, extended_cif *),
+ unsigned,
+ void *,
void (*fn)());
+
+extern void ffi_closure_SYSV(void);
/*====================== End of Externals ============================*/
/*====================================================================*/
/* */
-/* Name - ffi_check_struct. */
+/* Name - ffi_check_struct_type. */
/* */
/* Function - Determine if a structure can be passed within a */
-/* general or floating point register. */
+/* general purpose or floating point register. */
/* */
/*====================================================================*/
-int
-ffi_check_struct(ffi_type *arg, unsigned int *strFlags)
+static int
+ffi_check_struct_type (ffi_type *arg)
{
- ffi_type *element;
- int i_Element;
-
- for (i_Element = 0; arg->elements[i_Element]; i_Element++) {
- element = arg->elements[i_Element];
- switch (element->type) {
- case FFI_TYPE_DOUBLE :
- *strFlags |= STR_FPR;
- break;
-
- case FFI_TYPE_STRUCT :
- *strFlags |= ffi_check_struct(element, strFlags);
- break;
-
- default :
- *strFlags |= STR_GPR;
- }
- }
- return (*strFlags);
+ size_t size = arg->size;
+
+ /* If the struct has just one element, look at that element
+ to find out whether to consider the struct as floating point. */
+ while (arg->type == FFI_TYPE_STRUCT
+ && arg->elements[0] && !arg->elements[1])
+ arg = arg->elements[0];
+
+ /* Structs of size 1, 2, 4, and 8 are passed in registers,
+ just like the corresponding int/float types. */
+ switch (size)
+ {
+ case 1:
+ return FFI_TYPE_UINT8;
+
+ case 2:
+ return FFI_TYPE_UINT16;
+
+ case 4:
+ if (arg->type == FFI_TYPE_FLOAT)
+ return FFI_TYPE_FLOAT;
+ else
+ return FFI_TYPE_UINT32;
+
+ case 8:
+ if (arg->type == FFI_TYPE_DOUBLE)
+ return FFI_TYPE_DOUBLE;
+ else
+ return FFI_TYPE_UINT64;
+
+ default:
+ break;
+ }
+
+ /* Other structs are passed via a pointer to the data. */
+ return FFI_TYPE_POINTER;
}
/*======================== End of Routine ============================*/
/*====================================================================*/
/* */
-/* Name - ffi_insert_int. */
+/* Name - ffi_prep_args. */
+/* */
+/* Function - Prepare parameters for call to function. */
/* */
-/* Function - Insert an integer parameter in a register if there are */
-/* spares else on the stack. */
+/* ffi_prep_args is called by the assembly routine once stack space */
+/* has been allocated for the function's arguments. */
/* */
/*====================================================================*/
-void
-ffi_insert_int(int gprValue, stackLayout *stack,
- int *intArgC, int *outArgC)
+static void
+ffi_prep_args (unsigned char *stack, extended_cif *ecif)
{
- if (*intArgC < MAX_GPRARGS) {
- stack->gprArgs[*intArgC] = gprValue;
- *intArgC += 1;
- }
- else {
- stack->outArgs[*outArgC++] = gprValue;
- *outArgC += 1;
- }
-}
+ /* The stack space will be filled with those areas:
+
+ FPR argument register save area (highest addresses)
+ GPR argument register save area
+ temporary struct copies
+ overflow argument area (lowest addresses)
+
+ We set up the following pointers:
+
+ p_fpr: bottom of the FPR area (growing upwards)
+ p_gpr: bottom of the GPR area (growing upwards)
+ p_ov: bottom of the overflow area (growing upwards)
+ p_struct: top of the struct copy area (growing downwards)
+
+ All areas are kept aligned to twice the word size. */
+
+ int gpr_off = ecif->cif->bytes;
+ int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
+
+ unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
+ unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
+ unsigned char *p_struct = (unsigned char *)p_gpr;
+ unsigned long *p_ov = (unsigned long *)stack;
+
+ int n_fpr = 0;
+ int n_gpr = 0;
+ int n_ov = 0;
+
+ ffi_type **ptr;
+ void **p_argv = ecif->avalue;
+ int i;
+
+ /* If we returning a structure then we set the first parameter register
+ to the address of where we are returning this structure. */
+
+ if (ecif->cif->flags == FFI390_RET_STRUCT)
+ p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
+
+ /* Now for the arguments. */
+ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
+ i > 0;
+ i--, ptr++, p_argv++)
+ {
+ void *arg = *p_argv;
+ int type = (*ptr)->type;
+
+ /* Check how a structure type is passed. */
+ if (type == FFI_TYPE_STRUCT)
+ {
+ type = ffi_check_struct_type (*ptr);
+
+ /* If we pass the struct via pointer, copy the data. */
+ if (type == FFI_TYPE_POINTER)
+ {
+ p_struct -= ROUND_SIZE ((*ptr)->size);
+ memcpy (p_struct, (char *)arg, (*ptr)->size);
+ arg = &p_struct;
+ }
+ }
+
+ /* Pointers are passed like UINTs of the same size. */
+ if (type == FFI_TYPE_POINTER)
+#ifdef __s390x__
+ type = FFI_TYPE_UINT64;
+#else
+ type = FFI_TYPE_UINT32;
+#endif
+
+ /* Now handle all primitive int/float data types. */
+ switch (type)
+ {
+ case FFI_TYPE_DOUBLE:
+ if (n_fpr < MAX_FPRARGS)
+ p_fpr[n_fpr++] = *(unsigned long long *) arg;
+ else
+#ifdef __s390x__
+ p_ov[n_ov++] = *(unsigned long *) arg;
+#else
+ p_ov[n_ov++] = ((unsigned long *) arg)[0],
+ p_ov[n_ov++] = ((unsigned long *) arg)[1];
+#endif
+ break;
+
+ case FFI_TYPE_FLOAT:
+ if (n_fpr < MAX_FPRARGS)
+ p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
+ else
+ p_ov[n_ov++] = *(unsigned int *) arg;
+ break;
+
+ case FFI_TYPE_UINT64:
+ case FFI_TYPE_SINT64:
+#ifdef __s390x__
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(unsigned long *) arg;
+ else
+ p_ov[n_ov++] = *(unsigned long *) arg;
+#else
+ if (n_gpr == MAX_GPRARGS-1)
+ n_gpr = MAX_GPRARGS;
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
+ p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
+ else
+ p_ov[n_ov++] = ((unsigned long *) arg)[0],
+ p_ov[n_ov++] = ((unsigned long *) arg)[1];
+#endif
+ break;
+
+ case FFI_TYPE_UINT32:
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(unsigned int *) arg;
+ else
+ p_ov[n_ov++] = *(unsigned int *) arg;
+ break;
+
+ case FFI_TYPE_INT:
+ case FFI_TYPE_SINT32:
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(signed int *) arg;
+ else
+ p_ov[n_ov++] = *(signed int *) arg;
+ break;
+
+ case FFI_TYPE_UINT16:
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(unsigned short *) arg;
+ else
+ p_ov[n_ov++] = *(unsigned short *) arg;
+ break;
+
+ case FFI_TYPE_SINT16:
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(signed short *) arg;
+ else
+ p_ov[n_ov++] = *(signed short *) arg;
+ break;
+
+ case FFI_TYPE_UINT8:
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(unsigned char *) arg;
+ else
+ p_ov[n_ov++] = *(unsigned char *) arg;
+ break;
+
+ case FFI_TYPE_SINT8:
+ if (n_gpr < MAX_GPRARGS)
+ p_gpr[n_gpr++] = *(signed char *) arg;
+ else
+ p_ov[n_ov++] = *(signed char *) arg;
+ break;
+
+ default:
+ FFI_ASSERT (0);
+ break;
+ }
+ }
+}
+
/*======================== End of Routine ============================*/
/*====================================================================*/
/* */
-/* Name - ffi_insert_int64. */
+/* Name - ffi_prep_cif_machdep. */
/* */
-/* Function - Insert a long long parameter in registers if there are */
-/* spares else on the stack. */
+/* Function - Perform machine dependent CIF processing. */
/* */
/*====================================================================*/
-void
-ffi_insert_int64(long long llngValue, stackLayout *stack,
- int *intArgC, int *outArgC)
+ffi_status
+ffi_prep_cif_machdep(ffi_cif *cif)
{
+ size_t struct_size = 0;
+ int n_gpr = 0;
+ int n_fpr = 0;
+ int n_ov = 0;
+
+ ffi_type **ptr;
+ int i;
+
+ /* Determine return value handling. */
+
+ switch (cif->rtype->type)
+ {
+ /* Void is easy. */
+ case FFI_TYPE_VOID:
+ cif->flags = FFI390_RET_VOID;
+ break;
+
+ /* Structures are returned via a hidden pointer. */
+ case FFI_TYPE_STRUCT:
+ cif->flags = FFI390_RET_STRUCT;
+ n_gpr++; /* We need one GPR to pass the pointer. */
+ break;
+
+ /* Floating point values are returned in fpr 0. */
+ case FFI_TYPE_FLOAT:
+ cif->flags = FFI390_RET_FLOAT;
+ break;
+
+ case FFI_TYPE_DOUBLE:
+ cif->flags = FFI390_RET_DOUBLE;
+ break;
+
+ /* Integer values are returned in gpr 2 (and gpr 3
+ for 64-bit values on 31-bit machines). */
+ case FFI_TYPE_UINT64:
+ case FFI_TYPE_SINT64:
+ cif->flags = FFI390_RET_INT64;
+ break;
+
+ case FFI_TYPE_POINTER:
+ case FFI_TYPE_INT:
+ case FFI_TYPE_UINT32:
+ case FFI_TYPE_SINT32:
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_SINT16:
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_SINT8:
+ /* These are to be extended to word size. */
+#ifdef __s390x__
+ cif->flags = FFI390_RET_INT64;
+#else
+ cif->flags = FFI390_RET_INT32;
+#endif
+ break;
- if (*intArgC < (MAX_GPRARGS-1)) {
- memcpy(&stack->gprArgs[*intArgC],
- &llngValue, sizeof(long long));
- *intArgC += 2;
- }
- else {
- memcpy(&stack->outArgs[*outArgC],
- &llngValue, sizeof(long long));
- *outArgC += 2;
- }
+ default:
+ FFI_ASSERT (0);
+ break;
+ }
+
+ /* Now for the arguments. */
+ for (ptr = cif->arg_types, i = cif->nargs;
+ i > 0;
+ i--, ptr++)
+ {
+ int type = (*ptr)->type;
+
+ /* Check how a structure type is passed. */
+ if (type == FFI_TYPE_STRUCT)
+ {
+ type = ffi_check_struct_type (*ptr);
+
+ /* If we pass the struct via pointer, we must reserve space
+ to copy its data for proper call-by-value semantics. */
+ if (type == FFI_TYPE_POINTER)
+ struct_size += ROUND_SIZE ((*ptr)->size);
+ }
+
+ /* Now handle all primitive int/float data types. */
+ switch (type)
+ {
+ /* The first MAX_FPRARGS floating point arguments
+ go in FPRs, the rest overflow to the stack. */
+
+ case FFI_TYPE_DOUBLE:
+ if (n_fpr < MAX_FPRARGS)
+ n_fpr++;
+ else
+ n_ov += sizeof (double) / sizeof (long);
+ break;
+
+ case FFI_TYPE_FLOAT:
+ if (n_fpr < MAX_FPRARGS)
+ n_fpr++;
+ else
+ n_ov++;
+ break;
+
+ /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
+ if one is still available, or else on the stack. If only one
+ register is free, skip the register (it won't be used for any
+ subsequent argument either). */
+
+#ifndef __s390x__
+ case FFI_TYPE_UINT64:
+ case FFI_TYPE_SINT64:
+ if (n_gpr == MAX_GPRARGS-1)
+ n_gpr = MAX_GPRARGS;
+ if (n_gpr < MAX_GPRARGS)
+ n_gpr += 2;
+ else
+ n_ov += 2;
+ break;
+#endif
+
+ /* Everything else is passed in GPRs (until MAX_GPRARGS
+ have been used) or overflows to the stack. */
+
+ default:
+ if (n_gpr < MAX_GPRARGS)
+ n_gpr++;
+ else
+ n_ov++;
+ break;
+ }
+ }
+
+ /* Total stack space as required for overflow arguments
+ and temporary structure copies. */
+
+ cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
+
+ return FFI_OK;
}
/*======================== End of Routine ============================*/
/*====================================================================*/
/* */
-/* Name - ffi_insert_double. */
+/* Name - ffi_call. */
/* */
-/* Function - Insert a double parameter in a FP register if there is */
-/* a spare else on the stack. */
+/* Function - Call the FFI routine. */
/* */
/*====================================================================*/
void
-ffi_insert_double(double dblValue, stackLayout *stack,
- int *fprArgC, int *outArgC)
+ffi_call(ffi_cif *cif,
+ void (*fn)(),
+ void *rvalue,
+ void **avalue)
{
+ int ret_type = cif->flags;
+ extended_cif ecif;
- if (*fprArgC < MAX_FPRARGS) {
- stack->fprArgs[*fprArgC].d = dblValue;
- *fprArgC += 1;
- }
- else {
- memcpy(&stack->outArgs[*outArgC],
- &dblValue,sizeof(double));
- *outArgC += 2;
- }
-
+ ecif.cif = cif;
+ ecif.avalue = avalue;
+ ecif.rvalue = rvalue;
+
+ /* If we don't have a return value, we need to fake one. */
+ if (rvalue == NULL)
+ {
+ if (ret_type == FFI390_RET_STRUCT)
+ ecif.rvalue = alloca (cif->rtype->size);
+ else
+ ret_type = FFI390_RET_VOID;
+ }
+
+ switch (cif->abi)
+ {
+ case FFI_SYSV:
+ ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
+ ret_type, ecif.rvalue, fn);
+ break;
+
+ default:
+ FFI_ASSERT (0);
+ break;
+ }
}
/*======================== End of Routine ============================*/
-
+
/*====================================================================*/
/* */
-/* Name - ffi_prep_args. */
+/* Name - ffi_closure_helper_SYSV. */
/* */
-/* Function - Prepare parameters for call to function. */
-/* */
-/* ffi_prep_args is called by the assembly routine once stack space */
-/* has been allocated for the function's arguments. */
-/* */
-/* The stack layout we want looks like this: */
-/* *------------------------------------------------------------* */
-/* | 0 | Back chain (a 0 here signifies end of back chain) | */
-/* +--------+---------------------------------------------------+ */
-/* | 4 | EOS (end of stack, not used on Linux for S390) | */
-/* +--------+---------------------------------------------------+ */
-/* | 8 | Glue used in other linkage formats | */
-/* +--------+---------------------------------------------------+ */
-/* | 12 | Glue used in other linkage formats | */
-/* +--------+---------------------------------------------------+ */
-/* | 16 | Scratch area | */
-/* +--------+---------------------------------------------------+ */
-/* | 20 | Scratch area | */
-/* +--------+---------------------------------------------------+ */
-/* | 24 | GPR parameter register 1 | */
-/* +--------+---------------------------------------------------+ */
-/* | 28 | GPR parameter register 2 | */
-/* +--------+---------------------------------------------------+ */
-/* | 32 | GPR parameter register 3 | */
-/* +--------+---------------------------------------------------+ */
-/* | 36 | GPR parameter register 4 | */
-/* +--------+---------------------------------------------------+ */
-/* | 40 | GPR parameter register 5 | */
-/* +--------+---------------------------------------------------+ */
-/* | 44 | Unused | */
-/* +--------+---------------------------------------------------+ */
-/* | 48 | FPR parameter register 1 | */
-/* +--------+---------------------------------------------------+ */
-/* | 56 | FPR parameter register 2 | */
-/* +--------+---------------------------------------------------+ */
-/* | 64 | Unused | */
-/* +--------+---------------------------------------------------+ */
-/* | 96 | Outgoing args (length x) | */
-/* +--------+---------------------------------------------------+ */
-/* | 96+x | Copy area for structures (length y) | */
-/* +--------+---------------------------------------------------+ */
-/* | 96+x+y | Possible stack alignment | */
-/* *------------------------------------------------------------* */
+/* Function - Call a FFI closure target function. */
/* */
/*====================================================================*/
void
-ffi_prep_args(stackLayout *stack, extended_cif *ecif)
+ffi_closure_helper_SYSV (ffi_closure *closure,
+ unsigned long *p_gpr,
+ unsigned long long *p_fpr,
+ unsigned long *p_ov)
{
- const unsigned bytes = ecif->cif->bytes;
- const unsigned flags = ecif->cif->flags;
-
- /*----------------------------------------------------------*/
- /* Pointer to the copy area on stack for structures */
- /*----------------------------------------------------------*/
- char *copySpace = (char *) stack + bytes + sizeof(stackLayout);
-
- /*----------------------------------------------------------*/
- /* Count of general and floating point register usage */
- /*----------------------------------------------------------*/
- int intArgC = 0,
- fprArgC = 0,
- outArgC = 0;
-
- int i;
+ unsigned long long ret_buffer;
+
+ void *rvalue = &ret_buffer;
+ void **avalue;
+ void **p_arg;
+
+ int n_gpr = 0;
+ int n_fpr = 0;
+ int n_ov = 0;
+
ffi_type **ptr;
- void **p_argv;
- size_t structCopySize;
- unsigned gprValue, strFlags = 0;
- unsigned long long llngValue;
- double dblValue;
-
+ int i;
+
+ /* Allocate buffer for argument list pointers. */
+
+ p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
+
+ /* If we returning a structure, pass the structure address
+ directly to the target function. Otherwise, have the target
+ function store the return value to the GPR save area. */
+
+ if (closure->cif->flags == FFI390_RET_STRUCT)
+ rvalue = (void *) p_gpr[n_gpr++];
+
/* Now for the arguments. */
- p_argv = ecif->avalue;
-
- /*----------------------------------------------------------------------*/
- /* If we returning a structure then we set the first parameter register */
- /* to the address of where we are returning this structure */
- /*----------------------------------------------------------------------*/
- if (flags == FFI_TYPE_STRUCT)
- stack->gprArgs[intArgC++] = (int) ecif->rvalue;
-
- for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
+
+ for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
i > 0;
- i--, ptr++, p_argv++)
+ i--, p_arg++, ptr++)
{
- switch ((*ptr)->type) {
-
+ int deref_struct_pointer = 0;
+ int type = (*ptr)->type;
+
+ /* Check how a structure type is passed. */
+ if (type == FFI_TYPE_STRUCT)
+ {
+ type = ffi_check_struct_type (*ptr);
+
+ /* If we pass the struct via pointer, remember to
+ retrieve the pointer later. */
+ if (type == FFI_TYPE_POINTER)
+ deref_struct_pointer = 1;
+ }
+
+ /* Pointers are passed like UINTs of the same size. */
+ if (type == FFI_TYPE_POINTER)
+#ifdef __s390x__
+ type = FFI_TYPE_UINT64;
+#else
+ type = FFI_TYPE_UINT32;
+#endif
+
+ /* Now handle all primitive int/float data types. */
+ switch (type)
+ {
+ case FFI_TYPE_DOUBLE:
+ if (n_fpr < MAX_FPRARGS)
+ *p_arg = &p_fpr[n_fpr++];
+ else
+ *p_arg = &p_ov[n_ov],
+ n_ov += sizeof (double) / sizeof (long);
+ break;
+
+ case FFI_TYPE_FLOAT:
+ if (n_fpr < MAX_FPRARGS)
+ *p_arg = &p_fpr[n_fpr++];
+ else
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
+ break;
+
+ case FFI_TYPE_UINT64:
+ case FFI_TYPE_SINT64:
+#ifdef __s390x__
+ if (n_gpr < MAX_GPRARGS)
+ *p_arg = &p_gpr[n_gpr++];
+ else
+ *p_arg = &p_ov[n_ov++];
+#else
+ if (n_gpr == MAX_GPRARGS-1)
+ n_gpr = MAX_GPRARGS;
+ if (n_gpr < MAX_GPRARGS)
+ *p_arg = &p_gpr[n_gpr], n_gpr += 2;
+ else
+ *p_arg = &p_ov[n_ov], n_ov += 2;
+#endif
+ break;
+
+ case FFI_TYPE_INT:
+ case FFI_TYPE_UINT32:
+ case FFI_TYPE_SINT32:
+ if (n_gpr < MAX_GPRARGS)
+ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
+ else
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
+ break;
+
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_SINT16:
+ if (n_gpr < MAX_GPRARGS)
+ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
+ else
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
+ break;
+
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_SINT8:
+ if (n_gpr < MAX_GPRARGS)
+ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
+ else
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
+ break;
+
+ default:
+ FFI_ASSERT (0);
+ break;
+ }
+
+ /* If this is a struct passed via pointer, we need to
+ actually retrieve that pointer. */
+ if (deref_struct_pointer)
+ *p_arg = *(void **)*p_arg;
+ }
+
+
+ /* Call the target function. */
+ (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
+
+ /* Convert the return value. */
+ switch (closure->cif->rtype->type)
+ {
+ /* Void is easy, and so is struct. */
+ case FFI_TYPE_VOID:
+ case FFI_TYPE_STRUCT:
+ break;
+
+ /* Floating point values are returned in fpr 0. */
case FFI_TYPE_FLOAT:
- if (fprArgC < MAX_FPRARGS)
- stack->fprArgs[fprArgC++].f = *(float *) *p_argv;
- else
- stack->outArgs[outArgC++] = *(int *) *p_argv;
+ p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
break;
-
+
case FFI_TYPE_DOUBLE:
- dblValue = *(double *) *p_argv;
- ffi_insert_double(dblValue, stack, &fprArgC, &outArgC);
+ p_fpr[0] = *(unsigned long long *) rvalue;
break;
-
+
+ /* Integer values are returned in gpr 2 (and gpr 3
+ for 64-bit values on 31-bit machines). */
case FFI_TYPE_UINT64:
case FFI_TYPE_SINT64:
- llngValue = *(unsigned long long *) *p_argv;
- ffi_insert_int64(llngValue, stack, &intArgC, &outArgC);
- break;
-
- case FFI_TYPE_UINT8:
- gprValue = *(unsigned char *)*p_argv;
- ffi_insert_int(gprValue, stack, &intArgC, &outArgC);
- break;
-
- case FFI_TYPE_SINT8:
- gprValue = *(signed char *)*p_argv;
- ffi_insert_int(gprValue, stack, &intArgC, &outArgC);
+#ifdef __s390x__
+ p_gpr[0] = *(unsigned long *) rvalue;
+#else
+ p_gpr[0] = ((unsigned long *) rvalue)[0],
+ p_gpr[1] = ((unsigned long *) rvalue)[1];
+#endif
break;
-
+
+ case FFI_TYPE_POINTER:
+ case FFI_TYPE_UINT32:
case FFI_TYPE_UINT16:
- gprValue = *(unsigned short *)*p_argv;
- ffi_insert_int(gprValue, stack, &intArgC, &outArgC);
- break;
-
- case FFI_TYPE_SINT16:
- gprValue = *(signed short *)*p_argv;
- ffi_insert_int(gprValue, stack, &intArgC, &outArgC);
- break;
-
- case FFI_TYPE_STRUCT:
- /*--------------------------------------------------*/
- /* If structure > 8 bytes then it goes on the stack */
- /*--------------------------------------------------*/
- if (((*ptr)->size > 8) ||
- ((*ptr)->size > 4 &&
- (*ptr)->size < 8))
- strFlags = STR_STACK;
- else
- strFlags = ffi_check_struct((ffi_type *) *ptr, &strFlags);
-
- switch (strFlags) {
- /*-------------------------------------------*/
- /* Structure that will fit in one or two GPR */
- /*-------------------------------------------*/
- case STR_GPR :
- if ((*ptr)->size <= 4) {
- gprValue = *(unsigned int *) *p_argv;
- gprValue = gprValue >> ((4 - (*ptr)->size) * 8);
- ffi_insert_int(gprValue, stack, &intArgC, &outArgC);
- }
- else {
- llngValue = *(unsigned long long *) *p_argv;
- ffi_insert_int64(llngValue, stack, &intArgC, &outArgC);
- }
- break;
-
- /*-------------------------------------------*/
- /* Structure that will fit in one FPR */
- /*-------------------------------------------*/
- case STR_FPR :
- dblValue = *(double *) *p_argv;
- ffi_insert_double(dblValue, stack, &fprArgC, &outArgC);
- break;
-
- /*-------------------------------------------*/
- /* Structure that must be copied to stack */
- /*-------------------------------------------*/
- default :
- structCopySize = (((*ptr)->size + 15) & ~0xF);
- copySpace -= structCopySize;
- memcpy(copySpace, (char *)*p_argv, (*ptr)->size);
- gprValue = (unsigned) copySpace;
- if (intArgC < MAX_GPRARGS)
- stack->gprArgs[intArgC++] = gprValue;
- else
- stack->outArgs[outArgC++] = gprValue;
- }
- break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- case FFI_TYPE_LONGDOUBLE:
- structCopySize = (((*ptr)->size + 15) & ~0xF);
- copySpace -= structCopySize;
- memcpy(copySpace, (char *)*p_argv, (*ptr)->size);
- gprValue = (unsigned) copySpace;
- if (intArgC < MAX_GPRARGS)
- stack->gprArgs[intArgC++] = gprValue;
- else
- stack->outArgs[outArgC++] = gprValue;
+ case FFI_TYPE_UINT8:
+ p_gpr[0] = *(unsigned long *) rvalue;
break;
-#endif
-
+
case FFI_TYPE_INT:
- case FFI_TYPE_UINT32:
case FFI_TYPE_SINT32:
- case FFI_TYPE_POINTER:
- gprValue = *(unsigned *)*p_argv;
- if (intArgC < MAX_GPRARGS)
- stack->gprArgs[intArgC++] = gprValue;
- else
- stack->outArgs[outArgC++] = gprValue;
+ case FFI_TYPE_SINT16:
+ case FFI_TYPE_SINT8:
+ p_gpr[0] = *(signed long *) rvalue;
break;
-
- }
+
+ default:
+ FFI_ASSERT (0);
+ break;
}
}
-
-/*======================== End of Routine ============================*/
+/*======================== End of Routine ============================*/
+
/*====================================================================*/
/* */
-/* Name - ffi_prep_cif_machdep. */
+/* Name - ffi_prep_closure. */
/* */
-/* Function - Perform machine dependent CIF processing. */
+/* Function - Prepare a FFI closure. */
/* */
/*====================================================================*/
ffi_status
-ffi_prep_cif_machdep(ffi_cif *cif)
+ffi_prep_closure (ffi_closure *closure,
+ ffi_cif *cif,
+ void (*fun) (ffi_cif *, void *, void **, void *),
+ void *user_data)
{
- int i;
- ffi_type **ptr;
- unsigned bytes;
- int fpArgC = 0,
- intArgC = 0;
- unsigned flags = 0;
- unsigned structCopySize = 0;
-
- /*-----------------------------------------------------------------*/
- /* Extra space required in stack for overflow parameters. */
- /*-----------------------------------------------------------------*/
- bytes = 0;
-
- /*--------------------------------------------------------*/
- /* Return value handling. The rules are as follows: */
- /* - 32-bit (or less) integer values are returned in gpr2 */
- /* - Structures are returned as pointers in gpr2 */
- /* - 64-bit integer values are returned in gpr2 and 3 */
- /* - Single/double FP values are returned in fpr0 */
- /*--------------------------------------------------------*/
- flags = cif->rtype->type;
-
- /*------------------------------------------------------------------------*/
- /* The first MAX_GPRARGS words of integer arguments, and the */
- /* first MAX_FPRARGS floating point arguments, go in registers; the rest */
- /* goes on the stack. Structures and long doubles (if not equivalent */
- /* to double) are passed as a pointer to a copy of the structure. */
- /* Stuff on the stack needs to keep proper alignment. */
- /*------------------------------------------------------------------------*/
- for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
- {
- switch ((*ptr)->type)
- {
- case FFI_TYPE_FLOAT:
- case FFI_TYPE_DOUBLE:
- fpArgC++;
- if (fpArgC > MAX_FPRARGS && intArgC%2 != 0)
- intArgC++;
- break;
-
- case FFI_TYPE_UINT64:
- case FFI_TYPE_SINT64:
- /*----------------------------------------------------*/
- /* 'long long' arguments are passed as two words, but */
- /* either both words must fit in registers or both go */
- /* on the stack. If they go on the stack, they must */
- /* be 8-byte-aligned. */
- /*----------------------------------------------------*/
- if ((intArgC == MAX_GPRARGS-1) ||
- (intArgC >= MAX_GPRARGS) &&
- (intArgC%2 != 0))
- intArgC++;
- intArgC += 2;
- break;
-
- case FFI_TYPE_STRUCT:
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- case FFI_TYPE_LONGDOUBLE:
-#endif
- /*----------------------------------------------------*/
- /* We must allocate space for a copy of these to */
- /* enforce pass-by-value. Pad the space up to a */
- /* multiple of 16 bytes (the maximum alignment */
- /* required for anything under the SYSV ABI). */
- /*----------------------------------------------------*/
- structCopySize += ((*ptr)->size + 15) & ~0xF;
- /*----------------------------------------------------*/
- /* Fall through (allocate space for the pointer). */
- /*----------------------------------------------------*/
-
- default:
- /*----------------------------------------------------*/
- /* Everything else is passed as a 4-byte word in a */
- /* GPR either the object itself or a pointer to it. */
- /*----------------------------------------------------*/
- intArgC++;
- break;
- }
- }
-
- /*-----------------------------------------------------------------*/
- /* Stack space. */
- /*-----------------------------------------------------------------*/
- if (intArgC > MAX_GPRARGS)
- bytes += (intArgC - MAX_GPRARGS) * sizeof(int);
- if (fpArgC > MAX_FPRARGS)
- bytes += (fpArgC - MAX_FPRARGS) * sizeof(double);
-
- /*-----------------------------------------------------------------*/
- /* The stack space allocated needs to be a multiple of 16 bytes. */
- /*-----------------------------------------------------------------*/
- bytes = (bytes + 15) & ~0xF;
-
- /*-----------------------------------------------------------------*/
- /* Add in the space for the copied structures. */
- /*-----------------------------------------------------------------*/
- bytes += structCopySize;
-
- cif->flags = flags;
- cif->bytes = bytes;
+ FFI_ASSERT (cif->abi == FFI_SYSV);
+
+#ifndef __s390x__
+ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
+ *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */
+ *(short *)&closure->tramp [4] = 0x1006;
+ *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */
+ *(long *)&closure->tramp [8] = (long)closure;
+ *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
+#else
+ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
+ *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */
+ *(short *)&closure->tramp [4] = 0x100e;
+ *(short *)&closure->tramp [6] = 0x0004;
+ *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */
+ *(long *)&closure->tramp[16] = (long)closure;
+ *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
+#endif
+
+ closure->cif = cif;
+ closure->user_data = user_data;
+ closure->fun = fun;
return FFI_OK;
}
-
+
/*======================== End of Routine ============================*/
-/*====================================================================*/
-/* */
-/* Name - ffi_call. */
-/* */
-/* Function - Call the FFI routine. */
-/* */
-/*====================================================================*/
-
-void
-ffi_call(ffi_cif *cif,
- void (*fn)(),
- void *rvalue,
- void **avalue)
-{
- extended_cif ecif;
-
- ecif.cif = cif;
- ecif.avalue = avalue;
-
- /*-----------------------------------------------------------------*/
- /* If the return value is a struct and we don't have a return */
- /* value address then we need to make one */
- /*-----------------------------------------------------------------*/
- if ((rvalue == NULL) &&
- (cif->rtype->type == FFI_TYPE_STRUCT))
- ecif.rvalue = alloca(cif->rtype->size);
- else
- ecif.rvalue = rvalue;
-
- switch (cif->abi)
- {
- case FFI_SYSV:
- ffi_call_SYSV(ffi_prep_args,
- &ecif, cif->bytes,
- cif->flags, ecif.rvalue, fn);
- break;
-
- default:
- FFI_ASSERT(0);
- break;
- }
-}
-
-/*======================== End of Routine ============================*/
diff --git a/libffi/src/s390/sysv.S b/libffi/src/s390/sysv.S
index c28b14c8ce0..50e94f5ee2a 100644
--- a/libffi/src/s390/sysv.S
+++ b/libffi/src/s390/sysv.S
@@ -22,150 +22,130 @@
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------------------------------------- */
+
+#ifndef __s390x__
-#define LIBFFI_ASM
-#include <ffi.h>
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#endif
-
.text
-
- # r2: ffi_prep_args
+
+ # r2: cif->bytes
# r3: &ecif
- # r4: cif->bytes
- # r5: fig->flags
+ # r4: ffi_prep_args
+ # r5: ret_type
# r6: ecif.rvalue
- # sp+0: fn
+ # ov: fn
# This assumes we are using gas.
.globl ffi_call_SYSV
.type ffi_call_SYSV,%function
ffi_call_SYSV:
.LFB1:
- # Save registers
- stm %r6,%r15,24(%r15)
+ stm %r6,%r15,24(%r15) # Save registers
.LCFI0:
- l %r7,96(%r15) # Get A(fn)
- lr %r0,%r15
- ahi %r15,-128 # Make room for my args
+ basr %r13,0 # Set up base register
+.Lbase:
+ lr %r11,%r15 # Set up frame pointer
.LCFI1:
- st %r0,0(%r15) # Set backchain
- lr %r11,%r15 # Establish my stack register
+ sr %r15,%r2
+ ahi %r15,-96-48 # Allocate stack
+ lr %r8,%r6 # Save ecif.rvalue
+ sr %r9,%r9
+ ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address
+ l %r7,96(%r11) # Load function address
+ st %r11,0(%r15) # Set up back chain
+ ahi %r11,-48 # Register save area
.LCFI2:
- sr %r15,%r4 # Make room for fn args
- ahi %r15,-96 # Make room for new frame
- lr %r10,%r15 # Establish stack build area
- ahi %r15,-96 # Stack for next call
- lr %r1,%r7
- stm %r2,%r7,96(%r11) # Save args on my stack
-
-#------------------------------------------------------------------
-# move first 3 parameters in registers
-#------------------------------------------------------------------
- lr %r9,%r2 # r9: &ffi_prep_args
- lr %r2,%r10 # Parm 1: &stack Parm 2: &ecif
- basr %r14,%r9 # call ffi_prep_args
-
-#------------------------------------------------------------------
-# load first 5 parameter registers
-#------------------------------------------------------------------
- lm %r2,%r6,24(%r10)
-
-#------------------------------------------------------------------
-# load fp parameter registers
-#------------------------------------------------------------------
- ld %f0,48(%r10)
- ld %f2,56(%r10)
-
-#------------------------------------------------------------------
-# call function
-#------------------------------------------------------------------
- lr %r15,%r10 # Set new stack
- l %r9,116(%r11) # Get &fn
- basr %r14,%r9 # Call function
-
-#------------------------------------------------------------------
-# On return:
-# r2: Return value (r3: Return value + 4 for long long)
-#------------------------------------------------------------------
-
-#------------------------------------------------------------------
-# If the return value pointer is NULL, assume no return value.
-#------------------------------------------------------------------
- icm %r6,15,112(%r11)
- jz .Lepilogue
-
- l %r5,108(%r11) # Get return type
-#------------------------------------------------------------------
-# return INT
-#------------------------------------------------------------------
- chi %r5,FFI_TYPE_INT
- jne .Lchk64
-
- st %r2,0(%r6)
- j .Lepilogue
-
-.Lchk64:
-#------------------------------------------------------------------
-# return LONG LONG (signed/unsigned)
-#------------------------------------------------------------------
- chi %r5,FFI_TYPE_UINT64
- je .LdoLongLong
-
- chi %r5,FFI_TYPE_SINT64
- jne .LchkFloat
-
-.LdoLongLong:
- stm %r2,%r3,0(%r6)
- j .Lepilogue
-
-.LchkFloat:
-#------------------------------------------------------------------
-# return FLOAT
-#------------------------------------------------------------------
- chi %r5,FFI_TYPE_FLOAT
- jne .LchkDouble
-
- std %f0,0(%r6)
- j .Lepilogue
-
-.LchkDouble:
-#------------------------------------------------------------------
-# return DOUBLE or LONGDOUBLE
-#------------------------------------------------------------------
- chi %r5,FFI_TYPE_DOUBLE
- jne .LchkStruct
-
- std %f0,0(%r6)
- std %f2,8(%r6)
- j .Lepilogue
-
-.LchkStruct:
-#------------------------------------------------------------------
-# Structure - rvalue already set as sent as 1st parm to routine
-#------------------------------------------------------------------
- chi %r5,FFI_TYPE_STRUCT
- je .Lepilogue
+
+ la %r2,96(%r15) # Save area
+ # r3 already holds &ecif
+ basr %r14,%r4 # Call ffi_prep_args
+
+ lm %r2,%r6,0(%r11) # Load arguments
+ ld %f0,32(%r11)
+ ld %f2,40(%r11)
+ la %r14,0(%r13,%r9) # Set return address
+ br %r7 # ... and call function
+
+.LretNone: # Return void
+ l %r4,48+56(%r11)
+ lm %r6,%r15,48+24(%r11)
+ br %r4
+
+.LretFloat:
+ l %r4,48+56(%r11)
+ ste %f0,0(%r8) # Return float
+ lm %r6,%r15,48+24(%r11)
+ br %r4
-.Ldefault:
-#------------------------------------------------------------------
-# return a pointer
-#------------------------------------------------------------------
- st %r2,0(%r6)
- j .Lepilogue
+.LretDouble:
+ l %r4,48+56(%r11)
+ std %f0,0(%r8) # Return double
+ lm %r6,%r15,48+24(%r11)
+ br %r4
+
+.LretInt32:
+ l %r4,48+56(%r11)
+ st %r2,0(%r8) # Return int
+ lm %r6,%r15,48+24(%r11)
+ br %r4
-.Lepilogue:
- l %r15,0(%r11)
- l %r4,56(%r15)
- lm %r6,%r15,24(%r15)
+.LretInt64:
+ l %r4,48+56(%r11)
+ stm %r2,%r3,0(%r8) # Return long long
+ lm %r6,%r15,48+24(%r11)
br %r4
+
+.Ltable:
+ .byte .LretNone-.Lbase # FFI390_RET_VOID
+ .byte .LretNone-.Lbase # FFI390_RET_STRUCT
+ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT
+ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE
+ .byte .LretInt32-.Lbase # FFI390_RET_INT32
+ .byte .LretInt64-.Lbase # FFI390_RET_INT64
.LFE1:
.ffi_call_SYSV_end:
.size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+ .globl ffi_closure_SYSV
+ .type ffi_closure_SYSV,%function
+ffi_closure_SYSV:
+.LFB2:
+ stm %r12,%r15,48(%r15) # Save registers
+.LCFI10:
+ basr %r13,0 # Set up base register
+.Lcbase:
+ stm %r2,%r6,8(%r15) # Save arguments
+ std %f0,64(%r15)
+ std %f2,72(%r15)
+ lr %r1,%r15 # Set up stack frame
+ ahi %r15,-96
+.LCFI11:
+ l %r12,.Lchelper-.Lcbase(%r13) # Get helper function
+ lr %r2,%r0 # Closure
+ la %r3,8(%r1) # GPRs
+ la %r4,64(%r1) # FPRs
+ la %r5,96(%r1) # Overflow
+ st %r1,0(%r15) # Set up back chain
+
+ bas %r14,0(%r12,%r13) # Call helper
+
+ l %r4,96+56(%r15)
+ ld %f0,96+64(%r15) # Load return registers
+ lm %r2,%r3,96+8(%r15)
+ lm %r12,%r15,96+48(%r15)
+ br %r4
+
+ .align 4
+.Lchelper:
+ .long ffi_closure_helper_SYSV-.Lcbase
+
+.LFE2:
+
+.ffi_closure_SYSV_end:
+ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
+
+
.section .eh_frame,"aw",@progbits
.Lframe1:
.4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
@@ -187,7 +167,6 @@ ffi_call_SYSV:
.4byte .LASFDE1-.Lframe1 # FDE CIE offset
.4byte .LFB1 # FDE initial location
.4byte .LFE1-.LFB1 # FDE address range
- .uleb128 0x0 # Augmentation size
.byte 0x4 # DW_CFA_advance_loc4
.4byte .LCFI0-.LFB1
.byte 0x8f # DW_CFA_offset, column 0xf
@@ -212,12 +191,227 @@ ffi_call_SYSV:
.uleb128 0x12
.byte 0x4 # DW_CFA_advance_loc4
.4byte .LCFI1-.LCFI0
- .byte 0xe # DW_CFA_def_cfa_offset
- .uleb128 0xe0
+ .byte 0xd # DW_CFA_def_cfa_register
+ .uleb128 0xb
.byte 0x4 # DW_CFA_advance_loc4
.4byte .LCFI2-.LCFI1
- .byte 0xd # DW_CFA_def_cfa_register
+ .byte 0xe # DW_CFA_def_cfa_offset
+ .uleb128 0x90
+ .align 4
+.LEFDE1:
+.LSFDE2:
+ .4byte .LEFDE2-.LASFDE2 # FDE Length
+.LASFDE2:
+ .4byte .LASFDE2-.Lframe1 # FDE CIE offset
+ .4byte .LFB2 # FDE initial location
+ .4byte .LFE2-.LFB2 # FDE address range
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI10-.LFB2
+ .byte 0x8f # DW_CFA_offset, column 0xf
+ .uleb128 0x9
+ .byte 0x8e # DW_CFA_offset, column 0xe
+ .uleb128 0xa
+ .byte 0x8d # DW_CFA_offset, column 0xd
.uleb128 0xb
+ .byte 0x8c # DW_CFA_offset, column 0xc
+ .uleb128 0xc
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI11-.LCFI10
+ .byte 0xe # DW_CFA_def_cfa_offset
+ .uleb128 0xc0
.align 4
+.LEFDE2:
+
+#else
+
+.text
+
+ # r2: cif->bytes
+ # r3: &ecif
+ # r4: ffi_prep_args
+ # r5: ret_type
+ # r6: ecif.rvalue
+ # ov: fn
+
+ # This assumes we are using gas.
+ .globl ffi_call_SYSV
+ .type ffi_call_SYSV,%function
+ffi_call_SYSV:
+.LFB1:
+ stmg %r6,%r15,48(%r15) # Save registers
+.LCFI0:
+ larl %r13,.Lbase # Set up base register
+ lgr %r11,%r15 # Set up frame pointer
+.LCFI1:
+ sgr %r15,%r2
+ aghi %r15,-160-80 # Allocate stack
+ lgr %r8,%r6 # Save ecif.rvalue
+ llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address
+ lg %r7,160(%r11) # Load function address
+ stg %r11,0(%r15) # Set up back chain
+ aghi %r11,-80 # Register save area
+.LCFI2:
+
+ la %r2,160(%r15) # Save area
+ # r3 already holds &ecif
+ basr %r14,%r4 # Call ffi_prep_args
+
+ lmg %r2,%r6,0(%r11) # Load arguments
+ ld %f0,48(%r11)
+ ld %f2,56(%r11)
+ ld %f4,64(%r11)
+ ld %f6,72(%r11)
+ la %r14,0(%r13,%r9) # Set return address
+ br %r7 # ... and call function
+
+.Lbase:
+.LretNone: # Return void
+ lg %r4,80+112(%r11)
+ lmg %r6,%r15,80+48(%r11)
+ br %r4
+
+.LretFloat:
+ lg %r4,80+112(%r11)
+ ste %f0,0(%r8) # Return float
+ lmg %r6,%r15,80+48(%r11)
+ br %r4
+
+.LretDouble:
+ lg %r4,80+112(%r11)
+ std %f0,0(%r8) # Return double
+ lmg %r6,%r15,80+48(%r11)
+ br %r4
+
+.LretInt32:
+ lg %r4,80+112(%r11)
+ st %r2,0(%r8) # Return int
+ lmg %r6,%r15,80+48(%r11)
+ br %r4
+
+.LretInt64:
+ lg %r4,80+112(%r11)
+ stg %r2,0(%r8) # Return long
+ lmg %r6,%r15,80+48(%r11)
+ br %r4
+
+.Ltable:
+ .byte .LretNone-.Lbase # FFI390_RET_VOID
+ .byte .LretNone-.Lbase # FFI390_RET_STRUCT
+ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT
+ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE
+ .byte .LretInt32-.Lbase # FFI390_RET_INT32
+ .byte .LretInt64-.Lbase # FFI390_RET_INT64
+
+.LFE1:
+.ffi_call_SYSV_end:
+ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+
+
+ .globl ffi_closure_SYSV
+ .type ffi_closure_SYSV,%function
+ffi_closure_SYSV:
+.LFB2:
+ stmg %r14,%r15,112(%r15) # Save registers
+.LCFI10:
+ stmg %r2,%r6,16(%r15) # Save arguments
+ std %f0,128(%r15)
+ std %f2,136(%r15)
+ std %f4,144(%r15)
+ std %f6,152(%r15)
+ lgr %r1,%r15 # Set up stack frame
+ aghi %r15,-160
+.LCFI11:
+ lgr %r2,%r0 # Closure
+ la %r3,16(%r1) # GPRs
+ la %r4,128(%r1) # FPRs
+ la %r5,160(%r1) # Overflow
+ stg %r1,0(%r15) # Set up back chain
+
+ brasl %r14,ffi_closure_helper_SYSV # Call helper
+
+ lg %r14,160+112(%r15)
+ ld %f0,160+128(%r15) # Load return registers
+ lg %r2,160+16(%r15)
+ la %r15,160(%r15)
+ br %r14
+.LFE2:
+
+.ffi_closure_SYSV_end:
+ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
+
+
+
+ .section .eh_frame,"aw",@progbits
+.Lframe1:
+ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
+.LSCIE1:
+ .4byte 0x0 # CIE Identifier Tag
+ .byte 0x1 # CIE Version
+ .ascii "\0" # CIE Augmentation
+ .uleb128 0x1 # CIE Code Alignment Factor
+ .sleb128 -8 # CIE Data Alignment Factor
+ .byte 0xe # CIE RA Column
+ .byte 0xc # DW_CFA_def_cfa
+ .uleb128 0xf
+ .uleb128 0xa0
+ .align 8
+.LECIE1:
+.LSFDE1:
+ .4byte .LEFDE1-.LASFDE1 # FDE Length
+.LASFDE1:
+ .4byte .LASFDE1-.Lframe1 # FDE CIE offset
+ .8byte .LFB1 # FDE initial location
+ .8byte .LFE1-.LFB1 # FDE address range
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI0-.LFB1
+ .byte 0x8f # DW_CFA_offset, column 0xf
+ .uleb128 0x5
+ .byte 0x8e # DW_CFA_offset, column 0xe
+ .uleb128 0x6
+ .byte 0x8d # DW_CFA_offset, column 0xd
+ .uleb128 0x7
+ .byte 0x8c # DW_CFA_offset, column 0xc
+ .uleb128 0x8
+ .byte 0x8b # DW_CFA_offset, column 0xb
+ .uleb128 0x9
+ .byte 0x8a # DW_CFA_offset, column 0xa
+ .uleb128 0xa
+ .byte 0x89 # DW_CFA_offset, column 0x9
+ .uleb128 0xb
+ .byte 0x88 # DW_CFA_offset, column 0x8
+ .uleb128 0xc
+ .byte 0x87 # DW_CFA_offset, column 0x7
+ .uleb128 0xd
+ .byte 0x86 # DW_CFA_offset, column 0x6
+ .uleb128 0xe
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI1-.LCFI0
+ .byte 0xd # DW_CFA_def_cfa_register
+ .uleb128 0xb
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI2-.LCFI1
+ .byte 0xe # DW_CFA_def_cfa_offset
+ .uleb128 0xf0
+ .align 8
.LEFDE1:
+.LSFDE2:
+ .4byte .LEFDE2-.LASFDE2 # FDE Length
+.LASFDE2:
+ .4byte .LASFDE2-.Lframe1 # FDE CIE offset
+ .8byte .LFB2 # FDE initial location
+ .8byte .LFE2-.LFB2 # FDE address range
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI10-.LFB2
+ .byte 0x8f # DW_CFA_offset, column 0xf
+ .uleb128 0x5
+ .byte 0x8e # DW_CFA_offset, column 0xe
+ .uleb128 0x6
+ .byte 0x4 # DW_CFA_advance_loc4
+ .4byte .LCFI11-.LCFI10
+ .byte 0xe # DW_CFA_def_cfa_offset
+ .uleb128 0x140
+ .align 8
+.LEFDE2:
+
+#endif
diff --git a/libffi/src/types.c b/libffi/src/types.c
index 81a2be66221..8d1241de388 100644
--- a/libffi/src/types.c
+++ b/libffi/src/types.c
@@ -42,7 +42,7 @@ FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32);
FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
-#if defined ALPHA || defined SPARC64 || defined X86_64
+#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X
FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);
diff --git a/libffi/src/x86/ffi64.c b/libffi/src/x86/ffi64.c
index 3dd8cbbf315..f278a924eda 100644
--- a/libffi/src/x86/ffi64.c
+++ b/libffi/src/x86/ffi64.c
@@ -438,8 +438,6 @@ ffi_prep_cif_machdep (ffi_cif *cif)
break;
}
- puts ("prep_machdep\n");
-
return FFI_OK;
}
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 43a187d1bab..7121b4aec01 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,56 @@
+2002-10-16 Jakub Jelinek <jakub@redhat.com>
+
+ * config.table: Use mh-s390pic for s390x too.
+
+2002-10-06 Andreas Jaeger <aj@suse.de>
+
+ * libiberty/cplus-dem.c (ada_demangle): Get rid of unneeded
+ variable and of strict-aliasing warning.
+ (grow_vect): Use char as first parameter.
+
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.in (all): Fix multilib parallel build.
+
+2002-09-19 John David Anglin <dave@hiuly1.hia.nrc.ca>
+
+ * cp-demangle.c (demangling_new): Cast 0 to enum.
+ (demangle_char): Cast return of strdup to char *.
+ (is_gnu_v3_mangled_ctor): Cast 0 to enum.
+ (is_gnu_v3_mangled_dtor): Likewise.
+ * cplus-dem.c (grow_vect): Cast return of xrealloc to void *.
+ (work_stuff_copy_to_from): Cast return of xmalloc to char **.
+ * fibheap.c (fibnode_new): Cast return of xcalloc to fibnode_t.
+ * md5.c (md5_process_bytes): Cast results back to const void *.
+ (md5_process_block): Add cast to const md5_uint32 *.
+ * regex.c (re_compile_fastmap): Cast enum to UCHAR_T.
+ * safe-ctype.c (L, XL, U, XU, D, P, _, C, Z, M, V, T, S): Add cast to
+ unsigned short.
+ * splay-tree.c (splay_tree_xmalloc_allocate): Cast return of xmalloc
+ to void *.
+ * vasprintf.c (int_vasprintf): Cast return of malloc to char *.
+
+2002-09-19 Nick Clifton <nickc@redhat.com>
+
+ * README: Update email addresses for bugs and patches.
+
+2002-09-10 Mike Stump <mrs@apple.com>
+
+ * splay-tree.c (splay_tree_successor): Fix comments.
+
+2002-09-11 Zack Weinberg <zack@codesourcery.com>
+
+ * cplus-dem.c: Code under #ifdef MAIN moved to gcc/cp/cxxfilt.c.
+ * testsuite/Makefile.in: Adjust for test-demangle.
+ * testsuite/regress-demangle: Deleted.
+ * testsuite/test-demangle.c: New file.
+ * testsuite/demangle-expected: Change \$ to $ throughout, now that
+ this file is not being read by a shell script.
+
+2002-09-05 Roger Sayle <roger@eyesopen.com>
+
+ * regex.c: Only use "#pragma alloca" on AIX when not using gcc.
+
2002-08-07 DJ Delorie <dj@redhat.com>
* regex.c (re_error_msgid): Just use a simple array of strings.
@@ -9,7 +62,7 @@
2002-07-29 Neil Booth <neil@daikokuya.co.uk>
* cplus-dem.c (PREPEND_BLANK): Remove.
-
+
2002-07-10 Jason Merrill <jason@redhat.com>
* cp-demangle.c (demangle_identifier): Support extended Unicode
@@ -18,7 +71,7 @@
2002-07-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cp-demangle.c (demangle_v3_with_details): Wrap in
- !defined IN_GLIBCPP_V3.
+ !defined IN_GLIBCPP_V3.
2002-07-01 Mark Mitchell <mark@codesourcery.com>
@@ -92,7 +145,7 @@
2002-03-30 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
- * cp-demangle.c (java_demangle_v3): Don't try to release "demangled"
+ * cp-demangle.c (java_demangle_v3): Don't try to release "demangled"
if it is NULL.
2002-03-27 DJ Delorie <dj@redhat.com>
@@ -506,10 +559,10 @@ Thu Nov 15 11:06:25 2001 Jeffrey A Law (law@cygnus.com)
2001-08-22 Matt Kraai <kraai@alumni.carnegiemellon.edu>
- * fibheap.c (fibheap_init, fibnode_init): Remove.
- (fibheap_new, fibnode_new): Use xcalloc to allocate and
- initialize memory.
- (fibheap_insert): Remove check for node allocation failure.
+ * fibheap.c (fibheap_init, fibnode_init): Remove.
+ (fibheap_new, fibnode_new): Use xcalloc to allocate and
+ initialize memory.
+ (fibheap_insert): Remove check for node allocation failure.
2001-08-21 Richard Henderson <rth@redhat.com>
diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in
index 5a25987d58b..e0bb15a7519 100644
--- a/libiberty/Makefile.in
+++ b/libiberty/Makefile.in
@@ -105,7 +105,7 @@ SUBDIRS = testsuite
# FIXME: add @BUILD_INFO@ once we're sure it works for everyone.
all: stamp-picdir $(TARGETLIB) needed-list required-list all-subdir
- @$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all
+ @: $(MAKE) ; exec $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all
.PHONY: check installcheck
check: check-subdir
diff --git a/libiberty/README b/libiberty/README
index 9f5226a6b1d..e8e9b338350 100644
--- a/libiberty/README
+++ b/libiberty/README
@@ -15,7 +15,8 @@ The library must be configured from the top source directory. Don't
try to run configure in this directory. Follow the configuration
instructions in ../README.
-Please report bugs and fixes to "bug-gnu-utils@prep.ai.mit.edu". Thank you.
+Please report bugs to "gcc-bugs@gcc.gnu.org" and send fixes to
+"gcc-patches@gcc.gnu.org". Thank you.
ADDING A NEW FILE
=================
diff --git a/libiberty/config.table b/libiberty/config.table
index b9a2479aac7..df48ce99525 100644
--- a/libiberty/config.table
+++ b/libiberty/config.table
@@ -39,6 +39,7 @@ if [ "${shared}" = "yes" ]; then
powerpc*-*-aix*) ;;
powerpc*-*-*) frag=mh-ppcpic ;;
sparc*-*-*) frag=mh-sparcpic ;;
+ s390*-*-*) frag=mh-s390pic ;;
*) frag=mh-${host_cpu}pic ;;
esac
if [ -n "${frag}" ]; then
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index eece533e070..9adf5fd0503 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -835,8 +835,8 @@ demangling_new (name, style)
return NULL;
}
dm->style = style;
- dm->is_constructor = 0;
- dm->is_destructor = 0;
+ dm->is_constructor = (enum gnu_v3_ctor_kinds) 0;
+ dm->is_destructor = (enum gnu_v3_dtor_kinds) 0;
return dm;
}
@@ -974,7 +974,7 @@ demangle_char (dm, c)
else
{
if (error_message == NULL)
- error_message = strdup ("Expected ?");
+ error_message = (char *) strdup ("Expected ?");
error_message[9] = c;
return error_message;
}
@@ -3974,7 +3974,7 @@ is_gnu_v3_mangled_ctor (name)
return result;
}
else
- return 0;
+ return (enum gnu_v3_ctor_kinds) 0;
}
@@ -3996,7 +3996,7 @@ is_gnu_v3_mangled_dtor (name)
return result;
}
else
- return 0;
+ return (enum gnu_v3_dtor_kinds) 0;
}
#endif /* IN_GLIBCPP_V3 */
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index 995757c62de..f42d6181d40 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -514,7 +514,7 @@ recursively_demangle PARAMS ((struct work_stuff *, const char **, string *,
int));
static void
-grow_vect PARAMS ((void **, size_t *, size_t, int));
+grow_vect PARAMS ((char **, size_t *, size_t, int));
/* Translate count to integer, consuming tokens in the process.
Conversion terminates on the first non-digit character.
@@ -936,7 +936,7 @@ cplus_demangle (mangled, options)
static void
grow_vect (old_vect, size, min_size, element_size)
- void **old_vect;
+ char **old_vect;
size_t *size;
size_t min_size;
int element_size;
@@ -946,7 +946,7 @@ grow_vect (old_vect, size, min_size, element_size)
*size *= 2;
if (*size < min_size)
*size = min_size;
- *old_vect = xrealloc (*old_vect, *size * element_size);
+ *old_vect = (void *) xrealloc (*old_vect, *size * element_size);
}
}
@@ -969,8 +969,7 @@ ada_demangle (mangled, option)
char *demangled = NULL;
int at_start_name;
int changed;
- char *demangling_buffer = NULL;
- size_t demangling_buffer_size = 0;
+ size_t demangled_size = 0;
changed = 0;
@@ -998,10 +997,9 @@ ada_demangle (mangled, option)
}
/* Make demangled big enough for possible expansion by operator name. */
- grow_vect ((void **) &(demangling_buffer),
- &demangling_buffer_size, 2 * len0 + 1,
+ grow_vect (&demangled,
+ &demangled_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)
@@ -1051,10 +1049,10 @@ ada_demangle (mangled, option)
return demangled;
Suppress:
- grow_vect ((void **) &(demangling_buffer),
- &demangling_buffer_size, strlen (mangled) + 3,
+ grow_vect (&demangled,
+ &demangled_size, strlen (mangled) + 3,
sizeof (char));
- demangled = demangling_buffer;
+
if (mangled[0] == '<')
strcpy (demangled, mangled);
else
@@ -1206,7 +1204,7 @@ work_stuff_copy_to_from (to, from)
if (from->ntmpl_args)
to->tmpl_argvec
- = xmalloc (from->ntmpl_args * sizeof (to->tmpl_argvec[0]));
+ = (char **) xmalloc (from->ntmpl_args * sizeof (to->tmpl_argvec[0]));
for (i = 0; i < from->ntmpl_args; i++)
{
@@ -4878,337 +4876,3 @@ string_append_template_idx (s, idx)
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
- prints the result on stdout. */
-
-#ifdef MAIN
-
-#include "getopt.h"
-
-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)) ATTRIBUTE_NORETURN;
-static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN;
-static void print_demangler_list PARAMS ((FILE *));
-
-static void
-demangle_it (mangled_name)
- char *mangled_name;
-{
- char *result;
-
- /* 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);
- }
- else
- {
- printf ("%s\n", result);
- free (result);
- }
-}
-
-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] [--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);
-}
-
-#define MBUF_SIZE 32767
-char mbuffer[MBUF_SIZE];
-
-/* Defined in the automatically-generated underscore.c. */
-extern int prepends_underscore;
-
-int strip_underscore = 0;
-
-static const struct option long_options[] = {
- {"strip-underscores", no_argument, 0, '_'},
- {"format", required_argument, 0, 's'},
- {"help", no_argument, 0, 'h'},
- {"no-strip-underscores", no_argument, 0, 'n'},
- {"version", no_argument, 0, 'v'},
- {0, no_argument, 0, 0}
-};
-
-/* More 'friendly' abort that prints the line and file.
- config.h can #define abort fancy_abort if you like that sort of thing. */
-
-void
-fancy_abort ()
-{
- fatal ("Internal gcc 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. */
-
-static const char *
-standard_symbol_characters ()
-{
- return "_$.";
-}
-
-
-/* Return the string of non-alnum characters that may occur
- as a valid symbol name component in an HP object file.
-
- Note that, since HP's compiler generates object code straight from
- C++ source, without going through an assembler, its mangled
- identifiers can use all sorts of characters that no assembler would
- tolerate, so the alphabet this function creates is a little odd.
- Here are some sample mangled identifiers offered by HP:
-
- typeid*__XT24AddressIndExpClassMember_
- [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
- __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
-
- This still seems really weird to me, since nowhere else in this
- file is there anything to recognize curly brackets, parens, etc.
- I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me
- this is right, but I still strongly suspect that there's a
- misunderstanding here.
-
- If we decide it's better for c++filt to use HP's assembler syntax
- to scrape identifiers out of its input, here's the definition of
- the symbol name syntax from the HP assembler manual:
-
- Symbols are composed of uppercase and lowercase letters, decimal
- digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
- underscore (_). A symbol can begin with a letter, digit underscore or
- dollar sign. If a symbol begins with a digit, it must contain a
- non-digit character.
-
- So have fun. */
-static const char *
-hp_symbol_characters ()
-{
- return "_$.<>#,*&[]:(){}";
-}
-
-
-/* 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;
- char **argv;
-{
- char *result;
- int c;
- 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:", long_options, (int *) 0)) != EOF)
- {
- switch (c)
- {
- case '?':
- usage (stderr, 1);
- break;
- case 'h':
- usage (stdout, 0);
- case 'n':
- strip_underscore = 0;
- break;
- case 'v':
- printf ("GNU %s (C++ demangler), version %s\n", program_name, program_version);
- return (0);
- case '_':
- strip_underscore = 1;
- break;
- case 's':
- {
- 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;
- }
- }
-
- if (optind < argc)
- {
- for ( ; optind < argc; optind++)
- {
- demangle_it (argv[optind]);
- }
- }
- else
- {
- switch (current_demangling_style)
- {
- 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
- question to go unconsidered. */
- abort ();
- }
-
- for (;;)
- {
- int i = 0;
- c = getchar ();
- /* Try to read a label. */
- while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
- {
- if (i >= MBUF_SIZE-1)
- break;
- mbuffer[i++] = c;
- c = getchar ();
- }
- if (i > 0)
- {
- int skip_first = 0;
-
- if (mbuffer[0] == '.' || mbuffer[0] == '$')
- ++skip_first;
- if (strip_underscore && mbuffer[skip_first] == '_')
- ++skip_first;
-
- if (skip_first > i)
- skip_first = i;
-
- mbuffer[i] = 0;
- flags |= (int) style;
- result = cplus_demangle (mbuffer + skip_first, flags);
- if (result)
- {
- if (mbuffer[0] == '.')
- putc ('.', stdout);
- fputs (result, stdout);
- free (result);
- }
- else
- fputs (mbuffer, stdout);
-
- fflush (stdout);
- }
- if (c == EOF)
- break;
- putchar (c);
- fflush (stdout);
- }
- }
-
- return (0);
-}
-
-static void
-fatal (str)
- const char *str;
-{
- fprintf (stderr, "%s: %s\n", program_name, str);
- exit (1);
-}
-
-PTR
-xmalloc (size)
- size_t size;
-{
- register PTR value = (PTR) malloc (size);
- if (value == 0)
- fatal ("virtual memory exhausted");
- return value;
-}
-
-PTR
-xrealloc (ptr, size)
- PTR ptr;
- size_t size;
-{
- register PTR value = (PTR) realloc (ptr, size);
- if (value == 0)
- fatal ("virtual memory exhausted");
- return value;
-}
-#endif /* main */
diff --git a/libiberty/fibheap.c b/libiberty/fibheap.c
index 0ba9b8d6b0a..36062d451a2 100644
--- a/libiberty/fibheap.c
+++ b/libiberty/fibheap.c
@@ -66,7 +66,7 @@ fibnode_new ()
{
fibnode_t node;
- node = xcalloc (1, sizeof *node);
+ node = (fibnode_t) xcalloc (1, sizeof *node);
node->left = node;
node->right = node;
diff --git a/libiberty/md5.c b/libiberty/md5.c
index 9450586961f..2e829fb3ee1 100644
--- a/libiberty/md5.c
+++ b/libiberty/md5.c
@@ -229,7 +229,7 @@ md5_process_bytes (buffer, len, ctx)
ctx->buflen = (left_over + add) & 63;
}
- buffer = (const char *) buffer + add;
+ buffer = (const void *) ((const char *) buffer + add);
len -= add;
}
@@ -237,7 +237,7 @@ md5_process_bytes (buffer, len, ctx)
if (len > 64)
{
md5_process_block (buffer, len & ~63, ctx);
- buffer = (const char *) buffer + (len & ~63);
+ buffer = (const void *) ((const char *) buffer + (len & ~63));
len &= 63;
}
@@ -269,7 +269,7 @@ md5_process_block (buffer, len, ctx)
struct md5_ctx *ctx;
{
md5_uint32 correct_words[16];
- const md5_uint32 *words = buffer;
+ const md5_uint32 *words = (const md5_uint32 *) buffer;
size_t nwords = len / sizeof (md5_uint32);
const md5_uint32 *endp = words + nwords;
md5_uint32 A = ctx->A;
diff --git a/libiberty/regex.c b/libiberty/regex.c
index a83cda05527..f9d9a4e26dc 100644
--- a/libiberty/regex.c
+++ b/libiberty/regex.c
@@ -25,7 +25,7 @@
routines with an "x" prefix so they do not collide with the native regex
routines or with other components regex routines. */
/* AIX requires this to be the first thing in the file. */
-#if defined _AIX && !defined REGEX_MALLOC
+#if defined _AIX && !defined __GNUC__ && !defined REGEX_MALLOC
#pragma alloca
#endif
@@ -4648,7 +4648,7 @@ PREFIX(re_compile_fastmap) (bufp)
while (1)
{
- if (p == pend || *p == succeed)
+ if (p == pend || *p == (UCHAR_T) succeed)
{
/* We have reached the (effective) end of pattern. */
if (!FAIL_STACK_EMPTY ())
diff --git a/libiberty/safe-ctype.c b/libiberty/safe-ctype.c
index 0c2be3ed795..3bac84bf68a 100644
--- a/libiberty/safe-ctype.c
+++ b/libiberty/safe-ctype.c
@@ -48,20 +48,20 @@ Boston, MA 02111-1307, USA. */
#define xd _sch_isxdigit
/* Masks. */
-#define L lo|is |pr /* lower case letter */
-#define XL lo|is|xd|pr /* lowercase hex digit */
-#define U up|is |pr /* upper case letter */
-#define XU up|is|xd|pr /* uppercase hex digit */
-#define D di |xd|pr /* decimal digit */
-#define P pn |pr /* punctuation */
-#define _ pn|is |pr /* underscore */
-
-#define C cn /* control character */
-#define Z nv |cn /* NUL */
-#define M nv|sp |cn /* cursor movement: \f \v */
-#define V vs|sp |cn /* vertical space: \r \n */
-#define T nv|sp|bl|cn /* tab */
-#define S nv|sp|bl|pr /* space */
+#define L (const unsigned short) (lo|is |pr) /* lower case letter */
+#define XL (const unsigned short) (lo|is|xd|pr) /* lowercase hex digit */
+#define U (const unsigned short) (up|is |pr) /* upper case letter */
+#define XU (const unsigned short) (up|is|xd|pr) /* uppercase hex digit */
+#define D (const unsigned short) (di |xd|pr) /* decimal digit */
+#define P (const unsigned short) (pn |pr) /* punctuation */
+#define _ (const unsigned short) (pn|is |pr) /* underscore */
+
+#define C (const unsigned short) ( cn) /* control character */
+#define Z (const unsigned short) (nv |cn) /* NUL */
+#define M (const unsigned short) (nv|sp |cn) /* cursor movement: \f \v */
+#define V (const unsigned short) (vs|sp |cn) /* vertical space: \r \n */
+#define T (const unsigned short) (nv|sp|bl|cn) /* tab */
+#define S (const unsigned short) (nv|sp|bl|pr) /* space */
/* Are we ASCII? */
#if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
diff --git a/libiberty/splay-tree.c b/libiberty/splay-tree.c
index 7999447bc11..6f90fde05fb 100644
--- a/libiberty/splay-tree.c
+++ b/libiberty/splay-tree.c
@@ -234,7 +234,7 @@ splay_tree_xmalloc_allocate (size, data)
int size;
void *data ATTRIBUTE_UNUSED;
{
- return xmalloc (size);
+ return (void *) xmalloc (size);
}
static void
@@ -482,7 +482,7 @@ splay_tree_predecessor (sp, key)
}
/* Return the immediate successor KEY, or NULL if there is no
- predecessor. KEY need not be present in the tree. */
+ successor. KEY need not be present in the tree. */
splay_tree_node
splay_tree_successor (sp, key)
@@ -492,7 +492,7 @@ splay_tree_successor (sp, key)
int comparison;
splay_tree_node node;
- /* If the tree is empty, there is certainly no predecessor. */
+ /* If the tree is empty, there is certainly no successor. */
if (!sp->root)
return NULL;
diff --git a/libiberty/testsuite/Makefile.in b/libiberty/testsuite/Makefile.in
index 9d4ddd0ef1e..515dcd56b7e 100644
--- a/libiberty/testsuite/Makefile.in
+++ b/libiberty/testsuite/Makefile.in
@@ -1,6 +1,6 @@
#
# Makefile
-# Copyright (C) 1999
+# Copyright (C) 1999, 2002
# Free Software Foundation
#
# This file is part of the libiberty library.
@@ -45,31 +45,25 @@ all:
check: @CHECK@
# Run some tests of the demangler.
-check-cplus-dem: test-filter $(srcdir)/demangle-expected
- $(SHELL) $(srcdir)/regress-demangle $(srcdir)/demangle-expected
+check-cplus-dem: test-demangle $(srcdir)/demangle-expected
+ ./test-demangle < $(srcdir)/demangle-expected
-# Note that we just hard-code prepends_underscore to 0. This doesn't
-# matter since any particular test can override the default if need
-# be.
TEST_COMPILE = $(CC) @DEFS@ $(LIBCFLAGS) -I.. -I$(INCDIR) $(HDEFINES)
-test-filter: $(srcdir)/../cplus-dem.c
- echo 'int prepends_underscore = 0;' > test-us.c
- $(TEST_COMPILE) -o test-filter -DMAIN -DVERSION='"none"' @DEFS@ \
- $(srcdir)/../cplus-dem.c test-us.c -L.. -liberty
-
+test-demangle: $(srcdir)/test-demangle.c
+ $(TEST_COMPILE) -o test-demangle \
+ $(srcdir)/test-demangle.c ../libiberty.a
# Standard (either GNU or Cygnus) rules we don't use.
info install-info clean-info dvi install etags tags installcheck:
# The standard clean rules.
mostlyclean:
- rm -f test-us.c test-filter
+ rm -f test-demangle
clean: mostlyclean
distclean: clean
rm -f Makefile
maintainer-clean realclean: distclean
-
Makefile: $(srcdir)/Makefile.in ../config.status
CONFIG_FILES=testsuite/Makefile CONFIG_HEADERS= \
cd .. && $(SHELL) ./config.status
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index ecdd732c370..c0483188239 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -127,31 +127,31 @@ VOrder__9ivTSolverUiRP12ivInteractorT2
ivTSolver::VOrder(unsigned int, ivInteractor *&, ivInteractor *&)
#
--format=gnu
-_10PageButton\$__both
+_10PageButton$__both
PageButton::__both
#
--format=gnu
-_3RNG\$singleMantissa
+_3RNG$singleMantissa
RNG::singleMantissa
#
--format=gnu
-_5IComp\$_release
+_5IComp$_release
IComp::_release
#
--format=gnu
-_\$_10BitmapComp
+_$_10BitmapComp
BitmapComp::~BitmapComp(void)
#
--format=gnu
-_\$_9__io_defs
+_$_9__io_defs
__io_defs::~__io_defs(void)
#
--format=gnu
-_\$_Q23foo3bar
+_$_Q23foo3bar
foo::bar::~bar(void)
#
--format=gnu
-_\$_Q33foo3bar4bell
+_$_Q33foo3bar4bell
foo::bar::bell::~bell(void)
#
--format=gnu
@@ -435,11 +435,11 @@ _vt.foo.bar
foo::bar virtual table
#
--format=gnu
-_vt\$foo
+_vt$foo
foo virtual table
#
--format=gnu
-_vt\$foo\$bar
+_vt$foo$bar
foo::bar virtual table
#
--format=gnu
@@ -647,11 +647,11 @@ zero__8osMemoryPvUi
osMemory::zero(void *, unsigned int)
#
--format=gnu
-_2T4\$N
+_2T4$N
T4::N
#
--format=gnu
-_Q22T42t1\$N
+_Q22T42t1$N
T4::t1::N
#
--format=gnu
@@ -727,11 +727,11 @@ __t6vector1Zii
vector<int>::vector(int)
#
--format=gnu
-_\$_t6vector1Zdi
+_$_t6vector1Zdi
vector<double>::~vector(int)
#
--format=gnu
-_\$_t6vector1Zii
+_$_t6vector1Zii
vector<int>::~vector(int)
#
--format=gnu
@@ -827,11 +827,11 @@ next__Ct4List1Z10VHDLEntityRQ2t4List1Z10VHDLEntity3Pix
List<VHDLEntity>::next(List<VHDLEntity>::Pix &) const
#
--format=gnu
-_GLOBAL_\$D\$set
+_GLOBAL_$D$set
global destructors keyed to set
#
--format=gnu
-_GLOBAL_\$I\$set
+_GLOBAL_$I$set
global constructors keyed to set
#
--format=gnu
@@ -875,7 +875,7 @@ __t8BDDHookV1ZPcRCPc
BDDHookV<char *>::BDDHookV(char *const &)
#
--format=gnu
-_vt\$t8BDDHookV1ZPc
+_vt$t8BDDHookV1ZPc
BDDHookV<char *> virtual table
#
--format=gnu
@@ -2564,7 +2564,7 @@ _27_GLOBAL_.N.__12burst_app_ct.app_instance
{anonymous}::app_instance
#
--format=gnu
-_26_GLOBAL_\$N\$_tmp_n.iilg4Gya\$app_instance
+_26_GLOBAL_$N$_tmp_n.iilg4Gya$app_instance
{anonymous}::app_instance
#
--format=java
diff --git a/libiberty/testsuite/regress-demangle b/libiberty/testsuite/regress-demangle
deleted file mode 100755
index 303dda54e0c..00000000000
--- a/libiberty/testsuite/regress-demangle
+++ /dev/null
@@ -1,30 +0,0 @@
-#! /bin/sh
-
-# Run a regression test for the demangler.
-# Usage: regress-demangle TEST-FILE
-
-failures=0
-count=0
-sed -e '/^#/ d' "$1" | (
- while read type; do
- read mangled
- read demangled
-
- x="`./test-filter $type $mangled`"
- count=`expr $count + 1`
- if test "x$x" != "x$demangled"; then
- failures=`expr $failures + 1`
- echo "FAIL: $type $mangled"
- echo " result: $x"
- echo " expected: $demangled"
- fi
- done
-
- if test $failures -eq 0; then
- echo "All $count tests passed"
- else
- echo "$failures of $count tests failed"
- fi
-
- test $failures -eq 0
-)
diff --git a/libiberty/testsuite/test-demangle.c b/libiberty/testsuite/test-demangle.c
new file mode 100644
index 00000000000..82f263e88af
--- /dev/null
+++ b/libiberty/testsuite/test-demangle.c
@@ -0,0 +1,175 @@
+/* Demangler test program,
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Written by Zack Weinberg <zack@codesourcery.com
+
+ This file is part of GNU libiberty.
+
+ 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.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "ansidecl.h"
+#include <stdio.h>
+#include "libiberty.h"
+#include "demangle.h"
+
+struct line
+{
+ size_t alloced;
+ char *data;
+};
+
+static unsigned int lineno;
+
+/* Safely read a single line of arbitrary length from standard input. */
+
+#define LINELEN 80
+
+static void
+getline(buf)
+ struct line *buf;
+{
+ char *data = buf->data;
+ size_t alloc = buf->alloced;
+ size_t count = 0;
+ int c;
+
+ if (data == 0)
+ {
+ data = xmalloc (LINELEN);
+ alloc = LINELEN;
+ }
+
+ /* Skip comment lines. */
+ while ((c = getchar()) == '#')
+ {
+ while ((c = getchar()) != EOF && c != '\n');
+ lineno++;
+ }
+
+ /* c is the first character on the line, and it's not a comment
+ line: copy this line into the buffer and return. */
+ while (c != EOF && c != '\n')
+ {
+ if (count >= alloc)
+ {
+ alloc *= 2;
+ data = xrealloc (data, alloc);
+ }
+ data[count++] = c;
+ c = getchar();
+ }
+ lineno++;
+ data[count] = '\0';
+
+ buf->data = data;
+ buf->alloced = alloc;
+}
+
+/* The tester operates on a data file consisting of triples of lines:
+ format switch
+ input to be demangled
+ expected output
+
+ The format switch is expected to be either the empty string, a
+ line of the form --format=<name>, or just <name> by itself. */
+
+#define FORMATS "--format="
+#define FORMATL (sizeof FORMATS - 1)
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ enum demangling_styles style;
+ struct line format;
+ struct line input;
+ struct line expect;
+ char *fstyle;
+ char *result;
+ int failures = 0;
+ int tests = 0;
+
+ if (argc > 1)
+ {
+ fprintf (stderr, "usage: %s < test-set\n", argv[0]);
+ return 2;
+ }
+
+ format.data = 0;
+ input.data = 0;
+ expect.data = 0;
+
+ for (;;)
+ {
+ getline (&format);
+ if (feof (stdin))
+ break;
+
+ getline (&input);
+ getline (&expect);
+
+ tests++;
+
+ fstyle = format.data;
+ if (!strncmp (fstyle, FORMATS, FORMATL))
+ fstyle += FORMATL;
+
+ if (fstyle[0] == '\0')
+ style = auto_demangling;
+ else
+ style = cplus_demangle_name_to_style (fstyle);
+
+ if (style == unknown_demangling)
+ {
+ printf ("FAIL at line %d: unknown demangling style %s\n",
+ lineno, fstyle);
+ failures++;
+ continue;
+ }
+
+ cplus_demangle_set_style (style);
+
+ result = cplus_demangle (input.data,
+ DMGL_PARAMS|DMGL_ANSI|DMGL_VERBOSE|DMGL_TYPES);
+
+ if (result
+ ? strcmp (result, expect.data)
+ : strcmp (input.data, expect.data))
+ {
+ printf ("\
+FAIL at line %d, style %s:\n\
+in: %s\n\
+out: %s\n\
+exp: %s\n",
+ lineno, fstyle,
+ input.data,
+ result,
+ expect.data);
+ failures++;
+ }
+ free (result);
+ }
+
+ free (format.data);
+ free (input.data);
+ free (expect.data);
+
+ printf ("%s: %d tests, %d failures\n", argv[0], tests, failures);
+ return failures ? 1 : 0;
+}
diff --git a/libiberty/vasprintf.c b/libiberty/vasprintf.c
index d438225fc1e..aa20e5bff00 100644
--- a/libiberty/vasprintf.c
+++ b/libiberty/vasprintf.c
@@ -138,7 +138,7 @@ int_vasprintf (result, format, args)
#ifdef TEST
global_total_width = total_width;
#endif
- *result = malloc (total_width);
+ *result = (char *) malloc (total_width);
if (*result != NULL)
return vsprintf (*result, format, *args);
else
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 2d8e5931f72..ec7030bdf3d 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,1123 @@
+2002-10-21 Michael Koch <konqueror@gmx.de>
+
+ * java/net/URL.java
+ (URL): Activate SecurityManager checks.
+ (equals): Use URLStreamHandler implementation instead of doing it
+ alone. This allows special protocol stream handlers to change default
+ behaviour.
+ (hashCode): Use URLStreamHandler implementation instead of doing it
+ alone. This allows special protocol stream handlers to change default
+ behaviour.
+ * java/net/URLStreamHandler.java
+ (equals): Implemented default URL equality check.
+ (hostsEqual): Implemented default URL equality check.
+ (hashCode): Implemented default URL hashCode algorithm.
+ * java/net/natPlainDatagramSocketImpl.cc:
+ No lines longer then 80 characters.
+
+2002-10-20 Adam Megacz <adam@xwt.org>
+
+ * aclocal.m4 (CHECK_FOR_BROKEN_MINGW_LD): added
+ * configure.in: enabled hash sync on Win32
+ * include/win32-threads.h (_Jv_ThreadId_t): added.
+ * java/lang/natObject.cc (_Jv_MonitorEnter, _Jv_MonitorExit,
+ heavy_lock_obj_finalization_proc, wait, notify, notifyAll):
+ removed some posix-isms, use Thread::sleep() instead of usleep,
+ added code to clear bottom three bits if platform has a broken
+ linker. * include/win32-threads.h (_Jv_ThreadId_t): added.
+
+2002-10-19 Ranjit Mathew <rmathew@hotmail.com>
+
+ * java/lang/natRuntime.cc (insertSystemProperties): Added GCJ
+ runtime property "gnu.gcj.progname" containing the name used to
+ invoke the current Java program (similar to argv[0] for C
+ programs).
+
+2002-10-15 Tom Tromey <tromey@redhat.com>
+
+ Fix for PR libgcj/8234:
+ * java/util/zip/natInflater.cc (reset): Reset avail_in.
+ * java/util/zip/natDeflater.cc (reset): Reset avail_in.
+
+2002-10-13 Mark Wielaard <mark@klomp.org>
+
+ * mauve-libgcj: Enable Mauve tests that compile now.
+
+2002-10-11 Mark Wielaard <mark@klomp.org>
+
+ Fix for PR libgcj/8142
+ * java/lang/natClassLoader.cc (findClass): Skip inner classes when
+ loading native modules.
+
+2002-10-10 Michael Koch <konqueror@gmx.de>
+
+ * javax/swing/AbstractListModel.java
+ (getListDataListeners): New stubbed method.
+ javax/swing/DefaultBoundedRangeModel.java
+ (getChangeListeners): New stubbed method.
+ javax/swing/DefaultSingleSelectionModel.java
+ (getChangeListeners): New stubbed method.
+
+2002-10-10 Michael Koch <konqueror@gmx.de>
+
+ * gcj/.cvsignore: New file to ignore files generated during build.
+ * include/.cvsignore: New file to ignore files generated during build.
+
+2002-10-10 Michael Koch <konqueror@gmx.de>
+
+ * java/net/HttpURLConnection.java
+ (getPermission): New method.
+ (getErrorStream): New stub method.
+ (getHeaderFieldDate): New stub method.
+ * java/net/Inet4Address.java:
+ (isLinkLocalAddress): Typo fixed.
+ * java/net/InetAddress.java:
+ (readResolve): New stubbed method (for serialization).
+ (isAnyLocalAddress): New stubbed method.
+ (isLoopbackAddress): New stubbed method.
+ (isLinkLocalAddress): New stubbed method.
+ (isSiteLocalAddress): New stubbed method.
+ (isMCGlobal): New stubbed method.
+ (isMCNodeGlobal): New stubbed method.
+ (isMCLinkLocal): New stubbed method.
+ (isMCSiteLocal): New stubbed method.
+ (isMCOrgLocal): New stubbed method.
+ (getCanonicalHostName): New stubbed method.
+ (getByAddress): Create instances of Inet4Address/Inet6Address,
+ instead of InetAddress, documentation added.
+ * java/net/MulticastSocket.java
+ (getInterface): Removed FIXME.
+ (getNetworkInterface): New method.
+ (setNetworkInterface): New method.
+ * java/net/NetworkInterface.java:
+ (toString): Use property "line.separator" instead of "\n".
+ * java/net/URLConnection.java
+ (getContent): New stubbed method.
+ * java/net/URLStreamHandler.java:
+ (equals): New stubbed method.
+ (hostsEqual): New stubbed method.
+ (hashCode): New stubbed method.
+ * java/net/natNetworkInterface.cc:
+ (getRealNetworkInterfaces): Create Inet4Address object
+ instead of InetAddress.
+
+2002-10-08 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * interpret.cc (_Jv_InterpMethod::run): Use UINT32 instead of
+ unsigned long temporary to implement insn_iushr shifts.
+
+2002-10-08 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * configure.host [s390*-*]: Enable Java interpreter.
+ Enable hash synchronization. Add sysdeps dir.
+ * sysdep/s390/locks.h: New file.
+
+2002-10-06 Mark Wielaard <mark@klomp.org>
+
+ * java/lang/Thread.java (setDaemon): Check startable_flag,
+ not isAlive().
+
+2002-10-07 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/Buffer.java: New stub file.
+ * java/nio/charset/spi/CharsetProvider.java: Commented out all usages
+ of class Charset.
+ * Makefile.am (java_native_source_files): Added java/nio/Buffer.java.
+ * Makefile.in: Regenerated.
+
+2002-10-07 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/ByteBuffer.java:
+ removed import of not commited class.
+
+2002-10-07 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/ByteBuffer.java,
+ java/nio/MappedByteBuffer.java:
+ New files, forgot to add these dummies.
+ * Makefile.am (java_native_source_files): Added new files.
+ * Makefile.in: Regenerated.
+
+2002-10-07 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/channels/AlreadyConnectedException.java,
+ java/nio/channels/ClosedChannelException.java,
+ java/nio/channels/ReadableByteChannel.java,
+ java/nio/channels/InterruptibleChannel.java,
+ java/nio/channels/Channel.java,
+ java/nio/channels/ByteChannel.java,
+ java/nio/channels/GatheringByteChannel.java,
+ java/nio/channels/ScatteringByteChannel.java,
+ java/nio/channels/WritableByteChannel.java,
+ java/nio/charset/CharacterCodingException.java,
+ java/nio/charset/IllegalCharsetNameException.java,
+ java/nio/charset/MalformedInputException.java,
+ java/nio/charset/UnmappableCharacterException.java,
+ java/nio/charset/UnsupportedCharsetException.java,
+ java/nio/charset/spi/CharsetProvider.java: New file.
+ These files are exceptions or interfaces,
+ no real or abstract classes.
+ * Makefile.am (java_native_source_files): Added new files.
+ * Makefile.in: Regenerated.
+
+2002-10-05 Michael Koch <konqueror@gmx.de>
+
+ * java/net/InetAddress.java
+ (getByAddress): Fixed documentation.
+ (getByAddress): New method.
+ * java/net/Inet4Address.java: New file.
+ * java/net/URL.java
+ (URL): Documentation added.
+ (getContent): Documentation added.
+ (getContent): New stubbed method.
+ (getQuery): New method.
+ (openConnection): Documentation added.
+ (openStream): Documentation added.
+ (setURLStreamHandlerFactory): Documentation added.
+ * java/net/URI.java: New stub file.
+ * Makefile.am
+ (java_native_source_files): Added java/net/Inet4Address.java,
+ java/net/Inet6Address.java and java/net/URI.java.
+ * Makefile.in: Regenerated.
+
+2002-10-04 C. Scott Ananian <cananian@lesser-magoo.lcs.mit.edu>
+
+ * java/lang/ProtectionDomain.java (linesep): Remove field.
+ (toString): Use System.getProperty("line.separator").
+
+2002-10-04 Michael Koch <konqueror@gmx.de>
+
+ * java/security/Identity.java: Added serialVersionUID.
+ * java/security/KeyPair.java: Added serialVersionUID.
+ * java/security/Provider.java: Added serialVersionUID.
+ * java/security/SecureRandom.java: Added serialVersionUID.
+ * java/security/SecureRandomSpi.java: Added serialVersionUID.
+ * java/security/SignedObject.java: Added serialVersionUID.
+ * java/security/cert/Certificate.java: Added serialVersionUID.
+
+2002-10-04 Mark Wielaard <mark@klomp.org>
+
+ * java/security/Security.java: Use java.home or gnu.classpath.home
+ to load providers.
+ (loadProviders): Extra dir argument.
+ (getProvider): Return null when not found.
+
+2002-10-04 Mark Wielaard <mark@klomp.org>
+
+ * java/lang/Throwable.java: Remerge with Classpath.
+
+2002-10-04 Michael Koch <konqueror@gmx.de>
+
+ * java/net/InetAddress.java:
+ (isMulticastAddress): Added documentation.
+ (getHostAddress): Added documentation.
+ (toString): Added documentation.
+ (getByAddress): Fixed documentation.
+ (getByName): Added documentation.
+ (getAllByName): Added documentation.
+ (getLocalHost): Added documentation.
+
+2002-10-04 Michael Koch <konqueror@gmx.de>
+
+ * java/beans/beancontext/BeanContextChildSupport.java:
+ Added serialVersionUID.
+ * java/text/Collator.java: (compare): Made documentation HTML-aware.
+ * javax/naming/BinaryRefAddr.java: Added serialVersionUID.
+ * javax/naming/Name.java: Added serialVersionUID.
+
+2002-10-03 Adam Megacz <adam@xwt.org>
+
+ * natNetworkInterface.cc (getRealNetworkInterfaces): ifdef out
+ some functionality that isn't supported yet on WIN32.
+
+2002-10-03 Tom Tromey <tromey@redhat.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (awt_java_source_files): Added new files.
+
+2002-10-03 Michael Koch <konqueror@gmx.de>
+
+ * java/net/InetAddress.java
+ (class InetAddress): Removed final keyword.
+ (equals): Fixed typo.
+ (getByAddress): New method.
+
+2002-10-03 Michael Koch <konqueror@gmx.de>
+
+ * java/awt/dnd/Autoscroll.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DragSourceAdapter.java:
+ (dragExit): Fixed typos in argument type.
+ (dragDropEnd): Fixed typos in argument type.
+ * java/awt/dnd/DragSourceDropEvent.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DropTarget.java:
+ Added stubs, merge from Classpath.
+ * java/awt/dnd/DropTargetAdapter.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DropTargetContext.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DropTargetDragEvent.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DropTargetDropEvent.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DropTargetEvent.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/DropTargetListener.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/MouseDragGestureRecognizer.java:
+ New file, merge from Classpath.
+ * java/awt/dnd/peer/DropTargetContextPeer.java:
+ New file, merge from Classpath.
+
+2002-10-03 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramPacket.java
+ (setLength): Fixed typo and be HTML-aware.
+ * java/net/InetSocketAddress.java
+ (InetSocketAddress): Correct initialization of hostname, fixed typo.
+ (equals): Added comment about equality of InetSocketAddress objects.
+ * java/net/ServerSocket.java
+ (accept): Added checks.
+ (isClosed): New stubbed method.
+ * java/net/SocketOptions.java: Reindention.
+ * java/net/SocketPermission
+ (SocketPermission): Documentation fixed.
+
+2002-10-03 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramSocket.java
+ (receive): Check with SecurityManager AFTER the packet is received,
+ check if connected to multicast address, documentation added.
+ (send): Only check SecurityManager if connected, check address of
+ packet to send.
+ (connect): Implemented, documentation added.
+ * java/net/Inet6Address.java: New file (not added yet to Makefile.am).
+ * java/net/InetSocketAddress.java
+ (whole file): Reindented.
+ (hostname): New attribute.
+ (InetSocketAddress): Initialize new attribute.
+ (getAddress): Documentation added.
+ (getHostName): Documentation added.
+ (getPort): Documentation added.
+ (hashCode): Documentation added.
+ (isUnresolved): Documentation added.
+ (toString): Conform to output of JDK 1.4.1, documentation added.
+ * java/net/MulticastSocket.java
+ (joinGroup): Removed FIXME, documentation added.
+ (leaveGroup): Removed FIXME, documentation added.
+ (send): Documentation added.
+ * java/net/Socket.java
+ (inputShutdown): New variable.
+ (outputShutdown): New variable.
+ (Socket): Initialize new variables.
+ (getRemoteSocketAddress): Check if connected.
+ (shutdownInput): Set new variable.
+ (shutdownOutput): Set new variable.
+ (isConnected): New method.
+ (isClosed): New method.
+ (isInputShutdown): New method.
+ (isOutputShutdown): New method.
+ * java/net/URLStreamHandler.java
+ (URLStreamHandler): New method.
+ (openConnection): Added documentation.
+ (parseURL): Added documentation.
+ (getHostAddress): New method.
+ (getDefaultPort): New method.
+
+2002-10-02 Tom Tromey <tromey@redhat.com>
+
+ * java/rmi/activation/ActivationDesc.java,
+ java/rmi/activation/ActivationGroupDesc.java,
+ java/rmi/activation/ActivationGroupID.java,
+ java/rmi/activation/ActivationID.java: New versions from
+ Classpath.
+
+2002-09-30 Bo Thorsen <bo@suse.de>
+
+ * sysdep/x86-64/locks.h (compare_and_swap): Fix multilib support.
+
+2002-09-30 Tom Tromey <tromey@redhat.com>
+
+ * java/io/ObjectInputStream.java (resolveProxyClass): New method
+ from Classpath.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (rmi_java_source_files): Added new files.
+ * gnu/java/rmi/RMIMarshalledObjectInputStream.java,
+ gnu/java/rmi/RMIMarshalledObjectOutputStream.java,
+ gnu/java/rmi/server/ConnectionRunnerPool.java: New files from
+ Classpath.
+ * gnu/java/rmi/dgc/DGCImpl.java,
+ gnu/java/rmi/dgc/DGCImpl_Skel.java,
+ gnu/java/rmi/dgc/DGCImpl_Stub.java,
+ gnu/java/rmi/registry/RegistryImpl_Skel.java,
+ gnu/java/rmi/registry/RegistryImpl_Stub.java,
+ gnu/java/rmi/server/RMIHashes.java,
+ gnu/java/rmi/server/RMIObjectInputStream.java,
+ gnu/java/rmi/server/RMIObjectOutputStream.java,
+ gnu/java/rmi/server/UnicastConnection.java,
+ gnu/java/rmi/server/UnicastConnectionManager.java,
+ gnu/java/rmi/server/UnicastRef.java,
+ gnu/java/rmi/server/UnicastServer.java,
+ gnu/java/rmi/server/UnicastServerRef.java,
+ java/rmi/MarshalledObject.java,
+ java/rmi/server/RMIClassLoader.java,
+ java/rmi/server/RemoteObject.java,
+ java/rmi/server/UnicastRemoteObject.java,
+ java/security/SecureClassLoader.java: Merged from Classpath.
+
+2002-09-29 Anthony Green <green@redhat.com>
+
+ * java/lang/reflect/UndeclaredThrowableException.java: New file.
+ Imported from GNU Classpath.
+ * java/lang/reflect/natProxy.cc: New file.
+ * java/lang/reflect/InvocationHandler.java: New file. Imported
+ from GNU Classpath.
+ * java/lang/reflect/Proxy.java: New file. Imported from GNU
+ Classpath.
+ * gnu/java/lang/reflect/TypeSignature.java: Refresh from GNU
+ Classpath.
+ * gnu/classpath/Configuration.java.in (HAVE_NATIVE_GET_PROXY_DATA,
+ HAVE_NATIVE_GET_PROXY_CLASS, HAVE_NATIVE_GENERATE_PROXY_CLASS):
+ New statics.
+ * gcj/javaprims.h ("Java"): Add new classes.
+ * java/lang/reflect/Proxy.java: Fix check for duplicate interfaces.
+ * Makefile.am (java/lang/reflect/Proxy$$ProxyData.h): Create this.
+ java/lang/reflect/Proxy$$ProxyType.h): And this.
+ (inner_nat_headers): Add these new headers.
+ (ordinary_java_source_files): Add new files.
+ (nat_source_files): Add new file.
+ * Makefile.in: Rebuilt.
+
+2002-09-28 Richard Earnshaw <rearnsha@arm.com>
+
+ * configure.host: Handle arm*-elf, strongarm*-elf and xscale*-elf with
+ a single configuration.
+
+2002-09-25 Jesse Rosenstock <jmr@ugcs.caltech.edu>
+
+ * java/util/TimeZone.java (getDSTSavings): New method.
+ Fixes PR libgcj/7786.
+
+2002-09-25 Jesse Rosenstock <jmr@ugcs.caltech.edu>
+
+ * resolve.cc (_Jv_ResolvePoolEntry) [end_of_method_search]: Check
+ to see if `the_method == 0' before looking up vtable index.
+ Fixes PR libgcj/7709.
+
+2002-09-25 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/natClassLoader.cc:
+ (_Jv_PrepareCompiledClass): Throw NoClassDefFoundError, per spec.
+ * resolve.cc: Include NoClassDefFoundError.h, not
+ ClassNotFoundException.h.
+ (_Jv_ResolvePoolEntry): Throw NoClassDefFoundError, per spec.
+
+ * defineclass.cc: Don't include ClassNotFoundException.h.
+
+ * resolve.cc: Include StringBuffer.
+ (_Jv_ResolvePoolEntry): Use StringBuffer to create error string.
+
+ * boehm.cc (_Jv_MarkObj): Don't fail if class object has been
+ allocated but not initialized.
+
+2002-09-25 Jesse Rosenstock <jmr@ugcs.caltech.edu>
+
+ Fix for PR libgcj/7766:
+ * java/util/zip/ZipInputStream.java (entryAtEOF): New field.
+ (getNextEntry): Set it.
+ (closeEntry): Likewise.
+ (read): Likewise.
+ (close): Likewise.
+ (available): Use it.
+
+2002-09-25 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramSocket.java
+ (DatagramSocket): Initialize new instance variables.
+ (close): Reset new instance variables.
+ (getLocalAddress): Remove unneeded SecurityManager usage.
+ (getLocalPort): Check if socket is already bound.
+ (isConnected): New method.
+ (getInetAddress): Implemented.
+ (getPort): Better Implementation, documentation fixed.
+ (getRemoteSocketAddress): New method.
+ * java/net/JarURLConnection.java
+ (element): Typo fixed.
+ (getMainAttributes): New method.
+ (getAttributes): New method (stub only).
+ (getManifest): New method (stub only).
+ * java/net/NetPermission.java: Added serialVersionsUID.
+ * java/net/Socket.java
+ (connect): Check blocking mode of associated channel,
+ documentation added.
+ (getLocalSocketAddress): Better implementation.
+ (getRemoteSocketAddress): Implemented.
+ (isBound): New method.
+ (setSendBufferSize): Documentation added.
+ * java/net/SocketAddress.java: Added serialVersionsUID.
+ * java/net/SocketPermission.java: Added serialVersionsUID.
+ * java/net/URL.java
+ (URL): Wrap for shorter lines, initialize new instance variables,
+ documentation added.
+ (equals): Check new instance variables too.
+ (getContent): Documentation added.
+ (getPath): Documentation added.
+ (getAuthority): New method.
+ (getHost): Documentation added.
+ (getPort): Documentation added.
+ (getDefaultPort): New method.
+ (getProtocol): Documentation added.
+ (getUserInfo): Documentation added.
+ (set): Initialize new instance variables, documentation added.
+ * java/net/URLStreamHandler.java
+ (setURL): New method.
+ * java/net/natPlainDatagramSocketImpl.cc
+ (connect): Fix exception name.
+ (disconnect): Fix exception name.
+
+2002-09-25 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/channels/spi/AbstractSelectableChannel.java: New file.
+ * java/nio/channels/DatagramChannel.java:
+ extends AbstractSelectableChannel
+ * java/nio/channels/ServerSocketChannel.java:
+ extends AbstractSelectableChannel
+ * java/nio/channels/SocketChannel.java:
+ extends AbstractSelectableChannel
+ * Makefile.am (ordinary_java_source_files):
+ java/nio/channels/spi/AbstractSelectableChannel.java added.
+ * Makefile.in: Regenerated.
+
+2002-09-25 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramSocket.java
+ (DatagramSocket): Exception documentation added.
+ (bind): Exception documentation added, addded SecurityManager check,
+ added SocketAddress type check.
+ (getSoTimeout): Check impl.
+ (receive): Fix SecurityManager check, check impl, documentation added.
+ (send): Check channel mode, documentation added.
+ (connect): New method.
+ (disconnect): Implemented.
+ (getLocalSocketAddress): New method.
+ (getReceiveBufferSize): Check impl.
+ (setReuseAddress): Check impl.
+ (getReuseAddress): Check impl.
+ (setBroadcast): Check impl.
+ (getBroadcast): Check impl.
+ (setTrafficClass): Check impl, Documentation cleared.
+ (getTrafficClass): Check impl.
+ (getSendBufferSize): Check impl.
+ (setReceiveBufferSize): Check impl, documentation added.
+ (setSendBufferSize): Documentation added.
+ (setDatagramSocketImplFactory): New method.
+ * java/net/HttpURLConnection.java
+ (HTTP_INTERNAL_ERROR): The correct code is 500.
+ (HTTP_NOT_IMPLEMENTED): Added new constant.
+ (setFollowRedirects): Documentation added.
+ (getInstanceFollowRedirects): New method.
+ (setInstanceFollowRedirects): New method.
+ (setRequestMethod): Documentation added.
+ (getResponseCode): Documentation added.
+ (getResponseMessage): Documentation added.
+ * java/net/JarURLConnection.java
+ (JarURLConnection): protected since JDK 1.4.
+ (getJarEntry): java.io.IOException to IOException, documentation added.
+ (getJarFile): Documentation added.
+ * java/net/ServerSocket.java
+ (ServerSocket): Private to public, exception added.
+ (ServerSocket): java.io.IOException to IOException, documentation added.
+ (bind): Check socket address type, documentation added.
+ (bind): java.io.IOException to IOException, documentation added.
+ (accept): Documentation added.
+ (implAccept): Check ch is not non-blocking, documentation added.
+ (setSoTimeout): Documentation fixed.
+ (setReceiveBufferSize): Documentation added.
+ * java/net/Socket.java
+ (Socket): Documentation added.
+ (bind): Documentation added.
+ (connect): Check socket address type, documentation added.
+ (getRemoteSocketAddress): New method.
+ (getLocalSocketAddress): New method.
+ (setSoLinger): Documentation added.
+ (getReuseAddress): New method.
+ (setReuseAddress): New method.
+ (getTrafficClass): New method.
+ (setTrafficClass): New method.
+ * java/net/URLStreamHandler.java
+ (openConnection): java.io.IOException to IOException.
+ (parseURL): Documentation added.
+ (sameFile): public to protected, documentation added.
+ (setURL): Documentation added.
+ * java/nio/IllegalBlockingModeException.java: New file.
+ * Makefile.am (ordinary_java_source_files):
+ added java/nio/IllegalBlockingModeException.java
+ * Makefile.in: Regenerated.
+
+2002-09-25 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramPacket
+ (DatagramPacket): Exception documentation added.
+ (setData): Likewise.
+ (setSocketAddress): Likewise.
+ * java/net/DatagramSocketImpl.java
+ (peek): Documentation addded.
+ (peekData): Documentation addded.
+ (send): Documentation addded.
+ (receive): Documentation addded.
+ (connect): New method.
+ (disconnect): New method.
+ (joinGroup): New abstract method.
+ (leaveGroup): New abstract method.
+ * java/net/InetSocketAddress.java
+ (InetSocketAddress): Documentation added.
+ (equals): final keyword added.
+ (getAddress): final keyword added.
+ (getHostName): final keyword added.
+ (getPort): final keyword added.
+ (hashCode): final keyword added.
+ (isUnresolved): final keyword added.
+ * java/net/MulticastSocket.java
+ (MulticastSocket): Documentation added.
+ (MulticastSocket): New method.
+ (joinGroup): Documentation added.
+ (joinGroup): New method.
+ (leaveGroup): Documentation added.
+ (leaveGroup): New method.
+ (send): Documentation added.
+ * java/net/NetworkInterface.java
+ (getByName): Documentation added.
+ (getByInetAddress): Documentation added.
+ (getNetworkInterfaces): Documentation added.
+ * java/net/PlainDatagramSocketImpl.java
+ (connect): New method.
+ (disconnect): New method.
+ * java/net/SocketImpl.java
+ (create): Documentation added.
+ (shutdownInput): Convert public to protected, as it always was.
+ (shutdownOutput): Convert public to protected, as it always was.
+ * java/net/SocketOptions.java
+ (whole file): Reintented.
+ * java/net/URLClassLoader.java
+ (URLClassLoader): SecurityManager check added, documentation added.
+ (findResources): Documentation added.
+ (findClass): Documentation added.
+ (newInstance): More correct method arguments.
+ * java/net/URLConnection.java
+ (connect): Documentation added.
+ (getContent): Documentation added.
+ (getPermission): Documentation added.
+ (getInputStream): Documentation added.
+ (getOutputStream): Documentation added.
+ (setDoInput): Throw correct exception, documentation added.
+ (setDoOutput): Throw correct exception, documentation added.
+ (setAllowUserInteraction): Throw correct exception, documentation added.
+ (setUseCaches): Throw correct exception, documentation added.
+ (setIfModifiedSince): Throw correct exception, documentation added.
+ (setRequestProperty): Throw exception, documentation added.
+ (addRequestProperty): Throw exception, documentation added.
+ (getRequestProperty): Throw exception, documentation added.
+ (getRequestProperties): Documentation added.
+ (setContentHandlerFactory): Documentation added.
+ (guessContentTypeFromName): protected to public.
+ (setFileNameMap): Documentation added.
+ * java/net/URLDecoder.java
+ (URLDecoder): New method.
+ (decode): Documentation added.
+ (whole file): Reindented.
+ * java/net/URLEncoder.java
+ (encode): Documentation added.
+ * java/net/natPlainDatagramSocketImpl.cc
+ (connect): New method.
+ (disconnect): New method.
+ * javax/naming/RefAddr:
+ (addrType): addrType was never final.
+ (equals): Fix typo in method name.
+ * javax/naming/BinaryRefAddr:
+ (equals): Fix typo in method name.
+
+2002-09-22 Tom Tromey <tromey@redhat.com>
+
+ Fix for PR libgcj/6576:
+ * java/util/ResourceBundle.java (tryBundle): Cache `null' if we
+ didn't find a given bundle.
+ (getBundle): Don't require base bundle.
+ (setParent): Removed old comment.
+ (tryLocalBundle): Try components even if preceding components were
+ empty.
+
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.am (all-multi): Fix multilib parallel build.
+
+2002-09-21 Michael Koch <konqueror@gmx.de>
+
+ * java/net/Socket.java
+ (sendUrgentData): New method.
+ (getChannel): New method.
+ * java/net/ServerSocket.java
+ (getChannel): New method.
+ (isBound): New method.
+ * java/net/DatagramSocket.java
+ (DatagramSocket): Two new methods.
+ (bind): New method.
+ (getChannel): New method.
+ (isBound): New method.
+ (send): Added newline to to make shorter lines.
+ * java/net/PlainDatagramSocketImpl.java
+ (mcastGrp): Added argument.
+ (join): Use new mcastGrp.
+ (leave): Use new mcastGrp.
+ (joinGroup): New method.
+ (leaveGroup): New method.
+ * java/net/natPlainDatagramSocketImpl.cc
+ (mcastGrp): Added argument, no yet really implemented.
+ (getOption): Added newline for shorter lines.
+ * java/net/natPlainSocketImpl.cc
+ (read, setOption, getOption): Added newline for shorter lines.
+
+2002-09-19 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/ClassLoader.java (resolveClass0): Set cause for
+ newly-created exception.
+
+2002-09-18 Michael Koch <konqueror@gmx.de>
+
+ * java/util/regex/Matcher.java, java/util/regex/Pattern.java,
+ java/util/regex/PatternSyntaxException.java:
+ Merge with classpath, new files.
+ * Makefile.am (core_java_source_files):
+ Added java/util/regex/Matcher.java,
+ java/util/regex/Pattern.java,
+ java/util/regex/PatternSyntaxException.java
+ * Makefile.in: Regenerated.
+ * include/config.h.in: Added HAVE_NET_IF_H.
+ * java/net/natNetworkInterface.cc (getRealNetworkInterfaces):
+ Removed #if 0 ... #endif.
+
+2002-09-17 Michael Koch <konqueror@gmx.de>
+
+ * java/net/natNetworkInterface.cc:
+ Removed unneed and yet wrong includes.
+
+2002-09-17 Michael Koch <konqueror@gmx.de>
+
+ * java/net/NetworkInterface.java: New file.
+ * java/net/natNetworkInterface.java: New file.
+ * configure.in: Added check for net/if.h.
+ * configure: Regenerated.
+ * Makefile.am
+ (ordinary_java_source_files): Added NetworkInterface.java.
+ (nat_source_files): Added natNetworkInterface.cc.
+ * Makefile.in: Regenerated.
+
+2002-09-16 Tom Tromey <tromey@redhat.com>
+
+ * java/net/URLClassLoader.java (findClass): Code source for a
+ class from a jar is not necessarily a jar: URL.
+
+2002-09-16 Michael Koch <konqueror@gmx.de>
+
+ * java/lang/AssertionError.java:
+ Merge with classpath, fixes HTML.
+ * java/rmi/server/LogStream.java:
+ Merge with classpath, fixes some constants.
+ * java/net/server/RemoteServer.java:
+ Merge with classpath, adds serialVersionUID.
+ * javax/naming/BinaryRefAddr.java:
+ Merge with classpath, s/equal/equals/.
+ * javax/naming/NamingException.java:
+ Merge with classpath, fixed typo.
+ * javax/naming/RefAddr.java:
+ Merge with classpath, s/equal/equals/.
+ * java/awt/Toolkit.java:
+ s/gnu.java.awt.peer.gtk.GtkToolkit/gnu.awt.gtk.GtkToolkit/
+ and typo fixed.
+
+2002-09-15 Adam Megacz <adam@xwt.org>
+
+ * java/net/natPlainSocketImpl.cc: fixed typo.
+
+2002-09-15 Adam Megacz <adam@xwt.org>
+
+ * java/net/natPlainSocketImpl.cc: #ifdef-shielded socket timeouts,
+ which don't work on Win32 (yet).
+
+2002-09-14 Adam Megacz <adam@xwt.org>
+
+ * java/net/natPlainDatagramSocket.cc: removed #include
+ <ws2tcpip.h>; the mingw header is broken (conflicts with itself).
+ * include/win32.h: included definition for IP_TOS to satisfy
+ natPlainDatagramSocket.cc
+
+2002-09-13 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramPacket.java (DatagramPacket):
+ Added linebreak for 80 chars per line.
+ * java/net/JarURLConection.java
+ (getInputStreami, getJarEntry): Likewise.
+ * java/net/SocketPErmission.java
+ (SocketPermission class docu, implies): Likewise.
+ * java/net/URLClassLoader.java (findResources): Likewise.
+ * java/net/URLConnection.java: Reindendet remark for 80 chars per line
+
+2002-09-13 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/channels/DatagramChannel.java,
+ java/nio/channels/ServerSocketChannel.java
+ java/nio/channels/SocketChannel.java:
+ New dummy files to make java.net fully JDK 1.4 compatible
+ * Makefile.am (ordinary_java_source_files): Added
+ java/net/DatagramSocketImplFactory.java (long forgotten),
+ java/nio/SocketChannel.java,
+ java/nio/ServerSocketChannel.java,
+ java/nio/DatagramChannel.java
+ * Makefile.in: Regenrated.
+
+2002-09-12 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramSocketImpl.java
+ (peekData): New method.
+ * java/net/PlainDatagramSocketImpl.java
+ (peekData): New method.
+ * java/net/natPlainDatagramSocketImpl.cc
+ (peekData): New method.
+ * java/net/URLConnection
+ (getPermission): New method.
+ (addRequestProperty): New method.
+ (getRequestProperties): New method.
+ (guessContentTypeFromStream): New method, not really implemented.
+ (URLConnection): Added/updated documentation.
+ (connect): Added/updated documentation.
+ (getURL): Added/updated documentation.
+ (getContentLength): Added/updated documentation.
+ (getContentType: Added/updated documentation.
+ (getContentEncoding): Added/updated documentation.
+ (getExpiration): Added/updated documentation.
+ (getDate): Added/updated documentation.
+ (getLastModified): Added/updated documentation.
+ (getHeaderField): Added/updated documentation.
+ (getHeaderFields): Added/updated documentation.
+ (getHeaderFieldInt): Added/updated documentation.
+ (getHeaderFieldDate): Added/updated documentation.
+ (getHeaderFieldKey): Added/updated documentation.
+ (getContent): Added/updated documentation.
+ (getInputStream): Added/updated documentation.
+ (getOutputStream): Added/updated documentation.
+ (toString): Added/updated documentation.
+ (setDoInput): Added/updated documentation.
+ (getDoInput): Added/updated documentation.
+ (setDoOutput): Added/updated documentation.
+ (getDoOutput): Added/updated documentation.
+ (setAllowUserInteraction): Added/updated documentation.
+ (getAllowUserInteraction): Added/updated documentation.
+ (setDefaultAllowUserInteraction): Added/updated documentation.
+ (getDefaultAllowUserInteraction): Added/updated documentation.
+ (setUseCaches): Added/updated documentation.
+ (getUseCaches): Added/updated documentation.
+ (setIfModifiedSince): Added/updated documentation.
+ (getIfModifiedSince): Added/updated documentation.
+ (getDefaultUseCaches): Added/updated documentation.
+ (setDefaultUseCaches): Added/updated documentation.
+ (setRequestProperty): Added/updated documentation.
+ (getRequestProperty): Added/updated documentation.
+ (setDefaultRequestProperty): Added/updated documentation.
+ (getDefaultRequestProperty): Added/updated documentation.
+ (setContentHandlerFactory): Added/updated documentation.
+ (guessContentTypeFromName): Added/updated documentation.
+ (getFileNameMap): Added/updated documentation.
+ (setFileNameMap): Added/updated documentation.
+
+2002-09-11 Michael Koch <konqueror@gmx.de>
+
+ * java/net/Socket.java
+ (Socket): protected to public (since JDK 1.4). Added @specnote.
+ (bind): New method.
+ (connect): Two new methods.
+ (getKeepalive): Get correct socket option.
+ (setKeepalive): Set correct socket option.
+ (getOOBInline): New method.
+ (setOOBInline): New method.
+ * java/net/ServerSocket.java
+ (bind): Two new methods.
+ (getInetAddress): Reimplemented, catch exception.
+ (getLocalSocketAddress): New method.
+ (setReuseAddress): New method.
+ (getReuseAdress): New method.
+ (setReceiveBufferSize): New method.
+ (getReceiveBufferSize): New method.
+ (toString): Made string JDK 1.4 compliant.
+
+2002-09-10 Michael Koch <konqueror@gmx.de>
+
+ * java/net/SocketImpl.java
+ (connect): New method.
+ (supportsUrgentData): New method.
+ (sendUrgentData): New method.
+ * java/net/PlainSocketImpl.java
+ (connect): One new method and two new implementation.
+ (sendUrgentData): New method.
+ * java/natPlainSocketImpl.cc
+ (connect): Arguments changed, added support for timeouts.
+ (getOption): Another __java_boolean to jboolean.
+
+2002-09-07 Adam Megacz <adam@xwt.org>
+
+ * java/net/natPlainDatagramSocket.cc: include ws2tcpip.h for
+ definition of IP_TOS.
+
+2002-09-04 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramSocket.java
+ (DatagramSocket): Added documentation.
+ (close): Likewise.
+ (getLocalAddress): Likewise.
+ (getLocalPort): Likewise.
+ (receive): Likewise.
+ (send): Likewise.
+ (setSoTimeout): Likewise.
+ (connect): New method.
+ (disconnect): New method.
+ (getInetAddress): New method (FIXME)
+ (getPort): New method.
+ (setReuseAddress): New method.
+ (getReuseAddress): New method.
+ (setBroadcast): New method.
+ (getBroadcast): New method.
+ (setTrafficClass): New method.
+ (getTrafficClass): New method.
+ * java/net/MulticastSocket.java):
+ (getTTL): Added @see in documentation.
+ (setTTL): Added @see in documentation.
+ (setLoopbackMode): New method.
+ (getLoopbackMode): New method.
+ * java/net/PlainSocketImpl.java:
+ Added new constants for the options SO_BROADCAST, SO_OOBINLINE,
+ IP_MULTICAST_IF2, IP_MULTICAST_LOOP, IP_TOS
+ * java/net/PlainDatagramSocketImpl.java
+ Added new constants for the options SO_BROADCAST, SO_OOBINLINE,
+ IP_MULTICAST_IF2, IP_MULTICAST_LOOP, IP_TOS
+ * java/net/natPlainSocketImpl.cc
+ (getOption): Implemented the options SO_BROADCAST, SO_OOBINLINE,
+ IP_MULTICAST_IF2, IP_MULTICAST_LOOP, IP_TOS
+ (setOption): Implemented the options SO_BROADCAST, SO_OOBINLINE,
+ IP_MULTICAST_IF2, IP_MULTICAST_LOOP, IP_TOS
+ This should also fix SO_KEEPALIVE
+ * java/net/natPlainDatagramSocketImpl.cc
+ (getOption): Implemented the options SO_BROADCAST, SO_OOBINLINE,
+ IP_MULTICAST_IF2, IP_MULTICAST_LOOP, IP_TOS
+ (setOption): Implemented the options SO_BROADCAST, SO_OOBINLINE,
+ IP_MULTICAST_IF2, IP_MULTICAST_LOOP, IP_TOS
+
+2002-09-04 Michael Koch <konqueror@gmx.de>
+
+ * java/net/SocketOptions.java: added static variables to be JDK 1.4
+ compatible (SO_BROADCAST, SO_OOBINLINE, IP_MULTICAST_IF2,
+ IP_MULTICAST_LOOP, IP_TOS
+
+2002-09-03 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/Class.h (_getDeclaredMethod): Declare.
+ (_getMethod): Now private.
+ * java/lang/natClass.cc (_getDeclaredMethod): Renamed from
+ getDeclaredMethod. Now returns NULL on failure.
+ * java/lang/Class.java (_getDeclaredMethod): Declare.
+ (getDeclaredMethod): No longer native; implements access checks.
+
+2002-09-01 Mark Wielaard <mark@klomp.org>
+
+ * gnu/gcj/runtime/NameFinder.java (remove_interpreter): New field.
+ (sanitizeStack): Correctly reset unknown and interpreter counters,
+ detect interpreter runtime frames.
+ (demangleInterpreterMethod): New method.
+ * gnu/gcj/runtime/natNameFinder.cc (lookupInterp): Use new method.
+ * java/lang/natVMThrowable.cc (fillInStackTrace): Change order of
+ filling in addrs[].
+
+2002-09-02 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramPacket.java, java/net/MulticsstSocket.java:
+ re-indented documentation.
+
+2002-08-30 Jesse Rosenstock <jmr@ugcs.caltech.edu>
+
+ * java/util/Calendar.java (getTimeInMillis, getTimeInMillis): Now
+ public, per 1.4 spec. Fixes PR libgcj/7785.
+
+2002-08-30 Jeff Sturm <jsturm@one-point.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (ZIP, GCJH): Remove $(EXEEXT).
+
+2002-08-29 Tom Tromey <tromey@redhat.com>
+
+ * java/net/JarURLConnection.java (getCertificates): New method
+ from Classpath.
+ * java/net/URLClassLoader.java (URLClassLoader): Extends
+ SecureClassLoader.
+ (definePackage): New method from Classpath.
+ (getPermissions): Likewise.
+ (newInstance): Likewise.
+ (findClass): Construct CodeSource for new class (from Classpath).
+ * java/net/SocketImpl.java (shutdownInput, shutdownOutput): New
+ methods.
+ * java/net/URL.java (getUserInfo): New method.
+ (set(String,String,int,String,String,String,String,String)): New
+ method.
+ * java/net/PlainSocketImpl.java (_Jv_SO_KEEPALIVE_): Define.
+ (shutdownInput, shutdownOutput): Declare.
+ * java/net/PlainDatagramSocketImpl.java (_Jv_SO_KEEPALIVE_):
+ Define.
+ * java/net/natPlainSocketImpl.cc (setOption): Handle keepalive.
+ (getOption): Likewise.
+ (shutdownInput): New method.
+ (shutdownOutput): Likewise.
+ * java/net/natPlainDatagramSocketImpl.cc (setOption): Handle
+ keepalive.
+ (getOption): Likewise.
+ * java/net/SocketOptions.java (SO_KEEPALIVE): New constant.
+ * java/net/Socket.java (setKeepAlive): New method.
+ (getKeepAlive): Likewise.
+ (shutdownInput, shutdownOutput): New methods.
+
+2002-08-29 Michael Koch <konqueror@gmx.de>
+
+ * java/net/DatagramPacket.java: updated to JDK 1.4 API
+ new methods are:
+ DatagramPacket(byte[] buf, int offset, int length, SocketAddress
+ address),
+ DatagramPacket(byte[] buf, int length, SocketAddress address),
+ void setSocketAddress(SocketAddress address)
+ public SocketAddress getSocketAddress()
+
+2002-08-29 Tom Tromey <tromey@redhat.com>
+
+ * java/io/natFileDescriptorPosix.cc (setLength): Handle case where
+ ftruncate is missing.
+ * configure, include/config.h.in: Rebuilt.
+ * acconfig.h (HAVE_FTRUNCATE): Mention.
+ * configure.in: Check for ftruncate.
+
+2002-08-29 Tom Tromey <tromey@redhat.com>
+
+ * include/jvm.h (struct _Jv_frame_info): New structure.
+ * gnu/gcj/runtime/natNameFinder.cc: Include StringBuffer.h,
+ java-interp.h.
+ (lookupInterp): New method.
+ (getAddrAsString): Use _Jv_frame_info.
+ (dladdrLookup): Likewise.
+ * gnu/gcj/runtime/NameFinder.java (lookup): Try to look up
+ interpreted frame.
+ (lookupInterp): Declare.
+ * java/lang/natVMThrowable.cc: Include Thread.h, java-interp.h.
+ (fillInStackTrace): Collect information on interpreted frames.
+ Use _Jv_frame_info.
+ * interpret.cc: Include Thread.h.
+ (run): Create and push _Jv_MethodChain object.
+ (_Jv_EndOfInterpreter): New global.
+ * java/lang/Thread.java (interp_frame): New field.
+ * include/java-interp.h (struct _Jv_MethodChain): New structure.
+ Include NameFinder.h.
+
+2002-08-28 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/Class.h: Include Package.h.
+ (Class::getProtectionDomain): Declare.
+ (Class::getPackage): Declare.
+
+2002-08-28 Michael Koch <konqueror@gmx.de>
+
+ * java/net/InetSocketAddress.java: Added some documentation and argument
+ checks for the port numbers.
+ * java/net/DatagramSocketImplFactory.java: New file.
+
+2002-08-28 Michael Koch <konqueror@gmx.de>
+
+ * java/net/Authenticator.java: added some documentation.
+
+2002-08-27 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/reflect/natConstructor.cc (newInstance): Initialize
+ class.
+ * java/lang/reflect/natMethod.cc (invoke): Initialize class.
+
+2002-08-27 Michael Koch <konqueror@gmx.de>
+
+ * java/net/BindException.java,
+ java/net/JarURLConnection.java,
+ java/net/FileNameMap.java,
+ java/net/HttpURLConnection.java,
+ java/net/InetSocketAddress.java,
+ java/net/DatagramPacket.java,
+ java/net/DatagramSocket.java,
+ java/net/DatagramSocketImpl.java,
+ java/net/MulticastSocket.java,
+ java/net/PasswordAuthentication.java,
+ java/net/ServerSocket.java,
+ java/net/Socket.java,
+ java/net/URLClassLoader.java,
+ java/net/URLConnection.java: add/update of some @since/@deprecated
+
+2002-08-27 Tony Kimball <alk@pobox.com>
+ Tom Tromey <tromey@redhat.com>
+
+ * java/net/natPlainDatagramSocketImpl.cc (NATIVE_CLOSE): New
+ define.
+ (::close): Removed.
+ (PlainDatagramSocketImpl::close): Use NATIVE_CLOSE.
+ * java/net/natPlainSocketImpl.cc (NATIVE_CLOSE): New define.
+ (::close): Removed.
+ (PlainSocketImpl::close): Use NATIVE_CLOSE.
+ * include/win32.h (getcwd): Removed declaration. Include io.h.
+
+2002-08-25 Adam Megacz <adam@xwt.org>
+
+ * include/win32.h (getcwd): copied function declaration as
+ temporary fix for header confusion.
+
+2002-08-24 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (libgcj_la_SOURCES): Remove name-finder.cc.
+ (core_java_source_files): Add VMThrowable.java and NameFinder.java
+ (nat_source_files): Remove natThrowable.cc, add natVMThrowable.cc
+ and natNameFinder.cc.
+ * Makefile.in: Regenerate.
+ * prims.cc: Use trace_enabled from VMThrowable.
+ * name-finder.cc: Removed.
+ * gcj/javaprims.h: Add class VMThrowable.
+ * gnu/gcj/runtime/NameFinder.java: New file.
+ * gnu/gcj/runtime/natNameFinder.cc: Likewise.
+ * include/name-finder.h: Removed.
+ * java/lang/Throwable.java (printStackTrace (PrintStream)): Use new
+ method stackTraceString().
+ (printStackTrace (PrintWriter)): Likewise.
+ (stackTraceString): Complete rewrite of old printStackTrace using
+ StringBuffer.
+ (stackTraceStringBuffer): New helper method for stackTraceString().
+ (fillInStackTrace): Delegate to VMTrowable.
+ (getStackTrace): Likewise.
+ (getStackTrace0): Removed.
+ (trace_enabled, stackTraceBytes): Moved to new VMThrowable.java.
+ (setStackTrace): Copy given array.
+ * java/lang/natThrowable.cc: Removed (replaced by natVMThrowable).
+ * java/lang/VMThrowable.java: New class.
+ * java/lang/natVMThrowable.cc: New file.
+
+2003-08-23 Michael Koch <konqueror@gmx.de>
+
+ * java/net/URLConnection.java,
+ java/netJarURLConnection.java,
+ gnu/gcj/protocol/core/Connection.java,
+ gnu/gcj/protocol/file/Connection.java,
+ gnu/gcj/protocol/http/Connection.java: Added implementation of
+ getHeaderFields().
+
+2002-08-22 Tom Tromey <tromey@redhat.com>
+
+ * gij.cc (help): Document -cp and -classpath.
+ (main): Handle -classpath.
+
2002-08-21 Tom Tromey <tromey@redhat.com>
* Makefile.in: Rebuilt.
diff --git a/libjava/Makefile.am b/libjava/Makefile.am
index 89fff76cbfb..bbcd51d8e38 100644
--- a/libjava/Makefile.am
+++ b/libjava/Makefile.am
@@ -57,14 +57,14 @@ if CANADIAN
if NULL_TARGET
## In this case, gcj is found outside the build tree. However, zip is
## found in the build tree.
-ZIP = $(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT)
+ZIP = $(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar
else
ZIP = jar
endif
GCJH = gcjh
else # CANADIAN
-GCJH = $(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT)
-ZIP = $(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT)
+GCJH = $(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh
+ZIP = $(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar
endif # CANADIAN
## The compiler with whatever flags we want for both -c and -C
@@ -128,7 +128,7 @@ javao_files = $(java_source_files:.java=.lo) \
x_javao_files = $(x_java_source_files:.java=.lo)
libgcj_la_SOURCES = prims.cc jni.cc exception.cc \
- resolve.cc defineclass.cc interpret.cc name-finder.cc verify.cc \
+ resolve.cc defineclass.cc interpret.cc verify.cc \
$(nat_source_files)
EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \
win32-threads.cc posix.cc win32.cc \
@@ -249,7 +249,9 @@ ordinary_nat_headers = $(ordinary_java_source_files:.java=.h) \
$(built_java_source_files:.java=.h)
inner_nat_headers = java/io/ObjectOutputStream$$PutField.h \
- java/io/ObjectInputStream$$GetField.h
+ java/io/ObjectInputStream$$GetField.h \
+ java/lang/reflect/Proxy$$ProxyData.h \
+ java/lang/reflect/Proxy$$ProxyType.h
nat_headers = $(ordinary_nat_headers) $(inner_nat_headers)
@@ -309,6 +311,18 @@ java/lang/reflect/Method.h: java/lang/reflect/Method.class
-friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \
$(basename $<)
+java/lang/reflect/Proxy.h: java/lang/reflect/Proxy.class
+ $(GCJH) -classpath '' -bootclasspath $(top_builddir) \
+ $(basename $<)
+
+java/lang/reflect/Proxy$$ProxyData.h: java/lang/reflect/Proxy.class
+ $(GCJH) -classpath '' -bootclasspath $(top_builddir) \
+ 'java/lang/reflect/Proxy$$ProxyData'
+
+java/lang/reflect/Proxy$$ProxyType.h: java/lang/reflect/Proxy.class
+ $(GCJH) -classpath '' -bootclasspath $(top_builddir) \
+ 'java/lang/reflect/Proxy$$ProxyType'
+
gnu/gcj/runtime/VMClassLoader.h: gnu/gcj/runtime/VMClassLoader.class
$(GCJH) -classpath '' -bootclasspath $(top_builddir) \
-friend 'class ::java::lang::ClassLoader;' \
@@ -838,10 +852,12 @@ java/awt/Robot.java \
java/awt/ScrollPaneAdjustable.java \
java/awt/Stroke.java \
java/awt/TexturePaint.java \
+java/awt/dnd/peer/DragSourceContextPeer.java \
+java/awt/dnd/peer/DropTargetContextPeer.java \
java/awt/dnd/DnDConstants.java \
java/awt/dnd/DragGestureEvent.java \
java/awt/dnd/DragGestureListener.java \
-java/awt/dnd/DragGestureRecognizer.java \
+java/awt/dnd/DragGestureRecognizer.java \
java/awt/dnd/DragSource.java \
java/awt/dnd/DragSourceAdapter.java \
java/awt/dnd/DragSourceContext.java \
@@ -851,7 +867,15 @@ java/awt/dnd/DragSourceListener.java \
java/awt/dnd/DragSourceMotionListener.java \
java/awt/dnd/DropTarget.java \
java/awt/dnd/InvalidDnDOperationException.java \
-java/awt/dnd/peer/DragSourceContextPeer.java \
+java/awt/dnd/Autoscroll.java \
+java/awt/dnd/DragSourceDropEvent.java \
+java/awt/dnd/DropTargetAdapter.java \
+java/awt/dnd/DropTargetContext.java \
+java/awt/dnd/DropTargetDragEvent.java \
+java/awt/dnd/DropTargetDropEvent.java \
+java/awt/dnd/DropTargetEvent.java \
+java/awt/dnd/DropTargetListener.java \
+java/awt/dnd/MouseDragGestureRecognizer.java \
java/awt/font/TextHitInfo.java \
java/awt/im/spi/InputMethod.java \
java/awt/im/spi/InputMethodContext.java \
@@ -1270,6 +1294,8 @@ java/rmi/server/SocketSecurityException.java \
java/rmi/server/UID.java \
java/rmi/server/UnicastRemoteObject.java \
java/rmi/server/Unreferenced.java \
+gnu/java/rmi/RMIMarshalledObjectInputStream.java \
+gnu/java/rmi/RMIMarshalledObjectOutputStream.java \
gnu/java/rmi/dgc/DGCImpl.java \
gnu/java/rmi/dgc/DGCImpl_Skel.java \
gnu/java/rmi/dgc/DGCImpl_Stub.java \
@@ -1281,6 +1307,7 @@ gnu/java/rmi/rmic/Compiler.java \
gnu/java/rmi/rmic/CompilerProcess.java \
gnu/java/rmi/rmic/RMIC.java \
gnu/java/rmi/rmic/TabbedWriter.java \
+gnu/java/rmi/server/ConnectionRunnerPool.java \
gnu/java/rmi/server/ProtocolConstants.java \
gnu/java/rmi/server/RMIDefaultSocketFactory.java \
gnu/java/rmi/server/RMIHashes.java \
@@ -1527,6 +1554,7 @@ java/lang/VerifyError.java \
java/lang/VirtualMachineError.java \
java/lang/VMClassLoader.java \
java/lang/VMSecurityManager.java \
+java/lang/VMThrowable.java \
java/lang/Void.java \
java/io/BufferedInputStream.java \
java/io/BufferedOutputStream.java \
@@ -1660,7 +1688,10 @@ java/util/TreeMap.java \
java/util/TreeSet.java \
java/util/TooManyListenersException.java \
java/util/Vector.java \
-java/util/WeakHashMap.java
+java/util/WeakHashMap.java \
+java/util/regex/Matcher.java \
+java/util/regex/Pattern.java \
+java/util/regex/PatternSyntaxException.java
## List of all .java files to be compiled. Please keep this list
## alphabetical. Please put files from java/lang, java/io, and java/util
@@ -1687,6 +1718,7 @@ gnu/gcj/runtime/FileDeleter.java \
gnu/gcj/runtime/FinalizerThread.java \
gnu/gcj/runtime/FirstThread.java \
gnu/gcj/runtime/JNIWeakRef.java \
+gnu/gcj/runtime/NameFinder.java \
gnu/gcj/runtime/SharedLibLoader.java \
gnu/gcj/runtime/StringBuffer.java \
gnu/gcj/runtime/VMClassLoader.java \
@@ -1868,11 +1900,14 @@ java/lang/reflect/AccessibleObject.java \
java/lang/reflect/Array.java \
java/lang/reflect/Constructor.java \
java/lang/reflect/Field.java \
+java/lang/reflect/InvocationHandler.java \
java/lang/reflect/InvocationTargetException.java \
java/lang/reflect/Member.java \
java/lang/reflect/Method.java \
java/lang/reflect/Modifier.java \
+java/lang/reflect/Proxy.java \
java/lang/reflect/ReflectPermission.java \
+java/lang/reflect/UndeclaredThrowableException.java \
java/math/BigDecimal.java \
java/math/BigInteger.java \
java/net/Authenticator.java \
@@ -1883,14 +1918,18 @@ java/net/ContentHandlerFactory.java \
java/net/DatagramPacket.java \
java/net/DatagramSocket.java \
java/net/DatagramSocketImpl.java \
+java/net/DatagramSocketImplFactory.java \
java/net/FileNameMap.java \
java/net/HttpURLConnection.java \
java/net/InetAddress.java \
+java/net/Inet4Address.java \
+java/net/Inet6Address.java \
java/net/InetSocketAddress.java \
java/net/JarURLConnection.java \
java/net/MalformedURLException.java \
java/net/MulticastSocket.java \
java/net/NetPermission.java \
+java/net/NetworkInterface.java \
java/net/NoRouteToHostException.java \
java/net/PasswordAuthentication.java \
java/net/PlainDatagramSocketImpl.java \
@@ -1906,6 +1945,7 @@ java/net/SocketImplFactory.java \
java/net/SocketOptions.java \
java/net/SocketPermission.java \
java/net/SocketTimeoutException.java \
+java/net/URI.java \
java/net/URISyntaxException.java \
java/net/URL.java \
java/net/URLClassLoader.java \
@@ -1916,6 +1956,29 @@ java/net/URLStreamHandler.java \
java/net/URLStreamHandlerFactory.java \
java/net/UnknownHostException.java \
java/net/UnknownServiceException.java \
+java/nio/Buffer.java \
+java/nio/ByteBuffer.java \
+java/nio/MappedByteBuffer.java \
+java/nio/channels/AlreadyConnectedException.java \
+java/nio/channels/ByteChannel.java \
+java/nio/channels/Channel.java \
+java/nio/channels/ClosedChannelException.java \
+java/nio/channels/DatagramChannel.java \
+java/nio/channels/GatheringByteChannel.java \
+java/nio/channels/IllegalBlockingModeException.java \
+java/nio/channels/InterruptibleChannel.java \
+java/nio/channels/ReadableByteChannel.java \
+java/nio/channels/ScatteringByteChannel.java \
+java/nio/channels/ServerSocketChannel.java \
+java/nio/channels/SocketChannel.java \
+java/nio/channels/WritableByteChannel.java \
+java/nio/channels/spi/AbstractSelectableChannel.java \
+java/nio/charset/CharacterCodingException.java \
+java/nio/charset/IllegalCharsetNameException.java \
+java/nio/charset/MalformedInputException.java \
+java/nio/charset/UnmappableCharacterException.java \
+java/nio/charset/UnsupportedCharsetException.java \
+java/nio/charset/spi/CharsetProvider.java \
java/security/AccessControlContext.java \
java/security/AccessControlException.java \
java/security/AccessController.java \
@@ -2204,6 +2267,7 @@ gnu/gcj/io/shs.cc \
gnu/gcj/protocol/core/natCoreInputStream.cc \
gnu/gcj/runtime/natFinalizerThread.cc \
gnu/gcj/runtime/natFirstThread.cc \
+gnu/gcj/runtime/natNameFinder.cc \
gnu/gcj/runtime/natSharedLibLoader.cc \
gnu/gcj/runtime/natStringBuffer.cc \
java/io/natFile.cc \
@@ -2223,12 +2287,14 @@ java/lang/natString.cc \
java/lang/natStringBuffer.cc \
java/lang/natSystem.cc \
java/lang/natThread.cc \
-java/lang/natThrowable.cc \
+java/lang/natVMThrowable.cc \
java/lang/ref/natReference.cc \
java/lang/reflect/natArray.cc \
java/lang/reflect/natConstructor.cc \
java/lang/reflect/natField.cc \
java/lang/reflect/natMethod.cc \
+java/lang/reflect/natProxy.cc \
+java/net/natNetworkInterface.cc \
java/net/natInetAddress.cc \
java/net/natPlainDatagramSocketImpl.cc \
java/net/natPlainSocketImpl.cc \
@@ -2418,7 +2484,7 @@ distclean-recursive: distclean-multi
maintainer-clean-recursive: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/libjava/Makefile.in b/libjava/Makefile.in
index d165075518e..b45966030c4 100644
--- a/libjava/Makefile.in
+++ b/libjava/Makefile.in
@@ -148,11 +148,11 @@ secdir = $(libdir)/security
@NATIVE_TRUE@bin_PROGRAMS = @NATIVE_TRUE@jv-convert gij rmic rmiregistry
bin_SCRIPTS = addr2name.awk
-@CANADIAN_TRUE@@NULL_TARGET_TRUE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_TRUE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT)
+@CANADIAN_TRUE@@NULL_TARGET_TRUE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_TRUE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar
@CANADIAN_TRUE@@NULL_TARGET_FALSE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_FALSE@jar
-@CANADIAN_FALSE@ZIP = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT)
+@CANADIAN_FALSE@ZIP = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar
@CANADIAN_TRUE@GCJH = @CANADIAN_TRUE@gcjh
-@CANADIAN_FALSE@GCJH = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT)
+@CANADIAN_FALSE@GCJH = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh
GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8
@@ -195,7 +195,7 @@ javao_files = $(java_source_files:.java=.lo) \
x_javao_files = $(x_java_source_files:.java=.lo)
libgcj_la_SOURCES = prims.cc jni.cc exception.cc \
- resolve.cc defineclass.cc interpret.cc name-finder.cc verify.cc \
+ resolve.cc defineclass.cc interpret.cc verify.cc \
$(nat_source_files)
EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \
@@ -246,7 +246,9 @@ ordinary_nat_headers = $(ordinary_java_source_files:.java=.h) \
inner_nat_headers = java/io/ObjectOutputStream$$PutField.h \
- java/io/ObjectInputStream$$GetField.h
+ java/io/ObjectInputStream$$GetField.h \
+ java/lang/reflect/Proxy$$ProxyData.h \
+ java/lang/reflect/Proxy$$ProxyType.h
nat_headers = $(ordinary_nat_headers) $(inner_nat_headers)
@@ -607,10 +609,12 @@ java/awt/Robot.java \
java/awt/ScrollPaneAdjustable.java \
java/awt/Stroke.java \
java/awt/TexturePaint.java \
+java/awt/dnd/peer/DragSourceContextPeer.java \
+java/awt/dnd/peer/DropTargetContextPeer.java \
java/awt/dnd/DnDConstants.java \
java/awt/dnd/DragGestureEvent.java \
java/awt/dnd/DragGestureListener.java \
-java/awt/dnd/DragGestureRecognizer.java \
+java/awt/dnd/DragGestureRecognizer.java \
java/awt/dnd/DragSource.java \
java/awt/dnd/DragSourceAdapter.java \
java/awt/dnd/DragSourceContext.java \
@@ -620,7 +624,15 @@ java/awt/dnd/DragSourceListener.java \
java/awt/dnd/DragSourceMotionListener.java \
java/awt/dnd/DropTarget.java \
java/awt/dnd/InvalidDnDOperationException.java \
-java/awt/dnd/peer/DragSourceContextPeer.java \
+java/awt/dnd/Autoscroll.java \
+java/awt/dnd/DragSourceDropEvent.java \
+java/awt/dnd/DropTargetAdapter.java \
+java/awt/dnd/DropTargetContext.java \
+java/awt/dnd/DropTargetDragEvent.java \
+java/awt/dnd/DropTargetDropEvent.java \
+java/awt/dnd/DropTargetEvent.java \
+java/awt/dnd/DropTargetListener.java \
+java/awt/dnd/MouseDragGestureRecognizer.java \
java/awt/font/TextHitInfo.java \
java/awt/im/spi/InputMethod.java \
java/awt/im/spi/InputMethodContext.java \
@@ -1040,6 +1052,8 @@ java/rmi/server/SocketSecurityException.java \
java/rmi/server/UID.java \
java/rmi/server/UnicastRemoteObject.java \
java/rmi/server/Unreferenced.java \
+gnu/java/rmi/RMIMarshalledObjectInputStream.java \
+gnu/java/rmi/RMIMarshalledObjectOutputStream.java \
gnu/java/rmi/dgc/DGCImpl.java \
gnu/java/rmi/dgc/DGCImpl_Skel.java \
gnu/java/rmi/dgc/DGCImpl_Stub.java \
@@ -1051,6 +1065,7 @@ gnu/java/rmi/rmic/Compiler.java \
gnu/java/rmi/rmic/CompilerProcess.java \
gnu/java/rmi/rmic/RMIC.java \
gnu/java/rmi/rmic/TabbedWriter.java \
+gnu/java/rmi/server/ConnectionRunnerPool.java \
gnu/java/rmi/server/ProtocolConstants.java \
gnu/java/rmi/server/RMIDefaultSocketFactory.java \
gnu/java/rmi/server/RMIHashes.java \
@@ -1294,6 +1309,7 @@ java/lang/VerifyError.java \
java/lang/VirtualMachineError.java \
java/lang/VMClassLoader.java \
java/lang/VMSecurityManager.java \
+java/lang/VMThrowable.java \
java/lang/Void.java \
java/io/BufferedInputStream.java \
java/io/BufferedOutputStream.java \
@@ -1427,7 +1443,10 @@ java/util/TreeMap.java \
java/util/TreeSet.java \
java/util/TooManyListenersException.java \
java/util/Vector.java \
-java/util/WeakHashMap.java
+java/util/WeakHashMap.java \
+java/util/regex/Matcher.java \
+java/util/regex/Pattern.java \
+java/util/regex/PatternSyntaxException.java
ordinary_java_source_files = $(core_java_source_files) \
@@ -1449,6 +1468,7 @@ gnu/gcj/runtime/FileDeleter.java \
gnu/gcj/runtime/FinalizerThread.java \
gnu/gcj/runtime/FirstThread.java \
gnu/gcj/runtime/JNIWeakRef.java \
+gnu/gcj/runtime/NameFinder.java \
gnu/gcj/runtime/SharedLibLoader.java \
gnu/gcj/runtime/StringBuffer.java \
gnu/gcj/runtime/VMClassLoader.java \
@@ -1630,11 +1650,14 @@ java/lang/reflect/AccessibleObject.java \
java/lang/reflect/Array.java \
java/lang/reflect/Constructor.java \
java/lang/reflect/Field.java \
+java/lang/reflect/InvocationHandler.java \
java/lang/reflect/InvocationTargetException.java \
java/lang/reflect/Member.java \
java/lang/reflect/Method.java \
java/lang/reflect/Modifier.java \
+java/lang/reflect/Proxy.java \
java/lang/reflect/ReflectPermission.java \
+java/lang/reflect/UndeclaredThrowableException.java \
java/math/BigDecimal.java \
java/math/BigInteger.java \
java/net/Authenticator.java \
@@ -1645,14 +1668,18 @@ java/net/ContentHandlerFactory.java \
java/net/DatagramPacket.java \
java/net/DatagramSocket.java \
java/net/DatagramSocketImpl.java \
+java/net/DatagramSocketImplFactory.java \
java/net/FileNameMap.java \
java/net/HttpURLConnection.java \
java/net/InetAddress.java \
+java/net/Inet4Address.java \
+java/net/Inet6Address.java \
java/net/InetSocketAddress.java \
java/net/JarURLConnection.java \
java/net/MalformedURLException.java \
java/net/MulticastSocket.java \
java/net/NetPermission.java \
+java/net/NetworkInterface.java \
java/net/NoRouteToHostException.java \
java/net/PasswordAuthentication.java \
java/net/PlainDatagramSocketImpl.java \
@@ -1668,6 +1695,7 @@ java/net/SocketImplFactory.java \
java/net/SocketOptions.java \
java/net/SocketPermission.java \
java/net/SocketTimeoutException.java \
+java/net/URI.java \
java/net/URISyntaxException.java \
java/net/URL.java \
java/net/URLClassLoader.java \
@@ -1678,6 +1706,29 @@ java/net/URLStreamHandler.java \
java/net/URLStreamHandlerFactory.java \
java/net/UnknownHostException.java \
java/net/UnknownServiceException.java \
+java/nio/Buffer.java \
+java/nio/ByteBuffer.java \
+java/nio/MappedByteBuffer.java \
+java/nio/channels/AlreadyConnectedException.java \
+java/nio/channels/ByteChannel.java \
+java/nio/channels/Channel.java \
+java/nio/channels/ClosedChannelException.java \
+java/nio/channels/DatagramChannel.java \
+java/nio/channels/GatheringByteChannel.java \
+java/nio/channels/IllegalBlockingModeException.java \
+java/nio/channels/InterruptibleChannel.java \
+java/nio/channels/ReadableByteChannel.java \
+java/nio/channels/ScatteringByteChannel.java \
+java/nio/channels/ServerSocketChannel.java \
+java/nio/channels/SocketChannel.java \
+java/nio/channels/WritableByteChannel.java \
+java/nio/channels/spi/AbstractSelectableChannel.java \
+java/nio/charset/CharacterCodingException.java \
+java/nio/charset/IllegalCharsetNameException.java \
+java/nio/charset/MalformedInputException.java \
+java/nio/charset/UnmappableCharacterException.java \
+java/nio/charset/UnsupportedCharsetException.java \
+java/nio/charset/spi/CharsetProvider.java \
java/security/AccessControlContext.java \
java/security/AccessControlException.java \
java/security/AccessController.java \
@@ -1965,6 +2016,7 @@ gnu/gcj/io/shs.cc \
gnu/gcj/protocol/core/natCoreInputStream.cc \
gnu/gcj/runtime/natFinalizerThread.cc \
gnu/gcj/runtime/natFirstThread.cc \
+gnu/gcj/runtime/natNameFinder.cc \
gnu/gcj/runtime/natSharedLibLoader.cc \
gnu/gcj/runtime/natStringBuffer.cc \
java/io/natFile.cc \
@@ -1984,12 +2036,14 @@ java/lang/natString.cc \
java/lang/natStringBuffer.cc \
java/lang/natSystem.cc \
java/lang/natThread.cc \
-java/lang/natThrowable.cc \
+java/lang/natVMThrowable.cc \
java/lang/ref/natReference.cc \
java/lang/reflect/natArray.cc \
java/lang/reflect/natConstructor.cc \
java/lang/reflect/natField.cc \
java/lang/reflect/natMethod.cc \
+java/lang/reflect/natProxy.cc \
+java/net/natNetworkInterface.cc \
java/net/natInetAddress.cc \
java/net/natPlainDatagramSocketImpl.cc \
java/net/natPlainSocketImpl.cc \
@@ -2123,7 +2177,7 @@ X_LIBS = @X_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
libgcj_la_OBJECTS = prims.lo jni.lo exception.lo resolve.lo \
-defineclass.lo interpret.lo name-finder.lo verify.lo gnu/gcj/natCore.lo \
+defineclass.lo interpret.lo verify.lo gnu/gcj/natCore.lo \
gnu/gcj/convert/JIS0208_to_Unicode.lo \
gnu/gcj/convert/JIS0212_to_Unicode.lo gnu/gcj/convert/Unicode_to_JIS.lo \
gnu/gcj/convert/natIconv.lo gnu/gcj/convert/natInput_EUCJIS.lo \
@@ -2131,7 +2185,7 @@ gnu/gcj/convert/natInput_SJIS.lo gnu/gcj/convert/natOutput_EUCJIS.lo \
gnu/gcj/convert/natOutput_SJIS.lo gnu/gcj/io/natSimpleSHSStream.lo \
gnu/gcj/io/shs.lo gnu/gcj/protocol/core/natCoreInputStream.lo \
gnu/gcj/runtime/natFinalizerThread.lo gnu/gcj/runtime/natFirstThread.lo \
-gnu/gcj/runtime/natSharedLibLoader.lo \
+gnu/gcj/runtime/natNameFinder.lo gnu/gcj/runtime/natSharedLibLoader.lo \
gnu/gcj/runtime/natStringBuffer.lo java/io/natFile.lo \
java/io/natFileDescriptor.lo java/io/natObjectInputStream.lo \
java/io/natObjectOutputStream.lo java/lang/natCharacter.lo \
@@ -2140,10 +2194,11 @@ java/lang/natConcreteProcess.lo java/lang/natDouble.lo \
java/lang/natFloat.lo java/lang/natMath.lo java/lang/natObject.lo \
java/lang/natRuntime.lo java/lang/natString.lo \
java/lang/natStringBuffer.lo java/lang/natSystem.lo \
-java/lang/natThread.lo java/lang/natThrowable.lo \
+java/lang/natThread.lo java/lang/natVMThrowable.lo \
java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \
java/lang/reflect/natConstructor.lo java/lang/reflect/natField.lo \
-java/lang/reflect/natMethod.lo java/net/natInetAddress.lo \
+java/lang/reflect/natMethod.lo java/lang/reflect/natProxy.lo \
+java/net/natNetworkInterface.lo java/net/natInetAddress.lo \
java/net/natPlainDatagramSocketImpl.lo java/net/natPlainSocketImpl.lo \
java/text/natCollator.lo java/util/natTimeZone.lo \
java/util/zip/natDeflater.lo java/util/zip/natInflater.lo
@@ -2246,11 +2301,13 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/gnu/gcj/runtime/FileDeleter.P \
.deps/gnu/gcj/runtime/FinalizerThread.P \
.deps/gnu/gcj/runtime/FirstThread.P .deps/gnu/gcj/runtime/JNIWeakRef.P \
+.deps/gnu/gcj/runtime/NameFinder.P \
.deps/gnu/gcj/runtime/SharedLibLoader.P \
.deps/gnu/gcj/runtime/StringBuffer.P \
.deps/gnu/gcj/runtime/VMClassLoader.P \
.deps/gnu/gcj/runtime/natFinalizerThread.P \
.deps/gnu/gcj/runtime/natFirstThread.P \
+.deps/gnu/gcj/runtime/natNameFinder.P \
.deps/gnu/gcj/runtime/natSharedLibLoader.P \
.deps/gnu/gcj/runtime/natStringBuffer.P .deps/gnu/gcj/xlib/Clip.P \
.deps/gnu/gcj/xlib/Colormap.P .deps/gnu/gcj/xlib/Display.P \
@@ -2439,8 +2496,10 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/gnu/java/locale/LocaleInformation_zh_HK.P \
.deps/gnu/java/locale/LocaleInformation_zh_SG.P \
.deps/gnu/java/locale/LocaleInformation_zh_TW.P \
-.deps/gnu/java/math/MPN.P .deps/gnu/java/rmi/dgc/DGCImpl.P \
-.deps/gnu/java/rmi/dgc/DGCImpl_Skel.P \
+.deps/gnu/java/math/MPN.P \
+.deps/gnu/java/rmi/RMIMarshalledObjectInputStream.P \
+.deps/gnu/java/rmi/RMIMarshalledObjectOutputStream.P \
+.deps/gnu/java/rmi/dgc/DGCImpl.P .deps/gnu/java/rmi/dgc/DGCImpl_Skel.P \
.deps/gnu/java/rmi/dgc/DGCImpl_Stub.P \
.deps/gnu/java/rmi/registry/RegistryImpl.P \
.deps/gnu/java/rmi/registry/RegistryImpl_Skel.P \
@@ -2449,6 +2508,7 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/gnu/java/rmi/rmic/Compiler.P \
.deps/gnu/java/rmi/rmic/CompilerProcess.P \
.deps/gnu/java/rmi/rmic/RMIC.P .deps/gnu/java/rmi/rmic/TabbedWriter.P \
+.deps/gnu/java/rmi/server/ConnectionRunnerPool.P \
.deps/gnu/java/rmi/server/ProtocolConstants.P \
.deps/gnu/java/rmi/server/RMIDefaultSocketFactory.P \
.deps/gnu/java/rmi/server/RMIHashes.P \
@@ -2551,18 +2611,27 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/awt/datatransfer/SystemFlavorMap.P \
.deps/java/awt/datatransfer/Transferable.P \
.deps/java/awt/datatransfer/UnsupportedFlavorException.P \
-.deps/java/awt/dnd/DnDConstants.P .deps/java/awt/dnd/DragGestureEvent.P \
+.deps/java/awt/dnd/Autoscroll.P .deps/java/awt/dnd/DnDConstants.P \
+.deps/java/awt/dnd/DragGestureEvent.P \
.deps/java/awt/dnd/DragGestureListener.P \
.deps/java/awt/dnd/DragGestureRecognizer.P \
.deps/java/awt/dnd/DragSource.P .deps/java/awt/dnd/DragSourceAdapter.P \
.deps/java/awt/dnd/DragSourceContext.P \
.deps/java/awt/dnd/DragSourceDragEvent.P \
+.deps/java/awt/dnd/DragSourceDropEvent.P \
.deps/java/awt/dnd/DragSourceEvent.P \
.deps/java/awt/dnd/DragSourceListener.P \
.deps/java/awt/dnd/DragSourceMotionListener.P \
-.deps/java/awt/dnd/DropTarget.P \
+.deps/java/awt/dnd/DropTarget.P .deps/java/awt/dnd/DropTargetAdapter.P \
+.deps/java/awt/dnd/DropTargetContext.P \
+.deps/java/awt/dnd/DropTargetDragEvent.P \
+.deps/java/awt/dnd/DropTargetDropEvent.P \
+.deps/java/awt/dnd/DropTargetEvent.P \
+.deps/java/awt/dnd/DropTargetListener.P \
.deps/java/awt/dnd/InvalidDnDOperationException.P \
+.deps/java/awt/dnd/MouseDragGestureRecognizer.P \
.deps/java/awt/dnd/peer/DragSourceContextPeer.P \
+.deps/java/awt/dnd/peer/DropTargetContextPeer.P \
.deps/java/awt/event/AWTEventListener.P \
.deps/java/awt/event/AWTEventListenerProxy.P \
.deps/java/awt/event/ActionEvent.P \
@@ -2813,8 +2882,9 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/lang/UnsupportedClassVersionError.P \
.deps/java/lang/UnsupportedOperationException.P \
.deps/java/lang/VMClassLoader.P .deps/java/lang/VMSecurityManager.P \
-.deps/java/lang/VerifyError.P .deps/java/lang/VirtualMachineError.P \
-.deps/java/lang/Void.P .deps/java/lang/dtoa.P .deps/java/lang/e_acos.P \
+.deps/java/lang/VMThrowable.P .deps/java/lang/VerifyError.P \
+.deps/java/lang/VirtualMachineError.P .deps/java/lang/Void.P \
+.deps/java/lang/dtoa.P .deps/java/lang/e_acos.P \
.deps/java/lang/e_asin.P .deps/java/lang/e_atan2.P \
.deps/java/lang/e_exp.P .deps/java/lang/e_fmod.P \
.deps/java/lang/e_log.P .deps/java/lang/e_pow.P \
@@ -2828,7 +2898,7 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/lang/natMath.P .deps/java/lang/natObject.P \
.deps/java/lang/natRuntime.P .deps/java/lang/natString.P \
.deps/java/lang/natStringBuffer.P .deps/java/lang/natSystem.P \
-.deps/java/lang/natThread.P .deps/java/lang/natThrowable.P \
+.deps/java/lang/natThread.P .deps/java/lang/natVMThrowable.P \
.deps/java/lang/ref/PhantomReference.P .deps/java/lang/ref/Reference.P \
.deps/java/lang/ref/ReferenceQueue.P \
.deps/java/lang/ref/SoftReference.P .deps/java/lang/ref/WeakReference.P \
@@ -2836,34 +2906,39 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/lang/reflect/AccessibleObject.P \
.deps/java/lang/reflect/Array.P .deps/java/lang/reflect/Constructor.P \
.deps/java/lang/reflect/Field.P \
+.deps/java/lang/reflect/InvocationHandler.P \
.deps/java/lang/reflect/InvocationTargetException.P \
.deps/java/lang/reflect/Member.P .deps/java/lang/reflect/Method.P \
-.deps/java/lang/reflect/Modifier.P \
+.deps/java/lang/reflect/Modifier.P .deps/java/lang/reflect/Proxy.P \
.deps/java/lang/reflect/ReflectPermission.P \
+.deps/java/lang/reflect/UndeclaredThrowableException.P \
.deps/java/lang/reflect/natArray.P \
.deps/java/lang/reflect/natConstructor.P \
.deps/java/lang/reflect/natField.P .deps/java/lang/reflect/natMethod.P \
-.deps/java/lang/s_atan.P .deps/java/lang/s_ceil.P \
-.deps/java/lang/s_copysign.P .deps/java/lang/s_cos.P \
-.deps/java/lang/s_fabs.P .deps/java/lang/s_floor.P \
-.deps/java/lang/s_rint.P .deps/java/lang/s_scalbn.P \
-.deps/java/lang/s_sin.P .deps/java/lang/s_tan.P \
-.deps/java/lang/sf_fabs.P .deps/java/lang/sf_rint.P \
-.deps/java/lang/strtod.P .deps/java/lang/w_acos.P \
-.deps/java/lang/w_asin.P .deps/java/lang/w_atan2.P \
-.deps/java/lang/w_exp.P .deps/java/lang/w_fmod.P \
-.deps/java/lang/w_log.P .deps/java/lang/w_pow.P \
-.deps/java/lang/w_remainder.P .deps/java/lang/w_sqrt.P \
-.deps/java/math/BigDecimal.P .deps/java/math/BigInteger.P \
-.deps/java/net/Authenticator.P .deps/java/net/BindException.P \
-.deps/java/net/ConnectException.P .deps/java/net/ContentHandler.P \
-.deps/java/net/ContentHandlerFactory.P .deps/java/net/DatagramPacket.P \
-.deps/java/net/DatagramSocket.P .deps/java/net/DatagramSocketImpl.P \
-.deps/java/net/FileNameMap.P .deps/java/net/HttpURLConnection.P \
-.deps/java/net/InetAddress.P .deps/java/net/InetSocketAddress.P \
-.deps/java/net/JarURLConnection.P \
+.deps/java/lang/reflect/natProxy.P .deps/java/lang/s_atan.P \
+.deps/java/lang/s_ceil.P .deps/java/lang/s_copysign.P \
+.deps/java/lang/s_cos.P .deps/java/lang/s_fabs.P \
+.deps/java/lang/s_floor.P .deps/java/lang/s_rint.P \
+.deps/java/lang/s_scalbn.P .deps/java/lang/s_sin.P \
+.deps/java/lang/s_tan.P .deps/java/lang/sf_fabs.P \
+.deps/java/lang/sf_rint.P .deps/java/lang/strtod.P \
+.deps/java/lang/w_acos.P .deps/java/lang/w_asin.P \
+.deps/java/lang/w_atan2.P .deps/java/lang/w_exp.P \
+.deps/java/lang/w_fmod.P .deps/java/lang/w_log.P \
+.deps/java/lang/w_pow.P .deps/java/lang/w_remainder.P \
+.deps/java/lang/w_sqrt.P .deps/java/math/BigDecimal.P \
+.deps/java/math/BigInteger.P .deps/java/net/Authenticator.P \
+.deps/java/net/BindException.P .deps/java/net/ConnectException.P \
+.deps/java/net/ContentHandler.P .deps/java/net/ContentHandlerFactory.P \
+.deps/java/net/DatagramPacket.P .deps/java/net/DatagramSocket.P \
+.deps/java/net/DatagramSocketImpl.P \
+.deps/java/net/DatagramSocketImplFactory.P .deps/java/net/FileNameMap.P \
+.deps/java/net/HttpURLConnection.P .deps/java/net/Inet4Address.P \
+.deps/java/net/Inet6Address.P .deps/java/net/InetAddress.P \
+.deps/java/net/InetSocketAddress.P .deps/java/net/JarURLConnection.P \
.deps/java/net/MalformedURLException.P .deps/java/net/MulticastSocket.P \
-.deps/java/net/NetPermission.P .deps/java/net/NoRouteToHostException.P \
+.deps/java/net/NetPermission.P .deps/java/net/NetworkInterface.P \
+.deps/java/net/NoRouteToHostException.P \
.deps/java/net/PasswordAuthentication.P \
.deps/java/net/PlainDatagramSocketImpl.P \
.deps/java/net/PlainSocketImpl.P \
@@ -2873,7 +2948,7 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/net/SocketException.P .deps/java/net/SocketImpl.P \
.deps/java/net/SocketImplFactory.P .deps/java/net/SocketOptions.P \
.deps/java/net/SocketPermission.P \
-.deps/java/net/SocketTimeoutException.P \
+.deps/java/net/SocketTimeoutException.P .deps/java/net/URI.P \
.deps/java/net/URISyntaxException.P .deps/java/net/URL.P \
.deps/java/net/URLClassLoader.P .deps/java/net/URLConnection.P \
.deps/java/net/URLDecoder.P .deps/java/net/URLEncoder.P \
@@ -2881,10 +2956,30 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/net/URLStreamHandlerFactory.P \
.deps/java/net/UnknownHostException.P \
.deps/java/net/UnknownServiceException.P \
-.deps/java/net/natInetAddress.P \
+.deps/java/net/natInetAddress.P .deps/java/net/natNetworkInterface.P \
.deps/java/net/natPlainDatagramSocketImpl.P \
-.deps/java/net/natPlainSocketImpl.P .deps/java/rmi/AccessException.P \
-.deps/java/rmi/AlreadyBoundException.P \
+.deps/java/net/natPlainSocketImpl.P .deps/java/nio/Buffer.P \
+.deps/java/nio/ByteBuffer.P .deps/java/nio/MappedByteBuffer.P \
+.deps/java/nio/channels/AlreadyConnectedException.P \
+.deps/java/nio/channels/ByteChannel.P .deps/java/nio/channels/Channel.P \
+.deps/java/nio/channels/ClosedChannelException.P \
+.deps/java/nio/channels/DatagramChannel.P \
+.deps/java/nio/channels/GatheringByteChannel.P \
+.deps/java/nio/channels/IllegalBlockingModeException.P \
+.deps/java/nio/channels/InterruptibleChannel.P \
+.deps/java/nio/channels/ReadableByteChannel.P \
+.deps/java/nio/channels/ScatteringByteChannel.P \
+.deps/java/nio/channels/ServerSocketChannel.P \
+.deps/java/nio/channels/SocketChannel.P \
+.deps/java/nio/channels/WritableByteChannel.P \
+.deps/java/nio/channels/spi/AbstractSelectableChannel.P \
+.deps/java/nio/charset/CharacterCodingException.P \
+.deps/java/nio/charset/IllegalCharsetNameException.P \
+.deps/java/nio/charset/MalformedInputException.P \
+.deps/java/nio/charset/UnmappableCharacterException.P \
+.deps/java/nio/charset/UnsupportedCharsetException.P \
+.deps/java/nio/charset/spi/CharsetProvider.P \
+.deps/java/rmi/AccessException.P .deps/java/rmi/AlreadyBoundException.P \
.deps/java/rmi/ConnectException.P .deps/java/rmi/ConnectIOException.P \
.deps/java/rmi/MarshalException.P .deps/java/rmi/MarshalledObject.P \
.deps/java/rmi/Naming.P .deps/java/rmi/NoSuchObjectException.P \
@@ -3096,8 +3191,11 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/java/util/jar/JarException.P .deps/java/util/jar/JarFile.P \
.deps/java/util/jar/JarInputStream.P \
.deps/java/util/jar/JarOutputStream.P .deps/java/util/jar/Manifest.P \
-.deps/java/util/natTimeZone.P .deps/java/util/zip/Adler32.P \
-.deps/java/util/zip/CRC32.P .deps/java/util/zip/CheckedInputStream.P \
+.deps/java/util/natTimeZone.P .deps/java/util/regex/Matcher.P \
+.deps/java/util/regex/Pattern.P \
+.deps/java/util/regex/PatternSyntaxException.P \
+.deps/java/util/zip/Adler32.P .deps/java/util/zip/CRC32.P \
+.deps/java/util/zip/CheckedInputStream.P \
.deps/java/util/zip/CheckedOutputStream.P \
.deps/java/util/zip/Checksum.P \
.deps/java/util/zip/DataFormatException.P \
@@ -3468,17 +3566,17 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
.deps/javax/transaction/UserTransaction.P \
.deps/javax/transaction/xa/XAException.P \
.deps/javax/transaction/xa/XAResource.P \
-.deps/javax/transaction/xa/Xid.P .deps/jni.P .deps/name-finder.P \
-.deps/no-threads.P .deps/nogc.P .deps/org/w3c/dom/Attr.P \
-.deps/org/w3c/dom/CDATASection.P .deps/org/w3c/dom/CharacterData.P \
-.deps/org/w3c/dom/Comment.P .deps/org/w3c/dom/DOMException.P \
-.deps/org/w3c/dom/DOMImplementation.P .deps/org/w3c/dom/Document.P \
-.deps/org/w3c/dom/DocumentFragment.P .deps/org/w3c/dom/DocumentType.P \
-.deps/org/w3c/dom/Element.P .deps/org/w3c/dom/Entity.P \
-.deps/org/w3c/dom/EntityReference.P .deps/org/w3c/dom/NamedNodeMap.P \
-.deps/org/w3c/dom/Node.P .deps/org/w3c/dom/NodeList.P \
-.deps/org/w3c/dom/Notation.P .deps/org/w3c/dom/ProcessingInstruction.P \
-.deps/org/w3c/dom/Text.P .deps/org/w3c/dom/ranges/DocumentRange.P \
+.deps/javax/transaction/xa/Xid.P .deps/jni.P .deps/no-threads.P \
+.deps/nogc.P .deps/org/w3c/dom/Attr.P .deps/org/w3c/dom/CDATASection.P \
+.deps/org/w3c/dom/CharacterData.P .deps/org/w3c/dom/Comment.P \
+.deps/org/w3c/dom/DOMException.P .deps/org/w3c/dom/DOMImplementation.P \
+.deps/org/w3c/dom/Document.P .deps/org/w3c/dom/DocumentFragment.P \
+.deps/org/w3c/dom/DocumentType.P .deps/org/w3c/dom/Element.P \
+.deps/org/w3c/dom/Entity.P .deps/org/w3c/dom/EntityReference.P \
+.deps/org/w3c/dom/NamedNodeMap.P .deps/org/w3c/dom/Node.P \
+.deps/org/w3c/dom/NodeList.P .deps/org/w3c/dom/Notation.P \
+.deps/org/w3c/dom/ProcessingInstruction.P .deps/org/w3c/dom/Text.P \
+.deps/org/w3c/dom/ranges/DocumentRange.P \
.deps/org/w3c/dom/ranges/Range.P \
.deps/org/w3c/dom/ranges/RangeException.P \
.deps/org/w3c/dom/traversal/DocumentTraversal.P \
@@ -4135,6 +4233,18 @@ java/lang/reflect/Method.h: java/lang/reflect/Method.class
-friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \
$(basename $<)
+java/lang/reflect/Proxy.h: java/lang/reflect/Proxy.class
+ $(GCJH) -classpath '' -bootclasspath $(top_builddir) \
+ $(basename $<)
+
+java/lang/reflect/Proxy$$ProxyData.h: java/lang/reflect/Proxy.class
+ $(GCJH) -classpath '' -bootclasspath $(top_builddir) \
+ 'java/lang/reflect/Proxy$$ProxyData'
+
+java/lang/reflect/Proxy$$ProxyType.h: java/lang/reflect/Proxy.class
+ $(GCJH) -classpath '' -bootclasspath $(top_builddir) \
+ 'java/lang/reflect/Proxy$$ProxyType'
+
gnu/gcj/runtime/VMClassLoader.h: gnu/gcj/runtime/VMClassLoader.class
$(GCJH) -classpath '' -bootclasspath $(top_builddir) \
-friend 'class ::java::lang::ClassLoader;' \
@@ -4287,7 +4397,7 @@ distclean-recursive: distclean-multi
maintainer-clean-recursive: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/libjava/acconfig.h b/libjava/acconfig.h
index bd02d33c16f..308f71ebdec 100644
--- a/libjava/acconfig.h
+++ b/libjava/acconfig.h
@@ -107,6 +107,7 @@
#undef HAVE_READDIR_R
#undef HAVE_GETHOSTBYNAME_R
#undef HAVE_GETHOSTBYADDR_R
+#undef HAVE_FTRUNCATE
/* Define if you want a bytecode interpreter. */
#undef INTERPRETER
diff --git a/libjava/aclocal.m4 b/libjava/aclocal.m4
index fc85cbde103..26e735711b9 100644
--- a/libjava/aclocal.m4
+++ b/libjava/aclocal.m4
@@ -434,3 +434,26 @@ for am_file in <<$1>>; do
done<<>>dnl>>)
changequote([,]))])
+AC_DEFUN([CHECK_FOR_BROKEN_MINGW_LD],
+[
+AC_MSG_CHECKING(whether 'ld' is at least 2.13)
+LD_PROG=`$CC --print-prog-name=ld`
+LD_VERSION=`$LD_PROG --version`
+LD_VERSION_MAJOR=`echo "$LD_VERSION" | head -1 | cut -d '.' -f 1 | cut -d ' ' -f 4`
+LD_VERSION_MINOR=`echo "$LD_VERSION" | head -1 | cut -d '.' -f 2`
+if expr "$LD_VERSION_MAJOR" \> 2 > /dev/null; then
+ LD_OK="ok"
+else
+ if expr "$LD_VERSION_MAJOR" = 2 && expr "$LD_VERSION_MINOR" \>= 13 > /dev/null; then
+ LD_OK="ok"
+ fi
+fi
+if test "x$LD_OK" != x; then
+ AC_MSG_RESULT([yes; major=$LD_VERSION_MAJOR, minor=$LD_VERSION_MINOR])
+else
+ AC_MSG_RESULT([no; major=$LD_VERSION_MAJOR, minor=$LD_VERSION_MINOR])
+ AC_MSG_WARN([ld <2.13 detected; enabling JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS hack...])
+ AC_DEFINE(JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS, 1,
+ [Indicate that linker is not able to 8-byte align static data])
+fi[]dnl
+])# CHECK_FOR_BROKEN_MINGW_LD
diff --git a/libjava/boehm.cc b/libjava/boehm.cc
index be2855aef72..466c9223ac8 100644
--- a/libjava/boehm.cc
+++ b/libjava/boehm.cc
@@ -1,6 +1,6 @@
// boehm.cc - interface between libjava and Boehm GC.
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation
This file is part of libgcj.
@@ -134,6 +134,12 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void * /* env */)
p = (ptr_t) c->methods;
MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, c6label);
+ // The vtable might have been set, but the rest of the class
+ // could still be uninitialized. If this is the case, then
+ // c.isArray will SEGV. We check for this, and if it is the
+ // case we just return.
+ if (__builtin_expect (c->name == NULL, false))
+ return mark_stack_ptr;
if (! c->isArray() && ! c->isPrimitive())
{
diff --git a/libjava/configure b/libjava/configure
index cb4425d07de..514a1aa294e 100755
--- a/libjava/configure
+++ b/libjava/configure
@@ -82,7 +82,6 @@ program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
-sitefile=
srcdir=
target=NONE
verbose=
@@ -197,7 +196,6 @@ Configuration:
--help print this message
--no-create do not create output files
--quiet, --silent do not print \`checking...' messages
- --site-file=FILE use FILE as the site file
--version print the version of autoconf that created configure
Directory and file names:
--prefix=PREFIX install architecture-independent files in PREFIX
@@ -368,11 +366,6 @@ EOF
-site=* | --site=* | --sit=*)
site="$ac_optarg" ;;
- -site-file | --site-file | --site-fil | --site-fi | --site-f)
- ac_prev=sitefile ;;
- -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
- sitefile="$ac_optarg" ;;
-
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
@@ -538,16 +531,12 @@ fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
# Prefer explicitly selected file to automatically selected ones.
-if test -z "$sitefile"; then
- if test -z "$CONFIG_SITE"; then
- if test "x$prefix" != xNONE; then
- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
- else
- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
- fi
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-else
- CONFIG_SITE="$sitefile"
fi
for ac_site_file in $CONFIG_SITE; do
if test -r "$ac_site_file"; then
@@ -594,7 +583,7 @@ fi
ORIGINAL_LD_FOR_MULTILIBS=$LD
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:598: checking whether ln -s works" >&5
+echo "configure:587: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -647,7 +636,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:651: checking for a BSD compatible install" >&5
+echo "configure:640: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -700,7 +689,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:704: checking whether build environment is sane" >&5
+echo "configure:693: checking whether build environment is sane" >&5
# Just in case
sleep 1
echo timestamp > conftestfile
@@ -757,7 +746,7 @@ test "$program_suffix" != NONE &&
test "$program_transform_name" = "" && program_transform_name="s,x,x,"
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:761: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:750: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -790,12 +779,12 @@ else
fi
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:794: checking for Cygwin environment" >&5
+echo "configure:783: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 799 "configure"
+#line 788 "configure"
#include "confdefs.h"
int main() {
@@ -806,7 +795,7 @@ int main() {
return __CYGWIN__;
; return 0; }
EOF
-if { (eval echo configure:810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cygwin=yes
else
@@ -823,19 +812,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes
echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:827: checking for mingw32 environment" >&5
+echo "configure:816: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 832 "configure"
+#line 821 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
-if { (eval echo configure:839: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:828: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_mingw32=yes
else
@@ -962,7 +951,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:966: checking host system type" >&5
+echo "configure:955: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@@ -983,7 +972,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:987: checking target system type" >&5
+echo "configure:976: checking target system type" >&5
target_alias=$target
case "$target_alias" in
@@ -1001,7 +990,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:1005: checking build system type" >&5
+echo "configure:994: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -1030,7 +1019,7 @@ test "$host_alias" != "$target_alias" &&
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1034: checking for $ac_word" >&5
+echo "configure:1023: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1060,7 +1049,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1064: checking for $ac_word" >&5
+echo "configure:1053: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1111,7 +1100,7 @@ fi
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1115: checking for $ac_word" >&5
+echo "configure:1104: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1144,7 +1133,7 @@ fi
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1148: checking whether we are using GNU C" >&5
+echo "configure:1137: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1153,7 +1142,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1157: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1146: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -1172,7 +1161,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1176: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1165: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1221,7 +1210,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1225: checking for $ac_word" >&5
+echo "configure:1214: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_glibjava_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1256,7 +1245,7 @@ CXX=$glibjava_CXX
test -z "$glibjava_CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; }
echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
-echo "configure:1260: checking whether we are using GNU C++" >&5
+echo "configure:1249: checking whether we are using GNU C++" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1265,7 +1254,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1258: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gxx=yes
else
ac_cv_prog_gxx=no
@@ -1280,7 +1269,7 @@ if test $ac_cv_prog_gxx = yes; then
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=
echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
-echo "configure:1284: checking whether ${CXX-g++} accepts -g" >&5
+echo "configure:1273: checking whether ${CXX-g++} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1329,7 +1318,7 @@ EOF
missing_dir=`cd $ac_aux_dir && pwd`
echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:1333: checking for working aclocal" >&5
+echo "configure:1322: checking for working aclocal" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1342,7 +1331,7 @@ else
fi
echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:1346: checking for working autoconf" >&5
+echo "configure:1335: checking for working autoconf" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1355,7 +1344,7 @@ else
fi
echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:1359: checking for working automake" >&5
+echo "configure:1348: checking for working automake" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1368,7 +1357,7 @@ else
fi
echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:1372: checking for working autoheader" >&5
+echo "configure:1361: checking for working autoheader" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1381,7 +1370,7 @@ else
fi
echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:1385: checking for working makeinfo" >&5
+echo "configure:1374: checking for working makeinfo" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1400,7 +1389,7 @@ fi
# LIBGCJ_CONFIGURE, which doesn't work because that means that it will
# be run before AC_CANONICAL_HOST.
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:1404: checking build system type" >&5
+echo "configure:1393: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -1421,7 +1410,7 @@ echo "$ac_t""$build" 1>&6
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1425: checking for $ac_word" >&5
+echo "configure:1414: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1453,7 +1442,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1457: checking for $ac_word" >&5
+echo "configure:1446: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1485,7 +1474,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1489: checking for $ac_word" >&5
+echo "configure:1478: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1517,7 +1506,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1521: checking for $ac_word" >&5
+echo "configure:1510: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1562,7 +1551,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1566: checking for a BSD compatible install" >&5
+echo "configure:1555: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1616,7 +1605,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:1620: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:1609: checking whether to enable maintainer-specific portions of Makefiles" >&5
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
@@ -1642,7 +1631,7 @@ fi
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1646: checking for executable suffix" >&5
+echo "configure:1635: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1652,10 +1641,10 @@ else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
- if { (eval echo configure:1656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ if { (eval echo configure:1645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
- *.c | *.o | *.obj | *.ilk | *.pdb) ;;
+ *.c | *.o | *.obj) ;;
*) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
esac
done
@@ -1802,7 +1791,7 @@ ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:1806: checking for ld used by GCC" >&5
+echo "configure:1795: checking for ld used by GCC" >&5
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
@@ -1832,10 +1821,10 @@ echo "configure:1806: checking for ld used by GCC" >&5
esac
elif test "$with_gnu_ld" = yes; then
echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:1836: checking for GNU ld" >&5
+echo "configure:1825: checking for GNU ld" >&5
else
echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-echo "configure:1839: checking for non-GNU ld" >&5
+echo "configure:1828: checking for non-GNU ld" >&5
fi
if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1870,7 +1859,7 @@ else
fi
test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
-echo "configure:1874: checking if the linker ($LD) is GNU ld" >&5
+echo "configure:1863: checking if the linker ($LD) is GNU ld" >&5
if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1887,7 +1876,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
-echo "configure:1891: checking for $LD option to reload object files" >&5
+echo "configure:1880: checking for $LD option to reload object files" >&5
if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1899,7 +1888,7 @@ reload_flag=$lt_cv_ld_reload_flag
test -n "$reload_flag" && reload_flag=" $reload_flag"
echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
-echo "configure:1903: checking for BSD-compatible nm" >&5
+echo "configure:1892: checking for BSD-compatible nm" >&5
if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1937,7 +1926,7 @@ NM="$lt_cv_path_NM"
echo "$ac_t""$NM" 1>&6
echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
-echo "configure:1941: checking how to recognise dependant libraries" >&5
+echo "configure:1930: checking how to recognise dependant libraries" >&5
if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2110,13 +2099,13 @@ file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
echo $ac_n "checking for object suffix""... $ac_c" 1>&6
-echo "configure:2114: checking for object suffix" >&5
+echo "configure:2103: checking for object suffix" >&5
if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
rm -f conftest*
echo 'int i = 1;' > conftest.$ac_ext
-if { (eval echo configure:2120: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2109: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
for ac_file in conftest.*; do
case $ac_file in
*.c) ;;
@@ -2140,7 +2129,7 @@ case $deplibs_check_method in
file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
-echo "configure:2144: checking for ${ac_tool_prefix}file" >&5
+echo "configure:2133: checking for ${ac_tool_prefix}file" >&5
if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2202,7 +2191,7 @@ fi
if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
echo $ac_n "checking for file""... $ac_c" 1>&6
-echo "configure:2206: checking for file" >&5
+echo "configure:2195: checking for file" >&5
if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2273,7 +2262,7 @@ esac
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2277: checking for $ac_word" >&5
+echo "configure:2266: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2305,7 +2294,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2309: checking for $ac_word" >&5
+echo "configure:2298: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2340,7 +2329,7 @@ fi
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2344: checking for $ac_word" >&5
+echo "configure:2333: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2372,7 +2361,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2376: checking for $ac_word" >&5
+echo "configure:2365: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2439,8 +2428,8 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 2443 "configure"' > conftest.$ac_ext
- if { (eval echo configure:2444: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ echo '#line 2432 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:2433: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
@@ -2459,7 +2448,7 @@ case $host in
ia64-*-hpux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
- if { (eval echo configure:2463: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ if { (eval echo configure:2452: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
case "`/usr/bin/file conftest.o`" in
*ELF-32*)
HPUX_IA64_MODE="32"
@@ -2477,7 +2466,7 @@ ia64-*-hpux*)
SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -belf"
echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
-echo "configure:2481: checking whether the C compiler needs -belf" >&5
+echo "configure:2470: checking whether the C compiler needs -belf" >&5
if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2490,14 +2479,14 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
-#line 2494 "configure"
+#line 2483 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:2501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2490: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
lt_cv_cc_needs_belf=yes
else
@@ -2527,7 +2516,7 @@ echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
esac
echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
-echo "configure:2531: checking how to run the C++ preprocessor" >&5
+echo "configure:2520: checking how to run the C++ preprocessor" >&5
if test -z "$CXXCPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2540,12 +2529,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
CXXCPP="${CXX-g++} -E"
cat > conftest.$ac_ext <<EOF
-#line 2544 "configure"
+#line 2533 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2549: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2538: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2781,7 +2770,7 @@ INTERPRETER="$libgcj_interpreter"
echo $ac_n "checking for exception model to use""... $ac_c" 1>&6
-echo "configure:2785: checking for exception model to use" >&5
+echo "configure:2774: checking for exception model to use" >&5
ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -2796,7 +2785,7 @@ if test "${enable_sjlj_exceptions+set}" = set; then
:
else
cat > conftest.$ac_ext << EOF
-#line 2800 "configure"
+#line 2789 "configure"
struct S { ~S(); };
void bar();
void foo()
@@ -2807,7 +2796,7 @@ void foo()
EOF
old_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=-S
-if { (eval echo configure:2811: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2800: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
enable_sjlj_exceptions=yes
elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
@@ -2915,6 +2904,30 @@ case "$TARGET_ECOS" in
PLATFORM=Win32
PLATFORMOBJS=win32.lo
PLATFORMH=win32.h
+
+echo $ac_n "checking whether 'ld' is at least 2.13""... $ac_c" 1>&6
+echo "configure:2910: checking whether 'ld' is at least 2.13" >&5
+LD_PROG=`$CC --print-prog-name=ld`
+LD_VERSION=`$LD_PROG --version`
+LD_VERSION_MAJOR=`echo "$LD_VERSION" | head -1 | cut -d '.' -f 1 | cut -d ' ' -f 4`
+LD_VERSION_MINOR=`echo "$LD_VERSION" | head -1 | cut -d '.' -f 2`
+if expr "$LD_VERSION_MAJOR" \> 2 > /dev/null; then
+ LD_OK="ok"
+else
+ if expr "$LD_VERSION_MAJOR" = 2 && expr "$LD_VERSION_MINOR" \>= 13 > /dev/null; then
+ LD_OK="ok"
+ fi
+fi
+if test "x$LD_OK" != x; then
+ echo "$ac_t""yes; major=$LD_VERSION_MAJOR, minor=$LD_VERSION_MINOR" 1>&6
+else
+ echo "$ac_t""no; major=$LD_VERSION_MAJOR, minor=$LD_VERSION_MINOR" 1>&6
+ echo "configure: warning: ld <2.13 detected; enabling JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS hack..." 1>&2
+ cat >> confdefs.h <<\EOF
+#define JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS 1
+EOF
+
+fi
;;
*)
PLATFORM=Posix
@@ -2937,7 +2950,7 @@ esac
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:2941: checking how to run the C preprocessor" >&5
+echo "configure:2954: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -2952,13 +2965,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 2956 "configure"
+#line 2969 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2962: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2975: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2969,13 +2982,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 2973 "configure"
+#line 2986 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2979: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2992: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2986,13 +2999,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 2990 "configure"
+#line 3003 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2996: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3009: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -3017,7 +3030,7 @@ fi
echo "$ac_t""$CPP" 1>&6
cat > conftest.$ac_ext <<EOF
-#line 3021 "configure"
+#line 3034 "configure"
#include "confdefs.h"
#include <stdint.h>
EOF
@@ -3032,7 +3045,7 @@ fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3036 "configure"
+#line 3049 "configure"
#include "confdefs.h"
#include <inttypes.h>
EOF
@@ -3047,7 +3060,7 @@ fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3051 "configure"
+#line 3064 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
@@ -3062,7 +3075,7 @@ fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3066 "configure"
+#line 3079 "configure"
#include "confdefs.h"
#include <sys/config.h>
EOF
@@ -3079,7 +3092,7 @@ rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3083 "configure"
+#line 3096 "configure"
#include "confdefs.h"
#include <time.h>
EOF
@@ -3094,7 +3107,7 @@ fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3098 "configure"
+#line 3111 "configure"
#include "confdefs.h"
#include <time.h>
EOF
@@ -3146,7 +3159,7 @@ ZLIBTESTSPEC=
libsubdir=.libs
echo $ac_n "checking for garbage collector to use""... $ac_c" 1>&6
-echo "configure:3150: checking for garbage collector to use" >&5
+echo "configure:3163: checking for garbage collector to use" >&5
# Check whether --enable-java-gc or --disable-java-gc was given.
if test "${enable_java_gc+set}" = set; then
enableval="$enable_java_gc"
@@ -3199,7 +3212,7 @@ esac
echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6
-echo "configure:3203: checking for thread model used by GCC" >&5
+echo "configure:3216: checking for thread model used by GCC" >&5
THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
echo "$ac_t""$THREADS" 1>&6
@@ -3314,7 +3327,7 @@ if test -d sysdep; then true; else mkdir sysdep; fi
HASH_SYNC_SPEC=
# Hash synchronization is only useful with posix threads right now.
-if test "$enable_hash_synchronization" = yes && test "$THREADS" = "posix"; then
+if test "$enable_hash_synchronization" = yes; then
HASH_SYNC_SPEC=-fhash-synchronization
cat >> confdefs.h <<\EOF
#define JV_HASH_SYNCHRONIZATION 1
@@ -3407,12 +3420,12 @@ else
for ac_func in strerror ioctl select fstat open fsync sleep opendir
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3411: checking for $ac_func" >&5
+echo "configure:3424: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3416 "configure"
+#line 3429 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3435,7 +3448,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3439: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3462,12 +3475,12 @@ done
for ac_func in gmtime_r localtime_r readdir_r getpwuid_r getcwd
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3466: checking for $ac_func" >&5
+echo "configure:3479: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3471 "configure"
+#line 3484 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3490,7 +3503,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3517,12 +3530,12 @@ done
for ac_func in access stat mkdir rename rmdir unlink realpath utime chmod
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3521: checking for $ac_func" >&5
+echo "configure:3534: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3526 "configure"
+#line 3539 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3545,7 +3558,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3572,12 +3585,12 @@ done
for ac_func in nl_langinfo setlocale
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3576: checking for $ac_func" >&5
+echo "configure:3589: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3581 "configure"
+#line 3594 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3600,7 +3613,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3604: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3627,12 +3640,12 @@ done
for ac_func in inet_aton inet_addr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3631: checking for $ac_func" >&5
+echo "configure:3644: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3636 "configure"
+#line 3649 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3655,7 +3668,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3682,12 +3695,12 @@ done
for ac_func in inet_pton uname inet_ntoa
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3686: checking for $ac_func" >&5
+echo "configure:3699: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3691 "configure"
+#line 3704 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3710,7 +3723,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3734,15 +3747,15 @@ else
fi
done
- for ac_func in fork execvp pipe sigaction
+ for ac_func in fork execvp pipe sigaction ftruncate
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3741: checking for $ac_func" >&5
+echo "configure:3754: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3746 "configure"
+#line 3759 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3765,7 +3778,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3769: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3793,17 +3806,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3797: checking for $ac_hdr" >&5
+echo "configure:3810: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3802 "configure"
+#line 3815 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3807: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -3830,12 +3843,12 @@ fi
done
echo $ac_n "checking for backtrace""... $ac_c" 1>&6
-echo "configure:3834: checking for backtrace" >&5
+echo "configure:3847: checking for backtrace" >&5
if eval "test \"`echo '$''{'ac_cv_func_backtrace'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3839 "configure"
+#line 3852 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char backtrace(); below. */
@@ -3858,7 +3871,7 @@ backtrace();
; return 0; }
EOF
-if { (eval echo configure:3862: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_backtrace=yes"
else
@@ -3894,7 +3907,7 @@ fi
echo $ac_n "checking for dladdr in -ldl""... $ac_c" 1>&6
-echo "configure:3898: checking for dladdr in -ldl" >&5
+echo "configure:3911: checking for dladdr in -ldl" >&5
ac_lib_var=`echo dl'_'dladdr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -3902,7 +3915,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3906 "configure"
+#line 3919 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3913,7 +3926,7 @@ int main() {
dladdr()
; return 0; }
EOF
-if { (eval echo configure:3917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3930: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -3943,7 +3956,7 @@ do
ac_safe=`echo "$ac_file" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_file""... $ac_c" 1>&6
-echo "configure:3947: checking for $ac_file" >&5
+echo "configure:3960: checking for $ac_file" >&5
if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4001,7 +4014,7 @@ fi
echo $ac_n "checking for iconv""... $ac_c" 1>&6
-echo "configure:4005: checking for iconv" >&5
+echo "configure:4018: checking for iconv" >&5
if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4009,7 +4022,7 @@ else
am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no
cat > conftest.$ac_ext <<EOF
-#line 4013 "configure"
+#line 4026 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <iconv.h>
@@ -4019,7 +4032,7 @@ iconv_t cd = iconv_open("","");
iconv_close(cd);
; return 0; }
EOF
-if { (eval echo configure:4023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4036: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_func_iconv=yes
else
@@ -4031,7 +4044,7 @@ rm -f conftest*
am_save_LIBS="$LIBS"
LIBS="$LIBS $am_cv_libiconv_ldpath -liconv"
cat > conftest.$ac_ext <<EOF
-#line 4035 "configure"
+#line 4048 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <iconv.h>
@@ -4041,7 +4054,7 @@ iconv_t cd = iconv_open("","");
iconv_close(cd);
; return 0; }
EOF
-if { (eval echo configure:4045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_lib_iconv=yes
am_cv_func_iconv=yes
@@ -4062,13 +4075,13 @@ echo "$ac_t""$am_cv_func_iconv" 1>&6
EOF
echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6
-echo "configure:4066: checking for iconv declaration" >&5
+echo "configure:4079: checking for iconv declaration" >&5
if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4072 "configure"
+#line 4085 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -4087,7 +4100,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:4091: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4104: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
am_cv_proto_iconv_arg1=""
else
@@ -4116,19 +4129,19 @@ EOF
if test $ac_cv_header_locale_h = yes; then
echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:4120: checking for LC_MESSAGES" >&5
+echo "configure:4133: checking for LC_MESSAGES" >&5
if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4125 "configure"
+#line 4138 "configure"
#include "confdefs.h"
#include <locale.h>
int main() {
return LC_MESSAGES
; return 0; }
EOF
-if { (eval echo configure:4132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
am_cv_val_LC_MESSAGES=yes
else
@@ -4149,12 +4162,12 @@ EOF
fi
fi
echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:4153: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:4166: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4158 "configure"
+#line 4171 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
@@ -4162,7 +4175,7 @@ int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
-if { (eval echo configure:4166: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4179: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm=time.h
else
@@ -4183,12 +4196,12 @@ EOF
fi
echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
-echo "configure:4187: checking for tm_zone in struct tm" >&5
+echo "configure:4200: checking for tm_zone in struct tm" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4192 "configure"
+#line 4205 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_cv_struct_tm>
@@ -4196,7 +4209,7 @@ int main() {
struct tm tm; tm.tm_zone;
; return 0; }
EOF
-if { (eval echo configure:4200: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm_zone=yes
else
@@ -4216,12 +4229,12 @@ EOF
else
echo $ac_n "checking for tzname""... $ac_c" 1>&6
-echo "configure:4220: checking for tzname" >&5
+echo "configure:4233: checking for tzname" >&5
if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4225 "configure"
+#line 4238 "configure"
#include "confdefs.h"
#include <time.h>
#ifndef tzname /* For SGI. */
@@ -4231,7 +4244,7 @@ int main() {
atoi(*tzname);
; return 0; }
EOF
-if { (eval echo configure:4235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4248: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_var_tzname=yes
else
@@ -4256,12 +4269,12 @@ fi
for ac_func in gethostbyname_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4260: checking for $ac_func" >&5
+echo "configure:4273: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4265 "configure"
+#line 4278 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4284,7 +4297,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4288: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4311,7 +4324,7 @@ EOF
# We look for the one that returns `int'.
# Hopefully this check is robust enough.
cat > conftest.$ac_ext <<EOF
-#line 4315 "configure"
+#line 4328 "configure"
#include "confdefs.h"
#include <netdb.h>
EOF
@@ -4331,7 +4344,7 @@ rm -f conftest*
*" -D_REENTRANT "*) ;;
*)
echo $ac_n "checking whether gethostbyname_r declaration requires -D_REENTRANT""... $ac_c" 1>&6
-echo "configure:4335: checking whether gethostbyname_r declaration requires -D_REENTRANT" >&5
+echo "configure:4348: checking whether gethostbyname_r declaration requires -D_REENTRANT" >&5
if eval "test \"`echo '$''{'libjava_cv_gethostbyname_r_needs_reentrant'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4344,14 +4357,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 4348 "configure"
+#line 4361 "configure"
#include "confdefs.h"
#include <netdb.h>
int main() {
gethostbyname_r("", 0, 0);
; return 0; }
EOF
-if { (eval echo configure:4355: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4368: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libjava_cv_gethostbyname_r_needs_reentrant=no
else
@@ -4361,14 +4374,14 @@ else
CPPFLAGS_SAVE="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -D_REENTRANT"
cat > conftest.$ac_ext <<EOF
-#line 4365 "configure"
+#line 4378 "configure"
#include "confdefs.h"
#include <netdb.h>
int main() {
gethostbyname_r("", 0, 0);
; return 0; }
EOF
-if { (eval echo configure:4372: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4385: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libjava_cv_gethostbyname_r_needs_reentrant=yes
else
@@ -4403,12 +4416,12 @@ EOF
esac
echo $ac_n "checking for struct hostent_data""... $ac_c" 1>&6
-echo "configure:4407: checking for struct hostent_data" >&5
+echo "configure:4420: checking for struct hostent_data" >&5
if eval "test \"`echo '$''{'libjava_cv_struct_hostent_data'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4412 "configure"
+#line 4425 "configure"
#include "confdefs.h"
#if GETHOSTBYNAME_R_NEEDS_REENTRANT && !defined(_REENTRANT)
@@ -4419,7 +4432,7 @@ int main() {
struct hostent_data data;
; return 0; }
EOF
-if { (eval echo configure:4423: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4436: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libjava_cv_struct_hostent_data=yes
else
@@ -4451,7 +4464,7 @@ done
# to exist where expected. (The root issue: AC_CHECK_FUNCS assumes C
# linkage check is enough, yet C++ code requires proper prototypes.)
cat > conftest.$ac_ext <<EOF
-#line 4455 "configure"
+#line 4468 "configure"
#include "confdefs.h"
#include <netdb.h>
EOF
@@ -4462,12 +4475,12 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
for ac_func in gethostbyaddr_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4466: checking for $ac_func" >&5
+echo "configure:4479: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4471 "configure"
+#line 4484 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4490,7 +4503,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4517,7 +4530,7 @@ EOF
# We look for the one that returns `int'.
# Hopefully this check is robust enough.
cat > conftest.$ac_ext <<EOF
-#line 4521 "configure"
+#line 4534 "configure"
#include "confdefs.h"
#include <netdb.h>
EOF
@@ -4544,12 +4557,12 @@ rm -f conftest*
for ac_func in gethostname
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4548: checking for $ac_func" >&5
+echo "configure:4561: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4553 "configure"
+#line 4566 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4572,7 +4585,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4576: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4589: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4596,7 +4609,7 @@ EOF
EOF
cat > conftest.$ac_ext <<EOF
-#line 4600 "configure"
+#line 4613 "configure"
#include "confdefs.h"
#include <unistd.h>
EOF
@@ -4627,12 +4640,12 @@ done
for ac_func in pthread_mutexattr_settype pthread_mutexattr_setkind_np
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4631: checking for $ac_func" >&5
+echo "configure:4644: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4636 "configure"
+#line 4649 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4655,7 +4668,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4685,12 +4698,12 @@ done
for ac_func in sched_yield
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4689: checking for $ac_func" >&5
+echo "configure:4702: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4694 "configure"
+#line 4707 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4713,7 +4726,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4730: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4735,7 +4748,7 @@ EOF
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for sched_yield in -lrt""... $ac_c" 1>&6
-echo "configure:4739: checking for sched_yield in -lrt" >&5
+echo "configure:4752: checking for sched_yield in -lrt" >&5
ac_lib_var=`echo rt'_'sched_yield | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -4743,7 +4756,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lrt $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4747 "configure"
+#line 4760 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -4754,7 +4767,7 @@ int main() {
sched_yield()
; return 0; }
EOF
-if { (eval echo configure:4758: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -4780,7 +4793,7 @@ else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for sched_yield in -lposix4""... $ac_c" 1>&6
-echo "configure:4784: checking for sched_yield in -lposix4" >&5
+echo "configure:4797: checking for sched_yield in -lposix4" >&5
ac_lib_var=`echo posix4'_'sched_yield | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -4788,7 +4801,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lposix4 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4792 "configure"
+#line 4805 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -4799,7 +4812,7 @@ int main() {
sched_yield()
; return 0; }
EOF
-if { (eval echo configure:4803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4816: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -4835,7 +4848,7 @@ done
# We can save a little space at runtime if the mutex has m_count
# or __m_count. This is a nice hack for Linux.
cat > conftest.$ac_ext <<EOF
-#line 4839 "configure"
+#line 4852 "configure"
#include "confdefs.h"
#include <pthread.h>
int main() {
@@ -4844,7 +4857,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:4848: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4861: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define PTHREAD_MUTEX_HAVE_M_COUNT 1
@@ -4856,7 +4869,7 @@ else
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 4860 "configure"
+#line 4873 "configure"
#include "confdefs.h"
#include <pthread.h>
int main() {
@@ -4865,7 +4878,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:4869: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4882: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define PTHREAD_MUTEX_HAVE___M_COUNT 1
@@ -4885,12 +4898,12 @@ rm -f conftest*
for ac_func in gettimeofday time ftime
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4889: checking for $ac_func" >&5
+echo "configure:4902: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4894 "configure"
+#line 4907 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4913,7 +4926,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4930: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4944,12 +4957,12 @@ done
for ac_func in memmove
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4948: checking for $ac_func" >&5
+echo "configure:4961: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4953 "configure"
+#line 4966 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4972,7 +4985,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4989: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5002,12 +5015,12 @@ done
for ac_func in memcpy
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5006: checking for $ac_func" >&5
+echo "configure:5019: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5011 "configure"
+#line 5024 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5030,7 +5043,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5034: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5059,7 +5072,7 @@ done
fi
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:5063: checking for dlopen in -ldl" >&5
+echo "configure:5076: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5067,7 +5080,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5071 "configure"
+#line 5084 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -5078,7 +5091,7 @@ int main() {
dlopen()
; return 0; }
EOF
-if { (eval echo configure:5082: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5123,7 +5136,7 @@ fi
#--------------------------------------------------------------------
echo $ac_n "checking for socket libraries""... $ac_c" 1>&6
-echo "configure:5127: checking for socket libraries" >&5
+echo "configure:5140: checking for socket libraries" >&5
if eval "test \"`echo '$''{'gcj_cv_lib_sockets'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -5131,12 +5144,12 @@ else
gcj_checkBoth=0
unset ac_cv_func_connect
echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:5135: checking for connect" >&5
+echo "configure:5148: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5140 "configure"
+#line 5153 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
@@ -5159,7 +5172,7 @@ connect();
; return 0; }
EOF
-if { (eval echo configure:5163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
@@ -5182,7 +5195,7 @@ fi
if test "$gcj_checkSocket" = 1; then
unset ac_cv_func_connect
echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6
-echo "configure:5186: checking for main in -lsocket" >&5
+echo "configure:5199: checking for main in -lsocket" >&5
ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5190,14 +5203,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5194 "configure"
+#line 5207 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:5201: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5214: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5224,12 +5237,12 @@ fi
LIBS="$LIBS -lsocket -lnsl"
unset ac_cv_func_accept
echo $ac_n "checking for accept""... $ac_c" 1>&6
-echo "configure:5228: checking for accept" >&5
+echo "configure:5241: checking for accept" >&5
if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5233 "configure"
+#line 5246 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char accept(); below. */
@@ -5252,7 +5265,7 @@ accept();
; return 0; }
EOF
-if { (eval echo configure:5256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_accept=yes"
else
@@ -5279,12 +5292,12 @@ fi
gcj_oldLibs=$LIBS
LIBS="$LIBS $gcj_cv_lib_sockets"
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:5283: checking for gethostbyname" >&5
+echo "configure:5296: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5288 "configure"
+#line 5301 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
@@ -5307,7 +5320,7 @@ gethostbyname();
; return 0; }
EOF
-if { (eval echo configure:5311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
@@ -5325,7 +5338,7 @@ if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6
-echo "configure:5329: checking for main in -lnsl" >&5
+echo "configure:5342: checking for main in -lnsl" >&5
ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5333,14 +5346,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5337 "configure"
+#line 5350 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:5344: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5372,7 +5385,7 @@ echo "$ac_t""$gcj_cv_lib_sockets" 1>&6
if test "$with_system_zlib" = yes; then
echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6
-echo "configure:5376: checking for deflate in -lz" >&5
+echo "configure:5389: checking for deflate in -lz" >&5
ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5380,7 +5393,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lz $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5384 "configure"
+#line 5397 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -5391,7 +5404,7 @@ int main() {
deflate()
; return 0; }
EOF
-if { (eval echo configure:5395: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5418,7 +5431,7 @@ fi
# requires -ldl.
if test "$GC" = boehm; then
echo $ac_n "checking for main in -ldl""... $ac_c" 1>&6
-echo "configure:5422: checking for main in -ldl" >&5
+echo "configure:5435: checking for main in -ldl" >&5
ac_lib_var=`echo dl'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5426,14 +5439,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5430 "configure"
+#line 5443 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:5437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5499,7 +5512,7 @@ fi
# Extract the first word of "${ac_tool_prefix}gcj", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcj; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5503: checking for $ac_word" >&5
+echo "configure:5516: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_GCJ'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -5531,7 +5544,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "gcj", so it can be a program name with args.
set dummy gcj; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5535: checking for $ac_word" >&5
+echo "configure:5548: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_GCJ'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -5593,13 +5606,13 @@ exec 5>>./config.log
CPPFLAGS=$GCJ_SAVE_CPPFLAGS
echo $ac_n "checking size of void *""... $ac_c" 1>&6
-echo "configure:5597: checking size of void *" >&5
+echo "configure:5610: checking size of void *" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
cat > conftest.$ac_ext <<EOF
-#line 5603 "configure"
+#line 5616 "configure"
#include "confdefs.h"
#include "confdefs.h"
#include <sys/types.h>
@@ -5609,7 +5622,7 @@ int main() {
switch (0) case 0: case (sizeof (void *) == $ac_size):;
; return 0; }
EOF
-if { (eval echo configure:5613: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5626: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_sizeof_void_p=$ac_size
else
@@ -5710,18 +5723,18 @@ EOF
echo $ac_n "checking for g++ -ffloat-store bug""... $ac_c" 1>&6
-echo "configure:5714: checking for g++ -ffloat-store bug" >&5
+echo "configure:5727: checking for g++ -ffloat-store bug" >&5
save_CFLAGS="$CFLAGS"
CFLAGS="-x c++ -O2 -ffloat-store"
cat > conftest.$ac_ext <<EOF
-#line 5718 "configure"
+#line 5731 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:5725: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5738: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""no" 1>&6
else
@@ -5737,21 +5750,21 @@ fi
rm -f conftest*
CFLAGS="$save_CFLAGS"
-for ac_hdr in unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h stdint.h langinfo.h locale.h
+for ac_hdr in unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h net/if.h pwd.h sys/config.h stdint.h langinfo.h locale.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5745: checking for $ac_hdr" >&5
+echo "configure:5758: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5750 "configure"
+#line 5763 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5755: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5768: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5781,17 +5794,17 @@ for ac_hdr in dirent.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5785: checking for $ac_hdr" >&5
+echo "configure:5798: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5790 "configure"
+#line 5803 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5795: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5808: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5821,17 +5834,17 @@ for ac_hdr in inttypes.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5825: checking for $ac_hdr" >&5
+echo "configure:5838: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5830 "configure"
+#line 5843 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5835: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5848: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5867,12 +5880,12 @@ fi
done
echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:5871: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:5884: checking for sys/wait.h that is POSIX.1 compatible" >&5
if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5876 "configure"
+#line 5889 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
@@ -5888,7 +5901,7 @@ wait (&s);
s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
; return 0; }
EOF
-if { (eval echo configure:5892: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5905: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_sys_wait_h=yes
else
@@ -5910,12 +5923,12 @@ fi
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:5914: checking for ANSI C header files" >&5
+echo "configure:5927: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5919 "configure"
+#line 5932 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -5923,7 +5936,7 @@ else
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5940: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5940,7 +5953,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 5944 "configure"
+#line 5957 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@@ -5958,7 +5971,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 5962 "configure"
+#line 5975 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@@ -5979,7 +5992,7 @@ if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
-#line 5983 "configure"
+#line 5996 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -5990,7 +6003,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
-if { (eval echo configure:5994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6007: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
@@ -6014,12 +6027,12 @@ EOF
fi
echo $ac_n "checking for ssize_t""... $ac_c" 1>&6
-echo "configure:6018: checking for ssize_t" >&5
+echo "configure:6031: checking for ssize_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6023 "configure"
+#line 6036 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -6048,9 +6061,9 @@ fi
echo $ac_n "checking for in_addr_t""... $ac_c" 1>&6
-echo "configure:6052: checking for in_addr_t" >&5
+echo "configure:6065: checking for in_addr_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 6054 "configure"
+#line 6067 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -6064,7 +6077,7 @@ int main() {
in_addr_t foo;
; return 0; }
EOF
-if { (eval echo configure:6068: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6081: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_IN_ADDR_T 1
@@ -6080,16 +6093,16 @@ fi
rm -f conftest*
echo $ac_n "checking whether struct ip_mreq is in netinet/in.h""... $ac_c" 1>&6
-echo "configure:6084: checking whether struct ip_mreq is in netinet/in.h" >&5
+echo "configure:6097: checking whether struct ip_mreq is in netinet/in.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6086 "configure"
+#line 6099 "configure"
#include "confdefs.h"
#include <netinet/in.h>
int main() {
struct ip_mreq mreq;
; return 0; }
EOF
-if { (eval echo configure:6093: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6106: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_STRUCT_IP_MREQ 1
@@ -6105,16 +6118,16 @@ fi
rm -f conftest*
echo $ac_n "checking whether struct ipv6_mreq is in netinet/in.h""... $ac_c" 1>&6
-echo "configure:6109: checking whether struct ipv6_mreq is in netinet/in.h" >&5
+echo "configure:6122: checking whether struct ipv6_mreq is in netinet/in.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6111 "configure"
+#line 6124 "configure"
#include "confdefs.h"
#include <netinet/in.h>
int main() {
struct ipv6_mreq mreq6;
; return 0; }
EOF
-if { (eval echo configure:6118: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6131: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_STRUCT_IPV6_MREQ 1
@@ -6130,16 +6143,16 @@ fi
rm -f conftest*
echo $ac_n "checking whether struct sockaddr_in6 is in netinet/in.h""... $ac_c" 1>&6
-echo "configure:6134: checking whether struct sockaddr_in6 is in netinet/in.h" >&5
+echo "configure:6147: checking whether struct sockaddr_in6 is in netinet/in.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6136 "configure"
+#line 6149 "configure"
#include "confdefs.h"
#include <netinet/in.h>
int main() {
struct sockaddr_in6 addr6;
; return 0; }
EOF
-if { (eval echo configure:6143: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6156: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_INET6 1
@@ -6155,9 +6168,9 @@ fi
rm -f conftest*
echo $ac_n "checking for socklen_t in sys/socket.h""... $ac_c" 1>&6
-echo "configure:6159: checking for socklen_t in sys/socket.h" >&5
+echo "configure:6172: checking for socklen_t in sys/socket.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 6161 "configure"
+#line 6174 "configure"
#include "confdefs.h"
#define _POSIX_PII_SOCKET
#include <sys/types.h>
@@ -6166,7 +6179,7 @@ int main() {
socklen_t x = 5;
; return 0; }
EOF
-if { (eval echo configure:6170: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6183: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_SOCKLEN_T 1
@@ -6182,16 +6195,16 @@ fi
rm -f conftest*
echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6
-echo "configure:6186: checking for tm_gmtoff in struct tm" >&5
+echo "configure:6199: checking for tm_gmtoff in struct tm" >&5
cat > conftest.$ac_ext <<EOF
-#line 6188 "configure"
+#line 6201 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tim; tim.tm_gmtoff = 0;
; return 0; }
EOF
-if { (eval echo configure:6195: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6208: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define STRUCT_TM_HAS_GMTOFF 1
@@ -6204,16 +6217,16 @@ else
rm -rf conftest*
echo "$ac_t""no" 1>&6
echo $ac_n "checking for global timezone variable""... $ac_c" 1>&6
-echo "configure:6208: checking for global timezone variable" >&5
+echo "configure:6221: checking for global timezone variable" >&5
cat > conftest.$ac_ext <<EOF
-#line 6210 "configure"
+#line 6223 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
void i(){long z2 = 2*timezone;}
; return 0; }
EOF
-if { (eval echo configure:6217: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6230: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE 1
@@ -6226,16 +6239,16 @@ else
rm -rf conftest*
echo "$ac_t""no" 1>&6
echo $ac_n "checking for global _timezone variable""... $ac_c" 1>&6
-echo "configure:6230: checking for global _timezone variable" >&5
+echo "configure:6243: checking for global _timezone variable" >&5
cat > conftest.$ac_ext <<EOF
-#line 6232 "configure"
+#line 6245 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
long z2 = _timezone;
; return 0; }
EOF
-if { (eval echo configure:6239: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6252: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_UNDERSCORE_TIMEZONE 1
@@ -6257,19 +6270,19 @@ rm -f conftest*
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:6261: checking for working alloca.h" >&5
+echo "configure:6274: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6266 "configure"
+#line 6279 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:6273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
@@ -6290,12 +6303,12 @@ EOF
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:6294: checking for alloca" >&5
+echo "configure:6307: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6299 "configure"
+#line 6312 "configure"
#include "confdefs.h"
#ifdef __GNUC__
@@ -6323,7 +6336,7 @@ int main() {
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:6327: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
@@ -6355,12 +6368,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:6359: checking whether alloca needs Cray hooks" >&5
+echo "configure:6372: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6364 "configure"
+#line 6377 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -6385,12 +6398,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6389: checking for $ac_func" >&5
+echo "configure:6402: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6394 "configure"
+#line 6407 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6413,7 +6426,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6417: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6440,7 +6453,7 @@ done
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:6444: checking stack direction for C alloca" >&5
+echo "configure:6457: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6448,7 +6461,7 @@ else
ac_cv_c_stack_direction=0
else
cat > conftest.$ac_ext <<EOF
-#line 6452 "configure"
+#line 6465 "configure"
#include "confdefs.h"
find_stack_direction ()
{
@@ -6467,7 +6480,7 @@ main ()
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:6471: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6484: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_stack_direction=1
else
@@ -6494,7 +6507,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6498: checking for $ac_word" >&5
+echo "configure:6511: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_PERL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -6584,7 +6597,7 @@ fi
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:6588: checking for X" >&5
+echo "configure:6601: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
@@ -6646,12 +6659,12 @@ if test "$ac_x_includes" = NO; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
-#line 6650 "configure"
+#line 6663 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6655: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6668: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6720,14 +6733,14 @@ if test "$ac_x_libraries" = NO; then
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6724 "configure"
+#line 6737 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
-if { (eval echo configure:6731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
@@ -6833,17 +6846,17 @@ else
case "`(uname -sr) 2>/dev/null`" in
"SunOS 5"*)
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:6837: checking whether -R must be followed by a space" >&5
+echo "configure:6850: checking whether -R must be followed by a space" >&5
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 6840 "configure"
+#line 6853 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:6847: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6860: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_nospace=yes
else
@@ -6859,14 +6872,14 @@ rm -f conftest*
else
LIBS="$ac_xsave_LIBS -R $x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 6863 "configure"
+#line 6876 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:6870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_space=yes
else
@@ -6898,7 +6911,7 @@ rm -f conftest*
# libraries were built with DECnet support. And karl@cs.umb.edu says
# the Alpha needs dnet_stub (dnet does not exist).
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:6902: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:6915: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -6906,7 +6919,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldnet $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6910 "configure"
+#line 6923 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -6917,7 +6930,7 @@ int main() {
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:6921: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -6939,7 +6952,7 @@ fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:6943: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:6956: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -6947,7 +6960,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6951 "configure"
+#line 6964 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -6958,7 +6971,7 @@ int main() {
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:6962: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6975: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -6987,12 +7000,12 @@ fi
# The nsl library prevents programs from opening the X display
# on Irix 5.2, according to dickey@clark.net.
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:6991: checking for gethostbyname" >&5
+echo "configure:7004: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6996 "configure"
+#line 7009 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
@@ -7015,7 +7028,7 @@ gethostbyname();
; return 0; }
EOF
-if { (eval echo configure:7019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
@@ -7036,7 +7049,7 @@ fi
if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:7040: checking for gethostbyname in -lnsl" >&5
+echo "configure:7053: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7044,7 +7057,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7048 "configure"
+#line 7061 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -7055,7 +7068,7 @@ int main() {
gethostbyname()
; return 0; }
EOF
-if { (eval echo configure:7059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7072: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -7085,12 +7098,12 @@ fi
# -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:7089: checking for connect" >&5
+echo "configure:7102: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7094 "configure"
+#line 7107 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
@@ -7113,7 +7126,7 @@ connect();
; return 0; }
EOF
-if { (eval echo configure:7117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7130: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
@@ -7134,7 +7147,7 @@ fi
if test $ac_cv_func_connect = no; then
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:7138: checking for connect in -lsocket" >&5
+echo "configure:7151: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7142,7 +7155,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7146 "configure"
+#line 7159 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -7153,7 +7166,7 @@ int main() {
connect()
; return 0; }
EOF
-if { (eval echo configure:7157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -7177,12 +7190,12 @@ fi
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:7181: checking for remove" >&5
+echo "configure:7194: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7186 "configure"
+#line 7199 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */
@@ -7205,7 +7218,7 @@ remove();
; return 0; }
EOF
-if { (eval echo configure:7209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7222: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_remove=yes"
else
@@ -7226,7 +7239,7 @@ fi
if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:7230: checking for remove in -lposix" >&5
+echo "configure:7243: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7234,7 +7247,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lposix $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7238 "configure"
+#line 7251 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -7245,7 +7258,7 @@ int main() {
remove()
; return 0; }
EOF
-if { (eval echo configure:7249: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7262: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -7269,12 +7282,12 @@ fi
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:7273: checking for shmat" >&5
+echo "configure:7286: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7278 "configure"
+#line 7291 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */
@@ -7297,7 +7310,7 @@ shmat();
; return 0; }
EOF
-if { (eval echo configure:7301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_shmat=yes"
else
@@ -7318,7 +7331,7 @@ fi
if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:7322: checking for shmat in -lipc" >&5
+echo "configure:7335: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7326,7 +7339,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lipc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7330 "configure"
+#line 7343 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -7337,7 +7350,7 @@ int main() {
shmat()
; return 0; }
EOF
-if { (eval echo configure:7341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -7370,7 +7383,7 @@ fi
# libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:7374: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:7387: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7378,7 +7391,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7382 "configure"
+#line 7395 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -7389,7 +7402,7 @@ int main() {
IceConnectionNumber()
; return 0; }
EOF
-if { (eval echo configure:7393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
diff --git a/libjava/configure.host b/libjava/configure.host
index 5baabd46be1..f5d1ef07cda 100644
--- a/libjava/configure.host
+++ b/libjava/configure.host
@@ -65,6 +65,16 @@ CHECKREFSPEC=
# This case statement supports per-CPU defaults.
case "${host}" in
+ arm*-elf | strongarm*-elf | xscale*-elf)
+ with_libffi_default=no
+ PROCESS=Ecos
+ FILE=Posix
+ CHECKREFSPEC=-fcheck-references
+ EXCEPTIONSPEC=
+ enable_java_net_default=no
+ enable_getenv_properties_default=no
+ enable_main_args_default=no
+ ;;
mips-tx39-*|mipstx39-unknown-*)
libgcj_flags="${libgcj_flags} -G 0"
LDFLAGS="$LDFLAGS -Tjmr3904dram.ld"
@@ -117,6 +127,11 @@ case "${host}" in
enable_hash_synchronization_default=yes
slow_pthread_self=yes
;;
+ s390*-*)
+ sysdeps_dir=s390
+ libgcj_interpreter=yes
+ enable_hash_synchronization_default=yes
+ ;;
sparc-*)
;;
ia64-*)
@@ -125,16 +140,6 @@ case "${host}" in
libgcj_interpreter=yes
enable_hash_synchronization_default=yes
;;
- xscale*-elf)
- with_libffi_default=no
- PROCESS=Ecos
- FILE=Posix
- CHECKREFSPEC=-fcheck-references
- EXCEPTIONSPEC=
- enable_java_net_default=no
- enable_getenv_properties_default=no
- enable_main_args_default=no
- ;;
sh-* | sh[34]*-*)
sysdeps_dir=sh
libgcj_flags="${libgcj_flags} -mieee"
diff --git a/libjava/configure.in b/libjava/configure.in
index 752739ba265..e11928e70a4 100644
--- a/libjava/configure.in
+++ b/libjava/configure.in
@@ -226,6 +226,7 @@ case "$TARGET_ECOS" in
PLATFORM=Win32
PLATFORMOBJS=win32.lo
PLATFORMH=win32.h
+ CHECK_FOR_BROKEN_MINGW_LD
;;
*)
PLATFORM=Posix
@@ -444,7 +445,7 @@ AC_LINK_FILES(sysdep/$sysdeps_dir/locks.h, sysdep/locks.h)
HASH_SYNC_SPEC=
# Hash synchronization is only useful with posix threads right now.
-if test "$enable_hash_synchronization" = yes && test "$THREADS" = "posix"; then
+if test "$enable_hash_synchronization" = yes; then
HASH_SYNC_SPEC=-fhash-synchronization
AC_DEFINE(JV_HASH_SYNCHRONIZATION, 1, [Define if hash synchronization is in use])
fi
@@ -507,7 +508,7 @@ else
AC_CHECK_FUNCS(nl_langinfo setlocale)
AC_CHECK_FUNCS(inet_aton inet_addr, break)
AC_CHECK_FUNCS(inet_pton uname inet_ntoa)
- AC_CHECK_FUNCS(fork execvp pipe sigaction)
+ AC_CHECK_FUNCS(fork execvp pipe sigaction ftruncate)
AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h)
AC_CHECK_FUNC(backtrace, [
case "$host" in
@@ -813,7 +814,7 @@ CFLAGS="$save_CFLAGS"
dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there.
dnl On that system, sys/ioctl.h will not include sys/filio.h unless
dnl BSD_COMP is defined; just including sys/filio.h is simpler.
-AC_CHECK_HEADERS(unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h stdint.h langinfo.h locale.h)
+AC_CHECK_HEADERS(unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h net/if.h pwd.h sys/config.h stdint.h langinfo.h locale.h)
dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h
dnl for now. If you change this, you also must update natFile.cc.
AC_CHECK_HEADERS(dirent.h)
diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc
index 95e671f42a3..6a250dadda6 100644
--- a/libjava/defineclass.cc
+++ b/libjava/defineclass.cc
@@ -35,7 +35,6 @@ details. */
#include <java/lang/ClassFormatError.h>
#include <java/lang/NoClassDefFoundError.h>
#include <java/lang/ClassCircularityError.h>
-#include <java/lang/ClassNotFoundException.h>
#include <java/lang/IncompatibleClassChangeError.h>
#include <java/lang/reflect/Modifier.h>
diff --git a/libjava/gcj/.cvsignore b/libjava/gcj/.cvsignore
new file mode 100644
index 00000000000..7b7bb5ad25f
--- /dev/null
+++ b/libjava/gcj/.cvsignore
@@ -0,0 +1 @@
+stamp-h2.in
diff --git a/libjava/gcj/javaprims.h b/libjava/gcj/javaprims.h
index 99442c5ca2a..8ed649432a2 100644
--- a/libjava/gcj/javaprims.h
+++ b/libjava/gcj/javaprims.h
@@ -211,6 +211,7 @@ extern "Java"
class UnsupportedOperationException;
class VMClassLoader;
class VMSecurityManager;
+ class VMThrowable;
class VerifyError;
class VirtualMachineError;
class Void;
@@ -229,11 +230,16 @@ extern "Java"
class Array;
class Constructor;
class Field;
+ class InvocationHandler;
class InvocationTargetException;
class Member;
class Method;
class Modifier;
+ class Proxy;
+ class Proxy$ProxyData;
+ class Proxy$ProxyType;
class ReflectPermission;
+ class UndeclaredThrowableException;
};
};
diff --git a/libjava/gij.cc b/libjava/gij.cc
index bb56b112b6d..47b2d6028de 100644
--- a/libjava/gij.cc
+++ b/libjava/gij.cc
@@ -28,11 +28,14 @@ help ()
printf (" to interpret Java bytecodes, or\n");
printf (" gij -jar [OPTION] ... JARFILE [ARGS] ...\n");
printf (" to execute a jar file\n\n");
+ printf (" --cp LIST set class path\n");
+ printf (" --classpath LIST set class path\n");
printf (" -DVAR=VAL define property VAR with value VAL\n");
printf (" --help print this help, then exit\n");
printf (" --ms=NUMBER set initial heap size\n");
printf (" --mx=NUMBER set maximum heap size\n");
printf (" --version print version number, then exit\n");
+ printf ("\nOptions can be specified with `-' or `--'.\n");
printf ("\nSee http://gcc.gnu.org/java/ for information on reporting bugs\n");
exit (0);
}
@@ -115,6 +118,15 @@ main (int argc, const char **argv)
goto no_arg;
_Jv_SetMaximumHeapSize (argv[++i]);
}
+ else if (! strcmp (arg, "-cp") || ! strcmp (arg, "-classpath"))
+ {
+ if (i >= argc - 1)
+ goto no_arg;
+ // We set _Jv_Jar_Class_Path. If the user specified `-jar'
+ // then the jar code will override this. This is the
+ // correct behavior.
+ _Jv_Jar_Class_Path = argv[++i];
+ }
else
{
fprintf (stderr, "gij: unrecognized option -- `%s'\n", argv[i]);
diff --git a/libjava/gnu/classpath/Configuration.java.in b/libjava/gnu/classpath/Configuration.java.in
index 4ea692357d1..1002b62bd8b 100644
--- a/libjava/gnu/classpath/Configuration.java.in
+++ b/libjava/gnu/classpath/Configuration.java.in
@@ -51,4 +51,9 @@ public interface Configuration
// For libgcj we never load the JNI libraries.
boolean INIT_LOAD_LIBRARY = false;
+
+ // For libgcj we have native methods for proxy support....
+ boolean HAVE_NATIVE_GET_PROXY_DATA = false;
+ boolean HAVE_NATIVE_GET_PROXY_CLASS = false;
+ boolean HAVE_NATIVE_GENERATE_PROXY_CLASS = false;
}
diff --git a/libjava/gnu/gcj/protocol/core/Connection.java b/libjava/gnu/gcj/protocol/core/Connection.java
index 6513e336214..5bcbb8611c7 100644
--- a/libjava/gnu/gcj/protocol/core/Connection.java
+++ b/libjava/gnu/gcj/protocol/core/Connection.java
@@ -13,6 +13,7 @@ package gnu.gcj.protocol.core;
import gnu.gcj.Core;
import java.net.*;
import java.io.*;
+import java.util.Map;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
@@ -72,6 +73,20 @@ class Connection extends URLConnection
}
// Override default method in URLConnection.
+ public Map getHeaderFields()
+ {
+ try
+ {
+ getHeaders();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+ return hdrHash;
+ }
+
+ // Override default method in URLConnection.
public String getHeaderField(int n)
{
try
diff --git a/libjava/gnu/gcj/protocol/file/Connection.java b/libjava/gnu/gcj/protocol/file/Connection.java
index 5510c5d74ea..4fcdb11ed52 100644
--- a/libjava/gnu/gcj/protocol/file/Connection.java
+++ b/libjava/gnu/gcj/protocol/file/Connection.java
@@ -12,6 +12,7 @@ package gnu.gcj.protocol.file;
import java.net.*;
import java.io.*;
+import java.util.Map;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
@@ -96,6 +97,20 @@ class Connection extends URLConnection
}
// Override default method in URLConnection.
+ public Map getHeaderFields()
+ {
+ try
+ {
+ getHeaders();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+ return hdrHash;
+ }
+
+ // Override default method in URLConnection.
public String getHeaderField(int n)
{
try
diff --git a/libjava/gnu/gcj/protocol/http/Connection.java b/libjava/gnu/gcj/protocol/http/Connection.java
index 10fbfd66723..caababa6823 100644
--- a/libjava/gnu/gcj/protocol/http/Connection.java
+++ b/libjava/gnu/gcj/protocol/http/Connection.java
@@ -12,6 +12,7 @@ package gnu.gcj.protocol.http;
import java.net.*;
import java.io.*;
+import java.util.Map;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
@@ -168,6 +169,22 @@ class Connection extends HttpURLConnection
}
// Override default method in URLConnection.
+ public Map getHeaderFields()
+ {
+ if (!connected)
+ try
+ {
+ connect();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+
+ return hdrHash;
+ }
+
+ // Override default method in URLConnection.
public String getHeaderField(int n)
{
if (!connected)
diff --git a/libjava/gnu/gcj/runtime/NameFinder.java b/libjava/gnu/gcj/runtime/NameFinder.java
new file mode 100644
index 00000000000..1d729d252ac
--- /dev/null
+++ b/libjava/gnu/gcj/runtime/NameFinder.java
@@ -0,0 +1,548 @@
+/* NameFinder.java -- Translates addresses to StackTraceElements.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.runtime;
+
+import gnu.gcj.RawData;
+
+import java.lang.StringBuffer;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.IOException;
+import java.io.File;
+
+/**
+ * Helper class that translates addresses (represented as longs) to a
+ * StackTraceElement array.
+ *
+ * There are a couple of system properties that can be set to manipulate the
+ * result (all default to true):
+ * <li>
+ * <ul><code>gnu.gcj.runtime.NameFinder.demangle</code>
+ * Whether names should be demangled.</ul>
+ * <ul><code>gnu.gcj.runtime.NameFinder.sanitize</code></ul>
+ * Whether calls to initialize exceptions and starting the runtime system
+ * should be removed from the stack trace. Only done when names are
+ * demangled.</ul>
+ * <ul><code>gnu.gcj.runtime.NameFinder.remove_unknown</code>
+ * Whether calls to unknown functions (class and method names are unknown)
+ * should be removed from the stack trace. Only done when the stack is
+ * sanitized.</ul>
+ * <ul><code>gnu.gcj.runtime.NameFinder.remove_interpreter</code>
+ * Whether runtime interpreter calls (methods in the _Jv_InterpMethod class
+ * and functions starting with 'ffi_') should be removed from the stack
+ * trace. Only done when the stack is sanitized.</ul>
+ * <ul><code>gnu.gcj.runtime.NameFinder.use_addr2line</code>
+ * Whether an external process (addr2line or addr2name.awk) should be used
+ * as fallback to convert the addresses to function names when the runtime
+ * is unable to do it through <code>dladdr</code>.</ul>
+ * </li>
+ *
+ * <code>close()</code> should be called to get rid of all resources.
+ *
+ * This class is used from <code>java.lang.VMThrowable</code>.
+ *
+ * Currently the <code>lookup(long[])</code> method is not thread safe.
+ * It can easily be made thread safe by synchronizing access to all external
+ * processes when used.
+ *
+ * @author Mark Wielaard (mark@klomp.org)
+ */
+public class NameFinder
+{
+ // Set these to false when not needed.
+ private static final boolean demangle
+ = Boolean.valueOf(System.getProperty
+ ("gnu.gcj.runtime.NameFinder.demangle", "true")
+ ).booleanValue();
+ private static final boolean sanitize
+ = Boolean.valueOf(System.getProperty
+ ("gnu.gcj.runtime.NameFinder.sanitize", "true")
+ ).booleanValue();
+ private static final boolean remove_unknown
+ = Boolean.valueOf(System.getProperty
+ ("gnu.gcj.runtime.NameFinder.remove_unknown", "true")
+ ).booleanValue();
+ private static final boolean remove_interpreter
+ = Boolean.valueOf(System.getProperty
+ ("gnu.gcj.runtime.NameFinder.remove_interpreter", "true")
+ ).booleanValue();
+ private static final boolean use_addr2line
+ = Boolean.valueOf(System.getProperty
+ ("gnu.gcj.runtime.NameFinder.use_addr2line", "true")
+ ).booleanValue();
+
+ /**
+ * The name of the currently running executable.
+ */
+ private final String executable;
+
+ /**
+ * Process used for demangling names.
+ */
+ private Process cppfilt;
+
+ private BufferedWriter cppfiltOut;
+ private BufferedReader cppfiltIn;
+
+ /**
+ * Process used for translating addresses to function/file names.
+ */
+ private Process addr2line;
+
+ private BufferedWriter addr2lineOut;
+ private BufferedReader addr2lineIn;
+
+ /**
+ * Creates a new NameFinder. Call close to get rid of any resources
+ * created while using the <code>lookup</code> methods.
+ */
+ public NameFinder()
+ {
+ executable = getExecutable();
+ Runtime runtime = Runtime.getRuntime();
+ if (demangle)
+ {
+ try
+ {
+ String[] exec = new String[] {"c++filt", "-s", "java"};
+ cppfilt = runtime.exec(exec);
+ cppfiltIn = new BufferedReader
+ (new InputStreamReader(cppfilt.getInputStream()));
+ cppfiltOut = new BufferedWriter
+ (new OutputStreamWriter(cppfilt.getOutputStream()));
+ }
+ catch (IOException ioe)
+ {
+ if (cppfilt != null)
+ cppfilt.destroy();
+ cppfilt = null;
+ }
+ }
+
+ if (use_addr2line)
+ {
+ try
+ {
+ String[] exec = new String[] {"addr2line", "-f", "-e", executable};
+ addr2line = runtime.exec(exec);
+ }
+ catch (IOException ioe)
+ {
+ try
+ {
+ String[] exec = new String[] {"addr2name.awk", executable};
+ addr2line = runtime.exec(exec);
+ }
+ catch (IOException ioe2) { addr2line = null; }
+ }
+
+ if (addr2line != null)
+ {
+ try
+ {
+ addr2lineIn = new BufferedReader
+ (new InputStreamReader(addr2line.getInputStream()));
+ addr2lineOut = new BufferedWriter
+ (new OutputStreamWriter(addr2line.getOutputStream()));
+ }
+ catch (IOException ioe)
+ {
+ addr2line.destroy();
+ addr2line = null;
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the name of the currently running process.
+ */
+ native private static String getExecutable();
+
+ /**
+ * Tries to use dladdr to create the nth StackTraceElement from the given
+ * addresses. Returns null on failure.
+ */
+ native private StackTraceElement dladdrLookup(RawData addrs, int n);
+
+ /**
+ * Returns the nth element from the stack as a hex encoded String.
+ */
+ native private String getAddrAsString(RawData addrs, int n);
+
+ /**
+ * If nth element of stack is an interpreted frame, return the
+ * element representing the method being interpreted.
+ */
+ native private StackTraceElement lookupInterp(RawData addrs, int n);
+
+ /**
+ * Creates the nth StackTraceElement from the given native stacktrace.
+ */
+ private StackTraceElement lookup(RawData addrs, int n)
+ {
+ StackTraceElement result;
+
+ result = lookupInterp(addrs, n);
+ if (result == null)
+ result = dladdrLookup(addrs, n);
+ if (result == null)
+ {
+ String name = null;
+ String file = null;
+
+ String hex = getAddrAsString(addrs, n);
+
+ if (addr2line != null)
+ {
+ try
+ {
+ addr2lineOut.write(hex);
+ addr2lineOut.newLine();
+ addr2lineOut.flush();
+ name = addr2lineIn.readLine();
+ file = addr2lineIn.readLine();
+ }
+ catch (IOException ioe) { addr2line = null; }
+ }
+
+ if (name == null || "??".equals(name))
+ name = hex;
+
+ result = createStackTraceElement(name, file);
+ }
+
+ return result;
+ }
+
+ /**
+ * Given an Throwable and a native stacktrace returns an array of
+ * StackTraceElement containing class, method, file and linenumbers.
+ */
+ public StackTraceElement[] lookup(Throwable t, RawData addrs, int length)
+ {
+ StackTraceElement[] elements = new StackTraceElement[length];
+ for (int i=0; i < length; i++)
+ elements[i] = lookup(addrs, i);
+
+ if (demangle && sanitize)
+ return sanitizeStack(elements, t);
+ else
+ return elements;
+ }
+
+
+ /**
+ * Removes calls to initialize exceptions and the runtime system from
+ * the stack trace including stack frames of which nothing usefull is known.
+ * Throw away the top of the stack till we find the constructor(s)
+ * of this Throwable or at least the contructors of java.lang.Throwable
+ * or the actual fillInStackTrace call.
+ * Also throw away from the top everything before and including a runtime
+ * _Jv_Throw call.
+ */
+ private static StackTraceElement[] sanitizeStack(StackTraceElement[] elements,
+ Throwable t)
+ {
+ StackTraceElement[] stack;
+
+ String className = t.getClass().getName();
+ String consName;
+ int lastDot = className.lastIndexOf('.');
+ if (lastDot == -1)
+ consName = className + '(';
+ else
+ consName = className.substring(lastDot + 1) + '(';
+
+ int unknown = 0;
+ int interpreter = 0;
+ int last_throw = -1;
+ int length = elements.length;
+ int end = length-1;
+ for (int i = 0; i < length; i++)
+ {
+ String CName = elements[i].getClassName();
+ String MName = elements[i].getMethodName();
+ if ((CName == null && MName != null && MName.startsWith("_Jv_Throw"))
+ ||
+ (CName != null
+ && (CName.equals(className)
+ || CName.equals("java.lang.Throwable")
+ || CName.equals("java.lang.VMThrowable"))
+ && MName != null
+ && (MName.startsWith(consName)
+ || MName.startsWith("Throwable(")
+ || MName.startsWith("fillInStackTrace("))))
+ {
+ last_throw = i;
+ // Reset counting of unknown and interpreter frames.
+ unknown = 0;
+ interpreter = 0;
+ }
+ else if (remove_unknown && CName == null
+ && (MName == null || MName.startsWith("0x")))
+ unknown++;
+ else if (remove_interpreter
+ && ((CName == null
+ && MName != null && MName.startsWith("ffi_"))
+ || (CName != null && CName.equals("_Jv_InterpMethod"))))
+ interpreter++;
+ else if ("main(java.lang.String[])".equals(MName))
+ {
+ end = i;
+ break;
+ }
+ }
+ int begin = last_throw+1;
+
+ // Now filter out everything at the start and the end that is not part
+ // of the "normal" user program including any elements that are interpreter
+ // calls or have no usefull information whatsoever.
+ // Unless that means we filter out all info.
+ int nr_elements = end-begin-unknown-interpreter+1;
+ if ((begin > 0 || end < length-1 || unknown > 0 || interpreter > 0)
+ && nr_elements > 0)
+ {
+ stack = new StackTraceElement[nr_elements];
+ int pos =0;
+ for (int i=begin; i<=end; i++)
+ {
+ String MName = elements[i].getMethodName();
+ String CName = elements[i].getClassName();
+ if (remove_unknown && CName == null
+ && (MName == null || MName.startsWith("0x")))
+ ; // Skip unknown frame
+ else if (remove_interpreter
+ && ((CName == null
+ && MName != null && MName.startsWith("ffi_"))
+ || (CName != null && CName.equals("_Jv_InterpMethod"))))
+ ; // Skip interpreter runtime frame
+ else
+ {
+ stack[pos] = elements[i];
+ pos++;
+ }
+ }
+ }
+ else
+ stack = elements;
+
+ return stack;
+ }
+
+ /**
+ * Creates a StackTraceElement given a string and a filename.
+ * Splits the given string into the class and method part.
+ * The string name will be a demangled to a fully qualified java method
+ * string. The string file will be decomposed into a file name and possibly
+ * a line number. The name should never be null, but the file may be if it
+ * is unknown.
+ */
+ private StackTraceElement createStackTraceElement(String name, String file)
+ {
+ if (!demangle)
+ return new StackTraceElement(file, -1, null, name, false);
+
+ String s = demangleName(name);
+ String methodName = s;
+ String className = null;
+ int bracket = s.indexOf('(');
+ if (bracket > 0)
+ {
+ int dot = s.lastIndexOf('.', bracket);
+ if (dot > 0)
+ {
+ className = s.substring(0, dot);
+ methodName = s.substring(dot+1, s.length());
+ }
+ }
+
+ String fileName = file;
+ int line = -1;
+ if (fileName != null)
+ {
+ int colon = file.indexOf(':');
+ if (colon > 0)
+ {
+ fileName = file.substring(0, colon);
+ try
+ {
+ line = Integer.parseInt(file.substring(colon+1, file.length()));
+ }
+ catch (NumberFormatException nfe) { /* ignore */ }
+ }
+
+ if (line == 0)
+ line =-1;
+
+ if ("".equals(fileName) || "??".equals(fileName))
+ fileName = null;
+ else if (fileName != null)
+ {
+ try
+ {
+ fileName = new File(fileName).getCanonicalPath();
+ }
+ catch (IOException ioe) { /* ignore */ }
+ }
+ }
+
+ return new StackTraceElement(fileName, line, className, methodName, false);
+ }
+
+ /**
+ * Demangles the given String if possible. Returns the demangled String or
+ * the original string if demangling is impossible.
+ */
+ private String demangleName(String s)
+ {
+ if (cppfilt != null)
+ {
+ try
+ {
+ cppfiltOut.write(s);
+ cppfiltOut.newLine();
+ cppfiltOut.flush();
+ return cppfiltIn.readLine();
+ }
+ catch (IOException ioe) { cppfilt.destroy(); cppfilt = null; }
+ }
+
+ return s;
+ }
+
+ /**
+ * Returns human readable method name and aguments given a method type
+ * signature as known to the interpreter and a classname.
+ */
+ public static String demangleInterpreterMethod(String m, String cn)
+ {
+ int index = 0;
+ int length = m.length();
+ StringBuffer sb = new StringBuffer(length);
+
+ // Figure out the real method name
+ if (m.startsWith("<init>"))
+ {
+ String className;
+ int i = cn.lastIndexOf('.');
+ if (i < 0)
+ className = cn;
+ else
+ className = cn.substring(i + 1);
+ sb.append(className);
+ index += 7;
+ }
+ else
+ {
+ int i = m.indexOf('(');
+ if (i > 0)
+ {
+ sb.append(m.substring(0,i));
+ index += i + 1;
+ }
+ }
+
+ sb.append('(');
+
+ // Demangle the type arguments
+ int arrayDepth = 0;
+ char c = (index < length) ? m.charAt(index) : ')';
+ while (c != ')')
+ {
+ String type;
+ switch(c)
+ {
+ case 'B':
+ type = "byte";
+ break;
+ case 'C':
+ type = "char";
+ break;
+ case 'D':
+ type = "double";
+ break;
+ case 'F':
+ type = "float";
+ break;
+ case 'I':
+ type = "int";
+ break;
+ case 'J':
+ type = "long";
+ break;
+ case 'S':
+ type = "short";
+ break;
+ case 'Z':
+ type = "boolean";
+ break;
+ case 'L':
+ int i = m.indexOf(';', index);
+ if (i > 0)
+ {
+ type = m.substring(index+1, i);
+ index = i;
+ }
+ else
+ type = "<unknown ref>";
+ break;
+ case '[':
+ type = "";
+ arrayDepth++;
+ break;
+ default:
+ type = "<unknown " + c + '>';
+ }
+ sb.append(type);
+
+ // Handle arrays
+ if (c != '[' && arrayDepth > 0)
+ while (arrayDepth > 0)
+ {
+ sb.append("[]");
+ arrayDepth--;
+ }
+
+ index++;
+ char nc = (index < length) ? m.charAt(index) : ')';
+ if (c != '[' && nc != ')')
+ sb.append(", ");
+ c = nc;
+ }
+
+ // Stop. We are not interested in the return type.
+ sb.append(')');
+ return sb.toString();
+ }
+
+ /**
+ * Releases all resources used by this NameFinder.
+ */
+ public void close()
+ {
+ if (cppfilt != null)
+ cppfilt.destroy();
+
+ if (addr2line != null)
+ addr2line.destroy();
+ }
+
+ /**
+ * Calls close to get rid of all resources.
+ */
+ protected void finalize()
+ {
+ close();
+ }
+}
diff --git a/libjava/gnu/gcj/runtime/natNameFinder.cc b/libjava/gnu/gcj/runtime/natNameFinder.cc
new file mode 100644
index 00000000000..29687cb5bb9
--- /dev/null
+++ b/libjava/gnu/gcj/runtime/natNameFinder.cc
@@ -0,0 +1,113 @@
+// natNameFinder.cc - native helper methods for NameFinder.java
+
+/* Copyright (C) 2002 Free Software Foundation, Inc
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+/**
+ * @author Mark Wielaard (mark@klomp.org)
+ * Based on the old name-finder.cc by Andrew Haley <aph@cygnus.com>.
+ */
+
+#include <config.h>
+
+#include <gcj/cni.h>
+#include <jvm.h>
+#include <java/lang/String.h>
+#include <java/lang/StackTraceElement.h>
+#include <java/lang/StringBuffer.h>
+#include <java-interp.h>
+
+#include <gnu/gcj/runtime/NameFinder.h>
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+java::lang::String*
+gnu::gcj::runtime::NameFinder::getExecutable (void)
+{
+ return JvNewStringLatin1 (_Jv_ThisExecutable ());
+}
+
+java::lang::String*
+gnu::gcj::runtime::NameFinder::getAddrAsString(RawData* addrs, jint n)
+{
+ _Jv_frame_info *p = (_Jv_frame_info *) addrs;
+ typedef unsigned word_t __attribute ((mode (word)));
+ word_t w = (word_t) p[n].addr;
+ int digits = sizeof (void *) * 2;
+ char hex[digits+5];
+
+ strcpy (hex, "0x");
+ for (int i = digits - 1; i >= 0; i--)
+ {
+ int digit = w % 16;
+
+ w /= 16;
+ hex[i+2] = digit > 9 ? 'a' + digit - 10 : '0' + digit;
+ }
+ hex [digits+2] = 0;
+
+ return JvNewStringLatin1(hex);
+}
+
+java::lang::StackTraceElement*
+gnu::gcj::runtime::NameFinder::dladdrLookup(RawData* addrs, jint n)
+{
+#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR)
+ extern char **_Jv_argv;
+ char name[1024];
+ char file_name[1024];
+ _Jv_frame_info *stack = (_Jv_frame_info *) addrs;
+ void* p = stack[n].addr;
+ Dl_info dl_info;
+
+ if (dladdr (p, &dl_info))
+ {
+ if (dl_info.dli_fname)
+ strncpy (file_name, dl_info.dli_fname, sizeof file_name);
+ if (dl_info.dli_sname)
+ strncpy (name, dl_info.dli_sname, sizeof name);
+
+ /* Don't trust dladdr() if the address is from the main program. */
+ if (dl_info.dli_fname != NULL
+ && dl_info.dli_sname != NULL
+ && (_Jv_argv == NULL || strcmp (file_name, _Jv_argv[0]) != 0))
+ return createStackTraceElement (JvNewStringLatin1 (name),
+ JvNewStringLatin1 (file_name));
+ }
+#endif
+ return NULL;
+}
+
+java::lang::StackTraceElement *
+gnu::gcj::runtime::NameFinder::lookupInterp(RawData* addrs, jint n)
+{
+#ifdef INTERPRETER
+ _Jv_frame_info *stack = (_Jv_frame_info *) addrs;
+ if (stack[n].interp == NULL)
+ return NULL;
+
+ _Jv_InterpMethod *meth
+ = reinterpret_cast<_Jv_InterpMethod *> (stack[n].interp);
+ java::lang::StringBuffer *sb = new java::lang::StringBuffer();
+ sb->append(_Jv_NewStringUtf8Const(meth->self->name));
+ sb->append(_Jv_NewStringUtf8Const(meth->self->signature));
+ // FIXME: source file name and line number can be found from
+ // bytecode debug information. But currently we don't keep that
+ // around.
+ // FIXME: is using the defining class correct here?
+ java::lang::String *className = meth->defining_class->getName();
+ java::lang::String *methodName
+ = demangleInterpreterMethod(sb->toString(), className);
+ return new java::lang::StackTraceElement(NULL, -1,
+ className, methodName, false);
+#else // INTERPRETER
+ return NULL;
+#endif // INTERPRETER
+}
diff --git a/libjava/gnu/java/lang/reflect/TypeSignature.java b/libjava/gnu/java/lang/reflect/TypeSignature.java
index 0344ca3a4af..e9c8861c611 100644
--- a/libjava/gnu/java/lang/reflect/TypeSignature.java
+++ b/libjava/gnu/java/lang/reflect/TypeSignature.java
@@ -1,5 +1,5 @@
/* TypeSignature.java -- Class used to compute type signatures
- Copyright (C) 1998 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -7,7 +7,7 @@ GNU Classpath 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 Classpath 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
@@ -44,230 +44,218 @@ import java.lang.reflect.Member;
import java.lang.reflect.Method;
/**
- This class provides static methods that can be used to compute
- type-signatures of <code>Class</code>s or <code>Member</code>s.
- More specific methods are also provided for computing the
- type-signature of <code>Constructor</code>s and
- <code>Method</code>s. Methods are also provided to go in the
- reverse direction.
-*/
+ * This class provides static methods that can be used to compute
+ * type-signatures of <code>Class</code>s or <code>Member</code>s.
+ * More specific methods are also provided for computing the
+ * type-signature of <code>Constructor</code>s and
+ * <code>Method</code>s. Methods are also provided to go in the
+ * reverse direction.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ */
public class TypeSignature
{
-
/**
- Returns a <code>String</code> representing the type-encoding of
- CLAZZ. Type-encodings are computed as follows:
+ * Returns a <code>String</code> representing the type-encoding of a class.
+ * The .class file format has different encodings for classes, depending
+ * on whether it must be disambiguated from primitive types or not; hence
+ * the descriptor parameter to choose between them. If you are planning
+ * on decoding primitive types along with classes, then descriptor should
+ * be true for correct results. Type-encodings are computed as follows:
+ *
+ * <pre>
+ * boolean -> "Z"
+ * byte -> "B"
+ * char -> "C"
+ * double -> "D"
+ * float -> "F"
+ * int -> "I"
+ * long -> "J"
+ * short -> "S"
+ * void -> "V"
+ * arrays -> "[" + descriptor format of component type
+ * object -> class format: fully qualified name with '.' replaced by '/'
+ * descriptor format: "L" + class format + ";"
+ * </pre>
+ *
+ * @param type the class name to encode
+ * @param descriptor true to return objects in descriptor format
+ * @return the class name, as it appears in bytecode constant pools
+ * @see #getClassForEncoding(String)
+ */
+ public static String getEncodingOfClass(String type, boolean descriptor)
+ {
+ if (! descriptor || type.charAt(0) == '[')
+ return type.replace('.', '/');
+ if (type.equals("boolean"))
+ return "Z";
+ if (type.equals("byte"))
+ return "B";
+ if (type.equals("short"))
+ return "S";
+ if (type.equals("char"))
+ return "C";
+ if (type.equals("int"))
+ return "I";
+ if (type.equals("long"))
+ return "J";
+ if (type.equals("float"))
+ return "F";
+ if (type.equals("double"))
+ return "D";
+ if (type.equals("void"))
+ return "V";
+ return 'L' + type.replace('.', '/') + ';';
+ }
- <pre>
- boolean -> "Z"
- byte -> "B"
- char -> "C"
- double -> "D"
- float -> "F"
- int -> "I"
- long -> "J"
- short -> "S"
- void -> "V"
- arrays -> "[" + type-encoding of component type
- object -> "L"
- + fully qualified class name with "."'s replaced by "/"'s
- + ";"</pre>
- */
- public static String getEncodingOfClass( Class clazz )
+ /**
+ * Gets the descriptor encoding for a class.
+ *
+ * @param clazz the class to encode
+ * @param descriptor true to return objects in descriptor format
+ * @return the class name, as it appears in bytecode constant pools
+ * @see #getEncodingOfClass(String, boolean)
+ */
+ public static String getEncodingOfClass(Class clazz, boolean descriptor)
{
- if( clazz.isPrimitive() )
- {
- if( clazz == Boolean.TYPE )
- return "Z";
- if( clazz == Byte.TYPE )
- return "B";
- if( clazz == Character.TYPE )
- return "C";
- if( clazz == Double.TYPE )
- return "D";
- if( clazz == Float.TYPE )
- return "F";
- if( clazz == Integer.TYPE )
- return "I";
- if( clazz == Long.TYPE )
- return "J";
- if( clazz == Short.TYPE )
- return "S";
- if( clazz == Void.TYPE )
- return "V";
- else
- throw new RuntimeException( "Unknown primitive class " + clazz );
- }
- else if( clazz.isArray() )
- {
- return '[' + getEncodingOfClass( clazz.getComponentType() );
- }
- else
- {
- String classname = clazz.getName();
- int name_len = classname.length();
- char[] buf = new char[ name_len + 2 ];
- buf[0] = 'L';
- classname.getChars( 0, name_len, buf, 1 );
-
- int i;
- for( i=1; i <= name_len; i++ )
- {
- if( buf[i] == '.' )
- buf[i] = '/';
- }
-
- buf[i] = ';';
- return new String( buf );
- }
+ return getEncodingOfClass(clazz.getName(), descriptor);
}
-
/**
- This function is the inverse of <code>getEncodingOfClass</code>.
+ * Gets the descriptor encoding for a class.
+ *
+ * @param clazz the class to encode
+ * @return the class name, as it appears in bytecode constant pools
+ * @see #getEncodingOfClass(String, boolean)
+ */
+ public static String getEncodingOfClass(Class clazz)
+ {
+ return getEncodingOfClass(clazz.getName(), true);
+ }
- @see getEncodingOfClass
- @exception ClassNotFoundException If class encoded as type_code
- cannot be located.
- */
- public static Class getClassForEncoding( String type_code )
+ /**
+ * This function is the inverse of <code>getEncodingOfClass</code>. This
+ * accepts both object and descriptor formats, but must know which style
+ * of string is being passed in (usually, descriptor should be true). In
+ * descriptor format, "I" is treated as int.class, in object format, it
+ * is treated as a class named I in the unnamed package.
+ *
+ * @param type_code the class name to decode
+ * @param descriptor if the string is in descriptor format
+ * @return the corresponding Class object
+ * @throws ClassNotFoundException if the class cannot be located
+ * @see #getEncodingOfClass(Class, boolean)
+ */
+ public static Class getClassForEncoding(String type_code, boolean descriptor)
throws ClassNotFoundException
{
- if( type_code.equals( "B" ) )
- return Byte.TYPE;
- if( type_code.equals( "C" ) )
- return Character.TYPE;
- if( type_code.equals( "D" ) )
- return Double.TYPE;
- if( type_code.equals( "F" ) )
- return Float.TYPE;
- if( type_code.equals( "I" ) )
- return Integer.TYPE;
- if( type_code.equals( "J" ) )
- return Long.TYPE;
- if( type_code.equals( "S" ) )
- return Short.TYPE;
- if( type_code.equals( "Z" ) )
- return Boolean.TYPE;
- if( type_code.charAt( 0 ) == 'L' )
- {
- return Class.forName(
- type_code.substring( 1, type_code.length() - 1 ).replace( '/', '.' ));
- }
- if( type_code.charAt( 0 ) == '[' )
- {
- int last_bracket = type_code.lastIndexOf( '[' );
- String brackets = type_code.substring( 0, last_bracket + 1 );
- String component = type_code.substring( last_bracket + 1 );
-
-// ??? This is what the Classpath implementation did, but I don't
-// think that it's correct. The JLS says that Class.forName takes the
-// classname of an array element in fully qualified form, whereas this
-// code is tring to strip off the punctuation.
-
-// if( component.charAt( 0 ) == 'L' )
-// component =
-// component.substring( 1, component.length() - 1 ).replace('/', '.');
-
- if( component.charAt( 0 ) == 'L' )
- component = component.replace('/', '.');
-
- return Class.forName( brackets + component );
- }
- else
- throw new ClassNotFoundException( "Type code cannot be parsed as a valid class name" );
+ if (descriptor)
+ {
+ switch (type_code.charAt(0))
+ {
+ case 'B':
+ return byte.class;
+ case 'C':
+ return char.class;
+ case 'D':
+ return double.class;
+ case 'F':
+ return float.class;
+ case 'I':
+ return int.class;
+ case 'J':
+ return long.class;
+ case 'S':
+ return short.class;
+ case 'V':
+ return void.class;
+ case 'Z':
+ return boolean.class;
+ default:
+ throw new ClassNotFoundException("Invalid class name: "
+ + type_code);
+ case 'L':
+ type_code = type_code.substring(1, type_code.length() - 1);
+ // Fallthrough.
+ case '[':
+ }
+ }
+ return Class.forName(type_code.replace('/', '.'));
}
-
/**
- Returns a <code>String</code> representing the type-encoding of
- M. The type-encoding of a method is:
+ * Gets the Class object for a type name.
+ *
+ * @param type_code the class name to decode
+ * @return the corresponding Class object
+ * @throws ClassNotFoundException if the class cannot be located
+ * @see #getClassForEncoding(String, boolean)
+ */
+ public static Class getClassForEncoding(String type_code)
+ throws ClassNotFoundException
+ {
+ return getClassForEncoding(type_code, true);
+ }
- "(" + type-encodings of parameter types + ")"
- + type-encoding of return type
- */
- public static String getEncodingOfMethod( Method m )
+ /**
+ * Returns a <code>String</code> representing the type-encoding of a
+ * method. The type-encoding of a method is:
+ *
+ * "(" + parameter type descriptors + ")" + return type descriptor
+ *
+ * XXX This could be faster if it were implemented natively.
+ *
+ * @param m the method to encode
+ * @return the encoding
+ */
+ public static String getEncodingOfMethod(Method m)
{
- String returnEncoding = getEncodingOfClass( m.getReturnType() );
Class[] paramTypes = m.getParameterTypes();
- String[] paramEncodings = new String[ paramTypes.length ];
-
- String paramEncoding;
- int size = 2; // make room for parens
- for( int i=0; i < paramTypes.length; i++ )
- {
- paramEncoding = getEncodingOfClass( paramTypes[i] );
- size += paramEncoding.length();
- paramEncodings[i] = paramEncoding;
- }
-
- size += returnEncoding.length();
-
- StringBuffer buf = new StringBuffer( size );
- buf.append( '(' );
-
- for( int i=0; i < paramTypes.length; i++ )
- {
- buf.append( paramEncodings[i] );
- }
-
- buf.append( ')' );
- buf.append( returnEncoding );
-
+ StringBuffer buf = new StringBuffer().append('(');
+ for (int i = 0; i < paramTypes.length; i++)
+ buf.append(getEncodingOfClass(paramTypes[i].getName(), true));
+ buf.append(')').append(getEncodingOfClass(m.getReturnType().getName(),
+ true));
return buf.toString();
}
-
/**
- Returns a <code>String</code> representing the type-encoding of
- C. The type-encoding of a method is:
-
- "(" + type-encodings of parameter types + ")V"
- */
- public static String getEncodingOfConstructor( Constructor c )
+ * Returns a <code>String</code> representing the type-encoding of a
+ * constructor. The type-encoding of a method is:
+ *
+ * "(" + parameter type descriptors + ")V"
+ *
+ * XXX This could be faster if it were implemented natively.
+ *
+ * @param c the constructor to encode
+ * @return the encoding
+ */
+ public static String getEncodingOfConstructor(Constructor c)
{
Class[] paramTypes = c.getParameterTypes();
- String[] paramEncodings = new String[ paramTypes.length ];
-
- String paramEncoding;
- int size = 3; // make room for parens and V for return type
- for( int i=0; i < paramTypes.length; i++ )
- {
- paramEncoding = getEncodingOfClass( paramTypes[i] );
- size += paramEncoding.length();
- paramEncodings[i] = paramEncoding;
- }
-
- StringBuffer buf = new StringBuffer( size );
- buf.append( '(' );
-
- for( int i=0; i < paramTypes.length; i++ )
- {
- buf.append( paramEncodings[i] );
- }
-
- buf.append( ")V" );
-
+ StringBuffer buf = new StringBuffer().append('(');
+ for (int i = 0; i < paramTypes.length; i++)
+ buf.append(getEncodingOfClass(paramTypes[i].getName(), true));
+ buf.append(")V");
return buf.toString();
}
-
/**
- Returns a <code>String</code> representing the type-encoding of
- MEM. <code>Constructor</code>s are handled by
- <code>getEncodingOfConstructor</code>. <code>Method</code>s are
- handled by <code>getEncodingOfMethod</code>. <code>Field</code>s
- are handled by returning the encoding of the type of the
- <code>Field</code>.
- */
- public static String getEncodingOfMember( Member mem )
+ * Returns a <code>String</code> representing the type-encoding of a
+ * class member. This appropriately handles Constructors, Methods, and
+ * Fields.
+ *
+ * @param mem the member to encode
+ * @return the encoding
+ */
+ public static String getEncodingOfMember(Member mem)
{
- if( mem instanceof Constructor )
- return getEncodingOfConstructor( (Constructor)mem );
- if( mem instanceof Method )
- return getEncodingOfMethod( (Method)mem );
+ if (mem instanceof Constructor)
+ return getEncodingOfConstructor((Constructor) mem);
+ if (mem instanceof Method)
+ return getEncodingOfMethod((Method) mem);
else // Field
- return getEncodingOfClass( ((Field)mem).getType() );
+ return getEncodingOfClass(((Field) mem).getType().getName(), true);
}
-}
+} // class TypeSignature
diff --git a/libjava/gnu/java/rmi/RMIMarshalledObjectInputStream.java b/libjava/gnu/java/rmi/RMIMarshalledObjectInputStream.java
new file mode 100644
index 00000000000..8835280a0e0
--- /dev/null
+++ b/libjava/gnu/java/rmi/RMIMarshalledObjectInputStream.java
@@ -0,0 +1,70 @@
+/* gnu.java.rmi.RMIMarshalledObjectInputStream
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.rmi;
+
+import gnu.java.rmi.server.RMIObjectInputStream;
+import java.io.ObjectInputStream;
+import java.io.IOException;
+import java.io.ByteArrayInputStream;
+
+/**
+ * This class is only for java.rmi.MarshalledObject to deserialize object from
+ * objBytes and locBytes
+ */
+
+public class RMIMarshalledObjectInputStream extends RMIObjectInputStream
+{
+ private ObjectInputStream locStream;
+
+ public RMIMarshalledObjectInputStream(byte[] objBytes, byte[] locBytes) throws IOException
+ {
+ super(new ByteArrayInputStream(objBytes));
+ if(locBytes != null)
+ locStream = new ObjectInputStream(new ByteArrayInputStream(locBytes));
+ }
+
+ //This method overrides RMIObjectInputStream's
+ protected Object getAnnotation() throws IOException, ClassNotFoundException
+ {
+ if(locStream == null)
+ return null;
+ return locStream.readObject();
+ }
+
+} // End of RMIMarshalledObjectInputStream
diff --git a/libjava/gnu/java/rmi/RMIMarshalledObjectOutputStream.java b/libjava/gnu/java/rmi/RMIMarshalledObjectOutputStream.java
new file mode 100644
index 00000000000..66392919868
--- /dev/null
+++ b/libjava/gnu/java/rmi/RMIMarshalledObjectOutputStream.java
@@ -0,0 +1,103 @@
+/* gnu.java.rmi.RMIMarshalledObjectOutputStream
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.rmi;
+
+import java.io.OutputStream;
+import java.io.ObjectOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.rmi.Remote;
+import java.rmi.server.ObjID;
+import java.rmi.server.RemoteStub;
+
+import gnu.java.rmi.server.RMIObjectOutputStream;
+import gnu.java.rmi.server.UnicastServerRef;
+
+/**
+ * This class is only for java.rmi.MarshalledObject to serialize object and
+ * got objBytes and locBytes
+ */
+public class RMIMarshalledObjectOutputStream extends RMIObjectOutputStream
+{
+ private ObjectOutputStream locStream;
+ private ByteArrayOutputStream locBytesStream;
+
+ public RMIMarshalledObjectOutputStream(OutputStream objStream) throws IOException
+ {
+ super(objStream);
+ }
+
+ //This method overrides RMIObjectOutputStream's.
+ protected void setAnnotation(String annotation) throws IOException{
+ synchronized(this){
+ if(locStream == null){
+ locBytesStream = new ByteArrayOutputStream();
+ locStream = new ObjectOutputStream(locBytesStream);
+ }
+ }
+ locStream.writeObject(annotation);
+ }
+
+ //This method overrides ObjectOutputStream's to replace Remote to RemoteStub
+ protected Object replaceObject(Object obj) throws IOException
+ {
+ if((obj instanceof Remote) && !(obj instanceof RemoteStub))
+ {
+ UnicastServerRef ref = new UnicastServerRef(new ObjID(), 0, null);
+ try{
+ return ref.exportObject((Remote)obj);
+ }catch(Exception e){}
+ }
+ return obj;
+ }
+
+ public void flush() throws IOException {
+ super.flush();
+ if(locStream != null)
+ locStream.flush();
+ }
+
+ public byte[] getLocBytes(){
+ if(locStream != null)
+ return locBytesStream.toByteArray();
+ return null;
+ }
+
+} // End of RMIMarshalledObjectOutputStream
+
diff --git a/libjava/gnu/java/rmi/dgc/DGCImpl.java b/libjava/gnu/java/rmi/dgc/DGCImpl.java
index adca54fda44..fba18c1715d 100644
--- a/libjava/gnu/java/rmi/dgc/DGCImpl.java
+++ b/libjava/gnu/java/rmi/dgc/DGCImpl.java
@@ -49,12 +49,16 @@ import gnu.java.rmi.server.UnicastServerRef;
public class DGCImpl
extends UnicastRemoteObject implements DGC {
+private static final long leaseValue = 600000L;
+
public DGCImpl() throws RemoteException {
super(new UnicastServerRef(new ObjID(ObjID.DGC_ID), 0, RMISocketFactory.getSocketFactory()));
}
public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease) throws RemoteException {
- System.out.println("DGCImpl.dirty - not implemented");
+ VMID vmid = lease.getVMID();
+ lease = new Lease(vmid, leaseValue);
+ System.out.println("DGCImpl.dirty - not completely implemented");
return (lease);
}
diff --git a/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java b/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java
index fd0f2eec803..545ebc7bdea 100644
--- a/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java
+++ b/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java
@@ -1,3 +1,41 @@
+/* DGCImpl_Skel.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
// Skel class generated by rmic - DO NOT EDIT!
package gnu.java.rmi.dgc;
diff --git a/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java b/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java
index e611fb227eb..bffde5280cd 100644
--- a/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java
+++ b/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java
@@ -1,3 +1,41 @@
+/* DGCImpl_Stub.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
// Stub class generated by rmic - DO NOT EDIT!
package gnu.java.rmi.dgc;
diff --git a/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java b/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java
index 7ba41c389cb..de6b9e42604 100644
--- a/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java
+++ b/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java
@@ -1,3 +1,41 @@
+/* RegistryImpl_Skel.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
// Skel class generated by rmic - DO NOT EDIT!
package gnu.java.rmi.registry;
diff --git a/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java b/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java
index bfa755c3fdb..33cb06a4b68 100644
--- a/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java
+++ b/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java
@@ -1,3 +1,41 @@
+/* RegistryImpl_Stub.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
// Stub class generated by rmic - DO NOT EDIT!
package gnu.java.rmi.registry;
diff --git a/libjava/gnu/java/rmi/server/ConnectionRunnerPool.java b/libjava/gnu/java/rmi/server/ConnectionRunnerPool.java
new file mode 100644
index 00000000000..df6363bdcb6
--- /dev/null
+++ b/libjava/gnu/java/rmi/server/ConnectionRunnerPool.java
@@ -0,0 +1,154 @@
+/* gnu.java.rmi.server.ConnectionRunnerPool
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.rmi.server;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+//Should I generalize this class?
+
+class ConnectionRunnerPool
+{
+
+ public static
+ class ConnectionRunner extends Thread{
+ private UnicastConnection conn;
+ private volatile boolean exiting = false;
+
+ public ConnectionRunner(ThreadGroup group, String id){
+ super(group, id);
+ }
+
+ public synchronized void run(){
+ while(!exiting){
+ if(conn == null)
+ try{
+ wait();
+ }catch(InterruptedException e){
+ continue;
+ }
+ else{
+ conn.run();
+ conn = null;
+ synchronized(ConnectionRunnerPool.class){
+ freelist.add(this);
+ if(freelist.size() == 1)
+ ConnectionRunnerPool.class.notifyAll();
+ }
+ }
+ }
+ }
+
+ public synchronized void dispatch(UnicastConnection conn){
+ this.conn = conn;
+ notify();
+ }
+
+ void exit(){
+ exiting = true;
+ if(conn != null)
+ try{
+ join(500);
+ }catch(InterruptedException e){}
+ interrupt();
+ }
+
+ }
+
+ private static int size = 5;
+ private static int max_size = 10;
+
+ private static ArrayList freelist;
+
+ private static ThreadGroup group = new ThreadGroup("pool");
+
+ static {
+ ConnectionRunner[] pools = new ConnectionRunner[size];
+ for(int i = 0; i < pools.length; i++){
+ pools[i] = new ConnectionRunner(group, new Integer(i).toString());
+ pools[i].setContextClassLoader(Thread.currentThread().getContextClassLoader());
+ pools[i].start();
+ }
+ freelist = new ArrayList(Arrays.asList(pools));
+ }
+
+ public static void setSize(int size_){
+ size = size_;
+ }
+
+ public static void setMaxSize(int size){
+ max_size = size;
+ }
+
+ private synchronized static ConnectionRunner getConnectionRunner()
+ {
+ if(freelist.size() == 0){
+ if(size < max_size){
+ ++size;
+ ConnectionRunner a = new ConnectionRunner(group, new Integer(size).toString());
+ a.start();
+ freelist.add(a);
+ }else
+ while(freelist.size() == 0)
+ try{
+ ConnectionRunnerPool.class.wait();
+ }catch(InterruptedException e){}
+ }
+
+ // always let the first in pool most busy or other scheduling plan??
+ ConnectionRunner a = (ConnectionRunner)freelist.get(0);
+ freelist.remove(a);
+ return a;
+ }
+
+ public static void dispatchConnection(UnicastConnection conn)
+ {
+ ConnectionRunner r = getConnectionRunner();
+ r.dispatch(conn);
+ }
+
+ public static void exit()
+ {
+ Thread[] list = new Thread[group.activeCount()];
+ group.enumerate(list);
+ for(int i = 0; i < list.length; i++)
+ ((ConnectionRunner)list[i]).exit();
+ }
+
+}
diff --git a/libjava/gnu/java/rmi/server/RMIHashes.java b/libjava/gnu/java/rmi/server/RMIHashes.java
index 993e5bf1d2b..6e32724d50a 100644
--- a/libjava/gnu/java/rmi/server/RMIHashes.java
+++ b/libjava/gnu/java/rmi/server/RMIHashes.java
@@ -39,13 +39,56 @@ package gnu.java.rmi.server;
import java.lang.reflect.Method;
import java.lang.Class;
-import gnu.java.security.provider.SHA;
+import gnu.java.io.NullOutputStream;
+import gnu.java.lang.reflect.TypeSignature;
+import java.security.MessageDigest;
+import java.security.DigestOutputStream;
+import java.io.DataOutputStream;
+import java.io.ByteArrayOutputStream;
public class RMIHashes
{
+ //There're other places using DigestOutputStream to generate hash in classpath, but I think the way I used
+ //here is more efficient, anyway, you can switch to DigestOutputStream by doing like "//or:" comments say.
+
+ //or:add this statement: private static final NullOutputStream nullOutputStream = new NullOutputStream ();
public static long getMethodHash(Method meth)
{
- return meth.hashCode ();
+ //Object Serialization Spec 8.3
+ try
+ {
+ MessageDigest md = MessageDigest.getInstance ("SHA");
+ //or:remove this statement: DigestOutputStream digest_out = new DigestOutputStream (nullOutputStream, md);
+ ByteArrayOutputStream digest_out = new ByteArrayOutputStream();
+ DataOutputStream data_out = new DataOutputStream (digest_out);
+
+ StringBuffer sbuf = new StringBuffer();
+ sbuf.append(meth.getName());
+ sbuf.append('(');
+ Class params[] = meth.getParameterTypes();
+ for(int i = 0; i < params.length; i++)
+ sbuf.append(TypeSignature.getEncodingOfClass(params[i]));
+ sbuf.append(')');
+ Class rcls = meth.getReturnType();
+ if(rcls != Void.TYPE)
+ sbuf.append(TypeSignature.getEncodingOfClass(rcls));
+ else
+ sbuf.append('V');
+
+ data_out.writeUTF (sbuf.toString());
+ data_out.flush();
+ data_out.close ();
+
+ md.update(digest_out.toByteArray()); //or:remove this statement
+ byte[] sha = md.digest ();
+ long result = 0;
+ int len = sha.length < 8 ? sha.length : 8;
+ for (int i=0; i < len; i++)
+ result += (long)(sha[i] & 0xFF) << (8 * i);
+ return result;
+ }catch(Exception _){
+ return -1L;
+ }
}
public static long getInterfaceHash(Class clazz)
@@ -53,3 +96,4 @@ public class RMIHashes
return clazz.hashCode ();
}
}
+
diff --git a/libjava/gnu/java/rmi/server/RMIObjectInputStream.java b/libjava/gnu/java/rmi/server/RMIObjectInputStream.java
index 70b6c53c304..5913e9221bf 100644
--- a/libjava/gnu/java/rmi/server/RMIObjectInputStream.java
+++ b/libjava/gnu/java/rmi/server/RMIObjectInputStream.java
@@ -44,6 +44,8 @@ import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
import java.rmi.server.RMIClassLoader;
+import java.lang.ClassNotFoundException;
+import java.lang.reflect.Proxy;
public class RMIObjectInputStream
extends ObjectInputStream {
@@ -56,20 +58,80 @@ public RMIObjectInputStream(InputStream strm, UnicastConnectionManager man) thro
enableResolveObject(true);
}
+public RMIObjectInputStream(InputStream strm) throws IOException {
+ this(strm, UnicastConnectionManager.getInstance(0, null));
+}
+
protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
-//System.out.println("Resolving class: " + desc.getName());
- String annotation = (String)readObject();
- if (annotation == null) {
- return (super.resolveClass(desc));
+ String annotation = (String)getAnnotation();
+ try{
+ return super.resolveClass(desc);
+ }catch(ClassNotFoundException _){};
+
+ try {
+ if(annotation == null)
+ return (RMIClassLoader.loadClass(desc.getName()));
+ else
+ return (RMIClassLoader.loadClass(annotation, desc.getName()));
}
- else {
- try {
- return (RMIClassLoader.loadClass(new URL(annotation), desc.getName()));
- }
- catch (MalformedURLException _) {
- throw new ClassNotFoundException(desc.getName());
- }
+ catch (MalformedURLException _) {
+ throw new ClassNotFoundException(desc.getName());
}
}
+//Separate it for override by MarshalledObject
+protected Object getAnnotation()
+ throws IOException, ClassNotFoundException
+{
+ return readObject();
+}
+
+protected Class resolveProxyClass(String intfs[])
+ throws IOException, ClassNotFoundException
+{
+ String annotation = (String)getAnnotation();
+ try{
+ return super.resolveProxyClass(intfs);
+ }catch(ClassNotFoundException _){};
+
+ Class clss[] = new Class[intfs.length];
+ if(annotation == null)
+ clss[0] = RMIClassLoader.loadClass(intfs[0]);
+ else
+ clss[0] = RMIClassLoader.loadClass(annotation, intfs[0]);
+ //assume all interfaces can be loaded by the same classloader
+ ClassLoader loader = clss[0].getClassLoader();
+ if(loader == null)
+ for(int i = 1; i < intfs.length; i++)
+ clss[i] = Class.forName(intfs[i]);
+ else
+ for(int i = 1; i < intfs.length; i++)
+ clss[i] = loader.loadClass(intfs[i]);
+ return Proxy.getProxyClass(loader, clss);
+}
+
+protected Object readValue(Class valueClass) throws IOException, ClassNotFoundException {
+ if(valueClass.isPrimitive()){
+ if(valueClass == Boolean.TYPE)
+ return new Boolean(readBoolean());
+ if(valueClass == Byte.TYPE)
+ return new Byte(readByte());
+ if(valueClass == Character.TYPE)
+ return new Character(readChar());
+ if(valueClass == Short.TYPE)
+ return new Short(readShort());
+ if(valueClass == Integer.TYPE)
+ return new Integer(readInt());
+ if(valueClass == Long.TYPE)
+ return new Long(readLong());
+ if(valueClass == Float.TYPE)
+ return new Float(readFloat());
+ if(valueClass == Double.TYPE)
+ return new Double(readDouble());
+ else
+ throw new Error("Unsupported primitive class: " + valueClass);
+ } else
+ return readObject();
}
+
+} \ No newline at end of file
diff --git a/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java b/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java
index d729047b487..71a2bac9ded 100644
--- a/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java
+++ b/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java
@@ -41,17 +41,74 @@ import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.rmi.server.RMIClassLoader;
+import java.rmi.Remote;
+import java.rmi.server.RemoteStub;
+import java.rmi.server.ObjID;
public class RMIObjectOutputStream
extends ObjectOutputStream {
public RMIObjectOutputStream(OutputStream strm) throws IOException {
super(strm);
+ enableReplaceObject(true);
+}
+
+//Separate it for override by MarshalledObject
+protected void setAnnotation(String annotation) throws IOException{
+ writeObject(annotation);
}
protected void annotateClass(Class cls) throws IOException {
-//System.out.println("Annotating class: " + cls);
- writeObject(RMIClassLoader.getClassAnnotation(cls));
+ setAnnotation(RMIClassLoader.getClassAnnotation(cls));
+}
+
+protected void annotateProxyClass(Class cls)
+ throws IOException
+{
+ annotateClass(cls);
+}
+
+protected Object replaceObject(Object obj)
+ throws IOException
+{
+ if((obj instanceof Remote) && !(obj instanceof RemoteStub)){
+ UnicastServerRef ref = new UnicastServerRef(new ObjID(), 0, null);
+ try{
+ return ref.exportObject((Remote)obj);
+ }catch(Exception e){}
+ }
+ return obj;
+}
+
+protected void writeValue(Object value, Class valueClass) throws IOException{
+ if(valueClass.isPrimitive()){
+ if(valueClass == Boolean.TYPE)
+ writeBoolean(((Boolean)value).booleanValue());
+ else
+ if(valueClass == Byte.TYPE)
+ writeByte(((Byte)value).byteValue());
+ else
+ if(valueClass == Character.TYPE)
+ writeChar(((Character)value).charValue());
+ else
+ if(valueClass == Short.TYPE)
+ writeShort(((Short)value).shortValue());
+ else
+ if(valueClass == Integer.TYPE)
+ writeInt(((Integer)value).intValue());
+ else
+ if(valueClass == Long.TYPE)
+ writeLong(((Long)value).longValue());
+ else
+ if(valueClass == Float.TYPE)
+ writeFloat(((Float)value).floatValue());
+ else
+ if(valueClass == Double.TYPE)
+ writeDouble(((Double)value).doubleValue());
+ else
+ throw new Error("Unsupported primitive class: " + valueClass);
+ } else
+ writeObject(value);
}
}
diff --git a/libjava/gnu/java/rmi/server/UnicastConnection.java b/libjava/gnu/java/rmi/server/UnicastConnection.java
index a8951656024..e13bb686229 100644
--- a/libjava/gnu/java/rmi/server/UnicastConnection.java
+++ b/libjava/gnu/java/rmi/server/UnicastConnection.java
@@ -44,6 +44,8 @@ import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
import java.io.ObjectOutput;
import java.io.ObjectInput;
import java.io.IOException;
@@ -65,9 +67,10 @@ UnicastConnection(UnicastConnectionManager man, Socket sock) {
}
void acceptConnection() throws IOException {
-//System.out.println("Accepting connection on " + lport);
- din = new DataInputStream(sock.getInputStream());
- dout = new DataOutputStream(sock.getOutputStream());
+//System.out.println("Accepting connection on " + sock);
+ //Use BufferedXXXStream would be more efficient
+ din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
+ dout = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
int sig = din.readInt();
if (sig != PROTOCOL_HEADER) {
@@ -85,6 +88,7 @@ void acceptConnection() throws IOException {
// Send my hostname and port
dout.writeUTF(manager.serverName);
dout.writeInt(manager.serverPort);
+ dout.flush();
// Read their hostname and port
String rhost = din.readUTF();
@@ -94,15 +98,16 @@ void acceptConnection() throws IOException {
}
void makeConnection(int protocol) throws IOException {
- dout = new DataOutputStream(sock.getOutputStream());
- din = new DataInputStream(sock.getInputStream());
+ //Use BufferedXXXStream would be more efficient
+ din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
+ dout = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
// Send header
dout.writeInt(PROTOCOL_HEADER);
dout.writeShort(PROTOCOL_VERSION);
dout.writeByte(protocol);
- dout.flush();
-
+ dout.flush();
+
if (protocol != SINGLE_OP_PROTOCOL) {
// Get back ack.
int ack = din.readUnsignedByte();
@@ -117,6 +122,7 @@ void makeConnection(int protocol) throws IOException {
// Send them my endpoint
dout.writeUTF(manager.serverName);
dout.writeInt(manager.serverPort);
+ dout.flush();
}
// Okay, ready to roll ...
}
@@ -144,13 +150,15 @@ ObjectOutputStream getObjectOutputStream() throws IOException {
}
void disconnect() {
- oin = null;
- oout = null;
try {
- sock.close();
+ if(oout != null)
+ oout.close();
}
catch (IOException _) {
- }
+ }
+
+ oin = null;
+ oout = null;
din = null;
dout = null;
sock = null;
diff --git a/libjava/gnu/java/rmi/server/UnicastConnectionManager.java b/libjava/gnu/java/rmi/server/UnicastConnectionManager.java
index fe08ad0814d..64fecdce2a0 100644
--- a/libjava/gnu/java/rmi/server/UnicastConnectionManager.java
+++ b/libjava/gnu/java/rmi/server/UnicastConnectionManager.java
@@ -57,9 +57,12 @@ public class UnicastConnectionManager
implements Runnable, ProtocolConstants {
private static String localhost;
+// use different maps for server/client type UnicastConnectionManager
private static Hashtable servers = new Hashtable();
+private static Hashtable clients = new Hashtable();
-private Thread serverThread;
+// make serverThread volatile for poll
+private volatile Thread serverThread;
private ServerSocket ssock;
String serverName;
int serverPort;
@@ -68,7 +71,9 @@ private RMIClientSocketFactory clientFactory;
static {
try {
- localhost = InetAddress.getLocalHost().getHostName();
+ //Use host address instead of host name to avoid name resolving issues
+ //localhost = InetAddress.getLocalHost().getHostName();
+ localhost = InetAddress.getLocalHost().getHostAddress();
}
catch (UnknownHostException _) {
localhost = "localhost";
@@ -112,11 +117,16 @@ public static synchronized UnicastConnectionManager getInstance(String host, int
if (csf == null) {
csf = RMISocketFactory.getSocketFactory();
}
+ // change host name to host address to avoid name resolving issues
+ try{
+ host = InetAddress.getByName(host).getHostAddress();
+ }catch(Exception _){}
+
TripleKey key = new TripleKey(host, port, csf);
- UnicastConnectionManager man = (UnicastConnectionManager)servers.get(key);
+ UnicastConnectionManager man = (UnicastConnectionManager)clients.get(key);
if (man == null) {
man = new UnicastConnectionManager(host, port, csf);
- servers.put(key, man);
+ clients.put(key, man);
}
return (man);
}
@@ -199,17 +209,33 @@ public void startServer() {
}
/**
+ * Stop a server on this manager
+ */
+public void stopServer() {
+ synchronized(this) {
+ if(serverThread != null){
+ serverThread = null;
+ try{
+ ssock.close();
+ }catch(Exception _){}
+ }
+ }
+}
+
+/**
* Server thread for connection manager.
*/
public void run() {
- for (;;) {
+ for (;serverThread != null;) { // if serverThread==null, then exit thread
try {
//System.out.println("Waiting for connection on " + serverPort);
UnicastConnection conn = getServerConnection();
- (new Thread(conn)).start();
+ // use a thread pool to improve performance
+ // (new Thread(conn)).start();
+ ConnectionRunnerPool.dispatchConnection(conn);
}
catch (Exception e) {
- e.printStackTrace();
+ // e.printStackTrace();
}
}
}
diff --git a/libjava/gnu/java/rmi/server/UnicastRef.java b/libjava/gnu/java/rmi/server/UnicastRef.java
index 1c5bf577ed9..d6cda49c600 100644
--- a/libjava/gnu/java/rmi/server/UnicastRef.java
+++ b/libjava/gnu/java/rmi/server/UnicastRef.java
@@ -107,6 +107,7 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu
objid.write(out);
out.writeInt(opnum);
out.writeLong(hash);
+ /*
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (params[i] instanceof UnicastRemoteObject) {
@@ -117,6 +118,11 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu
}
}
}
+ */
+ // must handle primitive class and their wrapper classes
+ Class clss[] = method.getParameterTypes();
+ for(int i = 0; i < clss.length; i++)
+ ((RMIObjectOutputStream)out).writeValue(params[i], clss[i]);
out.flush();
}
@@ -139,12 +145,25 @@ private Object invokeCommon(Remote obj, Method method, Object[] params, int opnu
returncode = in.readUnsignedByte();
ack = UID.read(in);
- returnval = in.readObject();
+ //returnval = in.readObject();
+ Class cls = method.getReturnType();
+ if(cls == Void.TYPE){
+ returnval = null;
+ }else
+ returnval = ((RMIObjectInputStream)in).readValue(cls);
}
catch (IOException e3) {
throw new RemoteException("call return failed: ", e3);
}
+ /* if DGCAck is necessary
+ //According to RMI wire protocol, send a DGCAck
+ // to indicate receiving return value
+ dout.writeByte(MESSAGE_DGCACK);
+ ack.write(dout);
+ out.flush();
+ */
+
manager.discardConnection(conn);
if (returncode != RETURN_ACK) {
@@ -183,13 +202,16 @@ public void writeExternal(ObjectOutput out) throws IOException {
}
manager.write(out);
objid.write(out);
- out.writeByte(RETURN_ACK);
+ // This byte is somewhat confusing when interoperating with JDK
+ out.writeByte(0); //RETURN_ACK);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
manager = UnicastConnectionManager.read(in);
objid = ObjID.read(in);
- if (in.readByte() != RETURN_ACK) {
+ byte ack = in.readByte();
+ // This byte is somewhat confusing when interoperating with JDK
+ if (ack != RETURN_ACK && ack != 0/*jdk ack value*/) {
throw new IOException("no ack found");
}
}
diff --git a/libjava/gnu/java/rmi/server/UnicastServer.java b/libjava/gnu/java/rmi/server/UnicastServer.java
index d9f5fb71527..15c622f48bc 100644
--- a/libjava/gnu/java/rmi/server/UnicastServer.java
+++ b/libjava/gnu/java/rmi/server/UnicastServer.java
@@ -65,6 +65,13 @@ public static void exportObject(UnicastServerRef obj) {
obj.manager.startServer();
}
+// FIX ME: I haven't handle force parameter
+public static boolean unexportObject(UnicastServerRef obj, boolean force) {
+ objects.remove(obj.objid);
+ obj.manager.stopServer();
+ return true;
+}
+
private static synchronized void startDGC() {
if (dgc == null) {
try {
@@ -100,10 +107,14 @@ private static void incomingMessageCall(UnicastConnection conn) throws IOExcepti
UnicastServerRef uref = (UnicastServerRef)objects.get(objid);
Object returnval;
int returncode = RETURN_ACK;
+ // returnval is from Method.invoke(), so we must check the return class to see
+ // if it's primitive type
+ Class returncls = null;
if (uref != null) {
try {
// Dispatch the call to it.
returnval = uref.incomingMessageCall(conn, method, hash);
+ returncls = uref.getMethodReturnType(method, hash);
}
catch (Exception e) {
returnval = e;
@@ -121,7 +132,10 @@ private static void incomingMessageCall(UnicastConnection conn) throws IOExcepti
out.writeByte(returncode);
(new UID()).write(out);
- out.writeObject(returnval);
+ if(returnval != null && returncls != null)
+ ((RMIObjectOutputStream)out).writeValue(returnval, returncls);
+ else
+ out.writeObject(returnval);
out.flush();
}
diff --git a/libjava/gnu/java/rmi/server/UnicastServerRef.java b/libjava/gnu/java/rmi/server/UnicastServerRef.java
index b145089e600..196f969d292 100644
--- a/libjava/gnu/java/rmi/server/UnicastServerRef.java
+++ b/libjava/gnu/java/rmi/server/UnicastServerRef.java
@@ -66,14 +66,15 @@ import java.io.ObjectOutputStream;
import java.util.Hashtable;
public class UnicastServerRef
- extends UnicastRef {
+ extends UnicastRef
+ implements ServerRef{ //SHOULD implement ServerRef
final static private Class[] stubprototype = new Class[] { RemoteRef.class };
Remote myself;
private Skeleton skel;
private RemoteStub stub;
-private Hashtable methods;
+private Hashtable methods = new Hashtable();
public UnicastServerRef(ObjID id, int port, RMIServerSocketFactory ssf) {
super(id);
@@ -95,7 +96,7 @@ public RemoteStub exportObject(Remote obj) throws RemoteException {
skel = (Skeleton)getHelperClass(cls, "_Skel");
// Build hash of methods which may be called.
- buildMethodHash(obj.getClass());
+ buildMethodHash(obj.getClass(), true);
// Export it.
UnicastServer.exportObject(this);
@@ -104,10 +105,25 @@ public RemoteStub exportObject(Remote obj) throws RemoteException {
return (stub);
}
+public RemoteStub exportObject(Remote remote, Object obj)
+ throws RemoteException
+{
+ //FIX ME
+ return exportObject(remote);
+}
+
+
+public boolean unexportObject(Remote obj, boolean force) throws RemoteException {
+ // Remove all hashes of methods which may be called.
+ buildMethodHash(obj.getClass(), false);
+ return UnicastServer.unexportObject(this, force);
+}
+
private Object getHelperClass(Class cls, String type) {
try {
- String classname = cls.getName();
- Class scls = Class.forName(classname + type);
+ String classname = cls.getName();
+ ClassLoader cl = cls.getClassLoader(); //DONT use "Class scls = Class.forName(classname + type);"
+ Class scls = cl.loadClass(classname + type);
if (type.equals("_Stub")) {
try {
// JDK 1.2 stubs
@@ -147,8 +163,7 @@ public String getClientHost() throws ServerNotActiveException {
throw new Error("Not implemented");
}
-private void buildMethodHash(Class cls) {
- methods = new Hashtable();
+private void buildMethodHash(Class cls, boolean build) {
Method[] meths = cls.getMethods();
for (int i = 0; i < meths.length; i++) {
/* Don't need to include any java.xxx related stuff */
@@ -156,11 +171,23 @@ private void buildMethodHash(Class cls) {
continue;
}
long hash = RMIHashes.getMethodHash(meths[i]);
- methods.put(new Long (hash), meths[i]);
+ if(build)
+ methods.put(new Long (hash), meths[i]);
+ else
+ methods.remove(new Long (hash));
//System.out.println("meth = " + meths[i] + ", hash = " + hash);
}
}
+Class getMethodReturnType(int method, long hash) throws Exception
+{
+ if (method == -1) {
+ Method meth = (Method)methods.get(new Long (hash));
+ return meth.getReturnType();
+ }else
+ return null;
+}
+
public Object incomingMessageCall(UnicastConnection conn, int method, long hash) throws Exception {
//System.out.println("method = " + method + ", hash = " + hash);
// If method is -1 then this is JDK 1.2 RMI - so use the hash
@@ -189,7 +216,15 @@ public Object incomingMessageCall(UnicastConnection conn, int method, long hash)
throw t;
}
}
- return (meth.invoke(myself, args));
+ //We must reinterpret the exception thrown by meth.invoke()
+ //return (meth.invoke(myself, args));
+ Object ret = null;
+ try{
+ ret = meth.invoke(myself, args);
+ }catch(InvocationTargetException e){
+ throw (Exception)(e.getTargetException());
+ }
+ return ret;
}
// Otherwise this is JDK 1.1 style RMI - we find the skeleton
// and invoke it using the method number. We wrap up our
diff --git a/libjava/include/.cvsignore b/libjava/include/.cvsignore
new file mode 100644
index 00000000000..4ce50a28902
--- /dev/null
+++ b/libjava/include/.cvsignore
@@ -0,0 +1 @@
+stamp-h1.in
diff --git a/libjava/include/config.h.in b/libjava/include/config.h.in
index 266d6e3032d..cd770f93ac6 100644
--- a/libjava/include/config.h.in
+++ b/libjava/include/config.h.in
@@ -1,4 +1,4 @@
-/* include/config.h.in. Generated automatically from configure.in by autoheader. */
+/* include/config.h.in. Generated automatically from configure.in by autoheader 2.13. */
/* Define if using alloca.c. */
#undef C_ALLOCA
@@ -132,6 +132,7 @@
#undef HAVE_READDIR_R
#undef HAVE_GETHOSTBYNAME_R
#undef HAVE_GETHOSTBYADDR_R
+#undef HAVE_FTRUNCATE
/* Define if you want a bytecode interpreter. */
#undef INTERPRETER
@@ -201,6 +202,9 @@
/* Define if you have the ftime function. */
#undef HAVE_FTIME
+/* Define if you have the ftruncate function. */
+#undef HAVE_FTRUNCATE
+
/* Define if you have the getcwd function. */
#undef HAVE_GETCWD
@@ -339,6 +343,9 @@
/* Define if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
+/* Define if you have the <net/if.h> header file. */
+#undef HAVE_NET_IF_H
+
/* Define if you have the <netdb.h> header file. */
#undef HAVE_NETDB_H
@@ -387,6 +394,9 @@
/* Define if the compiler is configured for setjmp/longjmp exceptions. */
#undef SJLJ_EXCEPTIONS
+/* Indicate that linker is not able to 8-byte align static data */
+#undef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+
/* Required define if using POSIX threads */
#undef _REENTRANT
diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h
index de1d88f452e..e3f96713ce7 100644
--- a/libjava/include/java-interp.h
+++ b/libjava/include/java-interp.h
@@ -13,6 +13,7 @@ details. */
#include <jvm.h>
#include <java-cpool.h>
+#include <gnu/gcj/runtime/NameFinder.h>
#ifdef INTERPRETER
@@ -138,6 +139,7 @@ class _Jv_InterpMethod : public _Jv_MethodBase
friend class _Jv_ClassReader;
friend class _Jv_BytecodeVerifier;
+ friend class gnu::gcj::runtime::NameFinder;
friend void _Jv_PrepareClass(jclass);
};
@@ -205,6 +207,28 @@ public:
}
};
+// A structure of this type is used to link together interpreter
+// invocations on the stack.
+struct _Jv_MethodChain
+{
+ const _Jv_InterpMethod *self;
+ _Jv_MethodChain **ptr;
+ _Jv_MethodChain *next;
+
+ _Jv_MethodChain (const _Jv_InterpMethod *s, _Jv_MethodChain **n)
+ {
+ self = s;
+ ptr = n;
+ next = *n;
+ *n = this;
+ }
+
+ ~_Jv_MethodChain ()
+ {
+ *ptr = next;
+ }
+};
+
#endif /* INTERPRETER */
#endif /* __JAVA_INTERP_H__ */
diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h
index fc3a7f73ecf..e02901de824 100644
--- a/libjava/include/jvm.h
+++ b/libjava/include/jvm.h
@@ -111,6 +111,20 @@ union _Jv_word2
jdouble d;
};
+// An instance of this type is used to represent a single frame in a
+// backtrace. If the interpreter has been built, we also include
+// information about the interpreted method.
+struct _Jv_frame_info
+{
+ // PC value.
+ void *addr;
+#ifdef INTERPRETER
+ // Actually a _Jv_InterpMethod, but we don't want to include
+ // java-interp.h everywhere.
+ void *interp;
+#endif // INTERPRETER
+};
+
/* Extract a character from a Java-style Utf8 string.
* PTR points to the current character.
* LIMIT points to the end of the Utf8 string.
diff --git a/libjava/include/name-finder.h b/libjava/include/name-finder.h
deleted file mode 100644
index 67ae0587fb0..00000000000
--- a/libjava/include/name-finder.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// name-finder.h - Convert addresses to names
-
-/* Copyright (C) 2000, 2002 Free Software Foundation, Inc
-
- This file is part of libgcj.
-
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
-
-/**
- * @author Andrew Haley <aph@cygnus.com>
- * @date Jan 6 2000
- */
-
-#include <gcj/cni.h>
-#include <jvm.h>
-
-#include <sys/types.h>
-
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-
-#include <string.h>
-#include <stdio.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <java/lang/StackTraceElement.h>
-
-/* _Jv_name_finder is a class wrapper around a mechanism that can
- convert addresses of methods to their names and the names of files
- in which they appear. */
-
-class _Jv_name_finder
-{
-public:
- _Jv_name_finder (char *executable);
- ~_Jv_name_finder ()
- {
-#if defined (HAVE_PIPE) && defined (HAVE_FORK)
- myclose (f_pipe[0]);
- myclose (f_pipe[1]);
- myclose (b_pipe[0]);
- myclose (b_pipe[1]);
- if (b_pipe_fd != NULL)
- fclose (b_pipe_fd);
-
- myclose (f2_pipe[0]);
- myclose (f2_pipe[1]);
- myclose (b2_pipe[0]);
- myclose (b2_pipe[1]);
- if (b2_pipe_fd != NULL)
- fclose (b2_pipe_fd);
-
- if (pid >= 0)
- {
- int wstat;
- // We don't care about errors here.
- waitpid (pid, &wstat, 0);
- }
-
- if (pid2 >= 0)
- {
- int wstat;
- // We don't care about errors here.
- waitpid (pid2, &wstat, 0);
- }
-#endif
- }
-
-/* Given a pointer to a function or method, try to convert it into a
- name and the appropriate line and source file. The caller passes
- the code pointer in p.
-
- Returns NULL if the lookup fails. Even if this happens, the field
- hex will have been correctly filled in with the pointer. */
-
- java::lang::StackTraceElement* lookup (void *p);
-
- char hex[sizeof (void *) * 2 + 5];
-
-private:
- void toHex (void *p);
- java::lang::StackTraceElement* createStackTraceElement(char *s, char *f);
-#if defined (HAVE_PIPE) && defined (HAVE_FORK)
- pid_t pid, pid2;
- int f_pipe[2], b_pipe[2], f2_pipe[2], b2_pipe[2];
- FILE *b_pipe_fd, *b2_pipe_fd;
- int demangling_error, lookup_error;
-
- // Close a descriptor only if it has not been closed.
- void myclose (int fd)
- {
- if (fd != -1)
- close (fd);
- }
-
-#endif
-};
diff --git a/libjava/include/win32-threads.h b/libjava/include/win32-threads.h
index 21fdd0e7aa1..e8cf80598c2 100644
--- a/libjava/include/win32-threads.h
+++ b/libjava/include/win32-threads.h
@@ -33,6 +33,14 @@ typedef struct
java::lang::Thread *thread_obj;
} _Jv_Thread_t;
+typedef DWORD _Jv_ThreadId_t;
+
+inline _Jv_ThreadId_t
+_Jv_ThreadSelf (void)
+{
+ return GetCurrentThreadId();
+}
+
typedef void _Jv_ThreadStartFunc (java::lang::Thread *);
//
diff --git a/libjava/include/win32.h b/libjava/include/win32.h
index 8fbe39335d0..a035cfc5c13 100644
--- a/libjava/include/win32.h
+++ b/libjava/include/win32.h
@@ -16,9 +16,12 @@ details. */
#undef __INSIDE_CYGWIN__
#include <winsock.h>
+#define IP_TOS 3
#include <gcj/cni.h>
#include <java/util/Properties.h>
+#include <io.h>
+
extern void _Jv_platform_initialize (void);
extern void _Jv_platform_initProperties (java::util::Properties*);
extern jlong _Jv_platform_gettimeofday ();
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index e5c40cff150..d3f919bac13 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -22,7 +22,6 @@ details. */
#include <jvm.h>
#include <java-cpool.h>
#include <java-interp.h>
-// #include <java/lang/fdlibm.h>
#include <java/lang/System.h>
#include <java/lang/String.h>
#include <java/lang/Integer.h>
@@ -36,6 +35,7 @@ details. */
#include <java/lang/NullPointerException.h>
#include <java/lang/ArithmeticException.h>
#include <java/lang/IncompatibleClassChangeError.h>
+#include <java/lang/Thread.h>
#include <java-insns.h>
#include <java-signal.h>
@@ -744,11 +744,28 @@ _Jv_InterpMethod::compile (const void * const *insn_targets)
}
#endif /* DIRECT_THREADED */
+// This function exists so that the stack-tracing code can find the
+// boundaries of the interpreter.
+void
+_Jv_StartOfInterpreter (void)
+{
+}
+
void
_Jv_InterpMethod::run (void *retp, ffi_raw *args)
{
using namespace java::lang::reflect;
+ // FRAME_DESC registers this particular invocation as the top-most
+ // interpreter frame. This lets the stack tracing code (for
+ // Throwable) print information about the method being interpreted
+ // rather than about the interpreter itself. FRAME_DESC has a
+ // destructor so it cleans up automatically when the interpreter
+ // returns.
+ java::lang::Thread *thread = java::lang::Thread::currentThread();
+ _Jv_MethodChain frame_desc (this,
+ (_Jv_MethodChain **) &thread->interp_frame);
+
_Jv_word stack[max_stack];
_Jv_word *sp = stack;
@@ -1866,7 +1883,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
insn_iushr:
{
jint shift = (POPI() & 0x1f);
- unsigned long value = POPI();
+ UINT32 value = (UINT32) POPI();
PUSHI ((jint) (value >> shift));
}
NEXT_INSN;
@@ -3169,6 +3186,13 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
}
}
+// This function exists so that the stack-tracing code can find the
+// boundaries of the interpreter.
+void
+_Jv_EndOfInterpreter (void)
+{
+}
+
static void
throw_internal_error (char *msg)
{
diff --git a/libjava/java/awt/Toolkit.java b/libjava/java/awt/Toolkit.java
index 7caec22dca9..fb5e020a29e 100644
--- a/libjava/java/awt/Toolkit.java
+++ b/libjava/java/awt/Toolkit.java
@@ -96,11 +96,11 @@ public abstract class Toolkit
{
/** The default toolkit name. */
private static String default_toolkit_name
- = "gnu.java.awt.peer.gtk.GtkToolkit";
+ = "gnu.awt.gtk.GtkToolkit";
/**
* The toolkit in use. Once we load it, we don't ever change it
- * if the awt.toolkit propert is set.
+ * if the awt.toolkit property is set.
*/
private static Toolkit toolkit;
diff --git a/libjava/java/awt/dnd/Autoscroll.java b/libjava/java/awt/dnd/Autoscroll.java
new file mode 100644
index 00000000000..e7d3e28ed32
--- /dev/null
+++ b/libjava/java/awt/dnd/Autoscroll.java
@@ -0,0 +1,67 @@
+/* Autoscroll.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+import java.awt.Point;
+import java.awt.Insets;
+
+/**
+ * During DnD operations it is possible that a user may wish to drop the
+ * subject of the operation on a region of a scrollable GUI control that
+ * is not currently visible to the user.
+ *
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.2
+ * @status updated to 1.4
+ */
+public interface Autoscroll
+{
+ /**
+ * This method returns the Insets describing the autoscrolling region or
+ * border relative to the geometry of the implementing Component
+ */
+ public Insets getAutoscrollInsets ();
+
+ /**
+ * Notify the Component to autoscroll
+ *
+ * @param location A Point indicating the location of the cursor that
+ * triggered this operation
+ */
+ public void autoscroll (Point location);
+} // interface Autoscroll
diff --git a/libjava/java/awt/dnd/DragSourceAdapter.java b/libjava/java/awt/dnd/DragSourceAdapter.java
index 55daf41b257..2b2e15541fd 100644
--- a/libjava/java/awt/dnd/DragSourceAdapter.java
+++ b/libjava/java/awt/dnd/DragSourceAdapter.java
@@ -108,7 +108,7 @@ public abstract class DragSourceAdapter
*
* @param e the event
*/
- public void dragExit(DragSourceDragEvent e)
+ public void dragExit(DragSourceEvent e)
{
}
@@ -120,7 +120,7 @@ public abstract class DragSourceAdapter
*
* @param e the event
*/
- public void dragDropEnd(DragSourceDragEvent e)
+ public void dragDropEnd(DragSourceDropEvent e)
{
}
} // class DragSourceAdapter
diff --git a/libjava/java/awt/dnd/DragSourceDropEvent.java b/libjava/java/awt/dnd/DragSourceDropEvent.java
new file mode 100644
index 00000000000..4b70d1bf0b0
--- /dev/null
+++ b/libjava/java/awt/dnd/DragSourceDropEvent.java
@@ -0,0 +1,84 @@
+/* DragSourceDragEvent.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.2
+ *
+ * Written using JDK 1.4.1 Online API
+ * Status: JDK 1.4 complete
+ */
+public class DragSourceDropEvent extends DragSourceEvent
+{
+ private final int dropAction;
+ private final boolean success;
+
+ public DragSourceDropEvent (DragSourceContext context)
+ {
+ super (context);
+ this.dropAction = 0;
+ this.success = false;
+ }
+
+ public DragSourceDropEvent (DragSourceContext context, int dropAction,
+ boolean success)
+ {
+ super (context);
+ this.dropAction = dropAction;
+ this.success = success;
+ }
+
+ public DragSourceDropEvent (DragSourceContext context, int dropAction,
+ boolean success, int x, int y)
+ {
+ super (context, x, y);
+ this.dropAction = dropAction;
+ this.success = success;
+ }
+
+ public int getDropAction()
+ {
+ return dropAction & ((DragSourceContext) source).getSourceActions();
+ }
+
+ public boolean getDropSuccess()
+ {
+ return success;
+ }
+} // class DragSourceDropEvent
diff --git a/libjava/java/awt/dnd/DropTarget.java b/libjava/java/awt/dnd/DropTarget.java
index 9ae423438ec..9d8174500c5 100644
--- a/libjava/java/awt/dnd/DropTarget.java
+++ b/libjava/java/awt/dnd/DropTarget.java
@@ -36,5 +36,183 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.awt.dnd;
-/** STUB CLASS ONLY */
-public class DropTarget {}
+
+import java.awt.Point;
+import java.awt.Component;
+import java.awt.datatransfer.FlavorMap;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.TooManyListenersException;
+
+public class DropTarget
+{
+ protected static class DropTargetAutoScroller
+ implements ActionListener
+ {
+ protected DropTargetAutoScroller (Component c, Point p)
+ {
+ }
+
+ protected void updateLocation (Point newLocn)
+ {
+ }
+
+ protected void stop ()
+ {
+ }
+
+ public void actionPerformed (ActionEvent e)
+ {
+ }
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception HeadlessException FIXME
+ */
+ public DropTarget ()
+ {
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception HeadlessException FIXME
+ */
+ public DropTarget (Component c, DropTargetListener dtl)
+ {
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception HeadlessException FIXME
+ */
+ public DropTarget (Component c, int i, DropTargetListener dtl)
+ {
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception HeadlessException FIXME
+ */
+ public DropTarget (Component c, int i, DropTargetListener dtl, boolean b)
+ {
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception HeadlessException FIXME
+ */
+ public DropTarget (Component c, int i, DropTargetListener dtl, boolean b,
+ FlavorMap fm)
+ {
+ }
+
+ public void setComponent (Component c)
+ {
+ }
+
+ public Component getComponent ()
+ {
+ return null;
+ }
+
+ public void setDefaultActions (int ops)
+ {
+ }
+
+ public int getDefaultActions ()
+ {
+ return 0;
+ }
+
+ public void setActive(boolean isActive)
+ {
+ }
+
+ public boolean isActive()
+ {
+ return false;
+ }
+
+ /**
+ * @exception TooManyListenersException FIXME
+ */
+ public void addDropTargetListener (DropTargetListener dtl)
+ throws TooManyListenersException
+ {
+ }
+
+ public void removeDropTargetListener(DropTargetListener dtl)
+ {
+ }
+
+ public void dragEnter(DropTargetDragEvent dtde)
+ {
+ }
+
+ public void dragOver(DropTargetDragEvent dtde)
+ {
+ }
+
+ public void dropActionChanged(DropTargetDragEvent dtde)
+ {
+ }
+
+ public void dragExit(DropTargetEvent dte)
+ {
+ }
+
+ public void drop(DropTargetDropEvent dtde)
+ {
+ }
+
+ public FlavorMap getFlavorMap()
+ {
+ return null;
+ }
+
+ public void setFlavorMap(FlavorMap fm)
+ {
+ }
+
+ public void addNotify(java.awt.peer.ComponentPeer peer)
+ {
+ }
+
+ public void removeNotify(java.awt.peer.ComponentPeer peer)
+ {
+ }
+
+ public DropTargetContext getDropTargetContext()
+ {
+ return null;
+ }
+
+ protected DropTargetContext createDropTargetContext()
+ {
+ return null;
+ }
+
+ protected DropTarget.DropTargetAutoScroller createDropTargetAutoScroller
+ (Component c, Point p)
+ {
+ return null;
+ }
+
+ protected void initializeAutoscrolling(Point p)
+ {
+ }
+
+ protected void updateAutoscroll(Point dragCursorLocn)
+ {
+ }
+
+ protected void clearAutoscroll()
+ {
+ }
+} // class DropTarget
diff --git a/libjava/java/awt/dnd/DropTargetAdapter.java b/libjava/java/awt/dnd/DropTargetAdapter.java
new file mode 100644
index 00000000000..4ece882121b
--- /dev/null
+++ b/libjava/java/awt/dnd/DropTargetAdapter.java
@@ -0,0 +1,100 @@
+/* DragSourceAdapter.java -- drag-and-drop listener adapter
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+/**
+ * This class implements <code>DropTargetListener</code>, and implements all methods
+ * with empty bodies. This allows a listener interested in implementing only
+ * a subset of these interfaces to extend this class and override only the
+ * desired methods.
+ *
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.4
+ * @status updated to 1.4
+ */
+public abstract class DropTargetAdapter
+ implements DropTargetListener
+{
+ /**
+ * Default constructor.
+ */
+ public DropTargetAdapter()
+ {
+ }
+
+ /**
+ * Called when the cursor hotspot enters a drop site which will accept the
+ * drag.
+ *
+ * @param e the event
+ */
+ public void dragEnter (DropTargetDragEvent e)
+ {
+ }
+
+ /**
+ * Called when the cursor hotspot moves inside of a drop site which will
+ * accept the drag.
+ *
+ * @param e the event
+ */
+ public void dragOver (DropTargetDragEvent e)
+ {
+ }
+
+ /**
+ * Called when the user modifies the drop gesture. This is often the case
+ * when additional mouse or key events are received during the drag.
+ *
+ * @param e the event
+ */
+ public void dropActionChanged (DropTargetDragEvent e)
+ {
+ }
+
+ /**
+ * Called when the cursor hotspot moves outside of a drop site which will
+ * accept the drag. This could also happen if the drop site is no longer
+ * active, or no longer accepts the drag.
+ *
+ * @param e the event
+ */
+ public void dragExit(DropTargetEvent e)
+ {
+ }
+} // class DropTargetAdapter
diff --git a/libjava/java/awt/dnd/DropTargetContext.java b/libjava/java/awt/dnd/DropTargetContext.java
new file mode 100644
index 00000000000..255ab844e8d
--- /dev/null
+++ b/libjava/java/awt/dnd/DropTargetContext.java
@@ -0,0 +1,174 @@
+/* DropTargetContext.java --
+ Copyright (C) 2002 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+import java.awt.dnd.peer.DropTargetContextPeer;
+import java.io.Serializable;
+import java.io.IOException;
+import java.awt.Component;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.util.List;
+
+public class DropTargetContext implements Serializable
+{
+ protected class TransferableProxy implements Transferable
+ {
+ protected boolean isLocal;
+ protected Transferable transferable;
+
+ public DataFlavor[] getTransferDataFlavors ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public boolean isDataFlavorSupported (DataFlavor flavor)
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ public Object getTransferData (DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException
+ {
+ // FIXME: implement this
+ return null;
+ }
+ }
+
+ private int targetActions;
+
+ public DropTarget getDropTarget ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public Component getComponent ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public void addNotify (java.awt.dnd.peer.DropTargetContextPeer dtcp)
+ {
+ // FIXME: implement this
+ }
+
+ public void removeNotify ()
+ {
+ // FIXME: implement this
+ }
+
+ protected void setTargetActions (int actions)
+ {
+ targetActions = actions;
+ }
+
+ protected int getTargetActions()
+ {
+ return targetActions;
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception InvalidDnDOperationException FIXME
+ */
+ public void dropComplete (boolean success)
+ {
+ // FIXME: implement this
+ }
+
+ protected void acceptDrag (int dragOperation)
+ {
+ // FIXME: implement this
+ }
+
+ protected void rejectDrag ()
+ {
+ // FIXME: implement this
+ }
+
+ protected void acceptDrop (int dropOperation)
+ {
+ // FIXME: implement this
+ }
+
+ protected void rejectDrop ()
+ {
+ // FIXME: implement this
+ }
+
+ protected DataFlavor[] getCurrentDataFlavors ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ protected List getCurrentDataFlavorsAsList ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ protected boolean isDataFlavorSupported (DataFlavor flavor)
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * FIXME
+ *
+ * @exception InvalidDnDOperationException FIXME
+ */
+ protected Transferable getTransferable() throws InvalidDnDOperationException
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ protected Transferable createTransferableProxy(Transferable t, boolean local)
+ {
+ // FIXME: implement this
+ return null;
+ }
+} // class DropTargetContext
diff --git a/libjava/java/awt/dnd/DropTargetDragEvent.java b/libjava/java/awt/dnd/DropTargetDragEvent.java
new file mode 100644
index 00000000000..a22ddc8e32a
--- /dev/null
+++ b/libjava/java/awt/dnd/DropTargetDragEvent.java
@@ -0,0 +1,107 @@
+/* DropTargetDragEvent.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+import java.util.List;
+import java.awt.Point;
+import java.awt.datatransfer.DataFlavor;
+
+public class DropTargetDragEvent extends DropTargetEvent
+{
+ private final int dropAction;
+ private final int srcActions;
+ private final Point location;
+
+ /**
+ * FIXME
+ *
+ * @exception NullPointerException FIXME
+ */
+ public DropTargetDragEvent (DropTargetContext context, Point location,
+ int dropAction, int srcActions)
+ {
+ super (context);
+ this.dropAction = dropAction;
+ this.srcActions = srcActions;
+ this.location = location;
+ }
+
+ public void acceptDrag (int dragOperation)
+ {
+ // FIXME: implement this
+ }
+
+ public DataFlavor[] getCurrentDataFlavors ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public List getCurrentDataFlavorsAsList ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public int getDropAction()
+ {
+ return 0;
+ //return dropAction & ((DropTargetContext) source).getTargetActions();
+ }
+
+ public Point getLocation ()
+ {
+ return location;
+ }
+
+ public int getSourceActions ()
+ {
+ return srcActions;
+ }
+
+ public boolean isDataFlavorSupported (DataFlavor df)
+ {
+ // FIXME: implement this
+ return true;
+ }
+
+ public void rejectDrag ()
+ {
+ // FIXME: implement this
+ }
+} // class DropTargetDragEvent
diff --git a/libjava/java/awt/dnd/DropTargetDropEvent.java b/libjava/java/awt/dnd/DropTargetDropEvent.java
new file mode 100644
index 00000000000..9a14f226302
--- /dev/null
+++ b/libjava/java/awt/dnd/DropTargetDropEvent.java
@@ -0,0 +1,132 @@
+/* DropTargetDropEvent.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+import java.awt.Point;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.util.List;
+
+public class DropTargetDropEvent extends DropTargetEvent
+{
+ private final int dropAction;
+ private final int srcActions;
+ private final Point location;
+ private final boolean isLocal;
+
+ public DropTargetDropEvent (DropTargetContext dtc, Point location,
+ int dropAction, int srcActions)
+ {
+ super (dtc);
+ this.dropAction = dropAction;
+ this.srcActions = srcActions;
+ this.location = location;
+ this.isLocal = false;
+ }
+
+ public DropTargetDropEvent (DropTargetContext dtc, Point location,
+ int dropAction, int srcActions, boolean isLocal)
+ {
+ super (dtc);
+ this.dropAction = dropAction;
+ this.srcActions = srcActions;
+ this.location = location;
+ this.isLocal = isLocal;
+ }
+
+ public Point getLocation ()
+ {
+ return location;
+ }
+
+ public DataFlavor[] getCurrentDataFlavors ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public List getCurrentDataFlavorsAsList ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public boolean isDataFlavorSupported (DataFlavor flavor)
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ public int getSourceActions ()
+ {
+ // FIXME: implement this
+ return 0;
+ }
+
+ public int getDropAction ()
+ {
+ // FIXME: implement this
+ return 0;
+ }
+
+ public Transferable getTransferable ()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ public void acceptDrop (int dropAction)
+ {
+ // FIXME: implement this
+ }
+
+ public void rejectDrop ()
+ {
+ // FIXME: implement this
+ }
+
+ public void dropComplete (boolean success)
+ {
+ // FIXME: implement this
+ }
+
+ public boolean isLocalTransfer()
+ {
+ return isLocal;
+ }
+} // class DropTargetDropEvent
diff --git a/libjava/java/awt/dnd/DropTargetEvent.java b/libjava/java/awt/dnd/DropTargetEvent.java
new file mode 100644
index 00000000000..3065c2bc9ec
--- /dev/null
+++ b/libjava/java/awt/dnd/DropTargetEvent.java
@@ -0,0 +1,56 @@
+/* DropTarget.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+import java.util.EventObject;
+
+public class DropTargetEvent extends EventObject
+{
+ protected DropTargetContext context;
+
+ public DropTargetEvent (DropTargetContext context)
+ {
+ super (context);
+ this.context = context;
+ }
+
+ public DropTargetContext getDropTargetContext ()
+ {
+ return context;
+ }
+}
diff --git a/libjava/java/awt/dnd/DropTargetListener.java b/libjava/java/awt/dnd/DropTargetListener.java
new file mode 100644
index 00000000000..861aa89140e
--- /dev/null
+++ b/libjava/java/awt/dnd/DropTargetListener.java
@@ -0,0 +1,89 @@
+/* DropTargetListener.java -- listen to events during the drop
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.dnd;
+
+import java.util.EventListener;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.2
+ * @status updated to 1.4
+ */
+public interface DropTargetListener extends EventListener
+{
+ /**
+ * Called when the cursor hotspot enters a drop site which will accept the
+ * drag.
+ *
+ * @param e the drag source drag event
+ */
+ void dragEnter (DropTargetDragEvent e);
+
+ /**
+ * Called when the cursor hotspot moves inside of a drop site which will
+ * accept the drag.
+ *
+ * @param e the drag source drag event
+ */
+ void dragOver (DropTargetDragEvent e);
+
+ /**
+ * Called when the user modifies the drop gesture. This is often the case
+ * when additional mouse or key events are received during the drag.
+ *
+ * @param e the drag source drag event
+ */
+ void dropActionChanged (DropTargetDragEvent e);
+
+ /**
+ * Called when the cursor hotspot moves outside of a drop site which will
+ * accept the drag. This could also happen if the drop site is no longer
+ * active, or no longer accepts the drag.
+ *
+ * @param e the drag source drag event
+ */
+ void dragExit (DropTargetEvent e);
+
+ /**
+ * FIXME
+ *
+ * @param e the drag source drag event
+ */
+ void drop (DropTargetDropEvent e);
+} // interface DropTargetListener
diff --git a/libjava/java/awt/dnd/MouseDragGestureRecognizer.java b/libjava/java/awt/dnd/MouseDragGestureRecognizer.java
new file mode 100644
index 00000000000..1ef2e6cb483
--- /dev/null
+++ b/libjava/java/awt/dnd/MouseDragGestureRecognizer.java
@@ -0,0 +1,118 @@
+/* MouseDragGestureRecognizer.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd;
+
+import java.awt.Component;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ */
+
+public abstract class MouseDragGestureRecognizer
+ extends DragGestureRecognizer
+ implements MouseListener, MouseMotionListener
+{
+ protected MouseDragGestureRecognizer (DragSource ds, Component c, int act,
+ DragGestureListener dgl)
+ {
+ super (ds, c, act, dgl);
+ }
+
+ protected MouseDragGestureRecognizer (DragSource ds, Component c, int act)
+ {
+ super (ds, c, act);
+ }
+
+ protected MouseDragGestureRecognizer (DragSource ds, Component c)
+ {
+ super (ds, c);
+ }
+
+ protected MouseDragGestureRecognizer (DragSource ds)
+ {
+ super (ds);
+ }
+
+ protected void registerListeners ()
+ {
+ // FIXME: implement this
+ }
+
+ protected void unregisterListeners ()
+ {
+ // FIXME: implement this
+ }
+
+ public void mouseClicked (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+
+ public void mousePressed (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+
+ public void mouseReleased (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+
+ public void mouseEntered (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+
+ public void mouseExited (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+
+ public void mouseDragged (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+
+ public void mouseMoved (MouseEvent e)
+ {
+ // FIXME: implement this
+ }
+} // class MouseDragGestureRecognizer
diff --git a/libjava/java/awt/dnd/peer/DropTargetContextPeer.java b/libjava/java/awt/dnd/peer/DropTargetContextPeer.java
new file mode 100644
index 00000000000..ad166d98002
--- /dev/null
+++ b/libjava/java/awt/dnd/peer/DropTargetContextPeer.java
@@ -0,0 +1,45 @@
+/* DropTargetContextPeer.java -- interface for drag-and-drop peers
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.awt.dnd.peer;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ */
+public interface DropTargetContextPeer
+{
+} // interface DropTargetContextPeer
diff --git a/libjava/java/beans/beancontext/BeanContextChildSupport.java b/libjava/java/beans/beancontext/BeanContextChildSupport.java
index 84373acf5fb..270854b2576 100644
--- a/libjava/java/beans/beancontext/BeanContextChildSupport.java
+++ b/libjava/java/beans/beancontext/BeanContextChildSupport.java
@@ -60,7 +60,11 @@ import java.io.Serializable;
* @see java.beans.beancontext.BeanContextChild
*/
-public class BeanContextChildSupport implements BeanContextChild, BeanContextServicesListener, Serializable {
+public class BeanContextChildSupport
+ implements BeanContextChild, BeanContextServicesListener, Serializable
+{
+ static final long serialVersionUID = 6328947014421475877L;
+
/**
* The peer on which to perform <code>set</code> actions.
* This is here so that this class can be used as a peer.
diff --git a/libjava/java/io/ObjectInputStream.java b/libjava/java/io/ObjectInputStream.java
index e1e16f28498..08ce401fad8 100644
--- a/libjava/java/io/ObjectInputStream.java
+++ b/libjava/java/io/ObjectInputStream.java
@@ -1,5 +1,5 @@
/* ObjectInputStream.java -- Class used to read serialized objects
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,6 +42,7 @@ import gnu.classpath.Configuration;
import java.lang.reflect.Array;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Vector;
@@ -527,6 +528,32 @@ public class ObjectInputStream extends InputStream
}
+ protected Class resolveProxyClass (String[] intfs)
+ throws IOException, ClassNotFoundException
+ {
+ SecurityManager sm = System.getSecurityManager ();
+
+ if (sm == null)
+ sm = new SecurityManager () {};
+
+ ClassLoader cl = currentClassLoader (sm);
+
+ Class[] clss = new Class[intfs.length];
+ if(cl == null){
+ for (int i = 0; i < intfs.length; i++)
+ clss[i] = Class.forName(intfs[i]);
+ cl = ClassLoader.getSystemClassLoader();
+ }
+ else
+ for (int i = 0; i < intfs.length; i++)
+ clss[i] = cl.loadClass(intfs[i]);
+ try {
+ return Proxy.getProxyClass(cl, clss);
+ } catch (IllegalArgumentException e) {
+ throw new ClassNotFoundException(null, e);
+ }
+ }
+
/**
If <code>enable</code> is <code>true</code> and this object is
trusted, then <code>resolveObject (Object)</code> will be called
diff --git a/libjava/java/io/natFileDescriptorPosix.cc b/libjava/java/io/natFileDescriptorPosix.cc
index 9f4c7c3cb1d..9929c3021f7 100644
--- a/libjava/java/io/natFileDescriptorPosix.cc
+++ b/libjava/java/io/natFileDescriptorPosix.cc
@@ -195,6 +195,7 @@ java::io::FileDescriptor::setLength (jlong pos)
struct stat sb;
off_t orig;
+#ifdef HAVE_FTRUNCATE
if (::fstat (fd, &sb))
throw new IOException (JvNewStringLatin1 (strerror (errno)));
@@ -219,6 +220,9 @@ java::io::FileDescriptor::setLength (jlong pos)
}
else if (::ftruncate (fd, (off_t) pos))
throw new IOException (JvNewStringLatin1 (strerror (errno)));
+#else /* HAVE_FTRUNCATE */
+ throw new IOException (JvNewStringLatin1 ("FileDescriptor.setLength not implemented"));
+#endif /* HAVE_FTRUNCATE */
}
jint
diff --git a/libjava/java/lang/AssertionError.java b/libjava/java/lang/AssertionError.java
index 1ce00aee7af..2bbf81cac97 100644
--- a/libjava/java/lang/AssertionError.java
+++ b/libjava/java/lang/AssertionError.java
@@ -42,7 +42,7 @@ package java.lang;
* An assertion error normally occurs as a result of the <code>assert</code>
* statement added in JDK 1.4, to indicate that an assertion failed. There
* are enough constructors to ensure that
- * <code>new AssertionError(<em>expression</em)</code> will work for all
+ * <code>new AssertionError(<em>expression</em>)</code> will work for all
* espressions, regardless of type, as if the error message were given by
* the string <code>"" + <em>expression</em></code>. This extends Error,
* because you usually do not want to inadvertently trap an assertion failure.
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h
index 9eb1a5cac1a..9a8d4183b6f 100644
--- a/libjava/java/lang/Class.h
+++ b/libjava/java/lang/Class.h
@@ -19,6 +19,7 @@ details. */
#include <java/net/URL.h>
#include <java/lang/reflect/Modifier.h>
#include <java/security/ProtectionDomain.h>
+#include <java/lang/Package.h>
// We declare these here to avoid including gcj/cni.h.
extern "C" void _Jv_InitClass (jclass klass);
@@ -159,6 +160,9 @@ private:
java::lang::reflect::Method *getPrivateMethod (jstring, JArray<jclass> *);
java::security::ProtectionDomain *getProtectionDomain0 ();
+ java::lang::reflect::Method *_getMethod (jstring, JArray<jclass> *);
+ java::lang::reflect::Method *_getDeclaredMethod (jstring, JArray<jclass> *);
+
public:
JArray<java::lang::reflect::Field *> *getFields (void);
@@ -166,7 +170,6 @@ public:
void getSignature (java::lang::StringBuffer *buffer);
static jstring getSignature (JArray<jclass> *, jboolean is_constructor);
- java::lang::reflect::Method *_getMethod (jstring, JArray<jclass> *);
JArray<java::lang::reflect::Method *> *getMethods (void);
inline jint getModifiers (void)
@@ -209,6 +212,8 @@ public:
}
jobject newInstance (void);
+ java::security::ProtectionDomain *getProtectionDomain (void);
+ java::lang::Package *getPackage (void);
jstring toString (void);
jboolean desiredAssertionStatus (void);
diff --git a/libjava/java/lang/Class.java b/libjava/java/lang/Class.java
index 12306da8061..cc1cc40f2a4 100644
--- a/libjava/java/lang/Class.java
+++ b/libjava/java/lang/Class.java
@@ -65,9 +65,31 @@ public final class Class implements Serializable
public native Field getDeclaredField (String fieldName)
throws NoSuchFieldException, SecurityException;
public native Field[] getDeclaredFields () throws SecurityException;
- public native Method getDeclaredMethod (String methodName,
- Class[] parameterTypes)
- throws NoSuchMethodException, SecurityException;
+
+ private native Method _getDeclaredMethod (String methodName,
+ Class[] parameterTypes);
+
+ public Method getDeclaredMethod (String methodName, Class[] parameterTypes)
+ throws NoSuchMethodException, SecurityException
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ {
+ sm.checkMemberAccess(this, Member.DECLARED);
+ Package p = getPackage();
+ if (p != null)
+ sm.checkPackageAccess(p.getName());
+ }
+
+ if ("<init>".equals(methodName) || "<clinit>".equals(methodName))
+ throw new NoSuchMethodException(methodName);
+
+ Method m = _getDeclaredMethod(methodName, parameterTypes);
+ if (m == null)
+ throw new NoSuchMethodException (methodName);
+ return m;
+ }
+
public native Method[] getDeclaredMethods () throws SecurityException;
// This is marked as unimplemented in the JCL book.
diff --git a/libjava/java/lang/ClassLoader.java b/libjava/java/lang/ClassLoader.java
index a6faa61b2ed..2c0e21133d9 100644
--- a/libjava/java/lang/ClassLoader.java
+++ b/libjava/java/lang/ClassLoader.java
@@ -432,17 +432,24 @@ public abstract class ClassLoader
{
synchronized (clazz)
{
- try {
- linkClass0 (clazz);
- } catch (Throwable x) {
- markClassErrorState0 (clazz);
-
- if (x instanceof Error)
- throw (Error)x;
- else
- throw new java.lang.InternalError
- ("unexpected exception during linking: " + x);
- }
+ try
+ {
+ linkClass0 (clazz);
+ }
+ catch (Throwable x)
+ {
+ markClassErrorState0 (clazz);
+
+ if (x instanceof Error)
+ throw (Error)x;
+ else
+ {
+ InternalError e
+ = new InternalError ("unexpected exception during linking");
+ e.initCause (x);
+ throw e;
+ }
+ }
}
}
diff --git a/libjava/java/lang/Thread.java b/libjava/java/lang/Thread.java
index af5b95f14c6..18af8292126 100644
--- a/libjava/java/lang/Thread.java
+++ b/libjava/java/lang/Thread.java
@@ -10,6 +10,8 @@ details. */
package java.lang;
+import gnu.gcj.RawData;
+
/**
* @author Tom Tromey <tromey@cygnus.com>
* @date August 24, 1998
@@ -135,7 +137,7 @@ public class Thread implements Runnable
public final void setDaemon (boolean status)
{
checkAccess ();
- if (isAlive ())
+ if (!startable_flag)
throw new IllegalThreadStateException ();
daemon_flag = status;
}
@@ -311,6 +313,9 @@ public class Thread implements Runnable
private boolean startable_flag;
private ClassLoader context_class_loader;
+ // This describes the top-most interpreter frame for this thread.
+ RawData interp_frame;
+
// Our native data - points to an instance of struct natThread.
private Object data;
}
diff --git a/libjava/java/lang/Throwable.java b/libjava/java/lang/Throwable.java
index 56c9d542a50..62db8fd0d2d 100644
--- a/libjava/java/lang/Throwable.java
+++ b/libjava/java/lang/Throwable.java
@@ -1,5 +1,4 @@
-/* java.lang.Throwable -- Reference implementation of root class for
- all Exceptions and Errors
+/* java.lang.Throwable -- Root class for all Exceptions and Errors
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,17 +46,6 @@ import java.io.IOException;
import java.io.OutputStream;
/**
- * @author Tom Tromey <tromey@cygnus.com>
- * @date October 30, 1998
- */
-
-/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
- * "The Java Language Specification", ISBN 0-201-63451-1
- * Status: Sufficient for compiled code, but methods applicable to
- * bytecode not implemented. JDK 1.1.
- */
-
-/**
* Throwable is the superclass of all exceptions that can be raised.
*
* <p>There are two special cases: {@link Error} and {@link RuntimeException}:
@@ -116,7 +104,7 @@ import java.io.OutputStream;
* @author Tom Tromey
* @author Eric Blake <ebb9@email.byu.edu>
* @since 1.0
- * @status still missing 1.4 functionality
+ * @status updated to 1.4
*/
public class Throwable implements Serializable
{
@@ -130,7 +118,7 @@ public class Throwable implements Serializable
*
* @serial specific details about the exception, may be null
*/
- private String detailMessage;
+ private final String detailMessage;
/**
* The cause of the throwable, including null for an unknown or non-chained
@@ -171,7 +159,7 @@ public class Throwable implements Serializable
public Throwable(String message)
{
fillInStackTrace();
- detailMessage = message;
+ detailMessage = message;
}
/**
@@ -374,11 +362,11 @@ public class Throwable implements Serializable
*/
public void printStackTrace(PrintStream s)
{
- printStackTrace(new PrintWriter(s));
+ s.print(stackTraceString());
}
/**
- * <p>Prints the exception, the detailed message and the stack trace
+ * Prints the exception, the detailed message and the stack trace
* associated with this Throwable to the given <code>PrintWriter</code>.
* The actual output written is implemention specific. Use the result of
* <code>getStackTrace()</code> when more precise information is needed.
@@ -409,72 +397,88 @@ public class Throwable implements Serializable
*/
public void printStackTrace (PrintWriter pw)
{
- // First line
- pw.println(toString());
+ pw.print(stackTraceString());
+ }
+
+ private static final String nl = System.getProperty("line.separator");
+ // Create whole stack trace in a stringbuffer so we don't have to print
+ // it line by line. This prevents printing multiple stack traces from
+ // different threads to get mixed up when written to the same PrintWriter.
+ private String stackTraceString()
+ {
+ StringBuffer sb = new StringBuffer();
- // The stacktrace
+ // Main stacktrace
StackTraceElement[] stack = getStackTrace();
- if (stack == null || stack.length == 0)
- {
- pw.println(" <<No stacktrace available>>");
- return;
- }
- else
- {
- for (int i = 0; i < stack.length; i++)
- pw.println(" at " + stack[i]);
- }
+ stackTraceStringBuffer(sb, this.toString(), stack, 0);
// The cause(s)
Throwable cause = getCause();
while (cause != null)
{
- // Cause first line
- pw.println("Caused by: " + cause);
+ // Cause start first line
+ sb.append("Caused by: ");
// Cause stacktrace
StackTraceElement[] parentStack = stack;
stack = cause.getStackTrace();
- if (stack == null || stack.length == 0)
- {
- pw.println(" <<No stacktrace available>>");
- }
- else if (parentStack == null || parentStack.length == 0)
- {
- for (int i = 0; i < stack.length; i++)
- pw.println(" at " + stack[i]);
- }
+ if (parentStack == null || parentStack.length == 0)
+ stackTraceStringBuffer(sb, cause.toString(), stack, 0);
else
{
- boolean equal = false; // Is rest of stack equal to parent frame?
- for (int i = 0; i < stack.length && ! equal; i++)
+ int equal = 0; // Count how many of the last stack frames are equal
+ int frame = stack.length-1;
+ int parentFrame = parentStack.length-1;
+ while (frame > 0 && parentFrame > 0)
{
- // Check if we already printed the rest of the stack
- // since it was the tail of the parent stack
- int remaining = stack.length - i;
- int element = i;
- int parentElement = parentStack.length - remaining;
- equal = parentElement >= 0
- && parentElement < parentStack.length; // be optimistic
- while (equal && element < stack.length)
+ if (stack[frame].equals(parentStack[parentFrame]))
{
- if (stack[element].equals(parentStack[parentElement]))
- {
- element++;
- parentElement++;
- }
- else
- equal = false;
+ equal++;
+ frame--;
+ parentFrame--;
}
- // Print stacktrace element or indicate the rest is equal
- if (! equal)
- pw.println(" at " + stack[i]);
else
- pw.println(" ..." + remaining + " more");
+ break;
}
+ stackTraceStringBuffer(sb, cause.toString(), stack, equal);
}
cause = cause.getCause();
}
+
+ return sb.toString();
+ }
+
+ // Adds to the given StringBuffer a line containing the name and
+ // all stacktrace elements minus the last equal ones.
+ private static void stackTraceStringBuffer(StringBuffer sb, String name,
+ StackTraceElement[] stack, int equal)
+ {
+ // (finish) first line
+ sb.append(name);
+ sb.append(nl);
+
+ // The stacktrace
+ if (stack == null || stack.length == 0)
+ {
+ sb.append(" <<No stacktrace available>>");
+ sb.append(nl);
+ }
+ else
+ {
+ for (int i = 0; i < stack.length-equal; i++)
+ {
+ sb.append(" at ");
+ sb.append(stack[i] == null ? "<<Unknown>>" : stack[i].toString());
+ sb.append(nl);
+ }
+ if (equal > 0)
+ {
+ sb.append(" ...");
+ sb.append(equal);
+ sb.append(" more");
+ sb.append(nl);
+ }
+ }
}
/**
@@ -483,7 +487,13 @@ public class Throwable implements Serializable
* @return this same throwable
* @see #printStackTrace()
*/
- public native Throwable fillInStackTrace();
+ public Throwable fillInStackTrace()
+ {
+ vmState = VMThrowable.fillInStackTrace(this);
+ stackTrace = null; // Should be regenerated when used.
+
+ return this;
+ }
/**
* Provides access to the information printed in {@link #printStackTrace()}.
@@ -499,7 +509,13 @@ public class Throwable implements Serializable
public StackTraceElement[] getStackTrace()
{
if (stackTrace == null)
- stackTrace = getStackTrace0();
+ if (vmState == null)
+ stackTrace = new StackTraceElement[0];
+ else
+ {
+ stackTrace = vmState.getStackTrace(this);
+ vmState = null; // No longer needed
+ }
return stackTrace;
}
@@ -508,6 +524,10 @@ public class Throwable implements Serializable
* Change the stack trace manually. This method is designed for remote
* procedure calls, which intend to alter the stack trace before or after
* serialization according to the context of the remote call.
+ * <p>
+ * The contents of the given stacktrace is copied so changes to the
+ * original array do not change the stack trace elements of this
+ * throwable.
*
* @param stackTrace the new trace to use
* @throws NullPointerException if stackTrace is null or has null elements
@@ -515,15 +535,23 @@ public class Throwable implements Serializable
*/
public void setStackTrace(StackTraceElement[] stackTrace)
{
- for (int i = stackTrace.length; --i >= 0; )
- if (stackTrace[i] == null)
- throw new NullPointerException();
- this.stackTrace = stackTrace;
- }
+ int i = stackTrace.length;
+ StackTraceElement[] st = new StackTraceElement[i];
- private native final StackTraceElement[] getStackTrace0 ();
+ while (--i >= 0)
+ {
+ st[i] = stackTrace[i];
+ if (st[i] == null)
+ throw new NullPointerException("Element " + i + " null");
+ }
+
+ this.stackTrace = st;
+ }
- // Setting this flag to false prevents fillInStackTrace() from running.
- static boolean trace_enabled = true;
- private transient byte stackTraceBytes[];
+ /**
+ * VM state when fillInStackTrace was called.
+ * Used by getStackTrace() to get an array of StackTraceElements.
+ * Cleared when no longer needed.
+ */
+ private transient VMThrowable vmState;
}
diff --git a/libjava/java/lang/VMClassLoader.java b/libjava/java/lang/VMClassLoader.java
index 445272b1bba..11b75548e53 100644
--- a/libjava/java/lang/VMClassLoader.java
+++ b/libjava/java/lang/VMClassLoader.java
@@ -43,10 +43,10 @@ class VMClassLoader {
* @return the class that was defined.
* @exception ClassFormatError if the byte array is not in proper classfile format.
*/
- // Not yet needed for libgcj.
-// final static native Class defineClass(ClassLoader cl, String name,
-// byte[] data, int offset, int len) throws ClassFormatError;
-
+ final static native Class defineClass(ClassLoader cl, String name,
+ byte[] data, int offset, int len)
+ throws ClassFormatError;
+
/**
* Helper to resolve all references to other classes from this class.
* @param c the class to resolve.
diff --git a/libjava/java/lang/VMThrowable.java b/libjava/java/lang/VMThrowable.java
new file mode 100644
index 00000000000..0a2c9229649
--- /dev/null
+++ b/libjava/java/lang/VMThrowable.java
@@ -0,0 +1,97 @@
+/* java.lang.VMThrowable -- VM support methods for Throwable.
+ Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.lang;
+
+import gnu.gcj.runtime.NameFinder;
+
+/**
+ * VM dependant state and support methods Throwabele.
+ * It is deliberately package local and final and should only be accessed
+ * by the Throwable class.
+ * <p>
+ * This is the version used by libgcj (http://gcc.gnu.org/java/).
+ *
+ * @author Mark Wielaard (mark@klomp.org)
+ */
+final class VMThrowable
+{
+ private gnu.gcj.RawData stackTraceAddrs;
+ private int length;
+
+ /**
+ * Private contructor, create VMThrowables with fillInStackTrace();
+ */
+ private VMThrowable() { }
+
+ /**
+ * Fill in the stack trace with the current execution stack.
+ * Called by <code>Throwable.fillInStackTrace()</code> to get the state of
+ * the VM. Can return null when the VM does not support caputing the VM
+ * execution state.
+ *
+ * @return a new VMThrowable containing the current execution stack trace.
+ * @see Throwable#fillInStackTrace()
+ */
+ static native VMThrowable fillInStackTrace(Throwable t);
+
+ /**
+ * Returns an <code>StackTraceElement</code> array based on the execution
+ * state of the VM as captured by <code>fillInStackTrace</code>.
+ * Called by <code>Throwable.getStackTrace()</code>.
+ *
+ * @return a non-null but possible zero length array of StackTraceElement.
+ * @see Throwable#getStackTrace()
+ */
+ StackTraceElement[] getStackTrace(Throwable t)
+ {
+ StackTraceElement[] result;
+ if (stackTraceAddrs != null)
+ {
+ NameFinder nameFinder = new NameFinder();
+ result = nameFinder.lookup(t, stackTraceAddrs, length);
+ nameFinder.close();
+ }
+ else
+ result = new StackTraceElement[0];
+
+ return result;
+ }
+
+ // Setting this flag to false prevents fillInStackTrace() from running.
+ static boolean trace_enabled = true;
+}
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index 43b79adc9b6..fca074152ce 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -315,8 +315,8 @@ java::lang::Class::getSignature (JArray<jclass> *param_types,
}
java::lang::reflect::Method *
-java::lang::Class::getDeclaredMethod (jstring name,
- JArray<jclass> *param_types)
+java::lang::Class::_getDeclaredMethod (jstring name,
+ JArray<jclass> *param_types)
{
jstring partial_sig = getSignature (param_types, false);
jint p_len = partial_sig->length();
@@ -324,7 +324,6 @@ java::lang::Class::getDeclaredMethod (jstring name,
int i = isPrimitive () ? 0 : method_count;
while (--i >= 0)
{
- // FIXME: access checks.
if (_Jv_equalUtf8Consts (methods[i].name, utf_name)
&& _Jv_equaln (methods[i].signature, partial_sig, p_len))
{
@@ -336,7 +335,7 @@ java::lang::Class::getDeclaredMethod (jstring name,
return rmethod;
}
}
- throw new java::lang::NoSuchMethodException;
+ return NULL;
}
JArray<java::lang::reflect::Method *> *
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc
index 9c83d593ebb..8bff16997b9 100644
--- a/libjava/java/lang/natClassLoader.cc
+++ b/libjava/java/lang/natClassLoader.cc
@@ -171,6 +171,16 @@ java::lang::ClassLoader::markClassErrorState0 (java::lang::Class *klass)
}
jclass
+java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *cl,
+ jstring name,
+ jbyteArray data,
+ jint offset,
+ jint length)
+{
+ return cl->defineClass (name, data, offset, length);
+}
+
+jclass
java::lang::VMClassLoader::getPrimitiveClass (jchar type)
{
char sig[2];
@@ -194,7 +204,14 @@ gnu::gcj::runtime::VMClassLoader::findClass (jstring name)
// by `lib-gnu-pkg.so' and `lib-gnu.so'. If loading one of
// these causes the class to appear in the cache, then use it.
java::lang::StringBuffer *sb = new java::lang::StringBuffer (JvNewStringLatin1("lib-"));
- jstring so_base_name = (sb->append (name)->toString ())->replace ('.', '-');
+ // Skip inner classes
+ jstring cn;
+ jint ci = name->indexOf('$');
+ if (ci == -1)
+ cn = name;
+ else
+ cn = name->substring (0, ci);
+ jstring so_base_name = (sb->append (cn)->toString ())->replace ('.', '-');
// Compare against `3' because that is the length of "lib".
while (! klass && so_base_name && so_base_name->length() > 3)
@@ -260,7 +277,7 @@ _Jv_PrepareCompiledClass (jclass klass)
if (! found)
{
jstring str = _Jv_NewStringUTF (name->data);
- throw new java::lang::ClassNotFoundException (str);
+ throw new java::lang::NoClassDefFoundError (str);
}
pool->data[index].clazz = found;
@@ -269,6 +286,7 @@ _Jv_PrepareCompiledClass (jclass klass)
else if (pool->tags[index] == JV_CONSTANT_String)
{
jstring str;
+
str = _Jv_NewStringUtf8Const (pool->data[index].utf8);
pool->data[index].o = str;
pool->tags[index] |= JV_CONSTANT_ResolvedFlag;
diff --git a/libjava/java/lang/natObject.cc b/libjava/java/lang/natObject.cc
index 4cf26bf751c..4c2fd6cab03 100644
--- a/libjava/java/lang/natObject.cc
+++ b/libjava/java/lang/natObject.cc
@@ -305,9 +305,9 @@ _Jv_MonitorExit (jobject obj)
#include <assert.h>
#include <limits.h>
#include <unistd.h> // for usleep, sysconf.
-#include <sched.h> // for sched_yield.
#include <gcj/javaprims.h>
#include <sysdep/locks.h>
+#include <java/lang/Thread.h>
// Try to determine whether we are on a multiprocessor, i.e. whether
// spinning may be profitable.
@@ -525,14 +525,14 @@ spin(unsigned n)
}
else if (n < yield_limit)
{
- sched_yield();
+ _Jv_ThreadYield();
}
else
{
unsigned duration = MIN_SLEEP_USECS << (n - yield_limit);
if (n >= 15 + yield_limit || duration > MAX_SLEEP_USECS)
- duration = MAX_SLEEP_USECS;
- usleep(duration);
+ duration = MAX_SLEEP_USECS;
+ java::lang::Thread::sleep(0, duration);
}
}
@@ -574,7 +574,15 @@ static void
heavy_lock_obj_finalization_proc (void *obj, void *cd)
{
heavy_lock *hl = (heavy_lock *)cd;
+
+// This only addresses misalignment of statics, not heap objects. It
+// works only because registering statics for finalization is a noop,
+// no matter what the least significant bits are.
+#ifdef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+ obj_addr_t addr = (obj_addr_t)obj & ~((obj_addr_t)0x7);
+#else
obj_addr_t addr = (obj_addr_t)obj;
+#endif
hash_entry *he = light_locks + JV_SYNC_HASH(addr);
obj_addr_t he_address = (he -> address & ~LOCKED);
@@ -753,7 +761,11 @@ get_heavy(obj_addr_t addr, hash_entry *he)
void
_Jv_MonitorEnter (jobject obj)
{
+#ifdef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+ obj_addr_t addr = (obj_addr_t)obj & ~((obj_addr_t)FLAGS);
+#else
obj_addr_t addr = (obj_addr_t)obj;
+#endif
obj_addr_t address;
unsigned hash = JV_SYNC_HASH(addr);
hash_entry * he = light_locks + hash;
@@ -898,7 +910,11 @@ retry:
void
_Jv_MonitorExit (jobject obj)
{
+#ifdef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+ obj_addr_t addr = (obj_addr_t)obj & ~((obj_addr_t)FLAGS);
+#else
obj_addr_t addr = (obj_addr_t)obj;
+#endif
_Jv_ThreadId_t self = _Jv_ThreadSelf();
unsigned hash = JV_SYNC_HASH(addr);
hash_entry * he = light_locks + hash;
@@ -1078,7 +1094,11 @@ retry:
void
java::lang::Object::wait (jlong timeout, jint nanos)
{
+#ifdef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+ obj_addr_t addr = (obj_addr_t)this & ~((obj_addr_t)FLAGS);
+#else
obj_addr_t addr = (obj_addr_t)this;
+#endif
_Jv_ThreadId_t self = _Jv_ThreadSelf();
unsigned hash = JV_SYNC_HASH(addr);
hash_entry * he = light_locks + hash;
@@ -1155,7 +1175,11 @@ retry:
void
java::lang::Object::notify (void)
{
+#ifdef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+ obj_addr_t addr = (obj_addr_t)this & ~((obj_addr_t)FLAGS);
+#else
obj_addr_t addr = (obj_addr_t)this;
+#endif
_Jv_ThreadId_t self = _Jv_ThreadSelf();
unsigned hash = JV_SYNC_HASH(addr);
hash_entry * he = light_locks + hash;
@@ -1200,7 +1224,11 @@ retry:
void
java::lang::Object::notifyAll (void)
{
+#ifdef JV_LINKER_CANNOT_8BYTE_ALIGN_STATICS
+ obj_addr_t addr = (obj_addr_t)this & ~((obj_addr_t)FLAGS);
+#else
obj_addr_t addr = (obj_addr_t)this;
+#endif
_Jv_ThreadId_t self = _Jv_ThreadSelf();
unsigned hash = JV_SYNC_HASH(addr);
hash_entry * he = light_locks + hash;
diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc
index 18ec2321475..d0a64e7bb1d 100644
--- a/libjava/java/lang/natRuntime.cc
+++ b/libjava/java/lang/natRuntime.cc
@@ -533,6 +533,9 @@ java::lang::Runtime::insertSystemProperties (java::util::Properties *newprops)
sb->toString ());
}
+ // The name used to invoke this process (argv[0] in C).
+ SET ("gnu.gcj.progname", _Jv_ThisExecutable());
+
// Allow platform specific settings and overrides.
_Jv_platform_initProperties (newprops);
}
diff --git a/libjava/java/lang/natThrowable.cc b/libjava/java/lang/natThrowable.cc
deleted file mode 100644
index c2f7d1b8d8d..00000000000
--- a/libjava/java/lang/natThrowable.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// natThrowable.cc - Superclass for all exceptions.
-
-/* Copyright (C) 2000 Free Software Foundation, Inc
-
- This file is part of libgcj.
-
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
-
-/**
- * @author Andrew Haley <aph@cygnus.com>
- * @date Jan 6 2000
- */
-
-#include <config.h>
-
-#include <string.h>
-
-#include <gcj/cni.h>
-#include <jvm.h>
-#include <java/lang/Object.h>
-#include <java-threads.h>
-#include <java/lang/Throwable.h>
-#include <java/lang/StackTraceElement.h>
-#include <java/io/PrintStream.h>
-#include <java/io/PrintWriter.h>
-#include <java/io/IOException.h>
-
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <unistd.h>
-
-#ifdef HAVE_EXECINFO_H
-#include <execinfo.h>
-#endif
-
-#include <name-finder.h>
-
-/* FIXME: size of the stack trace is limited to 128 elements. It's
- undoubtedly sensible to limit the stack trace, but 128 is rather
- arbitrary. It may be better to configure this. */
-
-java::lang::Throwable *
-java::lang::Throwable::fillInStackTrace (void)
-{
- if (! trace_enabled)
- return this;
-#if defined (HAVE_BACKTRACE)
- void *p[128];
-
- // We subtract 1 from the number of elements because we don't want
- // to include the call to fillInStackTrace in the trace.
- int n = backtrace (p, 128) - 1;
-
- if (n > 0)
- {
- // We copy the array below to deal with alignment issues.
- stackTraceBytes = JvNewByteArray (n * sizeof p[0]);
- memcpy (elements (stackTraceBytes), p+1, (n * sizeof p[0]));
- }
-
-#endif
-
- return this;
-}
-
-JArray<java::lang::StackTraceElement*> *
-java::lang::Throwable::getStackTrace0 ()
-{
-#ifdef HAVE_BACKTRACE
- if (!stackTraceBytes)
- return NULL;
-
- int depth = stackTraceBytes->length / sizeof (void *);
- void *p[depth];
- // This memcpy is esential; it ensures that the array of void* is
- // correctly aligned.
- memcpy (p, elements (stackTraceBytes), sizeof p);
-
- JArray<java::lang::StackTraceElement*> *result;
- java::lang::StackTraceElement** el;
- result = reinterpret_cast <JArray<java::lang::StackTraceElement *>*>
- (JvNewObjectArray (depth, &java::lang::StackTraceElement::class$, NULL));
- el = elements (result);
-
- _Jv_name_finder finder (_Jv_ThisExecutable ());
-
- for (int i = 0; i < depth; i++)
- el[i] = finder.lookup (p[i]);
-
- return result;
-#else
- return NULL;
-#endif /* HAVE_BACKTRACE */
-}
diff --git a/libjava/java/lang/natVMThrowable.cc b/libjava/java/lang/natVMThrowable.cc
new file mode 100644
index 00000000000..ce897c23e0b
--- /dev/null
+++ b/libjava/java/lang/natVMThrowable.cc
@@ -0,0 +1,97 @@
+// natVMThrowable.cc - native helper methods for Throwable
+
+/* Copyright (C) 2000, 2002 Free Software Foundation, Inc
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+/**
+ * @author Andrew Haley <aph@cygnus.com>
+ * @author Mark Wielaard <mark@klomp.org>
+ *
+ * Native helper methods for VM specific Throwable support.
+ */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <jvm.h>
+#include <gcj/cni.h>
+#include <gnu/gcj/RawData.h>
+#include <java/lang/Object.h>
+#include <java-threads.h>
+#include <java/lang/Throwable.h>
+#include <java/lang/VMThrowable.h>
+#include <java/lang/Thread.h>
+#include <java-interp.h>
+
+#include <sys/types.h>
+
+#include <stdlib.h>
+
+#include <unistd.h>
+
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+/* FIXME: size of the stack trace is limited to 128 elements. It's
+ undoubtedly sensible to limit the stack trace, but 128 is rather
+ arbitrary. It may be better to configure this. */
+
+java::lang::VMThrowable *
+java::lang::VMThrowable::fillInStackTrace (java::lang::Throwable* t)
+{
+ if (! trace_enabled)
+ return NULL;
+#if defined (HAVE_BACKTRACE)
+ VMThrowable* state = new VMThrowable;
+ void *p[128];
+
+ // We subtract 1 from the number of elements because we don't want
+ // to include the calls to fillInStackTrace in the trace.
+ int n = backtrace (p, 128) - 1;
+
+ _Jv_frame_info *addrs;
+ if (n > 0)
+ {
+#ifdef INTERPRETER
+ extern void _Jv_StartOfInterpreter (void);
+ extern void _Jv_EndOfInterpreter (void);
+
+ java::lang::Thread *thread = java::lang::Thread::currentThread();
+ _Jv_MethodChain *interp_frame
+ = (thread ? reinterpret_cast<_Jv_MethodChain *> (thread->interp_frame)
+ : NULL);
+#endif // INTERPRETER
+
+ state->length = n;
+ int len = n;
+ addrs = (_Jv_frame_info *) _Jv_Malloc (n * sizeof (_Jv_frame_info));
+ for (n = 0; n < len; n++)
+ {
+ addrs[n].addr = p[n];
+#ifdef INTERPRETER
+ if (p[n] >= &_Jv_StartOfInterpreter && p[n] <= &_Jv_EndOfInterpreter)
+ {
+ addrs[n].interp = (void *) interp_frame->self;
+ interp_frame = interp_frame->next;
+ }
+ else
+ addrs[n].interp = 0;
+#endif // INTERPRETER
+ }
+ }
+ else
+ addrs = NULL;
+
+ state->stackTraceAddrs = reinterpret_cast<gnu::gcj::RawData *> (addrs);
+
+ return state;
+#endif
+ return NULL;
+}
diff --git a/libjava/java/lang/reflect/InvocationHandler.java b/libjava/java/lang/reflect/InvocationHandler.java
new file mode 100644
index 00000000000..91907e280c7
--- /dev/null
+++ b/libjava/java/lang/reflect/InvocationHandler.java
@@ -0,0 +1,136 @@
+/* java.lang.reflect.InvocationHandler - dynamically executes methods in
+ proxy instances
+ Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+/**
+ * This interface defines an invocation handler. Suppose you are using
+ * reflection, and found a method that requires that its parameter
+ * be an object of a given interface. You want to call this method,
+ * but have no idea what classes implement that interface. So, you can
+ * create a {@link Proxy} instance, a convenient way to dynamically
+ * generate a class that meets all the necessary properties of that
+ * interface. But in order for the proxy instance to do any good, it
+ * needs to know what to do when interface methods are invoked! So,
+ * this interface is basically a cool wrapper that provides runtime
+ * code generation needed by proxy instances.<p>
+ *
+ * While this interface was designed for use by Proxy, it will also
+ * work on any object in general.<p>
+ *
+ * Hints for implementing this class:<br>
+ * <ul>
+ * <li>Don't forget that Object.equals, Object.hashCode, and
+ * Object.toString will call this handler. In particular,
+ * a naive call to proxy.equals, proxy.hashCode, or proxy.toString
+ * will put you in an infinite loop. And remember that string
+ * concatenation also invokes toString.</li>
+ * <li>Obey the contract of the Method object you are handling, or
+ * the proxy instance will be forced to throw a
+ * {@link NullPointerException}, {@link ClassCastException},
+ * or {@link UndeclaredThrowableException}.</li>
+ * <li>Be prepared to wrap/unwrap primitives as necessary.</li>
+ * <li>The Method object may be owned by a different interface than
+ * what was actually used as the qualifying type of the method
+ * invocation in the Java source code. This means that it might
+ * not always be safe to throw an exception listed as belonging
+ * to the method's throws clause.</li>
+ * </ul>
+ *
+ * <p><small>For a fun time, create an InvocationHandler that handles the
+ * methods of a proxy instance of the InvocationHandler interface!</small>
+ *
+ * @see Proxy
+ * @see UndeclaredThrowableException
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ * @since 1.3
+ * @status updated to 1.4
+ */
+public interface InvocationHandler
+{
+ /**
+ * When a method is invoked on a proxy instance, it is wrapped and
+ * this method is called instead, so that you may decide at runtime
+ * how the original method should behave.
+ *
+ * @param proxy the instance that the wrapped method should be
+ * invoked on. When this method is called by a Proxy object,
+ * `proxy' will be an instance of {@link Proxy}, and oddly enough,
+ * <code>Proxy.getInvocationHandler(proxy)</code> will return
+ * <code>this</code>!
+ * @param method the reflected method to invoke on the proxy.
+ * When this method is called by a Proxy object, 'method'
+ * will be the reflection object owned by the declaring
+ * class or interface, which may be a supertype of the
+ * interfaces the proxy directly implements.
+ * @param args the arguments passed to the original method, or
+ * <code>null</code> if the method takes no arguments.
+ * (But also be prepared to handle a 0-length array).
+ * Arguments of primitive type, such as <code>boolean</code>
+ * or <code>int</code>, are wrapped in the appropriate
+ * class such as {@link Boolean} or {@link Integer}.
+ * @return whatever is necessary to return from the wrapped method.
+ * If the wrapped method is <code>void</code>, the proxy
+ * instance will ignore it. If the wrapped method returns
+ * a primitive, this must be the correct wrapper type whose value
+ * is exactly assignable to the appropriate type (no widening
+ * will be performed); a null object in this case causes a
+ * {@link NullPointerException}. In all remaining cases, if
+ * the returned object is not assignment compatible to the
+ * declared type of the original method, the proxy instance
+ * will generate a {@link ClassCastException}.
+ * @throws Throwable this interface is listed as throwing anything,
+ * but the implementation should only throw unchecked
+ * exceptions and exceptions listed in the throws clause of
+ * all methods being overridden by the proxy instance. If
+ * something is thrown that is not compatible with the throws
+ * clause of all overridden methods, the proxy instance will
+ * wrap the exception in an UndeclaredThrowableException.
+ * Note that an exception listed in the throws clause of the
+ * `method' parameter might not be declared in additional
+ * interfaces also implemented by the proxy object.
+ *
+ * @see Proxy
+ * @see UndeclaredThrowableException
+ */
+ Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable;
+
+}
diff --git a/libjava/java/lang/reflect/Proxy.java b/libjava/java/lang/reflect/Proxy.java
new file mode 100644
index 00000000000..972ac19c37a
--- /dev/null
+++ b/libjava/java/lang/reflect/Proxy.java
@@ -0,0 +1,1586 @@
+/* Proxy.java -- build a proxy class that implements reflected interfaces
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+import java.io.Serializable;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+import gnu.classpath.Configuration;
+import gnu.java.lang.reflect.TypeSignature;
+
+/**
+ * This class allows you to dynamically create an instance of any (or
+ * even multiple) interfaces by reflection, and decide at runtime
+ * how that instance will behave by giving it an appropriate
+ * {@link InvocationHandler}. Proxy classes serialize specially, so
+ * that the proxy object can be reused between VMs, without requiring
+ * a persistent copy of the generated class code.
+ *
+ * <h3>Creation</h3>
+ * To create a proxy for some interface Foo:
+ *
+ * <pre>
+ * InvocationHandler handler = new MyInvocationHandler(...);
+ * Class proxyClass = Proxy.getProxyClass(
+ * Foo.class.getClassLoader(), new Class[] { Foo.class });
+ * Foo f = (Foo) proxyClass
+ * .getConstructor(new Class[] { InvocationHandler.class })
+ * .newInstance(new Object[] { handler });
+ * </pre>
+ * or more simply:
+ * <pre>
+ * Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
+ * new Class[] { Foo.class },
+ * handler);
+ * </pre>
+ *
+ * <h3>Dynamic Proxy Classes</h3>
+ * A dynamic proxy class is created at runtime, and has the following
+ * properties:
+ * <ul>
+ * <li>The class is <code>public</code> and <code>final</code>,
+ * and is neither <code>abstract</code> nor an inner class.</li>
+ * <li>The class has no canonical name (there is no formula you can use
+ * to determine or generate its name), but begins with the
+ * sequence "$Proxy". Abuse this knowledge at your own peril.
+ * (For now, '$' in user identifiers is legal, but it may not
+ * be that way forever. You weren't using '$' in your
+ * identifiers, were you?)</li>
+ * <li>The class extends Proxy, and explicitly implements all the
+ * interfaces specified at creation, in order (this is important
+ * for determining how method invocation is resolved). Note that
+ * a proxy class implements {@link Serializable}, at least
+ * implicitly, since Proxy does, but true serial behavior
+ * depends on using a serializable invocation handler as well.</li>
+ * <li>If at least one interface is non-public, the proxy class
+ * will be in the same package. Otherwise, the package is
+ * unspecified. This will work even if the package is sealed
+ * from user-generated classes, because Proxy classes are
+ * generated by a trusted source. Meanwhile, the proxy class
+ * belongs to the classloader you designated.</li>
+ * <li>Reflection works as expected: {@link Class#getInterfaces()} and
+ * {@link Class#getMethods()} work as they do on normal classes.</li>
+ * <li>The method {@link #isProxyClass()} will distinguish between
+ * true proxy classes and user extensions of this class. It only
+ * returns true for classes created by {@link #getProxyClass}.</li>
+ * <li>The {@link ProtectionDomain} of a proxy class is the same as for
+ * bootstrap classes, such as Object or Proxy, since it is created by
+ * a trusted source. This protection domain will typically be granted
+ * {@link java.security.AllPermission}. But this is not a security
+ * risk, since there are adequate permissions on reflection, which is
+ * the only way to create an instance of the proxy class.</li>
+ * <li>The proxy class contains a single constructor, which takes as
+ * its only argument an {@link InvocationHandler}. The method
+ * {@link #newInstance} is shorthand to do the necessary
+ * reflection.</li>
+ * </ul>
+ *
+ * <h3>Proxy Instances</h3>
+ * A proxy instance is an instance of a proxy class. It has the
+ * following properties, many of which follow from the properties of a
+ * proxy class listed above:
+ * <ul>
+ * <li>For a proxy class with Foo listed as one of its interfaces, the
+ * expression <code>proxy instanceof Foo</code> will return true,
+ * and the expression <code>(Foo) proxy</code> will succeed without
+ * a {@link ClassCastException}.</li>
+ * <li>Each proxy instance has an invocation handler, which can be
+ * accessed by {@link #getInvocationHandler(Object)}. Any call
+ * to an interface method, including {@link Object#hashcode()},
+ * {@link Object#equals(Object)}, or {@link Object#toString()},
+ * but excluding the public final methods of Object, will be
+ * encoded and passed to the {@link InvocationHandler#invoke}
+ * method of this handler.</li>
+ * </ul>
+ *
+ * <h3>Inheritance Issues</h3>
+ * A proxy class may inherit a method from more than one interface.
+ * The order in which interfaces are listed matters, because it determines
+ * which reflected {@link Method} object will be passed to the invocation
+ * handler. This means that the dynamically generated class cannot
+ * determine through which interface a method is being invoked.<p>
+ *
+ * In short, if a method is declared in Object (namely, hashCode,
+ * equals, or toString), then Object will be used; otherwise, the
+ * leftmost interface that inherits or declares a method will be used,
+ * even if it has a more permissive throws clause than what the proxy
+ * class is allowed. Thus, in the invocation handler, it is not always
+ * safe to assume that every class listed in the throws clause of the
+ * passed Method object can safely be thrown; fortunately, the Proxy
+ * instance is robust enough to wrap all illegal checked exceptions in
+ * {@link UndeclaredThrowableException}.
+ *
+ * @see InvocationHandler
+ * @see UndeclaredThrowableException
+ * @see Class
+ * @author Eric Blake <ebb9@email.byu.edu>
+ * @since 1.3
+ * @status updated to 1.4, except for the use of ProtectionDomain
+ */
+public class Proxy implements Serializable
+{
+ /**
+ * Compatible with JDK 1.3+.
+ */
+ private static final long serialVersionUID = -2222568056686623797L;
+
+ /**
+ * Map of ProxyType to proxy class.
+ *
+ * @XXX This prevents proxy classes from being garbage collected.
+ * java.util.WeakHashSet is not appropriate, because that collects the
+ * keys, but we are interested in collecting the elements.
+ */
+ private static final Map proxyClasses = new HashMap();
+
+ /**
+ * The invocation handler for this proxy instance. For Proxy, this
+ * field is unused, but it appears here in order to be serialized in all
+ * proxy classes.
+ *
+ * <em>NOTE</em>: This implementation is more secure for proxy classes
+ * than what Sun specifies. Sun does not require h to be immutable, but
+ * this means you could change h after the fact by reflection. However,
+ * by making h immutable, we may break non-proxy classes which extend
+ * Proxy.
+ * @serial invocation handler associated with this proxy instance
+ */
+ protected final InvocationHandler h;
+
+ /**
+ * Constructs a new Proxy from a subclass (usually a proxy class),
+ * with the specified invocation handler.
+ *
+ * <em>NOTE</em>: This throws a NullPointerException if you attempt
+ * to create a proxy instance with a null handler using reflection.
+ * This behavior is not yet specified by Sun; see Sun Bug 4487672.
+ *
+ * @param handler the invocation handler, may be null if the subclass
+ * is not a proxy class
+ * @throws NullPointerException if handler is null and this is a proxy
+ * instance
+ */
+ protected Proxy(InvocationHandler handler)
+ {
+ if (handler == null && isProxyClass(getClass()))
+ throw new NullPointerException("invalid handler");
+ h = handler;
+ }
+
+ /**
+ * Returns the proxy {@link Class} for the given ClassLoader and array
+ * of interfaces, dynamically generating it if necessary.
+ *
+ * There are several restrictions on this method, the violation of
+ * which will result in an IllegalArgumentException or
+ * NullPointerException:
+ * <ul>
+ * <li>All objects in `interfaces' must represent distinct interfaces.
+ * Classes, primitive types, null, and duplicates are forbidden.</li>
+ * <li>The interfaces must be visible in the specified ClassLoader.
+ * In other words, for each interface i:
+ * <code>Class.forName(i.getName(), false, loader) == i</code>
+ * must be true.</li>
+ * <li>All non-public interfaces (if any) must reside in the same
+ * package, or the proxy class would be non-instantiable. If
+ * there are no non-public interfaces, the package of the proxy
+ * class is unspecified.</li>
+ * <li>All interfaces must be compatible - if two declare a method
+ * with the same name and parameters, the return type must be
+ * the same and the throws clause of the proxy class will be
+ * the maximal subset of subclasses of the throws clauses for
+ * each method that is overridden.</li>
+ * <li>VM constraints limit the number of interfaces a proxy class
+ * may directly implement (however, the indirect inheritance
+ * of {@link Serializable} does not count against this limit).
+ * Even though most VMs can theoretically have 65535
+ * superinterfaces for a class, the actual limit is smaller
+ * because a class's constant pool is limited to 65535 entries,
+ * and not all entries can be interfaces.</li>
+ * </ul><p>
+ *
+ * Note that different orders of interfaces produce distinct classes.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @param interfaces the array of interfaces the proxy class implements,
+ * may be empty, but not null
+ * @return the Class object of the proxy class
+ * @throws IllegalArgumentException if the constraints above were
+ * violated, except for problems with null
+ * @throws NullPointerException if `interfaces' is null or contains
+ * a null entry
+ */
+ // synchronized so that we aren't trying to build the same class
+ // simultaneously in two threads
+ public static synchronized Class getProxyClass(ClassLoader loader,
+ Class[] interfaces)
+ {
+ interfaces = (Class[]) interfaces.clone();
+ ProxyType pt = new ProxyType(loader, interfaces);
+ Class clazz = (Class) proxyClasses.get(pt);
+ if (clazz == null)
+ {
+ if (Configuration.HAVE_NATIVE_GET_PROXY_CLASS)
+ clazz = getProxyClass0(loader, interfaces);
+ else
+ {
+ ProxyData data = (Configuration.HAVE_NATIVE_GET_PROXY_DATA
+ ? getProxyData0(loader, interfaces)
+ : ProxyData.getProxyData(pt));
+
+ // FIXME workaround for bug in gcj 3.0.x
+ // Not needed with the latest gcj from cvs
+ //clazz = (Configuration.HAVE_NATIVE_GENERATE_PROXY_CLASS
+ // ? generateProxyClass0(loader, data)
+ // : new ClassFactory(data).generate(loader));
+ if (Configuration.HAVE_NATIVE_GENERATE_PROXY_CLASS)
+ clazz = generateProxyClass0(loader, data);
+ else
+ {
+ ClassFactory cf = new ClassFactory(data);
+ clazz = cf.generate(loader);
+ }
+ }
+
+ Object check = proxyClasses.put(pt, clazz);
+ // assert check == null && clazz != null;
+ if (check != null || clazz == null)
+ throw new InternalError(/*"Fatal flaw in getProxyClass"*/);
+ }
+ return clazz;
+ }
+
+ /**
+ * Combines several methods into one. This is equivalent to:
+ * <pre>
+ * Proxy.getProxyClass(loader, interfaces)
+ * .getConstructor(new Class[] {InvocationHandler.class})
+ * .newInstance(new Object[] {handler});
+ * </pre>
+ * except that it will not fail with the normal problems caused
+ * by reflection. It can still fail for the same reasons documented
+ * in getProxyClass, or if handler is null.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @param interfaces the array of interfaces the proxy class implements,
+ * may be empty, but not null
+ * @param handler the invocation handler, may not be null
+ * @return a proxy instance implementing the specified interfaces
+ * @throws IllegalArgumentException if the constraints for getProxyClass
+ * were violated, except for problems with null
+ * @throws NullPointerException if `interfaces' is null or contains
+ * a null entry, or if handler is null
+ * @see #getProxyClass(ClassLoader, Class[])
+ * @see Class#getConstructor(Class[])
+ * @see Constructor#newInstance(Object[])
+ */
+ public static Object newProxyInstance(ClassLoader loader,
+ Class[] interfaces,
+ InvocationHandler handler)
+ {
+ try
+ {
+ // getProxyClass() and Proxy() throw the necessary exceptions
+ return getProxyClass(loader, interfaces)
+ .getConstructor(new Class[] {InvocationHandler.class})
+ .newInstance(new Object[] {handler});
+ }
+ catch (RuntimeException e)
+ {
+ // Let IllegalArgumentException, NullPointerException escape.
+ // assert e instanceof IllegalArgumentException
+ // || e instanceof NullPointerException;
+ throw e;
+ }
+ catch (InvocationTargetException e)
+ {
+ // Let wrapped NullPointerException escape.
+ // assert e.getTargetException() instanceof NullPointerException
+ throw (NullPointerException) e.getCause();
+ }
+ catch (Exception e)
+ {
+ // Covers InstantiationException, IllegalAccessException,
+ // NoSuchMethodException, none of which should be generated
+ // if the proxy class was generated correctly.
+ // assert false;
+ throw (Error) new InternalError("Unexpected: " + e).initCause(e);
+ }
+ }
+
+ /**
+ * Returns true if and only if the Class object is a dynamically created
+ * proxy class (created by <code>getProxyClass</code> or by the
+ * syntactic sugar of <code>newProxyInstance</code>).
+ *
+ * <p>This check is secure (in other words, it is not simply
+ * <code>clazz.getSuperclass() == Proxy.class</code>), it will not
+ * be spoofed by non-proxy classes that extend Proxy.
+ *
+ * @param clazz the class to check, must not be null
+ * @return true if the class represents a proxy class
+ * @throws NullPointerException if clazz is null
+ */
+ // This is synchronized on the off chance that another thread is
+ // trying to add a class to the map at the same time we read it.
+ public static synchronized boolean isProxyClass(Class clazz)
+ {
+ if (! Proxy.class.isAssignableFrom(clazz))
+ return false;
+ // This is a linear search, even though we could do an O(1) search
+ // using new ProxyType(clazz.getClassLoader(), clazz.getInterfaces()).
+ return proxyClasses.containsValue(clazz);
+ }
+
+ /**
+ * Returns the invocation handler for the given proxy instance.<p>
+ *
+ * <em>NOTE</em>: We guarantee a non-null result if successful,
+ * but Sun allows the creation of a proxy instance with a null
+ * handler. See the comments for {@link #Proxy(InvocationHandler)}.
+ *
+ * @param proxy the proxy instance, must not be null
+ * @return the invocation handler, guaranteed non-null.
+ * @throws IllegalArgumentException if
+ * <code>Proxy.isProxyClass(proxy.getClass())</code> returns false.
+ * @throws NullPointerException if proxy is null
+ */
+ public static InvocationHandler getInvocationHandler(Object proxy)
+ {
+ if (! isProxyClass(proxy.getClass()))
+ throw new IllegalArgumentException("not a proxy instance");
+ return ((Proxy) proxy).h;
+ }
+
+ /**
+ * Optional native method to replace (and speed up) the pure Java
+ * implementation of getProxyClass. Only needed if
+ * Configuration.HAVE_NATIVE_GET_PROXY_CLASS is true, this does the
+ * work of both getProxyData0 and generateProxyClass0 with no
+ * intermediate form in Java. The native code may safely assume that
+ * this class must be created, and does not already exist.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @param interfaces the interfaces the class will extend
+ * @return the generated proxy class
+ * @throws IllegalArgumentException if the constraints for getProxyClass
+ * were violated, except for problems with null
+ * @throws NullPointerException if `interfaces' is null or contains
+ * a null entry, or if handler is null
+ * @see Configuration#HAVE_NATIVE_GET_PROXY_CLASS
+ * @see #getProxyClass(ClassLoader, Class[])
+ * @see #getProxyData0(ClassLoader, Class[])
+ * @see #generateProxyClass0(ProxyData)
+ */
+ private static native Class getProxyClass0(ClassLoader loader,
+ Class[] interfaces);
+
+ /**
+ * Optional native method to replace (and speed up) the pure Java
+ * implementation of getProxyData. Only needed if
+ * Configuration.HAVE_NATIVE_GET_PROXY_DATA is true. The native code
+ * may safely assume that a new ProxyData object must be created which
+ * does not duplicate any existing ones.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @param interfaces the interfaces the class will extend
+ * @return all data that is required to make this proxy class
+ * @throws IllegalArgumentException if the constraints for getProxyClass
+ * were violated, except for problems with null
+ * @throws NullPointerException if `interfaces' is null or contains
+ * a null entry, or if handler is null
+ * @see Configuration.HAVE_NATIVE_GET_PROXY_DATA
+ * @see #getProxyClass(ClassLoader, Class[])
+ * @see #getProxyClass0(ClassLoader, Class[])
+ * @see ProxyType#getProxyData()
+ */
+ private static native ProxyData getProxyData0(ClassLoader loader,
+ Class[] interfaces);
+
+ /**
+ * Optional native method to replace (and speed up) the pure Java
+ * implementation of generateProxyClass. Only needed if
+ * Configuration.HAVE_NATIVE_GENERATE_PROXY_CLASS is true. The native
+ * code may safely assume that a new Class must be created, and that
+ * the ProxyData object does not describe any existing class.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @param data the struct of information to convert to a Class. This
+ * has already been verified for all problems except exceeding
+ * VM limitations
+ * @return the newly generated class
+ * @throws IllegalArgumentException if VM limitations are exceeded
+ * @see #getProxyClass(ClassLoader, Class[])
+ * @see #getProxyClass0(ClassLoader, Class[])
+ * @see ProxyData#generateProxyClass(ClassLoader)
+ */
+ private static native Class generateProxyClass0(ClassLoader loader,
+ ProxyData data);
+
+
+ /**
+ * Helper class for mapping unique ClassLoader and interface combinations
+ * to proxy classes.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ */
+ private static final class ProxyType
+ {
+ /**
+ * Store the class loader (may be null)
+ */
+ final ClassLoader loader;
+
+ /**
+ * Store the interfaces (never null, all elements are interfaces)
+ */
+ final Class[] interfaces;
+
+ /**
+ * Construct the helper object.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @param interfaces an array of interfaces
+ */
+ ProxyType(ClassLoader loader, Class[] interfaces)
+ {
+ this.loader = loader;
+ this.interfaces = interfaces;
+ }
+
+ /**
+ * Calculates the hash code.
+ *
+ * @return a combination of the classloader and interfaces hashcodes.
+ */
+ public int hashCode()
+ {
+ int hash = (loader == null) ? 0 : loader.hashCode();
+ for (int i = 0; i < interfaces.length; i++)
+ hash = hash * 31 + interfaces[i].hashCode();
+ return hash;
+ }
+
+ /**
+ * Calculates equality.
+ *
+ * @param the object to compare to
+ * @return true if it is a ProxyType with same data
+ */
+ public boolean equals(Object other)
+ {
+ ProxyType pt = (ProxyType) other;
+ if (loader != pt.loader || interfaces.length != pt.interfaces.length)
+ return false;
+ int i = interfaces.length;
+ while (--i >= 0)
+ if (interfaces[i] != pt.interfaces[i])
+ return false;
+ return true;
+ }
+ } // class ProxyType
+
+
+ /**
+ * Helper class which allows hashing of a method name and signature
+ * without worrying about return type, declaring class, or throws clause,
+ * and which reduces the maximally common throws clause between two methods
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ */
+ private static final class ProxySignature
+ {
+ /**
+ * The core signatures which all Proxy instances handle.
+ */
+ static final HashMap coreMethods = new HashMap();
+ static
+ {
+ try
+ {
+ ProxySignature sig
+ = new ProxySignature(Object.class
+ .getMethod("equals",
+ new Class[] {Object.class}));
+ coreMethods.put(sig, sig);
+ sig = new ProxySignature(Object.class.getMethod("hashCode", null));
+ coreMethods.put(sig, sig);
+ sig = new ProxySignature(Object.class.getMethod("toString", null));
+ coreMethods.put(sig, sig);
+ }
+ catch (Exception e)
+ {
+ // assert false;
+ throw (Error) new InternalError("Unexpected: " + e).initCause(e);
+ }
+ }
+
+ /**
+ * The underlying Method object, never null
+ */
+ final Method method;
+
+ /**
+ * The set of compatible thrown exceptions, may be empty
+ */
+ final Set exceptions = new HashSet();
+
+ /**
+ * Construct a signature
+ *
+ * @param method the Method this signature is based on, never null
+ */
+ ProxySignature(Method method)
+ {
+ this.method = method;
+ Class[] exc = method.getExceptionTypes();
+ int i = exc.length;
+ while (--i >= 0)
+ {
+ // discard unchecked exceptions
+ if (Error.class.isAssignableFrom(exc[i])
+ || RuntimeException.class.isAssignableFrom(exc[i]))
+ continue;
+ exceptions.add(exc[i]);
+ }
+ }
+
+ /**
+ * Given a method, make sure it's return type is identical
+ * to this, and adjust this signature's throws clause appropriately
+ *
+ * @param other the signature to merge in
+ * @throws IllegalArgumentException if the return types conflict
+ */
+ void checkCompatibility(ProxySignature other)
+ {
+ if (method.getReturnType() != other.method.getReturnType())
+ throw new IllegalArgumentException("incompatible return types: "
+ + method + ", " + other.method);
+
+ // if you can think of a more efficient way than this O(n^2) search,
+ // implement it!
+ int size1 = exceptions.size();
+ int size2 = other.exceptions.size();
+ boolean[] valid1 = new boolean[size1];
+ boolean[] valid2 = new boolean[size2];
+ Iterator itr = exceptions.iterator();
+ int pos = size1;
+ while (--pos >= 0)
+ {
+ Class c1 = (Class) itr.next();
+ Iterator itr2 = other.exceptions.iterator();
+ int pos2 = size2;
+ while (--pos2 >= 0)
+ {
+ Class c2 = (Class) itr2.next();
+ if (c2.isAssignableFrom(c1))
+ valid1[pos] = true;
+ if (c1.isAssignableFrom(c2))
+ valid2[pos2] = true;
+ }
+ }
+ pos = size1;
+ itr = exceptions.iterator();
+ while (--pos >= 0)
+ {
+ itr.next();
+ if (! valid1[pos])
+ itr.remove();
+ }
+ pos = size2;
+ itr = other.exceptions.iterator();
+ while (--pos >= 0)
+ {
+ itr.next();
+ if (! valid2[pos])
+ itr.remove();
+ }
+ exceptions.addAll(other.exceptions);
+ }
+
+ /**
+ * Calculates the hash code.
+ *
+ * @return a combination of name and parameter types
+ */
+ public int hashCode()
+ {
+ int hash = method.getName().hashCode();
+ Class[] types = method.getParameterTypes();
+ for (int i = 0; i < types.length; i++)
+ hash = hash * 31 + types[i].hashCode();
+ return hash;
+ }
+
+ /**
+ * Calculates equality.
+ *
+ * @param the object to compare to
+ * @return true if it is a ProxySignature with same data
+ */
+ public boolean equals(Object other)
+ {
+ ProxySignature ps = (ProxySignature) other;
+ Class[] types1 = method.getParameterTypes();
+ Class[] types2 = ps.method.getParameterTypes();
+ if (! method.getName().equals(ps.method.getName())
+ || types1.length != types2.length)
+ return false;
+ int i = types1.length;
+ while (--i >= 0)
+ if (types1[i] != types2[i])
+ return false;
+ return true;
+ }
+ } // class ProxySignature
+
+
+ /**
+ * A flat representation of all data needed to generate bytecode/instantiate
+ * a proxy class. This is basically a struct.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ */
+ private static final class ProxyData
+ {
+ /**
+ * The package this class is in. Possibly null, meaning the unnamed
+ * package.
+ */
+ Package pack;
+
+ /**
+ * The interfaces this class implements. Non-null, but possibly empty.
+ */
+ Class[] interfaces;
+
+ /**
+ * The Method objects this class must pass as the second argument to
+ * invoke (also useful for determining what methods this class has).
+ * Non-null, non-empty (includes at least Object.hashCode, Object.equals,
+ * and Object.toString).
+ */
+ Method[] methods;
+
+ /**
+ * The exceptions that do not need to be wrapped in
+ * UndeclaredThrowableException. exceptions[i] is the same as, or a
+ * subset of subclasses, of methods[i].getExceptionTypes(), depending on
+ * compatible throws clauses with multiple inheritance. It is unspecified
+ * if these lists include or exclude subclasses of Error and
+ * RuntimeException, but excluding them is harmless and generates a
+ * smaller class.
+ */
+ Class[][] exceptions;
+
+ /**
+ * For unique id's
+ */
+ private static int count = 0;
+
+ /**
+ * The id of this proxy class
+ */
+ final int id = count++;
+
+ /**
+ * Construct a ProxyData with uninitialized data members.
+ */
+ ProxyData()
+ {
+ }
+
+ /**
+ * Verifies that the arguments are legal, and sets up remaining data
+ * This should only be called when a class must be generated, as
+ * it is expensive.
+ *
+ * @param pt the ProxyType to convert to ProxyData
+ * @return the flattened, verified ProxyData structure for use in
+ * class generation
+ * @throws IllegalArgumentException if `interfaces' contains
+ * non-interfaces or incompatible combinations, and verify is true
+ * @throws NullPointerException if interfaces is null or contains null
+ */
+ static ProxyData getProxyData(ProxyType pt)
+ {
+ Map method_set = (Map) ProxySignature.coreMethods.clone();
+ boolean in_package = false; // true if we encounter non-public interface
+
+ ProxyData data = new ProxyData();
+ data.interfaces = pt.interfaces;
+
+ // if interfaces is too large, we croak later on when the constant
+ // pool overflows
+ int i = data.interfaces.length;
+ while (--i >= 0)
+ {
+ Class inter = data.interfaces[i];
+ if (! inter.isInterface())
+ throw new IllegalArgumentException("not an interface: " + inter);
+ try
+ {
+ if (Class.forName(inter.getName(), false, pt.loader) != inter)
+ throw new IllegalArgumentException("not accessible in "
+ + "classloader: " + inter);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new IllegalArgumentException("not accessible in "
+ + "classloader: " + inter);
+ }
+ if (! Modifier.isPublic(inter.getModifiers()))
+ if (in_package)
+ {
+ Package p = inter.getPackage();
+ if (data.pack != inter.getPackage())
+ throw new IllegalArgumentException("non-public interfaces "
+ + "from different "
+ + "packages");
+ }
+ else
+ {
+ in_package = true;
+ data.pack = inter.getPackage();
+ }
+ for (int j = i-1; j >= 0; j--)
+ if (data.interfaces[j] == inter)
+ throw new IllegalArgumentException("duplicate interface: "
+ + inter);
+ Method[] methods = inter.getMethods();
+ int j = methods.length;
+ while (--j >= 0)
+ {
+ ProxySignature sig = new ProxySignature(methods[j]);
+ ProxySignature old = (ProxySignature) method_set.put(sig, sig);
+ if (old != null)
+ sig.checkCompatibility(old);
+ }
+ }
+
+ i = method_set.size();
+ data.methods = new Method[i];
+ data.exceptions = new Class[i][];
+ Iterator itr = method_set.values().iterator();
+ while (--i >= 0)
+ {
+ ProxySignature sig = (ProxySignature) itr.next();
+ data.methods[i] = sig.method;
+ data.exceptions[i] = (Class[]) sig.exceptions
+ .toArray(new Class[sig.exceptions.size()]);
+ }
+ return data;
+ }
+ } // class ProxyData
+
+
+ /**
+ * Does all the work of building a class. By making this a nested class,
+ * this code is not loaded in memory if the VM has a native
+ * implementation instead.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ */
+ private static final class ClassFactory
+ {
+ /** Constants for assisting the compilation */
+ private static final byte POOL = 0;
+ private static final byte FIELD = 1;
+ private static final byte METHOD = 2;
+ private static final byte INTERFACE = 3;
+ private static final String CTOR_SIG
+ = "(Ljava/lang/reflect/InvocationHandler;)V";
+ private static final String INVOKE_SIG = "(Ljava/lang/Object;"
+ + "Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;";
+
+ /** Bytecodes for insertion in the class definition byte[] */
+ private static final char ACONST_NULL = 1;
+ private static final char ICONST_0 = 3;
+ private static final char BIPUSH = 16;
+ private static final char SIPUSH = 17;
+ private static final char ILOAD = 21;
+ private static final char ILOAD_0 = 26;
+ private static final char ALOAD_0 = 42;
+ private static final char ALOAD_1 = 43;
+ private static final char AALOAD = 50;
+ private static final char AASTORE = 83;
+ private static final char DUP = 89;
+ private static final char DUP_X1 = 90;
+ private static final char SWAP = 95;
+ private static final char IRETURN = 172;
+ private static final char LRETURN = 173;
+ private static final char FRETURN = 174;
+ private static final char DRETURN = 175;
+ private static final char ARETURN = 176;
+ private static final char RETURN = 177;
+ private static final char GETSTATIC = 178;
+ private static final char GETFIELD = 180;
+ private static final char INVOKEVIRTUAL = 182;
+ private static final char INVOKESPECIAL = 183;
+ private static final char INVOKESTATIC = 184;
+ private static final char INVOKEINTERFACE = 185;
+ private static final char NEW = 187;
+ private static final char ANEWARRAY = 189;
+ private static final char ATHROW = 191;
+ private static final char CHECKCAST = 192;
+
+ // Implementation note: we use StringBuffers to hold the byte data, since
+ // they automatically grow. However, we only use the low 8 bits of
+ // every char in the array, so we are using twice the necessary memory
+ // for the ease StringBuffer provides.
+
+ /** The constant pool. */
+ private final StringBuffer pool = new StringBuffer();
+ /** The rest of the class data. */
+ private final StringBuffer stream = new StringBuffer();
+
+ /** Map of strings to byte sequences, to minimize size of pool. */
+ private final Map poolEntries = new HashMap();
+
+ /** The VM name of this proxy class. */
+ private final String qualName;
+
+ /**
+ * The Method objects the proxy class refers to when calling the
+ * invocation handler.
+ */
+ private final Method[] methods;
+
+ /**
+ * Initializes the buffers with the bytecode contents for a proxy class.
+ *
+ * @param data the remainder of the class data
+ * @throws IllegalArgumentException if anything else goes wrong this
+ * late in the game; as far as I can tell, this will only happen
+ * if the constant pool overflows, which is possible even when
+ * the user doesn't exceed the 65535 interface limit
+ */
+ ClassFactory(ProxyData data)
+ {
+ methods = data.methods;
+
+ // magic = 0xcafebabe
+ // minor_version = 0
+ // major_version = 46
+ // constant_pool_count: place-holder for now
+ pool.append("\u00ca\u00fe\u00ba\u00be\0\0\0\56\0\0");
+ // constant_pool[], filled in as we go
+
+ // access_flags
+ putU2(Modifier.SUPER | Modifier.FINAL | Modifier.PUBLIC);
+ // this_class
+ qualName = ((data.pack == null ? "" : data.pack.getName() + '.')
+ + "$Proxy" + data.id);
+ putU2(classInfo(TypeSignature.getEncodingOfClass(qualName, false)));
+ // super_class
+ putU2(classInfo("java/lang/reflect/Proxy"));
+
+ // interfaces_count
+ putU2(data.interfaces.length);
+ // interfaces[]
+ for (int i = 0; i < data.interfaces.length; i++)
+ putU2(classInfo(data.interfaces[i]));
+
+ // Recall that Proxy classes serialize specially, so we do not need
+ // to worry about a <clinit> method for this field. Instead, we
+ // just assign it by reflection after the class is successfully loaded.
+ // fields_count - private static Method[] m;
+ putU2(1);
+ // fields[]
+ // m.access_flags
+ putU2(Modifier.PRIVATE | Modifier.STATIC);
+ // m.name_index
+ putU2(utf8Info("m"));
+ // m.descriptor_index
+ putU2(utf8Info("[Ljava/lang/reflect/Method;"));
+ // m.attributes_count
+ putU2(0);
+ // m.attributes[]
+
+ // methods_count - # handler methods, plus <init>
+ putU2(methods.length + 1);
+ // methods[]
+ // <init>.access_flags
+ putU2(Modifier.PUBLIC);
+ // <init>.name_index
+ putU2(utf8Info("<init>"));
+ // <init>.descriptor_index
+ putU2(utf8Info(CTOR_SIG));
+ // <init>.attributes_count - only Code is needed
+ putU2(1);
+ // <init>.Code.attribute_name_index
+ putU2(utf8Info("Code"));
+ // <init>.Code.attribute_length = 18
+ // <init>.Code.info:
+ // $Proxynn(InvocationHandler h) { super(h); }
+ // <init>.Code.max_stack = 2
+ // <init>.Code.max_locals = 2
+ // <init>.Code.code_length = 6
+ // <init>.Code.code[]
+ stream.append("\0\0\0\22\0\2\0\2\0\0\0\6" + ALOAD_0 + ALOAD_1
+ + INVOKESPECIAL);
+ putU2(refInfo(METHOD, "java/lang/reflect/Proxy", "<init>", CTOR_SIG));
+ // <init>.Code.exception_table_length = 0
+ // <init>.Code.exception_table[]
+ // <init>.Code.attributes_count = 0
+ // <init>.Code.attributes[]
+ stream.append(RETURN + "\0\0\0\0");
+
+ for (int i = methods.length - 1; i >= 0; i--)
+ emitMethod(i, data.exceptions[i]);
+
+ // attributes_count
+ putU2(0);
+ // attributes[] - empty; omit SourceFile attribute
+ // XXX should we mark this with a Synthetic attribute?
+ }
+
+ /**
+ * Produce the bytecode for a single method.
+ *
+ * @param i the index of the method we are building
+ * @param e the exceptions possible for the method
+ */
+ private void emitMethod(int i, Class[] e)
+ {
+ // First, we precalculate the method length and other information.
+
+ Method m = methods[i];
+ Class[] paramtypes = m.getParameterTypes();
+ int wrap_overhead = 0; // max words taken by wrapped primitive
+ int param_count = 1; // 1 for this
+ int code_length = 16; // aload_0, getfield, aload_0, getstatic, const,
+ // aaload, const/aconst_null, invokeinterface
+ if (i > 5)
+ {
+ if (i > Byte.MAX_VALUE)
+ code_length += 2; // sipush
+ else
+ code_length++; // bipush
+ }
+ if (paramtypes.length > 0)
+ {
+ code_length += 3; // anewarray
+ if (paramtypes.length > Byte.MAX_VALUE)
+ code_length += 2; // sipush
+ else if (paramtypes.length > 5)
+ code_length++; // bipush
+ for (int j = 0; j < paramtypes.length; j++)
+ {
+ code_length += 4; // dup, const, load, store
+ Class type = paramtypes[j];
+ if (j > 5)
+ {
+ if (j > Byte.MAX_VALUE)
+ code_length += 2; // sipush
+ else
+ code_length++; // bipush
+ }
+ if (param_count >= 4)
+ code_length++; // 2-byte load
+ param_count++;
+ if (type.isPrimitive())
+ {
+ code_length += 7; // new, dup, invokespecial
+ if (type == long.class || type == double.class)
+ {
+ wrap_overhead = 3;
+ param_count++;
+ }
+ else if (wrap_overhead < 2)
+ wrap_overhead = 2;
+ }
+ }
+ }
+ int end_pc = code_length;
+ Class ret_type = m.getReturnType();
+ if (ret_type == void.class)
+ code_length++; // return
+ else if (ret_type.isPrimitive())
+ code_length += 7; // cast, invokevirtual, return
+ else
+ code_length += 4; // cast, return
+ int exception_count = 0;
+ boolean throws_throwable = false;
+ for (int j = 0; j < e.length; j++)
+ if (e[j] == Throwable.class)
+ {
+ throws_throwable = true;
+ break;
+ }
+ if (! throws_throwable)
+ {
+ exception_count = e.length + 3; // Throwable, Error, RuntimeException
+ code_length += 9; // new, dup_x1, swap, invokespecial, athrow
+ }
+ int handler_pc = code_length - 1;
+ StringBuffer signature = new StringBuffer("(");
+ for (int j = 0; j < paramtypes.length; j++)
+ signature.append(TypeSignature.getEncodingOfClass(paramtypes[j]));
+ signature.append(")").append(TypeSignature.getEncodingOfClass(ret_type));
+
+ // Now we have enough information to emit the method.
+
+ // handler.access_flags
+ putU2(Modifier.PUBLIC | Modifier.FINAL);
+ // handler.name_index
+ putU2(utf8Info(m.getName()));
+ // handler.descriptor_index
+ putU2(utf8Info(signature.toString()));
+ // handler.attributes_count - Code is necessary, Exceptions possible
+ putU2(e.length > 0 ? 2 : 1);
+
+ // handler.Code.info:
+ // type name(args) {
+ // try {
+ // return (type) h.invoke(this, methods[i], new Object[] {args});
+ // } catch (<declared Exceptions> e) {
+ // throw e;
+ // } catch (Throwable t) {
+ // throw new UndeclaredThrowableException(t);
+ // }
+ // }
+ // Special cases:
+ // if arg_n is primitive, wrap it
+ // if method throws Throwable, try-catch is not needed
+ // if method returns void, return statement not needed
+ // if method returns primitive, unwrap it
+ // save space by sharing code for all the declared handlers
+
+ // handler.Code.attribute_name_index
+ putU2(utf8Info("Code"));
+ // handler.Code.attribute_length
+ putU4(12 + code_length + 8 * exception_count);
+ // handler.Code.max_stack
+ putU2(param_count == 1 ? 4 : 7 + wrap_overhead);
+ // handler.Code.max_locals
+ putU2(param_count);
+ // handler.Code.code_length
+ putU4(code_length);
+ // handler.Code.code[]
+ putU1(ALOAD_0);
+ putU1(GETFIELD);
+ putU2(refInfo(FIELD, "java/lang/reflect/Proxy", "h",
+ "Ljava/lang/reflect/InvocationHandler;"));
+ putU1(ALOAD_0);
+ putU1(GETSTATIC);
+ putU2(refInfo(FIELD, TypeSignature.getEncodingOfClass(qualName, false),
+ "m", "[Ljava/lang/reflect/Method;"));
+ putConst(i);
+ putU1(AALOAD);
+ if (paramtypes.length > 0)
+ {
+ putConst(paramtypes.length);
+ putU1(ANEWARRAY);
+ putU2(classInfo("java/lang/Object"));
+ param_count = 1;
+ for (int j = 0; j < paramtypes.length; j++, param_count++)
+ {
+ putU1(DUP);
+ putConst(j);
+ if (paramtypes[j].isPrimitive())
+ {
+ putU1(NEW);
+ putU2(classInfo(wrapper(paramtypes[j])));
+ putU1(DUP);
+ }
+ putLoad(param_count, paramtypes[j]);
+ if (paramtypes[j].isPrimitive())
+ {
+ putU1(INVOKESPECIAL);
+ putU2(refInfo(METHOD, wrapper(paramtypes[j]), "<init>",
+ '(' + (TypeSignature
+ .getEncodingOfClass(paramtypes[j])
+ + ")V")));
+ if (paramtypes[j] == long.class
+ || paramtypes[j] == double.class)
+ param_count++;
+ }
+ putU1(AASTORE);
+ }
+ }
+ else
+ putU1(ACONST_NULL);
+ putU1(INVOKEINTERFACE);
+ putU2(refInfo(INTERFACE, "java/lang/reflect/InvocationHandler",
+ "invoke", INVOKE_SIG));
+ putU1(4); // InvocationHandler, this, Method, Object[]
+ putU1(0);
+ if (ret_type == void.class)
+ putU1(RETURN);
+ else if (ret_type.isPrimitive())
+ {
+ putU1(CHECKCAST);
+ putU2(classInfo(wrapper(ret_type)));
+ putU1(INVOKEVIRTUAL);
+ putU2(refInfo(METHOD, wrapper(ret_type),
+ ret_type.getName() + "Value",
+ "()" + TypeSignature.getEncodingOfClass(ret_type)));
+ if (ret_type == long.class)
+ putU1(LRETURN);
+ else if (ret_type == float.class)
+ putU1(FRETURN);
+ else if (ret_type == double.class)
+ putU1(DRETURN);
+ else
+ putU1(IRETURN);
+ }
+ else
+ {
+ putU1(CHECKCAST);
+ putU2(classInfo(ret_type));
+ putU1(ARETURN);
+ }
+ if (! throws_throwable)
+ {
+ putU1(NEW);
+ putU2(classInfo("java/lang/reflect/UndeclaredThrowableException"));
+ putU1(DUP_X1);
+ putU1(SWAP);
+ putU1(INVOKESPECIAL);
+ putU2(refInfo(METHOD,
+ "java/lang/reflect/UndeclaredThrowableException",
+ "<init>", "(Ljava/lang/Throwable;)V"));
+ putU1(ATHROW);
+ }
+
+ // handler.Code.exception_table_length
+ putU2(exception_count);
+ // handler.Code.exception_table[]
+ if (! throws_throwable)
+ {
+ // handler.Code.exception_table.start_pc
+ putU2(0);
+ // handler.Code.exception_table.end_pc
+ putU2(end_pc);
+ // handler.Code.exception_table.handler_pc
+ putU2(handler_pc);
+ // handler.Code.exception_table.catch_type
+ putU2(classInfo("java/lang/Error"));
+ // handler.Code.exception_table.start_pc
+ putU2(0);
+ // handler.Code.exception_table.end_pc
+ putU2(end_pc);
+ // handler.Code.exception_table.handler_pc
+ putU2(handler_pc);
+ // handler.Code.exception_table.catch_type
+ putU2(classInfo("java/lang/RuntimeException"));
+ for (int j = 0; j < e.length; j++)
+ {
+ // handler.Code.exception_table.start_pc
+ putU2(0);
+ // handler.Code.exception_table.end_pc
+ putU2(end_pc);
+ // handler.Code.exception_table.handler_pc
+ putU2(handler_pc);
+ // handler.Code.exception_table.catch_type
+ putU2(classInfo(e[j]));
+ }
+ // handler.Code.exception_table.start_pc
+ putU2(0);
+ // handler.Code.exception_table.end_pc
+ putU2(end_pc);
+ // handler.Code.exception_table.handler_pc -
+ // -8 for undeclared handler, which falls thru to normal one
+ putU2(handler_pc - 8);
+ // handler.Code.exception_table.catch_type
+ putU2(0);
+ }
+ // handler.Code.attributes_count
+ putU2(0);
+ // handler.Code.attributes[]
+
+ if (e.length > 0)
+ {
+ // handler.Exceptions.attribute_name_index
+ putU2(utf8Info("Exceptions"));
+ // handler.Exceptions.attribute_length
+ putU4(2 * e.length + 2);
+ // handler.Exceptions.number_of_exceptions
+ putU2(e.length);
+ // handler.Exceptions.exception_index_table[]
+ for (int j = 0; j < e.length; j++)
+ putU2(classInfo(e[j]));
+ }
+ }
+
+ /**
+ * Creates the Class object that corresponds to the bytecode buffers
+ * built when this object was constructed.
+ *
+ * @param loader the class loader to define the proxy class in; null
+ * implies the bootstrap class loader
+ * @return the proxy class Class object
+ */
+ final Class generate(ClassLoader loader)
+ {
+ byte[] bytecode = new byte[pool.length() + stream.length()];
+ // More efficient to bypass calling charAt() repetitively.
+ char[] c = pool.toString().toCharArray();
+ int i = c.length;
+ while (--i >= 0)
+ bytecode[i] = (byte) c[i];
+ c = stream.toString().toCharArray();
+ i = c.length;
+ int j = bytecode.length;
+ while (i > 0)
+ bytecode[--j] = (byte) c[--i];
+
+ // Patch the constant pool size, which we left at 0 earlier.
+ int count = poolEntries.size() + 1;
+ bytecode[8] = (byte) (count >> 8);
+ bytecode[9] = (byte) count;
+
+ try
+ {
+ // XXX Do we require more native support here?
+
+ // XXX Security hole - it is possible for another thread to grab the
+ // VMClassLoader.defineClass Method object, and abuse it while we
+ // have temporarily made it accessible. Do we need to add some
+ // synchronization lock to prevent user reflection while we use it?
+
+ // XXX This is waiting on VM support for protection domains.
+
+ Class vmClassLoader = Class.forName("java.lang.VMClassLoader");
+ Class[] types = {ClassLoader.class, String.class,
+ byte[].class, int.class, int.class,
+ /* ProtectionDomain.class */ };
+ Method m = vmClassLoader.getDeclaredMethod("defineClass", types);
+
+ // Bypass the security check of setAccessible(true), since this
+ // is trusted code. But note the comment above about the security
+ // risk of doing this outside a synchronized block.
+ m.flag = true;
+ Object[] args = {loader, qualName, bytecode, new Integer(0),
+ new Integer(bytecode.length),
+ /* Object.class.getProtectionDomain() */ };
+ Class clazz = (Class) m.invoke(null, args);
+ m.flag = false;
+
+ // Finally, initialize the m field of the proxy class, before
+ // returning it.
+
+ // No security risk here, since clazz has not been exposed yet,
+ // so user code cannot grab the same reflection object.
+ Field f = clazz.getDeclaredField("m");
+ f.flag = true;
+ // we can share the array, because it is not publicized
+ f.set(null, methods);
+ f.flag = false;
+
+ return clazz;
+ }
+ catch (Throwable e)
+ {
+ // assert false;
+ throw (Error) new InternalError("Unexpected: " + e).initCause(e);
+ }
+ }
+
+ /**
+ * Put a single byte on the stream.
+ *
+ * @param i the information to add (only lowest 8 bits are used)
+ */
+ private void putU1(int i)
+ {
+ stream.append((char) i);
+ }
+
+ /**
+ * Put two bytes on the stream.
+ *
+ * @param i the information to add (only lowest 16 bits are used)
+ */
+ private void putU2(int i)
+ {
+ stream.append((char) (i >> 8)).append((char) i);
+ }
+
+ /**
+ * Put four bytes on the stream.
+ *
+ * @param i the information to add (treated as unsigned)
+ */
+ private void putU4(int i)
+ {
+ stream.append((char) (i >> 24)).append((char) (i >> 16));
+ stream.append((char) (i >> 8)).append((char) i);
+ }
+
+ /**
+ * Put bytecode to load a constant integer on the stream. This only
+ * needs to work for values less than Short.MAX_VALUE.
+ *
+ * @param i the int to add
+ */
+ private void putConst(int i)
+ {
+ if (i >= -1 && i <= 5)
+ putU1(ICONST_0 + i);
+ else if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE)
+ {
+ putU1(BIPUSH);
+ putU1(i);
+ }
+ else
+ {
+ putU1(SIPUSH);
+ putU2(i);
+ }
+ }
+
+ /**
+ * Put bytecode to load a given local variable on the stream.
+ *
+ * @param i the slot to load
+ * @param type the base type of the load
+ */
+ private void putLoad(int i, Class type)
+ {
+ int offset = 0;
+ if (type == long.class)
+ offset = 1;
+ else if (type == float.class)
+ offset = 2;
+ else if (type == double.class)
+ offset = 3;
+ else if (! type.isPrimitive())
+ offset = 4;
+ if (i < 4)
+ putU1(ILOAD_0 + 4 * offset + i);
+ else
+ {
+ putU1(ILOAD + offset);
+ putU1(i);
+ }
+ }
+
+ /**
+ * Given a primitive type, return its wrapper class name.
+ *
+ * @param clazz the primitive type (but not void.class)
+ * @return the internal form of the wrapper class name
+ */
+ private String wrapper(Class clazz)
+ {
+ if (clazz == boolean.class)
+ return "java/lang/Boolean";
+ if (clazz == byte.class)
+ return "java/lang/Byte";
+ if (clazz == short.class)
+ return "java/lang/Short";
+ if (clazz == char.class)
+ return "java/lang/Character";
+ if (clazz == int.class)
+ return "java/lang/Integer";
+ if (clazz == long.class)
+ return "java/lang/Long";
+ if (clazz == float.class)
+ return "java/lang/Float";
+ if (clazz == double.class)
+ return "java/lang/Double";
+ // assert false;
+ return null;
+ }
+
+ /**
+ * Returns the entry of this String in the Constant pool, adding it
+ * if necessary.
+ *
+ * @param str the String to resolve
+ * @return the index of the String in the constant pool
+ */
+ private char utf8Info(String str)
+ {
+ String utf8 = toUtf8(str);
+ int len = utf8.length();
+ return poolIndex("\1" + (char) (len >> 8) + (char) (len & 0xff) + utf8);
+ }
+
+ /**
+ * Returns the entry of the appropriate class info structure in the
+ * Constant pool, adding it if necessary.
+ *
+ * @param name the class name, in internal form
+ * @return the index of the ClassInfo in the constant pool
+ */
+ private char classInfo(String name)
+ {
+ char index = utf8Info(name);
+ char[] c = {7, (char) (index >> 8), (char) (index & 0xff)};
+ return poolIndex(new String(c));
+ }
+
+ /**
+ * Returns the entry of the appropriate class info structure in the
+ * Constant pool, adding it if necessary.
+ *
+ * @param clazz the class type
+ * @return the index of the ClassInfo in the constant pool
+ */
+ private char classInfo(Class clazz)
+ {
+ return classInfo(TypeSignature.getEncodingOfClass(clazz.getName(),
+ false));
+ }
+
+ /**
+ * Returns the entry of the appropriate fieldref, methodref, or
+ * interfacemethodref info structure in the Constant pool, adding it
+ * if necessary.
+ *
+ * @param structure FIELD, METHOD, or INTERFACE
+ * @param clazz the class name, in internal form
+ * @param name the simple reference name
+ * @param type the type of the reference
+ * @return the index of the appropriate Info structure in the constant pool
+ */
+ private char refInfo(byte structure, String clazz, String name,
+ String type)
+ {
+ char cindex = classInfo(clazz);
+ char ntindex = nameAndTypeInfo(name, type);
+ // relies on FIELD == 1, METHOD == 2, INTERFACE == 3
+ char[] c = {(char) (structure + 8),
+ (char) (cindex >> 8), (char) (cindex & 0xff),
+ (char) (ntindex >> 8), (char) (ntindex & 0xff)};
+ return poolIndex(new String(c));
+ }
+
+ /**
+ * Returns the entry of the appropriate nameAndTyperef info structure
+ * in the Constant pool, adding it if necessary.
+ *
+ * @param name the simple name
+ * @param type the reference type
+ * @return the index of the NameAndTypeInfo structure in the constant pool
+ */
+ private char nameAndTypeInfo(String name, String type)
+ {
+ char nindex = utf8Info(name);
+ char tindex = utf8Info(type);
+ char[] c = {12, (char) (nindex >> 8), (char) (nindex & 0xff),
+ (char) (tindex >> 8), (char) (tindex & 0xff)};
+ return poolIndex(new String(c));
+ }
+
+ /**
+ * Converts a regular string to a UTF8 string, where the upper byte
+ * of every char is 0, and '\\u0000' is not in the string. This is
+ * basically to use a String as a fancy byte[], and while it is less
+ * efficient in memory use, it is easier for hashing.
+ *
+ * @param str the original, in straight unicode
+ * @return a modified string, in UTF8 format in the low bytes
+ */
+ private String toUtf8(String str)
+ {
+ final char[] ca = str.toCharArray();
+ final int len = ca.length;
+
+ // Avoid object creation, if str is already fits UTF8.
+ int i;
+ for (i = 0; i < len; i++)
+ if (ca[i] == 0 || ca[i] > '\u007f')
+ break;
+ if (i == len)
+ return str;
+
+ final StringBuffer sb = new StringBuffer(str);
+ sb.setLength(i);
+ for ( ; i < len; i++)
+ {
+ final char c = ca[i];
+ if (c > 0 && c <= '\u007f')
+ sb.append(c);
+ else if (c <= '\u07ff') // includes '\0'
+ {
+ sb.append((char) (0xc0 | (c >> 6)));
+ sb.append((char) (0x80 | (c & 0x6f)));
+ }
+ else
+ {
+ sb.append((char) (0xe0 | (c >> 12)));
+ sb.append((char) (0x80 | ((c >> 6) & 0x6f)));
+ sb.append((char) (0x80 | (c & 0x6f)));
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Returns the location of a byte sequence (conveniently wrapped in
+ * a String with all characters between \u0001 and \u00ff inclusive)
+ * in the constant pool, adding it if necessary.
+ *
+ * @param sequence the byte sequence to look for
+ * @return the index of the sequence
+ * @throws IllegalArgumentException if this would make the constant
+ * pool overflow
+ */
+ private char poolIndex(String sequence)
+ {
+ Integer i = (Integer) poolEntries.get(sequence);
+ if (i == null)
+ {
+ // pool starts at index 1
+ int size = poolEntries.size() + 1;
+ if (size >= 65535)
+ throw new IllegalArgumentException("exceeds VM limitations");
+ i = new Integer(size);
+ poolEntries.put(sequence, i);
+ pool.append(sequence);
+ }
+ return (char) i.intValue();
+ }
+ } // class ClassFactory
+}
diff --git a/libjava/java/lang/reflect/UndeclaredThrowableException.java b/libjava/java/lang/reflect/UndeclaredThrowableException.java
new file mode 100644
index 00000000000..d9596922beb
--- /dev/null
+++ b/libjava/java/lang/reflect/UndeclaredThrowableException.java
@@ -0,0 +1,128 @@
+/* UndeclaredThrowableException.java -- wraps an undeclared checked exception
+ thrown by a Proxy invocation handler
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+/**
+ * This exception class is thrown by a {@link Proxy} instance if
+ * the {@link InvocationHandler#invoke(Object, Method, Object[]) invoke}
+ * method of that instance's InvocationHandler attempts to throw an
+ * exception that not declared by the throws clauses of all of the
+ * interface methods that the proxy instance is implementing.
+ *
+ * <p>When thrown by Proxy, this class will always wrap a checked
+ * exception, never {@link Error} or {@link RuntimeException},
+ * which are unchecked.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ * @see Proxy
+ * @see InvocationHandler
+ * @since 1.3
+ * @status updated to 1.4
+ */
+public class UndeclaredThrowableException extends RuntimeException
+{
+ /**
+ * Compatible with JDK 1.3+.
+ */
+ private static final long serialVersionUID = 330127114055056639L;
+
+ /**
+ * The immutable exception that this wraps. This field is redundant
+ * with {@link Throwable#cause}, but is necessary for serial compatibility.
+ *
+ * @serial the chained exception
+ */
+ private final Throwable undeclaredThrowable;
+
+ /**
+ * Wraps the given checked exception into a RuntimeException, with no
+ * detail message. {@link Throwable#initCause(Throwable)} will fail
+ * on this instance.
+ *
+ * @param cause the undeclared throwable that caused this exception,
+ * may be null
+ */
+ public UndeclaredThrowableException(Throwable cause)
+ {
+ this(cause, null);
+ }
+
+ /**
+ * Wraps the given checked exception into a RuntimeException, with the
+ * specified detail message. {@link Throwable#initCause(Throwable)} will
+ * fail on this instance.
+ *
+ * @param cause the undeclared throwable that caused this exception,
+ * may be null
+ * @param message the message, may be null
+ */
+ public UndeclaredThrowableException(Throwable cause, String message)
+ {
+ super(message, cause);
+ undeclaredThrowable = cause;
+ }
+
+ /**
+ * Returns the cause of this exception. If this exception was created
+ * by a {@link Proxy} instance, it will be a non-null checked
+ * exception. This method pre-dates exception chaining, and is now
+ * simply a longer way to call <code>getCause()</code>.
+ *
+ * @return the cause of this exception, may be null
+ * @see #getCause()
+ */
+ public Throwable getUndeclaredThrowable()
+ {
+ return undeclaredThrowable;
+ }
+
+ /**
+ * Returns the cause of this exception. If this exception was created
+ * by a {@link Proxy} instance, it will be a non-null checked
+ * exception.
+ *
+ * @return the cause of this exception, may be null
+ * @since 1.4
+ */
+ public Throwable getCause()
+ {
+ return undeclaredThrowable;
+ }
+}
diff --git a/libjava/java/lang/reflect/natConstructor.cc b/libjava/java/lang/reflect/natConstructor.cc
index 1103d777bf7..7f90b1243e4 100644
--- a/libjava/java/lang/reflect/natConstructor.cc
+++ b/libjava/java/lang/reflect/natConstructor.cc
@@ -1,6 +1,6 @@
// natConstructor.cc - Native code for Constructor class.
-/* Copyright (C) 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation
This file is part of libgcj.
@@ -50,6 +50,8 @@ java::lang::reflect::Constructor::newInstance (jobjectArray args)
if (Modifier::isAbstract (declaringClass->getModifiers()))
throw new InstantiationException;
+ _Jv_InitClass (declaringClass);
+
jmethodID meth = _Jv_FromReflectedConstructor (this);
// In the constructor case the return type is the type of the
// constructor.
diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc
index 8e3b7b2140d..95801e87570 100644
--- a/libjava/java/lang/reflect/natMethod.cc
+++ b/libjava/java/lang/reflect/natMethod.cc
@@ -156,6 +156,13 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
// of the object.
meth = _Jv_LookupDeclaredMethod (k, meth->name, meth->signature);
}
+ else
+ {
+ // We have to initialize a static class. It is safe to do this
+ // here and not in _Jv_CallAnyMethodA because JNI initializes a
+ // class whenever a method lookup is done.
+ _Jv_InitClass (declaringClass);
+ }
return _Jv_CallAnyMethodA (obj, return_type, meth, false,
parameter_types, args);
@@ -405,8 +412,6 @@ _Jv_CallAnyMethodA (jobject obj,
p += tsize;
}
- // FIXME: initialize class here.
-
using namespace java::lang;
using namespace java::lang::reflect;
diff --git a/libjava/java/lang/reflect/natProxy.cc b/libjava/java/lang/reflect/natProxy.cc
new file mode 100644
index 00000000000..1a24858fa78
--- /dev/null
+++ b/libjava/java/lang/reflect/natProxy.cc
@@ -0,0 +1,38 @@
+// natProxy.cc - Native code for Proxy class.
+
+/* Copyright (C) 2002 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+#include <gcj/cni.h>
+#include <jvm.h>
+
+#include <java/lang/Class.h>
+#include <java/lang/ClassLoader.h>
+#include <java/lang/reflect/Proxy.h>
+#include <java/lang/reflect/Proxy$ProxyData.h>
+
+::java::lang::Class *
+java::lang::reflect::Proxy::getProxyClass0 (::java::lang::ClassLoader *, JArray< ::java::lang::Class *> *)
+{
+ return 0;
+}
+
+::java::lang::reflect::Proxy$ProxyData *
+java::lang::reflect::Proxy::getProxyData0 (::java::lang::ClassLoader *, JArray< ::java::lang::Class *> *)
+{
+ return 0;
+}
+
+::java::lang::Class *
+java::lang::reflect::Proxy::generateProxyClass0 (::java::lang::ClassLoader *,
+ ::java::lang::reflect::Proxy$ProxyData *)
+{
+ return 0;
+}
diff --git a/libjava/java/net/Authenticator.java b/libjava/java/net/Authenticator.java
index f6ad9dd27b0..e1e322b3bb1 100644
--- a/libjava/java/net/Authenticator.java
+++ b/libjava/java/net/Authenticator.java
@@ -150,7 +150,7 @@ setDefault(Authenticator def_auth)
* @param port The port requesting authentication
* @param protocol The protocol requesting authentication
* @param prompt The prompt to display to the user when requesting
- authentication info
+ * authentication info
* @param scheme The authentication scheme in use
*
* @return A <code>PasswordAuthentication</code> object with the user's
@@ -169,8 +169,33 @@ requestPasswordAuthentication(InetAddress addr, int port, String protocol,
}
/**
- * @since 1.4
- */
+ * This method is called whenever a username and password for a given
+ * network operation is required. First, a security check is made to see
+ * if the caller has the "requestPasswordAuthentication"
+ * permission. If not, the method thows an exception. If there is no
+ * default <code>Authenticator</code> object, the method then returns
+ * <code>null</code>. Otherwise, the default authenticators's instance
+ * variables are initialized and it's <code>getPasswordAuthentication</code>
+ * method is called to get the actual authentication information to return.
+ * This method is the preferred one as it can be used with hostname
+ * when addr is unknown.
+ *
+ * @param host The hostname requesting authentication
+ * @param addr The address requesting authentication
+ * @param port The port requesting authentication
+ * @param protocol The protocol requesting authentication
+ * @param prompt The prompt to display to the user when requesting
+ * authentication info
+ * @param scheme The authentication scheme in use
+ *
+ * @return A <code>PasswordAuthentication</code> object with the user's
+ * authentication info.
+ *
+ * @exception SecurityException If the caller does not have permission to
+ * perform this operation
+ *
+ * @since 1.4
+ */
public static PasswordAuthentication
requestPasswordAuthentication(String host, InetAddress addr, int port,
String protocol, String prompt, String scheme)
@@ -194,6 +219,9 @@ requestPasswordAuthentication(String host, InetAddress addr, int port,
}
/**
+ * Returns the hostname of the host or proxy requesting authorization,
+ * or null if not available.
+ *
* @since 1.4
*/
protected final String getRequestingHost()
diff --git a/libjava/java/net/BindException.java b/libjava/java/net/BindException.java
index 3d11c4a4b04..cfc36b312f6 100644
--- a/libjava/java/net/BindException.java
+++ b/libjava/java/net/BindException.java
@@ -43,6 +43,7 @@ package java.net;
*
* @author Aaron M. Renn <arenn@urbanophile.com>
* @author Warren Levy <warrenl@cygnus.com>
+ * @since 1.1
* @status updated to 1.4
*/
public class BindException extends SocketException
diff --git a/libjava/java/net/DatagramPacket.java b/libjava/java/net/DatagramPacket.java
index a2482f9237f..7ca6c51a22b 100644
--- a/libjava/java/net/DatagramPacket.java
+++ b/libjava/java/net/DatagramPacket.java
@@ -44,67 +44,66 @@ package java.net;
*/
/**
- * This class models a packet of data that is to be sent across the network
- * using a connectionless protocol such as UDP. It contains the data
- * to be send, as well as the destination address and port. Note that
- * datagram packets can arrive in any order and are not guaranteed to be
- * delivered at all.
- * <p>
- * This class can also be used for receiving data from the network.
- * <p>
- * Note that for all method below where the buffer length passed by the
- * caller cannot exceed the actually length of the byte array passed as
- * the buffer, if this condition is not true, then the method silently
- * reduces the length value to maximum allowable value.
- *
- * Written using on-line Java Platform 1.2 API Specification, as well
- * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
- * Status: Believed complete and correct.
- *
- * @author Warren Levy <warrenl@cygnus.com>
- * @author Aarom M. Renn (arenn@urbanophile.com) (Documentation comments)
- * @date April 28, 1999.
- */
-
+ * This class models a packet of data that is to be sent across the network
+ * using a connectionless protocol such as UDP. It contains the data
+ * to be send, as well as the destination address and port. Note that
+ * datagram packets can arrive in any order and are not guaranteed to be
+ * delivered at all.
+ * <p>
+ * This class can also be used for receiving data from the network.
+ * <p>
+ * Note that for all method below where the buffer length passed by the
+ * caller cannot exceed the actually length of the byte array passed as
+ * the buffer, if this condition is not true, then the method silently
+ * reduces the length value to maximum allowable value.
+ *
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ *
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @author Aarom M. Renn (arenn@urbanophile.com) (Documentation comments)
+ * @date April 28, 1999.
+ */
public final class DatagramPacket
{
-/**
- * The data buffer to send
- */
+ /**
+ * The data buffer to send
+ */
private byte[] buffer;
-/**
- * This is the offset into the buffer to start sending from or receiving to.
- */
+ /**
+ * This is the offset into the buffer to start sending from or receiving to.
+ */
private int offset;
-/**
- * The length of the data buffer to send
- */
+ /**
+ * The length of the data buffer to send
+ */
private int length;
-/**
- * The address to which the packet should be sent or from which it
- * was received
- */
+ /**
+ * The address to which the packet should be sent or from which it
+ * was received
+ */
private InetAddress address;
-/**
- * The port to which the packet should be sent or from which it was
- * was received.
- */
+ /**
+ * The port to which the packet should be sent or from which it was
+ * was received.
+ */
private int port;
-/**
- * This method initializes a new instance of <code>DatagramPacket</code>
- * which has the specified buffer, offset, and length.
- *
- * @param buf The buffer for holding the incoming datagram.
- * @param offset The offset into the buffer to start writing.
- * @param length The maximum number of bytes to read.
- *
- * @since Java 1.2
- */
+ /**
+ * This method initializes a new instance of <code>DatagramPacket</code>
+ * which has the specified buffer, offset, and length.
+ *
+ * @param buf The buffer for holding the incoming datagram.
+ * @param offset The offset into the buffer to start writing.
+ * @param length The maximum number of bytes to read.
+ *
+ * @since 1.2
+ */
public DatagramPacket(byte[] buf, int offset, int length)
{
if (buf == null)
@@ -124,30 +123,30 @@ public final class DatagramPacket
this.port = -1;
}
-/**
- * Initializes a new instance of <code>DatagramPacket</code> for
- * receiving packets from the network.
- *
- * @param buf A buffer for storing the returned packet data
- * @param length The length of the buffer (must be <= buf.length)
- */
+ /**
+ * Initializes a new instance of <code>DatagramPacket</code> for
+ * receiving packets from the network.
+ *
+ * @param buf A buffer for storing the returned packet data
+ * @param length The length of the buffer (must be <= buf.length)
+ */
public DatagramPacket(byte[] buf, int length)
{
this(buf, 0, length);
}
-/**
- * Initializes a new instance of <code>DatagramPacket</code> for
- * transmitting packets across the network.
- *
- * @param buf A buffer containing the data to send
- * @param offset The offset into the buffer to start writing from.
- * @param len The length of the buffer (must be <= buf.length)
- * @param addr The address to send to
- * @param port The port to send to
- *
- * @since Java 1.2
- */
+ /**
+ * Initializes a new instance of <code>DatagramPacket</code> for
+ * transmitting packets across the network.
+ *
+ * @param buf A buffer containing the data to send
+ * @param offset The offset into the buffer to start writing from.
+ * @param len The length of the buffer (must be <= buf.length)
+ * @param addr The address to send to
+ * @param port The port to send to
+ *
+ * @since 1.2
+ */
public DatagramPacket(byte[] buf, int offset, int length,
InetAddress address, int port)
{
@@ -172,86 +171,130 @@ public final class DatagramPacket
this.port = port;
}
-/**
- * Initializes a new instance of <code>DatagramPacket</code> for
- * transmitting packets across the network.
- *
- * @param buf A buffer containing the data to send
- * @param length The length of the buffer (must be <= buf.length)
- * @param address The address to send to
- * @param port The port to send to
- */
+ /**
+ * Initializes a new instance of <code>DatagramPacket</code> for
+ * transmitting packets across the network.
+ *
+ * @param buf A buffer containing the data to send
+ * @param length The length of the buffer (must be <= buf.length)
+ * @param address The address to send to
+ * @param port The port to send to
+ */
public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
{
this(buf, 0, length, address, port);
}
-/**
- * Returns the address that this packet is being sent to or, if it was used
- * to receive a packet, the address that is was received from. If the
- * constructor that doesn not take an address was used to create this object
- * and no packet was actually read into this object, then this method
- * returns <code>null</code>.
- *
- * @return The address for this packet.
- */
+ /**
+ * Initializes a new instance of <code>DatagramPacket</code> for
+ * transmitting packets across the network.
+ *
+ * @param buf A buffer containing the data to send
+ * @param offset The offset into the buffer to start writing from.
+ * @param length The length of the buffer (must be <= buf.length)
+ * @param address The socket address to send to
+ *
+ * @exception SocketException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ *
+ * @since 1.4
+ */
+ public DatagramPacket(byte[] buf, int offset, int length,
+ SocketAddress address)
+ throws SocketException
+ {
+ this(buf, offset, length, ((InetSocketAddress)address).getAddress(),
+ ((InetSocketAddress)address).getPort());
+ }
+
+ /**
+ * Initializes a new instance of <code>DatagramPacket</code> for
+ * transmitting packets across the network.
+ *
+ * @param buf A buffer containing the data to send
+ * @param length The length of the buffer (must be <= buf.length)
+ * @param address The socket address to send to
+ *
+ * @exception SocketException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ *
+ * @since 1.4
+ */
+ public DatagramPacket(byte[] buf, int length, SocketAddress address)
+ throws SocketException
+ {
+ this(buf, 0, length, ((InetSocketAddress)address).getAddress(),
+ ((InetSocketAddress)address).getPort());
+ }
+
+ /**
+ * Returns the address that this packet is being sent to or, if it was used
+ * to receive a packet, the address that is was received from. If the
+ * constructor that doesn not take an address was used to create this object
+ * and no packet was actually read into this object, then this method
+ * returns <code>null</code>.
+ *
+ * @return The address for this packet.
+ */
public synchronized InetAddress getAddress()
{
return address;
}
-/**
- * Returns the port number this packet is being sent to or, if it was used
- * to receive a packet, the port that it was received from. If the
- * constructor that doesn not take an address was used to create this object
- * and no packet was actually read into this object, then this method
- * will return 0.
- *
- * @return The port number for this packet
- */
+ /**
+ * Returns the port number this packet is being sent to or, if it was used
+ * to receive a packet, the port that it was received from. If the
+ * constructor that doesn not take an address was used to create this object
+ * and no packet was actually read into this object, then this method
+ * will return 0.
+ *
+ * @return The port number for this packet
+ */
public synchronized int getPort()
{
return port;
}
-/**
- * Returns the data buffer for this packet
- *
- * @return This packet's data buffer
- */
+ /**
+ * Returns the data buffer for this packet
+ *
+ * @return This packet's data buffer
+ */
public synchronized byte[] getData()
{
return buffer;
}
-/**
- * This method returns the current offset value into the data buffer
- * where data will be sent from.
- *
- * @return The buffer offset.
- *
- * @since Java 1.2
- */
+ /**
+ * This method returns the current offset value into the data buffer
+ * where data will be sent from.
+ *
+ * @return The buffer offset.
+ *
+ * @since 1.2
+ */
public synchronized int getOffset()
{
return offset;
}
-/**
- * Returns the length of the data in the buffer
- *
- * @return The length of the data
- */
+ /**
+ * Returns the length of the data in the buffer
+ *
+ * @return The length of the data
+ */
public synchronized int getLength()
{
return length;
}
-/**
- * This sets the address to which the data packet will be transmitted.
- *
- * @param addr The destination address
- */
+ /**
+ * This sets the address to which the data packet will be transmitted.
+ *
+ * @param addr The destination address
+ *
+ * @since 1.1
+ */
public synchronized void setAddress(InetAddress iaddr)
{
if (iaddr == null)
@@ -260,11 +303,13 @@ public final class DatagramPacket
address = iaddr;
}
-/**
- * This sets the port to which the data packet will be transmitted.
- *
- * @param port The destination port
- */
+ /**
+ * This sets the port to which the data packet will be transmitted.
+ *
+ * @param port The destination port
+ *
+ * @since 1.1
+ */
public synchronized void setPort(int iport)
{
if (iport < 0 || iport > 65535)
@@ -273,11 +318,47 @@ public final class DatagramPacket
port = iport;
}
-/**
- * Sets the data buffer for this packet.
- *
- * @param buf The new buffer for this packet
- */
+ /**
+ * Sets the address of the remote host this package will be sent
+ *
+ * @param address The socket address of the remove host
+ *
+ * @exception IllegalArgumentException If address type is not supported
+ *
+ * @since 1.4
+ */
+ public void setSocketAddress(SocketAddress address)
+ throws IllegalArgumentException
+ {
+ if (address == null) throw new IllegalArgumentException();
+
+ InetSocketAddress tmp = (InetSocketAddress)address;
+ this.address = tmp.getAddress();
+ this.port = tmp.getPort();
+ }
+
+ /**
+ * Gets the socket address of the host this packet
+ * will be sent to/is coming from
+ *
+ * @return The socket address of the remote host
+ *
+ * @since 1.4
+ */
+ public SocketAddress getSocketAddress()
+ {
+ return new InetSocketAddress (address, port);
+ }
+
+ /**
+ * Sets the data buffer for this packet.
+ *
+ * @param buf The new buffer for this packet
+ *
+ * @exception NullPointerException If the argument is null
+ *
+ * @since 1.1
+ */
public synchronized void setData(byte[] buf)
{
// This form of setData requires setLength to be called separately
@@ -288,15 +369,17 @@ public final class DatagramPacket
buffer = buf;
}
-/**
- * This method sets the data buffer for the packet.
- *
- * @param buf The byte array containing the data for this packet.
- * @param offset The offset into the buffer to start reading data from.
- * @param length The number of bytes of data in the buffer.
- *
- * @since Java 1.2
- */
+ /**
+ * This method sets the data buffer for the packet.
+ *
+ * @param buf The byte array containing the data for this packet.
+ * @param offset The offset into the buffer to start reading data from.
+ * @param length The number of bytes of data in the buffer.
+ *
+ * @exception NullPointerException If the argument is null
+ *
+ * @since 1.2
+ */
public synchronized void setData(byte[] buf, int offset, int length)
{
// This form of setData must be used if offset is to be changed.
@@ -316,11 +399,16 @@ public final class DatagramPacket
this.length = length;
}
-/**
- * Sets the length of the data in the buffer.
- *
- * @param length The new length. (Where len <= buf.length)
- */
+ /**
+ * Sets the length of the data in the buffer.
+ *
+ * @param length The new length. (Where len &lt;= buf.length)
+ *
+ * @exception IllegalArgumentException If the length is negative or
+ * if the length is greater than the packet's data buffer length
+ *
+ * @since 1.1
+ */
public synchronized void setLength(int length)
{
if (length < 0)
diff --git a/libjava/java/net/DatagramSocket.java b/libjava/java/net/DatagramSocket.java
index 064e8e78983..b2f2ca11ce3 100644
--- a/libjava/java/net/DatagramSocket.java
+++ b/libjava/java/net/DatagramSocket.java
@@ -1,6 +1,6 @@
// DatagramSocket.java
-/* Copyright (C) 1999, 2000 Free Software Foundation
+/* Copyright (C) 1999, 2000, 2002 Free Software Foundation
This file is part of libgcj.
@@ -9,7 +9,10 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.net;
+
import java.io.IOException;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.IllegalBlockingModeException;
/**
* @author Warren Levy <warrenl@cygnus.com>
@@ -24,18 +27,87 @@ import java.io.IOException;
public class DatagramSocket
{
+ /**
+ * This is the user DatagramSocketImplFactory for this class. If this
+ * variable is null, a default factory is used.
+ */
+ static DatagramSocketImplFactory factory;
+
DatagramSocketImpl impl;
+ DatagramChannel ch;
+
+ private InetAddress remoteAddress;
+ private int remotePort;
+
+ /**
+ * Creates a DatagramSocket
+ *
+ * @exception SocketException If an error occurs
+ * @exception SecurityException If a security manager exists and
+ * its checkListen method doesn't allow the operation
+ */
public DatagramSocket() throws SocketException
{
this(0, null);
}
+ /**
+ * Creates a DatagramSocket from a specified DatagramSocketImpl instance
+ *
+ * @param impl The DatagramSocketImpl the socket will be created from
+ *
+ * @since 1.4
+ */
+ protected DatagramSocket (DatagramSocketImpl impl)
+ {
+ this.impl = impl;
+ this.remoteAddress = null;
+ this.remotePort = -1;
+ }
+
+ /**
+ * Creates a datagram socket that is bound to a given socket address
+ *
+ * @param bindaddr The socket address to bind to
+ *
+ * @exception SocketException If an error occurs
+ * @exception SecurityException If a security manager exists and
+ * its checkListen method doesn't allow the operation
+ *
+ * @since 1.4
+ */
+ public DatagramSocket (SocketAddress bindaddr)
+ throws SocketException
+ {
+ this (((InetSocketAddress) bindaddr).getPort (),
+ ((InetSocketAddress) bindaddr).getAddress ());
+ }
+
+ /**
+ * Creates a datagram socket that is bound to a specific port
+ *
+ * @param port The port number to bind to
+ *
+ * @exception SocketException If an error occurs
+ * @exception SecurityException If a security manager exists and
+ * its checkListen method doesn't allow the operation
+ */
public DatagramSocket(int port) throws SocketException
{
this(port, null);
}
+ /**
+ * Creates a datagram socket that is bound to a specific port/inet address
+ *
+ * @param port The port number to bind to
+ * @param laddr The local address to bind to
+ *
+ * @exception SocketException If an error occurs
+ * @exception SecurityException If a security manager exists and
+ * its checkListen method doesn't allow the operation
+ */
public DatagramSocket(int port, InetAddress laddr) throws SocketException
{
if (port < 0 || port > 65535)
@@ -67,16 +139,75 @@ public class DatagramSocket
impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true));
impl.bind(port, laddr == null ? InetAddress.ANY_IF : laddr);
+
+ remoteAddress = null;
+ remotePort = -1;
}
+ /**
+ * Binds the socket to the given socket addres
+ *
+ * @param address The socket address to bind to
+ *
+ * @exception SocketException If an error occurs
+ * @exception SecurityException If a security manager exists and
+ * its checkListen method doesn't allow the operation
+ * @exception IllegalArgumentException If address type is not supported
+ *
+ * @since 1.4
+ */
+ public void bind (SocketAddress address)
+ throws SocketException
+ {
+ if (! (address instanceof InetSocketAddress))
+ throw new IllegalArgumentException ();
+
+ InetSocketAddress tmp = (InetSocketAddress) address;
+
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkListen(tmp.getPort ());
+
+ impl.bind (tmp.getPort (), tmp.getAddress ());
+ }
+
+ /**
+ * Closes the datagram socket
+ */
public void close()
{
impl.close();
+ remoteAddress = null;
+ remotePort = -1;
}
+ /**
+ * Checks if the datagram socket is closed
+ *
+ * @since 1.4
+ */
+ public boolean isClosed()
+ {
+ return !impl.getFileDescriptor().valid();
+ }
+
+ /**
+ * Gets a datagram channel assoziated with the socket
+ *
+ * @since 1.4
+ */
+ public DatagramChannel getChannel()
+ {
+ return ch;
+ }
+
+ /**
+ * Returns the local address of the datagram socket
+ *
+ * @since 1.1
+ */
public InetAddress getLocalAddress()
{
- SecurityManager s = System.getSecurityManager();
// FIXME: JCL p. 510 says this should call checkConnect. But what
// string should be used as the hostname? Maybe this is just a side
// effect of calling InetAddress.getLocalHost.
@@ -112,13 +243,33 @@ public class DatagramSocket
}
}
+ /**
+ * Returns the local port this socket uses
+ *
+ * @return The local port number
+ */
public int getLocalPort()
{
+ if (!isBound ())
+ return -1;
+
return impl.getLocalPort();
}
+ /**
+ * Gets the SO_TIMEOUT value
+ *
+ * @return The current timeout in milliseconds
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.1
+ */
public synchronized int getSoTimeout() throws SocketException
{
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);
if (timeout instanceof Integer)
return ((Integer)timeout).intValue();
@@ -126,32 +277,94 @@ public class DatagramSocket
return 0;
}
+ /**
+ * Receive a datagram packet
+ *
+ * @param p The datagram packet to put the incoming data into
+ *
+ * @exception IOException If an error occurs
+ * @exception SocketTimeoutException If setSoTimeout was previously called
+ * and the timeout has expired
+ * @exception PortUnreachableException If the socket is connected to a
+ * currently unreachable destination. Note, there is no guarantee that the
+ * exception will be thrown
+ * @exception IllegalBlockingModeException If this socket has an associated
+ * channel, and the channel is in non-blocking mode
+ * @exception SecurityException If a security manager exists and its
+ * checkAccept ethod doesn't allow the receive
+ */
public synchronized void receive(DatagramPacket p) throws IOException
{
- SecurityManager s = System.getSecurityManager();
- if (s != null)
- s.checkAccept(p.getAddress().getHostAddress(), p.getPort());
+ if (impl == null)
+ throw new IOException ("Cannot initialize Socket implementation");
+
+ if (remoteAddress != null && remoteAddress.isMulticastAddress ())
+ throw new IOException (
+ "Socket connected to a multicast address my not receive");
+
+ if (ch != null && !ch.isBlocking ())
+ throw new IllegalBlockingModeException ();
impl.receive(p);
+
+ SecurityManager s = System.getSecurityManager();
+ if (s != null && isConnected ())
+ s.checkAccept (p.getAddress().getHostName (), p.getPort ());
}
+ /**
+ * Sends a datagram packet
+ *
+ * @param p The datagram packet to send
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkMulticast or checkConnect method doesn't allow the send
+ * @exception PortUnreachableException If the socket is connected to a
+ * currently unreachable destination. Note, there is no guarantee that the
+ * exception will be thrown
+ * @exception IllegalBlockingModeException If this socket has an associated
+ * channel, and the channel is in non-blocking mode
+ */
public void send(DatagramPacket p) throws IOException
{
// JDK1.2: Don't do security checks if socket is connected; see jdk1.2 api.
SecurityManager s = System.getSecurityManager();
- if (s != null)
+ if (s != null && !isConnected ())
+ {
+ InetAddress addr = p.getAddress();
+ if (addr.isMulticastAddress())
+ s.checkMulticast(addr);
+ else
+ s.checkConnect(addr.getHostAddress(), p.getPort());
+ }
+
+ if (isConnected ())
{
- InetAddress addr = p.getAddress();
- if (addr.isMulticastAddress())
- s.checkMulticast(addr);
- else
- s.checkConnect(addr.getHostAddress(), p.getPort());
+ if (p.getAddress () != null && (remoteAddress != p.getAddress () ||
+ remotePort != p.getPort ()))
+ throw new IllegalArgumentException (
+ "DatagramPacket address does not match remote address" );
}
+
+ // FIXME: if this is a subclass of MulticastSocket,
+ // use getTimeToLive for TTL val.
+
+ if (ch != null && !ch.isBlocking ())
+ throw new IllegalBlockingModeException ();
- // FIXME: if this is a subclass of MulticastSocket, use getTTL for TTL val.
impl.send(p);
}
+ /**
+ * Sets a new value for SO_TIMEOUT
+ *
+ * @param timeout The timeout in milliseconds
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.1
+ */
public synchronized void setSoTimeout(int timeout) throws SocketException
{
if (timeout < 0)
@@ -160,25 +373,160 @@ public class DatagramSocket
impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
}
- // JDK1.2
- // public void connect(InetAddress address, int port)
- // {
- // }
+ /**
+ * Connects the datagrem socket to a specified address/port
+ *
+ * @param address The address to connect to
+ * @param port The port to connect to
+ *
+ * @exception SocketException If an error occurs
+ * @exception IllegalArgumentException If address is null
+ * or the port number is illegal
+ * @exception SecurityException If the caller is not allowed to send
+ * datagrams to and receive datagrams from the address and port
+ *
+ * @since 1.2
+ */
+ public void connect(InetAddress address, int port)
+ throws SocketException
+ {
+ if (address == null)
+ throw new IllegalArgumentException ("Address may not be null");
+
+ if (port < 1 || port > 65535)
+ throw new IllegalArgumentException ("Port number is illegal");
+
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkAccept(address.getHostName (), port);
+
+ impl.connect (address, port);
+
+ remoteAddress = address;
+ remotePort = port;
+ }
+
+ /**
+ * Connects the datagram socket to a specified socket address.
+ *
+ * @param address The socket address to connect to
+ *
+ * @exception SocketException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ *
+ * @since 1.4
+ */
+ public void connect (SocketAddress address) throws SocketException
+ {
+ if ( !(address instanceof InetSocketAddress) )
+ throw new IllegalArgumentException (
+ "SocketAddress is not InetSocketAddress");
+
+ InetSocketAddress tmp = (InetSocketAddress) address;
+ connect( tmp.getAddress(), tmp.getPort());
+ }
+
+ /**
+ * Disconnects the datagram socket
+ *
+ * @since 1.2
+ */
+ public void disconnect()
+ {
+ impl.disconnect();
+ }
+
+ /**
+ * Returns the binding state of the socket
+ *
+ * @since 1.4
+ */
+ public boolean isBound()
+ {
+ try
+ {
+ Object bindaddr = impl.getOption (SocketOptions.SO_BINDADDR);
+ }
+ catch (SocketException e)
+ {
+ return false;
+ }
- // JDK1.2
- // public void disconnect()
- // {
- // }
+ return true;
+ }
- // JDK1.2
- // public InetAddress getInetAddress()
- // {
- // }
+ /**
+ * Returns the connection state of the socket
+ *
+ * @since 1.4
+ */
+ public boolean isConnected()
+ {
+ return remoteAddress != null;
+ }
+
+ /**
+ * Returns the InetAddress the socket is connected to
+ * or null if the socket is not connected
+ *
+ * @since 1.2
+ */
+ public InetAddress getInetAddress()
+ {
+ if (!isConnected ())
+ return null;
- // JDK1.2
- // public int getPort()
- // {
- // }
+ return remoteAddress;
+ }
+
+ /**
+ * Returns the port number the socket is connected to or -1 if not connected
+ *
+ * @since 1.2
+ */
+ public int getPort()
+ {
+ if (!isConnected ())
+ return -1;
+
+ return remotePort;
+ }
+
+ /**
+ * Returns the SocketAddress of the host this socket is conneted to
+ * or null if this socket is not connected
+ *
+ * @since 1.4
+ */
+ public SocketAddress getRemoteSocketAddress()
+ {
+ if (!isConnected ())
+ return null;
+
+ return new InetSocketAddress (remoteAddress, remotePort);
+ }
+
+ /**
+ * Returns the local SocketAddress this socket is bound to
+ * or null if it is not bound
+ *
+ * @since 1.4
+ */
+ public SocketAddress getLocalSocketAddress()
+ {
+ InetAddress addr;
+
+ try
+ {
+ addr = (InetAddress) impl.getOption (SocketOptions.SO_BINDADDR);
+ }
+ catch (SocketException e)
+ {
+ return null;
+ }
+
+ return new InetSocketAddress (addr, impl.localPort);
+ }
/**
* This method returns the value of the system level socket option
@@ -193,6 +541,9 @@ public class DatagramSocket
*/
public int getReceiveBufferSize() throws SocketException
{
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
Object obj = impl.getOption(SocketOptions.SO_RCVBUF);
if (obj instanceof Integer)
@@ -202,6 +553,126 @@ public class DatagramSocket
}
/**
+ * Enables/Disables SO_REUSEADDR
+ *
+ * @param on Whether or not to have SO_REUSEADDR turned on
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void setReuseAddress(boolean on) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ impl.setOption (SocketOptions.SO_REUSEADDR, new Boolean (on));
+ }
+
+ /**
+ * Checks if SO_REUSEADDR is enabled
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public boolean getReuseAddress() throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ Object obj = impl.getOption (SocketOptions.SO_REUSEADDR);
+
+ if (obj instanceof Boolean)
+ return(((Boolean) obj).booleanValue ());
+ else
+ throw new SocketException ("Unexpected type");
+ }
+
+ /**
+ * Enables/Disables SO_BROADCAST
+ *
+ * @param on Whether or not to have SO_BROADCAST turned on
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void setBroadcast(boolean on) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ impl.setOption (SocketOptions.SO_BROADCAST, new Boolean (on));
+ }
+
+ /**
+ * Checks if SO_BROADCAST is enabled
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public boolean getBroadcast() throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ Object obj = impl.getOption (SocketOptions.SO_BROADCAST);
+
+ if (obj instanceof Boolean)
+ return ((Boolean) obj).booleanValue ();
+ else
+ throw new SocketException ("Unexpected type");
+ }
+
+ /**
+ * Sets the traffic class value
+ *
+ * @param tc The traffic class
+ *
+ * @exception SocketException If an error occurs
+ * @exception IllegalArgumentException If tc value is illegal
+ *
+ * @see DatagramSocket:getTrafficClass
+ *
+ * @since 1.4
+ */
+ public void setTrafficClass(int tc)
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ if (tc < 0 || tc > 255)
+ throw new IllegalArgumentException();
+
+ impl.setOption (SocketOptions.IP_TOS, new Integer (tc));
+ }
+
+ /**
+ * Returns the current traffic class
+ *
+ * @see DatagramSocket:setTrafficClass
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public int getTrafficClass() throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException( "Cannot initialize Socket implementation");
+
+ Object obj = impl.getOption(SocketOptions.IP_TOS);
+
+ if (obj instanceof Integer)
+ return ((Integer) obj).intValue ();
+ else
+ throw new SocketException ("Unexpected type");
+ }
+
+ /**
* This method returns the value of the system level socket option
* SO_SNDBUF, which is used by the operating system to tune buffer
* sizes for data transfers.
@@ -214,6 +685,9 @@ public class DatagramSocket
*/
public int getSendBufferSize() throws SocketException
{
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
Object obj = impl.getOption(SocketOptions.SO_SNDBUF);
if (obj instanceof Integer)
@@ -230,11 +704,15 @@ public class DatagramSocket
* @param size The new receive buffer size.
*
* @exception SocketException If an error occurs.
+ * @exception IllegalArgumentException If size is 0 or negative
*
* @since 1.2
*/
public void setReceiveBufferSize(int size) throws SocketException
{
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
if (size < 0)
throw new IllegalArgumentException("Buffer size is less than 0");
@@ -249,6 +727,7 @@ public class DatagramSocket
* @param size The new send buffer size.
*
* @exception SocketException If an error occurs.
+ * @exception IllegalArgumentException If size is 0 or negative
*
* @since 1.2
*/
@@ -259,4 +738,27 @@ public class DatagramSocket
impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size));
}
+
+ /**
+ * Sets the datagram socket implementation factory for the application
+ *
+ * @param fac The factory to set
+ *
+ * @exception IOException If an error occurs
+ * @exception SocketException If the factory is already defined
+ * @exception SecurityException If a security manager exists and its
+ * checkSetFactory method doesn't allow the operation
+ */
+ public static void setDatagramSocketImplFactory
+ (DatagramSocketImplFactory fac) throws IOException
+ {
+ if (factory != null)
+ throw new SocketException ("DatagramSocketImplFactory already defined");
+
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkSetFactory();
+
+ factory = fac;
+ }
}
diff --git a/libjava/java/net/DatagramSocketImpl.java b/libjava/java/net/DatagramSocketImpl.java
index e929e5006ff..5a0aa3e4acd 100644
--- a/libjava/java/net/DatagramSocketImpl.java
+++ b/libjava/java/net/DatagramSocketImpl.java
@@ -53,6 +53,7 @@ import java.io.FileDescriptor;
*
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Warren Levy <warrenl@cygnus.com>
+ * @since 1.1
*/
public abstract class DatagramSocketImpl implements SocketOptions
{
@@ -107,16 +108,39 @@ public abstract class DatagramSocketImpl implements SocketOptions
* @return The port number of the sender of the packet
*
* @exception IOException If an error occurs
+ * @exception PortUnreachableException May be thrown if the socket is
+ * connected to a currently unreachable destination. Note, there is no
+ * guarantee that the exception will be thrown.
*/
protected abstract int peek(InetAddress i) throws IOException;
/**
+ * Takes a peek at the next packet received. This packet is not consumed.
+ * With the next peekData/receive operation this packet will be read again.
+ *
+ * @param p The DatagramPacket to fill in with the data sent.
+ *
+ * @return The port number of the sender of the packet.
+ *
+ * @exception IOException If an error occurs
+ * @exception PortUnreachableException May be thrown if the socket is
+ * connected to a currently unreachable destination. Note, there is no
+ * guarantee that the exception will be thrown.
+ *
+ * @since 1.4
+ */
+ protected abstract int peekData (DatagramPacket p) throws IOException;
+
+ /**
* Transmits the specified packet of data to the network. The destination
* host and port should be encoded in the packet.
*
* @param p The packet to send
*
* @exception IOException If an error occurs
+ * @exception PortUnreachableException May be thrown if the socket is
+ * connected to a currently unreachable destination. Note, there is no
+ * guarantee that the exception will be thrown.
*/
protected abstract void send(DatagramPacket p) throws IOException;
@@ -128,10 +152,38 @@ public abstract class DatagramSocketImpl implements SocketOptions
* @param p A place to store the incoming packet.
*
* @exception IOException If an error occurs
+ * @exception PortUnreachableException May be thrown if the socket is
+ * connected to a currently unreachable destination. Note, there is no
+ * guarantee that the exception will be thrown.
*/
protected abstract void receive(DatagramPacket p) throws IOException;
/**
+ * Connects the socket to a host specified by address and port.
+ *
+ * @param address The InetAddress of the host to connect to
+ * @param port The port number of the host to connect to
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ protected void connect (InetAddress address, int port) throws SocketException
+ {
+ // This method has to be overwritten by real implementations
+ }
+
+ /**
+ * Disconnects the socket.
+ *
+ * @since 1.4
+ */
+ protected void disconnect ()
+ {
+ // This method has to be overwritten by real implementations
+ }
+
+ /**
* Sets the Time to Live (TTL) setting on this socket to the specified
* value. <b>Use <code>setTimeToLive(int)</code></b> instead.
*
@@ -188,6 +240,35 @@ public abstract class DatagramSocketImpl implements SocketOptions
protected abstract void leave(InetAddress inetaddr) throws IOException;
/**
+ * Causes this socket to join the specified multicast group on a specified
+ * device
+ *
+ * @param mcastaddr The address to leave
+ * @param netIf The specified network interface to join the group at
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.4
+ */
+ protected abstract void joinGroup (SocketAddress mcastaddr,
+ NetworkInterface netIf)
+ throws IOException;
+
+ /**
+ * Leaves a multicast group
+ *
+ * @param mcastaddr The address to join
+ * @param netIf The specified network interface to leave the group at
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.4
+ */
+ protected abstract void leaveGroup (SocketAddress mcastaddr,
+ NetworkInterface netIf)
+ throws IOException;
+
+ /**
* Returns the FileDescriptor for this socket
*/
protected FileDescriptor getFileDescriptor()
@@ -207,7 +288,7 @@ public abstract class DatagramSocketImpl implements SocketOptions
* Sets the specified option on a socket to the passed in object. For
* options that take an integer argument, the passed in object is an
* <code>Integer</code>. For options that are set to on or off, the
- * value passed will be a <code>Boolean</code>. The <code>option_id</code>
+ * value passed will be a <code>Boolean</code>. The <code>option_id</code>
* parameter is one of the defined constants in the superinterface.
*
* @param option_id The identifier of the option
@@ -220,9 +301,9 @@ public abstract class DatagramSocketImpl implements SocketOptions
throws SocketException;
/**
- * Returns the current setting of the specified option. The
- * <code>Object</code> returned will be an <code>Integer</code> for options
- * that have integer values. For options that are set to on or off, a
+ * Returns the current setting of the specified option. The
+ * <code>Object</code> returned will be an <code>Integer</code> for options
+ * that have integer values. For options that are set to on or off, a
* <code>Boolean</code> will be returned. The <code>option_id</code>
* is one of the defined constants in the superinterface.
*
diff --git a/libjava/java/net/DatagramSocketImplFactory.java b/libjava/java/net/DatagramSocketImplFactory.java
new file mode 100644
index 00000000000..60fe838458b
--- /dev/null
+++ b/libjava/java/net/DatagramSocketImplFactory.java
@@ -0,0 +1,59 @@
+/* DatagramSocketImplFactory.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.net;
+
+/** Written using on-line Java Platform 1.4 API Specification.
+ * Status: Believed complete and correct.
+ */
+
+/**
+ * This interface defines one method which returns a DatagramSocketImpl object.
+ * This should not be needed by ordinary applications.
+ *
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.3
+ */
+public interface DatagramSocketImplFactory
+{
+ /**
+ * This method returns an instance of the DatagramSocketImpl object
+ *
+ * @return A DatagramSocketImpl object
+ */
+ DatagramSocketImpl createDatagramSocketImpl();
+} // interface DatagramSocketImplFactory
diff --git a/libjava/java/net/FileNameMap.java b/libjava/java/net/FileNameMap.java
index e29c81265fa..538dbe8e19a 100644
--- a/libjava/java/net/FileNameMap.java
+++ b/libjava/java/net/FileNameMap.java
@@ -50,6 +50,7 @@ package java.net;
*
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Warren Levy <warrenl@cygnus.com>
+ * @since 1.1
*/
public interface FileNameMap
{
diff --git a/libjava/java/net/HttpURLConnection.java b/libjava/java/net/HttpURLConnection.java
index 84e9468dfc2..ac48246bb1c 100644
--- a/libjava/java/net/HttpURLConnection.java
+++ b/libjava/java/net/HttpURLConnection.java
@@ -12,9 +12,11 @@ details. */
package java.net;
import java.io.*;
+import java.security.Permission;
/**
* @author Warren Levy <warrenl@cygnus.com>
+ * @since 1.1
* @date March 29, 1999.
*/
@@ -63,7 +65,8 @@ public abstract class HttpURLConnection extends URLConnection
/* HTTP Server Error Response Codes */
public static final int HTTP_SERVER_ERROR = 500;
- public static final int HTTP_INTERNAL_ERROR = 501;
+ public static final int HTTP_INTERNAL_ERROR = 500;
+ public static final int HTTP_NOT_IMPLEMENTED = 501;
public static final int HTTP_BAD_GATEWAY = 502;
public static final int HTTP_UNAVAILABLE = 503;
public static final int HTTP_GATEWAY_TIMEOUT = 504;
@@ -87,6 +90,13 @@ public abstract class HttpURLConnection extends URLConnection
public abstract boolean usingProxy();
+ /**
+ * Sets whether HTTP redirects (requests with response code 3xx) should be
+ * automatically followed by this class. True by default
+ *
+ * @exception SecurityException If a security manager exists and its
+ * checkSetFactory method doesn't allow the operation
+ */
public static void setFollowRedirects(boolean set)
{
// Throw an exception if an extant security mgr precludes
@@ -103,6 +113,30 @@ public abstract class HttpURLConnection extends URLConnection
return followRedirects;
}
+ /**
+ * Returns the value of this HttpURLConnection's instanceFollowRedirects
+ * field
+ */
+ public boolean getInstanceFollowRedirects ()
+ {
+ return instanceFollowRedirects;
+ }
+
+ /**
+ * Sets the value of this HttpURLConnection's instanceFollowRedirects field
+ */
+ public void setInstanceFollowRedirects (boolean follow)
+ {
+ instanceFollowRedirects = follow;
+ }
+
+ /**
+ * Set the method for the URL request, one of:
+ * GET POST HEAD OPTIONS PUT DELETE TRACE are legal
+ *
+ * @exception ProtocolException If the method cannot be reset or if the
+ * requested method isn't valid for HTTP
+ */
public void setRequestMethod(String method) throws ProtocolException
{
if (connected)
@@ -122,6 +156,11 @@ public abstract class HttpURLConnection extends URLConnection
return method;
}
+ /**
+ * Gets the status code from an HTTP response message
+ *
+ * @exception IOException If an error occurs
+ */
public int getResponseCode() throws IOException
{
if (!gotResponseVals)
@@ -129,6 +168,12 @@ public abstract class HttpURLConnection extends URLConnection
return responseCode;
}
+ /**
+ * Gets the HTTP response message, if any, returned along with the
+ * response code from a server
+ *
+ * @exception IOException If an error occurs
+ */
public String getResponseMessage() throws IOException
{
if (!gotResponseVals)
@@ -172,11 +217,35 @@ public abstract class HttpURLConnection extends URLConnection
}
}
- // TODO12: public Permission getPermission() throws IOException
- // {
- // }
+ /**
+ * Returns a permission object representing the permission necessary to make
+ * the connection represented by this object
+ *
+ * @exception IOException If an error occurs
+ */
+ public Permission getPermission() throws IOException
+ {
+ return new SocketPermission (url.getHost (), "connect");
+ }
+
+ /**
+ * Returns the error stream if the connection failed but the server sent
+ * useful data nonetheless
+ */
+ public InputStream getErrorStream ()
+ {
+ // FIXME: implement this
+ return null;
+ }
- // TODO12: public InputStream getErrorStream()
- // {
- // }
+ /**
+ * Returns the value of the named field parsed as date
+ */
+ public long getHeaderFieldDate (String key, long value)
+ {
+ // FIXME: implement this correctly
+ // http://www.w3.org/Protocols/HTTP-NG/ng-notes.txt
+
+ return super.getHeaderFieldDate (key, value);
+ }
}
diff --git a/libjava/java/net/Inet4Address.java b/libjava/java/net/Inet4Address.java
new file mode 100644
index 00000000000..c635c671d0e
--- /dev/null
+++ b/libjava/java/net/Inet4Address.java
@@ -0,0 +1,275 @@
+/* Inet4Address.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.net;
+
+import java.io.IOException;
+import java.io.ObjectStreamException;
+
+/**
+ * @author Michael Koch
+ * @date August 3, 2002.
+ */
+
+/*
+ * Written using on-line Java Platform 1.4 API Specification and
+ * RFC 1884 (http://www.ietf.org/rfc/rfc1884.txt),
+ * RFC 1918 (http://www.ietf.org/rfc/rfc1918.txt),
+ * RFC 2365 (http://www.ietf.org/rfc/rfc2365.txt)
+ * Status: Believed complete and correct.
+ */
+
+public final class Inet4Address extends InetAddress
+{
+ static final long serialVersionUID = 7615067291688066509L;
+
+ /**
+ * needed for serialization
+ */
+ private Object writeReplace () throws ObjectStreamException
+ {
+ return new InetAddress (addr, hostName);
+ }
+
+ /**
+ * Creates a Inet4Address
+ *
+ * @param addr The IP address
+ * @param host The Hostname
+ */
+ protected Inet4Address(byte[] addr, String host)
+ {
+ super (addr, host);
+ }
+
+ /**
+ * Checks if the address is a multicast address
+ *
+ * @since 1.1
+ */
+ public boolean isMulticastAddress ()
+ {
+ return (addr [0] & 0xF0) == 0xE0;
+ }
+
+ /**
+ * Checks if this address is a loopback address
+ */
+ public boolean isLoopbackAddress ()
+ {
+ return addr [0] == 0x7F;
+ }
+
+ /**
+ * Checks if this address is a wildcard address
+ *
+ * @since 1.4
+ */
+ public boolean isAnyLocalAddress ()
+ {
+ byte[] anylocal = { 0, 0, 0, 0 };
+
+ return addr == anylocal;
+ }
+
+ /**
+ * Checks if this address is a link local address
+ *
+ * @since 1.4
+ */
+ public boolean isLinkLocalAddress ()
+ {
+ // XXX: This seems to not exist with IPv4 addresses
+ return false;
+ }
+
+ /**
+ * Checks if this address is a site local address
+ *
+ * @since 1.4
+ */
+ public boolean isSiteLocalAddress ()
+ {
+ // 10.0.0.0/8
+ if (addr [0] == 0x0A)
+ return true;
+
+ // XXX: Suns JDK 1.4.1 (on Linux) seems to have a bug here:
+ // it says 172.16.0.0 - 172.255.255.255 are site local addresses
+ //
+ // 172.16.0.0/12
+ if (addr [0] == 0xAC && (addr [1] & 0xF0) == 0x01)
+ return true;
+
+ // 192.168.0.0/16
+ if (addr [0] == 0xC0 && addr [1] == 0xA8)
+ return true;
+
+ // XXX: Do we need to check more addresses here ?
+ return false;
+ }
+
+ /**
+ * Checks if this multicast address has global scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCGlobal ()
+ {
+ // XXX: This seems to net exist with IPv4 addresses
+ return false;
+ }
+
+ /**
+ * Checks if this multicast address has node scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCNodeLocal ()
+ {
+ // XXX: This seems to net exist with IPv4 addresses
+ return false;
+ }
+
+ /**
+ * Checks if this multicast address has link scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCLinkLocal ()
+ {
+ if (!isMulticastAddress ())
+ return false;
+
+ return (addr [0] == 0xE0)
+ && (addr [1] == 0x00)
+ && (addr [2] == 0x00);
+ }
+
+ /**
+ * Checks if this multicast address has site scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCSiteLocal ()
+ {
+ // XXX: This seems to net exist with IPv4 addresses
+ return false;
+ }
+
+ /**
+ * Checks if this multicast address has organization scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCOrgLocal ()
+ {
+ // XXX: This seems to net exist with IPv4 addresses
+ return false;
+ }
+
+ /**
+ * Returns the address of the current instance
+ */
+ public byte[] getAddress ()
+ {
+ return addr;
+ }
+
+ /**
+ * Returns the address as string
+ *
+ * @since 1.0.2
+ */
+ public String getHostAddress ()
+ {
+ StringBuffer sbuf = new StringBuffer (40);
+ int len = addr.length;
+ int i = 0;
+
+ for ( ; ; )
+ {
+ sbuf.append (addr [i] & 0xFF);
+ i++;
+
+ if (i == len)
+ break;
+
+ sbuf.append ('.');
+ }
+
+ return sbuf.toString ();
+ }
+
+ /**
+ * Computes the hashcode of the instance
+ */
+ public int hashCode ()
+ {
+ int hash = 0;
+ int len = addr.length;
+ int i = len > 4 ? len - 4 : 0;
+
+ for ( ; i < len; i++)
+ hash = (hash << 8) | (addr [i] & 0xFF);
+
+ return hash;
+ }
+
+ /**
+ * Compare the current Inet4Address instance with obj
+ *
+ * @param obj Object to compare with
+ */
+ public boolean equals (Object obj)
+ {
+ if (obj == null || ! (obj instanceof InetAddress))
+ return false;
+
+ byte[] addr1 = addr;
+ byte[] addr2 = ((InetAddress) obj).addr;
+
+ if (addr1.length != addr2.length)
+ return false;
+
+ for (int i = addr1.length; --i >= 0; )
+ if (addr1 [i] != addr2 [i])
+ return false;
+
+ return true;
+ }
+} // class Inet4Address
diff --git a/libjava/java/net/Inet6Address.java b/libjava/java/net/Inet6Address.java
new file mode 100644
index 00000000000..de496b148ee
--- /dev/null
+++ b/libjava/java/net/Inet6Address.java
@@ -0,0 +1,272 @@
+/* Inet6Address.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.net;
+
+import java.io.IOException;
+
+/**
+ * @author Michael Koch
+ * @date August 3, 2002.
+ */
+
+/*
+ * Written using on-line Java Platform 1.4 API Specification and
+ * RFC 1884 (http://www.ietf.org/rfc/rfc1884.txt)
+ * Status: Believed complete and correct.
+ */
+
+public final class Inet6Address extends InetAddress
+{
+ static final long serialVersionUID = 6880410070516793377L;
+
+ /**
+ * Needed for serialization
+ */
+ byte[] ipaddress;
+
+ /**
+ * Create an Inet6Address object
+ *
+ * @param addr The IP address
+ * @param host The hostname
+ */
+ protected Inet6Address (byte[] addr, String host)
+ {
+ super (null, host);
+ this.ipaddress = addr;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress is an IP multicast address
+ *
+ * @since 1.1
+ */
+ public boolean isMulticastAddress ()
+ {
+ return ipaddress [0] == 0xFF;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress in a wildcard address
+ *
+ * @since 1.4
+ */
+ public boolean isAnyLocalAddress ()
+ {
+ byte[] anylocal = { 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ return ipaddress == anylocal;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress is a loopback address
+ *
+ * @since 1.4
+ */
+ public boolean isLoopbackAddress ()
+ {
+ byte[] loopback = { 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1 };
+
+ return ipaddress == loopback;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress is an link local address
+ *
+ * @since 1.4
+ */
+ public boolean isLinkLocalAddress ()
+ {
+ return ipaddress [0] == 0xFA;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress is a site local address
+ *
+ * @since 1.4
+ */
+ public boolean isSiteLocalAddress ()
+ {
+ return ipaddress [0] == 0xFB;
+ }
+
+ /**
+ * Utility routine to check if the multicast address has global scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCGlobal ()
+ {
+ if (!isMulticastAddress ())
+ return false;
+
+ return (ipaddress [1] & 0x0F) == 0xE;
+ }
+
+ /**
+ * Utility routine to check if the multicast address has node scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCNodeLocal ()
+ {
+ if (!isMulticastAddress ())
+ return false;
+
+ return (ipaddress [1] & 0x0F) == 0x1;
+ }
+
+ /**
+ * Utility routine to check if the multicast address has link scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCLinkLocal ()
+ {
+ if (!isMulticastAddress ())
+ return false;
+
+ return (ipaddress [1] & 0x0F) == 0x2;
+ }
+
+ /**
+ * Utility routine to check if the multicast address has site scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCSiteLocal ()
+ {
+ if (!isMulticastAddress ())
+ return false;
+
+ return (ipaddress [1] & 0x0F) == 0x5;
+ }
+
+ /**
+ * Utility routine to check if the multicast address has organization scope
+ *
+ * @since 1.4
+ */
+ public boolean isMCOrgLocal ()
+ {
+ if (!isMulticastAddress ())
+ return false;
+
+ return (ipaddress [1] & 0x0F) == 0x8;
+ }
+
+ /**
+ * Returns the raw IP address of this InetAddress object. The result is in
+ * network byte order: the highest order byte of the address is i
+ * n getAddress()[0]
+ */
+ public byte[] getAddress ()
+ {
+ return ipaddress;
+ }
+
+ /**
+ * Returns the IP address string in textual presentation
+ */
+ public String getHostAddress ()
+ {
+ StringBuffer sbuf = new StringBuffer (40);
+
+ for (int i = 0; i < 16; i += 2)
+ {
+ int x = ((ipaddress [i] & 0xFF) << 8) | (ipaddress [i + 1] & 0xFF);
+ boolean empty = sbuf.length () == 0;
+
+ if (empty)
+ {
+ if (i > 0)
+ sbuf.append ("::");
+ }
+ else
+ sbuf.append (':');
+
+ if (x != 0 || i >= 14)
+ sbuf.append (Integer.toHexString (x));
+ }
+
+ return sbuf.toString ();
+ }
+
+ /**
+ * Returns a hashcode for this IP address
+ */
+ public int hashCode ()
+ {
+ return super.hashCode ();
+ }
+
+ /**
+ * Compares this object against the specified object
+ */
+ public boolean equals (Object obj)
+ {
+ if (obj == null || ! (obj instanceof Inet6Address))
+ return false;
+
+ Inet6Address tmp = (Inet6Address) obj;
+
+ return super.equals (tmp)
+ && this.ipaddress == tmp.ipaddress;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress is an
+ * IPv4 compatible IPv6 address
+ *
+ * @since 1.4
+ */
+ public boolean isIPv4CompatibleAddress ()
+ {
+ if (ipaddress [0] != 0x00 || ipaddress [1] != 0x00 ||
+ ipaddress [2] != 0x00 || ipaddress [3] != 0x00 ||
+ ipaddress [4] != 0x00 || ipaddress [5] != 0x00 ||
+ ipaddress [6] != 0x00 || ipaddress [7] != 0x00 ||
+ ipaddress [8] != 0x00 || ipaddress [9] != 0x00 ||
+ ipaddress [10] != 0x00 || ipaddress [11] != 0x00)
+ return false;
+
+ return true;
+ }
+}
diff --git a/libjava/java/net/InetAddress.java b/libjava/java/net/InetAddress.java
index 49bc3105fb1..c4ea6efd0d9 100644
--- a/libjava/java/net/InetAddress.java
+++ b/libjava/java/net/InetAddress.java
@@ -9,9 +9,12 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.net;
+
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
+import java.io.Serializable;
+import java.io.ObjectStreamException;
/**
* @author Per Bothner
@@ -23,9 +26,11 @@ import java.io.IOException;
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
* (The latter turns out to have some errors ...)
* Status: Believed complete and correct.
+ *
+ * @specnote This class is not final since JK 1.4
*/
-public final class InetAddress implements java.io.Serializable
+public class InetAddress implements Serializable
{
// The Serialized Form specifies that an int 'address' is saved/restored.
// This class uses a byte array internally so we'll just do the conversion
@@ -41,6 +46,14 @@ public final class InetAddress implements java.io.Serializable
int family;
private static final long serialVersionUID = 3286316764910316507L;
+ /**
+ * Needed for serialization
+ */
+ private void readResolve () throws ObjectStreamException
+ {
+ // FIXME: implement this
+ }
+
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException
{
@@ -78,6 +91,11 @@ public final class InetAddress implements java.io.Serializable
family = getFamily (address);
}
+ /**
+ * Utility routine to check if the InetAddress is an IP multicast address
+ *
+ * @since 1.1
+ */
public boolean isMulticastAddress ()
{
int len = addr.length;
@@ -88,6 +106,91 @@ public final class InetAddress implements java.io.Serializable
return false;
}
+ /**
+ * Utility routine to check if the InetAddress in a wildcard address
+ *
+ * @since 1.4
+ */
+ public boolean isAnyLocalAddress ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * Utility routine to check if the InetAddress is a loopback address
+ *
+ * @since 1.4
+ */
+ public boolean isLoopbackAddress ()
+ {
+ // FIXME: implement this
+ return addr [0] == 0x7F;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isLinkLocalAddress ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isSiteLocalAddress ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isMCGlobal ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isMCNodeLocal ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isMCLinkLocal ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isMCSiteLocal ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
+ * @since 1.4
+ */
+ public boolean isMCOrgLocal ()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
public String getHostName ()
{
if (hostName == null)
@@ -95,6 +198,15 @@ public final class InetAddress implements java.io.Serializable
return hostName;
}
+ /**
+ * @since 1.4
+ */
+ public String getCanonicalHostName ()
+ {
+ // FIXME: implement this
+ return "";
+ }
+
public byte[] getAddress ()
{
// An experiment shows that JDK1.2 returns a different byte array each
@@ -125,6 +237,11 @@ public final class InetAddress implements java.io.Serializable
}
}
+ /**
+ * Returns the IP address as string
+ *
+ * @since 1.0.2
+ */
public String getHostAddress ()
{
StringBuffer sbuf = new StringBuffer(40);
@@ -186,11 +303,12 @@ public final class InetAddress implements java.io.Serializable
{
if (obj == null || ! (obj instanceof InetAddress))
return false;
+
// "The Java Class Libraries" 2nd edition says "If a machine has
// multiple names instances of InetAddress for different name of
// that same machine are not equal. This is because they have
// different host names." This violates the description in the
- // JDK 1.2 API documentation. A little experiementation
+ // JDK 1.2 API documentation. A little experimentation
// shows that the latter is correct.
byte[] addr1 = addr;
byte[] addr2 = ((InetAddress) obj).addr;
@@ -202,11 +320,58 @@ public final class InetAddress implements java.io.Serializable
return true;
}
+ /**
+ * Returns then <code>InetAddress</code> as string
+ */
public String toString()
{
return getHostName()+'/'+getHostAddress();
}
+ /**
+ * Returns an InetAddress object given the raw IP address.
+ *
+ * The argument is in network byte order: the highest order byte of the
+ * address is in getAddress()[0].
+ *
+ * @param addr The IP address to create the InetAddress object from
+ *
+ * @exception UnknownHostException If IP address has illegal length
+ *
+ * @since 1.4
+ */
+ public static InetAddress getByAddress(byte[] addr)
+ throws UnknownHostException
+ {
+ if (addr.length != 4 && addr.length != 16)
+ throw new UnknownHostException ("IP address has illegal length");
+
+ return new InetAddress (addr, "");
+ }
+
+ /**
+ * Creates an InetAddress based on the provided host name and IP address.
+ * No name service is checked for the validity of the address.
+ *
+ * @param host The hostname of the InetAddress object to create
+ * @param addr The IP address to create the InetAddress object from
+ *
+ * @exception UnknownHostException If IP address is of illegal length
+ *
+ * @since 1.4
+ */
+ public static InetAddress getByAddress (String host, byte[] addr)
+ throws UnknownHostException
+ {
+ if (addr.length == 4)
+ return new Inet4Address (addr, host);
+
+ if (addr.length == 16)
+ return new Inet6Address (addr, host);
+
+ throw new UnknownHostException ("IP address has illegal length");
+ }
+
/** If host is a valid numeric IP address, return the numeric address.
* Otherwise, return null. */
private static native byte[] aton (String host);
@@ -214,6 +379,14 @@ public final class InetAddress implements java.io.Serializable
private static native InetAddress[] lookup
(String hostname, InetAddress addr, boolean all);
+ /**
+ * Determines the IP address of a host, given the host's name.
+ *
+ * @exception UnknownHostException If no IP address for the host could
+ * be found
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
+ */
public static InetAddress getByName (String host)
throws UnknownHostException
{
@@ -227,6 +400,15 @@ public final class InetAddress implements java.io.Serializable
return iaddr;
}
+ /**
+ * Given the name of a host, returns an array of its IP addresses,
+ * based on the configured name service on the system.
+ *
+ * @exception UnknownHostException If no IP address for the host could
+ * be found
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
+ */
public static InetAddress[] getAllByName (String host)
throws UnknownHostException
{
@@ -250,6 +432,12 @@ public final class InetAddress implements java.io.Serializable
private static InetAddress localhost = null;
+ /**
+ * Returns the local host
+ *
+ * @exception UnknownHostException If no IP address for the host could
+ * be found
+ */
public static InetAddress getLocalHost() throws UnknownHostException
{
SecurityManager s = System.getSecurityManager();
diff --git a/libjava/java/net/InetSocketAddress.java b/libjava/java/net/InetSocketAddress.java
index c542b800225..1b740dcc507 100644
--- a/libjava/java/net/InetSocketAddress.java
+++ b/libjava/java/net/InetSocketAddress.java
@@ -41,88 +41,155 @@ package java.net;
* InetSocketAddress instances represent socket addresses
* in the java.nio package. They encapsulate a InetAddress and
* a port number.
+ *
+ * @since 1.4
*/
public class InetSocketAddress extends SocketAddress
{
- InetAddress addr;
- int port;
+ String hostname;
+ InetAddress addr;
+ int port;
- public InetSocketAddress(InetAddress addr, int port)
- {
- this.addr = addr;
- this.port = port;
- }
-
- public InetSocketAddress(int port)
- {
- this.port = port;
- try {
- this.addr = InetAddress.getLocalHost();
- } catch (Exception e) {
- }
- }
-
-
- public InetSocketAddress(String hostname, int port)
- {
- this.port = port;
- try {
- this.addr = InetAddress.getByName(hostname);
- } catch (Exception e) {
- }
- }
+ /**
+ * Constructs an InetSocketAddress instance.
+ *
+ * @param addr Address of the socket
+ * @param port Port if the socket
+ *
+ * @exception IllegalArgumentException If the port number is illegel
+ */
+ public InetSocketAddress(InetAddress addr, int port)
+ throws IllegalArgumentException
+ {
+ if (port < 0 || port > 65535)
+ throw new IllegalArgumentException();
+
+ this.addr = addr;
+ this.port = port;
+ this.hostname = addr.getHostName ();
+ }
+
+ /**
+ * Constructs an InetSocketAddress instance.
+ *
+ * @param port Port if the socket
+ *
+ * @exception IllegalArgumentException If the port number is illegal
+ */
+ public InetSocketAddress(int port)
+ throws IllegalArgumentException
+ {
+ if (port < 0 || port > 65535)
+ throw new IllegalArgumentException();
+
+ this.port = port;
+
+ try
+ {
+ byte[] any = { 0, 0, 0, 0 };
+ this.addr = InetAddress.getByAddress (any);
+ this.hostname = "0.0.0.0";
+ }
+ catch (UnknownHostException e)
+ {
+ this.addr = null;
+ this.hostname = "";
+ }
+ }
+
+
+ /**
+ * Constructs an InetSocketAddress instance.
+ *
+ * @param addr Address of the socket
+ * @param port Port if the socket
+ *
+ * @exception IllegalArgumentException If the port number is illegal
+ */
+ public InetSocketAddress(String hostname, int port)
+ throws IllegalArgumentException
+ {
+ if (port < 0 || port > 65535)
+ throw new IllegalArgumentException();
+
+ this.port = port;
+ this.hostname = hostname;
+
+ try
+ {
+ this.addr = InetAddress.getByName(hostname);
+ }
+ catch (Exception e) // UnknownHostException, SecurityException
+ {
+ this.addr = null;
+ }
+ }
- /**
- * Test if obj is a InetSocketAddress and
- * has the same address & port
- */
- public boolean equals(Object obj)
- {
- if (obj instanceof InetSocketAddress)
- {
- InetSocketAddress a = (InetSocketAddress) obj;
- return addr.equals(a.addr) && a.port == port;
- }
- return false;
- }
-
- public InetAddress getAddress()
- {
- return addr;
- }
-
- public String getHostName()
- {
- return addr.getHostName();
- }
-
- public int getPort()
- {
- return port;
- }
+ /**
+ * Test if obj is a <code>InetSocketAddress</code> and
+ * has the same address and port
+ */
+ public final boolean equals (Object obj)
+ {
+ // InetSocketAddress objects are equal when addr and port are equal.
+ // The hostname may differ.
+
+ if (obj instanceof InetSocketAddress)
+ {
+ InetSocketAddress a = (InetSocketAddress) obj;
+ return addr.equals(a.addr) && a.port == port;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the <code>InetAddress</code> or
+ * <code>null</code> if its unresolved
+ */
+ public final InetAddress getAddress()
+ {
+ return addr;
+ }
+
+ /**
+ * Returns <code>hostname</code>
+ */
+ public final String getHostName()
+ {
+ return hostname;
+ }
+
+ /**
+ * Returns the <code>port</code>
+ */
+ public final int getPort()
+ {
+ return port;
+ }
- /**
- * TODO: see what sun does here.
- */
- public int hashCode()
- {
- return port + addr.hashCode();
- }
-
- /**
- * TODO: see what sun does here.
- */
- public boolean isUnresolved()
- {
- return addr == null;
- }
+ /**
+ * Returns the hashcode of the <code>InetSocketAddress</code>
+ */
+ public final int hashCode()
+ {
+ return port + addr.hashCode();
+ }
+
+ /**
+ * Checks wether the address has been resolved or not
+ */
+ public final boolean isUnresolved()
+ {
+ return addr == null;
+ }
- /**
- * TODO: see what sun does here.
- */
- public String toString()
- {
- return "SA:"+addr+":"+port;
- }
+ /**
+ * Returns the <code>InetSocketAddress</code> as string
+ */
+ public String toString()
+ {
+ return addr + ":" + port;
+ }
}
diff --git a/libjava/java/net/JarURLConnection.java b/libjava/java/net/JarURLConnection.java
index 60adfcd9c61..a90c7f33037 100644
--- a/libjava/java/net/JarURLConnection.java
+++ b/libjava/java/net/JarURLConnection.java
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation
+/* Copyright (C) 1999, 2000, 2002 Free Software Foundation
This file is part of libgcj.
@@ -12,11 +12,14 @@ import java.net.*;
import java.io.*;
import java.util.jar.*;
import java.util.zip.*;
+import java.util.Map;
import java.util.Vector;
import java.util.Hashtable;
+import java.security.cert.Certificate;
/**
* @author Kresten Krab Thorup <krab@gnu.org>
+ * @since 1.2
* @date Aug 10, 1999.
*/
@@ -31,7 +34,7 @@ public abstract class JarURLConnection extends URLConnection
* either case this describes just the jar file itself. */
protected URLConnection jarFileURLConnection;
- // If this is a connection to a jar file element this is set, otherwose null.
+ // If this is a connection to a jar file element this is set, otherwise null.
private final String element;
// Cached JarURLConnection's
@@ -47,7 +50,14 @@ public abstract class JarURLConnection extends URLConnection
return element;
}
- public JarURLConnection(URL url)
+ /**
+ * Creates a new JarURLConnection
+ *
+ * @exception MalformedURLException If url is invalid
+ *
+ * @specnote This constructor is protected since JDK 1.4
+ */
+ protected JarURLConnection(URL url)
throws MalformedURLException
{
super(url);
@@ -103,7 +113,8 @@ public abstract class JarURLConnection extends URLConnection
{
// This is a JarURLConnection for the entire jar file.
- InputStream jar_is = new BufferedInputStream(jarFileURLConnection.getInputStream ());
+ InputStream jar_is = new BufferedInputStream(
+ jarFileURLConnection.getInputStream ());
return new JarInputStream(jar_is);
}
@@ -128,7 +139,8 @@ public abstract class JarURLConnection extends URLConnection
else
{
// If the jar file is not local, ...
- JarInputStream zis = new JarInputStream(jarFileURLConnection.getInputStream ());
+ JarInputStream zis = new JarInputStream(
+ jarFileURLConnection.getInputStream ());
// This is hideous, we're doing a linear search...
for (ZipEntry ent = zis.getNextEntry ();
@@ -148,7 +160,12 @@ public abstract class JarURLConnection extends URLConnection
return null;
}
- public JarEntry getJarEntry () throws java.io.IOException
+ /**
+ * Return the JAR entry object for this connection, if any
+ *
+ * @exception IOException If an error occurs
+ */
+ public JarEntry getJarEntry () throws IOException
{
JarFile jarfile = null;
@@ -162,14 +179,15 @@ public abstract class JarURLConnection extends URLConnection
{
jarfile = getJarFile ();
}
- catch (java.io.IOException x)
+ catch (IOException x)
{
/* ignore */
}
if (jarfile == null)
{
- JarInputStream zis = new JarInputStream(jarFileURLConnection.getInputStream ());
+ JarInputStream zis = new JarInputStream(
+ jarFileURLConnection.getInputStream ());
// This is hideous, we're doing a linear search for the thing...
for (ZipEntry ent = zis.getNextEntry ();
@@ -191,7 +209,12 @@ public abstract class JarURLConnection extends URLConnection
return null;
}
- public abstract JarFile getJarFile() throws java.io.IOException;
+ /**
+ * Return the JAR file for this connection
+ *
+ * @exception IOException If an error occurs
+ */
+ public abstract JarFile getJarFile() throws IOException;
// Steal and borrow from protocol/file/Connection.java
@@ -215,6 +238,20 @@ public abstract class JarURLConnection extends URLConnection
}
// Override default method in URLConnection.
+ public Map getHeaderFields()
+ {
+ try
+ {
+ getHeaders();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+ return hdrHash;
+ }
+
+ // Override default method in URLConnection.
public String getHeaderField(int n)
{
try
@@ -300,4 +337,51 @@ public abstract class JarURLConnection extends URLConnection
hdrHash.put(key.toLowerCase(), Long.toString(len));
}
+ /**
+ * Returns an array of Certificate objects for the jar file entry specified
+ * by this URL or null if there are none
+ *
+ * @return A Certificate array
+ *
+ * @exception IOException If an error occurs
+ */
+ public Certificate[] getCertificates() throws IOException
+ {
+ return getJarEntry().getCertificates();
+ }
+
+ /**
+ * Returns the main Attributes for the JAR file for this connection
+ *
+ * @exception IOException If an error occurs
+ */
+ public Attributes getMainAttributes () throws IOException
+ {
+ return getManifest ().getMainAttributes ();
+ }
+
+ /**
+ * Return the Attributes object for this connection if the URL for it points
+ * to a JAR file entry, null otherwise
+ *
+ * @exception IOException If an error occurs
+ */
+ public Attributes getAttributes () throws IOException
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ /**
+ * Returns the Manifest for this connection, or null if none
+ *
+ * @exception IOException If an error occurs
+ */
+ public Manifest getManifest () throws IOException
+ {
+ JarFile file = getJarFile ();
+
+ // FIXME: implement this
+ return null;
+ }
}
diff --git a/libjava/java/net/MulticastSocket.java b/libjava/java/net/MulticastSocket.java
index 4528de1ebed..2700ebee511 100644
--- a/libjava/java/net/MulticastSocket.java
+++ b/libjava/java/net/MulticastSocket.java
@@ -38,82 +38,105 @@ exception statement from your version. */
package java.net;
import java.io.IOException;
+import java.util.Enumeration;
-/*
+/**
* Written using on-line Java Platform 1.2 API Specification, as well
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
* Status: Believed complete and correct.
*/
/**
- * This class models a multicast UDP socket. A multicast address is a
- * class D internet address (one whose most significant bits are 1110).
- * A multicast group consists of a multicast address and a well known
- * port number. All members of the group listening on that address and
- * port will receive all the broadcasts to the group.
- * <p>
- * Please note that applets are not allowed to use multicast sockets
- *
- * Written using on-line Java Platform 1.2 API Specification, as well
- * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
- * Status: Believed complete and correct.
- *
- * @author Warren Levy <warrenl@cygnus.com>
- * @author Aaron M. Renn (arenn@urbanophile.com) (Documentation comments)
- * @date May 18, 1999.
- */
+ * This class models a multicast UDP socket. A multicast address is a
+ * class D internet address (one whose most significant bits are 1110).
+ * A multicast group consists of a multicast address and a well known
+ * port number. All members of the group listening on that address and
+ * port will receive all the broadcasts to the group.
+ * <p>
+ * Please note that applets are not allowed to use multicast sockets
+ *
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ *
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @author Aaron M. Renn (arenn@urbanophile.com) (Documentation comments)
+ * @since 1.1
+ * @date May 18, 1999.
+ */
public class MulticastSocket extends DatagramSocket
{
// FIXME: the local addr bound to the multicast socket can be reused;
// unlike unicast sockets. It binds to any available network interface.
// See p.1159 JCL book.
-/**
- * Create a MulticastSocket that this not bound to any address
- *
- * @exception IOException If an error occurs
- */
+ /**
+ * Create a MulticastSocket that this not bound to any address
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ */
public MulticastSocket() throws IOException
{
super(0, null);
}
-/**
- * Create a multicast socket bound to the specified port
- *
- * @param The port to bind to
- *
- * @exception IOException If an error occurs
- */
+ /**
+ * Create a multicast socket bound to the specified port
+ *
+ * @param port The port to bind to
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ */
public MulticastSocket(int port) throws IOException
{
super(port, null);
}
-/**
- * Returns the interface being used for multicast packets
- *
- * @return The multicast interface
- *
- * @exception SocketException If an error occurs
- */
+ /**
+ * Create a multicast socket bound to the specified SocketAddress.
+ *
+ * @param address The SocketAddress the multicast socket will be bound to
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ *
+ * @since 1.4
+ */
+ public MulticastSocket(SocketAddress address) throws IOException
+ {
+ super(address);
+ }
+
+ /**
+ * Returns the interface being used for multicast packets
+ *
+ * @return The multicast interface
+ *
+ * @exception SocketException If an error occurs
+ */
public InetAddress getInterface() throws SocketException
{
- // FIXME: Is it possible that an InetAddress wasn't returned from getOption?
return (InetAddress) impl.getOption(SocketOptions.IP_MULTICAST_IF);
}
-/**
- * Returns the current value of the "Time to Live" option. This is the
- * number of hops a packet can make before it "expires". This method id
- * deprecated. Use <code>getTimeToLive</code> instead.
- *
- * @return The TTL value
- *
- * @exception IOException If an error occurs
- *
- * @deprecated Replaced by getTimeToLive() in Java 1.2
- */
+ /**
+ * Returns the current value of the "Time to Live" option. This is the
+ * number of hops a packet can make before it "expires". This method id
+ * deprecated. Use <code>getTimeToLive</code> instead.
+ *
+ * @return The TTL value
+ *
+ * @exception IOException If an error occurs
+ *
+ * @deprecated 1.2 Replaced by getTimeToLive()
+ *
+ * @see Multicastsocket:getTimeToLive
+ */
public byte getTTL() throws IOException
{
// Use getTTL here rather than getTimeToLive in case we're using an impl
@@ -122,43 +145,137 @@ public class MulticastSocket extends DatagramSocket
return impl.getTTL();
}
-/**
- * Returns the current value of the "Time to Live" option. This is the
- * number of hops a packet can make before it "expires".
- *
- * @return The TTL value
- *
- * @exception IOException If an error occurs
- *
- * @since Java 1.2
- */
+ /**
+ * Returns the current value of the "Time to Live" option. This is the
+ * number of hops a packet can make before it "expires".
+ *
+ * @return The TTL value
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.2
+ */
public int getTimeToLive() throws IOException
{
return impl.getTimeToLive();
}
-/**
- * Sets the interface to use for multicast packets.
- *
- * @param addr The new interface to use
- *
- * @exception SocketException If an error occurs
- */
+ /**
+ * Sets the interface to use for sending multicast packets.
+ *
+ * @param inf The new interface to use
+ *
+ * @exception SocketException If an error occurs
+ */
public void setInterface(InetAddress inf) throws SocketException
{
impl.setOption(SocketOptions.IP_MULTICAST_IF, inf);
}
-/**
- * Sets the "Time to Live" value for a socket. The value must be between
- * 1 and 255.
- *
- * @param ttl The new TTL value
- *
- * @exception IOException If an error occurs
- *
- * @deprecated Replaced by <code>setTimeToLive</code> in Java 1.2
- */
+ /**
+ * Sets the local network interface used to send multicast messages
+ *
+ * @param netIF The local network interface used to send multicast messages
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @see MulticastSocket:getNetworkInterface
+ *
+ * @since 1.4
+ */
+ public void setNetworkInterface(NetworkInterface netIf)
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException (
+ "MulticastSocket: Cant access socket implementation");
+
+ Enumeration e = netIf.getInetAddresses ();
+
+ if (!e.hasMoreElements ())
+ throw new SocketException ("MulticastSocket: Error");
+
+ InetAddress address = (InetAddress) e.nextElement ();
+ impl.setOption (SocketOptions.IP_MULTICAST_IF, address);
+ }
+
+ /**
+ * Gets the local network interface which is used to send multicast messages
+ *
+ * @return The local network interface to send multicast messages
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @see MulticastSocket:setNetworkInterface
+ *
+ * @since 1.4
+ */
+ public NetworkInterface getNetworkInterface()
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException (
+ "MulticastSocket: Cant access socket implementation");
+
+ InetAddress address =
+ (InetAddress) impl.getOption (SocketOptions.IP_MULTICAST_IF);
+ NetworkInterface netIf = NetworkInterface.getByInetAddress (address);
+
+ return netIf;
+ }
+
+ /**
+ * Disable/Enable local loopback of multicast packets. The option is used by
+ * the platform's networking code as a hint for setting whether multicast
+ * data will be looped back to the local socket.
+ *
+ * Because this option is a hint, applications that want to verify what
+ * loopback mode is set to should call #getLoopbackMode
+ *
+ * @param disable True to disable loopback mode
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void setLoopbackMode(boolean disable) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException (
+ "MulticastSocket: Cant access socket implementation");
+
+ impl.setOption (SocketOptions.IP_MULTICAST_LOOP, new Boolean (disable));
+ }
+
+ /**
+ * Checks if local loopback mode is enabled or not
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public boolean getLoopbackMode() throws SocketException
+ {
+ Object obj = impl.getOption (SocketOptions.IP_MULTICAST_LOOP);
+
+ if (obj instanceof Boolean)
+ return ((Boolean) obj).booleanValue ();
+ else
+ throw new SocketException ("Unexpected type");
+ }
+
+ /**
+ * Sets the "Time to Live" value for a socket. The value must be between
+ * 1 and 255.
+ *
+ * @param ttl The new TTL value
+ *
+ * @exception IOException If an error occurs
+ *
+ * @deprecated 1.2 Replaced by <code>setTimeToLive</code>
+ *
+ * @see MulticastSocket:setTimeToLive
+ */
public void setTTL(byte ttl) throws IOException
{
// Use setTTL here rather than setTimeToLive in case we're using an impl
@@ -167,16 +284,16 @@ public class MulticastSocket extends DatagramSocket
impl.setTTL(ttl);
}
-/**
- * Sets the "Time to Live" value for a socket. The value must be between
- * 1 and 255.
- *
- * @param ttl The new TTL value
- *
- * @exception IOException If an error occurs
- *
- * @since Java 1.2
- */
+ /**
+ * Sets the "Time to Live" value for a socket. The value must be between
+ * 1 and 255.
+ *
+ * @param ttl The new TTL value
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.2
+ */
public void setTimeToLive(int ttl) throws IOException
{
if (ttl <= 0 || ttl > 255)
@@ -185,13 +302,15 @@ public class MulticastSocket extends DatagramSocket
impl.setTimeToLive(ttl);
}
-/**
- * Joins the specified mulitcast group.
- *
- * @param addr The address of the group to join
- *
- * @exception IOException If an error occurs
- */
+ /**
+ * Joins the specified mulitcast group.
+ *
+ * @param addr The address of the group to join
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkMulticast method doesn't allow the operation
+ */
public void joinGroup(InetAddress mcastaddr) throws IOException
{
if (! mcastaddr.isMulticastAddress())
@@ -204,13 +323,15 @@ public class MulticastSocket extends DatagramSocket
impl.join(mcastaddr);
}
-/**
- * Leaves the specified multicast group
- *
- * @param addr The address of the group to leave
- *
- * @exception IOException If an error occurs
- */
+ /**
+ * Leaves the specified multicast group
+ *
+ * @param addr The address of the group to leave
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkMulticast method doesn't allow the operation
+ */
public void leaveGroup(InetAddress mcastaddr) throws IOException
{
if (! mcastaddr.isMulticastAddress())
@@ -223,16 +344,86 @@ public class MulticastSocket extends DatagramSocket
impl.leave(mcastaddr);
}
-/**
- * Sends a packet of data to a multicast address with a TTL that is
- * different from the default TTL on this socket. The default TTL for
- * the socket is not changed.
- *
- * @param packet The packet of data to send
- * @param ttl The TTL for this packet
- *
- * @exception IOException If an error occurs
- */
+ /**
+ * Joins the specified mulitcast group on a specified interface.
+ *
+ * @param mcastaddr The multicast address to join
+ * @param netIf The local network interface to receive the multicast
+ * messages on or null to defer the interface set by #setInterface or
+ * #setNetworkInterface
+ *
+ * @exception IOException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ * @exception SecurityException If a security manager exists and its
+ * checkMulticast method doesn't allow the operation
+ *
+ * @see MulticastSocket:setInterface
+ * @see MulticastSocket:setNetworkInterface
+ *
+ * @since 1.4
+ */
+ public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
+ throws IOException
+ {
+ if (! (mcastaddr instanceof InetSocketAddress))
+ throw new IllegalArgumentException ("SocketAddress type not supported");
+
+ InetSocketAddress tmp = (InetSocketAddress) mcastaddr;
+
+ if (! tmp.getAddress ().isMulticastAddress ())
+ throw new IOException ("Not a Multicast address");
+
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkMulticast (tmp.getAddress ());
+
+ impl.joinGroup (mcastaddr, netIf);
+ }
+
+ /**
+ * Leaves the specified mulitcast group on a specified interface.
+ *
+ * @param mcastaddr The multicast address to leave
+ * @param netIf The local networki interface or null to defer to the
+ * interface set by setInterface or setNetworkInterface
+ *
+ * @exception IOException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ * @exception SecurityException If a security manager exists and its
+ * checkMulticast method doesn't allow the operation
+ *
+ * @see MulticastSocket:setInterface
+ * @see MulticastSocket:setNetworkInterface
+ *
+ * @since 1.4
+ */
+ public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
+ throws IOException
+ {
+ InetSocketAddress tmp = (InetSocketAddress) mcastaddr;
+
+ if (! tmp.getAddress ().isMulticastAddress ())
+ throw new IOException ("Not a Multicast address");
+
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkMulticast (tmp.getAddress ());
+
+ impl.leaveGroup (mcastaddr, netIf);
+ }
+
+ /**
+ * Sends a packet of data to a multicast address with a TTL that is
+ * different from the default TTL on this socket. The default TTL for
+ * the socket is not changed.
+ *
+ * @param packet The packet of data to send
+ * @param ttl The TTL for this packet
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect or checkMulticast method doesn't allow the operation
+ */
public synchronized void send(DatagramPacket p, byte ttl) throws IOException
{
SecurityManager s = System.getSecurityManager();
diff --git a/libjava/java/net/NetPermission.java b/libjava/java/net/NetPermission.java
index 14732dea49c..f5b625a0d6f 100644
--- a/libjava/java/net/NetPermission.java
+++ b/libjava/java/net/NetPermission.java
@@ -50,6 +50,8 @@ import java.security.BasicPermission;
public final class NetPermission extends BasicPermission
implements java.io.Serializable
{
+ static final long serialVersionUID = -8343910153355041693L;
+
/**
* Initializes a new instance of <code>NetPermission</code> with the
* specified name.
diff --git a/libjava/java/net/NetworkInterface.java b/libjava/java/net/NetworkInterface.java
new file mode 100644
index 00000000000..60a7d764cbc
--- /dev/null
+++ b/libjava/java/net/NetworkInterface.java
@@ -0,0 +1,237 @@
+/* NetworkInterface.java
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.net;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.4
+ */
+public final class NetworkInterface
+{
+ private static Vector networkInterfaces;
+
+ private String name;
+
+ private Vector inetAddresses;
+
+ private NetworkInterface (String name, InetAddress address)
+ {
+ this.name = name;
+ this.inetAddresses = new Vector (1, 1);
+ this.inetAddresses.add (address);
+ }
+
+ private native static Vector getRealNetworkInterfaces ()
+ throws SocketException;
+
+ /**
+ * Returns the name of the network interface
+ */
+ public String getName ()
+ {
+ return name;
+ }
+
+ /**
+ * Returns all available addresses of the network interface
+ *
+ * If a @see SecurityManager is available all addresses are checked
+ * with @see SecurityManager::checkConnect() if they are available.
+ * Only InetAddresses are returned where the security manager doesn't
+ * thrown an exception.
+ *
+ * @return An enumeration of all addresses.
+ */
+ public Enumeration getInetAddresses ()
+ {
+ SecurityManager s = System.getSecurityManager ();
+
+ if (s == null)
+ return inetAddresses.elements ();
+
+ Vector tmpInetAddresses = new Vector (1, 1);
+
+ for (Enumeration addresses = inetAddresses.elements ();
+ addresses.hasMoreElements (); )
+ {
+ InetAddress addr = (InetAddress) addresses.nextElement ();
+ try
+ {
+ s.checkConnect (addr.getHostAddress (), 58000);
+ tmpInetAddresses.add (addr);
+ }
+ catch (SecurityException e)
+ {
+ }
+ }
+
+ return tmpInetAddresses.elements ();
+ }
+
+ /**
+ * Returns the display name of the interface
+ */
+ public String getDisplayName ()
+ {
+ return name;
+ }
+
+ /**
+ * Returns an network interface by name
+ *
+ * @param name The name of the interface to return
+ *
+ * @exception SocketException If an error occurs
+ * @exception NullPointerException If the specified name is null
+ */
+ public static NetworkInterface getByName (String name)
+ throws SocketException
+ {
+ if (networkInterfaces == null)
+ networkInterfaces = getRealNetworkInterfaces ();
+
+ for (Enumeration e = networkInterfaces.elements ();
+ e.hasMoreElements (); )
+ {
+ NetworkInterface tmp = (NetworkInterface) e.nextElement ();
+
+ if (name.equals (tmp.getName ()))
+ return tmp;
+ }
+
+ throw new SocketException ("no network interface with this name exists");
+ }
+
+ /**
+ * Return a network interface by its address
+ *
+ * @param addr The address of the interface to return
+ *
+ * @exception SocketException If an error occurs
+ * @exception NullPointerException If the specified addess is null
+ */
+ public static NetworkInterface getByInetAddress (InetAddress addr)
+ throws SocketException
+ {
+ if (networkInterfaces == null)
+ networkInterfaces = getRealNetworkInterfaces ();
+
+ for (Enumeration interfaces = networkInterfaces.elements ();
+ interfaces.hasMoreElements (); )
+ {
+ NetworkInterface tmp = (NetworkInterface) interfaces.nextElement ();
+
+ for (Enumeration addresses = tmp.inetAddresses.elements ();
+ addresses.hasMoreElements (); )
+ {
+ if (addr.equals ((InetAddress) addresses.nextElement ()))
+ return tmp;
+ }
+ }
+
+ throw new SocketException (
+ "no network interface is bound to such an IP address");
+ }
+
+ /**
+ * Return an Enumeration of all available network interfaces
+ *
+ * @exception SocketException If an error occurs
+ */
+ public static Enumeration getNetworkInterfaces ()
+ throws SocketException
+ {
+ if (networkInterfaces == null)
+ networkInterfaces = getRealNetworkInterfaces ();
+
+ Enumeration tmp = networkInterfaces.elements ();
+ if (tmp.hasMoreElements ())
+ return tmp;
+
+ return null;
+ }
+
+ /**
+ * Checks if the current instance is equal to obj
+ *
+ * @param obj The object to compare with
+ */
+ public boolean equals (Object obj)
+ {
+ if (!(obj instanceof NetworkInterface))
+ return false;
+
+ NetworkInterface tmp = (NetworkInterface) obj;
+ return name.equals (tmp.name) &&
+ inetAddresses.equals (tmp.inetAddresses);
+ }
+
+ /**
+ * Returns the hashcode of the current instance
+ */
+ public int hashCode ()
+ {
+ // FIXME: hash correctly
+ return name.hashCode () + inetAddresses.hashCode ();
+ }
+
+ /**
+ * Returns a string representation of the interface
+ */
+ public String toString ()
+ {
+ // FIXME: check if this is correct
+ String result;
+ String separator = System.getProperty ("line.separator");
+
+ result = "name: " + getDisplayName () + " (" + getName () +
+ ") addresses:" + separator;
+
+ for (Enumeration e = inetAddresses.elements ();
+ e.hasMoreElements (); )
+ {
+ InetAddress address = (InetAddress) e.nextElement ();
+ result += address.toString () + separator;
+ }
+
+ return result;
+ }
+} // class NetworkInterface
diff --git a/libjava/java/net/PasswordAuthentication.java b/libjava/java/net/PasswordAuthentication.java
index e6d87a5431c..0c4faa54398 100644
--- a/libjava/java/net/PasswordAuthentication.java
+++ b/libjava/java/net/PasswordAuthentication.java
@@ -41,6 +41,7 @@ package java.net;
* This class serves a container for username/password pairs.
*
* @author Aaron M. Renn (arenn@urbanophile.com)
+ * @since 1.2
*/
public final class PasswordAuthentication
{
diff --git a/libjava/java/net/PlainDatagramSocketImpl.java b/libjava/java/net/PlainDatagramSocketImpl.java
index 55ea468dadc..118021d189f 100644
--- a/libjava/java/net/PlainDatagramSocketImpl.java
+++ b/libjava/java/net/PlainDatagramSocketImpl.java
@@ -1,6 +1,6 @@
// PlainDatagramSocketImpl.java - Implementation of DatagramSocketImpl.
-/* Copyright (C) 1999 Free Software Foundation
+/* Copyright (C) 1999, 2002 Free Software Foundation
This file is part of libgcj.
@@ -29,11 +29,17 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
static final int _Jv_TCP_NODELAY_ = SocketOptions.TCP_NODELAY,
_Jv_SO_BINDADDR_ = SocketOptions.SO_BINDADDR,
_Jv_SO_REUSEADDR_ = SocketOptions.SO_REUSEADDR,
- _Jv_IP_MULTICAST_IF_ = SocketOptions.IP_MULTICAST_IF,
+ _Jv_SO_BROADCAST_ = SocketOptions.SO_BROADCAST,
+ _Jv_SO_OOBINLINE_ = SocketOptions.SO_OOBINLINE,
+ _Jv_IP_MULTICAST_IF_ = SocketOptions.IP_MULTICAST_IF,
+ _Jv_IP_MULTICAST_IF2_ = SocketOptions.IP_MULTICAST_IF2,
+ _Jv_IP_MULTICAST_LOOP_ = SocketOptions.IP_MULTICAST_LOOP,
+ _Jv_IP_TOS_ = SocketOptions.IP_TOS,
_Jv_SO_LINGER_ = SocketOptions.SO_LINGER,
_Jv_SO_TIMEOUT_ = SocketOptions.SO_TIMEOUT,
_Jv_SO_SNDBUF_ = SocketOptions.SO_SNDBUF,
- _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF;
+ _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF,
+ _Jv_SO_KEEPALIVE_ = SocketOptions.SO_KEEPALIVE;
int fnum = -1;
@@ -57,16 +63,20 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
protected native void bind(int lport, InetAddress laddr)
throws SocketException;
+ protected native void connect (InetAddress i, int port)
+ throws SocketException;
+ protected native void disconnect ();
protected native void create() throws SocketException;
protected native int peek(InetAddress i) throws IOException;
+ protected native int peekData (DatagramPacket dp) throws IOException;
protected native void setTimeToLive(int ttl) throws IOException;
protected native int getTimeToLive() throws IOException;
protected native void send(DatagramPacket p) throws IOException;
protected native void receive(DatagramPacket p) throws IOException;
public native void setOption(int optID, Object value) throws SocketException;
public native Object getOption(int optID) throws SocketException;
- private native void mcastGrp(InetAddress inetaddr, boolean join)
- throws IOException;
+ private native void mcastGrp(InetAddress inetaddr, NetworkInterface netIf,
+ boolean join) throws IOException;
protected native void close();
// Deprecated in JDK 1.2.
@@ -83,12 +93,24 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
protected void join(InetAddress inetaddr) throws IOException
{
- mcastGrp(inetaddr, true);
+ mcastGrp(inetaddr, null, true);
}
protected void leave(InetAddress inetaddr) throws IOException
{
- mcastGrp(inetaddr, false);
+ mcastGrp(inetaddr, null, false);
+ }
+
+ protected void joinGroup (SocketAddress mcastaddr, NetworkInterface netIf)
+ throws IOException
+ {
+ mcastGrp(((InetSocketAddress)mcastaddr).getAddress(), netIf, true);
+ }
+
+ protected void leaveGroup (SocketAddress mcastaddr, NetworkInterface netIf)
+ throws IOException
+ {
+ mcastGrp(((InetSocketAddress)mcastaddr).getAddress(), netIf, false);
}
protected void finalize() throws Throwable
diff --git a/libjava/java/net/PlainSocketImpl.java b/libjava/java/net/PlainSocketImpl.java
index 354d652a5bf..2b65ba08002 100644
--- a/libjava/java/net/PlainSocketImpl.java
+++ b/libjava/java/net/PlainSocketImpl.java
@@ -28,11 +28,17 @@ class PlainSocketImpl extends SocketImpl
static final int _Jv_TCP_NODELAY_ = SocketOptions.TCP_NODELAY,
_Jv_SO_BINDADDR_ = SocketOptions.SO_BINDADDR,
_Jv_SO_REUSEADDR_ = SocketOptions.SO_REUSEADDR,
- _Jv_IP_MULTICAST_IF_ = SocketOptions.IP_MULTICAST_IF,
+ _Jv_SO_BROADCAST_ = SocketOptions.SO_BROADCAST,
+ _Jv_SO_OOBINLINE_ = SocketOptions.SO_OOBINLINE,
+ _Jv_IP_MULTICAST_IF_ = SocketOptions.IP_MULTICAST_IF,
+ _Jv_IP_MULTICAST_IF2_ = SocketOptions.IP_MULTICAST_IF2,
+ _Jv_IP_MULTICAST_LOOP_ = SocketOptions.IP_MULTICAST_LOOP,
+ _Jv_IP_TOS_ = SocketOptions.IP_TOS,
_Jv_SO_LINGER_ = SocketOptions.SO_LINGER,
_Jv_SO_TIMEOUT_ = SocketOptions.SO_TIMEOUT,
_Jv_SO_SNDBUF_ = SocketOptions.SO_SNDBUF,
- _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF;
+ _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF,
+ _Jv_SO_KEEPALIVE_ = SocketOptions.SO_KEEPALIVE;
/**
* The OS file handle representing the socket.
@@ -53,14 +59,23 @@ class PlainSocketImpl extends SocketImpl
public native Object getOption(int optID) throws SocketException;
+ public native void shutdownInput () throws IOException;
+
+ public native void shutdownOutput () throws IOException;
+
protected native void create (boolean stream) throws IOException;
protected void connect (String host, int port) throws IOException
{
- connect(InetAddress.getByName(host), port);
+ connect (new InetSocketAddress (InetAddress.getByName(host), port), 0);
+ }
+
+ protected void connect (InetAddress host, int port) throws IOException
+ {
+ connect (new InetSocketAddress (host, port), 0);
}
- protected native void connect (InetAddress host, int port)
+ protected native void connect (SocketAddress addr, int timeout)
throws IOException;
protected native void bind (InetAddress host, int port) throws IOException;
@@ -78,6 +93,8 @@ class PlainSocketImpl extends SocketImpl
protected native void close () throws IOException;
+ protected native void sendUrgentData(int data)
+ throws IOException;
// Stream handling.
diff --git a/libjava/java/net/ServerSocket.java b/libjava/java/net/ServerSocket.java
index f383c448e94..b7c69913a05 100644
--- a/libjava/java/net/ServerSocket.java
+++ b/libjava/java/net/ServerSocket.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.net;
import java.io.IOException;
+import java.nio.channels.IllegalBlockingModeException;
+import java.nio.channels.ServerSocketChannel;
/* Written using on-line Java Platform 1.2 API Specification.
* Status: I believe all methods are implemented.
@@ -49,7 +51,7 @@ import java.io.IOException;
* listens for and accepts connections. At that point the client and
* server sockets are ready to communicate with one another utilizing
* whatever application layer protocol they desire.
- * <p>
+ *
* As with the <code>Socket</code> class, most instance methods of this class
* simply redirect their calls to an implementation class.
*
@@ -75,9 +77,19 @@ public class ServerSocket
private SocketImpl impl;
/**
- * Private constructor that simply sets the implementation.
+ * ServerSocketChannel of this ServerSocket. This channel only exists
+ * when the socket is created by ServerSocketChannel.open().
+ */
+ private ServerSocketChannel ch;
+
+ /**
+ * Constructor that simply sets the implementation.
+ *
+ * @exception IOException If an error occurs
+ *
+ * @specnote This constructor is public since JDK 1.4
*/
- private ServerSocket()
+ public ServerSocket() throws IOException
{
if (factory != null)
impl = factory.createSocketImpl();
@@ -93,9 +105,11 @@ public class ServerSocket
* @param port The port number to bind to
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
*/
public ServerSocket (int port)
- throws java.io.IOException
+ throws IOException
{
this(port, 50);
}
@@ -110,9 +124,11 @@ public class ServerSocket
* @param backlog The length of the pending connection queue
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
*/
public ServerSocket (int port, int backlog)
- throws java.io.IOException
+ throws IOException
{
this(port, backlog, null);
}
@@ -129,9 +145,13 @@ public class ServerSocket
* @param bindAddr The address to bind to, or null to bind to all addresses
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ *
+ * @since 1.1
*/
public ServerSocket (int port, int backlog, InetAddress bindAddr)
- throws java.io.IOException
+ throws IOException
{
this();
if (impl == null)
@@ -150,13 +170,81 @@ public class ServerSocket
}
/**
+ * Binds the server socket to a specified socket address
+ *
+ * @param endpoint The socket address to bind to
+ *
+ * @exception IOException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ *
+ * @since 1.4
+ */
+ public void bind (SocketAddress endpoint)
+ throws IOException
+ {
+ if (impl == null)
+ throw new IOException ("Cannot initialize Socket implementation");
+
+ if (! (endpoint instanceof InetSocketAddress))
+ throw new IllegalArgumentException ("Address type not supported");
+
+ InetSocketAddress tmp = (InetSocketAddress) endpoint;
+
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkListen (tmp.getPort ());
+
+ impl.bind (tmp.getAddress (), tmp.getPort ());
+ }
+
+ /**
+ * Binds the server socket to a specified socket address
+ *
+ * @param endpoint The socket address to bind to
+ * @param backlog The length of the pending connection queue
+ *
+ * @exception IOException If an error occurs
+ * @exception IllegalArgumentException If address type is not supported
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ *
+ * @since 1.4
+ */
+ public void bind (SocketAddress endpoint, int backlog) throws IOException
+ {
+ if (impl == null)
+ throw new IOException ("Cannot initialize Socket implementation");
+
+ if (! (endpoint instanceof InetSocketAddress))
+ throw new IllegalArgumentException ("Address type not supported");
+
+ InetSocketAddress tmp = (InetSocketAddress) endpoint;
+
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkListen (tmp.getPort ());
+
+ impl.bind (tmp.getAddress (), tmp.getPort ());
+ impl.listen(backlog);
+ }
+
+ /**
* This method returns the local address to which this socket is bound
*
* @return The socket's local address
*/
public InetAddress getInetAddress()
{
- return impl.getInetAddress();
+ try
+ {
+ return (InetAddress) impl.getOption (SocketOptions.SO_BINDADDR);
+ }
+ catch (SocketException e)
+ {
+ return null;
+ }
}
/**
@@ -170,14 +258,42 @@ public class ServerSocket
}
/**
+ * Returns the local socket address
+ *
+ * @since 1.4
+ */
+ public SocketAddress getLocalSocketAddress()
+ {
+ InetAddress addr = getInetAddress();
+
+ if (addr != null)
+ return new InetSocketAddress (getInetAddress(), getLocalPort());
+
+ return null;
+ }
+
+ /**
* Accepts a new connection and returns a connected <code>Socket</code>
* instance representing that connection. This method will block until a
* connection is available.
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkListen method doesn't allow the operation
+ * @exception IllegalBlockingModeException If this socket has an associated
+ * channel, and the channel is in non-blocking mode
+ * @exception SocketTimeoutException If a timeout was previously set with
+ * setSoTimeout and the timeout has been reached
*/
- public Socket accept () throws IOException
+ public Socket accept () throws IOException
{
+ if (impl == null)
+ throw new IOException ("Cannot initialize Socket implementation");
+
+ SecurityManager sm = System.getSecurityManager ();
+ if (sm != null)
+ sm.checkListen (impl.getLocalPort ());
+
Socket s = new Socket();
implAccept (s);
@@ -192,9 +308,17 @@ public class ServerSocket
* @param socket The socket that is used for the accepted connection
*
* @exception IOException If an error occurs
+ * @exception IllegalBlockingModeException If this socket has an associated
+ * channel, and the channel is in non-blocking mode
+ *
+ * @since 1.1
*/
- protected final void implAccept (Socket s) throws IOException
+ protected final void implAccept (Socket s)
+ throws IOException
{
+ if (ch != null && !ch.isBlocking())
+ throw new IllegalBlockingModeException();
+
impl.accept(s.impl);
}
@@ -209,6 +333,50 @@ public class ServerSocket
}
/**
+ * Returns the unique ServerSocketChannel object
+ * associated with this socket, if any.
+ *
+ * The socket only has a ServerSocketChannel if its created
+ * by ServerSocketChannel.open.
+ *
+ * @since 1.4
+ */
+ public ServerSocketChannel getChannel()
+ {
+ return ch;
+ }
+
+ /**
+ * Returns true then the socket is bound, otherwise false
+ *
+ * @since 1.4
+ */
+ public boolean isBound()
+ {
+ try
+ {
+ Object bindaddr = impl.getOption (SocketOptions.SO_BINDADDR);
+ }
+ catch (SocketException e)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns true if the socket is closed, otherwise false
+ *
+ * @since 1.4
+ */
+ public boolean isClosed()
+ {
+ // FIXME: implement this
+ return false;
+ }
+
+ /**
* Sets the value of SO_TIMEOUT. A value of 0 implies that SO_TIMEOUT is
* disabled (ie, operations never time out). This is the number of
* milliseconds a socket operation can block before an
@@ -216,7 +384,9 @@ public class ServerSocket
*
* @param timeout The new SO_TIMEOUT value
*
- * @exception IOException If an error occurs
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.1
*/
public void setSoTimeout (int timeout) throws SocketException
{
@@ -235,6 +405,8 @@ public class ServerSocket
* @return The value of SO_TIMEOUT
*
* @exception IOException If an error occurs
+ *
+ * @since 1.1
*/
public int getSoTimeout () throws IOException
{
@@ -247,13 +419,99 @@ public class ServerSocket
}
/**
+ * Enables/Disables the SO_REUSEADDR option
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void setReuseAddress (boolean on)
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ impl.setOption (SocketOptions.SO_REUSEADDR, new Boolean (on));
+ }
+
+ /**
+ * Checks if the SO_REUSEADDR option is enabled
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public boolean getReuseAddress()
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ Object reuseaddr = impl.getOption (SocketOptions.SO_REUSEADDR);
+
+ if (!(reuseaddr instanceof Boolean))
+ throw new SocketException ("Internal Error");
+
+ return ((Boolean) reuseaddr).booleanValue ();
+ }
+
+ /**
+ * This method sets the value for the system level socket option
+ * SO_RCVBUF to the specified value. Note that valid values for this
+ * option are specific to a given operating system.
+ *
+ * @param size The new receive buffer size.
+ *
+ * @exception SocketException If an error occurs or Socket is not connected
+ * @exception IllegalArgumentException If size is 0 or negative
+ *
+ * @since 1.4
+ */
+ public void setReceiveBufferSize (int size)
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Not connected");
+
+ if (size <= 0)
+ throw new IllegalArgumentException ("SO_RCVBUF value must be > 0");
+
+ impl.setOption (SocketOptions.SO_RCVBUF, new Integer (size));
+ }
+
+ /**
+ * This method returns the value of the system level socket option
+ * SO_RCVBUF, which is used by the operating system to tune buffer
+ * sizes for data transfers.
+ *
+ * @return The receive buffer size.
+ *
+ * @exception SocketException If an error occurs or Socket is not connected
+ *
+ * @since 1.4
+ */
+ public int getReceiveBufferSize ()
+ throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Not connected");
+
+ Object buf = impl.getOption (SocketOptions.SO_RCVBUF);
+
+ if (!(buf instanceof Integer))
+ throw new SocketException ("Internal Error: Unexpected type");
+
+ return ((Integer) buf).intValue ();
+ }
+
+ /**
* Returns the value of this socket as a <code>String</code>.
*
* @return This socket represented as a <code>String</code>.
*/
public String toString ()
{
- return "ServerSocket " + impl.toString();
+ return "ServerSocket" + impl.toString();
}
// Class methods
diff --git a/libjava/java/net/Socket.java b/libjava/java/net/Socket.java
index aa929b0b683..b900801a16b 100644
--- a/libjava/java/net/Socket.java
+++ b/libjava/java/net/Socket.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.net;
import java.io.*;
+import java.nio.channels.SocketChannel;
+import java.nio.channels.IllegalBlockingModeException;
/* Written using on-line Java Platform 1.2 API Specification.
* Status: I believe all methods are implemented.
@@ -78,19 +80,29 @@ public class Socket
*/
SocketImpl impl;
+ private boolean inputShutdown;
+ private boolean outputShutdown;
+
+ SocketChannel ch; // this field must have been set if created by SocketChannel
+
// Constructors
/**
* Initializes a new instance of <code>Socket</code> object without
* connecting to a remote host. This useful for subclasses of socket that
* might want this behavior.
+ *
+ * @specnote This constructor is public since JDK 1.4
*/
- protected Socket ()
+ public Socket ()
{
if (factory != null)
impl = factory.createSocketImpl();
else
impl = new PlainSocketImpl();
+
+ inputShutdown = false;
+ outputShutdown = false;
}
/**
@@ -112,6 +124,8 @@ public class Socket
protected Socket (SocketImpl impl) throws SocketException
{
this.impl = impl;
+ this.inputShutdown = false;
+ this.outputShutdown = false;
}
/**
@@ -124,6 +138,8 @@ public class Socket
* @exception UnknownHostException If the hostname cannot be resolved to a
* network address.
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
*/
public Socket (String host, int port)
throws UnknownHostException, IOException
@@ -139,6 +155,8 @@ public class Socket
* @param port The port number to connect to
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
*/
public Socket (InetAddress address, int port)
throws IOException
@@ -178,6 +196,8 @@ public class Socket
* @param localPort The local port to connect to
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
*/
public Socket (InetAddress address, int port,
InetAddress localAddr, int localPort) throws IOException
@@ -197,6 +217,8 @@ public class Socket
* for a datagram socket
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
*
* @deprecated Use the <code>DatagramSocket</code> class to create
* datagram oriented sockets.
@@ -218,6 +240,8 @@ public class Socket
* <code>false</code> to create a datagram socket.
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
*
* @deprecated Use the <code>DatagramSocket</code> class to create
* datagram oriented sockets.
@@ -241,11 +265,16 @@ public class Socket
* @param stream true for a stream socket, false for a datagram socket
*
* @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
*/
private Socket(InetAddress raddr, int rport, InetAddress laddr, int lport,
boolean stream) throws IOException
{
this();
+ this.inputShutdown = false;
+ this.outputShutdown = false;
+
if (impl == null)
throw new IOException("Cannot initialize Socket implementation");
@@ -266,6 +295,78 @@ public class Socket
}
/**
+ * Binds the socket to the givent local address/port
+ *
+ * @param bindpoint The address/port to bind to
+ *
+ * @exception IOException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkConnect method doesn't allow the operation
+ * @exception IllegalArgumentException If the address type is not supported
+ *
+ * @since 1.4
+ */
+ public void bind (SocketAddress bindpoint) throws IOException
+ {
+ if ( !(bindpoint instanceof InetSocketAddress))
+ throw new IllegalArgumentException ();
+
+ InetSocketAddress tmp = (InetSocketAddress) bindpoint;
+ impl.bind (tmp.getAddress(), tmp.getPort());
+ }
+
+ /**
+ * Connects the socket with a remote address.
+ *
+ * @param endpoint The address to connect to
+ *
+ * @exception IOException If an error occurs
+ * @exception IllegalArgumentException If the addess type is not supported
+ * @exception IllegalBlockingModeException If this socket has an associated
+ * channel, and the channel is in non-blocking mode
+ *
+ * @since 1.4
+ */
+ public void connect (SocketAddress endpoint)
+ throws IOException
+ {
+ if (! (endpoint instanceof InetSocketAddress))
+ throw new IllegalArgumentException ("Address type not supported");
+
+ if (ch != null && !ch.isBlocking ())
+ throw new IllegalBlockingModeException ();
+
+ impl.connect (endpoint, 0);
+ }
+
+ /**
+ * Connects the socket with a remote address. A timeout of zero is
+ * interpreted as an infinite timeout. The connection will then block
+ * until established or an error occurs.
+ *
+ * @param endpoint The address to connect to
+ *
+ * @exception IOException If an error occurs
+ * @exception IllegalArgumentException If the address type is not supported
+ * @exception IllegalBlockingModeException If this socket has an associated
+ * channel, and the channel is in non-blocking mode
+ * @exception SocketTimeoutException If the timeout is reached
+ *
+ * @since 1.4
+ */
+ public void connect (SocketAddress endpoint, int timeout)
+ throws IOException
+ {
+ if (! (endpoint instanceof InetSocketAddress))
+ throw new IllegalArgumentException ("Address type not supported");
+
+ if (ch != null && !ch.isBlocking ())
+ throw new IllegalBlockingModeException ();
+
+ impl.connect (endpoint, timeout);
+ }
+
+ /**
* Returns the address of the remote end of the socket. If this socket
* is not connected, then <code>null</code> is returned.
*
@@ -344,6 +445,36 @@ public class Socket
}
/**
+ * If the socket is already bound this returns the local SocketAddress,
+ * otherwise null
+ *
+ * @since 1.4
+ */
+ public SocketAddress getLocalSocketAddress()
+ {
+ InetAddress addr = getLocalAddress ();
+
+ if (addr == null)
+ return null;
+
+ return new InetSocketAddress (addr, impl.getLocalPort());
+ }
+
+ /**
+ * If the socket is already connected this returns the remote SocketAddress,
+ * otherwise null
+ *
+ * @since 1.4
+ */
+ public SocketAddress getRemoteSocketAddress()
+ {
+ if (!isConnected ())
+ return null;
+
+ return new InetSocketAddress (impl.getInetAddress (), impl.getPort ());
+ }
+
+ /**
* Returns an InputStream for reading from this socket.
*
* @return The InputStream object
@@ -424,6 +555,7 @@ public class Socket
* SO_LINGER not set.
*
* @exception SocketException If an error occurs or Socket not connected
+ * @exception IllegalArgumentException If linger is negative
*/
public void setSoLinger(boolean on, int linger) throws SocketException
{
@@ -473,6 +605,58 @@ public class Socket
}
/**
+ * Sends urgent data through the socket
+ *
+ * @param data The data to send.
+ * Only the lowest eight bits of data are sent
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void sendUrgentData (int data) throws IOException
+ {
+ impl.sendUrgentData (data);
+ }
+
+ /**
+ * Enables/disables the SO_OOBINLINE option
+ *
+ * @param on True if SO_OOBLINE should be enabled
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void setOOBInline (boolean on) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException("Not connected");
+
+ impl.setOption(SocketOptions.SO_OOBINLINE, new Boolean(on));
+ }
+
+ /**
+ * Returns the current setting of the SO_OOBINLINE option for this socket
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public boolean getOOBInline () throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException("Not connected");
+
+ Object buf = impl.getOption(SocketOptions.SO_OOBINLINE);
+
+ if (buf instanceof Boolean)
+ return(((Boolean)buf).booleanValue());
+ else
+ throw new SocketException("Internal Error: Unexpected type");
+ }
+
+ /**
* Sets the value of the SO_TIMEOUT option on the socket. If this value
* is set, and an read/write is performed that does not complete within
* the timeout period, a short count is returned (or an EWOULDBLOCK signal
@@ -533,8 +717,9 @@ public class Socket
* @param size The new send buffer size.
*
* @exception SocketException If an error occurs or Socket not connected
+ * @exception IllegalArgumentException If size is 0 or negative
*
- * @since Java 1.2
+ * @since 1.2
*/
public void setSendBufferSize (int size) throws SocketException
{
@@ -556,7 +741,7 @@ public class Socket
*
* @exception SocketException If an error occurs or socket not connected
*
- * @since Java 1.2
+ * @since 1.2
*/
public int getSendBufferSize () throws SocketException
{
@@ -579,8 +764,9 @@ public class Socket
* @param size The new receive buffer size.
*
* @exception SocketException If an error occurs or Socket is not connected
+ * @exception IllegalArgumentException If size is 0 or negative
*
- * @since Java 1.2
+ * @since 1.2
*/
public void setReceiveBufferSize (int size) throws SocketException
{
@@ -602,7 +788,7 @@ public class Socket
*
* @exception SocketException If an error occurs or Socket is not connected
*
- * @since Java 1.2
+ * @since 1.2
*/
public int getReceiveBufferSize () throws SocketException
{
@@ -618,6 +804,47 @@ public class Socket
}
/**
+ * This method sets the value for the socket level socket option
+ * SO_KEEPALIVE.
+ *
+ * @param on True if SO_KEEPALIVE should be enabled
+ *
+ * @exception SocketException If an error occurs or Socket is not connected
+ *
+ * @since Java 1.3
+ */
+ public void setKeepAlive (boolean on) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException("Not connected");
+
+ impl.setOption(SocketOptions.SO_KEEPALIVE, new Boolean(on));
+ }
+
+ /**
+ * This method returns the value of the socket level socket option
+ * SO_KEEPALIVE.
+ *
+ * @return The setting
+ *
+ * @exception SocketException If an error occurs or Socket is not connected
+ *
+ * @since Java 1.3
+ */
+ public boolean getKeepAlive () throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException("Not connected");
+
+ Object buf = impl.getOption(SocketOptions.SO_KEEPALIVE);
+
+ if (buf instanceof Boolean)
+ return(((Boolean)buf).booleanValue());
+ else
+ throw new SocketException("Internal Error: Unexpected type");
+ }
+
+ /**
* Closes the socket.
*
* @exception IOException If an error occurs
@@ -667,4 +894,161 @@ public class Socket
factory = fac;
}
+
+ /**
+ * Closes the input side of the socket stream.
+ *
+ * @exception IOException If an error occurs.
+ */
+ public void shutdownInput() throws IOException
+ {
+ if (impl != null)
+ impl.shutdownInput();
+
+ inputShutdown = true;
+ }
+
+ /**
+ * Closes the output side of the socket stream.
+ *
+ * @exception IOException If an error occurs.
+ */
+ public void shutdownOutput() throws IOException
+ {
+ if (impl != null)
+ impl.shutdownOutput();
+
+ outputShutdown = true;
+ }
+
+ /**
+ * Returns the socket channel associated with this socket.
+ *
+ * It returns null if no associated socket exists.
+ */
+ public SocketChannel getChannel()
+ {
+ return ch;
+ }
+
+ /**
+ * Checks if the SO_REUSEADDR option is enabled
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public boolean getReuseAddress () throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ Object reuseaddr = impl.getOption (SocketOptions.SO_REUSEADDR);
+
+ if (!(reuseaddr instanceof Boolean))
+ throw new SocketException ("Internal Error");
+
+ return ((Boolean) reuseaddr).booleanValue ();
+ }
+
+ /**
+ * Enables/Disables the SO_REUSEADDR option
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @since 1.4
+ */
+ public void setReuseAddress (boolean on) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ impl.setOption (SocketOptions.SO_REUSEADDR, new Boolean (on));
+ }
+
+ /**
+ * Returns the current traffic class
+ *
+ * @exception SocketException If an error occurs
+ *
+ * @see Socket:setTrafficClass
+ *
+ * @since 1.4
+ */
+ public int getTrafficClass () throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ Object obj = impl.getOption(SocketOptions.IP_TOS);
+
+ if (obj instanceof Integer)
+ return ((Integer) obj).intValue ();
+ else
+ throw new SocketException ("Unexpected type");
+ }
+
+ /**
+ * Sets the traffic class value
+ *
+ * @param tc The traffic class
+ *
+ * @exception SocketException If an error occurs
+ * @exception IllegalArgumentException If tc value is illegal
+ *
+ * @see Socket:getTrafficClass
+ *
+ * @since 1.4
+ */
+ public void setTrafficClass (int tc) throws SocketException
+ {
+ if (impl == null)
+ throw new SocketException ("Cannot initialize Socket implementation");
+
+ if (tc < 0 || tc > 255)
+ throw new IllegalArgumentException();
+
+ impl.setOption (SocketOptions.IP_TOS, new Integer (tc));
+ }
+
+ /**
+ * Checks if the socket is connected
+ */
+ public boolean isConnected ()
+ {
+ return impl.getInetAddress () != null;
+ }
+
+ /**
+ * Checks if the socket is already bound.
+ */
+ public boolean isBound ()
+ {
+ return getLocalAddress () != null;
+ }
+
+ /**
+ * Checks if the socket is closed.
+ */
+ public boolean isClosed ()
+ {
+ // FIXME: implement this.
+ return false;
+ }
+
+ /**
+ * Checks if the socket's input stream is shutdown
+ */
+ public boolean isInputShutdown ()
+ {
+ return inputShutdown;
+ }
+
+ /**
+ * Checks if the socket's output stream is shutdown
+ */
+ public boolean isOutputShutdown ()
+ {
+ return outputShutdown;
+ }
}
diff --git a/libjava/java/net/SocketAddress.java b/libjava/java/net/SocketAddress.java
index d37020b8e71..af20fba7bfa 100644
--- a/libjava/java/net/SocketAddress.java
+++ b/libjava/java/net/SocketAddress.java
@@ -47,8 +47,10 @@ import java.io.*;
public abstract class SocketAddress implements Serializable
{
- public SocketAddress()
- {
- }
+ static final long serialVersionUID = 5215720748342549866L;
+
+ public SocketAddress()
+ {
+ }
}
diff --git a/libjava/java/net/SocketImpl.java b/libjava/java/net/SocketImpl.java
index fb5a60ca520..795e7139bee 100644
--- a/libjava/java/net/SocketImpl.java
+++ b/libjava/java/net/SocketImpl.java
@@ -95,6 +95,8 @@ public abstract class SocketImpl implements SocketOptions
* if the stream parameter is false.
*
* @param stream true for a stream socket, false for a datagram socket
+ *
+ * @exception IOException If an error occurs
*/
protected abstract void create(boolean stream) throws IOException;
@@ -120,6 +122,21 @@ public abstract class SocketImpl implements SocketOptions
throws IOException;
/**
+ * Connects to the socket to the host specified in address. This
+ * method blocks until successful connected or the timeout occurs.
+ * A timeout of zero means no timout.
+ *
+ * @param address Data of remote host
+ * @param timeout time to wait to stop connecting
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.4
+ */
+ protected abstract void connect(SocketAddress address, int timeout)
+ throws IOException;
+
+ /**
* Binds to the specified port on the specified addr. Note that this addr
* must represent a local IP address.
* <p>
@@ -215,6 +232,31 @@ public abstract class SocketImpl implements SocketOptions
protected int getPort() { return port; }
/**
+ * Returns true or false when this socket supports sending urgent data
+ * or not.
+ *
+ * @since 1.4
+ */
+ protected boolean supportsUrgentData()
+ {
+ // This method has to be overwritten by socket classes that support
+ // sending urgend data.
+ return false;
+ }
+
+ /**
+ * Sends one byte of urgent data to the socket.
+ *
+ * @param data The byte to send, the low eight bits of it
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.4
+ */
+ protected abstract void sendUrgentData(int data)
+ throws IOException;
+
+ /**
* Returns the local port this socket is bound to
*
* @return The local port
@@ -264,4 +306,20 @@ public abstract class SocketImpl implements SocketOptions
* @XXX This redeclaration from SocketOptions is a workaround to a gcj bug.
*/
public abstract Object getOption(int option_id) throws SocketException;
+
+ /**
+ * Shut down the input side of this socket. Subsequent reads will
+ * return end-of-file.
+ *
+ * @exception IOException if an error occurs
+ */
+ protected abstract void shutdownInput () throws IOException;
+
+ /**
+ * Shut down the output side of this socket. Subsequent writes will
+ * fail with an IOException.
+ *
+ * @exception IOException if an error occurs
+ */
+ protected abstract void shutdownOutput () throws IOException;
}
diff --git a/libjava/java/net/SocketOptions.java b/libjava/java/net/SocketOptions.java
index 7dcba2a67a6..f62afef9aab 100644
--- a/libjava/java/net/SocketOptions.java
+++ b/libjava/java/net/SocketOptions.java
@@ -1,5 +1,5 @@
/* SocketOptions.java -- Implements options for sockets (duh!)
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,104 +43,125 @@ package java.net;
*/
/**
- * This interface is used by <code>SocketImpl</code> and
- * <code>DatagramSocketImpl</code> to implement options
- * on sockets.
- *
- * @since 1.2
- *
- * @author Aaron M. Renn (arenn@urbanophile.com)
- * @author Warren Levy <warrenl@cygnus.com>
- */
+ * This interface is used by <code>SocketImpl</code> and
+ * <code>DatagramSocketImpl</code> to implement options
+ * on sockets.
+ *
+ * @since 1.2
+ *
+ * @author Aaron M. Renn (arenn@urbanophile.com)
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @status should be completely JDK 1.4 compatible
+ */
public interface SocketOptions
{
-
-/*************************************************************************/
-
-/*
- * Static Variables
- */
-
-/**
- * Option id for the SO_LINGER value
- */
-static final int SO_LINGER = 0x80; // 128
-
-/**
- * Option id for the SO_TIMEOUT value
- */
-static final int SO_TIMEOUT = 0x1006; // 4102
-
-/**
- * Retrieve the local address to which the socket is bound.
- */
-static final int SO_BINDADDR = 0x0F; // 15
-
-/**
- * Option id for the send buffer size
- * @since 1.2
- */
-static final int SO_SNDBUF = 0x1001; // 4097
-
-/**
- * Option id for the receive buffer size
- * @since 1.2
- */
-static final int SO_RCVBUF = 0x1002; // 4098
-
-/**
- * Sets the SO_REUSEADDR parameter on a socket
- */
-static final int SO_REUSEADDR = 0x04; // 4
-
-/**
- * Option id for the TCP_NODELAY value
- */
-static final int TCP_NODELAY = 0x01; // 1
-
-/**
- * Options id for the IP_MULTICAST_IF value
- */
-static final int IP_MULTICAST_IF = 0x10; // 16
-
-/*************************************************************************/
-
-/*
- * Interface Methods
- */
-
-/**
- * Sets the specified option on a socket to the passed in object. For
- * options that take an integer argument, the passed in object is an
- * <code>Integer</code>. For options that are set to on or off, the
- * value passed will be a <code>Boolean</code>. The <code>option_id</code>
- * parameter is one of the defined constants in this interface.
- *
- * @param option_id The identifier of the option
- * @param val The value to set the option to
- *
- * @exception SocketException If an error occurs
- */
-void
-setOption(int option_id, Object val) throws SocketException;
-
-/*************************************************************************/
-
-/**
- * Returns the current setting of the specified option. The
- * <code>Object</code> returned will be an <code>Integer</code> for options
- * that have integer values. For options that are set to on or off, a
- * <code>Boolean</code> will be returned. The <code>option_id</code>
- * is one of the defined constants in this interface.
- *
- * @param option_id The option identifier
- *
- * @return The current value of the option
- *
- * @exception SocketException If an error occurs
- */
-Object
-getOption(int option_id) throws SocketException;
+ /**
+ * Option id for the SO_KEEPALIVE value
+ * @since 1.3
+ */
+ static final int SO_KEEPALIVE = 0x8;
+
+ /**
+ * Option id for the SO_LINGER value
+ */
+ static final int SO_LINGER = 0x80; // 128
+
+ /**
+ * Option id for the SO_TIMEOUT value
+ */
+ static final int SO_TIMEOUT = 0x1006; // 4102
+
+ /**
+ * Retrieve the local address to which the socket is bound.
+ */
+ static final int SO_BINDADDR = 0x0F; // 15
+
+ /**
+ * Option id for the send buffer size
+ * @since 1.2
+ */
+ static final int SO_SNDBUF = 0x1001; // 4097
+
+ /**
+ * Option id for the receive buffer size
+ * @since 1.2
+ */
+ static final int SO_RCVBUF = 0x1002; // 4098
+
+ /**
+ * Sets the SO_REUSEADDR parameter on a socket
+ */
+ static final int SO_REUSEADDR = 0x04; // 4
+
+ /**
+ * Sets SO_BROADCAST for a socket
+ * @since 1.4
+ */
+ static final int SO_BROADCAST = 0x20; // 32
+
+ /**
+ * Sets SO_OOBINLINE for a socket
+ * @since 1.4
+ */
+ static final int SO_OOBINLINE = 0x1003; // 4099
+
+ /**
+ * Option id for the TCP_NODELAY value
+ */
+ static final int TCP_NODELAY = 0x01; // 1
+
+ /**
+ * Options id for the IP_MULTICAST_IF value
+ */
+ static final int IP_MULTICAST_IF = 0x10; // 16
+
+ /**
+ * same as above
+ * @since 1.4
+ */
+ static final int IP_MULTICAST_IF2 = 0x1F; // 31
+
+ /**
+ * This option enables or disables local loopback of multicast datagrams.
+ * @since 1.4
+ */
+ static final int IP_MULTICAST_LOOP = 0x12; // 18
+
+ /**
+ * This option sets the type-of-service or traffic class field in the
+ * IP header for a TCP or UDP socket.
+ * @since 1.4
+ */
+ static final int IP_TOS = 0x03; // 3
+
+ /**
+ * Sets the specified option on a socket to the passed in object. For
+ * options that take an integer argument, the passed in object is an
+ * <code>Integer</code>. For options that are set to on or off, the
+ * value passed will be a <code>Boolean</code>. The <code>option_id</code>
+ * parameter is one of the defined constants in this interface.
+ *
+ * @param option_id The identifier of the option
+ * @param val The value to set the option to
+ *
+ * @exception SocketException If an error occurs
+ */
+ void setOption(int option_id, Object val) throws SocketException;
+
+ /**
+ * Returns the current setting of the specified option. The
+ * <code>Object</code> returned will be an <code>Integer</code> for options
+ * that have integer values. For options that are set to on or off, a
+ * <code>Boolean</code> will be returned. The <code>option_id</code>
+ * is one of the defined constants in this interface.
+ *
+ * @param option_id The option identifier
+ *
+ * @return The current value of the option
+ *
+ * @exception SocketException If an error occurs
+ */
+ Object getOption(int option_id) throws SocketException;
} // interface SocketOptions
diff --git a/libjava/java/net/SocketPermission.java b/libjava/java/net/SocketPermission.java
index 8aa453e5f17..0f41395f36a 100644
--- a/libjava/java/net/SocketPermission.java
+++ b/libjava/java/net/SocketPermission.java
@@ -37,6 +37,7 @@ exception statement from your version. */
package java.net;
+import java.io.Serializable;
import java.security.Permission;
import java.security.PermissionCollection;
@@ -87,7 +88,8 @@ import java.security.PermissionCollection;
* SocketPermission("www.urbanophile.com:80", "connect,accept");
* Can connect to or accept connections from www.urbanophile.com on port 80
* SocketPermission("localhost:1024-", "listen,accept,connect");
- * Can connect to, accept from, an listen on any local port number 1024 and up.
+ * Can connect to, accept from, an listen on any local port number 1024
+ * and up.
* SocketPermission("*.edu", "connect");
* Can connect to any host in the edu domain
* SocketPermission("197.197.20.1", "accept");
@@ -99,8 +101,9 @@ import java.security.PermissionCollection;
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
public final class SocketPermission extends Permission
- implements java.io.Serializable
+ implements Serializable
{
+ static final long serialVersionUID = -7204263841984476862L;
// FIXME: Needs serialization work, including readObject/writeObject methods.
/**
@@ -118,7 +121,7 @@ public final class SocketPermission extends Permission
* specified host/port combination and actions string.
*
* @param hostport The hostname/port number combination
- * @param perms The actions string
+ * @param actions The actions string
*/
public SocketPermission(String hostport, String actions)
{
@@ -241,7 +244,8 @@ public final class SocketPermission extends Permission
* <p><ul>
* <li>The argument's hostname or IP address is equal to this object's.
* <li>The argument's canonical hostname is equal to this object's.
- * <li>The argument's canonical name matches this domains hostname with wildcards
+ * <li>The argument's canonical name matches this domains hostname with
+ * wildcards
* </ul>
*
* @param perm The Permission to check against
diff --git a/libjava/java/net/URI.java b/libjava/java/net/URI.java
new file mode 100644
index 00000000000..e84ac5d0cd6
--- /dev/null
+++ b/libjava/java/net/URI.java
@@ -0,0 +1,433 @@
+/* URI.java - An URI class
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.net;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.4
+ */
+public final class URI
+ implements Comparable, Serializable
+{
+ static final long serialVersionUID = -6052424284110960213L;
+
+ String string;
+ private String scheme;
+ private String schemeSpecificPart;
+ private String authority;
+ private String userInfo;
+ private String host;
+ private int port;
+ private String path;
+ private String query;
+ private String fragment;
+
+ private void readObject (ObjectInputStream is)
+ throws ClassNotFoundException, IOException
+ {
+ }
+
+ private void writeObject (ObjectOutputStream is)
+ throws IOException
+ {
+ }
+
+ private void parseURI (String str)
+ throws URISyntaxException
+ {
+ }
+
+ /**
+ * Creates an URI from the given string
+ *
+ * @param str The string to create the URI from
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ * @exception NullPointerException If str is null
+ */
+ public URI (String str)
+ throws URISyntaxException
+ {
+ }
+
+ /**
+ * Create an URI from the given components
+ *
+ * @param scheme The scheme name
+ * @param userInfo The username and authorization info
+ * @param host The hostname
+ * @param port The port number
+ * @param path The path
+ * @param query The query
+ * @param fragment The fragment
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ */
+ public URI (String scheme, String userInfo, String host, int port,
+ String path, String query, String fragment)
+ throws URISyntaxException
+ {
+ }
+
+ /**
+ * Create an URI from the given components
+ *
+ * @param scheme The scheme name
+ * @param authority The authority
+ * @param path The apth
+ * @param query The query
+ * @param fragment The fragmen
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ */
+ public URI (String scheme, String authority, String path, String query,
+ String fragment)
+ throws URISyntaxException
+ {
+ }
+
+ /**
+ * Create an URI from the given components
+ *
+ * @param scheme The scheme name
+ * @param host The hostname
+ * @param path The path
+ * @param fragment The fragment
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ */
+ public URI (String scheme, String host, String path, String fragment)
+ throws URISyntaxException
+ {
+ }
+
+ /**
+ * Create an URI from the given components
+ *
+ * @param scheme The scheme name
+ * @param ssp The scheme specific part
+ * @param fragment The fragment
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ */
+ public URI (String scheme, String ssp, String fragment)
+ throws URISyntaxException
+ {
+ }
+
+ /**
+ * Create an URI from the given string
+ *
+ * @param str The string to create the URI from
+ *
+ * @exception IllegalArgumentException If the given string violates RFC 2396
+ * @exception NullPointerException If str is null
+ */
+ public static URI create (String str)
+ throws IllegalArgumentException, URISyntaxException
+ {
+ return null;
+ }
+
+ /**
+ * Attempts to parse this URI's authority component, if defined,
+ * into user-information, host, and port components
+ *
+ * @exception URISyntaxException If the given string violates RFC 2396
+ */
+ public URI parseServerAuthority ()
+ throws URISyntaxException
+ {
+ return null;
+ }
+
+ /**
+ * Returns a normalizes versions of the URI
+ */
+ public URI normalize ()
+ {
+ return null;
+ }
+
+ /**
+ * Resolves the given URI against this URI
+ *
+ * @param uri The URI to resolve against this URI
+ *
+ * @return The resulting URI
+ *
+ * @exception NullPointerException If uri is null
+ */
+ public URI resolve (URI uri)
+ {
+ return null;
+ }
+
+ /**
+ * Resolves the given URI string against this URI
+ *
+ * @param str The URI as string to resolve against this URI
+ *
+ * @return The resulting URI
+ *
+ * @exception IllegalArgumentException If the given URI string
+ * violates RFC 2396
+ * @exception NullPointerException If uri is null
+ */
+ public URI resolve (String str)
+ throws IllegalArgumentException
+ {
+ return null;
+ }
+
+ /**
+ * Relativizes the given URI against this URI
+ *
+ * @param uri The URI to relativize this URI
+ *
+ * @return The resulting URI
+ *
+ * @exception NullPointerException If uri is null
+ */
+ public URI relativize (URI uri)
+ {
+ return null;
+ }
+
+ /**
+ * Creates an URL from an URI
+ *
+ * @exception MalformedURLException If a protocol handler for the URL could
+ * not be found, or if some other error occurred while constructing the URL
+ * @exception IllegalArgumentException If the URI is not absolute
+ */
+ public URL toURL ()
+ throws IllegalArgumentException, MalformedURLException
+ {
+ return null;
+ }
+
+ /**
+ * Returns the scheme of the URI
+ */
+ public String getScheme ()
+ {
+ return scheme;
+ }
+
+ /**
+ * Tells whether this URI is absolute or not
+ */
+ public boolean isAbsolute ()
+ {
+ return false;
+ }
+
+ /**
+ * Tell whether this URI is opaque or not
+ */
+ public boolean isOpaque ()
+ {
+ return false;
+ }
+
+ /**
+ * Returns the raw scheme specific part of this URI.
+ * The scheme-specific part is never undefined, though it may be empty
+ */
+ public String getRawSchemeSpecificPart ()
+ {
+ return null;
+ }
+
+ /**
+ * Returns the decoded scheme specific part of this URI.
+ */
+ public String getSchemeSpecificPart ()
+ {
+ return null;
+ }
+
+ /**
+ * Returns the rae authority part of this URI
+ */
+ public String getRawAuthority ()
+ {
+ return authority;
+ }
+
+ /**
+ * Returns the decoded authority part of this URI
+ */
+ public String getAuthority ()
+ {
+ return null;
+ }
+
+ /**
+ * Returns the raw user info part of this URI
+ */
+ public String getRawUserInfo ()
+ {
+ return userInfo;
+ }
+
+ /**
+ * Returns the decoded user info part of this URI
+ */
+ public String getUserInfo ()
+ {
+ return null;
+ }
+
+ /**
+ * Returns the hostname of the URI
+ */
+ public String getHost ()
+ {
+ return host;
+ }
+
+ /**
+ * Returns the port number of the URI
+ */
+ public int getPort ()
+ {
+ return port;
+ }
+
+ /**
+ * Returns the raw path part of this URI
+ */
+ public String getRawPath ()
+ {
+ return path;
+ }
+
+ /**
+ * Returns the path of the URI
+ */
+ public String getPath ()
+ {
+ return null;
+ }
+
+ /**
+ * Returns the raw query part of this URI
+ */
+ public String getRawQuery ()
+ {
+ return query;
+ }
+
+ /**
+ * Returns the query of the URI
+ */
+ public String getQuery ()
+ {
+ return null;
+ }
+
+ /**
+ * Return the raw fragment part of this URI
+ */
+ public String getRawFragment ()
+ {
+ return fragment;
+ }
+
+ /**
+ * Returns the fragment of the URI
+ */
+ public String getFragment ()
+ {
+ return null;
+ }
+
+ /**
+ * Compares the URI with a given object
+ *
+ * @param obj The obj to compare the URI with
+ */
+ public boolean equals(Object obj)
+ {
+ return false;
+ }
+
+ /**
+ * Computes the hascode of the URI
+ */
+ public int hashCode ()
+ {
+ return 0;
+ }
+
+ /**
+ * Compare the URI with another object that must be an URI too
+ *
+ * @param obj This object to compare this URI with
+ *
+ * @exception ClassCastException If given object ist not an URI
+ */
+ public int compareTo (Object obj)
+ throws ClassCastException
+ {
+ return 0;
+ }
+
+ /**
+ * Returns the URI as string
+ */
+ public String toString ()
+ {
+ return "";
+ }
+
+ /**
+ * Returns the URI as US-ASCII string
+ */
+ public String toASCIIString ()
+ {
+ return "";
+ }
+}
diff --git a/libjava/java/net/URL.java b/libjava/java/net/URL.java
index a3e9d784cef..b485c51231d 100644
--- a/libjava/java/net/URL.java
+++ b/libjava/java/net/URL.java
@@ -28,9 +28,12 @@ import java.util.StringTokenizer;
public final class URL implements Serializable
{
private String protocol;
+ private String authority;
+ private String userInfo;
private String host;
private int port = -1; // Initialize for constructor using context.
private String file;
+ private String query;
private String ref;
private int hashCode = 0;
transient private URLStreamHandler handler;
@@ -39,19 +42,53 @@ public final class URL implements Serializable
private static final long serialVersionUID = -7627629688361524110L;
+ /**
+ * Creates an URL object from the given arguments
+ *
+ * @param protocol The protocol of the URL
+ * @param host The host of the URL
+ * @param port The port of the URL
+ * @param file The file of the URL
+ *
+ * @exception MalformedURLException If an error occurs
+ */
public URL(String protocol, String host, int port, String file)
throws MalformedURLException
{
this(protocol, host, port, file, null);
}
+ /**
+ * Creates an URL object from the given arguments
+ *
+ * @param protocol The protocol of the URL
+ * @param host The host of the URL
+ * @param file The file of the URL
+ *
+ * @exception MalformedURLException If an error occurs
+ */
public URL(String protocol, String host, String file)
throws MalformedURLException
{
this(protocol, host, -1, file, null);
}
- // JDK1.2
+ /**
+ * Creates an URL object from the given arguments
+ *
+ * @param protocol The protocol of the URL
+ * @param host The host of the URL
+ * @param port The port of the URL
+ * @param file The file of the URL
+ * @param handler The stream handler for the URL
+ *
+ * @exception MalformedURLException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkPermission method doesn't allow specifying a stream handler
+ * explicitly
+ *
+ * @since 1.2
+ */
public URL(String protocol, String host, int port, String file,
URLStreamHandler handler) throws MalformedURLException
{
@@ -61,14 +98,9 @@ public final class URL implements Serializable
if (handler != null)
{
- // TODO12: Need SecurityManager.checkPermission and
- // TODO12: java.net.NetPermission from JDK 1.2 to be implemented.
- // Throw an exception if an extant security mgr precludes
- // specifying a StreamHandler.
- //
- // SecurityManager s = System.getSecurityManager();
- // if (s != null)
- // s.checkPermission(NetPermission("specifyStreamHandler"));
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkPermission (new NetPermission ("specifyStreamHandler"));
this.handler = handler;
}
@@ -76,11 +108,14 @@ public final class URL implements Serializable
this.handler = setURLStreamHandler(protocol);
if (this.handler == null)
- throw new MalformedURLException("Protocol handler not found: " + protocol);
+ throw new MalformedURLException (
+ "Protocol handler not found: " + protocol);
this.host = host;
-
this.port = port;
+ this.userInfo = null;
+ this.authority = null;
+ this.query = null;
int hashAt = file.indexOf('#');
if (hashAt < 0)
@@ -96,17 +131,45 @@ public final class URL implements Serializable
hashCode = hashCode(); // Used for serialization.
}
+ /**
+ * Creates an URL object from the given arguments
+ *
+ * @param spec The string to parse an URL
+ *
+ * @exception MalformedURLException If an error occurs
+ */
public URL(String spec) throws MalformedURLException
{
this((URL) null, spec, (URLStreamHandler) null);
}
+ /**
+ * Creates an URL object from the given arguments
+ *
+ * @param context The context on which to parse the specification
+ * @param spec The string to parse an URL
+ *
+ * @exception MalformedURLException If an error occurs
+ */
public URL(URL context, String spec) throws MalformedURLException
{
this(context, spec, (URLStreamHandler) null);
}
- // JDK1.2
+ /**
+ * Creates an URL from given arguments
+ *
+ * @param context The context in which to parse the specification
+ * @param spec The string to parse as an URL
+ * @param handler The stream handler for the URL
+ *
+ * @exception MalformedURLException If an error occurs
+ * @exception SecurityException If a security manager exists and its
+ * checkPermission method doesn't allow specifying a stream handler
+ * explicitly
+ *
+ * @since 1.2
+ */
public URL(URL context, String spec, URLStreamHandler handler)
throws MalformedURLException
{
@@ -142,6 +205,9 @@ public final class URL implements Serializable
host = context.host;
port = context.port;
file = context.file;
+ userInfo = context.userInfo;
+ authority = context.authority;
+ query = context.query;
}
}
else if (context != null)
@@ -153,6 +219,9 @@ public final class URL implements Serializable
host = context.host;
port = context.port;
file = context.file;
+ userInfo = context.userInfo;
+ authority = context.authority;
+ query = context.query;
}
else // Protocol NOT specified in spec. and no context available.
throw new
@@ -160,14 +229,9 @@ public final class URL implements Serializable
if (handler != null)
{
- // TODO12: Need SecurityManager.checkPermission and
- // TODO12: java.net.NetPermission from JDK 1.2 to be implemented.
- // Throw an exception if an extant security mgr precludes
- // specifying a StreamHandler.
- //
- // SecurityManager s = System.getSecurityManager();
- // if (s != null)
- // s.checkPermission(NetPermission("specifyStreamHandler"));
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkPermission (new NetPermission ("specifyStreamHandler"));
this.handler = handler;
}
@@ -175,7 +239,8 @@ public final class URL implements Serializable
this.handler = setURLStreamHandler(protocol);
if (this.handler == null)
- throw new MalformedURLException("Protocol handler not found: " + protocol);
+ throw new MalformedURLException("Protocol handler not found: "
+ + protocol);
// JDK 1.2 doc for parseURL specifically states that any '#' ref
// is to be excluded by passing the 'limit' as the indexOf the '#'
@@ -195,46 +260,86 @@ public final class URL implements Serializable
return false;
URL uObj = (URL) obj;
-
- // This comparison is very conservative. It assumes that any
- // field can be null.
- return (port == uObj.port
- && ((protocol == null && uObj.protocol == null)
- || (protocol != null && protocol.equals(uObj.protocol)))
- && ((host == null && uObj.host == null)
- || (host != null && host.equals(uObj.host)))
- && ((file == null && uObj.file == null)
- || (file != null && file.equals(uObj.file)))
- && ((ref == null && uObj.ref == null)
- || (ref != null && ref.equals(uObj.ref))));
+
+ return handler.equals (this, uObj);
}
+ /**
+ * Gets the contents of this URL
+ *
+ * @exception IOException If an error occurs
+ *
+ * @since 1.3
+ */
public final Object getContent() throws IOException
{
return openConnection().getContent();
}
+ /**
+ * Gets the contents of this URL
+ *
+ * @exception IOException If an error occurs
+ */
+ public final Object getContent (Class[] classes) throws IOException
+ {
+ // FIXME: implement this
+ return getContent();
+ }
+
public String getFile()
{
return file;
}
+ /**
+ * Returns the path of the URL
+ *
+ * @since 1.3
+ */
public String getPath()
{
int quest = file.indexOf('?');
return quest < 0 ? file : file.substring(0, quest);
}
+ /**
+ * Returns the authority of the URL
+ *
+ * @since 1.3
+ */
+ public String getAuthority()
+ {
+ return authority;
+ }
+
+ /**
+ * Returns the host of the URL
+ */
public String getHost()
{
return host;
}
+ /**
+ * Returns of port of the URL
+ */
public int getPort()
{
return port;
}
+ /**
+ * Returns the default port of the URL
+ */
+ public int getDefaultPort()
+ {
+ return 0;
+ }
+
+ /**
+ * Returns the protocol of the URL
+ */
public String getProtocol()
{
return protocol;
@@ -245,6 +350,23 @@ public final class URL implements Serializable
return ref;
}
+ /**
+ * Returns the user information of the URL
+ */
+ public String getUserInfo ()
+ {
+ int at = host.indexOf('@');
+ return at < 0 ? null : host.substring(0, at);
+ }
+
+ /**
+ * Returns the query of the URL
+ */
+ public String getQuery ()
+ {
+ return query;
+ }
+
public int hashCode()
{
// JCL book says this is computed using (only) the hashcodes of the
@@ -264,15 +386,26 @@ public final class URL implements Serializable
if (hashCode != 0)
return hashCode; // Use cached value if available.
else
- return (protocol.hashCode() + ((host == null) ? 0 : host.hashCode()) +
- port + file.hashCode());
+ return handler.hashCode (this);
}
+ /**
+ * Returns a URLConnection object that represents a connection to the remote
+ * object referred to by the URL
+ *
+ * @exception IOException If an error occurs
+ */
public URLConnection openConnection() throws IOException
{
return handler.openConnection(this);
}
+ /**
+ * Opens a connection to this URL and returns an InputStream for reading
+ * from that connection
+ *
+ * @exception IOException If an error occurs
+ */
public final InputStream openStream() throws IOException
{
return openConnection().getInputStream();
@@ -283,6 +416,11 @@ public final class URL implements Serializable
return handler.sameFile(this, other);
}
+ /**
+ * Sets the specified fields of the URL. This is not a public method so
+ * that only URLStreamHandlers can modify URL fields. URLs are otherwise
+ * constant
+ */
protected void set(String protocol, String host, int port, String file,
String ref)
{
@@ -292,13 +430,53 @@ public final class URL implements Serializable
// be aware of this.
this.handler = setURLStreamHandler(protocol);
this.protocol = protocol;
+ this.authority = null;
+ this.userInfo = null;
this.port = port;
this.host = host;
this.file = file;
+ this.query = null;
+ this.ref = ref;
+ hashCode = hashCode(); // Used for serialization.
+ }
+
+ /**
+ * Sets the specified fields of the URL. This is not a public method so
+ * that only URLStreamHandlers can modify URL fields. URLs are otherwise
+ * constant
+ *
+ * @since 1.3
+ */
+ protected void set(String protocol, String host, int port,
+ String authority, String userInfo,
+ String path, String query, String ref)
+ {
+ // TBD: Theoretically, a poorly written StreamHandler could pass an
+ // invalid protocol. It will cause the handler to be set to null
+ // thus overriding a valid handler. Callers of this method should
+ // be aware of this.
+ this.handler = setURLStreamHandler(protocol);
+ this.protocol = protocol;
+ if (userInfo == null)
+ this.host = host;
+ else
+ this.host = userInfo + "@" + host;
+ this.port = port;
+ if (query == null)
+ this.file = path;
+ else
+ this.file = path + "?" + query;
this.ref = ref;
hashCode = hashCode(); // Used for serialization.
}
+ /**
+ * Sets an application's URLStreamHandlerFactory
+ *
+ * @exception Error If the application has already set a factory
+ * @exception SecurityException If a security manager exists and its
+ * checkSetFactory method doesn't allow the operation
+ */
public static synchronized void
setURLStreamHandlerFactory(URLStreamHandlerFactory fac)
{
diff --git a/libjava/java/net/URLClassLoader.java b/libjava/java/net/URLClassLoader.java
index eeec8821316..5e059cf9cb6 100644
--- a/libjava/java/net/URLClassLoader.java
+++ b/libjava/java/net/URLClassLoader.java
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation
+/* Copyright (C) 1999, 2000, 2002 Free Software Foundation
This file is part of libgcj.
@@ -12,8 +12,15 @@ import java.io.*;
import java.util.jar.*;
import java.util.Enumeration;
import java.util.Vector;
-
-public class URLClassLoader extends ClassLoader
+import java.security.CodeSource;
+import java.security.SecureClassLoader;
+import java.security.PermissionCollection;
+import java.security.cert.Certificate;
+
+/**
+ * @since 1.2
+ */
+public class URLClassLoader extends SecureClassLoader
{
// The URLStreamHandlerFactory
URLStreamHandlerFactory factory = null;
@@ -33,11 +40,23 @@ public class URLClassLoader extends ClassLoader
return null;
}
+ /**
+ * Createa a new URL class loader object
+ *
+ * @exception SecurityException If a security manager exists and its
+ * checkCreateClassLoader method doesn't allow creation of a class loader
+ */
public URLClassLoader (URL[] urls)
{
this (urls, null, null);
}
-
+
+ /**
+ * Createa a new URL class loader object
+ *
+ * @exception SecurityException If a security manager exists and its
+ * checkCreateClassLoader method doesn't allow creation of a class loader
+ */
public URLClassLoader (URL[] urls, ClassLoader parent)
{
this (urls, parent, null);
@@ -93,11 +112,21 @@ public class URLClassLoader extends ClassLoader
info.addElement (conn);
}
+ /**
+ * Createa a new URL class loader object
+ *
+ * @exception SecurityException If a security manager exists and its
+ * checkCreateClassLoader method doesn't allow creation of a class loader
+ */
public URLClassLoader (URL[] urls, ClassLoader parent,
URLStreamHandlerFactory fac)
{
super (parent);
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkCreateClassLoader();
+
factory = fac;
if (urls == null || urls.length == 0)
@@ -112,7 +141,7 @@ public class URLClassLoader extends ClassLoader
for (int i = 0; i < urls.length; i++)
{
- // Convert a Jar File URL into a Jar URL is possible.
+ // Convert a Jar File URL into a Jar URL if possible.
URL u = jarFileize(urls[i]);
path.addElement (u);
@@ -143,7 +172,13 @@ public class URLClassLoader extends ClassLoader
path.copyInto (urls);
return urls;
}
-
+
+ /**
+ * Returns an Enumeration of URLs representing all of the resources on the
+ * URL search path having the specified name
+ *
+ * @exception IOException If an error occurs
+ */
public Enumeration findResources (String name)
{
Vector results = new Vector ();
@@ -158,7 +193,8 @@ public class URLClassLoader extends ClassLoader
if (conn != null)
{
if (conn.getJarFile().getJarEntry (name) != null)
- results.addElement (new URL(u, name, getHandler0 (u.getProtocol())));
+ results.addElement (new URL(u, name,
+ getHandler0 (u.getProtocol())));
}
else
{
@@ -216,7 +252,12 @@ public class URLClassLoader extends ClassLoader
return null;
}
- // and finally, we can implement our class loader functionality.
+ /**
+ * Finds and loads the class with the specified name from the
+ * URL search path
+ *
+ * @exception ClassNotFoundException If the class could not be found
+ */
protected Class findClass (String name)
throws ClassNotFoundException
{
@@ -225,12 +266,12 @@ public class URLClassLoader extends ClassLoader
try
{
- URL u = getResource (name.replace ('.', '/') + ".class");
+ URL url = getResource (name.replace ('.', '/') + ".class");
- if (u == null)
+ if (url == null)
throw new ClassNotFoundException (name);
- URLConnection connection = u.openConnection ();
+ URLConnection connection = url.openConnection ();
InputStream is = connection.getInputStream ();
int len = connection.getContentLength ();
@@ -247,12 +288,171 @@ public class URLClassLoader extends ClassLoader
off += c;
}
- return defineClass (name, data, 0, len);
+ // Now construct the CodeSource (if loaded from a jar file)
+ CodeSource source = null;
+ if (url.getProtocol().equals("jar"))
+ {
+ Certificate[] certificates =
+ ((JarURLConnection) connection).getCertificates();
+ String u = url.toExternalForm ();
+ u = u.substring (4); //skip "jar:"
+ int i = u.indexOf ('!');
+ if (i >= 0)
+ u = u.substring (0, i);
+ url = new URL(u);
+
+ source = new CodeSource(url, certificates);
+ }
+ else if (url.getProtocol().equals("file"))
+ {
+ try
+ {
+ String u = url.toExternalForm();
+ // Skip "file:" and then get canonical directory name.
+ File f = new File(u.substring(5));
+ f = f.getCanonicalFile();
+ url = new URL("file", "", f.getParent());
+ source = new CodeSource (url, null);
+ }
+ catch (IOException ignore)
+ {
+ }
+ }
+
+ return defineClass (name, data, 0, len, source);
}
catch (java.io.IOException x)
{
throw new ClassNotFoundException(name);
}
}
-}
+ /**
+ * Defines a Package based on the given name and the supplied manifest
+ * information. The manifest indicates the tile, version and
+ * vendor information of the specification and implementation and wheter the
+ * package is sealed. If the Manifest indicates that the package is sealed
+ * then the Package will be sealed with respect to the supplied URL.
+ *
+ * @exception IllegalArgumentException If this package name already exists
+ * in this class loader
+ * @param name The name of the package
+ * @param manifest The manifest describing the specification,
+ * implementation and sealing details of the package
+ * @param url the code source url to seal the package
+ * @return the defined Package
+ */
+ protected Package definePackage(String name, Manifest manifest, URL url)
+ throws IllegalArgumentException
+ {
+ Attributes attr = manifest.getMainAttributes();
+ String specTitle =
+ attr.getValue(Attributes.Name.SPECIFICATION_TITLE);
+ String specVersion =
+ attr.getValue(Attributes.Name.SPECIFICATION_VERSION);
+ String specVendor =
+ attr.getValue(Attributes.Name.SPECIFICATION_VENDOR);
+ String implTitle =
+ attr.getValue(Attributes.Name.IMPLEMENTATION_TITLE);
+ String implVersion =
+ attr.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+ String implVendor =
+ attr.getValue(Attributes.Name.IMPLEMENTATION_VENDOR);
+
+ // Look if the Manifest indicates that this package is sealed
+ // XXX - most likely not completely correct!
+ // Shouldn't we also check the sealed attribute of the complete jar?
+ // http://java.sun.com/products/jdk/1.3/docs/guide/extensions/spec.html#bundled
+ // But how do we get that jar manifest here?
+ String sealed = attr.getValue(Attributes.Name.SEALED);
+ if ("false".equals(sealed))
+ {
+ // Make sure that the URL is null so the package is not
+ // sealed.
+ url = null;
+ }
+
+ return definePackage(name, specTitle, specVersion, specVendor,
+ implTitle, implVersion, implVendor, url);
+ }
+
+ /**
+ * Returns the permissions needed to access a particular code source.
+ * These permissions includes those returned by
+ * <CODE>SecureClassLoader.getPermissions</CODE> and the actual permissions
+ * to access the objects referenced by the URL of the code source.
+ * The extra permissions added depend on the protocol and file portion of
+ * the URL in the code source. If the URL has the "file" protocol ends with
+ * a / character then it must be a directory and a file Permission to read
+ * everthing in that directory and all subdirectories is added. If the URL
+ * had the "file" protocol and doesn't end with a / character then it must
+ * be a normal file and a file permission to read that file is added. If the
+ * URL has any other protocol then a socket permission to connect and accept
+ * connections from the host portion of the URL is added.
+ * @param source The codesource that needs the permissions to be accessed
+ * @return the collection of permissions needed to access the code resource
+ * @see SecureClassLoader.getPermissions()
+ */
+ protected PermissionCollection getPermissions(CodeSource source)
+ {
+ // XXX - This implementation does exactly as the Javadoc describes.
+ // But maybe we should/could use URLConnection.getPermissions()?
+
+ // First get the permissions that would normally be granted
+ PermissionCollection permissions = super.getPermissions(source);
+
+ // Now add the any extra permissions depending on the URL location
+ URL url = source.getLocation();
+ String protocol = url.getProtocol();
+ if (protocol.equals("file"))
+ {
+ String file = url.getFile();
+ // If the file end in / it must be an directory
+ if (file.endsWith("/"))
+ {
+ // Grant permission to read everything in that directory and
+ // all subdirectories
+ permissions.add(new FilePermission(file + "-", "read"));
+ }
+ else
+ {
+ // It is a 'normal' file
+ // Grant permission to access that file
+ permissions.add(new FilePermission(file, "read"));
+ }
+ }
+ else
+ {
+ // Grant permission to connect to and accept connections from host
+ String host = url.getHost();
+ permissions.add(new SocketPermission(host, "connect,accept"));
+ }
+
+ return permissions;
+ }
+
+ /**
+ * Creates a new instance of a URLClassLoader that gets classes from the
+ * supplied URLs. This class loader will have as parent the standard
+ * system class loader.
+ * @param urls the initial URLs used to resolve classes and resources
+ */
+ public static URLClassLoader newInstance(URL[] urls) throws
+ SecurityException
+ {
+ return new URLClassLoader(urls);
+ }
+
+ /**
+ * Creates a new instance of a URLClassLoader that gets classes from the
+ * supplied URLs and with the supplied loader as parent class loader.
+ * @param urls the initial URLs used to resolve classes and resources
+ * @param parent the parent class loader
+ */
+ public static URLClassLoader newInstance(URL[] urls,
+ ClassLoader parent)
+ throws SecurityException
+ {
+ return new URLClassLoader(urls, parent);
+ }
+}
diff --git a/libjava/java/net/URLConnection.java b/libjava/java/net/URLConnection.java
index 8f8cf5ed575..0b39fe88ea6 100644
--- a/libjava/java/net/URLConnection.java
+++ b/libjava/java/net/URLConnection.java
@@ -17,7 +17,10 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Hashtable;
+import java.util.Map;
import java.util.StringTokenizer;
+import java.security.Permission;
+import java.security.AllPermission;
import gnu.gcj.io.MimeTypes;
/**
@@ -29,7 +32,7 @@ import gnu.gcj.io.MimeTypes;
* Written using on-line Java Platform 1.2 API Specification, as well
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
* Status: One guessContentTypeFrom... methods not implemented.
- * getContent method assumes content type from response; see comment there.
+ * getContent method assumes content type from response; see comment there.
*/
public abstract class URLConnection
@@ -51,6 +54,14 @@ public abstract class URLConnection
private static SimpleDateFormat dateFormat1, dateFormat2, dateFormat3;
private static boolean dateformats_initialized = false;
+ /**
+ * Creates a URL connection to a given URL. A real connection is not made.
+ * Use #connect to do this.
+ *
+ * @param url The Object to create the URL connection to
+ *
+ * @see URLConnection:connect
+ */
protected URLConnection(URL url)
{
this.url = url;
@@ -58,55 +69,112 @@ public abstract class URLConnection
useCaches = defaultUseCaches;
}
+ /**
+ * Creates a real connection to the object references by the URL given
+ * to the constructor
+ *
+ * @exception IOException If an error occurs
+ */
public abstract void connect() throws IOException;
+ /**
+ * Returns ths URL to the object.
+ */
public URL getURL()
{
return url;
}
+ /**
+ * Returns the value of the content-length header field
+ */
public int getContentLength()
{
return getHeaderFieldInt("content-length", -1);
}
+ /**
+ * Returns the value of the content-type header field
+ */
public String getContentType()
{
return getHeaderField("content-type");
}
+ /**
+ * Returns the value of the content-encoding header field
+ */
public String getContentEncoding()
{
return getHeaderField("content-encoding");
}
+ /**
+ * Returns the value of the expires header field
+ */
public long getExpiration()
{
return getHeaderFieldDate("expiration", 0L);
}
+ /**
+ * Returns the value of the date header field
+ */
public long getDate()
{
return getHeaderFieldDate("date", 0L);
}
+ /**
+ * Returns the value of the last-modified header field
+ */
public long getLastModified()
{
return getHeaderFieldDate("last-modified", 0L);
}
- public String getHeaderField(int n)
+ /**
+ * Returns the value of the n-th header field
+ *
+ * @param num The number of the header field
+ */
+ public String getHeaderField(int num)
{
// Subclasses for specific protocols override this.
return null;
}
+ /**
+ * Returns the value of the header filed specified by name
+ *
+ * @param name The name of the header field
+ */
public String getHeaderField(String name)
{
// Subclasses for specific protocols override this.
return null;
}
+ /**
+ * Returns a map of all sent header fields
+ *
+ * @since 1.4
+ */
+ public Map getHeaderFields()
+ {
+ // Subclasses for specific protocols override this.
+ return null;
+ }
+
+ /**
+ * Returns the value of the header filed name as int.
+ *
+ * @param name The name of the header field
+ * @param val The default value
+ *
+ * @return Returns the value of the header filed or the default value
+ * if the field is missing or malformed
+ */
public int getHeaderFieldInt(String name, int val)
{
String str = getHeaderField(name);
@@ -122,6 +190,16 @@ public abstract class URLConnection
return val;
}
+ /**
+ * Returns the value of a header field parsed as date. The result is then
+ * number of milliseconds since January 1st, 1970 GMT.
+ *
+ * @param name The name of the header field
+ * @param val The dafault date
+ *
+ * @return Returns the date value of the header filed or the default value
+ * if the field is missing or malformed
+ */
public long getHeaderFieldDate(String name, long val)
{
if (! dateformats_initialized)
@@ -140,12 +218,24 @@ public abstract class URLConnection
return val;
}
- public String getHeaderFieldKey(int n)
+ /**
+ * Returns the key of the n-th header field
+ *
+ * @param num The number of the header field
+ */
+ public String getHeaderFieldKey(int num)
{
// Subclasses for specific protocols override this.
return null;
}
+ /**
+ * Retrieves the content of this URLConnection
+ *
+ * @exception IOException If an error occurs
+ * @exception UnknownServiceException If the protocol does not support the
+ * content type
+ */
public Object getContent() throws IOException
{
// FIXME: Doc indicates that other criteria should be applied as
@@ -160,12 +250,39 @@ public abstract class URLConnection
return contentHandler.getContent(this);
}
-// TODO12: public Permission getPermission() throws IOException
-// {
-// // Subclasses may override this.
-// return java.security.AllPermission;
-// }
+ /**
+ * Retrieves the content of this URLConnection
+ *
+ * @exception IOException If an error occurs
+ * @exception UnknownServiceException If the protocol does not support the
+ * content type
+ */
+ public Object getContent(Class[] classes) throws IOException
+ {
+ // FIXME: implement this
+ return getContent ();
+ }
+ /**
+ * Returns a permission object representing the permission necessary to make
+ * the connection represented by this object. This method returns null if no
+ * permission is required to make the connection.
+ *
+ * @exception IOException If the computation of the permission requires
+ * network or file I/O and an exception occurs while computing it
+ */
+ public Permission getPermission() throws IOException
+ {
+ // Subclasses may override this.
+ return new java.security.AllPermission();
+ }
+
+ /**
+ * Returns the input stream of the URL connection
+ *
+ * @exception IOException If an error occurs
+ * @exception UnknownServiceException If the protocol does not support input
+ */
public InputStream getInputStream() throws IOException
{
// Subclasses for specific protocols override this.
@@ -173,6 +290,12 @@ public abstract class URLConnection
" does not support input.");
}
+ /**
+ * Returns the output stream of the URL connection
+ *
+ * @exception IOException If an error occurs
+ * @exception UnknownServiceException If the protocol does not support output
+ */
public OutputStream getOutputStream() throws IOException
{
// Subclasses for specific protocols override this.
@@ -180,122 +303,291 @@ public abstract class URLConnection
" does not support output.");
}
+ /**
+ * Returns a string representation of the URL connection object
+ */
public String toString()
{
return this.getClass().getName() + ":" + url.toString();
}
+ /**
+ * Sets tha value of the doInput field.
+ *
+ * @param doinput The new value of the doInput field
+ *
+ * @exception IllegalStateException If already connected
+ */
public void setDoInput(boolean doinput)
{
if (connected)
- throw new IllegalAccessError("Already connected");
+ throw new IllegalStateException ("Already connected");
doInput = doinput;
}
+ /**
+ * Returns the current value of the doInput field
+ */
public boolean getDoInput()
{
return doInput;
}
+ /**
+ * Sets the value of the doOutput field
+ *
+ * @param dooutput The new value of the doOutput field
+ *
+ * @exception IllegalStateException If already connected
+ */
public void setDoOutput(boolean dooutput)
{
if (connected)
- throw new IllegalAccessError("Already connected");
+ throw new IllegalStateException ("Already connected");
doOutput = dooutput;
}
+ /**
+ * Returns the current value of the doOutput field
+ */
public boolean getDoOutput()
{
return doOutput;
}
- public void setAllowUserInteraction(boolean allowuserinteraction)
+ /**
+ * Sets a new value to the allowUserInteraction field
+ *
+ * @param allowed The new value
+ *
+ * @exception IllegalStateException If already connected
+ */
+ public void setAllowUserInteraction(boolean allowed)
{
if (connected)
- throw new IllegalAccessError("Already connected");
+ throw new IllegalStateException ("Already connected");
- allowUserInteraction = allowuserinteraction;
+ allowUserInteraction = allowed;
}
+ /**
+ * Returns the current value of the allowUserInteraction field
+ */
public boolean getAllowUserInteraction()
{
return allowUserInteraction;
}
- public static void
- setDefaultAllowUserInteraction(boolean defaultallowuserinteraction)
+ /**
+ * Sets the default value if the allowUserInteraction field
+ *
+ * @param allowed The new default value
+ */
+ public static void setDefaultAllowUserInteraction(boolean allowed)
{
- defaultAllowUserInteraction = defaultallowuserinteraction;
+ defaultAllowUserInteraction = allowed;
}
+ /**
+ * Returns the default value of the allowUserInteraction field
+ */
public static boolean getDefaultAllowUserInteraction()
{
return defaultAllowUserInteraction;
}
+ /**
+ * Sets a new value to the useCaches field
+ *
+ * @param usecaches The new value
+ *
+ * @exception IllegalStateException If already connected
+ */
public void setUseCaches(boolean usecaches)
{
if (connected)
- throw new IllegalAccessError("Already connected");
+ throw new IllegalStateException ("Already connected");
useCaches = usecaches;
}
+ /**
+ * The current value of the useCaches field
+ */
public boolean getUseCaches()
{
return useCaches;
}
+ /**
+ * Sets the value of the ifModifiedSince field
+ *
+ * @param ifmodifiedsince The new value in milliseconds
+ * since January 1, 1970 GMT
+ *
+ * @exception IllegalStateException If already connected
+ */
public void setIfModifiedSince(long ifmodifiedsince)
{
if (connected)
- throw new IllegalAccessError("Already connected");
+ throw new IllegalStateException ("Already connected");
ifModifiedSince = ifmodifiedsince;
}
+ /**
+ * Returns the current value of the ifModifiedSince field
+ */
public long getIfModifiedSince()
{
return ifModifiedSince;
}
+ /**
+ * Returns the default value of the useCaches field
+ */
public boolean getDefaultUseCaches()
{
return defaultUseCaches;
}
+ /**
+ * Sets the default value of the useCaches field
+ *
+ * @param defaultusecaches The new default value
+ */
public void setDefaultUseCaches(boolean defaultusecaches)
{
defaultUseCaches = defaultusecaches;
}
+ /**
+ * Sets a property specified by key to value.
+ *
+ * @param key Key of the property to set
+ * @param value Value of the Property to set
+ *
+ * @exception IllegalStateException If already connected
+ * @exception NullPointerException If key is null
+ *
+ * @see URLConnection:getRequestProperty(String key)
+ * @see URLConnection:addRequestProperty(String key, String value)
+ */
public void setRequestProperty(String key, String value)
{
+ if (connected)
+ throw new IllegalStateException ("Already connected");
+
// Do nothing unless overridden by subclasses that support setting
// header fields in the request.
}
+ /**
+ * Sets a property specified by key to value. If the property key already
+ * is assigned to a value it does nothing.
+ *
+ * @param key Key of the property to add
+ * @param value Value of the Property to add
+ *
+ * @exception IllegalStateException If already connected
+ * @exception NullPointerException If key is null
+ *
+ * @see URLConnection:getRequestProperty(String key)
+ * @see URLConnection:setRequestProperty(String key, String value)
+ *
+ * @since 1.4
+ */
+ public void addRequestProperty(String key, String value)
+ {
+ if (connected)
+ throw new IllegalStateException ("Already connected");
+
+ if (getRequestProperty (key) == null)
+ {
+ setRequestProperty (key, value);
+ }
+ }
+
+ /**
+ * Returns a property value specified by key.
+ *
+ * @param key Key of the property to return
+ *
+ * @exception IllegalStateException If already connected
+ *
+ * @see URLConnection:setRequestProperty(String key, String value)
+ * @see URLConnection:addRequestProperty(String key, String value)
+ *
+ * @return Value of the property.
+ */
public String getRequestProperty(String key)
{
+ if (connected)
+ throw new IllegalStateException ("Already connected");
+
// Overridden by subclasses that support reading header fields from the
// request.
return null;
}
+ /**
+ * Returns a map that contains all properties of the request
+ *
+ * @exception IllegalStateException If already connected
+ *
+ * @return The map of properties
+ */
+ public Map getRequestProperties()
+ {
+ // Overridden by subclasses that support reading header fields from the
+ // request.
+ return null;
+ }
+
+ /**
+ * Defines a default request property
+ *
+ * @param key The key of the property
+ * @param value The value of the property
+ *
+ * @deprecated 1.3 The method setRequestProperty should be used instead
+ *
+ * @see URLConnection:setRequestProperty
+ */
public static void setDefaultRequestProperty(String key, String value)
{
// Do nothing unless overridden by subclasses that support setting
// default request properties.
}
+ /**
+ * Returns the value of a default request property
+ *
+ * @param key The key of the default property
+ *
+ * @return The value of the default property or null if not available
+ *
+ * @deprecated 1.3 The method getRequestProperty should be used instead
+ *
+ * @see URLConnection:getRequestProperty
+ */
public static String getDefaultRequestProperty(String key)
{
// Overridden by subclasses that support default request properties.
return null;
}
+ /**
+ * Sets a ContentHandlerFactory
+ *
+ * @param fac The ContentHandlerFactory
+ *
+ * @exception Error If the factory has already been defined
+ * @exception SecurityException If a security manager exists and its
+ * checkSetFactory method doesn't allow the operation
+ */
public static void setContentHandlerFactory(ContentHandlerFactory fac)
{
if (factory != null)
@@ -309,7 +601,15 @@ public abstract class URLConnection
factory = fac;
}
- protected static String guessContentTypeFromName(String fname)
+ /**
+ * Tries to determine the content type of an object, based on the
+ * specified file name
+ *
+ * @param fname The filename to guess the content type from
+ *
+ * @specnote public since JDK 1.4
+ */
+ public static String guessContentTypeFromName(String fname)
{
int dot = fname.lastIndexOf (".");
@@ -329,20 +629,43 @@ public abstract class URLConnection
return(type);
}
-// TODO: public static String guessContentTypeFromStream(InputStream is)
-// throws IOException
-// {
-// }
-
-// TODO12: protected void parseURL(URL u, String spec, int start, int limit)
+ /**
+ * Tries to guess the content type of an object, based on the characters
+ * at the beginning of then input stream
+ *
+ * @param is The input stream to guess from
+ *
+ * @exception IOException If an error occurs
+ */
+ public static String guessContentTypeFromStream(InputStream is)
+ throws IOException
+ {
+ is.mark(1024);
+ // FIXME: Implement this. Use system mimetype informations (like "file").
+ is.reset();
+ return null;
+ }
- // JDK1.2
+ /**
+ * Returns a filename map (a mimetable)
+ *
+ * @since 1.2
+ */
public static FileNameMap getFileNameMap()
{
return fileNameMap;
}
- // JDK1.2
+ /**
+ * Sets a FileNameMap
+ *
+ * @param map The new FileNameMap
+ *
+ * @exception SecurityException If a security manager exists and its
+ * checkSetFactory method doesn't allow the operation
+ *
+ * @since 1.2
+ */
public static void setFileNameMap(FileNameMap map)
{
// Throw an exception if an extant security mgr precludes
diff --git a/libjava/java/net/URLDecoder.java b/libjava/java/net/URLDecoder.java
index 3c15802d427..8cdcf943825 100644
--- a/libjava/java/net/URLDecoder.java
+++ b/libjava/java/net/URLDecoder.java
@@ -39,38 +39,45 @@ package java.net;
import java.io.UnsupportedEncodingException;
- /**
- * This utility class contains static methods that converts a
- * string encoded in the x-www-form-urlencoded format to the original
- * text. The x-www-form-urlencoded format replaces certain disallowed
- * characters with encoded equivalents. All upper case and lower case
- * letters in the US alphabet remain as is, the space character (' ')
- * is replaced with '+' sign, and all other characters are converted to a
- * "%XX" format where XX is the hexadecimal representation of that character
- * in a given character encoding (default is "UTF-8").
- * <p>
- * This method is very useful for decoding strings sent to CGI scripts
- *
- * Written using on-line Java Platform 1.2/1.4 API Specification.
- * Status: Believed complete and correct.
- *
- * @since 1.2
- *
- * @author Warren Levy <warrenl@cygnus.com>
- * @author Aaron M. Renn (arenn@urbanophile.com) (documentation comments)
- * @author Mark Wielaard (mark@klomp.org)
- */
+/**
+ * This utility class contains static methods that converts a
+ * string encoded in the x-www-form-urlencoded format to the original
+ * text. The x-www-form-urlencoded format replaces certain disallowed
+ * characters with encoded equivalents. All upper case and lower case
+ * letters in the US alphabet remain as is, the space character (' ')
+ * is replaced with '+' sign, and all other characters are converted to a
+ * "%XX" format where XX is the hexadecimal representation of that character
+ * in a given character encoding (default is "UTF-8").
+ * <p>
+ * This method is very useful for decoding strings sent to CGI scripts
+ *
+ * Written using on-line Java Platform 1.2/1.4 API Specification.
+ * Status: Believed complete and correct.
+ *
+ * @since 1.2
+ *
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @author Aaron M. Renn (arenn@urbanophile.com) (documentation comments)
+ * @author Mark Wielaard (mark@klomp.org)
+ */
public class URLDecoder
{
- /**
- * This method translates the passed in string from x-www-form-urlencoded
- * format using the default encoding "UTF-8" to decode the hex encoded
- * unsafe characters.
- *
- * @param s the String to convert
- *
- * @return the converted String
- */
+ /**
+ * Constructor for compatibility with Sun's JDK.
+ */
+ public URLDecoder ()
+ {
+ }
+
+ /**
+ * This method translates the passed in string from x-www-form-urlencoded
+ * format using the default encoding "UTF-8" to decode the hex encoded
+ * unsafe characters.
+ *
+ * @param s the String to convert
+ *
+ * @return the converted String
+ */
public static String decode(String s)
{
try
@@ -84,25 +91,28 @@ public class URLDecoder
}
}
- /**
- * This method translates the passed in string from x-www-form-urlencoded
- * format using the given character encoding to decode the hex encoded
- * unsafe characters.
- * <p>
- * This implementation will decode the string even if it contains
- * unsafe characters (characters that should have been encoded) or if the
- * two characters following a % do not represent a hex encoded byte.
- * In those cases the unsafe character or the % character will be added
- * verbatim to the decoded result.
- *
- * @param s the String to convert
- * @param encoding the character encoding to use the decode the hex encoded
- * unsafe characters
- *
- * @return the converted String
- *
- * @since 1.4
- */
+ /**
+ * This method translates the passed in string from x-www-form-urlencoded
+ * format using the given character encoding to decode the hex encoded
+ * unsafe characters.
+ *
+ * This implementation will decode the string even if it contains
+ * unsafe characters (characters that should have been encoded) or if the
+ * two characters following a % do not represent a hex encoded byte.
+ * In those cases the unsafe character or the % character will be added
+ * verbatim to the decoded result.
+ *
+ * @param s the String to convert
+ * @param encoding the character encoding to use the decode the hex encoded
+ * unsafe characters
+ *
+ * @return the converted String
+ *
+ * @exception UnsupportedEncodingException If the named encoding is not
+ * supported
+ *
+ * @since 1.4
+ */
public static String decode(String s, String encoding)
throws UnsupportedEncodingException
{
diff --git a/libjava/java/net/URLEncoder.java b/libjava/java/net/URLEncoder.java
index e3b6b63d049..345ef2404d5 100644
--- a/libjava/java/net/URLEncoder.java
+++ b/libjava/java/net/URLEncoder.java
@@ -94,6 +94,9 @@ public class URLEncoder
*
* @return The converted String
*
+ * @exception UnsupportedEncodingException If the named encoding is not
+ * supported
+ *
* @since 1.4
*/
public static String encode(String s, String encoding)
diff --git a/libjava/java/net/URLStreamHandler.java b/libjava/java/net/URLStreamHandler.java
index bb3d8e802e1..a30f1570f89 100644
--- a/libjava/java/net/URLStreamHandler.java
+++ b/libjava/java/net/URLStreamHandler.java
@@ -10,6 +10,8 @@ details. */
package java.net;
+import java.io.IOException;
+
/**
* @author Warren Levy <warrenl@cygnus.com>
* @date March 4, 1999.
@@ -23,9 +25,34 @@ package java.net;
public abstract class URLStreamHandler
{
+ /**
+ * Creates a URLStreamHander
+ */
+ public URLStreamHandler ()
+ {
+ }
+
+ /**
+ * Opens a connection to the object referenced by the URL argument.
+ * This method should be overridden by a subclass.
+ *
+ * @exception IOException If an error occurs
+ */
protected abstract URLConnection openConnection(URL u)
- throws java.io.IOException;
+ throws IOException;
+ /**
+ * Pasrses the given URL
+ *
+ * @param u The URL to parse
+ * @param spec The specification to use
+ * @param start The character index at which to begin parsing. This is just
+ * past the ':' (if there is one) that specifies the determination of the
+ * protocol name
+ * @param limit The character position to stop parsing at. This is the end
+ * of the string or the position of the "#" character, if present. All
+ * information after the sharp sign indicates an anchor
+ */
protected void parseURL(URL u, String spec, int start, int limit)
{
String host = u.getHost();
@@ -119,7 +146,15 @@ public abstract class URLStreamHandler
return file;
}
- public boolean sameFile(URL url1, URL url2)
+ /**
+ * Compares two URLs, excluding the fragment component
+ *
+ * @param url1 The first url
+ * @param url2 The second url to compare with the first
+ *
+ * @specnote Now protected
+ */
+ protected boolean sameFile(URL url1, URL url2)
{
if (url1 == url2)
return true;
@@ -143,12 +178,149 @@ public abstract class URLStreamHandler
return true;
}
+ /**
+ * Sets the fields of the URL argument to the indicated values
+ *
+ * @param u The URL to modify
+ * @param protocol The protocol to set
+ * @param host The host name to et
+ * @param port The port number to set
+ * @param file The filename to set
+ * @param ref The reference
+ *
+ * @exception SecurityException If the protocol handler of the URL is
+ * different from this one
+ *
+ * @deprecated 1.2 Please use
+ * #setURL(URL,String,String,int,String,String,String,String);
+ */
protected void setURL(URL u, String protocol, String host, int port,
String file, String ref)
{
u.set(protocol, host, port, file, ref);
}
+ /**
+ * Sets the fields of the URL argument to the indicated values
+ *
+ * @param u The URL to modify
+ * @param protocol The protocol to set
+ * @param host The host name to set
+ * @param port The port number to set
+ * @param authority The authority to set
+ * @param userInfo The user information to set
+ * @param path The path/filename to set
+ * @param query The query part to set
+ * @param ref The reference
+ *
+ * @exception SecurityException If the protocol handler of the URL is
+ * different from this one
+ */
+ protected void setURL(URL u, String protocol, String host, int port,
+ String authority, String userInfo, String path,
+ String query, String ref)
+ {
+ u.set(protocol, host, port, authority, userInfo, path, query, ref);
+ }
+
+ /**
+ * Provides the default equals calculation. May be overidden by handlers for
+ * other protocols that have different requirements for equals(). This method
+ * requires that none of its arguments is null. This is guaranteed by the
+ * fact that it is only called by java.net.URL class.
+ *
+ * @param url1 An URL object
+ * @param url2 An URL object
+ */
+ protected boolean equals (URL url1, URL url2)
+ {
+ // This comparison is very conservative. It assumes that any
+ // field can be null.
+ return (url1.getPort () == url2.getPort ()
+ && ((url1.getProtocol () == null && url2.getProtocol () == null)
+ || (url1.getProtocol () != null
+ && url1.getProtocol ().equals (url2.getProtocol ())))
+ && ((url1.getUserInfo () == null && url2.getUserInfo () == null)
+ || (url1.getUserInfo () != null
+ && url1.getUserInfo ().equals(url2.getUserInfo ())))
+ && ((url1.getAuthority () == null && url2.getAuthority () == null)
+ || (url1.getAuthority () != null
+ && url1.getAuthority ().equals(url2.getAuthority ())))
+ && ((url1.getHost () == null && url2.getHost () == null)
+ || (url1.getHost () != null
+ && url1.getHost ().equals(url2.getHost ())))
+ && ((url1.getPath () == null && url2.getPath () == null)
+ || (url1.getPath () != null
+ && url1.getPath ().equals (url2.getPath ())))
+ && ((url1.getQuery () == null && url2.getQuery () == null)
+ || (url1.getQuery () != null
+ && url1.getQuery ().equals(url2.getQuery ())))
+ && ((url1.getRef () == null && url2.getRef () == null)
+ || (url1.getRef () != null
+ && url1.getRef ().equals(url2.getRef ()))));
+ }
+
+ /**
+ * Compares the host components of two URLs.
+ *
+ * @exception UnknownHostException If an unknown host is found
+ */
+ protected boolean hostsEqual (URL url1, URL url2)
+ throws UnknownHostException
+ {
+ InetAddress addr1 = InetAddress.getByName (url1.getHost ());
+ InetAddress addr2 = InetAddress.getByName (url2.getHost ());
+
+ return addr1.equals (addr2);
+ }
+
+ /**
+ * Get the IP address of our host. An empty host field or a DNS failure will
+ * result in a null return.
+ */
+ protected InetAddress getHostAddress (URL url)
+ {
+ String hostname = url.getHost ();
+
+ if (hostname == "")
+ return null;
+
+ try
+ {
+ return InetAddress.getByName (hostname);
+ }
+ catch (UnknownHostException e)
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the default port for a URL parsed by this handler. This method is
+ * meant to be overidden by handlers with default port numbers.
+ */
+ protected int getDefaultPort ()
+ {
+ return -1;
+ }
+
+ /**
+ * Provides the default hash calculation. May be overidden by handlers for
+ * other protocols that have different requirements for hashCode calculation.
+ */
+ protected int hashCode (URL url)
+ {
+ return url.getProtocol ().hashCode () +
+ ((url.getHost () == null) ? 0 : url.getHost ().hashCode ()) +
+ url.getFile ().hashCode() +
+ url.getPort ();
+ }
+
+ /**
+ * Converts an URL of a specific protocol to a string
+ *
+ * @param u The URL to convert
+ */
protected String toExternalForm(URL u)
{
String resStr, host, file, ref;
diff --git a/libjava/java/net/natNetworkInterface.cc b/libjava/java/net/natNetworkInterface.cc
new file mode 100644
index 00000000000..f2019409e81
--- /dev/null
+++ b/libjava/java/net/natNetworkInterface.cc
@@ -0,0 +1,145 @@
+// natNetworkInterface.cc
+
+/* Copyright (C) 2002 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+#ifdef WIN32
+
+#include <windows.h>
+#include <winsock.h>
+#undef STRICT
+
+#else /* WIN32 */
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <sys/param.h>
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+#define BSD_COMP /* Get FIONREAD on Solaris2. */
+#include <sys/ioctl.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+
+#endif /* WIN32 */
+
+#include <gcj/cni.h>
+#include <jvm.h>
+#include <java/net/NetworkInterface.h>
+#include <java/net/Inet4Address.h>
+#include <java/net/SocketException.h>
+#include <java/util/Vector.h>
+
+#ifdef DISABLE_JAVA_NET
+
+::java::util::Vector*
+java::net::NetworkInterface::getRealNetworkInterfaces ()
+{
+ ::java::util::Vector* ht = new ::java::util::Vector();
+ return ht;
+}
+
+#else /* DISABLE_JAVA_NET */
+
+::java::util::Vector*
+java::net::NetworkInterface::getRealNetworkInterfaces ()
+{
+#ifdef WIN32
+ throw new ::java::net::SocketException;
+#else
+ int fd;
+ int num_interfaces = 0;
+ struct ifconf if_data;
+ struct ifreq* if_record;
+ ::java::util::Vector* ht = new ::java::util::Vector ();
+
+ if_data.ifc_len = 0;
+ if_data.ifc_buf = NULL;
+
+ // Open a (random) socket to have a file descriptor for the ioctl calls.
+ fd = ::socket (PF_INET, SOCK_DGRAM, htons (IPPROTO_IP));
+
+ if (fd < 0)
+ throw new ::java::net::SocketException;
+
+ // Get all interfaces. If not enough buffers are available try it
+ // with a bigger buffer size.
+ do
+ {
+ num_interfaces += 16;
+
+ if_data.ifc_len = sizeof (struct ifreq) * num_interfaces;
+ if_data.ifc_buf =
+ (char*) _Jv_Realloc (if_data.ifc_buf, if_data.ifc_len);
+
+ // Try to get all local interfaces.
+ if (::ioctl (fd, SIOCGIFCONF, &if_data) < 0)
+ throw new java::net::SocketException;
+ }
+ while (if_data.ifc_len >= (sizeof (struct ifreq) * num_interfaces));
+
+ // Get addresses of all interfaces.
+ if_record = if_data.ifc_req;
+ for (int n = 0; n < if_data.ifc_len; n += sizeof (struct ifreq))
+ {
+ struct ifreq ifr;
+
+ memset (&ifr, 0, sizeof (ifr));
+ strcpy (ifr.ifr_name, if_record->ifr_name);
+
+ // Try to get the IPv4-address of the local interface
+ if (::ioctl (fd, SIOCGIFADDR, &ifr) < 0)
+ throw new java::net::SocketException;
+
+ int len = 4;
+ struct sockaddr_in sa = *((sockaddr_in*) &(ifr.ifr_addr));
+
+ jbyteArray baddr = JvNewByteArray (len);
+ memcpy (elements (baddr), &(sa.sin_addr), len);
+ jstring if_name = JvNewStringLatin1 (if_record->ifr_name);
+ Inet4Address* address =
+ new java::net::Inet4Address (baddr, JvNewStringLatin1 (""));
+ ht->add (new NetworkInterface (if_name, address));
+ if_record++;
+ }
+
+#ifdef HAVE_INET6
+ // FIXME: read /proc/net/if_inet6 (on Linux 2.4)
+#endif
+
+ _Jv_Free (if_data.ifc_buf);
+
+ if (fd >= 0)
+ ::close (fd);
+
+ return ht;
+#endif /* WIN32 */
+}
+
+#endif // DISABLE_JAVA_NET //
diff --git a/libjava/java/net/natPlainDatagramSocketImpl.cc b/libjava/java/net/natPlainDatagramSocketImpl.cc
index 2375bdbae4e..84de798d944 100644
--- a/libjava/java/net/natPlainDatagramSocketImpl.cc
+++ b/libjava/java/net/natPlainDatagramSocketImpl.cc
@@ -17,13 +17,10 @@ details. */
#define ENOPROTOOPT 109
#endif
-static inline int
-close(int s)
-{
- return closesocket(s);
-}
+#define NATIVE_CLOSE(s) closesocket (s)
#else /* WIN32 */
+
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
@@ -35,6 +32,9 @@ close(int s)
#endif
#include <errno.h>
#include <string.h>
+
+#define NATIVE_CLOSE(s) ::close (s)
+
#endif /* WIN32 */
#if HAVE_BSTRING_H
@@ -63,6 +63,7 @@ _Jv_bind (int fd, struct sockaddr *addr, int addrlen)
#include <java/net/SocketException.h>
#include <java/net/PlainDatagramSocketImpl.h>
#include <java/net/InetAddress.h>
+#include <java/net/NetworkInterface.h>
#include <java/net/DatagramPacket.h>
#include <java/lang/InternalError.h>
#include <java/lang/Object.h>
@@ -85,6 +86,20 @@ java::net::PlainDatagramSocketImpl::bind (jint, java::net::InetAddress *)
JvNewStringLatin1 ("DatagramSocketImpl.bind: unimplemented"));
}
+void
+java::net::PlainDatagramSocketImpl::connect (java::net::InetAddress *, jint)
+{
+ throw new SocketException (
+ JvNewStringLatin1 ("DatagramSocketImpl.connect: unimplemented"));
+}
+
+void
+java::net::PlainDatagramSocketImpl::disconnect ()
+{
+ throw new SocketException (
+ JvNewStringLatin1 ("DatagramSocketImpl.disconnect: unimplemented"));
+}
+
jint
java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *)
{
@@ -92,6 +107,13 @@ java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *)
JvNewStringLatin1 ("DatagramSocketImpl.peek: unimplemented"));
}
+jint
+java::net::PlainDatagramSocketImpl::peekData(java::net::DatagramPacket *)
+{
+ throw new java::io::IOException (
+ JvNewStringLatin1 ("DatagramSocketImpl.peekData: unimplemented"));
+}
+
void
java::net::PlainDatagramSocketImpl::close ()
{
@@ -129,6 +151,7 @@ java::net::PlainDatagramSocketImpl::getTimeToLive ()
void
java::net::PlainDatagramSocketImpl::mcastGrp (java::net::InetAddress *,
+ java::net::NetworkInterface *,
jboolean)
{
throw new java::io::IOException (
@@ -256,6 +279,20 @@ java::net::PlainDatagramSocketImpl::bind (jint lport,
throw new java::net::BindException (JvNewStringUTF (strerr));
}
+void
+java::net::PlainDatagramSocketImpl::connect (java::net::InetAddress *, jint)
+{
+ throw new ::java::lang::InternalError (JvNewStringLatin1 (
+ "PlainDatagramSocketImpl::connect: not implemented yet"));
+}
+
+void
+java::net::PlainDatagramSocketImpl::disconnect ()
+{
+ throw new ::java::lang::InternalError (JvNewStringLatin1 (
+ "PlainDatagramSocketImpl::disconnect: not implemented yet"));
+}
+
jint
java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *i)
{
@@ -294,6 +331,68 @@ java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *i)
throw new java::io::IOException (JvNewStringUTF (strerr));
}
+jint
+java::net::PlainDatagramSocketImpl::peekData(java::net::DatagramPacket *p)
+{
+ // FIXME: Deal with Multicast and if the socket is connected.
+ union SockAddr u;
+ socklen_t addrlen = sizeof(u);
+ jbyte *dbytes = elements (p->getData());
+ ssize_t retlen = 0;
+
+// FIXME: implement timeout support for Win32
+#ifndef WIN32
+ // Do timeouts via select since SO_RCVTIMEO is not always available.
+ if (timeout > 0 && fnum >= 0 && fnum < FD_SETSIZE)
+ {
+ fd_set rset;
+ struct timeval tv;
+ FD_ZERO(&rset);
+ FD_SET(fnum, &rset);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ int retval;
+ if ((retval = _Jv_select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
+ goto error;
+ else if (retval == 0)
+ throw new java::io::InterruptedIOException ();
+ }
+#endif /* WIN32 */
+
+ retlen =
+ ::recvfrom (fnum, (char *) dbytes, p->getLength(), MSG_PEEK, (sockaddr*) &u,
+ &addrlen);
+ if (retlen < 0)
+ goto error;
+ // FIXME: Deal with Multicast addressing and if the socket is connected.
+ jbyteArray raddr;
+ jint rport;
+ if (u.address.sin_family == AF_INET)
+ {
+ raddr = JvNewByteArray (4);
+ memcpy (elements (raddr), &u.address.sin_addr, 4);
+ rport = ntohs (u.address.sin_port);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ raddr = JvNewByteArray (16);
+ memcpy (elements (raddr), &u.address6.sin6_addr, 16);
+ rport = ntohs (u.address6.sin6_port);
+ }
+#endif
+ else
+ throw new java::net::SocketException (JvNewStringUTF ("invalid family"));
+
+ p->setAddress (new InetAddress (raddr, NULL));
+ p->setPort (rport);
+ p->setLength ((jint) retlen);
+ return rport;
+ error:
+ char* strerr = strerror (errno);
+ throw new java::io::IOException (JvNewStringUTF (strerr));
+}
+
// Close(shutdown) the socket.
void
java::net::PlainDatagramSocketImpl::close ()
@@ -303,7 +402,7 @@ java::net::PlainDatagramSocketImpl::close ()
// The method isn't declared to throw anything, so we disregard
// the return value.
- ::close (fnum);
+ NATIVE_CLOSE (fnum);
fnum = -1;
timeout = 0;
}
@@ -435,8 +534,11 @@ java::net::PlainDatagramSocketImpl::getTimeToLive ()
void
java::net::PlainDatagramSocketImpl::mcastGrp (java::net::InetAddress *inetaddr,
+ java::net::NetworkInterface *,
jboolean join)
{
+ // FIXME: implement use of NetworkInterface
+
union McastReq u;
jbyteArray haddress = inetaddr->addr;
jbyte *bytes = elements (haddress);
@@ -524,6 +626,22 @@ java::net::PlainDatagramSocketImpl::setOption (jint optID,
throw new java::net::SocketException (
JvNewStringUTF ("SO_LINGER not valid for UDP"));
return;
+ case _Jv_SO_KEEPALIVE_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("SO_KEEPALIVE not valid for UDP"));
+ return;
+
+ case _Jv_SO_BROADCAST_ :
+ if (::setsockopt (fnum, SOL_SOCKET, SO_BROADCAST, (char *) &val,
+ val_len) != 0)
+ goto error;
+ break;
+
+ case _Jv_SO_OOBINLINE_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("SO_OOBINLINE: not valid for UDP"));
+ break;
+
case _Jv_SO_SNDBUF_ :
case _Jv_SO_RCVBUF_ :
#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
@@ -587,6 +705,23 @@ java::net::PlainDatagramSocketImpl::setOption (jint optID,
if (::setsockopt (fnum, level, opname, ptr, len) != 0)
goto error;
return;
+
+ case _Jv_IP_MULTICAST_IF2_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_IF2: not yet implemented"));
+ break;
+
+ case _Jv_IP_MULTICAST_LOOP_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_LOOP: not yet implemented"));
+ break;
+
+ case _Jv_IP_TOS_ :
+ if (::setsockopt (fnum, SOL_SOCKET, IP_TOS, (char *) &val,
+ val_len) != 0)
+ goto error;
+ return;
+
case _Jv_SO_TIMEOUT_ :
timeout = val;
return;
@@ -613,11 +748,26 @@ java::net::PlainDatagramSocketImpl::getOption (jint optID)
throw new java::net::SocketException (
JvNewStringUTF ("TCP_NODELAY not valid for UDP"));
break;
-
case _Jv_SO_LINGER_ :
throw new java::net::SocketException (
JvNewStringUTF ("SO_LINGER not valid for UDP"));
break;
+ case _Jv_SO_KEEPALIVE_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("SO_KEEPALIVE not valid for UDP"));
+ break;
+
+ case _Jv_SO_BROADCAST_ :
+ if (::getsockopt (fnum, SOL_SOCKET, SO_BROADCAST, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Boolean (val != 0);
+
+ case _Jv_SO_OOBINLINE_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("SO_OOBINLINE not valid for UDP"));
+ break;
+
case _Jv_SO_RCVBUF_ :
case _Jv_SO_SNDBUF_ :
#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
@@ -652,7 +802,8 @@ java::net::PlainDatagramSocketImpl::getOption (jint optID)
}
#endif
else
- throw new java::net::SocketException (JvNewStringUTF ("invalid family"));
+ throw new java::net::SocketException (
+ JvNewStringUTF ("invalid family"));
localAddress = new java::net::InetAddress (laddr, NULL);
}
return localAddress;
@@ -690,6 +841,24 @@ java::net::PlainDatagramSocketImpl::getOption (jint optID)
case _Jv_SO_TIMEOUT_ :
return new java::lang::Integer (timeout);
break;
+
+ case _Jv_IP_MULTICAST_IF2_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_IF2: not yet implemented"));
+ break;
+
+ case _Jv_IP_MULTICAST_LOOP_ :
+ if (::getsockopt (fnum, SOL_SOCKET, IP_MULTICAST_LOOP, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Boolean (val != 0);
+
+ case _Jv_IP_TOS_ :
+ if (::getsockopt (fnum, SOL_SOCKET, IP_TOS, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Integer (val);
+
default :
errno = ENOPROTOOPT;
}
diff --git a/libjava/java/net/natPlainSocketImpl.cc b/libjava/java/net/natPlainSocketImpl.cc
index 4a75e980073..a1e967eb8b3 100644
--- a/libjava/java/net/natPlainSocketImpl.cc
+++ b/libjava/java/net/natPlainSocketImpl.cc
@@ -20,13 +20,9 @@ details. */
#undef MIN_PRIORITY
#undef FIONREAD
-// These functions make the Win32 socket API look more POSIXy
-static inline int
-close(int s)
-{
- return closesocket(s);
-}
+#define NATIVE_CLOSE(s) closesocket (s)
+// These functions make the Win32 socket API look more POSIXy
static inline int
write(int s, void *buf, int len)
{
@@ -63,6 +59,8 @@ read(int s, void *buf, int len)
#include <errno.h>
#include <string.h>
+#define NATIVE_CLOSE(s) ::close (s)
+
#endif /* WIN32 */
#endif /* DISABLE_JAVA_NET */
@@ -120,7 +118,9 @@ _Jv_accept (int fd, struct sockaddr *addr, socklen_t *addrlen)
#include <java/net/ConnectException.h>
#include <java/net/PlainSocketImpl.h>
#include <java/net/InetAddress.h>
+#include <java/net/InetSocketAddress.h>
#include <java/net/SocketException.h>
+#include <java/net/SocketTimeoutException.h>
#include <java/lang/InternalError.h>
#include <java/lang/Object.h>
#include <java/lang/Boolean.h>
@@ -148,7 +148,7 @@ java::net::PlainSocketImpl::bind (java::net::InetAddress *, jint)
}
void
-java::net::PlainSocketImpl::connect (java::net::InetAddress *, jint)
+java::net::PlainSocketImpl::connect (java::net::SocketAddress *, jint)
{
throw new ConnectException (
JvNewStringLatin1 ("SocketImpl.connect: unimplemented"));
@@ -210,6 +210,13 @@ java::net::PlainSocketImpl::write(jbyteArray b, jint offset, jint len)
JvNewStringLatin1 ("SocketImpl.write: unimplemented"));
}
+void
+java::net::PlainSocketImpl::sendUrgentData(jint data)
+{
+ throw new SocketException (
+ JvNewStringLatin1 ("SocketImpl.sendUrgentData: unimplemented"));
+}
+
jint
java::net::PlainSocketImpl::available(void)
{
@@ -224,6 +231,20 @@ java::net::PlainSocketImpl::close(void)
JvNewStringLatin1 ("SocketImpl.close: unimplemented"));
}
+void
+java::net::PlainSocketImpl::shutdownInput (void)
+{
+ throw new SocketException (
+ JvNewStringLatin1 ("SocketImpl.shutdownInput: unimplemented"));
+}
+
+void
+java::net::PlainSocketImpl::shutdownOutput (void)
+{
+ throw new SocketException (
+ JvNewStringLatin1 ("SocketImpl.shutdownOutput: unimplemented"));
+}
+
#else /* DISABLE_JAVA_NET */
union SockAddr
@@ -304,8 +325,13 @@ java::net::PlainSocketImpl::bind (java::net::InetAddress *host, jint lport)
}
void
-java::net::PlainSocketImpl::connect (java::net::InetAddress *host, jint rport)
+java::net::PlainSocketImpl::connect (java::net::SocketAddress *addr,
+ jint timeout)
{
+ java::net::InetSocketAddress *tmp = (java::net::InetSocketAddress*) addr;
+ java::net::InetAddress *host = tmp->getAddress();
+ jint rport = tmp->getPort();
+
union SockAddr u;
socklen_t addrlen = sizeof(u);
jbyteArray haddress = host->addr;
@@ -331,8 +357,37 @@ java::net::PlainSocketImpl::connect (java::net::InetAddress *host, jint rport)
else
throw new java::net::SocketException (JvNewStringUTF ("invalid length"));
- if (_Jv_connect (fnum, ptr, len) != 0)
- goto error;
+// FIXME: implement timeout support for Win32
+#ifndef WIN32
+ if (timeout > 0)
+ {
+ int flags = ::fcntl (fnum, F_GETFL);
+ ::fcntl (fnum, F_SETFL, flags | O_NONBLOCK);
+
+ if ((_Jv_connect (fnum, ptr, len) != 0) && (errno != EINPROGRESS))
+ goto error;
+
+ fd_set rset;
+ struct timeval tv;
+ FD_ZERO(&rset);
+ FD_SET(fnum, &rset);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ int retval;
+
+ if ((retval = _Jv_select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
+ goto error;
+ else if (retval == 0)
+ throw new java::net::SocketTimeoutException (
+ JvNewStringUTF("Connect timed out"));
+ }
+ else
+#endif
+ {
+ if (_Jv_connect (fnum, ptr, len) != 0)
+ goto error;
+ }
+
address = host;
port = rport;
// A bind may not have been done on this socket; if so, set localport now.
@@ -429,7 +484,7 @@ java::net::PlainSocketImpl::close()
JvSynchronize sync (this);
// should we use shutdown here? how would that effect so_linger?
- int res = ::close (fnum);
+ int res = NATIVE_CLOSE (fnum);
if (res == -1)
{
@@ -506,6 +561,12 @@ java::net::PlainSocketImpl::write(jbyteArray b, jint offset, jint len)
}
}
+void
+java::net::PlainSocketImpl::sendUrgentData (jint)
+{
+ throw new SocketException (JvNewStringLatin1 (
+ "PlainSocketImpl: sending of urgent data not supported by this socket"));
+}
// Read a single byte from the socket.
jint
@@ -527,7 +588,8 @@ java::net::PlainSocketImpl::read(void)
timeout_value.tv_sec = timeout / 1000;
timeout_value.tv_usec = (timeout % 1000) * 1000;
// Select on the fds.
- int sel_retval = _Jv_select (fnum + 1, &read_fds, NULL, NULL, &timeout_value);
+ int sel_retval =
+ _Jv_select (fnum + 1, &read_fds, NULL, NULL, &timeout_value);
// If select returns 0 we've waited without getting data...
// that means we've timed out.
if (sel_retval == 0)
@@ -586,7 +648,8 @@ java::net::PlainSocketImpl::read(jbyteArray buffer, jint offset, jint count)
timeout_value.tv_sec = timeout / 1000;
timeout_value.tv_usec =(timeout % 1000) * 1000;
// Select on the fds.
- int sel_retval = _Jv_select (fnum + 1, &read_fds, NULL, NULL, &timeout_value);
+ int sel_retval =
+ _Jv_select (fnum + 1, &read_fds, NULL, NULL, &timeout_value);
// We're only interested in the 0 return.
// error returns still require us to try to read
// the socket to see what happened.
@@ -715,7 +778,8 @@ java::net::PlainSocketImpl::setOption (jint optID, java::lang::Object *value)
}
else
{
- throw new java::lang::IllegalArgumentException (JvNewStringLatin1 ("`value' must be Boolean or Integer"));
+ throw new java::lang::IllegalArgumentException (
+ JvNewStringLatin1 ("`value' must be Boolean or Integer"));
}
switch (optID)
@@ -724,12 +788,30 @@ java::net::PlainSocketImpl::setOption (jint optID, java::lang::Object *value)
#ifdef TCP_NODELAY
if (::setsockopt (fnum, IPPROTO_TCP, TCP_NODELAY, (char *) &val,
val_len) != 0)
- goto error;
+ goto error;
#else
throw new java::lang::InternalError (
JvNewStringUTF ("TCP_NODELAY not supported"));
#endif /* TCP_NODELAY */
return;
+
+ case _Jv_SO_KEEPALIVE_ :
+ if (::setsockopt (fnum, SOL_SOCKET, SO_KEEPALIVE, (char *) &val,
+ val_len) != 0)
+ goto error;
+ break;
+
+ case _Jv_SO_BROADCAST_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("SO_BROADCAST not valid for TCP"));
+ break;
+
+ case _Jv_SO_OOBINLINE_ :
+ if (::setsockopt (fnum, SOL_SOCKET, SO_OOBINLINE, (char *) &val,
+ val_len) != 0)
+ goto error;
+ break;
+
case _Jv_SO_LINGER_ :
#ifdef SO_LINGER
struct linger l_val;
@@ -763,6 +845,23 @@ java::net::PlainSocketImpl::setOption (jint optID, java::lang::Object *value)
throw new java::net::SocketException (
JvNewStringUTF ("IP_MULTICAST_IF: not valid for TCP"));
return;
+
+ case _Jv_IP_MULTICAST_IF2_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_IF2: not valid for TCP"));
+ break;
+
+ case _Jv_IP_MULTICAST_LOOP_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_LOOP: not valid for TCP"));
+ break;
+
+ case _Jv_IP_TOS_ :
+ if (::setsockopt (fnum, SOL_SOCKET, IP_TOS, (char *) &val,
+ val_len) != 0)
+ goto error;
+ break;
+
case _Jv_SO_REUSEADDR_ :
throw new java::net::SocketException (
JvNewStringUTF ("SO_REUSEADDR: not valid for TCP"));
@@ -812,12 +911,32 @@ java::net::PlainSocketImpl::getOption (jint optID)
if (l_val.l_onoff)
return new java::lang::Integer (l_val.l_linger);
else
- return new java::lang::Boolean ((__java_boolean)false);
+ return new java::lang::Boolean ((jboolean)false);
#else
throw new java::lang::InternalError (
JvNewStringUTF ("SO_LINGER not supported"));
#endif
break;
+
+ case _Jv_SO_KEEPALIVE_ :
+ if (::getsockopt (fnum, SOL_SOCKET, SO_KEEPALIVE, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ else
+ return new java::lang::Boolean (val != 0);
+
+ case _Jv_SO_BROADCAST_ :
+ if (::getsockopt (fnum, SOL_SOCKET, SO_BROADCAST, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Boolean ((jboolean)val);
+
+ case _Jv_SO_OOBINLINE_ :
+ if (::getsockopt (fnum, SOL_SOCKET, SO_OOBINLINE, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Boolean ((jboolean)val);
+
case _Jv_SO_RCVBUF_ :
case _Jv_SO_SNDBUF_ :
#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
@@ -852,8 +971,8 @@ java::net::PlainSocketImpl::getOption (jint optID)
}
#endif
else
- throw
- new java::net::SocketException (JvNewStringUTF ("invalid family"));
+ throw new java::net::SocketException (
+ JvNewStringUTF ("invalid family"));
localAddress = new java::net::InetAddress (laddr, NULL);
}
return localAddress;
@@ -862,6 +981,24 @@ java::net::PlainSocketImpl::getOption (jint optID)
throw new java::net::SocketException (
JvNewStringUTF ("IP_MULTICAST_IF: not valid for TCP"));
break;
+
+ case _Jv_IP_MULTICAST_IF2_ :
+ throw new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_IF2: not valid for TCP"));
+ break;
+
+ case _Jv_IP_MULTICAST_LOOP_ :
+ throw new java::net::SocketException(
+ JvNewStringUTF ("IP_MULTICAST_LOOP: not valid for TCP"));
+ break;
+
+ case _Jv_IP_TOS_ :
+ if (::getsockopt (fnum, SOL_SOCKET, IP_TOS, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Integer (val);
+ break;
+
case _Jv_SO_REUSEADDR_ :
throw new java::net::SocketException (
JvNewStringUTF ("SO_REUSEADDR: not valid for TCP"));
@@ -878,4 +1015,18 @@ java::net::PlainSocketImpl::getOption (jint optID)
throw new java::net::SocketException (JvNewStringUTF (strerr));
}
+void
+java::net::PlainSocketImpl::shutdownInput (void)
+{
+ if (::shutdown (fnum, 0))
+ throw new SocketException (JvNewStringUTF (strerror (errno)));
+}
+
+void
+java::net::PlainSocketImpl::shutdownOutput (void)
+{
+ if (::shutdown (fnum, 1))
+ throw new SocketException (JvNewStringUTF (strerror (errno)));
+}
+
#endif /* DISABLE_JAVA_NET */
diff --git a/libjava/java/nio/Buffer.java b/libjava/java/nio/Buffer.java
new file mode 100644
index 00000000000..4e18cbda144
--- /dev/null
+++ b/libjava/java/nio/Buffer.java
@@ -0,0 +1,42 @@
+/* Buffer.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio;
+
+public abstract class Buffer
+{
+}
diff --git a/libjava/java/nio/ByteBuffer.java b/libjava/java/nio/ByteBuffer.java
new file mode 100644
index 00000000000..4b02f7fcafc
--- /dev/null
+++ b/libjava/java/nio/ByteBuffer.java
@@ -0,0 +1,42 @@
+/* ByteBuffer.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio;
+
+public abstract class ByteBuffer extends Buffer
+{
+}
diff --git a/libjava/java/nio/MappedByteBuffer.java b/libjava/java/nio/MappedByteBuffer.java
new file mode 100644
index 00000000000..dc1b20d892c
--- /dev/null
+++ b/libjava/java/nio/MappedByteBuffer.java
@@ -0,0 +1,42 @@
+/* MappedByteBuffer.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio;
+
+public abstract class MappedByteBuffer extends ByteBuffer
+{
+}
diff --git a/libjava/java/nio/channels/AlreadyConnectedException.java b/libjava/java/nio/channels/AlreadyConnectedException.java
new file mode 100644
index 00000000000..29e3cda0efa
--- /dev/null
+++ b/libjava/java/nio/channels/AlreadyConnectedException.java
@@ -0,0 +1,50 @@
+/* AlreadyConnectedException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.io.IOException;
+
+public class AlreadyConnectedException extends IOException
+{
+ /**
+ * Creates the exception
+ */
+ public AlreadyConnectedException()
+ {
+ }
+}
diff --git a/libjava/java/nio/channels/ByteChannel.java b/libjava/java/nio/channels/ByteChannel.java
new file mode 100644
index 00000000000..f4958be2bf7
--- /dev/null
+++ b/libjava/java/nio/channels/ByteChannel.java
@@ -0,0 +1,43 @@
+/* ByteChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+public interface ByteChannel
+ extends ReadableByteChannel, WritableByteChannel
+{
+}
diff --git a/libjava/java/nio/channels/Channel.java b/libjava/java/nio/channels/Channel.java
new file mode 100644
index 00000000000..b5272c36776
--- /dev/null
+++ b/libjava/java/nio/channels/Channel.java
@@ -0,0 +1,55 @@
+/* Channel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.io.IOException;
+
+public interface Channel
+{
+ /**
+ * Tells whether this channel is open or not
+ */
+ public boolean isOpen();
+
+ /**
+ * Closes this channel
+ *
+ * @exception IOException If an error occurs
+ */
+ public void close() throws IOException;
+}
diff --git a/libjava/java/nio/channels/ClosedChannelException.java b/libjava/java/nio/channels/ClosedChannelException.java
new file mode 100644
index 00000000000..2576d34c3c8
--- /dev/null
+++ b/libjava/java/nio/channels/ClosedChannelException.java
@@ -0,0 +1,50 @@
+/* ClosedChannelException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.io.IOException;
+
+public class ClosedChannelException extends IOException
+{
+ /**
+ * Creates the exception
+ */
+ public ClosedChannelException()
+ {
+ }
+}
diff --git a/libjava/java/nio/channels/DatagramChannel.java b/libjava/java/nio/channels/DatagramChannel.java
new file mode 100644
index 00000000000..74a26c64ec5
--- /dev/null
+++ b/libjava/java/nio/channels/DatagramChannel.java
@@ -0,0 +1,47 @@
+/* DatagramChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.nio.channels.spi.AbstractSelectableChannel;
+
+public class DatagramChannel
+ extends AbstractSelectableChannel
+{
+}
+
+
diff --git a/libjava/java/nio/channels/GatheringByteChannel.java b/libjava/java/nio/channels/GatheringByteChannel.java
new file mode 100644
index 00000000000..3ef12b7b6dc
--- /dev/null
+++ b/libjava/java/nio/channels/GatheringByteChannel.java
@@ -0,0 +1,79 @@
+/* GatheringByteChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.nio.ByteBuffer;
+import java.io.IOException;
+
+public interface GatheringByteChannel
+ extends WritableByteChannel
+{
+ /**
+ * Writes a sequence of bytes to this channel from a subsequence of
+ * the given buffers
+ *
+ * @exception AsynchronousCloseException If another thread closes this
+ * channel while the write operation is in progress
+ * @exception ClosedByInterruptException If another thread interrupts the
+ * current thread while the write operation is in progress, thereby closing
+ * the channel and setting the current thread's interrupt status
+ * @exception ClosedChannelException If this channel is closed
+ * @exception IndexOutOfBoundsException If the preconditions on the offset
+ * and length parameters do not hold
+ * @exception IOException If an error occurs
+ * @exception NonWritableChannelException If this channel was not opened for
+ * writing
+ */
+ public long write(ByteBuffer[] srcs, int offset, int length)
+ throws IOException;
+
+ /**
+ * Writes a sequence of bytes to this channel from the given buffers
+ *
+ * @exception AsynchronousCloseException If another thread closes this
+ * channel while the write operation is in progress
+ * @exception ClosedByInterruptException If another thread interrupts the
+ * current thread while the write operation is in progress, thereby closing
+ * the channel and setting the current thread's interrupt status
+ * @exception ClosedChannelException If this channel is closed
+ * @exception IOException If an error occurs
+ * @exception NonWritableChannelException If this channel was not opened for
+ * writing
+ */
+ public long write(ByteBuffer[] srcs) throws IOException;
+}
diff --git a/libjava/java/nio/channels/IllegalBlockingModeException.java b/libjava/java/nio/channels/IllegalBlockingModeException.java
new file mode 100644
index 00000000000..dca8110059b
--- /dev/null
+++ b/libjava/java/nio/channels/IllegalBlockingModeException.java
@@ -0,0 +1,56 @@
+/* IllegalBlockingModeException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+/**
+ * @author Michael Koch <konqueror@gmx.de>
+ * @since 1.4
+ *
+ * Written using JDK 1.4.1 Online API from Sun
+ * Status: JDK 1.4 complete
+ */
+public class IllegalBlockingModeException extends IllegalStateException
+{
+ /**
+ * Creates the exception
+ */
+ public IllegalBlockingModeException()
+ {
+ super();
+ }
+}
diff --git a/libjava/java/nio/channels/InterruptibleChannel.java b/libjava/java/nio/channels/InterruptibleChannel.java
new file mode 100644
index 00000000000..0b55e7619a5
--- /dev/null
+++ b/libjava/java/nio/channels/InterruptibleChannel.java
@@ -0,0 +1,50 @@
+/* InterruptibleChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.io.IOException;
+
+public interface InterruptibleChannel extends Channel
+{
+ /**
+ * Closes this channel
+ *
+ * @exception IOException If an error occurs
+ */
+ void close() throws IOException;
+}
diff --git a/libjava/java/nio/channels/ReadableByteChannel.java b/libjava/java/nio/channels/ReadableByteChannel.java
new file mode 100644
index 00000000000..d1653cc8d3e
--- /dev/null
+++ b/libjava/java/nio/channels/ReadableByteChannel.java
@@ -0,0 +1,59 @@
+/* ReadableByteChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public interface ReadableByteChannel extends Channel
+{
+ /**
+ * Reads a sequence of bytes from this channel into the given buffer
+ *
+ * @exception AsynchronousCloseException If another thread closes this
+ * channel while the read operation is in progress
+ * @exception ClosedByInterruptException If another thread interrupts the
+ * current thread while the read operation is in progress, thereby closing
+ * the channel and setting the current thread's interrupt status
+ * @exception ClosedChannelException If this channel is closed
+ * @exception IOException If an error occurs
+ * @exception NonReadableChannelException If this channel was not opened for
+ * reading
+ */
+ public int read (ByteBuffer dst) throws IOException;
+}
diff --git a/libjava/java/nio/channels/ScatteringByteChannel.java b/libjava/java/nio/channels/ScatteringByteChannel.java
new file mode 100644
index 00000000000..a9efdbef448
--- /dev/null
+++ b/libjava/java/nio/channels/ScatteringByteChannel.java
@@ -0,0 +1,79 @@
+/* ScatteringByteChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.nio.ByteBuffer;
+import java.io.IOException;
+
+public interface ScatteringByteChannel
+ extends ReadableByteChannel
+{
+ /**
+ * Reads a sequence of bytes from this channel into a subsequence of the
+ * given buffers
+ *
+ * @exception AsynchronousCloseException If another thread closes this
+ * channel while the write operation is in progress
+ * @exception ClosedByInterruptException If another thread interrupts the
+ * current thread while the write operation is in progress, thereby closing
+ * the channel and setting the current thread's interrupt status
+ * @exception ClosedChannelException If this channel is closed
+ * @exception IndexOutOfBoundsException If the preconditions on the offset
+ * and length parameters do not hold
+ * @exception IOException If an error occurs
+ * @exception NonReadableChannelException If this channel was not opened for
+ * reading
+ */
+ public long read(ByteBuffer[] srcs, int offset, int length)
+ throws IOException;
+
+ /**
+ * Reads a sequence of bytes from this channel into the given buffers
+ *
+ * @exception AsynchronousCloseException If another thread closes this
+ * channel while the write operation is in progress
+ * @exception ClosedByInterruptException If another thread interrupts the
+ * current thread while the write operation is in progress, thereby closing
+ * the channel and setting the current thread's interrupt status
+ * @exception ClosedChannelException If this channel is closed
+ * @exception IOException If an error occurs
+ * @exception NonReadableChannelException If this channel was not opened for
+ * reading
+ */
+ public long read(ByteBuffer[] srcs) throws IOException;
+}
diff --git a/libjava/java/nio/channels/ServerSocketChannel.java b/libjava/java/nio/channels/ServerSocketChannel.java
new file mode 100644
index 00000000000..e5d95c1bfbb
--- /dev/null
+++ b/libjava/java/nio/channels/ServerSocketChannel.java
@@ -0,0 +1,45 @@
+/* ServerSocketChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.nio.channels.spi.AbstractSelectableChannel;
+
+public class ServerSocketChannel
+ extends AbstractSelectableChannel
+{
+}
diff --git a/libjava/java/nio/channels/SocketChannel.java b/libjava/java/nio/channels/SocketChannel.java
new file mode 100644
index 00000000000..05fc8a55f63
--- /dev/null
+++ b/libjava/java/nio/channels/SocketChannel.java
@@ -0,0 +1,45 @@
+/* SocketChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.nio.channels.spi.AbstractSelectableChannel;
+
+public class SocketChannel
+ extends AbstractSelectableChannel
+{
+}
diff --git a/libjava/java/nio/channels/WritableByteChannel.java b/libjava/java/nio/channels/WritableByteChannel.java
new file mode 100644
index 00000000000..003437e5f3c
--- /dev/null
+++ b/libjava/java/nio/channels/WritableByteChannel.java
@@ -0,0 +1,60 @@
+/* WritableByteChannel.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.channels;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public interface WritableByteChannel
+ extends Channel
+{
+ /**
+ * Writes a sequence of bytes to this channel from the given buffer
+ *
+ * @exception AsynchronousCloseException If another thread closes this
+ * channel while the write operation is in progress
+ * @exception ClosedByInterruptException If another thread interrupts the
+ * current thread while the write operation is in progress, thereby closing
+ * the channel and setting the current thread's interrupt status
+ * @exception ClosedChannelException If this channel is closed
+ * @exception IOException If an error occurs
+ * @exception NonWritableChannelException If this channel was not opened for
+ * writing
+ */
+ public int write(ByteBuffer src) throws IOException;
+}
diff --git a/libjava/java/nio/channels/spi/AbstractSelectableChannel.java b/libjava/java/nio/channels/spi/AbstractSelectableChannel.java
new file mode 100644
index 00000000000..99f7233f00b
--- /dev/null
+++ b/libjava/java/nio/channels/spi/AbstractSelectableChannel.java
@@ -0,0 +1,10 @@
+package java.nio.channels.spi;
+
+public abstract class AbstractSelectableChannel
+{
+ public final boolean isBlocking()
+ {
+ return true;
+ }
+}
+
diff --git a/libjava/java/nio/charset/CharacterCodingException.java b/libjava/java/nio/charset/CharacterCodingException.java
new file mode 100644
index 00000000000..2fba33e9509
--- /dev/null
+++ b/libjava/java/nio/charset/CharacterCodingException.java
@@ -0,0 +1,50 @@
+/* CharacterCodingException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.charset;
+
+import java.io.IOException;
+
+class CharacterCodingException extends IOException
+{
+ /**
+ * Creates the exception
+ */
+ public CharacterCodingException()
+ {
+ }
+}
diff --git a/libjava/java/nio/charset/IllegalCharsetNameException.java b/libjava/java/nio/charset/IllegalCharsetNameException.java
new file mode 100644
index 00000000000..a3e0593327b
--- /dev/null
+++ b/libjava/java/nio/charset/IllegalCharsetNameException.java
@@ -0,0 +1,60 @@
+/* IllegalCharsetNameException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.charset;
+
+class IllegalCharsetNameException extends IllegalArgumentException
+{
+ private String charsetName;
+
+ /**
+ * Creates the exception
+ */
+ public IllegalCharsetNameException (String charsetName)
+ {
+ super ();
+ this.charsetName = charsetName;
+ }
+
+ /**
+ * Retrieves the illegal charset name
+ */
+ public String getCharsetName ()
+ {
+ return charsetName;
+ }
+}
diff --git a/libjava/java/nio/charset/MalformedInputException.java b/libjava/java/nio/charset/MalformedInputException.java
new file mode 100644
index 00000000000..2111b797865
--- /dev/null
+++ b/libjava/java/nio/charset/MalformedInputException.java
@@ -0,0 +1,69 @@
+/* MalformedInputException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.charset;
+
+class MalformedInputException extends CharacterCodingException
+{
+ private int inputLength;
+
+ /**
+ * Creates the exception
+ */
+ public MalformedInputException (int inputLength)
+ {
+ super ();
+ this.inputLength = inputLength;
+ }
+
+ /**
+ * Retrieves the illegal charset name
+ */
+ public int getInputLength ()
+ {
+ return inputLength;
+ }
+
+ /**
+ * Returns the detail message string of this throwable
+ */
+ public String getMessage ()
+ {
+ // FIXME: I think this is not correct
+ return "";
+ }
+}
diff --git a/libjava/java/nio/charset/UnmappableCharacterException.java b/libjava/java/nio/charset/UnmappableCharacterException.java
new file mode 100644
index 00000000000..f1714b8ec41
--- /dev/null
+++ b/libjava/java/nio/charset/UnmappableCharacterException.java
@@ -0,0 +1,69 @@
+/* UnmappableCharacterException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.charset;
+
+class UnmappableCharacterException extends CharacterCodingException
+{
+ private int inputLength;
+
+ /**
+ * Creates the exception
+ */
+ public UnmappableCharacterException (int inputLength)
+ {
+ super ();
+ this.inputLength = inputLength;
+ }
+
+ /**
+ * Retrieves the illegal charset name
+ */
+ public int getInputLength ()
+ {
+ return inputLength;
+ }
+
+ /**
+ * Returns the detail message string of this throwable
+ */
+ public String getMessage ()
+ {
+ // FIXME: I think this is not correct
+ return "";
+ }
+}
diff --git a/libjava/java/nio/charset/UnsupportedCharsetException.java b/libjava/java/nio/charset/UnsupportedCharsetException.java
new file mode 100644
index 00000000000..943164a6837
--- /dev/null
+++ b/libjava/java/nio/charset/UnsupportedCharsetException.java
@@ -0,0 +1,60 @@
+/* UnsupportedCharsetException.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.charset;
+
+class UnsupportedCharsetException extends IllegalArgumentException
+{
+ private String charsetName;
+
+ /**
+ * Creates the exception
+ */
+ public UnsupportedCharsetException (String charsetName)
+ {
+ super ();
+ this.charsetName = charsetName;
+ }
+
+ /**
+ * Retrieves the illegal charset name
+ */
+ public String getCharsetName ()
+ {
+ return charsetName;
+ }
+}
diff --git a/libjava/java/nio/charset/spi/CharsetProvider.java b/libjava/java/nio/charset/spi/CharsetProvider.java
new file mode 100644
index 00000000000..2eddf6161ea
--- /dev/null
+++ b/libjava/java/nio/charset/spi/CharsetProvider.java
@@ -0,0 +1,88 @@
+/* CharsetProvider.java -- charset service provider interface
+ Copyright (C) 2002 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.nio.charset.spi;
+
+//import java.nio.charset.Charset;
+import java.util.Iterator;
+
+/**
+ * This class allows an implementor to provide additional character sets. The
+ * subclass must have a nullary constructor, and be attached to charset
+ * implementation classes. These extensions are loaded via the context class
+ * loader. To provide the charset extension, all files named
+ * <code>META-INF/services/java.nio.charset.spi.CharsetProvider</code> are
+ * read from the classpath. Each one should be a UTF-8 encoded list of
+ * fully-qualified names of concrete subclasses of this class; whitespace is
+ * ignored, and '#' starts comments. Duplicates are ignored. The
+ * implementations must be accessible to the classloader that requests them.
+ *
+ * @author Eric Blake <ebb9@email.byu.edu>
+ * @see Charset
+ * @since 1.4
+ * @status updated to 1.4
+ */
+public abstract class CharsetProvider
+{
+ /**
+ * Initialize a new charset provider. This performs a security check on
+ * RuntimePermission("charsetProvider").
+ *
+ * @throws SecurityException if building a new set is not allowed
+ */
+ protected CharsetProvider()
+ {
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkPermission(new RuntimePermission("charsetProvider"));
+ }
+
+ /**
+ * Returns an iterator over the charsets defined by this provider.
+ *
+ * @return the iterator
+ * @see Charset#availableCharsets()
+ */
+ public abstract Iterator charsets();
+
+ /**
+ * Returns the named charset, by canonical name or alias.
+ *
+ * @return the charset, or null if not supported
+ */
+ //public abstract Charset charsetForName(String name);
+} // class CharsetProvider
diff --git a/libjava/java/rmi/MarshalledObject.java b/libjava/java/rmi/MarshalledObject.java
index eaa7fb534b4..4c9a9ccdb40 100644
--- a/libjava/java/rmi/MarshalledObject.java
+++ b/libjava/java/rmi/MarshalledObject.java
@@ -38,24 +38,73 @@ exception statement from your version. */
package java.rmi;
import java.io.Serializable;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import gnu.java.rmi.RMIMarshalledObjectInputStream;
+import gnu.java.rmi.RMIMarshalledObjectOutputStream;
+/**
+ * FIXME - doc missing
+ */
public final class MarshalledObject
- extends Object implements Serializable {
-
-public MarshalledObject(Object obj) {
- throw new Error("Not implemented");
-}
-
-public boolean equals(Object obj) {
- throw new Error("Not implemented");
-}
-
-public Object get() {
- throw new Error("Not implemented");
-}
-
-public int hashCode() {
- throw new Error("Not implemented");
+ extends Object implements Serializable
+{
+
+ //The following fields are from Java API Documentation "Serialized form"
+ private static final long serialVersionUID = 8988374069173025854L;
+ byte[] objBytes;
+ byte[] locBytes;
+ int hash;
+
+ public MarshalledObject(Object obj) throws java.io.IOException
+ {
+ ByteArrayOutputStream objStream = new ByteArrayOutputStream();
+ RMIMarshalledObjectOutputStream stream = new RMIMarshalledObjectOutputStream(objStream);
+ stream.writeObject(obj);
+ stream.flush();
+ objBytes = objStream.toByteArray();
+ locBytes = stream.getLocBytes();
+
+ //The following algorithm of calculating hashCode is similar to String
+ hash = 0;
+ for (int i = 0; i < objBytes.length; i++)
+ hash = hash * 31 + objBytes[i];
+ if(locBytes != null)
+ for (int i = 0; i < locBytes.length; i++)
+ hash = hash * 31 + locBytes[i];
+ }
+
+ public boolean equals(Object obj)
+ {
+ if(obj == null || !(obj instanceof MarshalledObject) )
+ return false;
+
+ MarshalledObject aobj = (MarshalledObject)obj;
+ if (objBytes == null || aobj.objBytes == null)
+ return objBytes == aobj.objBytes;
+ if (objBytes.length != aobj.objBytes.length)
+ return false;
+ for (int i = 0; i < objBytes.length; i++)
+ {
+ if (objBytes[i] != aobj.objBytes[i])
+ return false;
+ }
+ // Ignore comparison of locBytes(annotation)
+ return true;
+ }
+
+public Object get()
+ throws java.io.IOException, java.lang.ClassNotFoundException
+{
+ if(objBytes == null)
+ return null;
+ RMIMarshalledObjectInputStream stream =
+ new RMIMarshalledObjectInputStream(objBytes, locBytes);
+ return stream.readObject();
}
-
+
+ public int hashCode() {
+ return hash;
+ }
+
}
diff --git a/libjava/java/rmi/activation/ActivationDesc.java b/libjava/java/rmi/activation/ActivationDesc.java
index 0e4216a82cb..b0f22aae760 100644
--- a/libjava/java/rmi/activation/ActivationDesc.java
+++ b/libjava/java/rmi/activation/ActivationDesc.java
@@ -40,8 +40,9 @@ package java.rmi.activation;
import java.io.Serializable;
import java.rmi.MarshalledObject;
-public final class ActivationDesc
- implements Serializable {
+public final class ActivationDesc implements Serializable
+{
+ static final long serialVersionUID = 7455834104417690957L;
private ActivationGroupID groupid;
private String classname;
diff --git a/libjava/java/rmi/activation/ActivationGroupDesc.java b/libjava/java/rmi/activation/ActivationGroupDesc.java
index da61fccc9dd..1c627e4d7b0 100644
--- a/libjava/java/rmi/activation/ActivationGroupDesc.java
+++ b/libjava/java/rmi/activation/ActivationGroupDesc.java
@@ -41,8 +41,9 @@ import java.io.Serializable;
import java.util.Properties;
import java.rmi.MarshalledObject;
-public final class ActivationGroupDesc
- implements Serializable {
+public final class ActivationGroupDesc implements Serializable
+{
+ static final long serialVersionUID = -4936225423168276595L;
public static class CommandEnvironment
implements Serializable {
diff --git a/libjava/java/rmi/activation/ActivationGroupID.java b/libjava/java/rmi/activation/ActivationGroupID.java
index 9ce81609ff4..9fff53bb706 100644
--- a/libjava/java/rmi/activation/ActivationGroupID.java
+++ b/libjava/java/rmi/activation/ActivationGroupID.java
@@ -39,8 +39,9 @@ package java.rmi.activation;
import java.io.Serializable;
-public class ActivationGroupID
- implements Serializable {
+public class ActivationGroupID implements Serializable
+{
+ static final long serialVersionUID = -1648432278909740833L;
private ActivationSystem system;
diff --git a/libjava/java/rmi/activation/ActivationID.java b/libjava/java/rmi/activation/ActivationID.java
index 4f1951ef3d4..62bd7763b42 100644
--- a/libjava/java/rmi/activation/ActivationID.java
+++ b/libjava/java/rmi/activation/ActivationID.java
@@ -41,8 +41,9 @@ import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
-public class ActivationID
- implements Serializable {
+public class ActivationID implements Serializable
+{
+ static final long serialVersionUID = -4608673054848209235L;
private Activator activator;
diff --git a/libjava/java/rmi/server/LogStream.java b/libjava/java/rmi/server/LogStream.java
index 8ba169f83b8..ffbd3f67e71 100644
--- a/libjava/java/rmi/server/LogStream.java
+++ b/libjava/java/rmi/server/LogStream.java
@@ -45,8 +45,8 @@ public class LogStream
extends PrintStream {
public static final int SILENT = 0;
-public static final int BRIEF = 1;
-public static final int VERBOSE = 2;
+public static final int BRIEF = 10;
+public static final int VERBOSE = 20;
private static PrintStream defStream;
diff --git a/libjava/java/rmi/server/RMIClassLoader.java b/libjava/java/rmi/server/RMIClassLoader.java
index cde97b0452e..da8f52c7ce9 100644
--- a/libjava/java/rmi/server/RMIClassLoader.java
+++ b/libjava/java/rmi/server/RMIClassLoader.java
@@ -39,21 +39,25 @@ package java.rmi.server;
import java.net.URL;
import java.net.URLConnection;
+import java.net.URLClassLoader;
import java.io.IOException;
import java.io.DataInputStream;
import java.net.MalformedURLException;
import java.util.StringTokenizer;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.ArrayList;
public class RMIClassLoader
{
- static private class MyClassLoader extends ClassLoader
+ static private class MyClassLoader extends URLClassLoader
{
- /**
- * Non-private constructor to reduce bytecode emitted.
- */
- MyClassLoader()
+ private MyClassLoader(URL[] urls, ClassLoader parent)
{
+ super (urls, parent);
}
Class defineClass(String name, byte[] data)
@@ -62,58 +66,133 @@ public class RMIClassLoader
}
}
- static private MyClassLoader loader = new MyClassLoader();
-
+ private static Map cacheLoaders; //map annotations to loaders
+ private static Map cacheClasses; //map loader to classes that the loader loaded+
+ private static String defaultAnnotation;
+ private static URL defaultCodebase;
+ private static MyClassLoader defaultLoader;
+
+ static
+ {
+ cacheLoaders = Collections.synchronizedMap(new WeakHashMap(5));
+ cacheClasses = Collections.synchronizedMap(new WeakHashMap(5));
+ defaultAnnotation = System.getProperty("java.rmi.server.defaultAnnotation");
+ try
+ {
+ if (defaultAnnotation != null)
+ defaultCodebase = new URL(defaultAnnotation);
+ }
+ catch(Exception _)
+ {
+ defaultCodebase = null;
+ }
+ if (defaultCodebase != null)
+ {
+ defaultLoader = new MyClassLoader(new URL[]{ defaultCodebase },
+ Thread.currentThread().getContextClassLoader());
+ cacheLoaders.put(defaultAnnotation, defaultLoader);
+ cacheClasses.put(defaultLoader, Collections.synchronizedMap(new WeakHashMap()));
+ }
+ }
+
/**
* @deprecated
*/
public static Class loadClass(String name)
throws MalformedURLException, ClassNotFoundException
{
- return loadClass(System.getProperty("java.rmi.server.codebase"), name);
+ return (loadClass("", name));
}
- public static Class loadClass(URL codebase, String name)
- throws MalformedURLException, ClassNotFoundException
+ public static Class loadClass(URL codebase, String name)
+ throws MalformedURLException, ClassNotFoundException
{
URL u = new URL(codebase, name + ".class");
- try
+ try
{
- URLConnection conn = u.openConnection();
- DataInputStream strm = new DataInputStream(conn.getInputStream());
- byte data[] = new byte[conn.getContentLength()];
- strm.readFully(data);
- return loader.defineClass(name, data);
+ URLConnection conn = u.openConnection();
+ DataInputStream strm = new DataInputStream(conn.getInputStream());
+ byte data[] = new byte[conn.getContentLength()];
+ strm.readFully(data);
+ return (defaultLoader.defineClass(name, data));
}
- catch (IOException _)
+ catch (IOException _)
{
- throw new ClassNotFoundException(name);
+ throw new ClassNotFoundException(name);
}
}
-
- public static Class loadClass(String codebase, String name)
- throws MalformedURLException, ClassNotFoundException
+
+ public static Class loadClass(String codebases, String name)
+ throws MalformedURLException, ClassNotFoundException
{
- StringTokenizer tok = new StringTokenizer(codebase, ":");
- while (tok.hasMoreTokens())
+ ClassLoader loader = (ClassLoader)cacheLoaders.get(codebases);
+ if (loader == null)
{
- try
- {
- return loadClass(new URL(tok.nextToken()), name);
- }
- catch (ClassNotFoundException _)
- {
- // Ignore - try the next one.
- }
+ if (codebases != "")
+ {
+ //codebases are separated by " "
+ StringTokenizer tok = new StringTokenizer(codebases, " ");
+ ArrayList urls = new ArrayList();
+ while (tok.hasMoreTokens())
+ urls.add(new URL(tok.nextToken()));
+
+ loader = new MyClassLoader((URL[])urls.toArray(new URL[urls.size()]),
+ Thread.currentThread().getContextClassLoader());
+ cacheLoaders.put(codebases, loader);
+ cacheClasses.put(loader, Collections.synchronizedMap(new WeakHashMap()));
+ }
+ else
+ {
+ //if codebases is empty, construct a classloader
+ // based on current context classloader,
+ // and we won't cache classloader for empty codebases
+ loader = new MyClassLoader(new URL[]{ defaultCodebase },
+ Thread.currentThread().getContextClassLoader());
+ }
}
- throw new ClassNotFoundException(name);
- }
+ Class c = null;
+ Map classes = (Map)cacheClasses.get(loader);
+ if (classes != null)
+ {
+ c = (Class)classes.get(name);
+ if (c == null)
+ {
+ c = loader.loadClass(name);
+ classes.put(name, c);
+ }
+ }else
+ c = loader.loadClass(name);
+
+ return c;
+ }
+
public static String getClassAnnotation(Class cl)
{
- return null; // We don't yet do this.
+ ClassLoader loader = cl.getClassLoader();
+ if (loader == null)
+ {
+ if (defaultCodebase != null)
+ return defaultCodebase.toExternalForm();
+ else
+ return null;
+ }
+ if (loader instanceof URLClassLoader)
+ {
+ URL[] urls = ((URLClassLoader)loader).getURLs();
+ if(urls.length == 0)
+ return null;
+ StringBuffer annotation = new StringBuffer(urls[0].toExternalForm());
+ for(int i = 1; i < urls.length; i++)
+ {
+ annotation.append(' ');
+ annotation.append(urls[i].toExternalForm());
+ }
+ return annotation.toString();
+ }
+ return null;
}
-
+
/**
* @deprecated
*/
diff --git a/libjava/java/rmi/server/RemoteObject.java b/libjava/java/rmi/server/RemoteObject.java
index e73dfc523df..8ae93ff8844 100644
--- a/libjava/java/rmi/server/RemoteObject.java
+++ b/libjava/java/rmi/server/RemoteObject.java
@@ -48,6 +48,7 @@ import java.io.IOException;
import java.lang.ClassNotFoundException;
import java.lang.InstantiationException;
import java.lang.IllegalAccessException;
+import java.lang.reflect.Constructor;
public abstract class RemoteObject
implements Remote, Serializable {
@@ -68,9 +69,22 @@ public RemoteRef getRef() {
return (ref);
}
-public static Remote toStub(Remote obj) throws NoSuchObjectException {
- throw new Error("Not implemented");
-}
+ public static Remote toStub(Remote obj) throws NoSuchObjectException
+ {
+ Class cls = obj.getClass();
+ String classname = cls.getName();
+ ClassLoader cl = cls.getClassLoader();
+ try
+ {
+ Class scls = cl.loadClass(classname + "_Stub");
+ // JDK 1.2 stubs
+ Class[] stubprototype = new Class[] { RemoteRef.class };
+ Constructor con = scls.getConstructor(stubprototype);
+ return (Remote)(con.newInstance(new Object[]{obj}));
+ }
+ catch (Exception e) {}
+ throw new NoSuchObjectException(obj.getClass().getName());
+ }
public int hashCode() {
if (ref == null) {
@@ -86,30 +100,46 @@ public boolean equals(Object obj) {
return (this == obj);
}
-public String toString() {
- return (ref.toString());
-}
-
-private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
- String cname = in.readUTF();
- if (!cname.equals("")) {
- cname = RemoteRef.packagePrefix + '.' + cname;
- try {
- Class cls = Class.forName(cname);
- ref = (RemoteRef)cls.newInstance();
- }
- catch (InstantiationException e1) {
- throw new UnmarshalException("failed to create ref");
- }
- catch (IllegalAccessException e2) {
- throw new UnmarshalException("failed to create ref");
- }
- ref.readExternal(in);
- }
- else {
- ref = (RemoteRef)in.readObject();
- }
-}
+ public String toString()
+ {
+ if (ref == null)
+ return getClass ().toString ();
+ return (ref.toString ());
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
+ {
+ String cname = in.readUTF();
+ if (!cname.equals(""))
+ {
+ if (cname.equals ("UnicastRef2"))
+ {
+ // hack for interoperating with JDK
+ cname = "UnicastRef";
+ in.read (); //some unknown UnicastRef2 field
+ }
+
+ cname = RemoteRef.packagePrefix + '.' + cname;
+ try
+ {
+ Class cls = Class.forName(cname);
+ ref = (RemoteRef)cls.newInstance();
+ }
+ catch (InstantiationException e1)
+ {
+ throw new UnmarshalException("failed to create ref");
+ }
+ catch (IllegalAccessException e2)
+ {
+ throw new UnmarshalException("failed to create ref");
+ }
+ ref.readExternal(in);
+ }
+ else
+ {
+ ref = (RemoteRef)in.readObject();
+ }
+ }
private void writeObject(ObjectOutputStream out) throws IOException, ClassNotFoundException {
if (ref == null) {
diff --git a/libjava/java/rmi/server/RemoteServer.java b/libjava/java/rmi/server/RemoteServer.java
index ca52d5eb757..b9cfc4e898e 100644
--- a/libjava/java/rmi/server/RemoteServer.java
+++ b/libjava/java/rmi/server/RemoteServer.java
@@ -43,6 +43,8 @@ import java.io.PrintStream;
public abstract class RemoteServer
extends RemoteObject {
+private static final long serialVersionUID = -4100238210092549637L;
+
protected RemoteServer() {
super();
}
diff --git a/libjava/java/rmi/server/UnicastRemoteObject.java b/libjava/java/rmi/server/UnicastRemoteObject.java
index 5571b9f0b49..a9c4f35099c 100644
--- a/libjava/java/rmi/server/UnicastRemoteObject.java
+++ b/libjava/java/rmi/server/UnicastRemoteObject.java
@@ -42,10 +42,17 @@ import java.rmi.Remote;
import java.rmi.server.RemoteRef;
import java.rmi.NoSuchObjectException;
import gnu.java.rmi.server.UnicastServerRef;
+import gnu.java.rmi.server.UnicastServer;
public class UnicastRemoteObject
extends RemoteServer {
+private static final long serialVersionUID = 4974527148936298033L;
+//The following serialized fields are from Java API Documentation "Serialized form"
+private int port = 0;
+private RMIClientSocketFactory csf = null;
+private RMIServerSocketFactory ssf = null;
+
protected UnicastRemoteObject() throws RemoteException {
this(0);
}
@@ -55,11 +62,21 @@ protected UnicastRemoteObject(int port) throws RemoteException {
}
protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException {
- super(new UnicastServerRef(new ObjID(), port, ssf));
+ this.port = port;
+ //Is RMIXXXSocketFactory serializable
+ //this.csf = csf;
+ //this.ssf = ssf;
+ this.ref = new UnicastServerRef(new ObjID(), port, ssf);
+ //Should we export it here?
+ // if we export, we got infinite recursive call:
+ // UnicastRemoteObject.<init>->...->UnicastServer.startDGC()->UnicastRemoteObject.<init>->...
+ //exportObject(this);
}
protected UnicastRemoteObject(RemoteRef ref) throws RemoteException {
super((UnicastServerRef)ref);
+ //Should we export it here?
+ //exportObject(this);
}
public Object clone() throws CloneNotSupportedException {
@@ -71,16 +88,46 @@ public static RemoteStub exportObject(Remote obj) throws RemoteException {
return (sref.exportObject(obj));
}
-public static Remote exportObject(Remote obj, int port) throws RemoteException {
- return (exportObject(obj));
-}
-
-public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException {
- return (exportObject(obj));
-}
-
-public static boolean unexportObject(Remote obj, boolean force) throws NoSuchObjectException {
- throw new Error("Not implemented");
-}
+ public static Remote exportObject(Remote obj, int port) throws RemoteException
+ {
+ return exportObject(obj, port, null);
+ }
+
+ protected static Remote exportObject(Remote obj, int port, RMIServerSocketFactory ssf)
+ throws RemoteException
+ {
+ UnicastServerRef sref = null;
+ if (obj instanceof RemoteObject)
+ sref = (UnicastServerRef)((RemoteObject)obj).getRef ();
+ if(sref == null)
+ {
+ sref = new UnicastServerRef(new ObjID (), port, ssf);
+ }
+ return (sref.exportObject (obj));
+ }
+
+ /**
+ * FIX ME
+ */
+ public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory csf,
+ RMIServerSocketFactory ssf)
+ throws RemoteException
+ {
+ return (exportObject(obj, port, ssf));
+ }
+
+ public static boolean unexportObject(Remote obj, boolean force)
+ throws RemoteException, NoSuchObjectException
+ {
+ if (obj instanceof RemoteObject)
+ {
+ UnicastServerRef sref = (UnicastServerRef)((RemoteObject)obj).getRef();
+ return sref.unexportObject(obj, force);
+ }
+ else
+ //FIX ME
+ ;
+ return true;
+ }
}
diff --git a/libjava/java/security/Identity.java b/libjava/java/security/Identity.java
index 4230eb06a2c..a1af11273e9 100644
--- a/libjava/java/security/Identity.java
+++ b/libjava/java/security/Identity.java
@@ -64,6 +64,8 @@ import java.util.Vector;
*/
public abstract class Identity implements Principal, Serializable
{
+ static final long serialVersionUID = 3609922007826600659L;
+
private String name;
private IdentityScope scope;
private PublicKey publicKey;
diff --git a/libjava/java/security/KeyPair.java b/libjava/java/security/KeyPair.java
index c6ba61d4cbd..c502add5002 100644
--- a/libjava/java/security/KeyPair.java
+++ b/libjava/java/security/KeyPair.java
@@ -48,6 +48,8 @@ import java.io.Serializable;
*/
public final class KeyPair implements Serializable
{
+ static final long serialVersionUID = -7565189502268009837L;
+
private PublicKey publicKey;
private PrivateKey privateKey;
diff --git a/libjava/java/security/ProtectionDomain.java b/libjava/java/security/ProtectionDomain.java
index 35d6d73a7d8..e8ead466565 100644
--- a/libjava/java/security/ProtectionDomain.java
+++ b/libjava/java/security/ProtectionDomain.java
@@ -53,8 +53,6 @@ package java.security;
*/
public class ProtectionDomain
{
- private static final String linesep = System.getProperty("line.separator");
-
/**
* This is the <code>CodeSource</code> for this protection domain
*/
@@ -131,6 +129,7 @@ public class ProtectionDomain
*/
public String toString()
{
+ String linesep = System.getProperty("line.separator");
StringBuffer sb = new StringBuffer("");
sb.append("ProtectionDomain (" + linesep);
if (code_source == null)
diff --git a/libjava/java/security/Provider.java b/libjava/java/security/Provider.java
index a1a9654b665..d3e3581891e 100644
--- a/libjava/java/security/Provider.java
+++ b/libjava/java/security/Provider.java
@@ -56,6 +56,8 @@ import java.util.Properties;
*/
public abstract class Provider extends Properties implements Serializable
{
+ static final long serialVersionUID = -4298000515446427739L;
+
/**
* This is a textual description of the provider
*/
diff --git a/libjava/java/security/SecureClassLoader.java b/libjava/java/security/SecureClassLoader.java
index 9a4e672f70a..7adba1a9bbc 100644
--- a/libjava/java/security/SecureClassLoader.java
+++ b/libjava/java/security/SecureClassLoader.java
@@ -71,7 +71,7 @@ public class SecureClassLoader extends ClassLoader
@param b the data representing the classfile, in classfile format.
@param off the offset into the data where the classfile starts.
@param len the length of the classfile data in the array.
- @param cs the CodeSource for the class
+ @param cs the CodeSource for the class or null when unknown.
@return the class that was defined and optional CodeSource.
@@ -81,16 +81,14 @@ public class SecureClassLoader extends ClassLoader
CodeSource cs)
{
// FIXME: Need to cache ProtectionDomains according to 1.3 docs.
- ProtectionDomain protectionDomain =
- new ProtectionDomain(cs, getPermissions(cs));
- try
+ if (cs != null)
{
+ ProtectionDomain protectionDomain
+ = new ProtectionDomain(cs, getPermissions(cs));
return super.defineClass(name, b, off, len, protectionDomain);
- }
- catch (ClassFormatError cfe)
- {
- return null;
- }
+ }
+ else
+ return super.defineClass(name, b, off, len);
}
/**
diff --git a/libjava/java/security/SecureRandom.java b/libjava/java/security/SecureRandom.java
index 063c6c1c1b5..31701cb6fd9 100644
--- a/libjava/java/security/SecureRandom.java
+++ b/libjava/java/security/SecureRandom.java
@@ -49,6 +49,8 @@ import java.util.Enumeration;
*/
public class SecureRandom extends Random
{
+ static final long serialVersionUID = 4940670005562187L;
+
//Serialized Field
long counter = 0; //Serialized
MessageDigest digest = null;
diff --git a/libjava/java/security/SecureRandomSpi.java b/libjava/java/security/SecureRandomSpi.java
index a311b8fe5b2..1586994d596 100644
--- a/libjava/java/security/SecureRandomSpi.java
+++ b/libjava/java/security/SecureRandomSpi.java
@@ -50,6 +50,8 @@ import java.io.Serializable;
*/
public abstract class SecureRandomSpi implements Serializable
{
+ static final long serialVersionUID = -2991854161009191830L;
+
/**
Default Constructor for SecureRandomSpi
*/
diff --git a/libjava/java/security/Security.java b/libjava/java/security/Security.java
index 2c73da62dde..9ae90ba365c 100644
--- a/libjava/java/security/Security.java
+++ b/libjava/java/security/Security.java
@@ -59,8 +59,9 @@ public final class Security extends Object
static
{
- loadProviders(System.getProperty("java.vm.name"));
- loadProviders("classpath");
+ loadProviders(System.getProperty("java.home"),
+ System.getProperty("java.vm.name"));
+ loadProviders(System.getProperty("gnu.classpath.home"), "classpath");
}
// This class can't be instantiated.
@@ -68,13 +69,13 @@ public final class Security extends Object
{
}
- private static void loadProviders(String vendor)
+ private static void loadProviders(String dir, String vendor)
{
- if (vendor == null)
+ if (dir == null || vendor == null)
return;
String separator = System.getProperty("file.separator");
- String secfilestr = (System.getProperty("java.home") +
+ String secfilestr = (dir +
separator + "lib" +
separator + "security" +
separator + vendor + ".security");
@@ -263,15 +264,15 @@ public final class Security extends Object
*/
public static Provider getProvider(String name)
{
- Provider p = null;
+ Provider p;
int max = providers.size ();
for (int i = 0; i < max; i++)
{
p = (Provider) providers.elementAt(i);
if (p.getName() == name)
- break;
+ return p;
}
- return p;
+ return null;
}
/**
diff --git a/libjava/java/security/SignedObject.java b/libjava/java/security/SignedObject.java
index 93a99e51a6b..78684e57e73 100644
--- a/libjava/java/security/SignedObject.java
+++ b/libjava/java/security/SignedObject.java
@@ -79,6 +79,8 @@ import java.io.Serializable;
*/
public final class SignedObject implements Serializable
{
+ static final long serialVersionUID = 720502720485447167L;
+
private byte[] content;
private byte[] signature;
private String thealgorithm;
diff --git a/libjava/java/security/cert/Certificate.java b/libjava/java/security/cert/Certificate.java
index 221b2d7f83e..25e8aadf191 100644
--- a/libjava/java/security/cert/Certificate.java
+++ b/libjava/java/security/cert/Certificate.java
@@ -69,7 +69,8 @@ import java.io.ObjectStreamException;
*/
public abstract class Certificate
{
-
+ static final long serialVersionUID = -6751606818319535583L;
+
private String type;
/**
Constructs a new certificate of the specified type. An example
diff --git a/libjava/java/text/Collator.java b/libjava/java/text/Collator.java
index b07045417c1..bb5a3449139 100644
--- a/libjava/java/text/Collator.java
+++ b/libjava/java/text/Collator.java
@@ -153,8 +153,8 @@ public abstract class Collator implements Comparator, Cloneable
* @param str1 The first object to compare
* @param str2 The second object to compare
*
- * @return A negative integer if str1 < str2, 0 if str1 == str2, or
- * a positive integer if str1 > str2.
+ * @return A negative integer if str1 &lt; str2, 0 if str1 == str2, or
+ * a positive integer if str1 &gt; str2.
*/
public abstract int compare (String source, String target);
@@ -167,8 +167,8 @@ public abstract class Collator implements Comparator, Cloneable
* @param obj1 The first object to compare
* @param obj2 The second object to compare
*
- * @return A negative integer if obj1 < obj2, 0 if obj1 == obj2, or
- * a positive integer if obj1 > obj2.
+ * @return A negative integer if obj1 &lt; obj2, 0 if obj1 == obj2, or
+ * a positive integer if obj1 &gt; obj2.
*
* @exception ClassCastException If the arguments are not instances
* of <code>String</code>.
diff --git a/libjava/java/util/Calendar.java b/libjava/java/util/Calendar.java
index 999f10511ba..09e9f2673a5 100644
--- a/libjava/java/util/Calendar.java
+++ b/libjava/java/util/Calendar.java
@@ -1,5 +1,5 @@
/* java.util.Calendar
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -504,8 +504,9 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Returns the time represented by this Calendar.
* @return the time in milliseconds since the epoch.
+ * @specnote This was made public in 1.4.
*/
- protected long getTimeInMillis()
+ public long getTimeInMillis()
{
if (!isTimeSet)
computeTime();
@@ -516,8 +517,9 @@ public abstract class Calendar implements Serializable, Cloneable
* Sets this Calendar's time to the given Time. All time fields
* are invalidated by this method.
* @param time the time in milliseconds since the epoch
+ * @specnote This was made public in 1.4.
*/
- protected void setTimeInMillis(long time)
+ public void setTimeInMillis(long time)
{
this.time = time;
isTimeSet = true;
diff --git a/libjava/java/util/ResourceBundle.java b/libjava/java/util/ResourceBundle.java
index 150a01bf44f..bfb6b306337 100644
--- a/libjava/java/util/ResourceBundle.java
+++ b/libjava/java/util/ResourceBundle.java
@@ -65,7 +65,7 @@ baseName_<i>def. language</i>_<i>def. country</i>
baseName_<i>def. language</i>
baseName</pre>
*
- * <p>A bundle is backed up by less specific bundles (omiting variant, country
+ * <p>A bundle is backed up by less specific bundles (omitting variant, country
* or language). But it is not backed up by the default language locale.
*
* <p>If you provide a bundle for a given locale, say
@@ -239,7 +239,6 @@ public abstract class ResourceBundle
*/
protected void setParent(ResourceBundle parent)
{
- // Shall we ignore the old parent?
this.parent = parent;
}
@@ -362,42 +361,59 @@ public abstract class ResourceBundle
cache = new HashMap();
resourceBundleCache.put(classLoader, cache);
}
- else
+ else if (cache.containsKey(name))
{
- Reference ref = (Reference) cache.get(name);
- if (ref != null)
- {
- ResourceBundle rb = (ResourceBundle) ref.get();
- if (rb != null)
- // rb should already have the right parent, except if
- // something very strange happened.
- return rb;
- }
+ Reference ref = (Reference) cache.get(name);
+ ResourceBundle result = null;
+ // If REF is null, that means that we added a `null' value to
+ // the hash map. That means we failed to find the bundle
+ // previously, and we cached that fact. The JDK does this, so
+ // it must be ok.
+ if (ref == null)
+ throw new MissingResourceException("Bundle " + baseName
+ + " not found",
+ baseName, "");
+ else
+ {
+ ResourceBundle rb = (ResourceBundle) ref.get();
+ if (rb != null)
+ {
+ // RB should already have the right parent, except if
+ // something very strange happened.
+ return rb;
+ }
+ // If RB is null, then we previously found it but it was
+ // collected. So we try again.
+ }
}
+ // It is ok if this returns null. We aren't required to have the
+ // base bundle.
ResourceBundle baseBundle = tryBundle(baseName, emptyLocale,
classLoader, null, cache);
- if (baseBundle == null)
- // JDK says, that if one provides a bundle base_en_UK, one
- // must also provide the bundles base_en and base.
- // This implies that if there is no bundle for base, there
- // is no bundle at all.
- throw new MissingResourceException("Bundle " + baseName + " not found",
- baseName, "");
- // Now use the default locale.
+ // Now use our locale, followed by the default locale. We only
+ // need to try the default locale if our locale is different, and
+ // if our locale failed to yield a result other than the base
+ // bundle.
ResourceBundle bundle = tryLocalBundle(baseName, locale,
classLoader, baseBundle, cache);
if (bundle == baseBundle && !locale.equals(Locale.getDefault()))
- bundle = tryLocalBundle(baseName, Locale.getDefault(),
- classLoader, baseBundle, cache);
+ {
+ bundle = tryLocalBundle(baseName, Locale.getDefault(),
+ classLoader, baseBundle, cache);
+ // We need to record that the argument locale maps to the
+ // bundle we just found. If we didn't find a bundle, record
+ // that instead.
+ if (bundle == null)
+ cache.put(name, null);
+ else
+ cache.put(name, new SoftReference(bundle));
+ }
- // Check whether baseName_locale has been loaded; if not, map the
- // "baseName" bundle to "baseName_locale" to avoid retrying to load
- // baseName_locale.
- Reference ref = (Reference) cache.get(name);
- if (ref == null)
- cache.put(name, new SoftReference(bundle));
+ if (bundle == null)
+ throw new MissingResourceException("Bundle " + baseName + " not found",
+ baseName, "");
return bundle;
}
@@ -440,15 +456,28 @@ public abstract class ResourceBundle
HashMap cache)
{
// First look into the cache.
- // XXX We should remove cleared references from the cache.
- Reference ref = (Reference) cache.get(localizedName);
- if (ref != null)
+ if (cache.containsKey(localizedName))
{
- ResourceBundle rb = (ResourceBundle) ref.get();
- if (rb != null)
- // rb should already have the right parent, except if
- // something very strange happened.
- return rb;
+ Reference ref = (Reference) cache.get(localizedName);
+ ResourceBundle result = null;
+ // If REF is null, that means that we added a `null' value to
+ // the hash map. That means we failed to find the bundle
+ // previously, and we cached that fact. The JDK does this, so
+ // it must be ok.
+ if (ref == null)
+ return null;
+ else
+ {
+ ResourceBundle rb = (ResourceBundle) ref.get();
+ if (rb != null)
+ {
+ // RB should already have the right parent, except if
+ // something very strange happened.
+ return rb;
+ }
+ // If RB is null, then we previously found it but it was
+ // collected. So we try again.
+ }
}
// foundBundle holds exact matches for the localizedName resource
@@ -470,30 +499,38 @@ public abstract class ResourceBundle
// ignore them all
}
if (foundBundle == null)
- try
- {
- InputStream is;
- final String resourceName
- = localizedName.replace('.', '/') + ".properties";
- if (classloader == null)
- is = ClassLoader.getSystemResourceAsStream(resourceName);
- else
- is = classloader.getResourceAsStream(resourceName);
- if (is != null)
- {
- foundBundle = new PropertyResourceBundle(is);
- foundBundle.parent = bundle;
- foundBundle.locale = locale;
- }
- }
- catch (IOException ex)
- {
- }
+ {
+ try
+ {
+ InputStream is;
+ final String resourceName
+ = localizedName.replace('.', '/') + ".properties";
+ if (classloader == null)
+ is = ClassLoader.getSystemResourceAsStream(resourceName);
+ else
+ is = classloader.getResourceAsStream(resourceName);
+ if (is != null)
+ {
+ foundBundle = new PropertyResourceBundle(is);
+ foundBundle.parent = bundle;
+ foundBundle.locale = locale;
+ }
+ }
+ catch (IOException ex)
+ {
+ }
+ }
- if (foundBundle != null)
+ // Put the result into the hash table. If we didn't find anything
+ // here, we record our parent bundle. If we record `null' that means
+ // nothing, not even the base, was found.
+ if (foundBundle == null)
+ foundBundle = bundle;
+ if (foundBundle == null)
+ cache.put(localizedName, null);
+ else
cache.put(localizedName, new SoftReference(foundBundle));
-
- return foundBundle != null ? foundBundle : bundle;
+ return foundBundle;
}
/**
@@ -501,45 +538,50 @@ public abstract class ResourceBundle
* locales with the same language.
*
* @param name the name
- * @param locale the locale, that must be used exactly
+ * @param locale the locale
* @param classloader the classloader
* @param bundle the backup (parent) bundle
* @return the resource bundle if it was loaded, otherwise the backup
*/
private static final ResourceBundle tryLocalBundle(String baseName,
- Locale locale,
+ Locale locale,
ClassLoader classloader,
ResourceBundle bundle,
HashMap cache)
{
final String language = locale.getLanguage();
+ final String country = locale.getCountry();
+ final String variant = locale.getVariant();
+
StringBuffer sb = new StringBuffer(60);
+ sb.append(baseName);
+ sb.append('_');
if (language.length() > 0)
{
- final String country = locale.getCountry();
- sb.append(baseName).append('_').append(language);
- String name = sb.toString();
-
- if (country.length() != 0)
- {
- bundle = tryBundle(name, new Locale(language),
- classloader, bundle, cache);
- sb.append('_').append(country);
- name = sb.toString();
-
- final String variant = locale.getVariant();
-
- if (variant.length() != 0)
- {
- bundle = tryBundle(name, new Locale(language, country),
- classloader, bundle, cache);
- sb.append('_').append(variant);
- name = sb.toString();
- }
- }
- bundle = tryBundle(name, locale, classloader, bundle, cache);
+ sb.append(language);
+ bundle = tryBundle(sb.toString(), new Locale(language),
+ classloader, bundle, cache);
+ }
+ // If LANGUAGE was empty, we still need to try the other
+ // components, and the `_' is required.
+ sb.append('_');
+
+ if (country.length() > 0)
+ {
+ sb.append(country);
+ bundle = tryBundle(sb.toString(), new Locale(language, country),
+ classloader, bundle, cache);
+ }
+ sb.append('_');
+
+ if (variant.length() > 0)
+ {
+ sb.append(variant);
+ bundle = tryBundle(sb.toString(), locale,
+ classloader, bundle, cache);
}
+
return bundle;
}
-} // class ResourceBundle
+}
diff --git a/libjava/java/util/TimeZone.java b/libjava/java/util/TimeZone.java
index eba22363d18..6d4493001f6 100644
--- a/libjava/java/util/TimeZone.java
+++ b/libjava/java/util/TimeZone.java
@@ -961,6 +961,22 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
public abstract boolean inDaylightTime(Date date);
/**
+ * Gets the daylight savings offset. This is a positive offset in
+ * milliseconds with respect to standard time. Typically this
+ * is one hour, but for some time zones this may be half an our.
+ * <p>The default implementation returns 3600000 milliseconds
+ * (one hour) if the time zone uses daylight savings time
+ * (as specified by {@link #useDaylightTime()}), otherwise
+ * it returns 0.
+ * @return the daylight savings offset in milliseconds.
+ * @since 1.4
+ */
+ public int getDSTSavings ()
+ {
+ return useDaylightTime () ? 3600000 : 0;
+ }
+
+ /**
* Gets the TimeZone for the given ID.
* @param ID the time zone identifier.
* @return The time zone for the identifier or GMT, if no such time
diff --git a/libjava/java/util/regex/Matcher.java b/libjava/java/util/regex/Matcher.java
new file mode 100644
index 00000000000..a1f95dbcc49
--- /dev/null
+++ b/libjava/java/util/regex/Matcher.java
@@ -0,0 +1,51 @@
+/* Matcher.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+// Stub class until java.util.regex is implemented.
+package java.util.regex;
+
+public class Matcher
+{
+ public String replaceFirst(String replacement)
+ {
+ throw new InternalError("Not implemented yet");
+ }
+ public String replaceAll(String replacement)
+ {
+ throw new InternalError("Not implemented yet");
+ }
+}
diff --git a/libjava/java/util/regex/Pattern.java b/libjava/java/util/regex/Pattern.java
new file mode 100644
index 00000000000..0ea1bfb1c5a
--- /dev/null
+++ b/libjava/java/util/regex/Pattern.java
@@ -0,0 +1,59 @@
+/* Pattern.java --
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+// Stub class until java.util.regex is implemented.
+package java.util.regex;
+
+public class Pattern
+{
+ public static Pattern compile(String regex)
+ {
+ throw new InternalError("Not implemented yet");
+ }
+ public static boolean matches(String regex, CharSequence input)
+ {
+ throw new InternalError("Not implemented yet");
+ }
+ public Matcher matcher(CharSequence input)
+ {
+ throw new InternalError("Not implemented yet");
+ }
+ public String[] split(CharSequence input, int limit)
+ {
+ throw new InternalError("Not implemented yet");
+ }
+}
diff --git a/libjava/java/util/regex/PatternSyntaxException.java b/libjava/java/util/regex/PatternSyntaxException.java
new file mode 100644
index 00000000000..fc40d341862
--- /dev/null
+++ b/libjava/java/util/regex/PatternSyntaxException.java
@@ -0,0 +1,131 @@
+/* PatternSyntaxException - Indicates illegal pattern for regular expression.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath 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 Classpath 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 Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.util.regex;
+
+/**
+ * Indicates illegal pattern for regular expression.
+ * Includes state to inspect the pattern and what and where the expression
+ * was not valid regular expression.
+ */
+public class PatternSyntaxException extends IllegalArgumentException
+{
+
+ /**
+ * Human readable escription of the syntax error.
+ */
+ private final String desc;
+
+ /**
+ * The original pattern that contained the syntax error.
+ */
+ private final String pattern;
+
+ /**
+ * Index of the first character in the String that was probably invalid,
+ * or -1 when unknown.
+ */
+ private final int index;
+
+ /**
+ * Creates a new PatternSyntaxException.
+ *
+ * @param description Human readable escription of the syntax error.
+ * @param pattern The original pattern that contained the syntax error.
+ * @param index Index of the first character in the String that was
+ * probably invalid, or -1 when unknown.
+ */
+ public PatternSyntaxException(String description,
+ String pattern,
+ int index)
+ {
+ super(description);
+ this.desc = description;
+ this.pattern = pattern;
+ this.index = index;
+ }
+
+ /**
+ * Returns a human readable escription of the syntax error.
+ */
+ public String getDescription()
+ {
+ return desc;
+ }
+
+ /**
+ * Returns the original pattern that contained the syntax error.
+ */
+ public String getPattern()
+ {
+ return pattern;
+ }
+
+ /**
+ * Returns the index of the first character in the String that was probably
+ * invalid, or -1 when unknown.
+ */
+ public int getIndex()
+ {
+ return index;
+ }
+
+ /**
+ * Returns a string containing a line with the description, a line with
+ * the original pattern and a line indicating with a ^ which character is
+ * probably the first invalid character in the pattern if the index is not
+ * negative.
+ */
+ public String getMessage()
+ {
+ String lineSep = System.getProperty("line.separator");
+ StringBuffer sb = new StringBuffer(desc);
+ sb.append(lineSep);
+ sb.append('\t');
+ sb.append(pattern);
+ if (index != -1)
+ {
+ sb.append(lineSep);
+ sb.append('\t');
+ for (int i=0; i<index; i++)
+ sb.append(' ');
+ sb.append('^');
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/libjava/java/util/zip/ZipInputStream.java b/libjava/java/util/zip/ZipInputStream.java
index 63153b649c9..710ca74c201 100644
--- a/libjava/java/util/zip/ZipInputStream.java
+++ b/libjava/java/util/zip/ZipInputStream.java
@@ -61,6 +61,7 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
private int method;
private int flags;
private int avail;
+ private boolean entryAtEOF;
/**
* Creates a new Zip input stream, reading a zip archive.
@@ -150,7 +151,8 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
return null;
}
if (header != LOCSIG)
- throw new ZipException("Wrong Local header signature" + Integer.toHexString(header));
+ throw new ZipException("Wrong Local header signature"
+ + Integer.toHexString(header));
/* skip version */
readLeShort();
flags = readLeShort();
@@ -171,6 +173,7 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
String name = new String(buffer);
entry = createZipEntry(name);
+ entryAtEOF = false;
entry.setMethod(method);
if ((flags & 8) == 0)
{
@@ -252,11 +255,12 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
if (method == ZipOutputStream.DEFLATED)
inf.reset();
entry = null;
+ entryAtEOF = true;
}
public int available() throws IOException
{
- return entry != null ? 1 : 0;
+ return entryAtEOF ? 0 : 1;
}
/**
@@ -335,6 +339,7 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
throw new ZipException("CRC mismatch");
crc.reset();
entry = null;
+ entryAtEOF = true;
}
return len;
}
@@ -348,6 +353,7 @@ public class ZipInputStream extends InflaterInputStream implements ZipConstants
super.close();
crc = null;
entry = null;
+ entryAtEOF = true;
}
/**
diff --git a/libjava/java/util/zip/natDeflater.cc b/libjava/java/util/zip/natDeflater.cc
index 09411439541..23e1201b543 100644
--- a/libjava/java/util/zip/natDeflater.cc
+++ b/libjava/java/util/zip/natDeflater.cc
@@ -124,6 +124,7 @@ java::util::zip::Deflater::reset ()
z_streamp s = (z_streamp) zstream;
// Just ignore errors.
deflateReset (s);
+ s->avail_in = 0;
flush_flag = 0;
is_finished = false;
}
diff --git a/libjava/java/util/zip/natInflater.cc b/libjava/java/util/zip/natInflater.cc
index 0568b5e85d3..69de6c33560 100644
--- a/libjava/java/util/zip/natInflater.cc
+++ b/libjava/java/util/zip/natInflater.cc
@@ -149,6 +149,7 @@ java::util::zip::Inflater::reset ()
z_streamp s = (z_streamp) zstream;
// Just ignore errors.
inflateReset (s);
+ s->avail_in = 0;
is_finished = false;
dict_needed = false;
}
diff --git a/libjava/javax/naming/BinaryRefAddr.java b/libjava/javax/naming/BinaryRefAddr.java
index 8d8d44d9bd4..6942aec3ed0 100644
--- a/libjava/javax/naming/BinaryRefAddr.java
+++ b/libjava/javax/naming/BinaryRefAddr.java
@@ -50,6 +50,7 @@ import java.util.Arrays;
*/
public class BinaryRefAddr extends RefAddr
{
+ static final long serialVersionUID = -3415254970957330361L;
/**
* The possibly null content of this RefAddr.
@@ -97,17 +98,17 @@ public class BinaryRefAddr extends RefAddr
* the addrType is the same as this addrType and the bytes of the
* content are the same.
*/
- public boolean equals (Object o)
+ public boolean equals(Object o)
{
if (o instanceof BinaryRefAddr)
{
BinaryRefAddr refAddr = (BinaryRefAddr) o;
if (this.getType().equals(refAddr.getType()))
- {
- byte[] c1 = (byte[]) this.getContent();
- byte[] c2 = (byte[]) refAddr.getContent();
- return Arrays.equals(c1, c2);
- }
+ {
+ byte[] c1 = (byte[]) this.getContent();
+ byte[] c2 = (byte[]) refAddr.getContent();
+ return Arrays.equals(c1, c2);
+ }
}
return false;
}
diff --git a/libjava/javax/naming/Name.java b/libjava/javax/naming/Name.java
index 7c3e6d7ef8e..4a10f321f9c 100644
--- a/libjava/javax/naming/Name.java
+++ b/libjava/javax/naming/Name.java
@@ -62,6 +62,8 @@ import java.io.Serializable;
*/
public interface Name extends Cloneable, Serializable
{
+ static final long serialVersionUID = -3617482732056931635L;
+
/**
* Returns the number of components of this <code>Name</code>.
* The returned number can be zero.
diff --git a/libjava/javax/naming/NamingException.java b/libjava/javax/naming/NamingException.java
index a377041ae83..6c0f0172dc1 100644
--- a/libjava/javax/naming/NamingException.java
+++ b/libjava/javax/naming/NamingException.java
@@ -47,7 +47,7 @@ import java.io.PrintWriter;
* <code>NamingException</code>), the part of the <code>Name</code> that
* could be resolved (including the <code>Object</code> it resolved to)
* and the part of the <code>Name</code> that could not be resolved when
- * the exception occurred.
+ * the exception occured.
*
* @since 1.3
* @author Anthony Green (green@redhat.com)
diff --git a/libjava/javax/naming/RefAddr.java b/libjava/javax/naming/RefAddr.java
index 2bccdfab8c0..a1c096c10d8 100644
--- a/libjava/javax/naming/RefAddr.java
+++ b/libjava/javax/naming/RefAddr.java
@@ -61,7 +61,7 @@ public abstract class RefAddr implements Serializable
* The string resprenstation of the type of address.
* Set by the constructor and returned by the getType() method.
*/
- protected final String addrType;
+ protected String addrType;
/**
* Protected constructor for use by subclasses.
@@ -71,9 +71,9 @@ public abstract class RefAddr implements Serializable
*/
protected RefAddr(String addrType)
{
- if (addrType == null)
- throw new NullPointerException("addrType cannot be null");
-
+ if (addrType == null)
+ throw new NullPointerException("addrType cannot be null");
+
this.addrType = addrType;
}
@@ -98,20 +98,20 @@ public abstract class RefAddr implements Serializable
* is the same as this addrType and the content is equals to the
* content of this object.
*/
- public boolean equals (Object o)
+ public boolean equals(Object o)
{
if (o instanceof RefAddr)
{
RefAddr refAddr = (RefAddr) o;
if (this.getType().equals(refAddr.getType()))
- {
- Object c1 = this.getContent();
- Object c2 = refAddr.getContent();
- if (c1 == null)
- return c2 == null;
- else
- return c1.equals(c2);
- }
+ {
+ Object c1 = this.getContent();
+ Object c2 = refAddr.getContent();
+ if (c1 == null)
+ return c2 == null;
+ else
+ return c1.equals(c2);
+ }
}
return false;
}
diff --git a/libjava/javax/swing/AbstractListModel.java b/libjava/javax/swing/AbstractListModel.java
index 13518cafa19..f1033cf9781 100644
--- a/libjava/javax/swing/AbstractListModel.java
+++ b/libjava/javax/swing/AbstractListModel.java
@@ -188,6 +188,15 @@ public abstract class AbstractListModel implements ListModel, Serializable {
} // getListeners()
/**
+ * getListDataListeners
+ */
+ public ListDataListener[] getListDataListeners()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
+ /**
* getElementAt
* @param index TODO
* @returns Object
diff --git a/libjava/javax/swing/DefaultBoundedRangeModel.java b/libjava/javax/swing/DefaultBoundedRangeModel.java
index 82ab7675890..a0b1abd618d 100644
--- a/libjava/javax/swing/DefaultBoundedRangeModel.java
+++ b/libjava/javax/swing/DefaultBoundedRangeModel.java
@@ -334,5 +334,14 @@ public class DefaultBoundedRangeModel implements BoundedRangeModel, Serializable
return listenerList.getListeners(c);
} // getListeners()
+ /**
+ * getChangeListeners
+ */
+ public ChangeListener[] getChangeListeners()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
} // DefaultBoundedRangeModel
diff --git a/libjava/javax/swing/DefaultSingleSelectionModel.java b/libjava/javax/swing/DefaultSingleSelectionModel.java
index 50a35d9d9a5..a55c911c3a8 100644
--- a/libjava/javax/swing/DefaultSingleSelectionModel.java
+++ b/libjava/javax/swing/DefaultSingleSelectionModel.java
@@ -175,5 +175,14 @@ public class DefaultSingleSelectionModel implements
return listenerList.getListeners(listenerClass);
} // getListeners()
+ /**
+ * getChangeListeners
+ */
+ public ChangeListener[] getChangeListeners()
+ {
+ // FIXME: implement this
+ return null;
+ }
+
} // DefaultSingleSelectionModel
diff --git a/libjava/mauve-libgcj b/libjava/mauve-libgcj
index deda5cb1f01..64ee52e1cc8 100644
--- a/libjava/mauve-libgcj
+++ b/libjava/mauve-libgcj
@@ -7,28 +7,16 @@ JDK1.4
JLS1.0
JLS1.1
JLS1.2
+JDBC1.0
JDBC2.0
-# These 2 are tests that fail with JDBC2.0 but the tags don't seem to
-# have the right effect.
-!java.sql.Connection.TestJdbc10
-!java.sql.DatabaseMetaData.TestJdbc10
-
-# We now implement JDBC3.0 which means the following tests don't compile
-!java.sql.Blob.BlobTest
-!java.sql.Clob.ClobTest
-!java.sql.Connection.TestJdbc20
-!java.sql.DatabaseMetaData.TestJdbc20
-
# Cannot be compiled
!java.text.ACIAttribute
-# The following tests seem to (sometimes) hang or crash the testsuite
+# The following tests seem to hang or crash the testsuite.
+# This a problem when running Mauve "standalone".
!java.io.ObjectInputOutput
!java.lang.reflect.Array.newInstance
-!java.util.ResourceBundle.getBundle
-!java.util.zip.GZIPInputStream.basic
-!java.net.DatagramSocket.DatagramSocketTest2
# Character.unicode seems to be very broken (the test)
# Does not give meaningfull test results at the moment.
@@ -36,4 +24,5 @@ JDBC2.0
# These are almost certainly buggy test cases.
# The behaviour of the garbarge collector cannot be predicted.
-!java.lang.ref
+# Note the . at the end so we do test java.lang.reflect
+!java.lang.ref.
diff --git a/libjava/name-finder.cc b/libjava/name-finder.cc
deleted file mode 100644
index 2d383aaa250..00000000000
--- a/libjava/name-finder.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-// name-finder.cc - Convert addresses to names
-
-/* Copyright (C) 2000, 2002 Free Software Foundation, Inc
-
- This file is part of libgcj.
-
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
-
-/**
- * @author Andrew Haley <aph@cygnus.com>
- * @date Jan 6 2000
- */
-
-/* _Jv_name_finder is a class wrapper around a mechanism that can
- convert address of methods to their names and the names of files in
- which they appear.
-
- Right now, the only implementation of this involves running a copy
- of addr2line, but at some point it is worth building this
- functionality into libgcj, if only for embedded systems. */
-
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE 1
-#endif
-
-#include <config.h>
-
-#include <string.h>
-
-#include <gcj/cni.h>
-#include <jvm.h>
-#include <java/lang/Object.h>
-#include <java-threads.h>
-#include <java/lang/Throwable.h>
-#include <java/io/PrintStream.h>
-#include <java/io/PrintWriter.h>
-
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <name-finder.h>
-
-/* Create a new name finder which will perform address lookups on an
- executable. */
-
-_Jv_name_finder::_Jv_name_finder (char *executable)
-{
-#if defined (HAVE_PIPE) && defined (HAVE_FORK) && defined (HAVE_EXECVP)
- demangling_error = lookup_error = 0;
-
- // Initialize file descriptors so that shutdown works properly.
- f_pipe[0] = -1;
- f_pipe[1] = -1;
- b_pipe[0] = -1;
- b_pipe[1] = -1;
- b_pipe_fd = NULL;
-
- f2_pipe[0] = -1;
- f2_pipe[1] = -1;
- b2_pipe[0] = -1;
- b2_pipe[1] = -1;
- b2_pipe_fd = NULL;
-
- // addr2line helper process.
-
- char *argv[5];
- {
- int arg = 0;
-#ifdef __ia64__
- argv[arg++] = "addr2name.awk";
-#else
- argv[arg++] = "addr2line";
- argv[arg++] = "-f";
- argv[arg++] = "-e";
-#endif
- argv[arg++] = executable;
- argv[arg] = NULL;
- }
-
- lookup_error |= pipe (f_pipe) < 0;
- lookup_error |= pipe (b_pipe) < 0;
-
- if (lookup_error)
- return;
-
- pid = fork ();
- if (pid == 0)
- {
- close (f_pipe[1]);
- close (b_pipe[0]);
- dup2 (f_pipe[0], fileno (stdin));
- dup2 (b_pipe[1], fileno (stdout));
- execvp (argv[0], argv);
- _exit (127);
- }
-
- // Close child end of pipes. Set local descriptors to -1 so we
- // don't try to close the fd again.
- close (f_pipe [0]);
- f_pipe[0] = -1;
- close (b_pipe [1]);
- b_pipe[1] = -1;
-
- if (pid < 0)
- {
- lookup_error |= 1;
- return;
- }
-
- b_pipe_fd = fdopen (b_pipe[0], "r");
- lookup_error |= !b_pipe_fd;
-
- if (! lookup_error)
- {
- // Don't try to close the fd twice.
- b_pipe[0] = -1;
- }
-
- // c++filt helper process.
-
- char *argv2[4];
- argv2[0] = "c++filt";
- argv2[1] = "-s";
- argv2[2] = "java";
- argv2[3] = NULL;
-
- demangling_error |= pipe (f2_pipe) < 0;
- demangling_error |= pipe (b2_pipe) < 0;
-
- if (demangling_error)
- return;
-
- pid2 = fork ();
- if (pid2 == 0)
- {
- close (f2_pipe[1]);
- close (b2_pipe[0]);
- dup2 (f2_pipe[0], fileno (stdin));
- dup2 (b2_pipe[1], fileno (stdout));
- execvp (argv2[0], argv2);
- _exit (127);
- }
-
- // Close child end of pipes. Set local descriptors to -1 so we
- // don't try to close the fd again.
- close (f2_pipe [0]);
- f2_pipe[0] = -1;
- close (b2_pipe [1]);
- b2_pipe[1] = -1;
-
- if (pid2 < 0)
- {
- demangling_error |= 1;
- return;
- }
-
- b2_pipe_fd = fdopen (b2_pipe[0], "r");
- demangling_error |= !b2_pipe_fd;
-
- if (! demangling_error)
- {
- // Don't try to close the fd twice.
- b2_pipe[0] = -1;
- }
-#endif
-}
-
-/* Convert a pointer to hex. */
-
-void
-_Jv_name_finder::toHex (void *p)
-{
- typedef unsigned word_t __attribute ((mode (word)));
- word_t n = (word_t) p;
- int digits = sizeof (void *) * 2;
-
- strcpy (hex, "0x");
- for (int i = digits - 1; i >= 0; i--)
- {
- int digit = n % 16;
-
- n /= 16;
- hex[i+2] = digit > 9 ? 'a' + digit - 10 : '0' + digit;
- }
- hex [digits+2] = 0;
-}
-
-/* Creates a StackTraceElement given a string and a filename.
- Splits the given string into the class and method part.
- The string s will be a demangled to a fully qualified java method string.
- The string f will be decomposed into a file name and a possible line number.
- The given strings will be altered. */
-
-java::lang::StackTraceElement*
-_Jv_name_finder::createStackTraceElement(char *s, char *f)
-{
- char *c;
- char *class_name = NULL;
- char *method_name = NULL;
-
-#if defined (HAVE_PIPE) && defined (HAVE_FORK) && defined (HAVE_EXECVP)
- if (demangling_error)
- goto fail;
-
- demangling_error |= write (f2_pipe[1], s, strlen (s)) < 0;
- if (demangling_error)
- goto fail;
- demangling_error |= write (f2_pipe[1], "\n", 1) < 0;
- if (demangling_error)
- goto fail;
-
- char name[1024];
- demangling_error |= (fgets (name, sizeof name, b2_pipe_fd) == NULL);
- if (demangling_error)
- goto fail;
-
- c = strchr (name, '\n');
- if (c)
- *c = 0;
- s = name;
-#endif
-
- c = strchr (s, '(');
- if (c)
- {
- while(c-->s)
- if (*c == '.')
- break;
-
- if (*c == '.')
- {
- *c = 0;
- class_name = s;
- method_name = c+1;
- }
- else
- {
- class_name = NULL;
- method_name = s;
- }
- }
- else
- {
- class_name = NULL;
- method_name = s;
- }
-
- // Get line number
- int line_number;
- c = strrchr (f, ':');
- if (c)
- {
- if (c[1] != 0)
- line_number = atoi(c+1);
- else
- line_number = -1;
- *c = 0;
- }
- else
- {
- line_number = -1;
- c = strchr (f, '\n');
- if (c)
- *c = 0;
- }
-
- fail:
- return new java::lang::StackTraceElement(
- f ? JvNewStringLatin1 (f) : NULL,
- line_number,
- class_name ? JvNewStringLatin1 (class_name) : NULL,
- JvNewStringLatin1 (method_name ? method_name : s),
- false);
-}
-
-/* Given a pointer to a function or method, try to convert it into a
- name and the appropriate line and source file. The caller passes
- the code pointer in p.
-
- Returns false if the lookup fails. Even if this happens, the field
- he will have been correctly filled in with the pointer. */
-
-java::lang::StackTraceElement*
-_Jv_name_finder::lookup (void *p)
-{
- extern char **_Jv_argv;
- toHex (p);
-
- char name[1024];
- char file_name[1024];
-
- file_name[0] = 0;
-
-#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR)
- {
- Dl_info dl_info;
-
- if (dladdr (p, &dl_info))
- {
- if (dl_info.dli_fname)
- strncpy (file_name, dl_info.dli_fname, sizeof file_name);
- if (dl_info.dli_sname)
- strncpy (name, dl_info.dli_sname, sizeof name);
-
- /* Don't trust dladdr() if the address is from the main program. */
- if (dl_info.dli_fname != NULL
- && dl_info.dli_sname != NULL
- && (_Jv_argv == NULL || strcmp (file_name, _Jv_argv[0]) != 0))
- return createStackTraceElement (name, file_name);
- }
- }
-#endif
-
- memcpy (name, hex, strlen (hex) + 1);
-
-#if defined (HAVE_PIPE) && defined (HAVE_FORK) && defined (HAVE_EXECVP)
- if (lookup_error)
- goto fail;
-
- lookup_error |= write (f_pipe[1], hex, strlen (hex)) < 0;
- if (lookup_error)
- goto fail;
- lookup_error |= write (f_pipe[1], "\n", 1) < 0;
- if (lookup_error)
- goto fail;
-
- lookup_error |= (fgets (name, sizeof name, b_pipe_fd) == NULL);
- if (lookup_error)
- goto fail;
- lookup_error |= (fgets (file_name, sizeof file_name, b_pipe_fd) == NULL);
- if (lookup_error)
- goto fail;
-
- {
- char *newline = strchr (name, '\n');
- if (newline)
- *newline = 0;
- }
-#endif /* defined (HAVE_PIPE) && defined (HAVE_FORK) && defined (HAVE_EXECVP) */
-
- fail:
- return (createStackTraceElement (name, file_name));
-}
diff --git a/libjava/prims.cc b/libjava/prims.cc
index 054290b16ad..710139bab06 100644
--- a/libjava/prims.cc
+++ b/libjava/prims.cc
@@ -53,6 +53,7 @@ details. */
#include <java/lang/NullPointerException.h>
#include <java/lang/OutOfMemoryError.h>
#include <java/lang/System.h>
+#include <java/lang/VMThrowable.h>
#include <java/lang/reflect/Modifier.h>
#include <java/io/PrintStream.h>
#include <java/lang/UnsatisfiedLinkError.h>
@@ -910,8 +911,8 @@ _Jv_CreateJavaVM (void* /*vm_args*/)
_Jv_InitPrimClass (&_Jv_voidClass, "void", 'V', 0, &_Jv_voidVTable);
// Turn stack trace generation off while creating exception objects.
- _Jv_InitClass (&java::lang::Throwable::class$);
- java::lang::Throwable::trace_enabled = 0;
+ _Jv_InitClass (&java::lang::VMThrowable::class$);
+ java::lang::VMThrowable::trace_enabled = 0;
INIT_SEGV;
#ifdef HANDLE_FPE
@@ -923,7 +924,7 @@ _Jv_CreateJavaVM (void* /*vm_args*/)
no_memory = new java::lang::OutOfMemoryError;
- java::lang::Throwable::trace_enabled = 1;
+ java::lang::VMThrowable::trace_enabled = 1;
#ifdef USE_LTDL
LTDL_SET_PRELOADED_SYMBOLS ();
diff --git a/libjava/resolve.cc b/libjava/resolve.cc
index f55875509e3..f3b98a7a348 100644
--- a/libjava/resolve.cc
+++ b/libjava/resolve.cc
@@ -20,6 +20,7 @@ details. */
#include <java-cpool.h>
#include <java/lang/Class.h>
#include <java/lang/String.h>
+#include <java/lang/StringBuffer.h>
#include <java/lang/Thread.h>
#include <java/lang/InternalError.h>
#include <java/lang/VirtualMachineError.h>
@@ -28,7 +29,7 @@ details. */
#include <java/lang/ClassFormatError.h>
#include <java/lang/IllegalAccessError.h>
#include <java/lang/AbstractMethodError.h>
-#include <java/lang/ClassNotFoundException.h>
+#include <java/lang/NoClassDefFoundError.h>
#include <java/lang/IncompatibleClassChangeError.h>
#include <java/lang/reflect/Modifier.h>
@@ -97,7 +98,8 @@ _Jv_ResolvePoolEntry (jclass klass, int index)
if (! found)
{
jstring str = _Jv_NewStringUTF (name->data);
- throw new java::lang::ClassNotFoundException (str);
+ // This exception is specified in JLS 2nd Ed, section 5.1.
+ throw new java::lang::NoClassDefFoundError (str);
}
if ((found->accflags & Modifier::PUBLIC) == Modifier::PUBLIC
@@ -201,12 +203,13 @@ _Jv_ResolvePoolEntry (jclass klass, int index)
end_of_field_search:
if (the_field == 0)
{
- jstring msg = JvNewStringLatin1 ("field ");
- msg = msg->concat (owner->getName ());
- msg = msg->concat (JvNewStringLatin1("."));
- msg = msg->concat (_Jv_NewStringUTF (field_name->data));
- msg = msg->concat (JvNewStringLatin1(" was not found."));
- throw_incompatible_class_change_error (msg);
+ java::lang::StringBuffer *sb = new java::lang::StringBuffer();
+ sb->append(JvNewStringLatin1("field "));
+ sb->append(owner->getName());
+ sb->append(JvNewStringLatin1("."));
+ sb->append(_Jv_NewStringUTF(field_name->data));
+ sb->append(JvNewStringLatin1(" was not found."));
+ throw_incompatible_class_change_error(sb->toString());
}
pool->data[index].field = the_field;
@@ -300,26 +303,27 @@ _Jv_ResolvePoolEntry (jclass klass, int index)
// with either loader should produce the same result,
// i.e., exactly the same jclass object. JVMS 5.4.3.3
+ if (the_method == 0)
+ {
+ java::lang::StringBuffer *sb = new java::lang::StringBuffer();
+ sb->append(JvNewStringLatin1("method "));
+ sb->append(owner->getName());
+ sb->append(JvNewStringLatin1("."));
+ sb->append(_Jv_NewStringUTF(method_name->data));
+ sb->append(JvNewStringLatin1(" was not found."));
+ throw new java::lang::NoSuchMethodError (sb->toString());
+ }
+
if (pool->tags[index] == JV_CONSTANT_InterfaceMethodref)
vtable_index = -1;
else
- vtable_index = _Jv_DetermineVTableIndex
- (found_class, method_name, method_signature);
+ vtable_index = _Jv_DetermineVTableIndex (found_class, method_name,
+ method_signature);
if (vtable_index == METHOD_NOT_THERE)
throw_incompatible_class_change_error
(JvNewStringLatin1 ("method not found"));
- if (the_method == 0)
- {
- jstring msg = JvNewStringLatin1 ("method ");
- msg = msg->concat (owner->getName ());
- msg = msg->concat (JvNewStringLatin1("."));
- msg = msg->concat (_Jv_NewStringUTF (method_name->data));
- msg = msg->concat (JvNewStringLatin1(" was not found."));
- throw new java::lang::NoSuchMethodError (msg);
- }
-
pool->data[index].rmethod =
_Jv_BuildResolvedMethod(the_method,
found_class,
diff --git a/libjava/sysdep/s390/locks.h b/libjava/sysdep/s390/locks.h
new file mode 100644
index 00000000000..b0f3185254f
--- /dev/null
+++ b/libjava/sysdep/s390/locks.h
@@ -0,0 +1,77 @@
+// locks.h - Thread synchronization primitives. S/390 implementation.
+
+/* Copyright (C) 2002 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#ifndef __SYSDEP_LOCKS_H__
+#define __SYSDEP_LOCKS_H__
+
+typedef size_t obj_addr_t; /* Integer type big enough for object */
+ /* address. */
+
+// Atomically replace *addr by new_val if it was initially equal to old.
+// Return true if the comparison succeeded.
+// Assumed to have acquire semantics, i.e. later memory operations
+// cannot execute before the compare_and_swap finishes.
+inline static bool
+compare_and_swap(volatile obj_addr_t *addr,
+ obj_addr_t old, obj_addr_t new_val)
+{
+ int result;
+
+ __asm__ __volatile__ (
+#ifndef __s390x__
+ " cs %1,%2,0(%3)\n"
+#else
+ " csg %1,%2,0(%3)\n"
+#endif
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=&d" (result), "+d" (old)
+ : "d" (new_val), "a" (addr)
+ : "cc", "memory");
+
+ return result == 0;
+}
+
+// Set *addr to new_val with release semantics, i.e. making sure
+// that prior loads and stores complete before this
+// assignment.
+inline static void
+release_set(volatile obj_addr_t *addr, obj_addr_t new_val)
+{
+ __asm__ __volatile__("bcr 15,0" : : : "memory");
+ *(addr) = new_val;
+}
+
+// Compare_and_swap with release semantics instead of acquire semantics.
+// On many architecture, the operation makes both guarantees, so the
+// implementation can be the same.
+inline static bool
+compare_and_swap_release(volatile obj_addr_t *addr,
+ obj_addr_t old, obj_addr_t new_val)
+{
+ return compare_and_swap(addr, old, new_val);
+}
+
+// Ensure that subsequent instructions do not execute on stale
+// data that was loaded from memory before the barrier.
+inline static void
+read_barrier()
+{
+ __asm__ __volatile__("bcr 15,0" : : : "memory");
+}
+
+// Ensure that prior stores to memory are completed with respect to other
+// processors.
+inline static void
+write_barrier()
+{
+ __asm__ __volatile__("bcr 15,0" : : : "memory");
+}
+#endif
diff --git a/libjava/sysdep/x86-64/locks.h b/libjava/sysdep/x86-64/locks.h
index cb6be85951b..bad6de6dc6f 100644
--- a/libjava/sysdep/x86-64/locks.h
+++ b/libjava/sysdep/x86-64/locks.h
@@ -24,10 +24,17 @@ inline static bool
compare_and_swap(volatile obj_addr_t *addr, obj_addr_t old, obj_addr_t new_val)
{
char result;
+#ifdef __x86_64__
__asm__ __volatile__("lock; cmpxchgq %2, %0; setz %1"
: "+m"(*(addr)), "=q"(result)
: "r" (new_val), "a"(old)
: "memory");
+#else
+ __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1"
+ : "+m"(*(addr)), "=q"(result)
+ : "r" (new_val), "a"(old)
+ : "memory");
+#endif
return (bool) result;
}
diff --git a/libjava/testsuite/ChangeLog b/libjava/testsuite/ChangeLog
index 73bc1251899..6252d3f5cdd 100644
--- a/libjava/testsuite/ChangeLog
+++ b/libjava/testsuite/ChangeLog
@@ -1,3 +1,40 @@
+2002-10-15 Andrew Haley <aph@redhat.com>
+
+ * libjava.lang/EvaluationOrder.java (EvaluationOrder): New.
+ * libjava.lang/EvaluationOrder.out (EvaluationOrder): New.
+
+2002-10-14 Andrew Haley <aph@redhat.com>
+
+ * libjava.lang/StaticConstructor.java: New.
+ * libjava.lang/StaticConstructor.out: New.
+
+2002-10-13 Mark Wielaard <mark@klomp.org>
+
+ * libjava.mauve/xfails: Remove tests that now XPASS.
+
+2002-10-03 Andrew Haley <aph@redhat.com>
+
+ * libjava.lang/Array_3.java (baz): New.
+ (main): Call baz.
+
+2002-09-29 Anthony Green <green@redhat.com>
+
+ * libjava.lang/TestProxy.java: New file.
+ * libjava.lang/TestProxy.out: Ditto.
+
+2002-09-29 Anthony Green <green@redhat.com>
+
+ * libjava.lang/utf8concat.java: New file.
+ * libjava.lang/utf8concat.out: Ditto.
+
+2002-08-26 Tom Tromey <tromey@redhat.com>
+
+ * libjava.compile/narrow_case.java: New file.
+
+2002-08-25 Adam Megacz <adam@xwt.org>
+
+ * lib/libjava.exp: don't apply -no-install when platform is mingw.
+
2002-08-16 H.J. Lu <hjl@gnu.org>
* lib/libjava.exp (gcc_version): Removed.
diff --git a/libjava/testsuite/lib/libjava.exp b/libjava/testsuite/lib/libjava.exp
index bbac0eaca9a..3cb6140438d 100644
--- a/libjava/testsuite/lib/libjava.exp
+++ b/libjava/testsuite/lib/libjava.exp
@@ -405,7 +405,7 @@ proc libjava_arguments {{mode compile}} {
# Avoid libtool wrapper scripts when possible.
# but not if libtool warnings results in FAILs
if {$mode == "link"} {
- if {! [istarget "*-*-cygwin*"]} {
+ if {! [istarget "*-*-cygwin*"] && ! [istarget "*-*-mingw*"] } {
lappend args "additional_flags=-no-install"
}
}
diff --git a/libjava/testsuite/libjava.compile/narrow_case.java b/libjava/testsuite/libjava.compile/narrow_case.java
new file mode 100644
index 00000000000..48b56820256
--- /dev/null
+++ b/libjava/testsuite/libjava.compile/narrow_case.java
@@ -0,0 +1,11 @@
+public class narrow_case
+{
+ private int test(byte b)
+ {
+ switch (b)
+ {
+ case '0' :return 0;
+ }
+ return 99;
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/Array_3.java b/libjava/testsuite/libjava.lang/Array_3.java
index 453387d51fb..e94549a0f4e 100644
--- a/libjava/testsuite/libjava.lang/Array_3.java
+++ b/libjava/testsuite/libjava.lang/Array_3.java
@@ -12,6 +12,13 @@ public class Array_3
return null;
}
+ static int baz ()
+ {
+ int[] x = (int[])null;
+ int nn = x.length;
+ return 5;
+ }
+
public static void main(String args[])
{
boolean ok = false;
@@ -68,5 +75,17 @@ public class Array_3
}
if (!ok)
throw new RuntimeException("test failed:4");
+
+ ok = false;
+ try
+ {
+ nn = baz ();
+ }
+ catch (NullPointerException _)
+ {
+ ok = true;
+ }
+ if (!ok)
+ throw new RuntimeException("test failed:5");
}
}
diff --git a/libjava/testsuite/libjava.lang/EvaluationOrder.java b/libjava/testsuite/libjava.lang/EvaluationOrder.java
new file mode 100644
index 00000000000..7c09bbb9cb9
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/EvaluationOrder.java
@@ -0,0 +1,22 @@
+public class EvaluationOrder
+ {
+ private static int first (int x, int y)
+ {
+ return x;
+ }
+
+ public static void main (String[] args)
+ {
+ int l = args.length;
+
+ /* This should print:
+ 0
+ 0
+ 1
+ */
+ System.out.println (l);
+ System.out.println (first (l, ++l));
+ System.out.println (l);
+ }
+ }
+
diff --git a/libjava/testsuite/libjava.lang/EvaluationOrder.out b/libjava/testsuite/libjava.lang/EvaluationOrder.out
new file mode 100644
index 00000000000..bb5ee5c21eb
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/EvaluationOrder.out
@@ -0,0 +1,3 @@
+0
+0
+1
diff --git a/libjava/testsuite/libjava.lang/StaticConstructor.java b/libjava/testsuite/libjava.lang/StaticConstructor.java
new file mode 100644
index 00000000000..54c0f5376df
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/StaticConstructor.java
@@ -0,0 +1,29 @@
+// Test to make sure static initializers are called
+
+class bar
+{
+ public static int zog;
+ public static int zag;
+
+ static
+ {
+ zog = 12;
+ zag = 2;
+ }
+
+ public bar() { }
+}
+
+public class StaticConstructor
+{
+ static int foo ()
+ {
+ return new bar().zog;
+ }
+
+ public static void main(String args[])
+ {
+ System.out.println ("" + (foo() + bar.zag));
+ }
+}
+
diff --git a/libjava/testsuite/libjava.lang/StaticConstructor.out b/libjava/testsuite/libjava.lang/StaticConstructor.out
new file mode 100644
index 00000000000..8351c19397f
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/StaticConstructor.out
@@ -0,0 +1 @@
+14
diff --git a/libjava/testsuite/libjava.lang/TestProxy.java b/libjava/testsuite/libjava.lang/TestProxy.java
new file mode 100644
index 00000000000..d1411a6f0a8
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/TestProxy.java
@@ -0,0 +1,34 @@
+import java.lang.reflect.*;
+import java.net.*;
+
+public class TestProxy
+{
+ public class MyInvocationHandler implements InvocationHandler
+ {
+ public Object invoke (Object proxy,
+ Method method,
+ Object[] args)
+ throws Throwable
+ {
+ System.out.println (args[0]);
+ return null;
+ }
+ }
+
+ public static void main (String[] args)
+ {
+ try {
+ InvocationHandler ih = new MyInvocationHandler();
+
+ SocketOptions c = (SocketOptions)
+ Proxy.newProxyInstance (SocketOptions.class.getClassLoader(),
+ new Class[]{SocketOptions.class},
+ ih);
+
+ c.getOption (555);
+
+ } catch (Exception e) {
+ e.printStackTrace ();
+ }
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/TestProxy.out b/libjava/testsuite/libjava.lang/TestProxy.out
new file mode 100644
index 00000000000..3749383ded2
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/TestProxy.out
@@ -0,0 +1 @@
+555
diff --git a/libjava/testsuite/libjava.lang/utf8concat.java b/libjava/testsuite/libjava.lang/utf8concat.java
new file mode 100644
index 00000000000..8b8f47ee1a0
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/utf8concat.java
@@ -0,0 +1,11 @@
+public class utf8concat
+{
+ private static String s;
+
+ public static void main (String[] args)
+ {
+ // This causes a crash at runtime because the compiler is
+ // producing an invalid UTF-8 string literal.
+ s = "abc" + (char)183;
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/utf8concat.out b/libjava/testsuite/libjava.lang/utf8concat.out
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/utf8concat.out
diff --git a/libjava/testsuite/libjava.mauve/xfails b/libjava/testsuite/libjava.mauve/xfails
index 1594a3b8ea0..ff8b9a83920 100644
--- a/libjava/testsuite/libjava.mauve/xfails
+++ b/libjava/testsuite/libjava.mauve/xfails
@@ -35,10 +35,7 @@ FAIL: gnu.testlet.java.lang.Character.getType (number 22)
FAIL: gnu.testlet.java.lang.Class.ClassTest: Error: test_getClassLoader failed - 1 (number 1)
FAIL: gnu.testlet.java.lang.Class.ClassTest: Error: test_getClassLoader failed - 2 (number 1)
FAIL: gnu.testlet.java.lang.Double.DoubleTest: Error: test_intValue returned wrong results CYGNUS: Float to int conversions - 1 (number 1)
-FAIL: gnu.testlet.java.lang.Double.DoubleTest: Error: test_longValue returned wrong results CYGNUS: Float to int conversions - 1 (number 1)
FAIL: gnu.testlet.java.lang.Float.FloatTest: Error: test_intValue returned wrong results - 1 (number 1)
-FAIL: gnu.testlet.java.lang.String.CASE_INSENSITIVE_ORDER: unicode mappings (number 1)
-FAIL: gnu.testlet.java.lang.String.CASE_INSENSITIVE_ORDER: unicode mappings (number 2)
FAIL: gnu.testlet.java.text.AttributedString.Test: Attribute key count (number 1)
FAIL: gnu.testlet.java.text.DateFormatSymbols.Test: patterns (number 2)
FAIL: gnu.testlet.java.text.SimpleDateFormat.Test: equals() (number 1)
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index db5a9386dfe..dd1bc296408 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,19 @@
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.in (all): Fix multilib parallel build.
+
+Thu Sep 12 12:44:37 2002 Nicola Pero <n.pero@mi.flashnet.it>
+
+ * sendmsg.c (nil_method): Declare not to take a variable number of
+ args.
+ (objc_msg_lookup): Cast nil_method to IMP before returning it.
+ (objc_msg_lookup_super): The same.
+
+2002-09-10 Jan Hubicka <jh@suse.cz>
+
+ * nil_method.c (nil_method): No longer defined with variable
+ arguments.
+
2002-07-02 Rodney Brown <rbrown64@csc.com.au>
* objc/encoding.h: Fix formatting.
diff --git a/libobjc/Makefile.in b/libobjc/Makefile.in
index 47aa535372f..4d5c5da8db4 100644
--- a/libobjc/Makefile.in
+++ b/libobjc/Makefile.in
@@ -137,7 +137,7 @@ FLAGS_TO_PASS = \
"tooldir=$(tooldir)"
all: libobjc.la $(OBJC_BOEHM_GC)
- $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all
+ : $(MAKE) ; exec $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all
# User-visible header files.
diff --git a/libobjc/nil_method.c b/libobjc/nil_method.c
index 800b0e3bf53..5e37c4d5dfb 100644
--- a/libobjc/nil_method.c
+++ b/libobjc/nil_method.c
@@ -29,8 +29,27 @@ Boston, MA 02111-1307, USA. */
#include "runtime.h"
+/* When the receiver of a method invocation is nil, the runtime
+ returns nil_method() as the method implementation. This function
+ will be casted to whatever function was supposed to be executed to
+ execute that method (that function will take an id, followed by a
+ SEL, followed by who knows what arguments, depends on the method),
+ and executed.
+
+ For this reason, nil_method() should be a function which can be
+ called in place of any function taking an 'id' argument followed by
+ a 'SEL' argument, followed by zero, or one, or any number of
+ arguments (both a fixed number, or a variable number !).
+
+ There is no "proper" implementation of such a nil_method function
+ in C, however in all existing implementations it does not matter
+ when extra arguments are present, so we can simply create a function
+ taking a receiver and a selector, and all other arguments will be
+ ignored. :-)
+*/
+
id
-nil_method (id receiver, SEL op __attribute__ ((__unused__)), ...)
+nil_method (id receiver, SEL op __attribute__ ((__unused__)))
{
return receiver;
}
diff --git a/libobjc/objc/objc.h b/libobjc/objc/objc.h
index 79b2519e576..699542c493b 100644
--- a/libobjc/objc/objc.h
+++ b/libobjc/objc/objc.h
@@ -73,7 +73,14 @@ typedef struct objc_object {
/*
** Definition of method type. When retrieving the implementation of a
-** method, this is type of the pointer returned
+** method, this is type of the pointer returned. The idea of the
+** definition of IMP is to represent a 'pointer to a general function
+** taking an id, a SEL, followed by other unspecified arguments'. You
+** must always cast an IMP to a pointer to a function taking the
+** appropriate, specific types for that function, before calling it -
+** to make sure the appropriate arguments are passed to it. The code
+** generated by the compiler to perform method calls automatically
+** does this cast inside method calls.
*/
typedef id (*IMP)(id, SEL, ...);
diff --git a/libobjc/sendmsg.c b/libobjc/sendmsg.c
index 06fc9ba193e..6ef711b50d3 100644
--- a/libobjc/sendmsg.c
+++ b/libobjc/sendmsg.c
@@ -76,7 +76,7 @@ static id
__objc_block_forward (id, SEL, ...);
static Method_t search_for_method_in_hierarchy (Class class, SEL sel);
Method_t search_for_method_in_list (MethodList_t list, SEL op);
-id nil_method (id, SEL, ...);
+id nil_method (id, SEL);
/* Given a selector, return the proper forwarding implementation. */
__inline__
@@ -197,7 +197,7 @@ objc_msg_lookup (id receiver, SEL op)
return result;
}
else
- return nil_method;
+ return (IMP)nil_method;
}
IMP
@@ -206,7 +206,7 @@ objc_msg_lookup_super (Super_t super, SEL sel)
if (super->self)
return get_imp (super->class, sel);
else
- return nil_method;
+ return (IMP)nil_method;
}
int method_get_sizeof_arguments (Method *);
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f953314f5e5..0cd9e614a43 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,931 @@
+2002-10-18 Loren J. Rittle <ljrittle@acm.org>
+
+ * configure.target (freebsd*): Use abi_baseline_triplet.
+ * config/abi/i386-unknown-freebsd4/baseline_symbols.txt: New file.
+ * config/abi/i386-unknown-freebsd4.7/baseline_symbols.txt: Remove.
+
+ * testsuite/thread/pthread1.cc: Remove needless workaround
+ for FreeBSD 5.
+
+2002-10-18 Loren J. Rittle <ljrittle@acm.org>
+ Brad Spencer <spencer@infointeractive.com> (provided alternate
+ patch and improvements)
+
+ * docs/html/23_containers/howto.html (GLIBCPP_FORCE_NEW): Document
+ new environment variable which replaces all uses of __USE_MALLOC
+ macro.
+ * docs/html/ext/howto.html (GLIBCPP_FORCE_NEW): Likewise.
+ (__mem_interface): Remove all references to old internal typedef.
+ * include/backward/alloc.h (__USE_MALLOC): Remove it and all
+ guarded code.
+ * include/bits/c++config (__USE_MALLOC): Update related error
+ message and comment.
+ * include/bits/stl_alloc.h (__USE_MALLOC): Remove it and all
+ guarded code. Update all related comments.
+ (__mem_interface): Unconditionally replace it with __new_alloc.
+ However, leave the typedef around in case anyone used it.
+ (__default_alloc_template<>::_S_force_new): New class static.
+ (__default_alloc_template<>::allocate, deallocate): Add
+ run-time controlled feature similar to what __USE_MALLOC code
+ path had provided.
+ * src/stl-inst.cc (__USE_MALLOC): Remove it and all
+ guarded code.
+ * testsuite/21_strings/capacity.cc: Remove reference to __USE_MALLOC.
+ Add documentation on GLIBCPP_FORCE_NEW environment variable.
+ * testsuite/ext/allocators.cc: Likewise.
+
+2002-10-18 Phil Edwards <pme@gcc.gnu.org>
+
+ * configure.in: Use target, not target_alias, when matching triplet
+ patterns.
+ * configure: Regenerate.
+
+2002-10-17 Momchil Velikov <velco@fadata.bg>
+ Loren J. Rittle <ljrittle@acm.org>
+
+ * configure.in: Add *-freebsd* to cross list.
+ * configure: Rebuilt.
+
+2002-10-16 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/locale_facets.h (__timepunct::__timepunct): Allocate
+ _M_name_timepunct.
+ (__timepunct::~__timepunct): Deallocate, remove specialization
+ declarations.
+ (messages::messages): Allocate _M_name_messages.
+ (messages::~messages): Deallocate.
+ (messages_byname): Same.
+ * config/locale/gnu/time_members.cc (__timepunct::~__timepunct):
+ Remove.
+ * config/locale/generic/time_members.cc (__timepunct::~__timepunct):
+ Remove.
+
+ * docs/html/install.html: Add es_MX, en_PH to required locales list.
+
+2002-10-16 Benjamin Kosnik <bkoz@redhat.com>
+
+ * config/linker-map.gnu: Add exports for codecvt constructors
+ where size_t == unsigned long.
+
+2002-10-14 Benjamin Kosnik <bkoz@redhat.com>
+
+ * src/globals.cc (__gnu_cxx::c_locale_impl_compat): Add, alias to
+ c_locale_impl.
+ * testsuite/abi_check.cc (line_to_symbol_info): Collect size info.
+ * docs/html/abi.txt: Update.
+
+2002-10-14 Benjamin Kosnik <bkoz@redhat.com>
+
+ * testsuite/22_locale/static_members.cc (test02): Less provincial.
+
+2002-10-14 Benjamin Kosnik <bkoz@redhat.com>
+
+ * testsuite/22_locale/static_members.cc (test02): Disable for
+ systems without named locale support.
+ * testsuite/22_locale/ctor_copy_dtor.cc (test04): Don't assume
+ running the testsuites in "C" environment.
+ Add new tests.
+ * docs/html/22_locale/locale.html: Update.
+
+2002-10-13 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * include/bits/stl_threads.h (_GLIBCPP_mutex,
+ _GLIBCPP_mutex_init,_GLIBCPP_mutex_address,
+ _GLIBCPP_mutex_address_init, _GLIBCPP_once):
+ Declare in namespace __gnu_cxx.
+ (_STL_mutex_lock::_M_initialize): Qualify __gnu_cxx
+ names.
+ Adjust copyright.
+
+2002-10-12 Benjamin Kosnik <bkoz@redhat.com>
+
+ * testsuite/abi_check.cc (hash<string>): Specialize.
+ Simplify. Check compatible symbol versions.
+ * config/linker-map.gnu: Clarify, explicitly export
+ std::codecvt::c* symbols.
+
+ * testsuite/22_locale/static_members.cc (test02): Avoid null strings.
+
+2002-10-12 Jonathan Wakely <jw@kayari.org>
+ Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * docs/html/21_strings/howto.html#5: Correct nasting of XHTML
+ elements. Correct allocator-related text.
+
+2002-10-11 Benjamin Kosnik <bkoz@redhat.com>
+
+ * testsuite/22_locale/static_members.cc (test02): Fix.
+
+2002-10-11 Benjamin Kosnik <bkoz@redhat.com>
+
+ * acconfig.h (_GLIBCPP_SYMVER): Add.
+ (_GLIBCPP_ASM_SYMVER): Add.
+ * acinclude.m4 (GLIBCPP_ENABLE_SYMVERS): Define _GLIBCPP_SYMVER.
+ * aclocal.m4: Regenerate.
+ * config.h.in: Regenerate.
+ * configure: Regenerate.
+ * include/bits/c++config (_GLIBCPP_AT_AT): Define, as an expedient
+ hack around m4 issues with quoting '@'.
+ * src/locale.cc: Use _GLIBCPP_ASM_SYMVER.
+ * src/globals.cc: Same.
+
+ * testsuite/22_locale/ctor_copy_dtor.cc (test04): Fix for
+ non-glibc systems.
+
+2002-10-10 Benjamin Kosnik <bkoz@redhat.com>
+
+ * config/linker-map.gnu (GLIBCPP_3.2.1): Add.
+ (GLIBCPP_3.2): Don't export locale::_S_*.
+ * src/ios.cc: Move globals into __gnu_cxx. Make old exported
+ symbols match.
+ * src/locale.cc: Same.
+ * src/localename.cc: Same.
+ * src/globals.cc: Same.
+
+2002-10-10 Phil Edwards <pme@gcc.gnu.org>
+
+ * docs/html/21_strings/howto.html: Write #5, char_traits.
+ * docs/html/17_intro/porting.texi: Expand on os_include_dir.
+ * docs/html/17_intro/porting.html: Regenerate.
+
+2002-10-09 Benjamin Kosnik <bkoz@redhat.com>
+
+ * src/locale.cc: Fix comments, move ctors together.
+ * testsuite/22_locale/static_members.cc (test03): Add.
+
+2002-10-08 Jonathan Lennox <lennox@cs.columbia.edu>
+
+ PR libstdc++/8071, libstdc++/8127, libstdc++/6745
+ * streambuf.tcc (__copy_streambufs): Handle cases where
+ __sbin->in_avail() returns 0, or where __sbin doesn't set gptr().
+ * testsuite/27_io/ostream_inserter_other.cc (test05): Add.
+
+2002-10-08 Paolo Carlini <pcarlini@unitus.it>
+ Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/localefwd.h (class locale): Add static member
+ _S_num_extra_categories, encoding the number of additional
+ categories.
+ Change _S_num_categories to _S_categories_size.
+ (class locale::_Impl): Add _M_c_cats.
+ (class locale::_Impl::_M_names): Change to array of chars.
+ (class locale::_Impl::_M_check_same_name): Use
+ _S_extra_categories_size, tweak.
+ (locale::locale(const locale&, _Facet*)): Ditto.
+ * src/locale.cc (locale::locale(const char* )): Rewrite to deal
+ with the environment in a POSIX-compliant way while being thread
+ safe.
+ (locale::name()): Update to output POSIX environment strings.
+ * src/localename.cc
+ (locale::_Impl::_Impl(const _Impl&, size_t): Use
+ _S_categories_size_*, tweak.
+ (locale::_Impl::_Impl(facet**, size_t, bool)): Ditto.
+ (locale::_Impl::_Impl(const char*, size_t)): Name each category
+ individually.
+ (locale::_Impl::_M_replace_categories): Use strcpy.
+
+ * include/bits/locale_facets.h (numpunct::_M_initialize_numpunct):
+ Change default argument to NULL from _S_c_locale.
+ (timepunct::_M_initialize_timepunct): Same.
+ _S_c_locale cleanups.
+ * src/codecvt.c: _S_c_locale simplification.
+ * src/ctype.c: Same.
+ * src/globals.cc: Add fake_name.
+ * src/locale-inst.cc: Remove extra includes.
+ * src/locale.cc: Remove extra includes.
+ Add _S_extra_categories_size definition.
+ Correct "C" initialization.
+ (locale::facet::facet): Don't initialize _S_c_locale.
+ (locale::facet::_M_remove_reference): Adjust.
+ * src/localename: Use facet_vec, facet_name.
+ (locale::_Impl::_Impl(facet** __f, size_t __refs, bool)): Set
+ facet ref counts to one. Initialize _S_c_locale.
+ (locale::_Impl::_M_install_facet(id*, facet*)): Adjust facet ref
+ counts when installing unilaterally.
+
+ * config/locale/generic/c_locale.cc: Add _S_categories definition.
+ * config/locale/generic/c_locale.h: Add _GLIBCPP_NUM_CATEGORIES macro.
+ * config/locale/generic/time_members.cc: _S_c_locale cleanup.
+
+ * config/locale/gnu/c_locale.cc: Add _S_categories definition.
+ (_S_destroy_c_locale): Move checks against _S_c_locale here.
+ * config/locale/gnu/c_locale.h: Add _GLIBCPP_NUM_CATEGORIES macro.
+ * config/locale/gnu/ctype_members.cc: Simplify _S_destroy_c_locale
+ calls, _S_c_locale usage.
+ * config/locale/gnu/monetary_members.cc: Same, tweaks.
+ * config/locale/gnu/monetary_members.cc: Same.
+ * config/locale/gnu/time_members.cc: Same.
+ * config/os/gnu-linux/ctype_noninline.h: Use locale::classic().
+
+ * docs/html/22_locale/locale.html: Add bits about global locales
+ and "C" setlocale.
+
+ * testsuite/22_locale/facet.cc (test02): Add.
+ * testsuite/22_locale/static_members.cc (test02): Add.
+ * testsuite/22_locale/ctor_copy_dtor.cc (test04): Add.
+
+2002-10-07 Jonathan Wakely <jw@kayari.org>
+
+ * docs/html/configopts.html, docs/html/documentation.html,
+ docs/html/explanations.html, docs/html/install.html,
+ docs/html/17_intro/contribute.html, docs/html/17_intro/howto.html,
+ docs/html/17_intro/license.html, docs/html/18_support/howto.html,
+ docs/html/19_diagnostics/howto.html, docs/html/20_util/howto.html,
+ docs/html/21_strings/howto.html, docs/html/22_locale/codecvt.html,
+ docs/html/22_locale/ctype.html, docs/html/22_locale/howto.html,
+ docs/html/22_locale/locale.html, docs/html/22_locale/messages.html,
+ docs/html/23_containers/howto.html, docs/html/24_iterators/howto.html,
+ docs/html/25_algorithms/howto.html, docs/html/26_numerics/howto.html,
+ docs/html/27_io/howto.html, docs/html/ext/howto.html,
+ docs/html/ext/sgiexts.html, docs/html/faq/index.html: Add DOCTYPEs.
+
+2002-10-03 Richard Earnshaw <rearnsha@arm.com>
+
+ PR libstdc++/3584
+ * config/cpu/arm/atomicity.h (__exchange_and_add): Don't try to use
+ ASM sequences that don't give us atomic addition operations. Instead
+ just add a comment explaining why it doesn't work.
+ (__atomic_add): Just use __exchange_and_add.
+ (__test_and_set, __always_swap): Delete.
+
+2002-10-02 Andreas Jaeger <aj@suse.de>
+
+ * config/abi/x86_64-unknown-linux-gnu/baseline_symbols.txt:
+ New file.
+
+2002-10-01 Phil Edwards <pme@gcc.gnu.org>
+
+ * Makefile.am (check-abi): Add @ to rule.
+ * Makefile.in: Regenerated.
+
+2002-09-27 Paolo Carlini <pcarlini@unitus.it>
+
+ * include/bits/locale_facets.tcc (num_put::_M_widen_int):
+ Deal correctly with grouped, showbased (oct or hex) zero.
+ * testsuite/22_locale/num_put_members_char.cc: Add test05.
+ * testsuite/22_locale/num_put_members_wchar_t.cc: Ditto.
+
+2002-09-27 Richard Henderson <rth@redhat.com>
+
+ * config/os/hpux/cpu_limits.h: Remove.
+
+ * include/std/std_limits.h (numeric_limits<T>::is_iec559): False
+ if denormals are not supported.
+
+2002-09-25 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/Makefile.am (target_headers): Remove cpu_limits.h.
+ * include/Makefile.in: Regenerate.
+ * configure.in (CPU_LIMITS_INC_SRCDIR): Remove
+ * configure: Regenerate.
+ * configure.target (CPULIMITS): Remove.
+
+ * include/std/std_limits.h: Remove cpu_limits.h include.
+
+ * config/os/solaris/solaris2.7/os_defines.h (__glibcpp_long_bits):
+ Remove.
+ * config/os/irix/irix6.5/os_defines.h
+ (__glibcpp_long_double_bits): Remove.
+ (__glibcpp_wchar_t_bits): Remove.
+ (__glibcpp_long_bits): Remove.
+ * config/os/irix/irix5.2/os_defines.h
+ (__glibcpp_long_double_bits): Remove.
+ (__glibcpp_long_bits): Remove.
+ * config/os/hpux/os_defines.h (__glibcpp_wchar_t_is_signed): Remove.
+ * config/os/bsd/freebsd/os_defines.h:
+ (__glibcpp_long_double_bits): Remove.
+ * config/os/aix/os_defines.h (__glibcpp_wchar_t_bits): Remove.
+ (__glibcpp_wchar_t_is_signed): Remove.
+ (__glibcpp_long_bits): Remove.
+ * config/os/gnu-linux/os_defines.h (__glibcpp_long_bits): Remove.
+ (__glibcpp_long_double_bits): Remove.
+
+ * config/os/osf/osf5.0/cpu_limits.h: Remove.
+ * config/cpu/alpha/cpu_limits.h: Remove.
+ * config/cpu/arm/cpu_limits.h: Remove.
+ * config/cpu/cris/cpu_limits.h: Remove.
+ * config/cpu/generic/cpu_limits.h: Remove.
+ * config/cpu/generic/limits.h: Remove.
+ * config/cpu/ia64/cpu_limits.h: Remove.
+ * config/cpu/m68k/cpu_limits.h: Remove.
+ * config/cpu/mmix/cpu_limits.h: Remove.
+ * config/cpu/powerpc/cpu_limits.h: Remove.
+ * config/cpu/S390/cpu_limits.h: Remove.
+
+2002-09-25 Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
+
+ * testsuite/18_support/numeric_limits.cc: Check the maximum and
+ minimum values of the wchar_t type.
+
+2002-09-25 Mark Mitchell <mark@codesourcery.com>
+
+ * include/std/std_limits.h (numeric_limits<unsigned char>::digits):
+ Fix typo.
+
+2002-09-23 Richard Henderson <rth@redhat.com>
+
+ * include/std/std_limits.h (__glibcpp_plain_char_is_signed,
+ __glibcpp_wchar_t_is_signed, __glibcpp_s8_max, __glibcpp_s8_min,
+ __glibcpp_s8_digits, __glibcpp_s8_digits10, __glibcpp_u8_min,
+ __glibcpp_u8_max, __glibcpp_u8_digits, __glibcpp_u8_digits10,
+ __glibcpp_s16_max, __glibcpp_s16_min, __glibcpp_s16_digits,
+ __glibcpp_s16_digits10, __glibcpp_u16_min, __glibcpp_u16_max,
+ __glibcpp_u16_digits, __glibcpp_u16_digits10, __glibcpp_s32_max,
+ __glibcpp_s32_min, __glibcpp_s32_digits, __glibcpp_s32_digits10,
+ __glibcpp_u32_min, __glibcpp_u32_max, __glibcpp_u32_digits,
+ __glibcpp_u32_digits10, __glibcpp_s64_max, __glibcpp_s64_min,
+ __glibcpp_s64_digits, __glibcpp_s64_digits10, __glibcpp_u64_min,
+ __glibcpp_u64_max, __glibcpp_u64_digits, __glibcpp_u64_digits10,
+ __glibcpp_bool_digits, __glibcpp_signed_char_min,
+ __glibcpp_signed_char_max, __glibcpp_signed_char_digits,
+ __glibcpp_signed_char_digits10, __glibcpp_unsigned_char_min,
+ __glibcpp_unsigned_char_max, __glibcpp_unsigned_char_digits,
+ __glibcpp_unsigned_char_digits10, __glibcpp_char_min,
+ __glibcpp_char_max, __glibcpp_char_digits, __glibcpp_char_digits10,
+ __glibcpp_signed_short_min, __glibcpp_signed_short_max,
+ __glibcpp_signed_short_digits, __glibcpp_signed_short_digits10,
+ __glibcpp_unsigned_short_min, __glibcpp_unsigned_short_max,
+ __glibcpp_unsigned_short_digits, __glibcpp_unsigned_short_digits10,
+ __glibcpp_signed_int_min, __glibcpp_signed_int_max,
+ __glibcpp_signed_int_digits, __glibcpp_signed_int_digits10,
+ __glibcpp_unsigned_int_min, __glibcpp_unsigned_int_max,
+ __glibcpp_unsigned_int_digits, __glibcpp_unsigned_int_digits10,
+ __glibcpp_signed_long_min, __glibcpp_signed_long_max,
+ __glibcpp_unsigned_long_digits, __glibcpp_unsigned_long_digits10,
+ __glibcpp_signed_long_long_min, __glibcpp_signed_long_long_max,
+ __glibcpp_signed_long_long_digits, __glibcpp_signed_long_long_digits10,
+ __glibcpp_wchar_t_min, __glibcpp_wchar_t_max, __glibcpp_wchar_t_digits,
+ __glibcpp_wchar_t_digits10): Remove.
+ (__glibcpp_byte, __glibcpp_word_bits, __glibcpp_word): Remove.
+ (__float_storage, __double_storage, __long_double_storage): Remove.
+ (__glibcpp_signed, __glibcpp_min, __glibcpp_max): New.
+ (__glibcpp_digits, __glibcpp_digits10): New.
+ (numeric_limits<T>::min): Use __glibcpp_min or limits.h builtins.
+ (numeric_limits<T>::max): Use __glibcpp_max or limits.h builtins.
+ (numeric_limits<T>::is_signed, T=char,wchar_t): Use __glibcpp_signed.
+ (numeric_limits<T>::digits): Use __glibcpp_digits.
+ (numeric_limits<T>::digits10): Use __glibcpp_digits10.
+ * testsuite/18_support/numeric_limits.cc (test03): Don't use
+ __glibcpp_s8_digits10 et al; check vs the installed versions
+ of digits10 for particular sizes.
+
+ * include/std/std_limits.h (__glibcpp_float_is_modulo,
+ __glibcpp_double_is_modulo, __glibcpp_long_double_is_modulo): Kill.
+ (numeric_limits<T>::is_modulo, T floating): Use false.
+
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.am (all-multi): Fix multilib parallel build.
+
+2002-09-22 Richard Henderson <rth@redhat.com>
+
+ * include/std/std_limits.h (__glibcpp_f32_round_error,
+ __glibcpp_f64_round_error, __glibcpp_f80_round_error,
+ __glibcpp_f96_round_error, __glibcpp_f128_round_error,
+ __glibcpp_float_round_error, __glibcpp_double_round_error,
+ __glibcpp_long_double_round_error, __glibcpp_float_round_style,
+ __glibcpp_double_round_style, __glibcpp_long_double_round_style): Kill.
+ (numeric_limits<char>::epsilon, round_error): Use constant 0.
+ (numeric_limits<float>::round_error): Use constant 0.5.
+ (numeric_limits<float>::round_style): Use round_to_nearest.
+ (numeric_limits<double>, numeric_limits<long double>): Similarly.
+
+ * include/std/std_limits.h (__glibcpp_f32_is_iec559,
+ __glibcpp_f64_is_iec559, __glibcpp_f80_is_iec559,
+ __glibcpp_f96_is_iec559, __glibcpp_f128_is_iec559,
+ __glibcpp_float_is_iec559, __glibcpp_double_is_iec559,
+ __glibcpp_long_double_is_iec559): Remove.
+ (numeric_limits<float>::is_iec559): Use has_infinity & has_quiet_NaN.
+ (numeric_limits<double>, numeric_limits<long double>): Similarly.
+
+ * include/std/std_limits.h (__glibcpp_integral_traps): New.
+ (__glibcpp_char_traps, __glibcpp_short_traps, __glibcpp_int_traps,
+ __glibcpp_long_traps, __glibcpp_wchar_t_traps,
+ __glibcpp_long_long_traps, __glibcpp_plain_char_traps,
+ __glibcpp_signed_char_traps, __glibcpp_unsigned_char_traps,
+ __glibcpp_signed_short_traps, __glibcpp_unsigned_short_traps,
+ __glibcpp_signed_int_traps, __glibcpp_unsigned_int_traps,
+ __glibcpp_signed_long_traps, __glibcpp_unsigned_long_traps,
+ __glibcpp_signed_long_long_traps, __glibcpp_unsigned_long_long_traps,
+ __glibcpp_char_is_modulo, __glibcpp_signed_char_is_modulo,
+ __glibcpp_signed_short_is_modulo, __glibcpp_signed_int_is_modulo,
+ __glibcpp_signed_long_is_modulo, __glibcpp_signed_long_long_is_modulo,
+ __glibcpp_wchar_t_is_modulo, __glibcpp_float_is_bounded,
+ __glibcpp_double_is_bounded, __glibcpp_long_double_is_bounded): Kill.
+ (numeric_limits<T>::traps, T integral): Use __glibcpp_integral_traps.
+ (numeric_limits<T>::is_modulo, T integral): Use true.
+ (numeric_limits<T>::is_bounded, T floating): Use true.
+
+2002-09-18 Loren J. Rittle <ljrittle@acm.org>
+
+ * testsuite/18_support/numeric_limits.cc (test_epsilon): New.
+
+2002-09-18 Richard Henderson <rth@redhat.com>
+
+ * testsuite/18_support/numeric_limits.cc: Add -mieee for alpha.
+
+2002-09-16 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/c_shadow: Remove.
+ * include/bits/generic_shadow.h: Remove.
+ * include/Makefile.am: Remove generic_shadow.h.
+ * acinclude.m4: Remove c_shadow references.
+ * aclocal.m4: Regenerate.
+ * configure: Regenerate.
+ * mkcshadow: Remove.
+ * mkinclosure: Remove.
+
+2002-09-16 Loren J. Rittle <ljrittle@acm.org>
+
+ libstdc++/7922
+ * include/ext/stl_rope.h (rope<>): Qualify dependent names
+ with `typename'.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * include/std/std_limits.h (__glibcpp_f32_QNaN_bytes,
+ __glibcpp_f32_has_QNaN, __glibcpp_f32_SNaN_bytes,
+ __glibcpp_f32_has_SNaN, __glibcpp_f64_QNaN_bytes,
+ __glibcpp_f64_has_QNaN, __glibcpp_f64_SNaN_bytes,
+ __glibcpp_f64_has_SNaN, __glibcpp_f80_QNaN_bytes,
+ __glibcpp_f80_has_QNaN, __glibcpp_f80_SNaN_bytes,
+ __glibcpp_f80_has_SNaN, __glibcpp_f96_QNaN_bytes,
+ __glibcpp_f96_has_QNaN, __glibcpp_f96_SNaN_bytes,
+ __glibcpp_f96_has_SNaN, __glibcpp_f128_QNaN_bytes,
+ __glibcpp_f128_has_QNaN, __glibcpp_f128_SNaN_bytes,
+ __glibcpp_f128_has_SNaN, __glibcpp_float_QNaN_bytes,
+ __glibcpp_float_has_QNaN, __glibcpp_float_SNaN_bytes,
+ __glibcpp_float_has_SNaN, __glibcpp_double_QNaN_bytes,
+ __glibcpp_double_has_QNaN, __glibcpp_double_SNaN_bytes,
+ __glibcpp_double_has_SNaN, __glibcpp_long_double_QNaN_bytes,
+ __glibcpp_long_double_has_QNaN, __glibcpp_long_double_SNaN_bytes,
+ __glibcpp_long_double_has_SNaN): Remove.
+ (__glibcpp_f128_is_iec559): True if IEEE.
+ (__glibcpp_float_QNaN, __glibcpp_float_SNaN): Remove.
+ (__glibcpp_double_QNaN, __glibcpp_double_SNaN): Remove.
+ (__glibcpp_long_double_QNaN, __glibcpp_long_double_SNaN): Remove.
+ (std::numeric_limits<float>::has_quiet_NaN): Use __builtin_nanf.
+ (std::numeric_limits<float>::has_signaling_NaN): Mirror has_quiet_NaN.
+ (std::numeric_limits<float>::quiet_NaN): Use __builtin_nanf.
+ (std::numeric_limits<float>::signaling_NaN): Use __builtin_nansf.
+ (std::numeric_limits<double>): Similarly.
+ (std::numeric_limits<long double>): Similarly.
+ * src/limits.cc (__glibcpp_float_QNaN, __glibcpp_float_SNaN): Remove.
+ (__glibcpp_double_QNaN, __glibcpp_double_SNaN): Remove.
+ (__glibcpp_long_double_QNaN, __glibcpp_long_double_SNaN): Remove.
+
+ * testsuite/18_support/numeric_limits.cc (test_infinity): New.
+ (test_denorm_min, test_qnan, test_is_iec559): New.
+
+2002-09-16 Phil Edwards <pme@gcc.gnu.org>
+
+ * testsuite/abi_check.cc: Pull shell fragments out into...
+ * config/abi/extract_symvers: ...here. New file.
+ * Makefile.am (check_abi): Change to match.
+ (new-abi-baseline): New target.
+ * Makefile.in: Regenerated.
+
+2002-09-16 Richard Henderson <rth@redhat.com>
+
+ * include/std/std_limits.h (__glibcpp_f32_denorm_min_bytes,
+ __glibcpp_f32_has_denorm, __glibcpp_f64_denorm_min_bytes,
+ __glibcpp_f64_has_denorm, __glibcpp_f80_denorm_min_bytes,
+ __glibcpp_f80_has_denorm, __glibcpp_f96_denorm_min_bytes,
+ __glibcpp_f96_has_denorm, __glibcpp_f128_denorm_min_bytes,
+ __glibcpp_f128_has_denorm, __glibcpp_float_denorm_min_bytes,
+ __glibcpp_float_has_denorm, __glibcpp_double_denorm_min_bytes,
+ __glibcpp_double_has_denorm, __glibcpp_long_double_denorm_min_bytes,
+ __glibcpp_long_double_has_denorm): Remove.
+ (__glibcpp_float_denorm_min, __glibcpp_double_denorm_min,
+ __glibcpp_long_double_denorm_min): Remove.
+ (std::numeric_limits<float>::has_denorm): Use __FLT_DENORM_MIN__.
+ (std::numeric_limits<float>::denorm_min): Likewise.
+ (std::numeric_limits<double>): Similarly.
+ (std::numeric_limits<long double>): Similarly.
+ * src/limits.cc (__glibcpp_float_denorm_min,
+ __glibcpp_double_denorm_min, __glibcpp_long_double_denorm_min): Remove.
+
+2002-09-13 Andy Felt <afelt@uwsp.edu>
+
+ * docs/html/17_intro/howto.html: Update link.
+
+2002-09-13 Phil Edwards <pme@gcc.gnu.org>
+
+ * docs/doxygen/run_doxygen: Massage man page for Iterator_types.3.
+ * docs/html/faq/index.html: Whitespace fixes.
+
+2002-09-12 Benjamin Kosnik <bkoz@redhat.com>
+
+ * libmath/Makefile.am (LIBTOOL): Use --tag CC always for this
+ directory.
+ * libmath/Makefile.in: Regenerate.
+ * src/Makefile.am: Tweak comment.
+ * src/Makefile.in: Regenerate.
+
+ * config/locale/gnu/c_locale.h: Remove warnings.
+ Inject __uselocale into __gnu_cxx.
+ * config/locale/generic/c_locale.h: Match.
+
+2002-09-11 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/locale_facets.tcc (__convert_from_v): Remove.
+ * config/locale/gnu/c_locale.h (__convert_from_v): Add.
+ * config/locale/generic/c_locale.h (__convert_from_v): Add.
+
+2002-09-11 Paolo Carlini <pcarlini@unitus.it>
+
+ * include/bits/locale_facets.tcc (__convert_from_v):
+ Use __uselocale instead of setlocale for glibc 2.3+.
+
+2002-09-10 Benjamin Kosnik <bkoz@redhat.com>
+
+ * src/Makefile.am (sources): Edit.
+ (target_sources): New.
+ (target_sources_extra): New.
+ * src/Makefile.in: Regenerate.
+ * acinclude.m4: Set CCODECVT_CC.
+ * aclocal.m4: Regenerate.
+ * configure: Regenerate.
+ * src/locale.cc: Move ctype definitions...
+ * src/ctype.cc: ...here. New file.
+ * src/locale.cc: Move codecvt definitions...
+ * src/codecvt.cc: ...here.
+ * config/generic/codecvt_members.cc: ...and here.
+ * config/gnu/codecvt_members.cc: ...and here.
+ * include/bits/codecvt.h: Tweak.
+ * include/bits/locale_facets: Tweak.
+
+ * src/bitset.cc: Correct license text.
+ * src/concept-inst.cc: Same.
+ * src/strstream.cc: Same.
+ * src/vterminate.cc: Same.
+
+2002-09-10 Gabriel Dos Reis <gdr@soliton.integrable-solutions.net>
+
+ * include/bits/stl_vector.h (vector<>): Don't use a name with
+ different meanings before and after re-evaluation in the completed
+ scope.
+ * include/bits/basic_string.h (basic_string<>): Likewise.
+ * include/bits/stl_bvector.h (vector<bool>): Likewise.
+ * include/bits/stl_deque.h (std): Likewise.
+ * include/bits/stl_list.h (list<>): Likewise.
+ * include/bits/stl_tree.h (_Rb_tree<>): Likewise.
+
+2002-09-10 Paolo Carlini <pcarlini@unitus.it>
+
+ * include/bits/codecvt.h (class __codecvt_abstract_base):
+ Add __c_locale type _M_c_locale_codecvt member.
+ (class codecvt<char, char, mbstate_t>,
+ class codecvt<wchar_t, char, mbstate_t>): Add new
+ codecvt(__c_locale, size_t) constructor.
+ (codecvt_byname::codecvt_byname): Update.
+ * src/codecvt.cc (class codecvt<char, char, mbstate_t>,
+ class codecvt<wchar_t, char, mbstate_t>): Update codecvt(size_t)
+ constructor and ~codecvt() destructor; define
+ codecvt(__c_locale, size_t) constructor.
+ (codecvt::do_out): Switch to _M_c_locale_codecvt around wcsrtombs call.
+ (codecvt::do_in): Ditto for mbsrtowcs call.
+ * src/localename.cc (locale::_Impl::_Impl(const char*, size_t)):
+ Tweak construction of codecvt facets.
+
+2002-09-10 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * include/bits/locale_facets.tcc (__convert_from_v):
+ Replace strdup with ISO malloc and strcpy.
+
+2002-09-09 Benjamin Kosnik <bkoz@redhat.com>
+
+ * docs/html/configopts.html: Change grouping. Note ABI impacts.
+ Update information for locale model defaults.
+ * docs/html/install.html: Update include directory
+ information.
+ Update testing information.
+ Update linux issues for named locales.
+ * docs/html/abi.txt: Fix typos.
+ Add more info.
+
+ * src/misc-inst.cc: Add missing instantiations.
+
+ * testsuite/abi_check.cc: Make output results more verbose.
+
+ * config/os/gnu-linux/ctype_base.h: Remove shadow headers injections.
+
+2002-09-07 Jakub Jelinek <jakub@redhat.com>
+
+ * config/locale/generic/messages_members.cc: Add specialization for
+ messages<wchar_t>.
+ * config/locale/ieee_1003.1-20021/messages_members.cc: Likewise.
+
+2002-09-06 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/localefwd.h: Tweak formatting.
+ * docs/html/abi.txt: Add.
+
+2002-09-06 Jakub Jelinek <jakub@redhat.com>
+
+ * configure.target: Use cpu_include_dir="config/cpu/sparc" for all
+ sparc targets.
+ * config/cpu/sparc/atomicity.h: New file.
+ * config/cpu/sparc/sparc32/atomicity.h: Removed.
+ * config/cpu/sparc/sparc64/atomicity.h: Removed.
+
+2002-09-06 Jakub Jelinek <jakub@redhat.com>
+
+ * config/os/gnu-linux/ctype_noninline.h
+ [_GLIBCPP_USE_SHADOW_HEADERS]: Remove using _C_legacy::__ctype_*.
+ (ctype<char>::classic_table): If _GLIBCPP_C_LOCALE_GNU, return
+ _S_c_locale->__ctype_b, otherwise temporarily switch to "C" locale
+ and return __ctype_b.
+ (ctype<char>::ctype(__c_locale, const mask*, bool, size_t)): If not
+ _GLIBCPP_C_LOCALE_GNU, temporarily switch to "C" locale and
+ initialize using __ctype_{b,tolower,toupper}.
+ (ctype<char>::ctype(const mask*, bool, size_t)): If
+ _GLIBCPP_C_LOCALE_GNU, initialize using
+ _S_c_locale->__ctype_{b,tolower,toupper}, otherwise temporarily
+ switch to "C" locale and initialize using __ctype_{b,tolower,toupper}.
+
+2002-09-05 Paolo Carlini <pcarlini@unitus.it>
+ Roland McGrath <roland@redhat.com>
+
+ PR libstdc++/7811
+ * src/locale.cc (locale::locale(__s)): Use getenv instead
+ of setenv for the environment locale.
+ * testsuite/22_locale/ctor_copy_dtor.cc (test03): New.
+
+2002-09-05 Jakub Jelinek <jakub@redhat.com>
+
+ * config/abi/ia64-unknown-linux-gnu: Add.
+ * config/abi/ia64-unknown-linux-gnu/baseline_symbols.txt: New file.
+ * config/abi/alphaev67-unknown-linux-gnu: Add.
+ * config/abi/alphaev67-unknown-linux-gnu/baseline_symbols.txt: New file.
+
+2002-09-05 Jonathan Wakely <jw@kayari.org>
+
+ * docs/html/Makefile: Use more portable shell wildcard.
+ * docs/html/makedoc.awk: Nest elements correctly for XHTML conversion.
+ * docs/html/configopts.html, docs/html/documentation.html,
+ docs/html/explanations.html, docs/html/install.html,
+ docs/html/17_intro/contribute.html, docs/html/17_intro/howto.html,
+ docs/html/17_intro/license.html, docs/html/18_support/howto.html,
+ docs/html/19_diagnostics/howto.html, docs/html/20_util/howto.html,
+ docs/html/21_strings/howto.html, docs/html/22_locale/codecvt.html,
+ docs/html/22_locale/ctype.html, docs/html/22_locale/howto.html,
+ docs/html/22_locale/locale.html, docs/html/22_locale/messages.html,
+ docs/html/23_containers/howto.html, docs/html/24_iterators/howto.html,
+ docs/html/25_algorithms/howto.html, docs/html/26_numerics/howto.html,
+ docs/html/27_io/howto.html, docs/html/ext/howto.html,
+ docs/html/ext/sgiexts.html, docs/html/faq/index.html: Convert
+ to XHTML.
+ * docs/html/faq/index.txt: Regenerate.
+
+2002-09-05 Jakub Jelinek <jakub@redhat.com>
+
+ * config/locale/gnu/ctype_members.cc (ctype<wchar_t>::do_widen(char)):
+ Switch to _M_c_locale_ctype around btowc call.
+ (ctype<wchar_t>::do_widen(const char*, const char *, wchar_t*)):
+ Switch to _M_c_locale_ctype around mbsrtowcs call.
+ (ctype<wchar_t>::do_narrow(char)): Switch to _M_c_locale_ctype around
+ wctob call.
+ (ctype<wchar_t>::do_narrow(const char*, const char *, wchar_t*)):
+ Switch to _M_c_locale_ctype around wcsrtombs call.
+
+2002-09-05 Jakub Jelinek <jakub@redhat.com>
+
+ * config/locale/gnu/monetary_members.cc
+ (moneypunct<wchar_t, true>::_M_initialize_moneypunct,
+ moneypunct<wchar_t, false>::_M_initialize_moneypunct): Use
+ __uselocale instead of setlocale for glibc 2.3.
+
+2002-09-05 Jakub Jelinek <jakub@redhat.com>
+
+ * config/locale/generic/c++locale_internal.h: New header.
+ * config/locale/gnu/c++locale_internal.h: New header.
+ * config/locale/gnu/c_locale.cc: Include it.
+ * config/locale/gnu/collate_members.cc: Include it.
+ * config/locale/gnu/ctype_members.cc: Include it.
+ * config/locale/gnu/messages_members.cc: Include it.
+ * config/locale/gnu/monetary_members.cc: Include it.
+ * config/locale/gnu/numeric_members.cc: Include it.
+ * config/locale/gnu/time_members.cc: Include it.
+ (_M_put): Reorder __strftime_l and __wcsftime_l arguments to match
+ glibc.
+ (_M_initialize_timepunct): Initialize _M_c_locale_timepunct for
+ C locale.
+ * acinclude.m4: Include string.h when testing strcoll_l.
+ For glibc 2.3 provide __-prefixed prototypes.
+ (CLOCALE_INTERNAL_H): Set, add AC_LINK_FILES line.
+ * aclocal.m4, configure: Rebuilt.
+
+2002-09-05 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/locale_facets.h: Add declaration of specialization
+ here.
+ * config/locale/gnu/messages_members.cc: Add specialization for
+ messages<wchar_t>.
+ * config/locale/gnu/messages_members.h: Remove generic definition
+ of do_get.
+
+2002-09-04 Richard Henderson <rth@redhat.com>
+
+ * include/std/std_limits.h (__glibcpp_f32_infinity_bytes,
+ __glibcpp_f32_has_infinity, __glibcpp_f64_infinity_bytes,
+ __glibcpp_f64_has_infinity, __glibcpp_f80_infinity_bytes,
+ __glibcpp_f80_has_infinity, __glibcpp_f96_infinity_bytes,
+ __glibcpp_f96_has_infinity, __glibcpp_f128_infinity_bytes,
+ __glibcpp_f128_has_infinity, __glibcpp_float_infinity_bytes,
+ __glibcpp_float_has_infinity, __glibcpp_double_infinity_bytes,
+ __glibcpp_double_has_infinity, __glibcpp_long_double_infinity_bytes,
+ __glibcpp_long_double_has_infinity): Remove.
+ (std::numeric_limits<float>, std::numeric_limits<double>,
+ std::numeric_limits<long double>): Use __builtin_huge_val
+ to implement has_infinity and infinity().
+ * src/limits.cc (__glibcpp_float_infinity, __glibcpp_double_infinity,
+ __glibcpp_long_double_infinity): Remove.
+
+2002-09-03 Richard Henderson <rth@redhat.com>
+
+ * include/std/std_limits.h (__glibcpp_f32_min, __glibcpp_f32_max,
+ __glibcpp_f32_digits, __glibcpp_f32_digits10, __glibcpp_f32_radix,
+ __glibcpp_f32_epsilon, __glibcpp_f32_min_exponent,
+ __glibcpp_f32_min_exponent10, __glibcpp_f32_max_exponent,
+ __glibcpp_f32_max_exponent10, __glibcpp_f64_min, __glibcpp_f64_max,
+ __glibcpp_f64_digits, __glibcpp_f64_digits10, __glibcpp_f64_radix,
+ __glibcpp_f64_min_exponent, __glibcpp_f64_min_exponent10,
+ __glibcpp_f64_max_exponent, __glibcpp_f64_max_exponent10,
+ __glibcpp_f80_min, __glibcpp_f80_max, __glibcpp_f80_digits,
+ __glibcpp_f80_digits10, __glibcpp_f80_radix, __glibcpp_f80_epsilon,
+ __glibcpp_f80_min_exponent, __glibcpp_f80_min_exponent10,
+ __glibcpp_f80_max_exponent, __glibcpp_f80_max_exponent10,
+ __glibcpp_f96_min, __glibcpp_f96_max, __glibcpp_f96_digits,
+ __glibcpp_f96_digits10, __glibcpp_f96_radix, __glibcpp_f96_epsilon,
+ __glibcpp_f96_min_exponent, __glibcpp_f96_min_exponent10,
+ __glibcpp_f96_max_exponent, __glibcpp_f96_max_exponent10,
+ __glibcpp_f128_min, __glibcpp_f128_max, __glibcpp_f128_digits,
+ __glibcpp_f128_digits10, __glibcpp_f128_radix, __glibcpp_f128_epsilon,
+ __glibcpp_f128_min_exponent, __glibcpp_f128_min_exponent10,
+ __glibcpp_f128_max_exponent, __glibcpp_f128_max_exponent10,
+ __glibcpp_float_min, __glibcpp_float_max, __glibcpp_float_digits,
+ __glibcpp_float_digits10, __glibcpp_float_radix,
+ __glibcpp_float_epsilon, __glibcpp_float_min_exponent,
+ __glibcpp_float_min_exponent10, __glibcpp_float_max_exponent,
+ __glibcpp_float_max_exponent10, __glibcpp_double_min,
+ __glibcpp_double_max, __glibcpp_double_digits,
+ __glibcpp_double_digits10, __glibcpp_double_radix,
+ __glibcpp_double_epsilon, __glibcpp_double_min_exponent,
+ __glibcpp_double_min_exponent10, __glibcpp_double_max_exponent,
+ __glibcpp_double_max_exponent10, __glibcpp_long_double_min,
+ __glibcpp_long_double_max, __glibcpp_long_double_digits,
+ __glibcpp_long_double_digits10, __glibcpp_long_double_radix,
+ __glibcpp_long_double_epsilon, __glibcpp_long_double_min_exponent,
+ __glibcpp_long_double_min_exponent10,
+ __glibcpp_long_double_max_exponent,
+ __glibcpp_long_double_max_exponent10): Remove macros.
+ (std::numeric_limits<float>, std::numeric_limits<double>,
+ std::numeric_limits<long double>): Use protected float.h macros.
+
+2002-09-01 Phil Edwards <pme@gcc.gnu.org>
+
+ * testsuite/Makefile.am: Use LD_RUN_PATH when linking abi_check.
+ Fix spelling in comment.
+ * testsuite/Makefile.in: Regenerate.
+ * testsuite/abi_check.cc: Use string literals to build 'cmd' rather
+ than 'quote' and 'bslash'.
+
+2002-08-31 Phil Edwards <pme@gcc.gnu.org>
+
+ * acinclude.m4: Minor comment tweaks.
+
+ * docs/html/makedoc.awk: New file...
+ * docs/html/Makefile: ...called from here...
+ * docs/html/documentation.html: ...to help generate this.
+
+ * docs/html/21_strings/howto.html: Prepare for new entry.
+ * include/bits/basic_string.h: Initial basic_stirng hook for
+ doxygen. Remove trailing whitespace.
+ * include/bits/char_traits.h: Point to onlinedocs for new entry.
+ * include/bits/stringfwd.h: Add doxygen hooks for string and
+ wstring typedefs.
+
+2002-08-29 Richard Earnshaw <rearnshaw@arm.com>
+
+ * config/cpu/arm/cpu_limits.h: New file.
+ * configure.target: Use config/cpu/arm for XScale and StrongARM
+ configurations.
+
+2002-08-28 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * include/std/std_limits.h (__glibcpp_char_bits,
+ __glibcpp_short_bits, __glibcpp_int_bits, __glibcpp_long_bits,
+ __glibcpp_long_long_bits, __glibcpp_float_bits,
+ __glibcpp_double_bits, __glibcpp_long_double_bits): Remove. Use
+ compiler predifined macros.
+ (__glibcpp_wchar_t_is_signed): Define based on compiler predefined
+ __WCHAR_UNSIGNED__.
+
+2002-08-27 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * include/std/std_limits.h (__glibcpp_f32_infinity_bytes,
+ __glibcpp_f32_has_infinity, __glibcpp_f32_QNaN_bytes,
+ __glibcpp_f32_has_QNaN, __glibcpp_f32_SNaN_bytes,
+ __glibcpp_f32_has_SNaN, __glibcpp_f32_denorm_min_bytes,
+ __glibcpp_f32_has_denorm, __glibcpp_f32_is_iec559,
+ __glibcpp_f64_infinity_bytes,
+ __glibcpp_f64_has_infinity, __glibcpp_f64_QNaN_bytes,
+ __glibcpp_f64_has_QNaN, __glibcpp_f64_SNaN_bytes,
+ __glibcpp_f64_has_SNaN, __glibcpp_f64_denorm_min_bytes,
+ __glibcpp_f64_has_denorm, __glibcpp_f64_is_iec559,
+ __glibcpp_f80_infinity_bytes,
+ __glibcpp_f80_has_infinity, __glibcpp_f80_QNaN_bytes,
+ __glibcpp_f80_has_QNaN, __glibcpp_f80_SNaN_bytes,
+ __glibcpp_f80_has_SNaN, __glibcpp_f80_denorm_min_bytes,
+ __glibcpp_f80_has_denorm, __glibcpp_f80_is_iec559,
+ __glibcpp_f96_infinity_bytes,
+ __glibcpp_f96_has_infinity, __glibcpp_f96_QNaN_bytes,
+ __glibcpp_f96_has_QNaN, __glibcpp_f96_SNaN_bytes,
+ __glibcpp_f96_has_SNaN, __glibcpp_f96_denorm_min_bytes,
+ __glibcpp_f96_has_denorm, __glibcpp_f96_is_iec559,
+ __glibcpp_f128_infinity_bytes,
+ __glibcpp_f128_has_infinity, __glibcpp_f128_QNaN_bytes,
+ __glibcpp_f128_has_QNaN, __glibcpp_f128_SNaN_bytes,
+ __glibcpp_f128_has_SNaN, __glibcpp_f128_denorm_min_bytes,
+ __glibcpp_f128_has_denorm, __glibcpp_f128_is_iec559,
+ __glibcpp_float_infinity_bytes,
+ __glibcpp_float_has_infinity, __glibcpp_float_QNaN_bytes,
+ __glibcpp_float_has_QNaN, __glibcpp_float_SNaN_bytes,
+ __glibcpp_float_has_SNaN, __glibcpp_float_denorm_min_bytes,
+ __glibcpp_float_has_denorm, __glibcpp_float_is_iec559,
+ __glibcpp_double_infinity_bytes,
+ __glibcpp_double_has_infinity, __glibcpp_double_QNaN_bytes,
+ __glibcpp_double_has_QNaN, __glibcpp_double_SNaN_bytes,
+ __glibcpp_double_has_SNaN, __glibcpp_double_denorm_min_bytes,
+ __glibcpp_double_has_denorm, __glibcpp_double_is_iec559,
+ __glibcpp_long_double_infinity_bytes,
+ __glibcpp_long_double_has_infinity, __glibcpp_long_double_QNaN_bytes,
+ __glibcpp_long_double_has_QNaN, __glibcpp_long_double_SNaN_bytes,
+ __glibcpp_long_double_has_SNaN, __glibcpp_long_double_denorm_min_bytes,
+ __glibcpp_long_double_has_denorm, __glibcpp_long_double_is_iec559:
+ New macros.
+ (__glibcpp_word_bits, __glibcpp_word): Likewise.
+ (__glibcpp_byte): New typedef.
+ (__float_storage, __double_storage, __long_double_storage): New types.
+ (__glibcpp_float_infinity, __glibcpp_float_QNaN,
+ __glibcpp_float_SNaN, __glibcpp_float_denorm_min): Now
+ objects. Declare.
+ (__glibcpp_double_infinity, __glibcpp_double_QNaN,
+ __glibcpp_double_SNaN, __glibcpp_double_denorm_min): Likewise.
+ (__glibcpp_long_double_infinity, __glibcpp_long_double_QNaN,
+ __glibcpp_long_double_SNaN, __glibcpp_long_double_denorm_min):
+ Likewise.
+
+ * src/limits.cc (__glibcpp_float_infinity, __glibcpp_float_QNaN,
+ __glibcpp_float_SNaN, __glibcpp_float_denorm_min): Define.
+ (__glibcpp_double_infinity, __glibcpp_double_QNaN,
+ __glibcpp_double_SNaN, __glibcpp_double_denorm_min): Likewise.
+ (__glibcpp_long_double_infinity, __glibcpp_long_double_QNaN,
+ __glibcpp_long_double_SNaN, __glibcpp_long_double_denorm_min):
+ Likewise.
+
+2002-08-25 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * include/std/std_limits.h: Indent conditional macro definitions.
+
+2002-08-23 Phil Edwards <pme@gcc.gnu.org>
+
+ * Makefile.am (check-abi): Specify current directory.
+ * acinclude.m4 (GLIBCPP_CONFIGURE_TESTSUITE): Fix shell syntax, use
+ abi_baseline_triplet in baseline_file.
+ * Makefile.in, aclocal.m4, configure: Regenerate.
+ * configure.target: Add abi_baseline_triplet with default.
+ * testsuite/abi_check.cc: More error checking.
+
+2002-08-23 Phil Edwards <pme@gcc.gnu.org>
+
+ * config/linker-map.gnu: Verbose comments, clean up spacing.
+ * include/bits/stl_alloc.h: Fix indentation of 'if' bodies, return
+ statements.
+ __allocator: Change class declaration to struct.
+ * docs/html/17_intro/C++STYLE: Fix typo.
+ * include/bits/stl_deque.h, include/bits/stl_list.h,
+ include/bits/stl_map.h, include/bits/stl_multimap.h,
+ include/bits/stl_vector.h: Fix fallout from typo.
+
+2002-08-22 Benjamin Kosnik <bkoz@redhat.com>
+
+ * acinclude.m4 (GLIBCPP_CONFIGURE_TESTSUITE): Set
+ GLIBCPP_BUILD_ABI_CHECK based on cross compiling, build, host
+ variables.
+ * aclocal.m4: Regenerate.
+ * testsuite/Makefile.am (noinst_PROGRAMS): Make conditional on
+ native compiling.
+ * testsuite/Makefile.in: Regenerate.
+
+2002-08-22 Loren J. Rittle <ljrittle@acm.org>
+
+ * testsuite/abi_check.cc: Enhance shell portability.
+ Support older binutils/readelf.
+ * config/abi/i386-unknown-freebsd4.6: Add.
+ * config/abi/i386-unknown-freebsd4.6/baseline_symbols.txt: New file.
+
2002-08-22 Paolo Carlini <pcarlini@unitus.it>
* docs/html/faq/index.html: Add Loren James Rittle and
@@ -66,7 +994,7 @@
punctuation.
2002-08-13 Jonathan Wakely <jw@kayari.org>
- Phil Edwards <pme@gcc.gnu.org>
+ Phil Edwards <pme@gcc.gnu.org>
* docs/html/documentation.html: Use HTML entities for punctuation.
@@ -81,7 +1009,7 @@
re-wrap comment lines as necessary.
2002-08-08 Danny Smith <dannysmith@users.sourceforge.net>
- Benjamin Kosnik <bkoz@redhat.com>
+ Benjamin Kosnik <bkoz@redhat.com>
* include/bits/istream.tcc (basic_istream::ignore): Use sbumpc,
not snextc.
@@ -195,7 +1123,7 @@
GLIBCPP_3.1 to GLIBCPP_3.2.
2002-07-31 Benjamin Kosnik <bkoz@redhat.com>
- Mark Mitchell <mark@codesourcery.com>
+ Mark Mitchell <mark@codesourcery.com>
PR libstdc++/7442
* libsupc++/cxxabi.h (class __base_class_type_info::hwm_bit):
@@ -245,7 +1173,7 @@
* docs/html/abi.txt: Update.
2002-07-30 Benjamin Kosnik <bkoz@redhat.com>
- Gabriel Dos Reis <gdr@nerim.net>
+ Gabriel Dos Reis <gdr@nerim.net>
* include/bits/char_traits.h: Remove generic definitions.
* include/bits/streambuf_iterator.h (istreambuf_iterator): Use
@@ -488,7 +1416,7 @@
* testsuite/23_containers/deque_operators.cc: Add test02.
2002-07-04 Benjamin Kosnik <bkoz@redhat.com>
- Jack Reeves <jackw_reeves@hotmail.com>
+ Jack Reeves <jackw_reeves@hotmail.com>
* include/std/std_streambuf.h (basic_streambuf::_M_buf): Change to
size_t, from int_type.
@@ -524,8 +1452,8 @@
* testsuite/ext/hash_map.cc: New.
2002-07-03 Jack Reeves <jackw_reeves@hotmail.com>
- Kenny Simpson <theonetruekenny@yahoo.com>
- Phil Edwards <pme@gcc.gnu.org>
+ Kenny Simpson <theonetruekenny@yahoo.com>
+ Phil Edwards <pme@gcc.gnu.org>
PR libstdc++/3946
* testsuite/20_util/auto_ptr.cc (test08): New test.
@@ -838,7 +1766,7 @@
* Makefile.in: Regenerated.
2002-06-11 J.T. Conklin <jtc@acorntoolworks.com>
- Benjamin Kosnik <bkoz@redhat.com>
+ Benjamin Kosnik <bkoz@redhat.com>
* configure.target: Set os_include_dir to config/os/qnx/qnx6.1
under *-qnx6.[12]*.
@@ -918,7 +1846,7 @@
Search correct multilib testsuite dir for libv3test.
2002-06-04 Paolo Carlini <pcarlini@unitus.it>
- Gaby Dos Reis <gdr@codesourcery.com>
+ Gaby Dos Reis <gdr@codesourcery.com>
* include/bits/basic_string.tcc
(basic_string::_S_construct(forward_iterator_tag):
@@ -1034,7 +1962,7 @@
* testsuite/22_locale/ctype_widen_wchar_t.cc: Same.
2002-05-26 Carlo Wood <carlo@alinoe.com>
- Paolo Carlini <pcarlini@unitus.it>
+ Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/6811
* config/locale/ieee_1003.1-2001/codecvt_specializations.h
@@ -1203,7 +2131,7 @@
* testsuite/22_locale/ctype_scan_char.cc: New file.
2002-05-13 Paolo Carlini <pcarlini@unitus.it>
- Jakub Jelinek <jakub@redhat.com>
+ Jakub Jelinek <jakub@redhat.com>
* testsuite/22_locale/money_get_members_char.cc
(test01, test02, test04): Use the de_DE@euro named locale
@@ -1219,7 +2147,7 @@
2002-05-13 Paolo Carlini <pcarlini@unitus.it>
* testsuite/22_locale/codecvt_members_char_char.cc
- (test03): Robustify wrt localedata.
+ (test03): Robustify wrt localedata.
* testsuite/22_locale/codecvt_members_wchar_t_char.cc (test03): Likewise.
* testsuite/22_locale/collate_members_char.cc (test04): Likewise.
* testsuite/22_locale/collate_members_wchar_t.cc (test04): Likewise.
@@ -1474,7 +2402,7 @@
* include/ext/stl_hashtable.h: Import __iterator_category
2002-04-28 Paolo Carlini <pcarlini@unitus.it>
- Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
+ Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
* testsuite/ext/hash_set.cc: New testfile.
@@ -1817,10 +2745,10 @@
2002-04-03 Benjamin Kosnik <bkoz@redhat.com>
- As per DR 184, libstdc++/3139
- * include/std/std_limits.h (__glibcpp_bool_digits): Change to 1.
- (numeric_limits<bool>::is_iec559): False.
- (numeric_limits<bool>::is_modulo): False.
+ As per DR 184, libstdc++/3139
+ * include/std/std_limits.h (__glibcpp_bool_digits): Change to 1.
+ (numeric_limits<bool>::is_iec559): False.
+ (numeric_limits<bool>::is_modulo): False.
* testsuite/27_io/ios_init.cc: Add instantiations.
@@ -1844,8 +2772,8 @@
* include/Makefile.in: Regenerate.
2002-04-02 Paolo Carlini <pcarlini@unitus.it>
- Nathan Myers <ncm@cantrip.org>
- Philip Martin <philip@codematters.co.uk>
+ Nathan Myers <ncm@cantrip.org>
+ Philip Martin <philip@codematters.co.uk>
* include/bits/basic_string.h
(replace(i1, i2, _CharT* k1, _CharT* k2),
@@ -1946,7 +2874,7 @@
(test02): New tests.
2002-03-28 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
- Paolo Carlini <pcarlini@unitus.it>
+ Paolo Carlini <pcarlini@unitus.it>
* testsuite/22_locale/codecvt_members_unicode_wchar_t.cc
(test01): Protect the test with _GLIBCPP_USE_WCHAR_T;
@@ -1997,7 +2925,7 @@
* include/Makefile.in: Regerate.
2002-03-25 Paolo Carlini <pcarlini@unitus.it>
- Richard Henderson <rth@redhat.com>
+ Richard Henderson <rth@redhat.com>
* testsuite/22_locale/codecvt_members_unicode_char.cc
(test01, test02): make sure that the i_lit_base array
@@ -2005,8 +2933,8 @@
2002-03-25 Benjamin Kosnik <bkoz@redhat.com>
- * config/os/newlib/bits/ctype_noninline.h (ctype::classic): Set to
- _ctype_.
+ * config/os/newlib/bits/ctype_noninline.h (ctype::classic): Set to
+ _ctype_.
2002-03-25 Paolo Carlini <pcarlini@unitus.it>
@@ -2018,14 +2946,14 @@
test against +-1.
2002-03-25 Benjamin Kosnik <bkoz@redhat.com>
- Jakub Jelinek <jakub@redhat.com>
+ Jakub Jelinek <jakub@redhat.com>
* config/locale/gnu/messages_members.h: Correct conditional.
* config/locale/gnu/messages_members.cc: Same.
* config/locale/gnu/time_members.cc: Same.
2002-03-25 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
- Paolo Carlini <pcarlini@unitus.it>
+ Paolo Carlini <pcarlini@unitus.it>
* testsuite/22_locale/codecvt_members_unicode_char.cc
(test01, test02): Fix i_lit_base arrays, making them
@@ -2067,7 +2995,7 @@
* configure: Likewise.
2002-03-19 Paolo Carlini <pcarlini@unitus.it>
- Ulrich Drepper <drepper@redhat.com>
+ Ulrich Drepper <drepper@redhat.com>
* src/locale-inst.cc (__convert_from_v): Add an additional
__size parameter in the declarations.
@@ -2169,7 +3097,7 @@
* testsuite/thread/pthread4.cc: Lower nominal iteration counter.
2002-03-12 Benjamin Kosnik <bkoz@redhat.com>
- Per Liboriussen <liborius@stofanet.dk>
+ Per Liboriussen <liborius@stofanet.dk>
* config/os/gnu-linux/bits/ctype_noninline.h: Cast to
unsigned char.
@@ -2241,7 +3169,7 @@
Remove redundant variable.
2002-03-10 Ulrich Drepper <drepper@redhat.com>
- Paolo Carlini <pcarlini@unitus.it>
+ Paolo Carlini <pcarlini@unitus.it>
* config/locale/generic/collate_members.cc
(collate<char,wchar_t>::_M_compare_helper): normalize
diff --git a/libstdc++-v3/Makefile.am b/libstdc++-v3/Makefile.am
index 99d9c731e1c..ef884fbff27 100644
--- a/libstdc++-v3/Makefile.am
+++ b/libstdc++-v3/Makefile.am
@@ -46,10 +46,25 @@ check-script-install: $(top_builddir)/mkcheck
cd testsuite; \
@glibcpp_builddir@/mkcheck 1)
+# Use 'new-abi-baseline' to create an initial symbol file. Then run
+# 'check-abi' to test for changes against that file.
baseline_file = @baseline_file@
check-abi: $(top_builddir)/testsuite/abi_check
- -(cd testsuite; \
- abi_check @baseline_file@)
+ -@(cd testsuite; \
+ ${top_srcdir}/config/abi/extract_symvers \
+ ../src/.libs/libstdc++.so \
+ ./current_symbols.txt && \
+ ./abi_check --check ./current_symbols.txt ${baseline_file})
+
+new-abi-baseline:
+ -@(output=${baseline_file}; \
+ if test -f $${output}; then \
+ output=$${output}.new; \
+ t=`echo $${output} | sed 's=.*config/abi/=='`; \
+ echo "Baseline file already exists, writing to $${t} instead."; \
+ fi; \
+ ${top_srcdir}/config/abi/extract_symvers \
+ src/.libs/libstdc++.so $${output})
# These rules are messy, but are hella worth it.
doxygen:
@@ -95,7 +110,7 @@ distclean-am: distclean-multi
maintainer-clean-am: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in
index 08b6181297d..7d0551f6ca3 100644
--- a/libstdc++-v3/Makefile.in
+++ b/libstdc++-v3/Makefile.in
@@ -74,7 +74,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXX = @CXX@
CXXCPP = @CXXCPP@
@@ -141,6 +140,8 @@ mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
PWD = $${PWDCMD-pwd}
+# Use 'new-abi-baseline' to create an initial symbol file. Then run
+# 'check-abi' to test for changes against that file.
baseline_file = @baseline_file@
# Multilib support.
@@ -485,8 +486,21 @@ check-script-install: $(top_builddir)/mkcheck
cd testsuite; \
@glibcpp_builddir@/mkcheck 1)
check-abi: $(top_builddir)/testsuite/abi_check
- -(cd testsuite; \
- abi_check @baseline_file@)
+ -@(cd testsuite; \
+ ${top_srcdir}/config/abi/extract_symvers \
+ ../src/.libs/libstdc++.so \
+ ./current_symbols.txt && \
+ ./abi_check --check ./current_symbols.txt ${baseline_file})
+
+new-abi-baseline:
+ -@(output=${baseline_file}; \
+ if test -f $${output}; then \
+ output=$${output}.new; \
+ t=`echo $${output} | sed 's=.*config/abi/=='`; \
+ echo "Baseline file already exists, writing to $${t} instead."; \
+ fi; \
+ ${top_srcdir}/config/abi/extract_symvers \
+ src/.libs/libstdc++.so $${output})
# These rules are messy, but are hella worth it.
doxygen:
@@ -521,7 +535,7 @@ distclean-am: distclean-multi
maintainer-clean-am: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/libstdc++-v3/acconfig.h b/libstdc++-v3/acconfig.h
index aa0dd99cfa9..777e94a5039 100644
--- a/libstdc++-v3/acconfig.h
+++ b/libstdc++-v3/acconfig.h
@@ -46,6 +46,20 @@
// Define if you have the copysignf function.
#undef _GLIBCPP_HAVE_COPYSIGNF
+// Define to use symbol versioning in the shared library.
+#undef _GLIBCPP_SYMVER
+
+// Define symbol versioning in assember directives. If symbol
+// versioning is beigng used, and the assembler supports this kind of
+// thing, then use it.
+// NB: _GLIBCPP_AT_AT is a hack to work around quoting issues in m4.
+#if _GLIBCPP_SYMVER
+ #define _GLIBCPP_ASM_SYMVER(cur, old, version) \
+ asm (".symver " #cur "," #old _GLIBCPP_AT_AT #version);
+#else
+ #define _GLIBCPP_ASM_SYMVER(cur, old, version)
+#endif
+
// Define if mbstate_t exists in wchar.h.
#undef HAVE_MBSTATE_T
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 1bc49fc8ac8..2bfec92da0f 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1,5 +1,5 @@
dnl
-dnl Initialize configure bits.
+dnl Initialize basic configure bits, set toplevel_srcdir for Makefiles.
dnl
dnl GLIBCPP_TOPREL_CONFIGURE
AC_DEFUN(GLIBCPP_TOPREL_CONFIGURE, [
@@ -37,13 +37,10 @@ AC_DEFUN(GLIBCPP_TOPREL_CONFIGURE, [
])
dnl
-dnl Initialize configure bits.
+dnl Initialize the rest of the library configury.
dnl
dnl GLIBCPP_CONFIGURE
AC_DEFUN(GLIBCPP_CONFIGURE, [
-
-#possibly test for the presence of the compiler sources here?
-
# Export build and source directories.
# These need to be absolute paths, yet at the same time need to
# canonicalize only relative paths, because then amd will not unmount
@@ -1131,6 +1128,12 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
AC_TRY_RUN([
#define _GNU_SOURCE 1
#include <locale.h>
+ #include <string.h>
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ extern __typeof(newlocale) __newlocale;
+ extern __typeof(duplocale) __duplocale;
+ extern __typeof(strcoll_l) __strcoll_l;
+ #endif
int main()
{
const char __one[] = "Äuglein Augmen";
@@ -1172,6 +1175,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CLOCALE_H=config/locale/generic/c_locale.h
CLOCALE_CC=config/locale/generic/c_locale.cc
CCODECVT_H=config/locale/generic/codecvt_specializations.h
+ CCODECVT_CC=config/locale/generic/codecvt_members.cc
CCOLLATE_CC=config/locale/generic/collate_members.cc
CCTYPE_CC=config/locale/generic/ctype_members.cc
CMESSAGES_H=config/locale/generic/messages_members.h
@@ -1179,6 +1183,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CMONEY_CC=config/locale/generic/monetary_members.cc
CNUMERIC_CC=config/locale/generic/numeric_members.cc
CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
xgnu)
AC_MSG_RESULT(gnu)
@@ -1204,6 +1209,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CLOCALE_H=config/locale/gnu/c_locale.h
CLOCALE_CC=config/locale/gnu/c_locale.cc
CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+ CCODECVT_CC=config/locale/gnu/codecvt_members.cc
CCOLLATE_CC=config/locale/gnu/collate_members.cc
CCTYPE_CC=config/locale/gnu/ctype_members.cc
CMESSAGES_H=config/locale/gnu/messages_members.h
@@ -1211,6 +1217,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CMONEY_CC=config/locale/gnu/monetary_members.cc
CNUMERIC_CC=config/locale/gnu/numeric_members.cc
CTIME_CC=config/locale/gnu/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
;;
xieee_1003.1-2001)
AC_MSG_RESULT(generic)
@@ -1218,6 +1225,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+ CCODECVT_CC=config/locale/generic/codecvt_members.cc
CCOLLATE_CC=config/locale/generic/collate_members.cc
CCTYPE_CC=config/locale/generic/ctype_members.cc
CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
@@ -1225,6 +1233,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CMONEY_CC=config/locale/generic/monetary_members.cc
CNUMERIC_CC=config/locale/generic/numeric_members.cc
CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
*)
echo "$enable_clocale is an unknown locale package" 1>&2
@@ -1237,17 +1246,23 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
glibcpp_localedir=${glibcpp_builddir}/po/share/locale
AC_SUBST(glibcpp_localedir)
+ # For the time being, transform ctype_noninline.h to ctype_members_char.cc
+# CCTYPE_CHAR_CC=config/${os_include_dir}/ctype_noninline.h
+
AC_SUBST(USE_NLS)
AC_SUBST(CLOCALE_H)
AC_SUBST(CCODECVT_H)
AC_SUBST(CMESSAGES_H)
AC_LINK_FILES($CLOCALE_CC, src/c++locale.cc)
- AC_LINK_FILES($CCOLLATE_CC, src/collate.cc)
- AC_LINK_FILES($CCTYPE_CC, src/ctype.cc)
- AC_LINK_FILES($CMESSAGES_CC, src/messages.cc)
- AC_LINK_FILES($CMONEY_CC, src/monetary.cc)
- AC_LINK_FILES($CNUMERIC_CC, src/numeric.cc)
- AC_LINK_FILES($CTIME_CC, src/time.cc)
+ AC_LINK_FILES($CCODECVT_CC, src/codecvt_members.cc)
+ AC_LINK_FILES($CCOLLATE_CC, src/collate_members.cc)
+# AC_LINK_FILES($CCTYPE_CHAR_CC, src/ctype_members_char.cc)
+ AC_LINK_FILES($CCTYPE_CC, src/ctype_members.cc)
+ AC_LINK_FILES($CMESSAGES_CC, src/messages_members.cc)
+ AC_LINK_FILES($CMONEY_CC, src/monetary_members.cc)
+ AC_LINK_FILES($CNUMERIC_CC, src/numeric_members.cc)
+ AC_LINK_FILES($CTIME_CC, src/time_members.cc)
+ AC_LINK_FILES($CLOCALE_INTERNAL_H, src/c++locale_internal.h)
])
@@ -1672,9 +1687,8 @@ dnl
dnl GLIBCPP_ENABLE_CHEADERS
dnl --enable-cheaders= [does stuff].
dnl --disable-cheaders [does not do anything, really].
-dnl + This will eventually need to be 'c_shadow' by default.
dnl + Usage: GLIBCPP_ENABLE_CHEADERS[(DEFAULT)]
-dnl Where DEFAULT is either `c' or `c_std' or 'c_shadow'.
+dnl Where DEFAULT is either `c' or `c_std'.
dnl If ommitted, it defaults to `c_std'.
AC_DEFUN(GLIBCPP_ENABLE_CHEADERS, [dnl
define([GLIBCPP_ENABLE_CHEADERS_DEFAULT], ifelse($1, c_std, c_std, c_std))dnl
@@ -1690,9 +1704,6 @@ changequote([, ])
c_std)
enable_cheaders=c_std
;;
- c_shadow)
- enable_cheaders=c_shadow
- ;;
*) AC_MSG_ERROR([Unknown argument to enable/disable "C" headers])
;;
esac],
@@ -1701,9 +1712,6 @@ changequote([, ])
dnl Option parsed, now set things appropriately
case "$enable_cheaders" in
- c_shadow)
- C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_shadow'
- ;;
c_std)
C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_std'
;;
@@ -1752,7 +1760,6 @@ dnl TOPLEVEL_INCLUDES
dnl LIBMATH_INCLUDES
dnl LIBSUPCXX_INCLUDES
dnl LIBIO_INCLUDES
-dnl CSHADOW_INCLUDES
dnl
dnl GLIBCPP_EXPORT_INCLUDES
AC_DEFUN(GLIBCPP_EXPORT_INCLUDES, [
@@ -2028,8 +2035,12 @@ AC_DEFUN(GLIBCPP_CONFIGURE_TESTSUITE, [
GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
# Export file names for ABI checking.
- baseline_file="${glibcpp_srcdir}/config/abi/${target_alias}/baseline_symbols.txt"
+ baseline_file="${glibcpp_srcdir}/config/abi/${abi_baseline_triplet}/baseline_symbols.txt"
AC_SUBST(baseline_file)
+
+ # Don't do ABI checking unless native.
+ AM_CONDITIONAL(GLIBCPP_BUILD_ABI_CHECK,
+ test x"$build" = x"$host" && test -z "$with_cross_host")
])
@@ -2183,6 +2194,7 @@ case $enable_symvers in
;;
gnu)
LINKER_MAP=config/linker-map.gnu
+ AC_DEFINE(_GLIBCPP_SYMVER)
;;
esac
diff --git a/libstdc++-v3/aclocal.m4 b/libstdc++-v3/aclocal.m4
index 1595c2b5128..3bde35d3b3f 100644
--- a/libstdc++-v3/aclocal.m4
+++ b/libstdc++-v3/aclocal.m4
@@ -11,7 +11,7 @@ dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
dnl PARTICULAR PURPOSE.
dnl
-dnl Initialize configure bits.
+dnl Initialize basic configure bits, set toplevel_srcdir for Makefiles.
dnl
dnl GLIBCPP_TOPREL_CONFIGURE
AC_DEFUN(GLIBCPP_TOPREL_CONFIGURE, [
@@ -49,13 +49,10 @@ AC_DEFUN(GLIBCPP_TOPREL_CONFIGURE, [
])
dnl
-dnl Initialize configure bits.
+dnl Initialize the rest of the library configury.
dnl
dnl GLIBCPP_CONFIGURE
AC_DEFUN(GLIBCPP_CONFIGURE, [
-
-#possibly test for the presence of the compiler sources here?
-
# Export build and source directories.
# These need to be absolute paths, yet at the same time need to
# canonicalize only relative paths, because then amd will not unmount
@@ -1143,6 +1140,12 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
AC_TRY_RUN([
#define _GNU_SOURCE 1
#include <locale.h>
+ #include <string.h>
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ extern __typeof(newlocale) __newlocale;
+ extern __typeof(duplocale) __duplocale;
+ extern __typeof(strcoll_l) __strcoll_l;
+ #endif
int main()
{
const char __one[] = "Äuglein Augmen";
@@ -1184,6 +1187,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CLOCALE_H=config/locale/generic/c_locale.h
CLOCALE_CC=config/locale/generic/c_locale.cc
CCODECVT_H=config/locale/generic/codecvt_specializations.h
+ CCODECVT_CC=config/locale/generic/codecvt_members.cc
CCOLLATE_CC=config/locale/generic/collate_members.cc
CCTYPE_CC=config/locale/generic/ctype_members.cc
CMESSAGES_H=config/locale/generic/messages_members.h
@@ -1191,6 +1195,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CMONEY_CC=config/locale/generic/monetary_members.cc
CNUMERIC_CC=config/locale/generic/numeric_members.cc
CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
xgnu)
AC_MSG_RESULT(gnu)
@@ -1216,6 +1221,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CLOCALE_H=config/locale/gnu/c_locale.h
CLOCALE_CC=config/locale/gnu/c_locale.cc
CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+ CCODECVT_CC=config/locale/gnu/codecvt_members.cc
CCOLLATE_CC=config/locale/gnu/collate_members.cc
CCTYPE_CC=config/locale/gnu/ctype_members.cc
CMESSAGES_H=config/locale/gnu/messages_members.h
@@ -1223,6 +1229,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CMONEY_CC=config/locale/gnu/monetary_members.cc
CNUMERIC_CC=config/locale/gnu/numeric_members.cc
CTIME_CC=config/locale/gnu/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
;;
xieee_1003.1-2001)
AC_MSG_RESULT(generic)
@@ -1230,6 +1237,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+ CCODECVT_CC=config/locale/generic/codecvt_members.cc
CCOLLATE_CC=config/locale/generic/collate_members.cc
CCTYPE_CC=config/locale/generic/ctype_members.cc
CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
@@ -1237,6 +1245,7 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
CMONEY_CC=config/locale/generic/monetary_members.cc
CNUMERIC_CC=config/locale/generic/numeric_members.cc
CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
*)
echo "$enable_clocale is an unknown locale package" 1>&2
@@ -1249,17 +1258,23 @@ AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
glibcpp_localedir=${glibcpp_builddir}/po/share/locale
AC_SUBST(glibcpp_localedir)
+ # For the time being, transform ctype_noninline.h to ctype_members_char.cc
+# CCTYPE_CHAR_CC=config/${os_include_dir}/ctype_noninline.h
+
AC_SUBST(USE_NLS)
AC_SUBST(CLOCALE_H)
AC_SUBST(CCODECVT_H)
AC_SUBST(CMESSAGES_H)
AC_LINK_FILES($CLOCALE_CC, src/c++locale.cc)
- AC_LINK_FILES($CCOLLATE_CC, src/collate.cc)
- AC_LINK_FILES($CCTYPE_CC, src/ctype.cc)
- AC_LINK_FILES($CMESSAGES_CC, src/messages.cc)
- AC_LINK_FILES($CMONEY_CC, src/monetary.cc)
- AC_LINK_FILES($CNUMERIC_CC, src/numeric.cc)
- AC_LINK_FILES($CTIME_CC, src/time.cc)
+ AC_LINK_FILES($CCODECVT_CC, src/codecvt_members.cc)
+ AC_LINK_FILES($CCOLLATE_CC, src/collate_members.cc)
+# AC_LINK_FILES($CCTYPE_CHAR_CC, src/ctype_members_char.cc)
+ AC_LINK_FILES($CCTYPE_CC, src/ctype_members.cc)
+ AC_LINK_FILES($CMESSAGES_CC, src/messages_members.cc)
+ AC_LINK_FILES($CMONEY_CC, src/monetary_members.cc)
+ AC_LINK_FILES($CNUMERIC_CC, src/numeric_members.cc)
+ AC_LINK_FILES($CTIME_CC, src/time_members.cc)
+ AC_LINK_FILES($CLOCALE_INTERNAL_H, src/c++locale_internal.h)
])
@@ -1684,9 +1699,8 @@ dnl
dnl GLIBCPP_ENABLE_CHEADERS
dnl --enable-cheaders= [does stuff].
dnl --disable-cheaders [does not do anything, really].
-dnl + This will eventually need to be 'c_shadow' by default.
dnl + Usage: GLIBCPP_ENABLE_CHEADERS[(DEFAULT)]
-dnl Where DEFAULT is either `c' or `c_std' or 'c_shadow'.
+dnl Where DEFAULT is either `c' or `c_std'.
dnl If ommitted, it defaults to `c_std'.
AC_DEFUN(GLIBCPP_ENABLE_CHEADERS, [dnl
define([GLIBCPP_ENABLE_CHEADERS_DEFAULT], ifelse($1, c_std, c_std, c_std))dnl
@@ -1702,9 +1716,6 @@ changequote([, ])
c_std)
enable_cheaders=c_std
;;
- c_shadow)
- enable_cheaders=c_shadow
- ;;
*) AC_MSG_ERROR([Unknown argument to enable/disable "C" headers])
;;
esac],
@@ -1713,9 +1724,6 @@ changequote([, ])
dnl Option parsed, now set things appropriately
case "$enable_cheaders" in
- c_shadow)
- C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_shadow'
- ;;
c_std)
C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_std'
;;
@@ -1764,7 +1772,6 @@ dnl TOPLEVEL_INCLUDES
dnl LIBMATH_INCLUDES
dnl LIBSUPCXX_INCLUDES
dnl LIBIO_INCLUDES
-dnl CSHADOW_INCLUDES
dnl
dnl GLIBCPP_EXPORT_INCLUDES
AC_DEFUN(GLIBCPP_EXPORT_INCLUDES, [
@@ -2040,8 +2047,12 @@ AC_DEFUN(GLIBCPP_CONFIGURE_TESTSUITE, [
GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
# Export file names for ABI checking.
- baseline_file="${glibcpp_srcdir}/config/abi/${target_alias}/baseline_symbols.txt"
+ baseline_file="${glibcpp_srcdir}/config/abi/${abi_baseline_triplet}/baseline_symbols.txt"
AC_SUBST(baseline_file)
+
+ # Don't do ABI checking unless native.
+ AM_CONDITIONAL(GLIBCPP_BUILD_ABI_CHECK,
+ test x"$build" = x"$host" && test -z "$with_cross_host")
])
@@ -2195,6 +2206,7 @@ case $enable_symvers in
;;
gnu)
LINKER_MAP=config/linker-map.gnu
+ AC_DEFINE(_GLIBCPP_SYMVER)
;;
esac
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index a310bc8454d..c565a8ba006 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -24,6 +24,20 @@
// Define to use concept checking code from the boost libraries.
#undef _GLIBCPP_CONCEPT_CHECKS
+// Define to use symbol versioning in the shared library.
+#undef _GLIBCPP_SYMVER
+
+// Define symbol versioning in assember directives. If symbol
+// versioning is beigng used, and the assembler supports this kind of
+// thing, then use it.
+// NB: _GLIBCPP_AT_AT is a hack to work around quoting issues in m4.
+#if _GLIBCPP_SYMVER
+ #define _GLIBCPP_ASM_SYMVER(cur, old, version) \
+ asm (".symver " #cur "," #old _GLIBCPP_AT_AT #version);
+#else
+ #define _GLIBCPP_ASM_SYMVER(cur, old, version)
+#endif
+
// Define if mbstate_t exists in wchar.h.
#undef HAVE_MBSTATE_T
diff --git a/libstdc++-v3/config/abi/alphaev67-unknown-linux-gnu/baseline_symbols.txt b/libstdc++-v3/config/abi/alphaev67-unknown-linux-gnu/baseline_symbols.txt
new file mode 100644
index 00000000000..b2df36d3bf7
--- /dev/null
+++ b/libstdc++-v3/config/abi/alphaev67-unknown-linux-gnu/baseline_symbols.txt
@@ -0,0 +1,3031 @@
+FUNC:__cxa_allocate_exception@@CXXABI_1.2
+FUNC:__cxa_bad_cast@@CXXABI_1.2
+FUNC:__cxa_bad_typeid@@CXXABI_1.2
+FUNC:__cxa_begin_catch@@CXXABI_1.2
+FUNC:__cxa_call_unexpected@@CXXABI_1.2
+FUNC:__cxa_current_exception_type@@CXXABI_1.2
+FUNC:__cxa_demangle@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append@@CXXABI_1.2
+FUNC:__cxa_dyn_string_clear@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy@@CXXABI_1.2
+FUNC:__cxa_dyn_string_delete@@CXXABI_1.2
+FUNC:__cxa_dyn_string_eq@@CXXABI_1.2
+FUNC:__cxa_dyn_string_init@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert@@CXXABI_1.2
+FUNC:__cxa_dyn_string_new@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend@@CXXABI_1.2
+FUNC:__cxa_dyn_string_release@@CXXABI_1.2
+FUNC:__cxa_dyn_string_resize@@CXXABI_1.2
+FUNC:__cxa_dyn_string_substring@@CXXABI_1.2
+FUNC:__cxa_end_catch@@CXXABI_1.2
+FUNC:__cxa_free_exception@@CXXABI_1.2
+FUNC:__cxa_get_globals@@CXXABI_1.2
+FUNC:__cxa_get_globals_fast@@CXXABI_1.2
+FUNC:__cxa_pure_virtual@@CXXABI_1.2
+FUNC:__cxa_rethrow@@CXXABI_1.2
+FUNC:__cxa_throw@@CXXABI_1.2
+FUNC:__cxa_vec_cctor@@CXXABI_1.2
+FUNC:__cxa_vec_cleanup@@CXXABI_1.2
+FUNC:__cxa_vec_ctor@@CXXABI_1.2
+FUNC:__cxa_vec_delete2@@CXXABI_1.2
+FUNC:__cxa_vec_delete3@@CXXABI_1.2
+FUNC:__cxa_vec_delete@@CXXABI_1.2
+FUNC:__cxa_vec_dtor@@CXXABI_1.2
+FUNC:__cxa_vec_new2@@CXXABI_1.2
+FUNC:__cxa_vec_new3@@CXXABI_1.2
+FUNC:__cxa_vec_new@@CXXABI_1.2
+FUNC:__dynamic_cast@@CXXABI_1.2
+FUNC:__gxx_personality_v0@@CXXABI_1.2
+FUNC:_ZdaPv@@GLIBCPP_3.2
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZdlPv@@GLIBCPP_3.2
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.2
+FUNC:_Znam@@GLIBCPP_3.2
+FUNC:_ZnamRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE7addressERc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE7addressERKc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERKw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_foldEmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCPP_3.2
+FUNC:_ZNKSi6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs2atEm@@GLIBCPP_3.2
+FUNC:_ZNKSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4copyEPcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6substrEmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_foldEmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8_M_checkEm@@GLIBCPP_3.2
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSsixEm@@GLIBCPP_3.2
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_ampmEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE7_M_ampmEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE7_M_daysEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE9_M_monthsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_scan_isEtPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE11do_scan_notEtPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEPKcS2_Pt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEtc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEPwPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_toupperEPwPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE5do_isEPKwS2_Pt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE5do_isEtw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCPP_3.2
+FUNC:_ZNKSt6locale4nameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERKS0_PKcS5_m@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERKS0_PKcS5_m@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE10_M_compareEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE12do_transformEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE12_M_transformEPwPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE4hashEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE7compareEPKwS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE7do_hashEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE9transformEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_widen_intES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIlEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intImEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIxEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIyEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_widen_floatES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertES3_RSt8ios_basecPKci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_widen_intES3_RSt8ios_basewPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIlEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intImEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIxEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIyEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_widen_floatES3_RSt8ios_basewPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE16_M_convert_floatIdEES3_S3_RSt8ios_basewcT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE16_M_convert_floatIeEES3_S3_RSt8ios_basewcT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertES3_RSt8ios_basewPKwi@@GLIBCPP_3.2
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numERS3_S5_RiiimRKSt5ctypeIcERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameERS3_S5_RiPPKcmRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numERS3_S5_RiiimRKSt5ctypeIwERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameERS3_S5_RiPPKwmRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8valarrayImE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9exception4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE10deallocateEPcm@@GLIBCPP_3.2
+FUNC:_ZNSaIcE7destroyEPc@@GLIBCPP_3.2
+FUNC:_ZNSaIcE8allocateEmPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE9constructEPcRKc@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwE10deallocateEPwm@@GLIBCPP_3.2
+FUNC:_ZNSaIwE7destroyEPw@@GLIBCPP_3.2
+FUNC:_ZNSaIwE8allocateEmPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIwE9constructEPwRKw@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKwS2_EEEERS2_NS5_IPwS2_EESB_T_SC_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIN9__gnu_cxx17__normal_iteratorIPwS2_EEEERS2_S7_S7_T_S9_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIPKwEERS2_N9__gnu_cxx17__normal_iteratorIPwS2_EESA_T_SB_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIPwEERS2_N9__gnu_cxx17__normal_iteratorIS4_S2_EES8_T_S9_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKwS2_EEEERS2_NS5_IPwS2_EESB_T_SC_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPwS2_EEEERS2_S7_S7_T_S9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIPKwEERS2_N9__gnu_cxx17__normal_iteratorIPwS2_EESA_T_SB_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIPwEERS2_N9__gnu_cxx17__normal_iteratorIS4_S2_EES8_T_S9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_RepixEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPKwS2_EEEET_S9_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPKwS2_EEEET_S9_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCPP_3.2
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPclc@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi3getERc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSi3getEv@@GLIBCPP_3.2
+FUNC:_ZNSi4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSi4readEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSi5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSi5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSi6ignoreEli@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPclc@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi7putbackEc@@GLIBCPP_3.2
+FUNC:_ZNSi8readsomeEPcl@@GLIBCPP_3.2
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSirsERb@@GLIBCPP_3.2
+FUNC:_ZNSirsERd@@GLIBCPP_3.2
+FUNC:_ZNSirsERe@@GLIBCPP_3.2
+FUNC:_ZNSirsERf@@GLIBCPP_3.2
+FUNC:_ZNSirsERi@@GLIBCPP_3.2
+FUNC:_ZNSirsERj@@GLIBCPP_3.2
+FUNC:_ZNSirsERl@@GLIBCPP_3.2
+FUNC:_ZNSirsERm@@GLIBCPP_3.2
+FUNC:_ZNSirsERPv@@GLIBCPP_3.2
+FUNC:_ZNSirsERs@@GLIBCPP_3.2
+FUNC:_ZNSirsERt@@GLIBCPP_3.2
+FUNC:_ZNSirsERx@@GLIBCPP_3.2
+FUNC:_ZNSirsERy@@GLIBCPP_3.2
+FUNC:_ZNSo3putEc@@GLIBCPP_3.2
+FUNC:_ZNSo5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSo5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSo5writeEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSolsEb@@GLIBCPP_3.2
+FUNC:_ZNSolsEd@@GLIBCPP_3.2
+FUNC:_ZNSolsEe@@GLIBCPP_3.2
+FUNC:_ZNSolsEf@@GLIBCPP_3.2
+FUNC:_ZNSolsEi@@GLIBCPP_3.2
+FUNC:_ZNSolsEj@@GLIBCPP_3.2
+FUNC:_ZNSolsEl@@GLIBCPP_3.2
+FUNC:_ZNSolsEm@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSolsEs@@GLIBCPP_3.2
+FUNC:_ZNSolsEt@@GLIBCPP_3.2
+FUNC:_ZNSolsEx@@GLIBCPP_3.2
+FUNC:_ZNSolsEy@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_constructEmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_@@GLIBCPP_3.2
+FUNC:_ZNSs2atEm@@GLIBCPP_3.2
+FUNC:_ZNSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEm@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep9_S_createEmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_RepixEm@@GLIBCPP_3.2
+FUNC:_ZNSs4swapERSs@@GLIBCPP_3.2
+FUNC:_ZNSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSs5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEmm@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmmc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEm@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_dataEPc@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmmc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmPKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNSs7reserveEm@@GLIBCPP_3.2
+FUNC:_ZNSs9_M_mutateEmmm@@GLIBCPP_3.2
+FUNC:_ZNSs9push_backEc@@GLIBCPP_3.2
+FUNC:_ZNSsaSEc@@GLIBCPP_3.2
+FUNC:_ZNSsaSEPKc@@GLIBCPP_3.2
+FUNC:_ZNSsaSERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC1EmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsmmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsmmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsixEm@@GLIBCPP_3.2
+FUNC:_ZNSspLEc@@GLIBCPP_3.2
+FUNC:_ZNSspLEPKc@@GLIBCPP_3.2
+FUNC:_ZNSspLERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base13_S_format_intERKSt8ios_basePccc@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePccl@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE10sys_ungetcEi@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE12_M_open_modeESt13_Ios_OpenmodeRiS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekposElSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_getcEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmodeb@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_allocEm@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_l@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1El@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPalS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPclS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPFPvmEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPhlS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKal@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKhl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2El@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPalS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPclS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPFPvmEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPhlS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKal@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKhl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_really_overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPclRlS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE18_M_really_overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwlRlS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwlw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreElj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwlw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEmm@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE14_M_really_syncEmm@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10reallocateEPvmm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_round_upEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE14_S_chunk_allocEmRi@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE17_S_freelist_indexEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE9_S_refillEm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EP15__locale_structPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale21_S_normalize_categoryEj@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet16_M_add_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_M_remove_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPNS_5facetE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPPNS_5facetEmb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1ERKS0_m@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPPNS_5facetEmb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2ERKS0_m@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale7classicEv@@GLIBCPP_3.2
+FUNC:_ZNSt6localeaSERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base13_M_grow_wordsEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17_M_call_callbacksENS_5eventE@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base20_M_dispose_callbacksEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init13_S_ios_createEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init14_S_ios_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC1ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC2ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEixEm@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCPP_3.2
+FUNC:_Znwm@@GLIBCPP_3.2
+FUNC:_ZnwmRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZSt10unexpectedv@@GLIBCPP_3.2
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIlEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vImEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIxEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIyEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt16__throw_bad_castv@@GLIBCPP_3.2
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCPP_3.2
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCPP_3.2
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__uninitialized_copy_auxIN9__gnu_cxx17__normal_iteratorIPKSsSt6vectorISsSaISsEEEEPSsET0_T_SA_S9_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt26__uninitialized_fill_n_auxIPSsmSsET_S1_T0_RKT1_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9terminatev@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZThn16_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt9strstreamD1Ev@@GLIBCPP_3.2
+OBJECT:0:CXXABI_1.2
+OBJECT:0:GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:112:_ZNSt11__timepunctIcE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:112:_ZNSt11__timepunctIwE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSd@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt9strstream@@GLIBCPP_3.2
+OBJECT:128:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8ios_base@@GLIBCPP_3.2
+OBJECT:136:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:136:_ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9exception@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9strstream@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9time_base@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9type_info@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIwE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10istrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10money_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10__num_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIwE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9codecvt_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9codecvt_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZTIa@@GLIBCPP_3.2
+OBJECT:16:_ZTIb@@GLIBCPP_3.2
+OBJECT:16:_ZTIc@@GLIBCPP_3.2
+OBJECT:16:_ZTId@@GLIBCPP_3.2
+OBJECT:16:_ZTIe@@GLIBCPP_3.2
+OBJECT:16:_ZTIf@@GLIBCPP_3.2
+OBJECT:16:_ZTIh@@GLIBCPP_3.2
+OBJECT:16:_ZTIi@@GLIBCPP_3.2
+OBJECT:16:_ZTIj@@GLIBCPP_3.2
+OBJECT:16:_ZTIl@@GLIBCPP_3.2
+OBJECT:16:_ZTIm@@GLIBCPP_3.2
+OBJECT:16:_ZTINSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:16:_ZTIs@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10ctype_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10money_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10__num_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt12codecvt_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt13messages_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt8ios_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9exception@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9time_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9type_info@@GLIBCPP_3.2
+OBJECT:16:_ZTIt@@GLIBCPP_3.2
+OBJECT:16:_ZTIv@@GLIBCPP_3.2
+OBJECT:16:_ZTIw@@GLIBCPP_3.2
+OBJECT:16:_ZTIx@@GLIBCPP_3.2
+OBJECT:16:_ZTIy@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11logic_error@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11range_error@@GLIBCPP_3.2
+OBJECT:16:_ZTTSi@@GLIBCPP_3.2
+OBJECT:16:_ZTTSo@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12domain_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12length_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13messages_base@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCPP_3.2
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIwLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIwLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt8ios_base4Init20_S_synced_with_stdioE@@GLIBCPP_3.2
+OBJECT:1:_ZSt7nothrow@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCPP_3.2
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:224:_ZSt9facet_vec@@GLIBCPP_3.2
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:23:_ZNSt10__num_base8_S_atomsE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:248:_ZSt7buf_cin@@GLIBCPP_3.2
+OBJECT:248:_ZSt8buf_cerr@@GLIBCPP_3.2
+OBJECT:248:_ZSt8buf_cout@@GLIBCPP_3.2
+OBJECT:24:_ZNSt6locale5_Impl13_S_id_collateE@@GLIBCPP_3.2
+OBJECT:24:_ZNSt6locale5_Impl14_S_id_messagesE@@GLIBCPP_3.2
+OBJECT:24:_ZSt7ctype_w@@GLIBCPP_3.2
+OBJECT:24:_ZSt9collate_c@@GLIBCPP_3.2
+OBJECT:24:_ZSt9collate_w@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTINSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10bad_typeid@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10istrstream@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10ostrstream@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11logic_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11range_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12domain_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12length_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12out_of_range@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12strstreambuf@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13bad_exception@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13runtime_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14overflow_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15underflow_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt16invalid_argument@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7collateIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7collateIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8bad_cast@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9bad_alloc@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9strstream@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_bit_count@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_first_one@@GLIBCPP_3.2
+OBJECT:256:_ZSt8buf_wcin@@GLIBCPP_3.2
+OBJECT:256:_ZSt9buf_wcerr@@GLIBCPP_3.2
+OBJECT:256:_ZSt9buf_wcout@@GLIBCPP_3.2
+OBJECT:272:_ZSt4cerr@@GLIBCPP_3.2
+OBJECT:272:_ZSt4clog@@GLIBCPP_3.2
+OBJECT:272:_ZSt4cout@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wcerr@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wclog@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wcout@@GLIBCPP_3.2
+OBJECT:280:_ZSt3cin@@GLIBCPP_3.2
+OBJECT:280:_ZSt4wcin@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5lowerE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5printE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5punctE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5spaceE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5upperE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base6xdigitE@@GLIBCPP_3.2
+OBJECT:2:_ZTSa@@GLIBCPP_3.2
+OBJECT:2:_ZTSb@@GLIBCPP_3.2
+OBJECT:2:_ZTSc@@GLIBCPP_3.2
+OBJECT:2:_ZTSd@@GLIBCPP_3.2
+OBJECT:2:_ZTSe@@GLIBCPP_3.2
+OBJECT:2:_ZTSf@@GLIBCPP_3.2
+OBJECT:2:_ZTSh@@GLIBCPP_3.2
+OBJECT:2:_ZTSi@@GLIBCPP_3.2
+OBJECT:2:_ZTSj@@GLIBCPP_3.2
+OBJECT:2:_ZTSl@@GLIBCPP_3.2
+OBJECT:2:_ZTSm@@GLIBCPP_3.2
+OBJECT:2:_ZTSs@@GLIBCPP_3.2
+OBJECT:2:_ZTSt@@GLIBCPP_3.2
+OBJECT:2:_ZTSv@@GLIBCPP_3.2
+OBJECT:2:_ZTSw@@GLIBCPP_3.2
+OBJECT:2:_ZTSx@@GLIBCPP_3.2
+OBJECT:2:_ZTSy@@GLIBCPP_3.2
+OBJECT:32:_ZNSbIwSt11char_traitsIwESaIwEE20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:32:_ZNSs20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:32:_ZSt10messages_c@@GLIBCPP_3.2
+OBJECT:32:_ZSt10messages_w@@GLIBCPP_3.2
+OBJECT:32:_ZTIPa@@GLIBCPP_3.2
+OBJECT:32:_ZTIPb@@GLIBCPP_3.2
+OBJECT:32:_ZTIPc@@GLIBCPP_3.2
+OBJECT:32:_ZTIPd@@GLIBCPP_3.2
+OBJECT:32:_ZTIPe@@GLIBCPP_3.2
+OBJECT:32:_ZTIPf@@GLIBCPP_3.2
+OBJECT:32:_ZTIPh@@GLIBCPP_3.2
+OBJECT:32:_ZTIPi@@GLIBCPP_3.2
+OBJECT:32:_ZTIPj@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKa@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKb@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKc@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKd@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKe@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKf@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKh@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKi@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKj@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKl@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKm@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKs@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKt@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKv@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKw@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKx@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKy@@GLIBCPP_3.2
+OBJECT:32:_ZTIPl@@GLIBCPP_3.2
+OBJECT:32:_ZTIPm@@GLIBCPP_3.2
+OBJECT:32:_ZTIPs@@GLIBCPP_3.2
+OBJECT:32:_ZTIPt@@GLIBCPP_3.2
+OBJECT:32:_ZTIPv@@GLIBCPP_3.2
+OBJECT:32:_ZTIPw@@GLIBCPP_3.2
+OBJECT:32:_ZTIPx@@GLIBCPP_3.2
+OBJECT:32:_ZTIPy@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt10istrstream@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt10ostrstream@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTVNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:3:_ZTSPa@@GLIBCPP_3.2
+OBJECT:3:_ZTSPb@@GLIBCPP_3.2
+OBJECT:3:_ZTSPc@@GLIBCPP_3.2
+OBJECT:3:_ZTSPd@@GLIBCPP_3.2
+OBJECT:3:_ZTSPe@@GLIBCPP_3.2
+OBJECT:3:_ZTSPf@@GLIBCPP_3.2
+OBJECT:3:_ZTSPh@@GLIBCPP_3.2
+OBJECT:3:_ZTSPi@@GLIBCPP_3.2
+OBJECT:3:_ZTSPj@@GLIBCPP_3.2
+OBJECT:3:_ZTSPl@@GLIBCPP_3.2
+OBJECT:3:_ZTSPm@@GLIBCPP_3.2
+OBJECT:3:_ZTSPs@@GLIBCPP_3.2
+OBJECT:3:_ZTSPt@@GLIBCPP_3.2
+OBJECT:3:_ZTSPv@@GLIBCPP_3.2
+OBJECT:3:_ZTSPw@@GLIBCPP_3.2
+OBJECT:3:_ZTSPx@@GLIBCPP_3.2
+OBJECT:3:_ZTSPy@@GLIBCPP_3.2
+OBJECT:3:_ZTSSd@@GLIBCPP_3.2
+OBJECT:3:_ZTSSi@@GLIBCPP_3.2
+OBJECT:3:_ZTSSo@@GLIBCPP_3.2
+OBJECT:408:_ZSt11timepunct_c@@GLIBCPP_3.2
+OBJECT:408:_ZSt11timepunct_w@@GLIBCPP_3.2
+OBJECT:40:_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockE@@GLIBCPP_3.2
+OBJECT:40:_ZNSt6locale5_Impl11_S_id_ctypeE@@GLIBCPP_3.2
+OBJECT:40:_ZSt10numpunct_c@@GLIBCPP_3.2
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt11logic_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt11range_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt12domain_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt12length_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt12out_of_range@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt13bad_exception@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt13runtime_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt14overflow_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15underflow_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8bad_cast@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt9exception@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:48:_ZSt10numpunct_w@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale2id12_S_highwaterE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale3allE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base18_S_local_word_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4Init16_S_ios_base_initE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKa@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKb@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKc@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKd@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKe@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKf@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKh@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKi@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKj@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKl@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKm@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKs@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKt@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKv@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKw@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKx@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKy@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl10_S_id_timeE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl13_S_id_numericE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl19_S_facet_categoriesE@@GLIBCPP_3.2
+OBJECT:56:_ZSt7ctype_c@@GLIBCPP_3.2
+OBJECT:56:_ZTISi@@GLIBCPP_3.2
+OBJECT:56:_ZTISo@@GLIBCPP_3.2
+OBJECT:56:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTTSd@@GLIBCPP_3.2
+OBJECT:56:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt7collateIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt7collateIwE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt8messagesIwE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt9type_info@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZNSt6locale5_Impl14_S_id_monetaryE@@GLIBCPP_3.2
+OBJECT:72:_ZSt13c_locale_impl@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_fc@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_fw@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_tc@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_tw@@GLIBCPP_3.2
+OBJECT:72:_ZTISd@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8messagesIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8messagesIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTVN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:72:_ZTVN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:72:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt9strstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSi@@GLIBCPP_3.2
+OBJECT:80:_ZTVSo@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt10istrstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt10ostrstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:88:_ZTVN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:88:_ZTVN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:88:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4nposE@@GLIBCPP_3.2
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSs4nposE@@GLIBCPP_3.2
+OBJECT:8:_ZNSs4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIwLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIwLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt11__timepunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_end_freeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_heap_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE13_S_start_freeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIcE10table_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale10_S_classicE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale17_S_num_categoriesE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale5facet11_S_c_localeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale9_S_globalE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7collateIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8messagesIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8numpunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZSt8c_locale@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
diff --git a/libstdc++-v3/config/abi/extract_symvers b/libstdc++-v3/config/abi/extract_symvers
new file mode 100755
index 00000000000..e7b6645900b
--- /dev/null
+++ b/libstdc++-v3/config/abi/extract_symvers
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+# Copyright (C) 2002 Free Software Foundation, Inc.
+#
+# This file is part of the GNU ISO C++ Library. This library is free
+# software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this library; see the file COPYING. If not, write to the Free
+# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction. Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file 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.
+
+
+if test ${#} -lt 2 || test $1 = '--help'; then
+ echo "Usage: extract_symvers shared_lib output_file" 1>&2
+ exit 1
+fi
+
+lib=$1
+output=$2
+
+# GNU binutils, somewhere after version 2.11.2, requires -W/--wide to avoid
+# default line truncation. -W is not supported and truncation did not occur
+# by default before that point.
+readelf="readelf --symbols"
+if readelf --help | grep -- --wide > /dev/null; then
+ readelf="$readelf --wide"
+fi
+
+# This avoids weird sorting problems later.
+export LC_ALL=C
+
+tmp=extract.$$
+
+${readelf} ${lib} | sed '/\.dynsym/,/^$/p;d' | egrep -v ' (LOCAL|UND) ' |\
+awk '{ if ($4 == "FUNC" || $4 == "NOTYPE")
+ printf "%s:%s\n", $4, $8;
+ else if ($4 == "OBJECT")
+ printf "%s:%s:%s\n", $4, $3, $8;
+ }' | sort | uniq > $tmp 2>&1
+# else printf "Huh? What is %s?\n", $8;
+
+
+# I think we'll be doing some more with this file, but for now, dump.
+mv $tmp $output
+
+exit 0
diff --git a/libstdc++-v3/config/abi/i386-unknown-freebsd4/baseline_symbols.txt b/libstdc++-v3/config/abi/i386-unknown-freebsd4/baseline_symbols.txt
new file mode 100644
index 00000000000..c5b8fa0a739
--- /dev/null
+++ b/libstdc++-v3/config/abi/i386-unknown-freebsd4/baseline_symbols.txt
@@ -0,0 +1,2008 @@
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.2
+FUNC:_ZNKSaIcE7addressERKc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE7addressERc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERKw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSi6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofERKSsj@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEcj@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofERKSsj@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEcj@@GLIBCPP_3.2
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofERKSsj@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEcj@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofERKSsj@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEcj@@GLIBCPP_3.2
+FUNC:_ZNKSs2atEj@@GLIBCPP_3.2
+FUNC:_ZNKSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4copyEPcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs4findERKSsj@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEcj@@GLIBCPP_3.2
+FUNC:_ZNKSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcjj@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindERKSsj@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEcj@@GLIBCPP_3.2
+FUNC:_ZNKSs6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6substrEjj@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_foldEjj@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEjjPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEjjPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEjjRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEjjRKSsjj@@GLIBCPP_3.2
+FUNC:_ZNKSs8_M_checkEj@@GLIBCPP_3.2
+FUNC:_ZNKSs8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSsixEj@@GLIBCPP_3.2
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcjPKcPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_ampmEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_scan_isEmPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE11do_scan_notEmPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEPKcS2_Pm@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEmc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt6locale4nameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERKS0_PKcS5_j@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcj@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_widen_intES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIlEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intImEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIxEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIyEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_widen_floatES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertES3_RSt8ios_basecPKci@@GLIBCPP_3.2
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numERS3_S5_RiiijRKSt5ctypeIcERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameERS3_S5_RiPPKcjRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8valarrayIjE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9exception4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE10deallocateEPcj@@GLIBCPP_3.2
+FUNC:_ZNSaIcE7destroyEPc@@GLIBCPP_3.2
+FUNC:_ZNSaIcE8allocateEjPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE9constructEPcRKc@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwE10deallocateEPwj@@GLIBCPP_3.2
+FUNC:_ZNSaIwE7destroyEPw@@GLIBCPP_3.2
+FUNC:_ZNSaIwE8allocateEjPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIwE9constructEPwRKw@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPci@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPcic@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERc@@GLIBCPP_3.2
+FUNC:_ZNSi3getEv@@GLIBCPP_3.2
+FUNC:_ZNSi4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSi4readEPci@@GLIBCPP_3.2
+FUNC:_ZNSi4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSi5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSi5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSi6ignoreEii@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPci@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPcic@@GLIBCPP_3.2
+FUNC:_ZNSi7putbackEc@@GLIBCPP_3.2
+FUNC:_ZNSi8readsomeEPci@@GLIBCPP_3.2
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSirsERPv@@GLIBCPP_3.2
+FUNC:_ZNSirsERb@@GLIBCPP_3.2
+FUNC:_ZNSirsERd@@GLIBCPP_3.2
+FUNC:_ZNSirsERe@@GLIBCPP_3.2
+FUNC:_ZNSirsERf@@GLIBCPP_3.2
+FUNC:_ZNSirsERi@@GLIBCPP_3.2
+FUNC:_ZNSirsERj@@GLIBCPP_3.2
+FUNC:_ZNSirsERl@@GLIBCPP_3.2
+FUNC:_ZNSirsERm@@GLIBCPP_3.2
+FUNC:_ZNSirsERs@@GLIBCPP_3.2
+FUNC:_ZNSirsERt@@GLIBCPP_3.2
+FUNC:_ZNSirsERx@@GLIBCPP_3.2
+FUNC:_ZNSirsERy@@GLIBCPP_3.2
+FUNC:_ZNSo3putEc@@GLIBCPP_3.2
+FUNC:_ZNSo5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSo5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSo5writeEPKci@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSo6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSolsEb@@GLIBCPP_3.2
+FUNC:_ZNSolsEd@@GLIBCPP_3.2
+FUNC:_ZNSolsEe@@GLIBCPP_3.2
+FUNC:_ZNSolsEf@@GLIBCPP_3.2
+FUNC:_ZNSolsEi@@GLIBCPP_3.2
+FUNC:_ZNSolsEj@@GLIBCPP_3.2
+FUNC:_ZNSolsEl@@GLIBCPP_3.2
+FUNC:_ZNSolsEm@@GLIBCPP_3.2
+FUNC:_ZNSolsEs@@GLIBCPP_3.2
+FUNC:_ZNSolsEt@@GLIBCPP_3.2
+FUNC:_ZNSolsEx@@GLIBCPP_3.2
+FUNC:_ZNSolsEy@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_constructEjcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs2atEj@@GLIBCPP_3.2
+FUNC:_ZNSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEj@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep9_S_createEjRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_RepixEj@@GLIBCPP_3.2
+FUNC:_ZNSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSs4swapERSs@@GLIBCPP_3.2
+FUNC:_ZNSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSs5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEjj@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKcj@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSsjj@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEjc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKcj@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSsjj@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEjc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEjPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEjPKcj@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEjRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEjRKSsjj@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEjjc@@GLIBCPP_3.2
+FUNC:_ZNSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEj@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEjc@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_dataEPc@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEjjPKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEjjPKcj@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEjjRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEjjRKSsjj@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEjjjc@@GLIBCPP_3.2
+FUNC:_ZNSs7reserveEj@@GLIBCPP_3.2
+FUNC:_ZNSs9_M_mutateEjjj@@GLIBCPP_3.2
+FUNC:_ZNSs9push_backEc@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcjRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsjj@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsjjRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EjcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcjRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsjj@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsjjRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EjcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsaSEPKc@@GLIBCPP_3.2
+FUNC:_ZNSsaSERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsaSEc@@GLIBCPP_3.2
+FUNC:_ZNSsixEj@@GLIBCPP_3.2
+FUNC:_ZNSspLEPKc@@GLIBCPP_3.2
+FUNC:_ZNSspLERKSs@@GLIBCPP_3.2
+FUNC:_ZNSspLEc@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base13_S_format_intERKSt8ios_basePccc@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePcci@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKci@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPci@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKci@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPci@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEPiPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEPiPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEPi@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE10sys_ungetcEi@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE12_M_open_modeESt13_Ios_OpenmodeRiS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPci@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKci@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekposElSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_getcEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP7__sFILESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmodeb@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC1EPP13pthread_mutex@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC2EPP13pthread_mutex@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6setbufEPci@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_allocEj@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_i@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPFPvjEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKai@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKci@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKhi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPaiS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPciS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPhiS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1Ei@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPFPvjEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKai@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKci@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKhi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPaiS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPciS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPhiS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2Ei@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_really_overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPciRiS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEjj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvj@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10reallocateEPvjj@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_round_upEj@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE14_S_chunk_allocEjRi@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE17_S_freelist_indexEj@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEj@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE9_S_refillEj@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EPKmbj@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EPiPKmbj@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EPKmbj@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EPiPKmbj@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale21_S_normalize_categoryEj@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPNS_5facetE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPPNS_5facetEjb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1ERKS0_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPPNS_5facetEjb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2ERKS0_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet16_M_add_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERPi@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERPiPKcS1_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_M_remove_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERPi@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale7classicEv@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeaSERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1EPij@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2EPij@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base13_M_grow_wordsEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17_M_call_callbacksENS_5eventE@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base20_M_dispose_callbacksEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init13_S_ios_createEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init14_S_ios_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2EPiPKcj@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEPi@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1EPij@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2EPij@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjEC1ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjEC2ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayIjEixEj@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCPP_3.2
+FUNC:_ZSt10unexpectedv@@GLIBCPP_3.2
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIlEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vImEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIxEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIyEvPKcRT_RSt12_Ios_IostateRKPii@@GLIBCPP_3.2
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt16__throw_bad_castv@@GLIBCPP_3.2
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCPP_3.2
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCPP_3.2
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__uninitialized_copy_auxIN9__gnu_cxx17__normal_iteratorIPKSsSt6vectorISsSaISsEEEEPSsET0_T_SA_S9_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt26__uninitialized_fill_n_auxIPSsjSsET_S1_T0_RKT1_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9terminatev@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZThn8_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn8_NSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n12_NSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZdaPv@@GLIBCPP_3.2
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZdlPv@@GLIBCPP_3.2
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_Znaj@@GLIBCPP_3.2
+FUNC:_ZnajRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_Znwj@@GLIBCPP_3.2
+FUNC:_ZnwjRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:__cxa_allocate_exception@@CXXABI_1.2
+FUNC:__cxa_bad_cast@@CXXABI_1.2
+FUNC:__cxa_bad_typeid@@CXXABI_1.2
+FUNC:__cxa_begin_catch@@CXXABI_1.2
+FUNC:__cxa_call_unexpected@@CXXABI_1.2
+FUNC:__cxa_current_exception_type@@CXXABI_1.2
+FUNC:__cxa_demangle@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_clear@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_delete@@CXXABI_1.2
+FUNC:__cxa_dyn_string_eq@@CXXABI_1.2
+FUNC:__cxa_dyn_string_init@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_new@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_release@@CXXABI_1.2
+FUNC:__cxa_dyn_string_resize@@CXXABI_1.2
+FUNC:__cxa_dyn_string_substring@@CXXABI_1.2
+FUNC:__cxa_end_catch@@CXXABI_1.2
+FUNC:__cxa_free_exception@@CXXABI_1.2
+FUNC:__cxa_get_globals@@CXXABI_1.2
+FUNC:__cxa_get_globals_fast@@CXXABI_1.2
+FUNC:__cxa_pure_virtual@@CXXABI_1.2
+FUNC:__cxa_rethrow@@CXXABI_1.2
+FUNC:__cxa_throw@@CXXABI_1.2
+FUNC:__cxa_vec_cctor@@CXXABI_1.2
+FUNC:__cxa_vec_cleanup@@CXXABI_1.2
+FUNC:__cxa_vec_ctor@@CXXABI_1.2
+FUNC:__cxa_vec_delete2@@CXXABI_1.2
+FUNC:__cxa_vec_delete3@@CXXABI_1.2
+FUNC:__cxa_vec_delete@@CXXABI_1.2
+FUNC:__cxa_vec_dtor@@CXXABI_1.2
+FUNC:__cxa_vec_new2@@CXXABI_1.2
+FUNC:__cxa_vec_new3@@CXXABI_1.2
+FUNC:__cxa_vec_new@@CXXABI_1.2
+FUNC:__dynamic_cast@@CXXABI_1.2
+FUNC:__gxx_personality_v0@@CXXABI_1.2
+OBJECT:0:CXXABI_1.2
+OBJECT:0:GLIBCPP_3.2
+OBJECT:12:_ZNSt6locale5_Impl11_S_id_ctypeE@@GLIBCPP_3.2
+OBJECT:12:_ZSt9collate_c@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:12:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:12:_ZTINSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt10bad_typeid@@GLIBCPP_3.2
+OBJECT:12:_ZTISt10istrstream@@GLIBCPP_3.2
+OBJECT:12:_ZTISt10ostrstream@@GLIBCPP_3.2
+OBJECT:12:_ZTISt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt11logic_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt11range_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt12domain_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt12length_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt12out_of_range@@GLIBCPP_3.2
+OBJECT:12:_ZTISt12strstreambuf@@GLIBCPP_3.2
+OBJECT:12:_ZTISt13bad_exception@@GLIBCPP_3.2
+OBJECT:12:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt13runtime_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt14overflow_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt15underflow_error@@GLIBCPP_3.2
+OBJECT:12:_ZTISt16invalid_argument@@GLIBCPP_3.2
+OBJECT:12:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt7collateIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt8bad_cast@@GLIBCPP_3.2
+OBJECT:12:_ZTISt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt9bad_alloc@@GLIBCPP_3.2
+OBJECT:12:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:12:_ZTISt9strstream@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8ios_base@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9exception@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9strstream@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9time_base@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9type_info@@GLIBCPP_3.2
+OBJECT:140:_ZSt4cerr@@GLIBCPP_3.2
+OBJECT:140:_ZSt4clog@@GLIBCPP_3.2
+OBJECT:140:_ZSt4cout@@GLIBCPP_3.2
+OBJECT:144:_ZSt3cin@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10__num_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10istrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10money_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:16:_ZNSs20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:16:_ZNSt6locale5_Impl10_S_id_timeE@@GLIBCPP_3.2
+OBJECT:16:_ZNSt6locale5_Impl13_S_id_numericE@@GLIBCPP_3.2
+OBJECT:16:_ZSt10messages_c@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKa@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKb@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKc@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKd@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKe@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKf@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKh@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKi@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKj@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKl@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKm@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKs@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKt@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKv@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKw@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKx@@GLIBCPP_3.2
+OBJECT:16:_ZTIPKy@@GLIBCPP_3.2
+OBJECT:16:_ZTIPa@@GLIBCPP_3.2
+OBJECT:16:_ZTIPb@@GLIBCPP_3.2
+OBJECT:16:_ZTIPc@@GLIBCPP_3.2
+OBJECT:16:_ZTIPd@@GLIBCPP_3.2
+OBJECT:16:_ZTIPe@@GLIBCPP_3.2
+OBJECT:16:_ZTIPf@@GLIBCPP_3.2
+OBJECT:16:_ZTIPh@@GLIBCPP_3.2
+OBJECT:16:_ZTIPi@@GLIBCPP_3.2
+OBJECT:16:_ZTIPj@@GLIBCPP_3.2
+OBJECT:16:_ZTIPl@@GLIBCPP_3.2
+OBJECT:16:_ZTIPm@@GLIBCPP_3.2
+OBJECT:16:_ZTIPs@@GLIBCPP_3.2
+OBJECT:16:_ZTIPt@@GLIBCPP_3.2
+OBJECT:16:_ZTIPv@@GLIBCPP_3.2
+OBJECT:16:_ZTIPw@@GLIBCPP_3.2
+OBJECT:16:_ZTIPx@@GLIBCPP_3.2
+OBJECT:16:_ZTIPy@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11logic_error@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11range_error@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt10istrstream@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt10ostrstream@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTVNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:16:_ZTVSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:16:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12domain_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12length_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13messages_base@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCPP_3.2
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt8ios_base4Init20_S_synced_with_stdioE@@GLIBCPP_3.2
+OBJECT:1:_ZSt7nothrow@@GLIBCPP_3.2
+OBJECT:204:_ZSt11timepunct_c@@GLIBCPP_3.2
+OBJECT:20:_ZNSt6locale5_Impl14_S_id_monetaryE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt11logic_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt11range_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt12domain_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt12length_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt12out_of_range@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt13bad_exception@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt13runtime_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt14overflow_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt15underflow_error@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt8bad_cast@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:20:_ZTVSt9exception@@GLIBCPP_3.2
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZNSt10__num_base8_S_atomsE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZSt10numpunct_c@@GLIBCPP_3.2
+OBJECT:24:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_bit_count@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_first_one@@GLIBCPP_3.2
+OBJECT:28:_ZNSt6locale5_Impl19_S_facet_categoriesE@@GLIBCPP_3.2
+OBJECT:28:_ZSt7ctype_c@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:28:_ZTTSd@@GLIBCPP_3.2
+OBJECT:28:_ZTVSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:28:_ZTVSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:28:_ZTVSt7collateIcE@@GLIBCPP_3.2
+OBJECT:28:_ZTVSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:2:_ZTSa@@GLIBCPP_3.2
+OBJECT:2:_ZTSb@@GLIBCPP_3.2
+OBJECT:2:_ZTSc@@GLIBCPP_3.2
+OBJECT:2:_ZTSd@@GLIBCPP_3.2
+OBJECT:2:_ZTSe@@GLIBCPP_3.2
+OBJECT:2:_ZTSf@@GLIBCPP_3.2
+OBJECT:2:_ZTSh@@GLIBCPP_3.2
+OBJECT:2:_ZTSi@@GLIBCPP_3.2
+OBJECT:2:_ZTSj@@GLIBCPP_3.2
+OBJECT:2:_ZTSl@@GLIBCPP_3.2
+OBJECT:2:_ZTSm@@GLIBCPP_3.2
+OBJECT:2:_ZTSs@@GLIBCPP_3.2
+OBJECT:2:_ZTSt@@GLIBCPP_3.2
+OBJECT:2:_ZTSv@@GLIBCPP_3.2
+OBJECT:2:_ZTSw@@GLIBCPP_3.2
+OBJECT:2:_ZTSx@@GLIBCPP_3.2
+OBJECT:2:_ZTSy@@GLIBCPP_3.2
+OBJECT:32:_ZTISi@@GLIBCPP_3.2
+OBJECT:32:_ZTISo@@GLIBCPP_3.2
+OBJECT:32:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTVN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:32:_ZTVN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:32:_ZTVN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:32:_ZTVN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt9type_info@@GLIBCPP_3.2
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:36:_ZSt13c_locale_impl@@GLIBCPP_3.2
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:36:_ZTVN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTVN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTVSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:36:_ZTVSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:3:_ZTSPa@@GLIBCPP_3.2
+OBJECT:3:_ZTSPb@@GLIBCPP_3.2
+OBJECT:3:_ZTSPc@@GLIBCPP_3.2
+OBJECT:3:_ZTSPd@@GLIBCPP_3.2
+OBJECT:3:_ZTSPe@@GLIBCPP_3.2
+OBJECT:3:_ZTSPf@@GLIBCPP_3.2
+OBJECT:3:_ZTSPh@@GLIBCPP_3.2
+OBJECT:3:_ZTSPi@@GLIBCPP_3.2
+OBJECT:3:_ZTSPj@@GLIBCPP_3.2
+OBJECT:3:_ZTSPl@@GLIBCPP_3.2
+OBJECT:3:_ZTSPm@@GLIBCPP_3.2
+OBJECT:3:_ZTSPs@@GLIBCPP_3.2
+OBJECT:3:_ZTSPt@@GLIBCPP_3.2
+OBJECT:3:_ZTSPv@@GLIBCPP_3.2
+OBJECT:3:_ZTSPw@@GLIBCPP_3.2
+OBJECT:3:_ZTSPx@@GLIBCPP_3.2
+OBJECT:3:_ZTSPy@@GLIBCPP_3.2
+OBJECT:3:_ZTSSd@@GLIBCPP_3.2
+OBJECT:3:_ZTSSi@@GLIBCPP_3.2
+OBJECT:3:_ZTSSo@@GLIBCPP_3.2
+OBJECT:40:_ZSt13moneypunct_fc@@GLIBCPP_3.2
+OBJECT:40:_ZSt13moneypunct_tc@@GLIBCPP_3.2
+OBJECT:40:_ZTISd@@GLIBCPP_3.2
+OBJECT:40:_ZTISt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt8messagesIcE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTTSt9strstream@@GLIBCPP_3.2
+OBJECT:40:_ZTVSi@@GLIBCPP_3.2
+OBJECT:40:_ZTVSo@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt10istrstream@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt10ostrstream@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:44:_ZTVN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:44:_ZTVN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:44:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:44:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:44:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:44:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:480:_ZSt7buf_cin@@GLIBCPP_3.2
+OBJECT:480:_ZSt8buf_cerr@@GLIBCPP_3.2
+OBJECT:480:_ZSt8buf_cout@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:4:_ZNSs4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSs4nposE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5alnumE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5alphaE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5cntrlE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5digitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5graphE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5lowerE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5printE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5punctE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5spaceE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base5upperE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10ctype_base6xdigitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_end_freeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_heap_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt24__default_alloc_templateILb1ELi0EE13_S_start_freeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt5ctypeIcE10table_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt5ctypeIcE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale10_S_classicE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale17_S_num_categoriesE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale2id12_S_highwaterE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale3allE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale5facet11_S_c_localeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale9_S_globalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base18_S_local_word_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4Init16_S_ios_base_initE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:4:_ZSt8c_locale@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKa@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKb@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKc@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKd@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKe@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKf@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKh@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKi@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKj@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKl@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKm@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKs@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKt@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKv@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKw@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKx@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKy@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:52:_ZTVSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:52:_ZTVSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:52:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:52:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt11__timepunctIcE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:56:_ZSt9facet_vec@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTVSd@@GLIBCPP_3.2
+OBJECT:60:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:60:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:60:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTVSt9strstream@@GLIBCPP_3.2
+OBJECT:64:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:68:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale5_Impl13_S_id_collateE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale5_Impl14_S_id_messagesE@@GLIBCPP_3.2
+OBJECT:8:_ZSt10time_get_c@@GLIBCPP_3.2
+OBJECT:8:_ZSt10time_put_c@@GLIBCPP_3.2
+OBJECT:8:_ZSt11money_get_c@@GLIBCPP_3.2
+OBJECT:8:_ZSt11money_put_c@@GLIBCPP_3.2
+OBJECT:8:_ZSt9codecvt_c@@GLIBCPP_3.2
+OBJECT:8:_ZSt9num_get_c@@GLIBCPP_3.2
+OBJECT:8:_ZSt9num_put_c@@GLIBCPP_3.2
+OBJECT:8:_ZTINSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:8:_ZTISt10__num_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt10ctype_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt10money_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt12codecvt_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt13messages_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:8:_ZTISt8ios_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt9exception@@GLIBCPP_3.2
+OBJECT:8:_ZTISt9time_base@@GLIBCPP_3.2
+OBJECT:8:_ZTISt9type_info@@GLIBCPP_3.2
+OBJECT:8:_ZTIa@@GLIBCPP_3.2
+OBJECT:8:_ZTIb@@GLIBCPP_3.2
+OBJECT:8:_ZTIc@@GLIBCPP_3.2
+OBJECT:8:_ZTId@@GLIBCPP_3.2
+OBJECT:8:_ZTIe@@GLIBCPP_3.2
+OBJECT:8:_ZTIf@@GLIBCPP_3.2
+OBJECT:8:_ZTIh@@GLIBCPP_3.2
+OBJECT:8:_ZTIi@@GLIBCPP_3.2
+OBJECT:8:_ZTIj@@GLIBCPP_3.2
+OBJECT:8:_ZTIl@@GLIBCPP_3.2
+OBJECT:8:_ZTIm@@GLIBCPP_3.2
+OBJECT:8:_ZTIs@@GLIBCPP_3.2
+OBJECT:8:_ZTIt@@GLIBCPP_3.2
+OBJECT:8:_ZTIv@@GLIBCPP_3.2
+OBJECT:8:_ZTIw@@GLIBCPP_3.2
+OBJECT:8:_ZTIx@@GLIBCPP_3.2
+OBJECT:8:_ZTIy@@GLIBCPP_3.2
+OBJECT:8:_ZTTSi@@GLIBCPP_3.2
+OBJECT:8:_ZTTSo@@GLIBCPP_3.2
diff --git a/libstdc++-v3/config/abi/ia64-unknown-linux-gnu/baseline_symbols.txt b/libstdc++-v3/config/abi/ia64-unknown-linux-gnu/baseline_symbols.txt
new file mode 100644
index 00000000000..eb729d3a2a0
--- /dev/null
+++ b/libstdc++-v3/config/abi/ia64-unknown-linux-gnu/baseline_symbols.txt
@@ -0,0 +1,3031 @@
+FUNC:__cxa_allocate_exception@@CXXABI_1.2
+FUNC:__cxa_bad_cast@@CXXABI_1.2
+FUNC:__cxa_bad_typeid@@CXXABI_1.2
+FUNC:__cxa_begin_catch@@CXXABI_1.2
+FUNC:__cxa_call_unexpected@@CXXABI_1.2
+FUNC:__cxa_current_exception_type@@CXXABI_1.2
+FUNC:__cxa_demangle@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append@@CXXABI_1.2
+FUNC:__cxa_dyn_string_clear@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy@@CXXABI_1.2
+FUNC:__cxa_dyn_string_delete@@CXXABI_1.2
+FUNC:__cxa_dyn_string_eq@@CXXABI_1.2
+FUNC:__cxa_dyn_string_init@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert@@CXXABI_1.2
+FUNC:__cxa_dyn_string_new@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend@@CXXABI_1.2
+FUNC:__cxa_dyn_string_release@@CXXABI_1.2
+FUNC:__cxa_dyn_string_resize@@CXXABI_1.2
+FUNC:__cxa_dyn_string_substring@@CXXABI_1.2
+FUNC:__cxa_end_catch@@CXXABI_1.2
+FUNC:__cxa_free_exception@@CXXABI_1.2
+FUNC:__cxa_get_globals@@CXXABI_1.2
+FUNC:__cxa_get_globals_fast@@CXXABI_1.2
+FUNC:__cxa_pure_virtual@@CXXABI_1.2
+FUNC:__cxa_rethrow@@CXXABI_1.2
+FUNC:__cxa_throw@@CXXABI_1.2
+FUNC:__cxa_vec_cctor@@CXXABI_1.2
+FUNC:__cxa_vec_cleanup@@CXXABI_1.2
+FUNC:__cxa_vec_ctor@@CXXABI_1.2
+FUNC:__cxa_vec_delete2@@CXXABI_1.2
+FUNC:__cxa_vec_delete3@@CXXABI_1.2
+FUNC:__cxa_vec_delete@@CXXABI_1.2
+FUNC:__cxa_vec_dtor@@CXXABI_1.2
+FUNC:__cxa_vec_new2@@CXXABI_1.2
+FUNC:__cxa_vec_new3@@CXXABI_1.2
+FUNC:__cxa_vec_new@@CXXABI_1.2
+FUNC:__dynamic_cast@@CXXABI_1.2
+FUNC:__gxx_personality_v0@@CXXABI_1.2
+FUNC:_ZdaPv@@GLIBCPP_3.2
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZdlPv@@GLIBCPP_3.2
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.2
+FUNC:_Znam@@GLIBCPP_3.2
+FUNC:_ZnamRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE7addressERc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE7addressERKc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERKw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_foldEmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCPP_3.2
+FUNC:_ZNKSi6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs2atEm@@GLIBCPP_3.2
+FUNC:_ZNKSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4copyEPcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6substrEmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_foldEmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8_M_checkEm@@GLIBCPP_3.2
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSsixEm@@GLIBCPP_3.2
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_ampmEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE7_M_ampmEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE7_M_daysEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE9_M_monthsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_scan_isEtPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE11do_scan_notEtPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEPKcS2_Pt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEtc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEPwPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_toupperEPwPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE5do_isEPKwS2_Pt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE5do_isEtw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCPP_3.2
+FUNC:_ZNKSt6locale4nameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERKS0_PKcS5_m@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERKS0_PKcS5_m@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE10_M_compareEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE12do_transformEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE12_M_transformEPwPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE4hashEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE7compareEPKwS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE7do_hashEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE9transformEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_widen_intES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIlEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intImEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIxEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIyEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_widen_floatES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertES3_RSt8ios_basecPKci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_widen_intES3_RSt8ios_basewPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIlEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intImEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIxEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIyEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_widen_floatES3_RSt8ios_basewPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE16_M_convert_floatIdEES3_S3_RSt8ios_basewcT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE16_M_convert_floatIeEES3_S3_RSt8ios_basewcT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertES3_RSt8ios_basewPKwi@@GLIBCPP_3.2
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numERS3_S5_RiiimRKSt5ctypeIcERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameERS3_S5_RiPPKcmRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numERS3_S5_RiiimRKSt5ctypeIwERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameERS3_S5_RiPPKwmRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8valarrayImE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9exception4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE10deallocateEPcm@@GLIBCPP_3.2
+FUNC:_ZNSaIcE7destroyEPc@@GLIBCPP_3.2
+FUNC:_ZNSaIcE8allocateEmPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE9constructEPcRKc@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwE10deallocateEPwm@@GLIBCPP_3.2
+FUNC:_ZNSaIwE7destroyEPw@@GLIBCPP_3.2
+FUNC:_ZNSaIwE8allocateEmPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIwE9constructEPwRKw@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKwS2_EEEERS2_NS5_IPwS2_EESB_T_SC_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIN9__gnu_cxx17__normal_iteratorIPwS2_EEEERS2_S7_S7_T_S9_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIPKwEERS2_N9__gnu_cxx17__normal_iteratorIPwS2_EESA_T_SB_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIPwEERS2_N9__gnu_cxx17__normal_iteratorIS4_S2_EES8_T_S9_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKwS2_EEEERS2_NS5_IPwS2_EESB_T_SC_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPwS2_EEEERS2_S7_S7_T_S9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIPKwEERS2_N9__gnu_cxx17__normal_iteratorIPwS2_EESA_T_SB_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIPwEERS2_N9__gnu_cxx17__normal_iteratorIS4_S2_EES8_T_S9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_RepixEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPKwS2_EEEET_S9_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPKwS2_EEEET_S9_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCPP_3.2
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPclc@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi3getERc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSi3getEv@@GLIBCPP_3.2
+FUNC:_ZNSi4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSi4readEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSi5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSi5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSi6ignoreEli@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPclc@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi7putbackEc@@GLIBCPP_3.2
+FUNC:_ZNSi8readsomeEPcl@@GLIBCPP_3.2
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSirsERb@@GLIBCPP_3.2
+FUNC:_ZNSirsERd@@GLIBCPP_3.2
+FUNC:_ZNSirsERe@@GLIBCPP_3.2
+FUNC:_ZNSirsERf@@GLIBCPP_3.2
+FUNC:_ZNSirsERi@@GLIBCPP_3.2
+FUNC:_ZNSirsERj@@GLIBCPP_3.2
+FUNC:_ZNSirsERl@@GLIBCPP_3.2
+FUNC:_ZNSirsERm@@GLIBCPP_3.2
+FUNC:_ZNSirsERPv@@GLIBCPP_3.2
+FUNC:_ZNSirsERs@@GLIBCPP_3.2
+FUNC:_ZNSirsERt@@GLIBCPP_3.2
+FUNC:_ZNSirsERx@@GLIBCPP_3.2
+FUNC:_ZNSirsERy@@GLIBCPP_3.2
+FUNC:_ZNSo3putEc@@GLIBCPP_3.2
+FUNC:_ZNSo5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSo5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSo5writeEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSolsEb@@GLIBCPP_3.2
+FUNC:_ZNSolsEd@@GLIBCPP_3.2
+FUNC:_ZNSolsEe@@GLIBCPP_3.2
+FUNC:_ZNSolsEf@@GLIBCPP_3.2
+FUNC:_ZNSolsEi@@GLIBCPP_3.2
+FUNC:_ZNSolsEj@@GLIBCPP_3.2
+FUNC:_ZNSolsEl@@GLIBCPP_3.2
+FUNC:_ZNSolsEm@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSolsEs@@GLIBCPP_3.2
+FUNC:_ZNSolsEt@@GLIBCPP_3.2
+FUNC:_ZNSolsEx@@GLIBCPP_3.2
+FUNC:_ZNSolsEy@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_constructEmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_@@GLIBCPP_3.2
+FUNC:_ZNSs2atEm@@GLIBCPP_3.2
+FUNC:_ZNSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEm@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep9_S_createEmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_RepixEm@@GLIBCPP_3.2
+FUNC:_ZNSs4swapERSs@@GLIBCPP_3.2
+FUNC:_ZNSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSs5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEmm@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmmc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEm@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_dataEPc@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmmc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmPKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNSs7reserveEm@@GLIBCPP_3.2
+FUNC:_ZNSs9_M_mutateEmmm@@GLIBCPP_3.2
+FUNC:_ZNSs9push_backEc@@GLIBCPP_3.2
+FUNC:_ZNSsaSEc@@GLIBCPP_3.2
+FUNC:_ZNSsaSEPKc@@GLIBCPP_3.2
+FUNC:_ZNSsaSERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC1EmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsmmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsmmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsixEm@@GLIBCPP_3.2
+FUNC:_ZNSspLEc@@GLIBCPP_3.2
+FUNC:_ZNSspLEPKc@@GLIBCPP_3.2
+FUNC:_ZNSspLERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base13_S_format_intERKSt8ios_basePccc@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePccl@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE10sys_ungetcEi@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE12_M_open_modeESt13_Ios_OpenmodeRiS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekposElSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_getcEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmodeb@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_allocEm@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_l@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1El@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPalS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPclS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPFPvmEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPhlS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKal@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKhl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2El@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPalS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPclS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPFPvmEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPhlS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKal@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKhl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_really_overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPclRlS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE18_M_really_overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwlRlS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwlw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreElj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwlw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEmm@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE14_M_really_syncEmm@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10reallocateEPvmm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_round_upEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE14_S_chunk_allocEmRi@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE17_S_freelist_indexEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE9_S_refillEm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EP15__locale_structPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale21_S_normalize_categoryEj@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet16_M_add_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_M_remove_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPNS_5facetE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPPNS_5facetEmb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1ERKS0_m@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPPNS_5facetEmb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2ERKS0_m@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale7classicEv@@GLIBCPP_3.2
+FUNC:_ZNSt6localeaSERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base13_M_grow_wordsEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17_M_call_callbacksENS_5eventE@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base20_M_dispose_callbacksEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init13_S_ios_createEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init14_S_ios_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC1ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC2ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEixEm@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCPP_3.2
+FUNC:_Znwm@@GLIBCPP_3.2
+FUNC:_ZnwmRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZSt10unexpectedv@@GLIBCPP_3.2
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIlEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vImEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIxEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIyEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt16__throw_bad_castv@@GLIBCPP_3.2
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCPP_3.2
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCPP_3.2
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__uninitialized_copy_auxIN9__gnu_cxx17__normal_iteratorIPKSsSt6vectorISsSaISsEEEEPSsET0_T_SA_S9_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt26__uninitialized_fill_n_auxIPSsmSsET_S1_T0_RKT1_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9terminatev@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZThn16_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt9strstreamD1Ev@@GLIBCPP_3.2
+OBJECT:0:CXXABI_1.2
+OBJECT:0:GLIBCPP_3.2
+OBJECT:112:_ZNSt11__timepunctIcE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:112:_ZNSt11__timepunctIwE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:112:_ZTVN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:112:_ZTVN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:112:_ZTVN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:112:_ZTVN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSi@@GLIBCPP_3.2
+OBJECT:112:_ZTVSo@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt10istrstream@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt10ostrstream@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:112:_ZTVSt9type_info@@GLIBCPP_3.2
+OBJECT:128:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8ios_base@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9exception@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9strstream@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9time_base@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9type_info@@GLIBCPP_3.2
+OBJECT:144:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:144:_ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:144:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:144:_ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIwE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10istrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10money_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10__num_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIwE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:160:_ZTVN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:160:_ZTVN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:160:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:160:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:160:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:160:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:160:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:160:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:160:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:168:_ZTVSd@@GLIBCPP_3.2
+OBJECT:168:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:168:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:168:_ZTVSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:168:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:168:_ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:168:_ZTVSt9strstream@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9codecvt_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9codecvt_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZTIa@@GLIBCPP_3.2
+OBJECT:16:_ZTIb@@GLIBCPP_3.2
+OBJECT:16:_ZTIc@@GLIBCPP_3.2
+OBJECT:16:_ZTId@@GLIBCPP_3.2
+OBJECT:16:_ZTIe@@GLIBCPP_3.2
+OBJECT:16:_ZTIf@@GLIBCPP_3.2
+OBJECT:16:_ZTIh@@GLIBCPP_3.2
+OBJECT:16:_ZTIi@@GLIBCPP_3.2
+OBJECT:16:_ZTIj@@GLIBCPP_3.2
+OBJECT:16:_ZTIl@@GLIBCPP_3.2
+OBJECT:16:_ZTIm@@GLIBCPP_3.2
+OBJECT:16:_ZTINSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:16:_ZTIs@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10ctype_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10money_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10__num_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt12codecvt_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt13messages_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt8ios_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9exception@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9time_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9type_info@@GLIBCPP_3.2
+OBJECT:16:_ZTIt@@GLIBCPP_3.2
+OBJECT:16:_ZTIv@@GLIBCPP_3.2
+OBJECT:16:_ZTIw@@GLIBCPP_3.2
+OBJECT:16:_ZTIx@@GLIBCPP_3.2
+OBJECT:16:_ZTIy@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11logic_error@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11range_error@@GLIBCPP_3.2
+OBJECT:16:_ZTTSi@@GLIBCPP_3.2
+OBJECT:16:_ZTTSo@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:176:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:176:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12domain_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12length_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13messages_base@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:192:_ZTVSt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCPP_3.2
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIwLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIwLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt8ios_base4Init20_S_synced_with_stdioE@@GLIBCPP_3.2
+OBJECT:1:_ZSt7nothrow@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCPP_3.2
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:224:_ZSt9facet_vec@@GLIBCPP_3.2
+OBJECT:224:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:224:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:23:_ZNSt10__num_base8_S_atomsE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:240:_ZTVN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:240:_ZTVN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:240:_ZTVSt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:248:_ZSt7buf_cin@@GLIBCPP_3.2
+OBJECT:248:_ZSt8buf_cerr@@GLIBCPP_3.2
+OBJECT:248:_ZSt8buf_cout@@GLIBCPP_3.2
+OBJECT:24:_ZNSt6locale5_Impl13_S_id_collateE@@GLIBCPP_3.2
+OBJECT:24:_ZNSt6locale5_Impl14_S_id_messagesE@@GLIBCPP_3.2
+OBJECT:24:_ZSt7ctype_w@@GLIBCPP_3.2
+OBJECT:24:_ZSt9collate_c@@GLIBCPP_3.2
+OBJECT:24:_ZSt9collate_w@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTINSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10bad_typeid@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10istrstream@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10ostrstream@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11logic_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11range_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12domain_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12length_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12out_of_range@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12strstreambuf@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13bad_exception@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13runtime_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14overflow_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15underflow_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt16invalid_argument@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7collateIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7collateIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8bad_cast@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9bad_alloc@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9strstream@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_bit_count@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_first_one@@GLIBCPP_3.2
+OBJECT:256:_ZSt8buf_wcin@@GLIBCPP_3.2
+OBJECT:256:_ZSt9buf_wcerr@@GLIBCPP_3.2
+OBJECT:256:_ZSt9buf_wcout@@GLIBCPP_3.2
+OBJECT:256:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:256:_ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:272:_ZSt4cerr@@GLIBCPP_3.2
+OBJECT:272:_ZSt4clog@@GLIBCPP_3.2
+OBJECT:272:_ZSt4cout@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wcerr@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wclog@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wcout@@GLIBCPP_3.2
+OBJECT:280:_ZSt3cin@@GLIBCPP_3.2
+OBJECT:280:_ZSt4wcin@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5lowerE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5printE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5punctE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5spaceE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5upperE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base6xdigitE@@GLIBCPP_3.2
+OBJECT:2:_ZTSa@@GLIBCPP_3.2
+OBJECT:2:_ZTSb@@GLIBCPP_3.2
+OBJECT:2:_ZTSc@@GLIBCPP_3.2
+OBJECT:2:_ZTSd@@GLIBCPP_3.2
+OBJECT:2:_ZTSe@@GLIBCPP_3.2
+OBJECT:2:_ZTSf@@GLIBCPP_3.2
+OBJECT:2:_ZTSh@@GLIBCPP_3.2
+OBJECT:2:_ZTSi@@GLIBCPP_3.2
+OBJECT:2:_ZTSj@@GLIBCPP_3.2
+OBJECT:2:_ZTSl@@GLIBCPP_3.2
+OBJECT:2:_ZTSm@@GLIBCPP_3.2
+OBJECT:2:_ZTSs@@GLIBCPP_3.2
+OBJECT:2:_ZTSt@@GLIBCPP_3.2
+OBJECT:2:_ZTSv@@GLIBCPP_3.2
+OBJECT:2:_ZTSw@@GLIBCPP_3.2
+OBJECT:2:_ZTSx@@GLIBCPP_3.2
+OBJECT:2:_ZTSy@@GLIBCPP_3.2
+OBJECT:32:_ZNSbIwSt11char_traitsIwESaIwEE20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:32:_ZNSs20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:32:_ZSt10messages_c@@GLIBCPP_3.2
+OBJECT:32:_ZSt10messages_w@@GLIBCPP_3.2
+OBJECT:32:_ZTIPa@@GLIBCPP_3.2
+OBJECT:32:_ZTIPb@@GLIBCPP_3.2
+OBJECT:32:_ZTIPc@@GLIBCPP_3.2
+OBJECT:32:_ZTIPd@@GLIBCPP_3.2
+OBJECT:32:_ZTIPe@@GLIBCPP_3.2
+OBJECT:32:_ZTIPf@@GLIBCPP_3.2
+OBJECT:32:_ZTIPh@@GLIBCPP_3.2
+OBJECT:32:_ZTIPi@@GLIBCPP_3.2
+OBJECT:32:_ZTIPj@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKa@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKb@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKc@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKd@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKe@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKf@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKh@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKi@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKj@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKl@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKm@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKs@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKt@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKv@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKw@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKx@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKy@@GLIBCPP_3.2
+OBJECT:32:_ZTIPl@@GLIBCPP_3.2
+OBJECT:32:_ZTIPm@@GLIBCPP_3.2
+OBJECT:32:_ZTIPs@@GLIBCPP_3.2
+OBJECT:32:_ZTIPt@@GLIBCPP_3.2
+OBJECT:32:_ZTIPv@@GLIBCPP_3.2
+OBJECT:32:_ZTIPw@@GLIBCPP_3.2
+OBJECT:32:_ZTIPx@@GLIBCPP_3.2
+OBJECT:32:_ZTIPy@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt10istrstream@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt10ostrstream@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:3:_ZTSPa@@GLIBCPP_3.2
+OBJECT:3:_ZTSPb@@GLIBCPP_3.2
+OBJECT:3:_ZTSPc@@GLIBCPP_3.2
+OBJECT:3:_ZTSPd@@GLIBCPP_3.2
+OBJECT:3:_ZTSPe@@GLIBCPP_3.2
+OBJECT:3:_ZTSPf@@GLIBCPP_3.2
+OBJECT:3:_ZTSPh@@GLIBCPP_3.2
+OBJECT:3:_ZTSPi@@GLIBCPP_3.2
+OBJECT:3:_ZTSPj@@GLIBCPP_3.2
+OBJECT:3:_ZTSPl@@GLIBCPP_3.2
+OBJECT:3:_ZTSPm@@GLIBCPP_3.2
+OBJECT:3:_ZTSPs@@GLIBCPP_3.2
+OBJECT:3:_ZTSPt@@GLIBCPP_3.2
+OBJECT:3:_ZTSPv@@GLIBCPP_3.2
+OBJECT:3:_ZTSPw@@GLIBCPP_3.2
+OBJECT:3:_ZTSPx@@GLIBCPP_3.2
+OBJECT:3:_ZTSPy@@GLIBCPP_3.2
+OBJECT:3:_ZTSSd@@GLIBCPP_3.2
+OBJECT:3:_ZTSSi@@GLIBCPP_3.2
+OBJECT:3:_ZTSSo@@GLIBCPP_3.2
+OBJECT:408:_ZSt11timepunct_c@@GLIBCPP_3.2
+OBJECT:408:_ZSt11timepunct_w@@GLIBCPP_3.2
+OBJECT:40:_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockE@@GLIBCPP_3.2
+OBJECT:40:_ZNSt6locale5_Impl11_S_id_ctypeE@@GLIBCPP_3.2
+OBJECT:40:_ZSt10numpunct_c@@GLIBCPP_3.2
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:48:_ZSt10numpunct_w@@GLIBCPP_3.2
+OBJECT:48:_ZTVNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale2id12_S_highwaterE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale3allE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base18_S_local_word_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4Init16_S_ios_base_initE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKa@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKb@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKc@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKd@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKe@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKf@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKh@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKi@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKj@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKl@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKm@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKs@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKt@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKv@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKw@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKx@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKy@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl10_S_id_timeE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl13_S_id_numericE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl19_S_facet_categoriesE@@GLIBCPP_3.2
+OBJECT:56:_ZSt7ctype_c@@GLIBCPP_3.2
+OBJECT:56:_ZTISi@@GLIBCPP_3.2
+OBJECT:56:_ZTISo@@GLIBCPP_3.2
+OBJECT:56:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTTSd@@GLIBCPP_3.2
+OBJECT:56:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt11logic_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt11range_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt12domain_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt12length_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt12out_of_range@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt13bad_exception@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt13runtime_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt14overflow_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt15underflow_error@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt8bad_cast@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt9exception@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZNSt6locale5_Impl14_S_id_monetaryE@@GLIBCPP_3.2
+OBJECT:72:_ZSt13c_locale_impl@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_fc@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_fw@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_tc@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_tw@@GLIBCPP_3.2
+OBJECT:72:_ZTISd@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8messagesIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8messagesIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt9strstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4nposE@@GLIBCPP_3.2
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSs4nposE@@GLIBCPP_3.2
+OBJECT:8:_ZNSs4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIwLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIwLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt11__timepunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_end_freeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_heap_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE13_S_start_freeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIcE10table_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale10_S_classicE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale17_S_num_categoriesE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale5facet11_S_c_localeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale9_S_globalE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7collateIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8messagesIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8numpunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZSt8c_locale@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt7collateIcE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt7collateIwE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt8messagesIwE@@GLIBCPP_3.2
diff --git a/libstdc++-v3/config/abi/x86_64-unknown-linux-gnu/baseline_symbols.txt b/libstdc++-v3/config/abi/x86_64-unknown-linux-gnu/baseline_symbols.txt
new file mode 100644
index 00000000000..15af15630db
--- /dev/null
+++ b/libstdc++-v3/config/abi/x86_64-unknown-linux-gnu/baseline_symbols.txt
@@ -0,0 +1,3034 @@
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.2
+FUNC:_ZNKSaIcE7addressERKc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE7addressERc@@GLIBCPP_3.2
+FUNC:_ZNKSaIcE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERKw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE7addressERw@@GLIBCPP_3.2
+FUNC:_ZNKSaIwE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_foldEmm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEm@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCPP_3.2
+FUNC:_ZNKSi6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs12find_last_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs13find_first_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs16find_last_not_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs17find_first_not_ofEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs2atEm@@GLIBCPP_3.2
+FUNC:_ZNKSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4copyEPcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs4dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs4findEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5c_strEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5emptyEv@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEPKcmm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindERKSsm@@GLIBCPP_3.2
+FUNC:_ZNKSs5rfindEcm@@GLIBCPP_3.2
+FUNC:_ZNKSs6_M_repEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSs6substrEmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_dataEv@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_foldEmm@@GLIBCPP_3.2
+FUNC:_ZNKSs7_M_iendEv@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSs7compareEmmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNKSs8_M_checkEm@@GLIBCPP_3.2
+FUNC:_ZNKSs8capacityEv@@GLIBCPP_3.2
+FUNC:_ZNKSs8max_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCPP_3.2
+FUNC:_ZNKSsixEm@@GLIBCPP_3.2
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb0EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE10neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE10pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE11frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_negative_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_positive_signEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10moneypunctIwLb1EE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_ampmEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE7_M_ampmEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE7_M_daysEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11__timepunctIwE9_M_monthsEPPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE6_M_getEv@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_scan_isEtPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE11do_scan_notEtPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEPKcS2_Pt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE5do_isEtc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEPwPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_toupperEPwPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE5do_isEPKwS2_Pt@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE5do_isEtw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCPP_3.2
+FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCPP_3.2
+FUNC:_ZNKSt6locale4nameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERKS0_PKcS5_m@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@@GLIBCPP_3.2
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERKS0_PKcS5_m@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcm@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE10_M_compareEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE12_M_transformEPwPKwm@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE12do_transformEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE4hashEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE7compareEPKwS2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE7do_hashEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7collateIwE9transformEPKwS2_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intES3_S3_RSt8ios_baseRSt12_Ios_IostateRSsRi@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_widen_intES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIlEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intImEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIxEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_convert_intIyEES3_S3_RSt8ios_basecccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_widen_floatES3_RSt8ios_basecPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE16_M_convert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertES3_RSt8ios_basecPKci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_widen_intES3_RSt8ios_basewPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIlEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intImEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIxEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_convert_intIyEES3_S3_RSt8ios_basewccT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_widen_floatES3_RSt8ios_basewPci@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE16_M_convert_floatIdEES3_S3_RSt8ios_basewcT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE16_M_convert_floatIeEES3_S3_RSt8ios_basewcT_@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCPP_3.2
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertES3_RSt8ios_basewPKwi@@GLIBCPP_3.2
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE20_M_convert_from_charEPc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6localePKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE5closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE7do_openERKSsRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNKSt8messagesIwE8do_closeEi@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE11do_groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE11do_truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE12do_falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE13decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE13thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE16do_decimal_pointEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE16do_thousands_sepEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE8groupingEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE8truenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8numpunctIwE9falsenameEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numERS3_S5_RiiimRKSt5ctypeIcERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameERS3_S5_RiPPKcmRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numERS3_S5_RiiimRKSt5ctypeIwERSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameERS3_S5_RiPPKwmRSt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatERS3_S5_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCPP_3.2
+FUNC:_ZNKSt8valarrayImE4sizeEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE14_M_check_facetEPKNSt6locale5facetE@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9exception4whatEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCPP_3.2
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCPP_3.2
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE10deallocateEPcm@@GLIBCPP_3.2
+FUNC:_ZNSaIcE7destroyEPc@@GLIBCPP_3.2
+FUNC:_ZNSaIcE8allocateEmPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIcE9constructEPcRKc@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIcEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwE10deallocateEPwm@@GLIBCPP_3.2
+FUNC:_ZNSaIwE7destroyEPw@@GLIBCPP_3.2
+FUNC:_ZNSaIwE8allocateEmPKv@@GLIBCPP_3.2
+FUNC:_ZNSaIwE9constructEPwRKw@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSaIwEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSaIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKwS2_EEEERS2_NS5_IPwS2_EESB_T_SC_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIN9__gnu_cxx17__normal_iteratorIPwS2_EEEERS2_S7_S7_T_S9_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIPKwEERS2_N9__gnu_cxx17__normal_iteratorIPwS2_EESA_T_SB_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE10_M_replaceIPwEERS2_N9__gnu_cxx17__normal_iteratorIS4_S2_EES8_T_S9_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKwS2_EEEERS2_NS5_IPwS2_EESB_T_SC_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPwS2_EEEERS2_S7_S7_T_S9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIPKwEERS2_N9__gnu_cxx17__normal_iteratorIPwS2_EESA_T_SB_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeIPwEERS2_N9__gnu_cxx17__normal_iteratorIS4_S2_EES8_T_S9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_RepixEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPKwS2_EEEET_S9_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPKwS2_EEEET_S9_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCPP_3.2
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSdD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi3getEPclc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCPP_3.2
+FUNC:_ZNSi3getERc@@GLIBCPP_3.2
+FUNC:_ZNSi3getEv@@GLIBCPP_3.2
+FUNC:_ZNSi4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSi4readEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSi5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSi5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSi5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSi6ignoreEli@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCPP_3.2
+FUNC:_ZNSi6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPcl@@GLIBCPP_3.2
+FUNC:_ZNSi7getlineEPclc@@GLIBCPP_3.2
+FUNC:_ZNSi7putbackEc@@GLIBCPP_3.2
+FUNC:_ZNSi8readsomeEPcl@@GLIBCPP_3.2
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSiD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSirsERPv@@GLIBCPP_3.2
+FUNC:_ZNSirsERb@@GLIBCPP_3.2
+FUNC:_ZNSirsERd@@GLIBCPP_3.2
+FUNC:_ZNSirsERe@@GLIBCPP_3.2
+FUNC:_ZNSirsERf@@GLIBCPP_3.2
+FUNC:_ZNSirsERi@@GLIBCPP_3.2
+FUNC:_ZNSirsERj@@GLIBCPP_3.2
+FUNC:_ZNSirsERl@@GLIBCPP_3.2
+FUNC:_ZNSirsERm@@GLIBCPP_3.2
+FUNC:_ZNSirsERs@@GLIBCPP_3.2
+FUNC:_ZNSirsERt@@GLIBCPP_3.2
+FUNC:_ZNSirsERx@@GLIBCPP_3.2
+FUNC:_ZNSirsERy@@GLIBCPP_3.2
+FUNC:_ZNSo3putEc@@GLIBCPP_3.2
+FUNC:_ZNSo5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSo5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSo5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSo5writeEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSo6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSo6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSoD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCPP_3.2
+FUNC:_ZNSolsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+FUNC:_ZNSolsEb@@GLIBCPP_3.2
+FUNC:_ZNSolsEd@@GLIBCPP_3.2
+FUNC:_ZNSolsEe@@GLIBCPP_3.2
+FUNC:_ZNSolsEf@@GLIBCPP_3.2
+FUNC:_ZNSolsEi@@GLIBCPP_3.2
+FUNC:_ZNSolsEj@@GLIBCPP_3.2
+FUNC:_ZNSolsEl@@GLIBCPP_3.2
+FUNC:_ZNSolsEm@@GLIBCPP_3.2
+FUNC:_ZNSolsEs@@GLIBCPP_3.2
+FUNC:_ZNSolsEt@@GLIBCPP_3.2
+FUNC:_ZNSolsEx@@GLIBCPP_3.2
+FUNC:_ZNSolsEy@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs10_M_replaceIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_St18input_iterator_tag@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_constructEmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCPP_3.2
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPKcSsEEEERSsNS1_IPcSsEES7_T_S8_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIN9__gnu_cxx17__normal_iteratorIPcSsEEEERSsS3_S3_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPKcEERSsN9__gnu_cxx17__normal_iteratorIPcSsEES6_T_S7_@@GLIBCPP_3.2
+FUNC:_ZNSs15_M_replace_safeIPcEERSsN9__gnu_cxx17__normal_iteratorIS0_SsEES4_T_S5_@@GLIBCPP_3.2
+FUNC:_ZNSs2atEm@@GLIBCPP_3.2
+FUNC:_ZNSs3endEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEm@@GLIBCPP_3.2
+FUNC:_ZNSs4_Rep9_S_createEmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSs4_RepixEm@@GLIBCPP_3.2
+FUNC:_ZNSs4rendEv@@GLIBCPP_3.2
+FUNC:_ZNSs4swapERSs@@GLIBCPP_3.2
+FUNC:_ZNSs5beginEv@@GLIBCPP_3.2
+FUNC:_ZNSs5clearEv@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCPP_3.2
+FUNC:_ZNSs5eraseEmm@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6appendERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6appendEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6assignERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6assignEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmPKc@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs6insertEmmc@@GLIBCPP_3.2
+FUNC:_ZNSs6rbeginEv@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEm@@GLIBCPP_3.2
+FUNC:_ZNSs6resizeEmc@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_dataEPc@@GLIBCPP_3.2
+FUNC:_ZNSs7_M_leakEv@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmPKc@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmPKcm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmRKSs@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmRKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSs7replaceEmmmc@@GLIBCPP_3.2
+FUNC:_ZNSs7reserveEm@@GLIBCPP_3.2
+FUNC:_ZNSs9_M_mutateEmmm@@GLIBCPP_3.2
+FUNC:_ZNSs9push_backEc@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EPKcmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSsC1ERKSsmmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1EmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EPKcmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsmm@@GLIBCPP_3.2
+FUNC:_ZNSsC2ERKSsmmRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2EmcRKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPKcSsEEEET_S5_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCPP_3.2
+FUNC:_ZNSsD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSsD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSsaSEPKc@@GLIBCPP_3.2
+FUNC:_ZNSsaSERKSs@@GLIBCPP_3.2
+FUNC:_ZNSsaSEc@@GLIBCPP_3.2
+FUNC:_ZNSsixEm@@GLIBCPP_3.2
+FUNC:_ZNSspLEPKc@@GLIBCPP_3.2
+FUNC:_ZNSspLERKSs@@GLIBCPP_3.2
+FUNC:_ZNSspLEc@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base13_S_format_intERKSt8ios_basePccc@@GLIBCPP_3.2
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePccl@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC1EPcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamC2EPcl@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10moneypunctIwLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11__timepunctIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE10sys_ungetcEi@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE12_M_open_modeESt13_Ios_OpenmodeRiS2_Pc@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE7seekposElSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_getcEv@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmodeb@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_allocEm@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_l@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPFPvmEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKal@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPKhl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPalS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPclS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1EPhlS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC1El@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPFPvmEPFvS0_E@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKal@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPKhl@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPalS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPclS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2EPhlS0_@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufC2El@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_really_overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPclRlS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE17_M_output_unshiftEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE18_M_really_overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE18_M_set_determinateEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_is_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_underflow_commonEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE20_M_set_indeterminateEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwlRlS4_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwlw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreElj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwlw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpElSt12_Ios_Seekdir@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCPP_3.2
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14collate_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE14_M_in_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_out_buf_sizeEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_out_cur_moveEl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE15_M_pback_createEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE16_M_pback_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE14_M_really_syncEmm@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPcl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE14_M_really_syncEmm@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwl@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_round_upEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE14_S_chunk_allocEmRi@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE17_S_freelist_indexEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE5_LockD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEm@@GLIBCPP_3.2
+FUNC:_ZNSt24__default_alloc_templateILb1ELi0EE9_S_refillEm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC1EPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EP15__locale_structPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcEC2EPKtbm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale21_S_normalize_categoryEj@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale2idC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPNS_5facetE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_j@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1EPPNS_5facetEmb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC1ERKS0_m@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2EPPNS_5facetEmb@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplC2ERKS0_m@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet16_M_add_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_M_remove_referenceEv@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6locale7classicEv@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPKc@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_PKcj@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2ERKS_S1_j@@GLIBCPP_3.2
+FUNC:_ZNSt6localeC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt6localeaSERKS_@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7collateIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base13_M_grow_wordsEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17_M_call_callbacksENS_5eventE@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base20_M_dispose_callbacksEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init13_S_ios_createEb@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4Init14_S_ios_destroyEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC1EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC2EP15__locale_structPKcm@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8messagesIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC1EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC2EP15__locale_structm@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8numpunctIwED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC1ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC2ERKS0_@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt8valarrayImEixEm@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_facetsERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream3strEv@@GLIBCPP_3.2
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCPP_3.2
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCPP_3.2
+FUNC:_ZSt10unexpectedv@@GLIBCPP_3.2
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIlEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vImEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIxEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14__convert_to_vIyEvPKcRT_RSt12_Ios_IostateRKP15__locale_structi@@GLIBCPP_3.2
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCPP_3.2
+FUNC:_ZSt16__throw_bad_castv@@GLIBCPP_3.2
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCPP_3.2
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCPP_3.2
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCPP_3.2
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCPP_3.2
+FUNC:_ZSt24__uninitialized_copy_auxIN9__gnu_cxx17__normal_iteratorIPKSsSt6vectorISsSaISsEEEEPSsET0_T_SA_S9_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt26__uninitialized_fill_n_auxIPSsmSsET_S1_T0_RKT1_12__false_type@@GLIBCPP_3.2
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9terminatev@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7collateIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCPP_3.2
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCPP_3.2
+FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCPP_3.2
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCPP_3.2
+FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCPP_3.2
+FUNC:_ZThn16_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZThn16_NSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSdD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSdD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSiD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSiD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSoD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSoD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10istrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10istrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10ostrstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt10ostrstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt9strstreamD0Ev@@GLIBCPP_3.2
+FUNC:_ZTv0_n24_NSt9strstreamD1Ev@@GLIBCPP_3.2
+FUNC:_ZdaPv@@GLIBCPP_3.2
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_ZdlPv@@GLIBCPP_3.2
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_Znam@@GLIBCPP_3.2
+FUNC:_ZnamRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:_Znwm@@GLIBCPP_3.2
+FUNC:_ZnwmRKSt9nothrow_t@@GLIBCPP_3.2
+FUNC:__cxa_allocate_exception@@CXXABI_1.2
+FUNC:__cxa_bad_cast@@CXXABI_1.2
+FUNC:__cxa_bad_typeid@@CXXABI_1.2
+FUNC:__cxa_begin_catch@@CXXABI_1.2
+FUNC:__cxa_call_unexpected@@CXXABI_1.2
+FUNC:__cxa_current_exception_type@@CXXABI_1.2
+FUNC:__cxa_demangle@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_append_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_clear@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy@@CXXABI_1.2
+FUNC:__cxa_dyn_string_copy_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_delete@@CXXABI_1.2
+FUNC:__cxa_dyn_string_eq@@CXXABI_1.2
+FUNC:__cxa_dyn_string_init@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_char@@CXXABI_1.2
+FUNC:__cxa_dyn_string_insert_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_new@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend@@CXXABI_1.2
+FUNC:__cxa_dyn_string_prepend_cstr@@CXXABI_1.2
+FUNC:__cxa_dyn_string_release@@CXXABI_1.2
+FUNC:__cxa_dyn_string_resize@@CXXABI_1.2
+FUNC:__cxa_dyn_string_substring@@CXXABI_1.2
+FUNC:__cxa_end_catch@@CXXABI_1.2
+FUNC:__cxa_free_exception@@CXXABI_1.2
+FUNC:__cxa_get_globals@@CXXABI_1.2
+FUNC:__cxa_get_globals_fast@@CXXABI_1.2
+FUNC:__cxa_pure_virtual@@CXXABI_1.2
+FUNC:__cxa_rethrow@@CXXABI_1.2
+FUNC:__cxa_throw@@CXXABI_1.2
+FUNC:__cxa_vec_cctor@@CXXABI_1.2
+FUNC:__cxa_vec_cleanup@@CXXABI_1.2
+FUNC:__cxa_vec_ctor@@CXXABI_1.2
+FUNC:__cxa_vec_delete2@@CXXABI_1.2
+FUNC:__cxa_vec_delete3@@CXXABI_1.2
+FUNC:__cxa_vec_delete@@CXXABI_1.2
+FUNC:__cxa_vec_dtor@@CXXABI_1.2
+FUNC:__cxa_vec_new2@@CXXABI_1.2
+FUNC:__cxa_vec_new3@@CXXABI_1.2
+FUNC:__cxa_vec_new@@CXXABI_1.2
+FUNC:__dynamic_cast@@CXXABI_1.2
+FUNC:__gxx_personality_v0@@CXXABI_1.2
+OBJECT:0:CXXABI_1.2
+OBJECT:0:GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:104:_ZTVSt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:112:_ZNSt11__timepunctIcE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:112:_ZNSt11__timepunctIwE12_S_timezonesE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSd@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:120:_ZTVSt9strstream@@GLIBCPP_3.2
+OBJECT:128:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:128:_ZTVSt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCPP_3.2
+OBJECT:12:_ZTSSt8ios_base@@GLIBCPP_3.2
+OBJECT:136:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:136:_ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9exception@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9strstream@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9time_base@@GLIBCPP_3.2
+OBJECT:13:_ZTSSt9type_info@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCPP_3.2
+OBJECT:14:_ZTSSt7collateIwE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10__num_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10istrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10money_base@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8messagesIwE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt10time_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt11money_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_get_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_get_w@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_put_c@@GLIBCPP_3.2
+OBJECT:16:_ZSt9num_put_w@@GLIBCPP_3.2
+OBJECT:16:_ZTINSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10__num_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10ctype_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt10money_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt12codecvt_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt13messages_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:16:_ZTISt8ios_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9exception@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9time_base@@GLIBCPP_3.2
+OBJECT:16:_ZTISt9type_info@@GLIBCPP_3.2
+OBJECT:16:_ZTIa@@GLIBCPP_3.2
+OBJECT:16:_ZTIb@@GLIBCPP_3.2
+OBJECT:16:_ZTIc@@GLIBCPP_3.2
+OBJECT:16:_ZTId@@GLIBCPP_3.2
+OBJECT:16:_ZTIe@@GLIBCPP_3.2
+OBJECT:16:_ZTIf@@GLIBCPP_3.2
+OBJECT:16:_ZTIh@@GLIBCPP_3.2
+OBJECT:16:_ZTIi@@GLIBCPP_3.2
+OBJECT:16:_ZTIj@@GLIBCPP_3.2
+OBJECT:16:_ZTIl@@GLIBCPP_3.2
+OBJECT:16:_ZTIm@@GLIBCPP_3.2
+OBJECT:16:_ZTIs@@GLIBCPP_3.2
+OBJECT:16:_ZTIt@@GLIBCPP_3.2
+OBJECT:16:_ZTIv@@GLIBCPP_3.2
+OBJECT:16:_ZTIw@@GLIBCPP_3.2
+OBJECT:16:_ZTIx@@GLIBCPP_3.2
+OBJECT:16:_ZTIy@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11logic_error@@GLIBCPP_3.2
+OBJECT:16:_ZTSSt11range_error@@GLIBCPP_3.2
+OBJECT:16:_ZTTSi@@GLIBCPP_3.2
+OBJECT:16:_ZTTSo@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:16:_ZTTSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12domain_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12length_error@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCPP_3.2
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCPP_3.2
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13messages_base@@GLIBCPP_3.2
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCPP_3.2
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIwLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt10moneypunctIwLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb0EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb1EE4intlE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCPP_3.2
+OBJECT:1:_ZNSt8ios_base4Init20_S_synced_with_stdioE@@GLIBCPP_3.2
+OBJECT:1:_ZSt7nothrow@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCPP_3.2
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:224:_ZSt9facet_vec@@GLIBCPP_3.2
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:22:_ZTSSt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:23:_ZNSt10__num_base8_S_atomsE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:23:_ZTSSt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:248:_ZSt7buf_cin@@GLIBCPP_3.2
+OBJECT:248:_ZSt8buf_cerr@@GLIBCPP_3.2
+OBJECT:248:_ZSt8buf_cout@@GLIBCPP_3.2
+OBJECT:24:_ZNSt6locale5_Impl13_S_id_collateE@@GLIBCPP_3.2
+OBJECT:24:_ZNSt6locale5_Impl14_S_id_messagesE@@GLIBCPP_3.2
+OBJECT:24:_ZSt7ctype_w@@GLIBCPP_3.2
+OBJECT:24:_ZSt9codecvt_c@@GLIBCPP_3.2
+OBJECT:24:_ZSt9codecvt_w@@GLIBCPP_3.2
+OBJECT:24:_ZSt9collate_c@@GLIBCPP_3.2
+OBJECT:24:_ZSt9collate_w@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTINSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10bad_typeid@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10istrstream@@GLIBCPP_3.2
+OBJECT:24:_ZTISt10ostrstream@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11logic_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt11range_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12ctype_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12ctype_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12domain_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12length_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12out_of_range@@GLIBCPP_3.2
+OBJECT:24:_ZTISt12strstreambuf@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13bad_exception@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt13runtime_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt14overflow_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt15underflow_error@@GLIBCPP_3.2
+OBJECT:24:_ZTISt16invalid_argument@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt5ctypeIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt5ctypeIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7collateIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt7collateIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8bad_cast@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9bad_alloc@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:24:_ZTISt9strstream@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_bit_count@@GLIBCPP_3.2
+OBJECT:256:_ZSt12_S_first_one@@GLIBCPP_3.2
+OBJECT:256:_ZSt8buf_wcin@@GLIBCPP_3.2
+OBJECT:256:_ZSt9buf_wcerr@@GLIBCPP_3.2
+OBJECT:256:_ZSt9buf_wcout@@GLIBCPP_3.2
+OBJECT:272:_ZSt4cerr@@GLIBCPP_3.2
+OBJECT:272:_ZSt4clog@@GLIBCPP_3.2
+OBJECT:272:_ZSt4cout@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wcerr@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wclog@@GLIBCPP_3.2
+OBJECT:272:_ZSt5wcout@@GLIBCPP_3.2
+OBJECT:280:_ZSt3cin@@GLIBCPP_3.2
+OBJECT:280:_ZSt4wcin@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5lowerE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5printE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5punctE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5spaceE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base5upperE@@GLIBCPP_3.2
+OBJECT:2:_ZNSt10ctype_base6xdigitE@@GLIBCPP_3.2
+OBJECT:2:_ZTSa@@GLIBCPP_3.2
+OBJECT:2:_ZTSb@@GLIBCPP_3.2
+OBJECT:2:_ZTSc@@GLIBCPP_3.2
+OBJECT:2:_ZTSd@@GLIBCPP_3.2
+OBJECT:2:_ZTSe@@GLIBCPP_3.2
+OBJECT:2:_ZTSf@@GLIBCPP_3.2
+OBJECT:2:_ZTSh@@GLIBCPP_3.2
+OBJECT:2:_ZTSi@@GLIBCPP_3.2
+OBJECT:2:_ZTSj@@GLIBCPP_3.2
+OBJECT:2:_ZTSl@@GLIBCPP_3.2
+OBJECT:2:_ZTSm@@GLIBCPP_3.2
+OBJECT:2:_ZTSs@@GLIBCPP_3.2
+OBJECT:2:_ZTSt@@GLIBCPP_3.2
+OBJECT:2:_ZTSv@@GLIBCPP_3.2
+OBJECT:2:_ZTSw@@GLIBCPP_3.2
+OBJECT:2:_ZTSx@@GLIBCPP_3.2
+OBJECT:2:_ZTSy@@GLIBCPP_3.2
+OBJECT:32:_ZNSbIwSt11char_traitsIwESaIwEE20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:32:_ZNSs20_S_empty_rep_storageE@@GLIBCPP_3.2
+OBJECT:32:_ZSt10messages_c@@GLIBCPP_3.2
+OBJECT:32:_ZSt10messages_w@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKa@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKb@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKc@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKd@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKe@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKf@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKh@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKi@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKj@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKl@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKm@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKs@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKt@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKv@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKw@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKx@@GLIBCPP_3.2
+OBJECT:32:_ZTIPKy@@GLIBCPP_3.2
+OBJECT:32:_ZTIPa@@GLIBCPP_3.2
+OBJECT:32:_ZTIPb@@GLIBCPP_3.2
+OBJECT:32:_ZTIPc@@GLIBCPP_3.2
+OBJECT:32:_ZTIPd@@GLIBCPP_3.2
+OBJECT:32:_ZTIPe@@GLIBCPP_3.2
+OBJECT:32:_ZTIPf@@GLIBCPP_3.2
+OBJECT:32:_ZTIPh@@GLIBCPP_3.2
+OBJECT:32:_ZTIPi@@GLIBCPP_3.2
+OBJECT:32:_ZTIPj@@GLIBCPP_3.2
+OBJECT:32:_ZTIPl@@GLIBCPP_3.2
+OBJECT:32:_ZTIPm@@GLIBCPP_3.2
+OBJECT:32:_ZTIPs@@GLIBCPP_3.2
+OBJECT:32:_ZTIPt@@GLIBCPP_3.2
+OBJECT:32:_ZTIPv@@GLIBCPP_3.2
+OBJECT:32:_ZTIPw@@GLIBCPP_3.2
+OBJECT:32:_ZTIPx@@GLIBCPP_3.2
+OBJECT:32:_ZTIPy@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt10istrstream@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt10ostrstream@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:32:_ZTVNSt6locale5facetE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt11__timepunctIcE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt11__timepunctIwE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:32:_ZTVSt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:39:_ZTSSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:3:_ZTSPa@@GLIBCPP_3.2
+OBJECT:3:_ZTSPb@@GLIBCPP_3.2
+OBJECT:3:_ZTSPc@@GLIBCPP_3.2
+OBJECT:3:_ZTSPd@@GLIBCPP_3.2
+OBJECT:3:_ZTSPe@@GLIBCPP_3.2
+OBJECT:3:_ZTSPf@@GLIBCPP_3.2
+OBJECT:3:_ZTSPh@@GLIBCPP_3.2
+OBJECT:3:_ZTSPi@@GLIBCPP_3.2
+OBJECT:3:_ZTSPj@@GLIBCPP_3.2
+OBJECT:3:_ZTSPl@@GLIBCPP_3.2
+OBJECT:3:_ZTSPm@@GLIBCPP_3.2
+OBJECT:3:_ZTSPs@@GLIBCPP_3.2
+OBJECT:3:_ZTSPt@@GLIBCPP_3.2
+OBJECT:3:_ZTSPv@@GLIBCPP_3.2
+OBJECT:3:_ZTSPw@@GLIBCPP_3.2
+OBJECT:3:_ZTSPx@@GLIBCPP_3.2
+OBJECT:3:_ZTSPy@@GLIBCPP_3.2
+OBJECT:3:_ZTSSd@@GLIBCPP_3.2
+OBJECT:3:_ZTSSi@@GLIBCPP_3.2
+OBJECT:3:_ZTSSo@@GLIBCPP_3.2
+OBJECT:408:_ZSt11timepunct_c@@GLIBCPP_3.2
+OBJECT:408:_ZSt11timepunct_w@@GLIBCPP_3.2
+OBJECT:40:_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockE@@GLIBCPP_3.2
+OBJECT:40:_ZNSt6locale5_Impl11_S_id_ctypeE@@GLIBCPP_3.2
+OBJECT:40:_ZSt10numpunct_c@@GLIBCPP_3.2
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVNSt8ios_base7failureE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt10bad_typeid@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt11logic_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt11range_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt12domain_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt12length_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt12out_of_range@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt13bad_exception@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt13runtime_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt14overflow_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt15underflow_error@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt16invalid_argument@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8bad_cast@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt9bad_alloc@@GLIBCPP_3.2
+OBJECT:40:_ZTVSt9exception@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:46:_ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:48:_ZSt10numpunct_w@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:48:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:49:_ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIwE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale2id12_S_highwaterE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale3allE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base18_S_local_word_sizeE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4Init16_S_ios_base_initE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCPP_3.2
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKa@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKb@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKc@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKd@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKe@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKf@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKh@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKi@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKj@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKl@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKm@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKs@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKt@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKv@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKw@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKx@@GLIBCPP_3.2
+OBJECT:4:_ZTSPKy@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl10_S_id_timeE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl13_S_id_numericE@@GLIBCPP_3.2
+OBJECT:56:_ZNSt6locale5_Impl19_S_facet_categoriesE@@GLIBCPP_3.2
+OBJECT:56:_ZSt7ctype_c@@GLIBCPP_3.2
+OBJECT:56:_ZTISi@@GLIBCPP_3.2
+OBJECT:56:_ZTISo@@GLIBCPP_3.2
+OBJECT:56:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:56:_ZTISt9basic_iosIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTTSd@@GLIBCPP_3.2
+OBJECT:56:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt14collate_bynameIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt14collate_bynameIwE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt15messages_bynameIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt15messages_bynameIwE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt7collateIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt7collateIwE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt8messagesIcE@@GLIBCPP_3.2
+OBJECT:56:_ZTVSt8messagesIwE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv116__enum_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv117__array_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv120__function_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVN10__cxxabiv123__fundamental_type_infoE@@GLIBCPP_3.2
+OBJECT:64:_ZTVSt9type_info@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZNSt6locale5_Impl14_S_id_monetaryE@@GLIBCPP_3.2
+OBJECT:72:_ZSt13c_locale_impl@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_fc@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_fw@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_tc@@GLIBCPP_3.2
+OBJECT:72:_ZSt13moneypunct_tw@@GLIBCPP_3.2
+OBJECT:72:_ZTISd@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIcLb0EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIcLb1EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIwLb0EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt10moneypunctIwLb1EE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt21__ctype_abstract_baseIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt21__ctype_abstract_baseIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8messagesIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8messagesIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:72:_ZTVN10__cxxabiv117__pbase_type_infoE@@GLIBCPP_3.2
+OBJECT:72:_ZTVN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2
+OBJECT:72:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt15numpunct_bynameIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt15numpunct_bynameIwE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt8numpunctIcE@@GLIBCPP_3.2
+OBJECT:72:_ZTVSt8numpunctIwE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTTSt9strstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSi@@GLIBCPP_3.2
+OBJECT:80:_ZTVSo@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt10istrstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt10ostrstream@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:80:_ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
+OBJECT:88:_ZTVN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2
+OBJECT:88:_ZTVN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2
+OBJECT:88:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:88:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8messagesIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8numpunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4nposE@@GLIBCPP_3.2
+OBJECT:8:_ZNSs4_Rep11_S_max_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSs4nposE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIwLb0EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt10moneypunctIwLb1EE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt11__timepunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt11__timepunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE11_S_end_freeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE12_S_heap_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt24__default_alloc_templateILb1ELi0EE13_S_start_freeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIcE10table_sizeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt5ctypeIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale10_S_classicE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale17_S_num_categoriesE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale5facet11_S_c_localeE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt6locale9_S_globalE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7collateIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7collateIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8messagesIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8messagesIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8numpunctIcE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8numpunctIwE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCPP_3.2
+OBJECT:8:_ZSt8c_locale@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCPP_3.2
+OBJECT:96:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCPP_3.2
diff --git a/libstdc++-v3/config/cpu/arm/atomicity.h b/libstdc++-v3/config/cpu/arm/atomicity.h
index 2363edf7cdf..7b952aac365 100644
--- a/libstdc++-v3/config/cpu/arm/atomicity.h
+++ b/libstdc++-v3/config/cpu/arm/atomicity.h
@@ -32,51 +32,23 @@
typedef int _Atomic_word;
+/* It isn't possible to write an atomic add instruction using the ARM
+ SWP instruction without using either a global guard variable or a
+ guard bit somewhere in the Atomic word. However, even with a guard
+ bit we need to understand the thread model (if any) in order to
+ make co-operatively threaded applications work correctly.
+
+ The previous Thumb-based implementations were also completely
+ broken, since they failed to switch back into Thumb mode (Gas bug,
+ I think). */
+
static inline _Atomic_word
__attribute__ ((__unused__))
__exchange_and_add (volatile _Atomic_word* __mem, int __val)
{
- _Atomic_word __tmp, __tmp2, __result;
-#ifdef __thumb__
- /* Since this function is inlined, we can't be sure of the alignment. */
- __asm__ __volatile__ (
- "ldr %0, 4f \n\t"
- "bx %0 \n\t"
- ".align 0 \n"
- "4:\t"
- ".word 0f \n\t"
- ".code 32 \n"
- "0:\t"
- "ldr %0, [%3] \n\t"
- "add %1, %0, %4 \n\t"
- "swp %2, %1, [%3] \n\t"
- "cmp %0, %2 \n\t"
- "swpne %1, %2, [%3] \n\t"
- "bne 0b \n\t"
- "ldr %1, 1f \n\t"
- "bx %1 \n"
- "1:\t"
- ".word 2f \n\t"
- ".code 16 \n"
- "2:\n"
- : "=&l"(__result), "=&r"(__tmp), "=&r"(__tmp2)
- : "r" (__mem), "r"(__val)
- : "cc", "memory");
-#else
- __asm__ __volatile__ (
- "\n"
- "0:\t"
- "ldr %0, [%3] \n\t"
- "add %1, %0, %4 \n\t"
- "swp %2, %1, [%3] \n\t"
- "cmp %0, %2 \n\t"
- "swpne %1, %2, [%3] \n\t"
- "bne 0b \n\t"
- ""
- : "=&r"(__result), "=&r"(__tmp), "=&r"(__tmp2)
- : "r" (__mem), "r"(__val)
- : "cc", "memory");
-#endif
+ _Atomic_word __result = *__mem;
+
+ *__mem = __result + __val;
return __result;
}
@@ -84,138 +56,7 @@ static inline void
__attribute__ ((__unused__))
__atomic_add (volatile _Atomic_word *__mem, int __val)
{
- _Atomic_word __tmp, __tmp2, __tmp3;
-#ifdef __thumb__
- /* Since this function is inlined, we can't be sure of the alignment. */
- __asm__ __volatile__ (
- "ldr %0, 4f \n\t"
- "bx %0 \n\t"
- ".align 0\n"
- "4:\t"
- ".word 0f \n\t"
- ".code 32 \n"
- "0:\t"
- "ldr %0, [%3] \n\t"
- "add %1, %0, %4 \n\t"
- "swp %2, %1, [%3] \n\t"
- "cmp %0, %2 \n\t"
- "swpne %1, %2,[%3] \n\t"
- "bne 0b \n\t"
- "ldr %1, 1f \n\t"
- "bx %1 \n"
- "1:\t"
- ".word 2f \n\t"
- ".code 16 \n"
- "2:\n"
- : "=&l"(__tmp), "=&r"(__tmp2), "=&r"(__tmp3)
- : "r" (__mem), "r"(__val)
- : "cc", "memory");
-#else
- __asm__ __volatile__ (
- "\n"
- "0:\t"
- "ldr %0, [%3] \n\t"
- "add %1, %0, %4 \n\t"
- "swp %2, %1, [%3] \n\t"
- "cmp %0, %2 \n\t"
- "swpne %1, %2, [%3] \n\t"
- "bne 0b \n\t"
- ""
- : "=&r"(__tmp), "=&r"(__tmp2), "=&r"(__tmp3)
- : "r" (__mem), "r"(__val)
- : "cc", "memory");
-#endif
-}
-
-static inline long
-__attribute__ ((__unused__))
-__always_swap (volatile long *__p, long __newval)
-{
- long __result;
-#ifdef __thumb__
- long __tmp;
- /* Since this function is inlined, we can't be sure of the alignment. */
- __asm__ __volatile__ (
- "ldr %0, 4f \n\t"
- "bx %0 \n\t"
- ".align 0 \n"
- "4:\t"
- ".word 0f \n\t"
- ".code 32\n"
- "0:\t"
- "swp %0, %3, [%2] \n\t"
- "ldr %1, 1f \n\t"
- "bx %1 \n"
- "1:\t"
- ".word 2f \n\t"
- ".code 16 \n"
- "2:\n"
- : "=&l"(__result), "=&r"(__tmp)
- : "r"(__p), "r"(__newval)
- : "memory");
-#else
- __asm__ __volatile__ (
- "\n\t"
- "swp %0, %2, [%1] \n\t"
- ""
- : "=&r"(__result)
- : "r"(__p), "r"(__newval)
- : "memory");
-#endif
- return __result;
-}
-
-static inline int
-__attribute__ ((__unused__))
-__test_and_set (volatile long *__p, long __newval)
-{
- int __result;
- long __tmp;
-#ifdef __thumb__
- /* Since this function is inlined, we can't be sure of the alignment. */
- __asm__ __volatile__ (
- "ldr %0, 4f \n\t"
- "bx %0 \n\t"
- ".align 0 \n"
- "4:\t"
- ".word 0f \n\t"
- ".code 32 \n"
- "0:\t"
- "ldr %0, [%2] \n\t"
- "cmp %0, #0 \n\t"
- "bne 1f \n\t"
- "swp %1, %3, [%2] \n\t"
- "cmp %0, %1 \n\t"
- "swpne %0, %1, [%2]\n\t"
- "bne 0b \n"
- "1:\t"
- "ldr %1, 2f \n\t"
- "bx %1 \n"
- "2:\t"
- ".word 3f \n\t"
- ".code 16 \n"
- "3:"
- : "=&l"(__result), "=r" (__tmp)
- : "r"(__p), "r"(__newval)
- : "cc", "memory");
-#else
- __asm__ __volatile__ (
- "\n"
- "0:\t"
- "ldr %0, [%2] \n\t"
- "cmp %0, #0 \n\t"
- "bne 1f \n\t"
- "swp %1, %3, [%2] \n\t"
- "cmp %0, %1 \n\t"
- "swpne %0, %1, [%2] \n\t"
- "bne 0b \n"
- "1:\n\t"
- ""
- : "=&r"(__result), "=r" (__tmp)
- : "r"(__p), "r"(__newval)
- : "cc", "memory");
-#endif
- return __result;
+ __exchange_and_add (__mem, __val);
}
#endif /* atomicity.h */
diff --git a/libstdc++-v3/config/cpu/cris/cpu_limits.h b/libstdc++-v3/config/cpu/cris/cpu_limits.h
deleted file mode 100644
index f0ff04dedaa..00000000000
--- a/libstdc++-v3/config/cpu/cris/cpu_limits.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_double_bits 64
-
-#endif
diff --git a/libstdc++-v3/config/cpu/generic/cpu_limits.h b/libstdc++-v3/config/cpu/generic/cpu_limits.h
deleted file mode 100644
index 0438f7c6e9f..00000000000
--- a/libstdc++-v3/config/cpu/generic/cpu_limits.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-// Nothing is defined in the generic file. In that way, we fall back
-// on the defaults in std_limits.h.
-
-// If you need to override these defaults, you can either use a
-// CPU-specific version (in which case you must modify
-// configure.target) or you must add the overrides to your
-// os_defines.h. In general, if all systems for your CPU use the
-// same values, it is best to use a cpu-specific configuration file.
-
-#endif
-
diff --git a/libstdc++-v3/config/cpu/generic/limits.h b/libstdc++-v3/config/cpu/generic/limits.h
deleted file mode 100644
index 8fa5a82145f..00000000000
--- a/libstdc++-v3/config/cpu/generic/limits.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-// Nothing is defined in the generic file. In that way, we fall back
-// on the defaults in std_limits.h.
-
-// If you need to override these defaults, you can either use a
-// CPU-specific version (in which case you must modify
-// configure.target) or you must add the overrides to your
-// os_defines.h. In general, if all systems for your CPU use the
-// same values, it is best to use a cpu-specific configuration file.
-
-#endif
diff --git a/libstdc++-v3/config/cpu/i386/cpu_limits.h b/libstdc++-v3/config/cpu/i386/cpu_limits.h
deleted file mode 100644
index be304e2d805..00000000000
--- a/libstdc++-v3/config/cpu/i386/cpu_limits.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_double_bits 80
-
-#endif
diff --git a/libstdc++-v3/config/cpu/ia64/cpu_limits.h b/libstdc++-v3/config/cpu/ia64/cpu_limits.h
deleted file mode 100644
index 735f7d5bb21..00000000000
--- a/libstdc++-v3/config/cpu/ia64/cpu_limits.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_bits 64
-
-// While sizeof(long double) == 16, the format is the same as the x86.
-#define __glibcpp_long_double_bits 80
-
-#endif
diff --git a/libstdc++-v3/config/cpu/m68k/cpu_limits.h b/libstdc++-v3/config/cpu/m68k/cpu_limits.h
deleted file mode 100644
index 07e4e03a12b..00000000000
--- a/libstdc++-v3/config/cpu/m68k/cpu_limits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_double_bits 96
-
-#endif
-
-
diff --git a/libstdc++-v3/config/cpu/powerpc/cpu_limits.h b/libstdc++-v3/config/cpu/powerpc/cpu_limits.h
deleted file mode 100644
index 42cffa91441..00000000000
--- a/libstdc++-v3/config/cpu/powerpc/cpu_limits.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#ifdef __powerpc64__
-#define __glibcpp_long_bits 64
-#endif
-
-#ifndef __LONG_DOUBLE_128__
-#define __glibcpp_long_double_bits 64
-#endif
-
-#endif
-
-
-
diff --git a/libstdc++-v3/config/cpu/s390/cpu_limits.h b/libstdc++-v3/config/cpu/s390/cpu_limits.h
deleted file mode 100644
index f0ff04dedaa..00000000000
--- a/libstdc++-v3/config/cpu/s390/cpu_limits.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_double_bits 64
-
-#endif
diff --git a/libstdc++-v3/config/cpu/sparc/sparc32/atomicity.h b/libstdc++-v3/config/cpu/sparc/atomicity.h
index aa639e42efb..23804db00b7 100644
--- a/libstdc++-v3/config/cpu/sparc/sparc32/atomicity.h
+++ b/libstdc++-v3/config/cpu/sparc/atomicity.h
@@ -1,6 +1,6 @@
-// Low-level functions for atomic operations: Sparc32 version -*- C++ -*-
+// Low-level functions for atomic operations: Sparc version -*- C++ -*-
-// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -30,6 +30,47 @@
#ifndef _BITS_ATOMICITY_H
#define _BITS_ATOMICITY_H 1
+#ifdef __arch64__
+
+typedef long _Atomic_word;
+
+static inline _Atomic_word
+__attribute__ ((__unused__))
+__exchange_and_add (volatile _Atomic_word *__mem, int __val)
+{
+ _Atomic_word __tmp1, __tmp2;
+
+ __asm__ __volatile__("1: ldx [%2], %0\n\t"
+ " add %0, %3, %1\n\t"
+ " casx [%2], %0, %1\n\t"
+ " sub %0, %1, %0\n\t"
+ " brnz,pn %0, 1b\n\t"
+ " nop"
+ : "=&r" (__tmp1), "=&r" (__tmp2)
+ : "r" (__mem), "r" (__val)
+ : "memory");
+ return __tmp2;
+}
+
+static inline void
+__attribute__ ((__unused__))
+__atomic_add (volatile _Atomic_word* __mem, int __val)
+{
+ _Atomic_word __tmp1, __tmp2;
+
+ __asm__ __volatile__("1: ldx [%2], %0\n\t"
+ " add %0, %3, %1\n\t"
+ " casx [%2], %0, %1\n\t"
+ " sub %0, %1, %0\n\t"
+ " brnz,pn %0, 1b\n\t"
+ " nop"
+ : "=&r" (__tmp1), "=&r" (__tmp2)
+ : "r" (__mem), "r" (__val)
+ : "memory");
+}
+
+#else /* __arch32__ */
+
typedef int _Atomic_word;
template <int __inst>
@@ -85,4 +126,6 @@ __atomic_add (volatile _Atomic_word* __mem, int __val)
: "memory");
}
+#endif /* __arch32__ */
+
#endif /* atomicity.h */
diff --git a/libstdc++-v3/config/cpu/sparc/sparc64/atomicity.h b/libstdc++-v3/config/cpu/sparc/sparc64/atomicity.h
deleted file mode 100644
index e13ca82fad2..00000000000
--- a/libstdc++-v3/config/cpu/sparc/sparc64/atomicity.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Low-level functions for atomic operations: Sparc64 version -*- C++ -*-
-
-// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _BITS_ATOMICITY_H
-#define _BITS_ATOMICITY_H 1
-
-typedef long _Atomic_word;
-
-static inline _Atomic_word
-__attribute__ ((__unused__))
-__exchange_and_add (volatile _Atomic_word *__mem, int __val)
-{
- _Atomic_word __tmp1, __tmp2;
-
- __asm__ __volatile__("1: ldx [%2], %0\n\t"
- " add %0, %3, %1\n\t"
- " casx [%2], %0, %1\n\t"
- " sub %0, %1, %0\n\t"
- " brnz,pn %0, 1b\n\t"
- " nop"
- : "=&r" (__tmp1), "=&r" (__tmp2)
- : "r" (__mem), "r" (__val)
- : "memory");
- return __tmp2;
-}
-
-static inline void
-__attribute__ ((__unused__))
-__atomic_add (volatile _Atomic_word* __mem, int __val)
-{
- _Atomic_word __tmp1, __tmp2;
-
- __asm__ __volatile__("1: ldx [%2], %0\n\t"
- " add %0, %3, %1\n\t"
- " casx [%2], %0, %1\n\t"
- " sub %0, %1, %0\n\t"
- " brnz,pn %0, 1b\n\t"
- " nop"
- : "=&r" (__tmp1), "=&r" (__tmp2)
- : "r" (__mem), "r" (__val)
- : "memory");
-}
-
-#endif /* atomicity.h */
diff --git a/libstdc++-v3/config/cpu/x86-64/cpu_limits.h b/libstdc++-v3/config/cpu/x86-64/cpu_limits.h
deleted file mode 100644
index 7de187e2080..00000000000
--- a/libstdc++-v3/config/cpu/x86-64/cpu_limits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_bits 64
-
-#define __glibcpp_long_double_bits 80
-
-#endif
diff --git a/libstdc++-v3/config/linker-map.gnu b/libstdc++-v3/config/linker-map.gnu
index d4346b1c660..9edcbb824d3 100644
--- a/libstdc++-v3/config/linker-map.gnu
+++ b/libstdc++-v3/config/linker-map.gnu
@@ -20,7 +20,6 @@
## Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
## USA.
-
GLIBCPP_3.2 {
global:
@@ -29,7 +28,28 @@ GLIBCPP_3.2 {
# All but the last are terminated with a semicolon.
extern "C++"
{
- std::[A-Za-z]*;
+ std::[A-Za-b]*;
+ std::c[a-n]*;
+ std::co[a-c]*;
+ std::codecvt_byname*;
+ std::codecvt::[A-Za-b]*;
+ std::codecvt::[A-Zd-z]*;
+ std::codecvt_c;
+ std::codecvt_w;
+ std::co[e-z]*;
+ std::c[p-z]*;
+ std::c_[a-z]*;
+ std::[A-Zd-k]*;
+ std::length_error*;
+ std::logic_error*;
+ std::locale::[A-Za-z]*;
+ std::locale::_[A-Ra-z]*;
+ std::locale::_S_classic;
+ std::locale::_S_global;
+ std::locale::_S_num_categories;
+ std::locale::_S_normalize_category*;
+ std::locale::_[T-Za-z]*;
+ std::[A-Zm-z]*;
std::__throw_*;
std::__basic_file*;
std::__num_base*;
@@ -42,6 +62,39 @@ GLIBCPP_3.2 {
};
# Names not in an 'extern' block are mangled names.
+
+ # std::locale destructors
+ _ZNSt6localeD*;
+
+ # std::codecvt<char> members.
+ _ZNKSt7codecvtIcc11__mbstate_tE*;
+ # std::codecvt<char>::~codecvt
+ _ZNSt7codecvtIcc11__mbstate_tED*;
+ # std::codecvt<char>::codecvt(size_t), where size_t variable.
+ _ZNSt7codecvtIcc11__mbstate_tEC1Ej;
+ _ZNSt7codecvtIcc11__mbstate_tEC2Ej;
+ _ZNSt7codecvtIcc11__mbstate_tEC1Em;
+ _ZNSt7codecvtIcc11__mbstate_tEC2Em;
+ # std::codecvt<char>::id
+ _ZNSt7codecvtIcc11__mbstate_tE2idE;
+
+ # std::codecvt<wchar_t> members.
+ _ZNKSt7codecvtIwc11__mbstate_tE*;
+ # std::codecvt<wchar_t>::~codecvt
+ _ZNSt7codecvtIwc11__mbstate_tED*;
+ # std::codecvt<wchar_t>::codecvt(size_t), where size_t variable.
+ _ZNSt7codecvtIwc11__mbstate_tEC1Ej;
+ _ZNSt7codecvtIwc11__mbstate_tEC2Ej;
+ _ZNSt7codecvtIwc11__mbstate_tEC1Em;
+ _ZNSt7codecvtIwc11__mbstate_tEC2Em;
+ # std::codecvt<wchar_t>::id
+ _ZNSt7codecvtIwc11__mbstate_tE2idE;
+
+ # std::use_facet<codecvt>
+ _ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale;
+ _ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale;
+
+ # std::has_facet*
_ZSt9has_facet*;
# operator new(unsigned)
@@ -72,8 +125,8 @@ GLIBCPP_3.2 {
# operator delete[](void*, std::nothrow_t const&)
_ZdaPvRKSt9nothrow_t;
- # vtable
- _ZTV*;
+ # vtable
+ _ZTV*;
_ZTT*;
# typeinfo
@@ -95,6 +148,15 @@ GLIBCPP_3.2 {
*;
};
+# Symbols added after GLIBCPP_3.2
+GLIBCPP_3.2.1 {
+
+ _ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structj;
+ _ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structj;
+ _ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structj;
+ _ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structj;
+
+} GLIBCPP_3.2;
# Symbols in the support library (libsupc++) have their own tag.
CXXABI_1.2 {
diff --git a/libstdc++-v3/config/cpu/mmix/cpu_limits.h b/libstdc++-v3/config/locale/generic/c++locale_internal.h
index e40ce97413a..fb263528bb0 100644
--- a/libstdc++-v3/config/cpu/mmix/cpu_limits.h
+++ b/libstdc++-v3/config/locale/generic/c++locale_internal.h
@@ -1,3 +1,5 @@
+// Locale internal implementation header -*- C++ -*-
+
// Copyright (C) 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -25,10 +27,4 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#ifndef _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_bits 64
-#define __glibcpp_long_double_bits 64
-
-#endif
+// The generic locale code doesn't need to do anything here (yet)
diff --git a/libstdc++-v3/config/locale/generic/c_locale.cc b/libstdc++-v3/config/locale/generic/c_locale.cc
index e274836fd90..689bbf592b9 100644
--- a/libstdc++-v3/config/locale/generic/c_locale.cc
+++ b/libstdc++-v3/config/locale/generic/c_locale.cc
@@ -223,4 +223,15 @@ namespace std
__c_locale
locale::facet::_S_clone_c_locale(__c_locale&)
{ return __c_locale(); }
+
+ const char* locale::_S_categories[_S_categories_size
+ + _S_extra_categories_size] =
+ {
+ "LC_CTYPE",
+ "LC_NUMERIC",
+ "LC_COLLATE",
+ "LC_TIME",
+ "LC_MONETARY",
+ "LC_MESSAGES"
+ };
} // namespace std
diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h
index 0fc9a250c02..9627d8646af 100644
--- a/libstdc++-v3/config/locale/generic/c_locale.h
+++ b/libstdc++-v3/config/locale/generic/c_locale.h
@@ -1,6 +1,6 @@
// Wrapper for underlying C-language localization -*- C++ -*-
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -35,7 +35,37 @@
#include <clocale>
+#define _GLIBCPP_NUM_CATEGORIES 0
+
namespace std
{
typedef int* __c_locale;
+
+ template<typename _Tv>
+ int
+ __convert_from_v(char* __out, const int __size, const char* __fmt,
+ _Tv __v, const __c_locale&, int __prec = -1)
+ {
+ char* __old = setlocale(LC_ALL, NULL);
+ char* __sav = static_cast<char*>(malloc(strlen(__old) + 1));
+ if (__sav)
+ strcpy(__sav, __old);
+ setlocale(LC_ALL, "C");
+
+ int __ret;
+#ifdef _GLIBCPP_USE_C99
+ if (__prec >= 0)
+ __ret = snprintf(__out, __size, __fmt, __prec, __v);
+ else
+ __ret = snprintf(__out, __size, __fmt, __v);
+#else
+ if (__prec >= 0)
+ __ret = sprintf(__out, __fmt, __prec, __v);
+ else
+ __ret = sprintf(__out, __fmt, __v);
+#endif
+ setlocale(LC_ALL, __sav);
+ free(__sav);
+ return __ret;
+ }
}
diff --git a/libstdc++-v3/config/locale/generic/codecvt_members.cc b/libstdc++-v3/config/locale/generic/codecvt_members.cc
new file mode 100644
index 00000000000..814b8a2874d
--- /dev/null
+++ b/libstdc++-v3/config/locale/generic/codecvt_members.cc
@@ -0,0 +1,101 @@
+// std::codecvt implementation details, generic version -*- C++ -*-
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file 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.
+
+//
+// ISO C++ 14882: 22.2.1.5 - Template class codecvt
+//
+
+// Written by Benjamin Kosnik <bkoz@redhat.com>
+
+#include <locale>
+#include "c++locale_internal.h"
+
+namespace std
+{
+ // Specializations.
+#ifdef _GLIBCPP_USE_WCHAR_T
+ codecvt_base::result
+ codecvt<wchar_t, char, mbstate_t>::
+ do_out(state_type& __state, const intern_type* __from,
+ const intern_type* __from_end, const intern_type*& __from_next,
+ extern_type* __to, extern_type* __to_end,
+ extern_type*& __to_next) const
+ {
+ result __ret = error;
+ size_t __len = min(__from_end - __from, __to_end - __to);
+ size_t __conv = wcsrtombs(__to, &__from, __len, &__state);
+
+ if (__conv == __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = ok;
+ }
+ else if (__conv > 0 && __conv < __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = partial;
+ }
+ else
+ __ret = error;
+
+ return __ret;
+ }
+
+ codecvt_base::result
+ codecvt<wchar_t, char, mbstate_t>::
+ do_in(state_type& __state, const extern_type* __from,
+ const extern_type* __from_end, const extern_type*& __from_next,
+ intern_type* __to, intern_type* __to_end,
+ intern_type*& __to_next) const
+ {
+ result __ret = error;
+ size_t __len = min(__from_end - __from, __to_end - __to);
+ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state);
+
+ if (__conv == __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = ok;
+ }
+ else if (__conv > 0 && __conv < __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = partial;
+ }
+ else
+ __ret = error;
+
+ return __ret;
+ }
+#endif
+}
diff --git a/libstdc++-v3/config/locale/generic/messages_members.cc b/libstdc++-v3/config/locale/generic/messages_members.cc
index 480ab88d824..f38f82beed2 100644
--- a/libstdc++-v3/config/locale/generic/messages_members.cc
+++ b/libstdc++-v3/config/locale/generic/messages_members.cc
@@ -42,4 +42,11 @@ namespace std
string
messages<char>::do_get(catalog, int, int, const string& __dfault) const
{ return __dfault; }
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ template<>
+ wstring
+ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
+ { return __dfault; }
+#endif
}
diff --git a/libstdc++-v3/config/locale/generic/time_members.cc b/libstdc++-v3/config/locale/generic/time_members.cc
index d02f0c3fa0e..fd45645a690 100644
--- a/libstdc++-v3/config/locale/generic/time_members.cc
+++ b/libstdc++-v3/config/locale/generic/time_members.cc
@@ -39,13 +39,6 @@
namespace std
{
template<>
- __timepunct<char>::~__timepunct()
- {
- if (_M_c_locale_timepunct != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_timepunct);
- }
-
- template<>
void
__timepunct<char>::
_M_put(char* __s, size_t __maxlen, const char* __format,
@@ -122,13 +115,6 @@ namespace std
#ifdef _GLIBCPP_USE_WCHAR_T
template<>
- __timepunct<wchar_t>::~__timepunct()
- {
- if (_M_c_locale_timepunct != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_timepunct);
- }
-
- template<>
void
__timepunct<wchar_t>::
_M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,
diff --git a/libstdc++-v3/config/cpu/alpha/cpu_limits.h b/libstdc++-v3/config/locale/gnu/c++locale_internal.h
index 21d31e3631a..cfb89b5dd70 100644
--- a/libstdc++-v3/config/cpu/alpha/cpu_limits.h
+++ b/libstdc++-v3/config/locale/gnu/c++locale_internal.h
@@ -1,4 +1,6 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -25,14 +27,33 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#ifndef _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_bits 64
-
-#define __glibcpp_long_double_bits 64
-
-#endif
-
-
-
+// Written by Jakub Jelinek <jakub@redhat.com>
+
+#include <clocale>
+
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+
+extern "C" __typeof(iswctype_l) __iswctype_l;
+extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
+extern "C" __typeof(strcoll_l) __strcoll_l;
+extern "C" __typeof(strftime_l) __strftime_l;
+extern "C" __typeof(strtod_l) __strtod_l;
+extern "C" __typeof(strtof_l) __strtof_l;
+extern "C" __typeof(strtold_l) __strtold_l;
+extern "C" __typeof(strtol_l) __strtol_l;
+extern "C" __typeof(strtoll_l) __strtoll_l;
+extern "C" __typeof(strtoul_l) __strtoul_l;
+extern "C" __typeof(strtoull_l) __strtoull_l;
+extern "C" __typeof(strxfrm_l) __strxfrm_l;
+extern "C" __typeof(towlower_l) __towlower_l;
+extern "C" __typeof(towupper_l) __towupper_l;
+extern "C" __typeof(wcscoll_l) __wcscoll_l;
+extern "C" __typeof(wcsftime_l) __wcsftime_l;
+extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
+extern "C" __typeof(wctype_l) __wctype_l;
+extern "C" __typeof(newlocale) __newlocale;
+extern "C" __typeof(freelocale) __freelocale;
+extern "C" __typeof(duplocale) __duplocale;
+extern "C" __typeof(uselocale) __uselocale;
+
+#endif // GLIBC 2.3 and later
diff --git a/libstdc++-v3/config/locale/gnu/c_locale.cc b/libstdc++-v3/config/locale/gnu/c_locale.cc
index 60ec54d76db..188f3a2f1c1 100644
--- a/libstdc++-v3/config/locale/gnu/c_locale.cc
+++ b/libstdc++-v3/config/locale/gnu/c_locale.cc
@@ -36,6 +36,7 @@
#include <locale>
#include <stdexcept>
#include <langinfo.h>
+#include "c++locale_internal.h"
namespace std
{
@@ -177,9 +178,29 @@ namespace std
void
locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
- { __freelocale(__cloc); }
+ {
+ if (_S_c_locale != __cloc)
+ __freelocale(__cloc);
+ }
__c_locale
locale::facet::_S_clone_c_locale(__c_locale& __cloc)
{ return __duplocale(__cloc); }
+
+ const char* locale::_S_categories[_S_categories_size
+ + _S_extra_categories_size] =
+ {
+ "LC_CTYPE",
+ "LC_NUMERIC",
+ "LC_COLLATE",
+ "LC_TIME",
+ "LC_MONETARY",
+ "LC_MESSAGES",
+ "LC_PAPER",
+ "LC_NAME",
+ "LC_ADDRESS",
+ "LC_TELEPHONE",
+ "LC_MEASUREMENT",
+ "LC_IDENTIFICATION"
+ };
} // namespace std
diff --git a/libstdc++-v3/config/locale/gnu/c_locale.h b/libstdc++-v3/config/locale/gnu/c_locale.h
index 3ce1781e23b..130b843d7f9 100644
--- a/libstdc++-v3/config/locale/gnu/c_locale.h
+++ b/libstdc++-v3/config/locale/gnu/c_locale.h
@@ -1,6 +1,6 @@
// Wrapper for underlying C-language localization -*- C++ -*-
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -40,7 +40,55 @@
#define _GLIBCPP_C_LOCALE_GNU 1
+#define _GLIBCPP_NUM_CATEGORIES 6
+
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+namespace __gnu_cxx
+{
+ extern "C" __typeof(uselocale) __uselocale;
+}
+#endif
+
namespace std
{
typedef __locale_t __c_locale;
+
+ template<typename _Tv>
+ int
+ __convert_from_v(char* __out, const int __size, const char* __fmt,
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ _Tv __v, const __c_locale& __cloc, int __prec = -1)
+ {
+ __c_locale __old = __gnu_cxx::__uselocale(__cloc);
+#else
+ _Tv __v, const __c_locale&, int __prec = -1)
+ {
+ char* __old = setlocale(LC_ALL, NULL);
+ char* __sav = static_cast<char*>(malloc(strlen(__old) + 1));
+ if (__sav)
+ strcpy(__sav, __old);
+ setlocale(LC_ALL, "C");
+#endif
+
+ int __ret;
+#ifdef _GLIBCPP_USE_C99
+ if (__prec >= 0)
+ __ret = snprintf(__out, __size, __fmt, __prec, __v);
+ else
+ __ret = snprintf(__out, __size, __fmt, __v);
+#else
+ if (__prec >= 0)
+ __ret = sprintf(__out, __fmt, __prec, __v);
+ else
+ __ret = sprintf(__out, __fmt, __v);
+#endif
+
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __gnu_cxx::__uselocale(__old);
+#else
+ setlocale(LC_ALL, __sav);
+ free(__sav);
+#endif
+ return __ret;
+ }
}
diff --git a/libstdc++-v3/config/locale/gnu/codecvt_members.cc b/libstdc++-v3/config/locale/gnu/codecvt_members.cc
new file mode 100644
index 00000000000..aa855a6a1f2
--- /dev/null
+++ b/libstdc++-v3/config/locale/gnu/codecvt_members.cc
@@ -0,0 +1,113 @@
+// std::codecvt implementation details, GNU version -*- C++ -*-
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file 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.
+
+//
+// ISO C++ 14882: 22.2.1.5 - Template class codecvt
+//
+
+// Written by Benjamin Kosnik <bkoz@redhat.com>
+
+#include <locale>
+#include "c++locale_internal.h"
+
+namespace std
+{
+ // Specializations.
+#ifdef _GLIBCPP_USE_WCHAR_T
+ codecvt_base::result
+ codecvt<wchar_t, char, mbstate_t>::
+ do_out(state_type& __state, const intern_type* __from,
+ const intern_type* __from_end, const intern_type*& __from_next,
+ extern_type* __to, extern_type* __to_end,
+ extern_type*& __to_next) const
+ {
+ result __ret = error;
+ size_t __len = min(__from_end - __from, __to_end - __to);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
+#endif
+ size_t __conv = wcsrtombs(__to, &__from, __len, &__state);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
+
+ if (__conv == __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = ok;
+ }
+ else if (__conv > 0 && __conv < __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = partial;
+ }
+ else
+ __ret = error;
+
+ return __ret;
+ }
+
+ codecvt_base::result
+ codecvt<wchar_t, char, mbstate_t>::
+ do_in(state_type& __state, const extern_type* __from,
+ const extern_type* __from_end, const extern_type*& __from_next,
+ intern_type* __to, intern_type* __to_end,
+ intern_type*& __to_next) const
+ {
+ result __ret = error;
+ size_t __len = min(__from_end - __from, __to_end - __to);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
+#endif
+ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
+
+ if (__conv == __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = ok;
+ }
+ else if (__conv > 0 && __conv < __len)
+ {
+ __from_next = __from;
+ __to_next = __to + __conv;
+ __ret = partial;
+ }
+ else
+ __ret = error;
+
+ return __ret;
+ }
+#endif
+}
diff --git a/libstdc++-v3/config/locale/gnu/collate_members.cc b/libstdc++-v3/config/locale/gnu/collate_members.cc
index 3b55f6985c6..97ff0c557b0 100644
--- a/libstdc++-v3/config/locale/gnu/collate_members.cc
+++ b/libstdc++-v3/config/locale/gnu/collate_members.cc
@@ -1,6 +1,6 @@
// std::collate implementation details, GNU version -*- C++ -*-
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -34,6 +34,7 @@
// Written by Benjamin Kosnik <bkoz@redhat.com>
#include <locale>
+#include "c++locale_internal.h"
namespace std
{
diff --git a/libstdc++-v3/config/locale/gnu/ctype_members.cc b/libstdc++-v3/config/locale/gnu/ctype_members.cc
index de83683934a..3b78c60405a 100644
--- a/libstdc++-v3/config/locale/gnu/ctype_members.cc
+++ b/libstdc++-v3/config/locale/gnu/ctype_members.cc
@@ -34,6 +34,7 @@
// Written by Benjamin Kosnik <bkoz@redhat.com>
#include <locale>
+#include "c++locale_internal.h"
namespace std
{
@@ -43,8 +44,7 @@ namespace std
ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
: ctype<char>(0, false, __refs)
{
- if (_M_c_locale_ctype != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_ctype);
+ _S_destroy_c_locale(_M_c_locale_ctype);
_S_create_c_locale(_M_c_locale_ctype, __s);
_M_toupper = _M_c_locale_ctype->__ctype_toupper;
_M_tolower = _M_c_locale_ctype->__ctype_tolower;
@@ -165,15 +165,30 @@ namespace std
wchar_t
ctype<wchar_t>::
do_widen(char __c) const
- { return btowc(__c); }
-
+ {
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_ctype);
+#endif
+ wchar_t __ret = btowc(__c);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
+ return __ret;
+ }
+
const char*
ctype<wchar_t>::
do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
{
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_ctype);
+#endif
mbstate_t __state;
memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t));
mbsrtowcs(__dest, &__lo, __hi - __lo, &__state);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
return __hi;
}
@@ -181,7 +196,13 @@ namespace std
ctype<wchar_t>::
do_narrow(wchar_t __wc, char __dfault) const
{
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_ctype);
+#endif
int __c = wctob(__wc);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
return (__c == EOF ? __dfault : static_cast<char>(__c));
}
@@ -190,6 +211,9 @@ namespace std
do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,
char* __dest) const
{
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_ctype);
+#endif
size_t __offset = 0;
while (true)
{
@@ -207,6 +231,9 @@ namespace std
else
break;
}
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
return __hi;
}
#endif // _GLIBCPP_USE_WCHAR_T
diff --git a/libstdc++-v3/config/locale/gnu/messages_members.cc b/libstdc++-v3/config/locale/gnu/messages_members.cc
index 2717c6b55e1..54a3c8fa9f6 100644
--- a/libstdc++-v3/config/locale/gnu/messages_members.cc
+++ b/libstdc++-v3/config/locale/gnu/messages_members.cc
@@ -34,6 +34,7 @@
// Written by Benjamin Kosnik <bkoz@redhat.com>
#include <locale>
+#include "c++locale_internal.h"
namespace std
{
@@ -56,4 +57,25 @@ namespace std
return string(__msg);
#endif
}
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ template<>
+ wstring
+ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
+ {
+# if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_messages);
+ char* __msg = gettext(_M_convert_to_char(__dfault));
+ __uselocale(__old);
+ return _M_convert_from_char(__msg);
+# else
+ char* __old = strdup(setlocale(LC_ALL, NULL));
+ setlocale(LC_ALL, _M_name_messages);
+ char* __msg = gettext(_M_convert_to_char(__dfault));
+ setlocale(LC_ALL, __old);
+ free(__old);
+ return _M_convert_from_char(__msg);
+# endif
+ }
+#endif
}
diff --git a/libstdc++-v3/config/locale/gnu/messages_members.h b/libstdc++-v3/config/locale/gnu/messages_members.h
index 11bfcb50440..68a2ea39531 100644
--- a/libstdc++-v3/config/locale/gnu/messages_members.h
+++ b/libstdc++-v3/config/locale/gnu/messages_members.h
@@ -55,26 +55,6 @@
}
template<typename _CharT>
- typename messages<_CharT>::string_type
- messages<_CharT>::do_get(catalog, int, int,
- const string_type& __dfault) const
- {
-#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
- __c_locale __old = __uselocale(_M_c_locale_messages);
- char* __msg = gettext(_M_convert_to_char(__dfault));
- __uselocale(__old);
- return _M_convert_from_char(__msg);
-#else
- char* __old = strdup(setlocale(LC_ALL, NULL));
- setlocale(LC_ALL, _M_name_messages);
- char* __msg = gettext(_M_convert_to_char(__dfault));
- setlocale(LC_ALL, __old);
- free(__old);
- return _M_convert_from_char(__msg);
-#endif
- }
-
- template<typename _CharT>
void
messages<_CharT>::do_close(catalog) const
{ }
diff --git a/libstdc++-v3/config/locale/gnu/monetary_members.cc b/libstdc++-v3/config/locale/gnu/monetary_members.cc
index 6a797ffbc25..0386ab6dc54 100644
--- a/libstdc++-v3/config/locale/gnu/monetary_members.cc
+++ b/libstdc++-v3/config/locale/gnu/monetary_members.cc
@@ -34,6 +34,7 @@
// Written by Benjamin Kosnik <bkoz@redhat.com>
#include <locale>
+#include "c++locale_internal.h"
namespace std
{
@@ -219,7 +220,7 @@ namespace std
moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc,
const char*)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
_M_decimal_point = '.';
@@ -264,7 +265,7 @@ namespace std
moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc,
const char*)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
_M_decimal_point = '.';
@@ -318,7 +319,7 @@ namespace std
moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc,
const char* __name)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
_M_decimal_point = L'.';
@@ -334,23 +335,25 @@ namespace std
else
{
// Named locale.
- // XXX Fix me. Switch to named locale so that mbsrtowcs will work.
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(__cloc);
+#else
+ // Switch to named locale so that mbsrtowcs will work.
char* __old = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, __name);
+#endif
_M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w);
_M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w);
_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
- mbstate_t __state;
- size_t __len;
const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
- // NB: Should swich to __cloc's ctype info first.
- __len = strlen(__cpossign);
+ mbstate_t __state;
+ size_t __len = strlen(__cpossign);
if (__len)
{
++__len;
@@ -399,9 +402,12 @@ namespace std
char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn);
- // XXX
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#else
setlocale(LC_ALL, __old);
free(__old);
+#endif
}
}
@@ -410,7 +416,7 @@ namespace std
moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
const char* __name)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
_M_decimal_point = L'.';
@@ -426,21 +432,24 @@ namespace std
else
{
// Named locale.
- // XXX Fix me. Switch to named locale so that mbsrtowcs will work.
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(__cloc);
+#else
+ // Switch to named locale so that mbsrtowcs will work.
char* __old = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, __name);
+#endif
_M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w);
_M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w);
_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
- mbstate_t __state;
- size_t __len;
const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
- // NB: Should swich to __cloc's ctype info first.
+ mbstate_t __state;
+ size_t __len;
__len = strlen(__cpossign);
if (__len)
{
@@ -490,9 +499,12 @@ namespace std
char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn);
- // XXX
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#else
setlocale(LC_ALL, __old);
free(__old);
+#endif
}
}
diff --git a/libstdc++-v3/config/locale/gnu/numeric_members.cc b/libstdc++-v3/config/locale/gnu/numeric_members.cc
index 4806435a50f..a502bfb2150 100644
--- a/libstdc++-v3/config/locale/gnu/numeric_members.cc
+++ b/libstdc++-v3/config/locale/gnu/numeric_members.cc
@@ -34,6 +34,7 @@
// Written by Benjamin Kosnik <bkoz@redhat.com>
#include <locale>
+#include "c++locale_internal.h"
namespace std
{
@@ -41,7 +42,7 @@ namespace std
void
numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
_M_decimal_point = '.';
@@ -75,7 +76,7 @@ namespace std
void
numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
_M_decimal_point = L'.';
diff --git a/libstdc++-v3/config/locale/gnu/time_members.cc b/libstdc++-v3/config/locale/gnu/time_members.cc
index ad71931056a..7df10b8ab71 100644
--- a/libstdc++-v3/config/locale/gnu/time_members.cc
+++ b/libstdc++-v3/config/locale/gnu/time_members.cc
@@ -35,24 +35,18 @@
// Written by Benjamin Kosnik <bkoz@redhat.com>
#include <locale>
+#include "c++locale_internal.h"
namespace std
{
template<>
- __timepunct<char>::~__timepunct()
- {
- if (_M_c_locale_timepunct != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_timepunct);
- }
-
- template<>
void
__timepunct<char>::
_M_put(char* __s, size_t __maxlen, const char* __format,
const tm* __tm) const
{
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
- __strftime_l(__s, __maxlen, _M_c_locale_timepunct, __format, __tm);
+ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
#else
char* __old = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, _M_name_timepunct);
@@ -66,9 +60,11 @@ namespace std
void
__timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
+ _M_c_locale_timepunct = _S_c_locale;
+
_M_date_format = "%m/%d/%y";
_M_date_era_format = "%m/%d/%y";
_M_time_format = "%H:%M:%S";
@@ -189,20 +185,13 @@ namespace std
#ifdef _GLIBCPP_USE_WCHAR_T
template<>
- __timepunct<wchar_t>::~__timepunct()
- {
- if (_M_c_locale_timepunct != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_timepunct);
- }
-
- template<>
void
__timepunct<wchar_t>::
_M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,
const tm* __tm) const
{
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
- __wcsftime_l(__s, __maxlen, _M_c_locale_timepunct, __format, __tm);
+ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
#else
char* __old = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, _M_name_timepunct);
@@ -216,9 +205,11 @@ namespace std
void
__timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
{
- if (__cloc == _S_c_locale)
+ if (!__cloc)
{
// "C" locale
+ _M_c_locale_timepunct = _S_c_locale;
+
_M_date_format = L"%m/%d/%y";
_M_date_era_format = L"%m/%d/%y";
_M_time_format = L"%H:%M:%S";
diff --git a/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc
index 0f667d6a4d0..aaf07a2342e 100644
--- a/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc
@@ -46,4 +46,16 @@ namespace std
nl_catd __nlc = reinterpret_cast<nl_catd>(__c);
return string(catgets(__nlc, __setid, __msgid, __dfault.c_str()));
}
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ template<>
+ wstring
+ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
+ {
+ nl_catd __nlc = reinterpret_cast<nl_catd>(__c);
+ char* __msg = catgets(__nlc, __setid, __msgid,
+ _M_convert_to_char(__dfault));
+ return _M_convert_from_char(__msg);
+ }
+#endif
}
diff --git a/libstdc++-v3/config/os/aix/os_defines.h b/libstdc++-v3/config/os/aix/os_defines.h
index 6a658a1a53f..6e4dbda3256 100644
--- a/libstdc++-v3/config/os/aix/os_defines.h
+++ b/libstdc++-v3/config/os/aix/os_defines.h
@@ -1,6 +1,6 @@
// Specific definitions for AIX -*- C++ -*-
-// Copyright (C) 2000 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -55,13 +55,4 @@
#undef _G_USING_THUNKS
#define _G_USING_THUNKS 0
-#if !defined(_AIX51) || !defined(__64BIT__)
-#define __glibcpp_wchar_t_bits 16
-#define __glibcpp_wchar_t_is_signed false
-#endif
-
-#ifdef __64BIT__
-#define __glibcpp_long_bits 64
-#endif
-
#endif
diff --git a/libstdc++-v3/config/os/bsd/freebsd/os_defines.h b/libstdc++-v3/config/os/bsd/freebsd/os_defines.h
index cfc917f5873..b898c1ce252 100644
--- a/libstdc++-v3/config/os/bsd/freebsd/os_defines.h
+++ b/libstdc++-v3/config/os/bsd/freebsd/os_defines.h
@@ -1,6 +1,6 @@
// Specific definitions for BSD -*- C++ -*-
-// Copyright (C) 2000 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -34,6 +34,4 @@
// System-specific #define, typedefs, corrections, etc, go here. This
// file will come before all others.
-#define __glibcpp_long_double_bits __glibcpp_double_bits
-
#endif
diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_base.h b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
index 50a5f797a4c..a431f971c9b 100644
--- a/libstdc++-v3/config/os/gnu-linux/ctype_base.h
+++ b/libstdc++-v3/config/os/gnu-linux/ctype_base.h
@@ -1,6 +1,6 @@
// Locale support -*- C++ -*-
-// Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -33,20 +33,6 @@
// Information as gleaned from /usr/include/ctype.h
-#if _GLIBCPP_USE_SHADOW_HEADERS
- using _C_legacy::_ISspace;
- using _C_legacy::_ISprint;
- using _C_legacy::_IScntrl;
- using _C_legacy::_ISupper;
- using _C_legacy::_ISlower;
- using _C_legacy::_ISalpha;
- using _C_legacy::_ISdigit;
- using _C_legacy::_ISpunct;
- using _C_legacy::_ISxdigit;
- using _C_legacy::_ISalnum;
- using _C_legacy::_ISgraph;
-#endif
-
struct ctype_base
{
// Non-standard typedefs.
diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h b/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
index ee70ab46c3b..8f06d1397ee 100644
--- a/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
+++ b/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
@@ -34,16 +34,31 @@
// Information as gleaned from /usr/include/ctype.h
-#if _GLIBCPP_USE_SHADOW_HEADERS
- using _C_legacy::__ctype_toupper;
- using _C_legacy::__ctype_tolower;
- using _C_legacy::__ctype_b;
-#endif
-
+#if _GLIBCPP_C_LOCALE_GNU
const ctype_base::mask*
ctype<char>::classic_table() throw()
- { return __ctype_b; }
-
+ {
+ locale::classic();
+ return _S_c_locale->__ctype_b;
+ }
+#else
+ const ctype_base::mask*
+ ctype<char>::classic_table() throw()
+ {
+ const ctype_base::mask* __ret;
+ char* __old = strdup(setlocale(LC_CTYPE, NULL));
+ setlocale(LC_CTYPE, "C");
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __ret = *__ctype_b_loc();
+#else
+ __ret = __ctype_b;
+#endif
+ setlocale(LC_CTYPE, __old);
+ free(__old);
+ return __ret;
+ }
+#endif
+
#if _GLIBCPP_C_LOCALE_GNU
ctype<char>::ctype(__c_locale __cloc, const mask* __table, bool __del,
size_t __refs)
@@ -57,17 +72,54 @@
#else
ctype<char>::ctype(__c_locale, const mask* __table, bool __del,
size_t __refs)
- : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
- _M_toupper(__ctype_toupper), _M_tolower(__ctype_tolower),
- _M_table(__table ? __table : classic_table())
- { _M_c_locale_ctype = _S_c_locale; }
+ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del)
+ {
+ char* __old=strdup(setlocale(LC_CTYPE, NULL));
+ setlocale(LC_CTYPE, "C");
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ _M_toupper = *__ctype_toupper_loc();
+ _M_tolower = *__ctype_tolower_loc();
+ _M_table = __table ? __table : *__ctype_b_loc();
+#else
+ _M_toupper = __ctype_toupper;
+ _M_tolower = __ctype_tolower;
+ _M_table = __table ? __table : __ctype_b;
+#endif
+ setlocale(LC_CTYPE, __old);
+ free(__old);
+ _M_c_locale_ctype = _S_c_locale;
+ }
#endif
+#if _GLIBCPP_C_LOCALE_GNU
+ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) :
+ __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del)
+ {
+ _M_c_locale_ctype = _S_c_locale;
+ _M_toupper = _M_c_locale_ctype->__ctype_toupper;
+ _M_tolower = _M_c_locale_ctype->__ctype_tolower;
+ _M_table = __table ? __table : _M_c_locale_ctype->__ctype_b;
+ }
+#else
ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) :
- __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del),
- _M_toupper(__ctype_toupper), _M_tolower(__ctype_tolower),
- _M_table(__table ? __table : classic_table())
- { _M_c_locale_ctype = _S_c_locale; }
+ __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del)
+ {
+ char* __old=strdup(setlocale(LC_CTYPE, NULL));
+ setlocale(LC_CTYPE, "C");
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ _M_toupper = *__ctype_toupper_loc();
+ _M_tolower = *__ctype_tolower_loc();
+ _M_table = __table ? __table : *__ctype_b_loc();
+#else
+ _M_toupper = __ctype_toupper;
+ _M_tolower = __ctype_tolower;
+ _M_table = __table ? __table : __ctype_b;
+#endif
+ setlocale(LC_CTYPE, __old);
+ free(__old);
+ _M_c_locale_ctype = _S_c_locale;
+ }
+#endif
char
ctype<char>::do_toupper(char __c) const
diff --git a/libstdc++-v3/config/os/gnu-linux/os_defines.h b/libstdc++-v3/config/os/gnu-linux/os_defines.h
index 4405660f0e4..21ea29693a6 100644
--- a/libstdc++-v3/config/os/gnu-linux/os_defines.h
+++ b/libstdc++-v3/config/os/gnu-linux/os_defines.h
@@ -1,6 +1,6 @@
// Specific definitions for GNU/Linux -*- C++ -*-
-// Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -65,12 +65,4 @@ typedef __loff_t __off64_t;
#define __NO_STRING_INLINES
#endif
-#if (defined(__hppa__) && defined(__LP64__)) || defined(__powerpc64__) || defined(__s390x__) || (defined(__sparc__) && defined(__arch64__))
-#define __glibcpp_long_bits 64
-#endif
-
-#if defined(__hppa__) || (defined(__sparc__) && !defined(__arch64__))
-#define __glibcpp_long_double_bits 64
-#endif
-
#endif
diff --git a/libstdc++-v3/config/os/hpux/cpu_limits.h b/libstdc++-v3/config/os/hpux/cpu_limits.h
deleted file mode 100644
index 1c2829546bb..00000000000
--- a/libstdc++-v3/config/os/hpux/cpu_limits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#ifdef __LP64__
-#define __glibcpp_long_bits 64
-#endif
-
-#endif
diff --git a/libstdc++-v3/config/os/hpux/os_defines.h b/libstdc++-v3/config/os/hpux/os_defines.h
index 0b28bb215d4..5deef5f9edb 100644
--- a/libstdc++-v3/config/os/hpux/os_defines.h
+++ b/libstdc++-v3/config/os/hpux/os_defines.h
@@ -37,8 +37,6 @@
#define __off64_t off64_t
#define __ssize_t ssize_t
-#define __glibcpp_wchar_t_is_signed false
-
// Use macro form of ctype functions to ensure __SB_masks is defined.
#define _SB_CTYPE_MACROS 1
diff --git a/libstdc++-v3/config/os/irix/irix5.2/os_defines.h b/libstdc++-v3/config/os/irix/irix5.2/os_defines.h
index 32055ec6d67..1d7f96848ee 100644
--- a/libstdc++-v3/config/os/irix/irix5.2/os_defines.h
+++ b/libstdc++-v3/config/os/irix/irix5.2/os_defines.h
@@ -51,11 +51,5 @@
// GCC does not use thunks on IRIX.
#define _G_USING_THUNKS 0
-#define __glibcpp_long_double_bits 64
-
-#if __LONG_MAX__ > 2147483647
-#define __glibcpp_long_bits 64
-#endif
-
#endif
diff --git a/libstdc++-v3/config/os/irix/irix6.5/os_defines.h b/libstdc++-v3/config/os/irix/irix6.5/os_defines.h
index e8f1dcc82d2..838b747e2ab 100644
--- a/libstdc++-v3/config/os/irix/irix6.5/os_defines.h
+++ b/libstdc++-v3/config/os/irix/irix6.5/os_defines.h
@@ -1,6 +1,6 @@
// Specific definitions for IRIX -*- C++ -*-
-// Copyright (C) 2000 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -51,12 +51,5 @@
// GCC does not use thunks on IRIX.
#define _G_USING_THUNKS 0
-#define __glibcpp_long_double_bits 64
-
-#if __LONG_MAX__ > 2147483647
-#define __glibcpp_wchar_t_bits 64
-#define __glibcpp_long_bits 64
-#endif
-
#endif
diff --git a/libstdc++-v3/config/os/osf/osf5.0/cpu_limits.h b/libstdc++-v3/config/os/osf/osf5.0/cpu_limits.h
deleted file mode 100644
index d74b15c9a9a..00000000000
--- a/libstdc++-v3/config/os/osf/osf5.0/cpu_limits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _GLIBCPP_CPU_LIMITS
-#define _GLIBCPP_CPU_LIMITS 1
-
-#define __glibcpp_long_bits 64
-
-#define __glibcpp_long_double_bits 128
-
-#endif
diff --git a/libstdc++-v3/config/os/solaris/solaris2.7/os_defines.h b/libstdc++-v3/config/os/solaris/solaris2.7/os_defines.h
index 2f21fd4e89a..cf53fa46908 100644
--- a/libstdc++-v3/config/os/solaris/solaris2.7/os_defines.h
+++ b/libstdc++-v3/config/os/solaris/solaris2.7/os_defines.h
@@ -39,9 +39,5 @@
#define __off64_t off64_t
#define __ssize_t ssize_t
-#if defined(__sparcv9) || defined(__arch64__)
-#define __glibcpp_long_bits 64
-#endif
-
#endif
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index aa86ebaa763..04ff41f984b 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -823,9 +823,6 @@ echo "$ac_t""$ac_cv_mingw32" 1>&6
MINGW32=
test "$ac_cv_mingw32" = yes && MINGW32=yes
-
-#possibly test for the presence of the compiler sources here?
-
# Export build and source directories.
# These need to be absolute paths, yet at the same time need to
# canonicalize only relative paths, because then amd will not unmount
@@ -840,12 +837,12 @@ test "$ac_cv_mingw32" = yes && MINGW32=yes
- for ac_prog in gawk mawk nawk awk
+ for ac_prog in mawk gawk nawk awk
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:849: checking for $ac_word" >&5
+echo "configure:846: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -879,7 +876,7 @@ done
# force a particular method.
#ac_cv_prog_LN_S='cp -p'
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:883: checking whether ln -s works" >&5
+echo "configure:880: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -936,7 +933,7 @@ fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:940: checking for $ac_word" >&5
+echo "configure:937: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -966,7 +963,7 @@ fi
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:970: checking for $ac_word" >&5
+echo "configure:967: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1015,7 +1012,7 @@ fi
fi
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1019: checking whether we are using GNU C" >&5
+echo "configure:1016: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1024,7 +1021,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1028: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1025: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -1039,7 +1036,7 @@ echo "$ac_t""$ac_cv_prog_gcc" 1>&6
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1043: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1040: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1082,7 +1079,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1086: checking for $ac_word" >&5
+echo "configure:1083: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_glibcpp_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1117,7 +1114,7 @@ test -n "$glibcpp_CXX" || glibcpp_CXX="gcc"
test -z "$glibcpp_CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; }
echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
-echo "configure:1121: checking whether we are using GNU C++" >&5
+echo "configure:1118: checking whether we are using GNU C++" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1126,7 +1123,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1130: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1127: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gxx=yes
else
ac_cv_prog_gxx=no
@@ -1141,7 +1138,7 @@ echo "$ac_t""$ac_cv_prog_gxx" 1>&6
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=
echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
-echo "configure:1145: checking whether ${CXX-g++} accepts -g" >&5
+echo "configure:1142: checking whether ${CXX-g++} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1171,14 +1168,14 @@ echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
# For directory versioning (e.g., headers) and other variables.
echo $ac_n "checking for GCC version number""... $ac_c" 1>&6
-echo "configure:1175: checking for GCC version number" >&5
+echo "configure:1172: checking for GCC version number" >&5
gcc_version=`$glibcpp_CXX -dumpversion`
echo "$ac_t""$gcc_version" 1>&6
# For some reason, gettext needs this.
echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
-echo "configure:1182: checking for strerror in -lcposix" >&5
+echo "configure:1179: checking for strerror in -lcposix" >&5
ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1186,7 +1183,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lcposix $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1190 "configure"
+#line 1187 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1197,7 +1194,7 @@ int main() {
strerror()
; return 0; }
EOF
-if { (eval echo configure:1201: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1223,7 +1220,7 @@ fi
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1227: checking for $ac_word" >&5
+echo "configure:1224: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1255,7 +1252,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1259: checking for $ac_word" >&5
+echo "configure:1256: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1287,7 +1284,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1291: checking for $ac_word" >&5
+echo "configure:1288: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1319,7 +1316,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1323: checking for $ac_word" >&5
+echo "configure:1320: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1363,7 +1360,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1367: checking for a BSD compatible install" >&5
+echo "configure:1364: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1417,7 +1414,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:1421: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:1418: checking whether to enable maintainer-specific portions of Makefiles" >&5
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
@@ -1455,7 +1452,7 @@ fi
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1459: checking for executable suffix" >&5
+echo "configure:1456: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1465,10 +1462,10 @@ else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
- if { (eval echo configure:1469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ if { (eval echo configure:1466: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
- *.c | *.o | *.obj) ;;
+ *.$ac_ext | *.c | *.o | *.obj) ;;
*) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
esac
done
@@ -1502,7 +1499,7 @@ ac_exeext=$EXEEXT
echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:1506: checking whether build environment is sane" >&5
+echo "configure:1503: checking whether build environment is sane" >&5
# Just in case
sleep 1
echo timestamp > conftestfile
@@ -1559,7 +1556,7 @@ test "$program_suffix" != NONE &&
test "$program_transform_name" = "" && program_transform_name="s,x,x,"
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1563: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1560: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1605,7 +1602,7 @@ EOF
missing_dir=`cd $ac_aux_dir && pwd`
echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:1609: checking for working aclocal" >&5
+echo "configure:1606: checking for working aclocal" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1618,7 +1615,7 @@ else
fi
echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:1622: checking for working autoconf" >&5
+echo "configure:1619: checking for working autoconf" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1631,7 +1628,7 @@ else
fi
echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:1635: checking for working automake" >&5
+echo "configure:1632: checking for working automake" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1644,7 +1641,7 @@ else
fi
echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:1648: checking for working autoheader" >&5
+echo "configure:1645: checking for working autoheader" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1657,7 +1654,7 @@ else
fi
echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:1661: checking for working makeinfo" >&5
+echo "configure:1658: checking for working makeinfo" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1756,7 +1753,7 @@ ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:1760: checking for ld used by GCC" >&5
+echo "configure:1757: checking for ld used by GCC" >&5
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
@@ -1786,10 +1783,10 @@ echo "configure:1760: checking for ld used by GCC" >&5
esac
elif test "$with_gnu_ld" = yes; then
echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:1790: checking for GNU ld" >&5
+echo "configure:1787: checking for GNU ld" >&5
else
echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-echo "configure:1793: checking for non-GNU ld" >&5
+echo "configure:1790: checking for non-GNU ld" >&5
fi
if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1824,7 +1821,7 @@ else
fi
test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
-echo "configure:1828: checking if the linker ($LD) is GNU ld" >&5
+echo "configure:1825: checking if the linker ($LD) is GNU ld" >&5
if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1841,7 +1838,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
-echo "configure:1845: checking for $LD option to reload object files" >&5
+echo "configure:1842: checking for $LD option to reload object files" >&5
if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1853,7 +1850,7 @@ reload_flag=$lt_cv_ld_reload_flag
test -n "$reload_flag" && reload_flag=" $reload_flag"
echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
-echo "configure:1857: checking for BSD-compatible nm" >&5
+echo "configure:1854: checking for BSD-compatible nm" >&5
if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1891,7 +1888,7 @@ NM="$lt_cv_path_NM"
echo "$ac_t""$NM" 1>&6
echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
-echo "configure:1895: checking how to recognise dependant libraries" >&5
+echo "configure:1892: checking how to recognise dependant libraries" >&5
if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2064,13 +2061,13 @@ file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
echo $ac_n "checking for object suffix""... $ac_c" 1>&6
-echo "configure:2068: checking for object suffix" >&5
+echo "configure:2065: checking for object suffix" >&5
if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
rm -f conftest*
echo 'int i = 1;' > conftest.$ac_ext
-if { (eval echo configure:2074: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2071: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
for ac_file in conftest.*; do
case $ac_file in
*.c) ;;
@@ -2094,7 +2091,7 @@ case $deplibs_check_method in
file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
-echo "configure:2098: checking for ${ac_tool_prefix}file" >&5
+echo "configure:2095: checking for ${ac_tool_prefix}file" >&5
if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2156,7 +2153,7 @@ fi
if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
echo $ac_n "checking for file""... $ac_c" 1>&6
-echo "configure:2160: checking for file" >&5
+echo "configure:2157: checking for file" >&5
if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2227,7 +2224,7 @@ esac
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2231: checking for $ac_word" >&5
+echo "configure:2228: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2259,7 +2256,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2263: checking for $ac_word" >&5
+echo "configure:2260: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2294,7 +2291,7 @@ fi
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2298: checking for $ac_word" >&5
+echo "configure:2295: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2326,7 +2323,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2330: checking for $ac_word" >&5
+echo "configure:2327: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2393,8 +2390,8 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 2397 "configure"' > conftest.$ac_ext
- if { (eval echo configure:2398: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ echo '#line 2394 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:2395: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
@@ -2413,7 +2410,7 @@ case $host in
ia64-*-hpux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
- if { (eval echo configure:2417: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ if { (eval echo configure:2414: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
case "`/usr/bin/file conftest.o`" in
*ELF-32*)
HPUX_IA64_MODE="32"
@@ -2431,7 +2428,7 @@ ia64-*-hpux*)
SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -belf"
echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
-echo "configure:2435: checking whether the C compiler needs -belf" >&5
+echo "configure:2432: checking whether the C compiler needs -belf" >&5
if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2444,14 +2441,14 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
-#line 2448 "configure"
+#line 2445 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:2455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
lt_cv_cc_needs_belf=yes
else
@@ -2481,7 +2478,7 @@ echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
esac
echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
-echo "configure:2485: checking how to run the C++ preprocessor" >&5
+echo "configure:2482: checking how to run the C++ preprocessor" >&5
if test -z "$CXXCPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2494,12 +2491,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
CXXCPP="${CXX-g++} -E"
cat > conftest.$ac_ext <<EOF
-#line 2498 "configure"
+#line 2495 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2503: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2500: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2637,7 +2634,7 @@ exec 5>>./config.log
# Check for c++ or library specific bits that don't require linking.
#GLIBCPP_CHECK_COMPILER_VERSION
echo $ac_n "checking for GNU make""... $ac_c" 1>&6
-echo "configure:2641: checking for GNU make" >&5
+echo "configure:2638: checking for GNU make" >&5
if eval "test \"`echo '$''{'_cv_gnu_make_command'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2685,7 +2682,7 @@ esac
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:2689: checking how to run the C preprocessor" >&5
+echo "configure:2686: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -2700,13 +2697,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 2704 "configure"
+#line 2701 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2710: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2707: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2717,13 +2714,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 2721 "configure"
+#line 2718 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2727: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2724: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2734,13 +2731,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 2738 "configure"
+#line 2735 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2744: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2741: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -2766,7 +2763,7 @@ echo "$ac_t""$CPP" 1>&6
echo $ac_n "checking for cstdio to use""... $ac_c" 1>&6
-echo "configure:2770: checking for cstdio to use" >&5
+echo "configure:2767: checking for cstdio to use" >&5
# Check whether --enable-cstdio or --disable-cstdio was given.
if test "${enable_cstdio+set}" = set; then
enableval="$enable_cstdio"
@@ -2790,17 +2787,17 @@ fi
# see if we are on a system with libio native (ie, linux)
ac_safe=`echo "libio.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for libio.h""... $ac_c" 1>&6
-echo "configure:2794: checking for libio.h" >&5
+echo "configure:2791: checking for libio.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2799 "configure"
+#line 2796 "configure"
#include "confdefs.h"
#include <libio.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2804: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2801: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2830,9 +2827,9 @@ fi
case "$target" in
*-*-linux*)
echo $ac_n "checking for glibc version >= 2.2""... $ac_c" 1>&6
-echo "configure:2834: checking for glibc version >= 2.2" >&5
+echo "configure:2831: checking for glibc version >= 2.2" >&5
cat > conftest.$ac_ext <<EOF
-#line 2836 "configure"
+#line 2833 "configure"
#include "confdefs.h"
#include <features.h>
@@ -2946,7 +2943,7 @@ fi
echo $ac_n "checking for clocale to use""... $ac_c" 1>&6
-echo "configure:2950: checking for clocale to use" >&5
+echo "configure:2947: checking for clocale to use" >&5
# Check whether --enable-clocale or --disable-clocale was given.
if test "${enable_clocale+set}" = set; then
enableval="$enable_clocale"
@@ -2964,7 +2961,7 @@ fi
case x${target_os} in
xlinux* | xgnu*)
cat > conftest.$ac_ext <<EOF
-#line 2968 "configure"
+#line 2965 "configure"
#include "confdefs.h"
#include <features.h>
@@ -2990,11 +2987,17 @@ rm -f conftest*
enable_clocale_flag=generic
else
cat > conftest.$ac_ext <<EOF
-#line 2994 "configure"
+#line 2991 "configure"
#include "confdefs.h"
#define _GNU_SOURCE 1
#include <locale.h>
+ #include <string.h>
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ extern __typeof(newlocale) __newlocale;
+ extern __typeof(duplocale) __duplocale;
+ extern __typeof(strcoll_l) __strcoll_l;
+ #endif
int main()
{
const char __one[] = "Äuglein Augmen";
@@ -3011,7 +3014,7 @@ else
}
EOF
-if { (eval echo configure:3015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
enable_clocale_flag=gnu
else
@@ -3050,6 +3053,7 @@ fi
CLOCALE_H=config/locale/generic/c_locale.h
CLOCALE_CC=config/locale/generic/c_locale.cc
CCODECVT_H=config/locale/generic/codecvt_specializations.h
+ CCODECVT_CC=config/locale/generic/codecvt_members.cc
CCOLLATE_CC=config/locale/generic/collate_members.cc
CCTYPE_CC=config/locale/generic/ctype_members.cc
CMESSAGES_H=config/locale/generic/messages_members.h
@@ -3057,6 +3061,7 @@ fi
CMONEY_CC=config/locale/generic/monetary_members.cc
CNUMERIC_CC=config/locale/generic/numeric_members.cc
CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
xgnu)
echo "$ac_t""gnu" 1>&6
@@ -3070,7 +3075,7 @@ fi
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3074: checking for $ac_word" >&5
+echo "configure:3079: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3111,6 +3116,7 @@ fi
CLOCALE_H=config/locale/gnu/c_locale.h
CLOCALE_CC=config/locale/gnu/c_locale.cc
CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+ CCODECVT_CC=config/locale/gnu/codecvt_members.cc
CCOLLATE_CC=config/locale/gnu/collate_members.cc
CCTYPE_CC=config/locale/gnu/ctype_members.cc
CMESSAGES_H=config/locale/gnu/messages_members.h
@@ -3118,6 +3124,7 @@ fi
CMONEY_CC=config/locale/gnu/monetary_members.cc
CNUMERIC_CC=config/locale/gnu/numeric_members.cc
CTIME_CC=config/locale/gnu/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
;;
xieee_1003.1-2001)
echo "$ac_t""generic" 1>&6
@@ -3125,6 +3132,7 @@ fi
CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+ CCODECVT_CC=config/locale/generic/codecvt_members.cc
CCOLLATE_CC=config/locale/generic/collate_members.cc
CCTYPE_CC=config/locale/generic/ctype_members.cc
CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
@@ -3132,6 +3140,7 @@ fi
CMONEY_CC=config/locale/generic/monetary_members.cc
CNUMERIC_CC=config/locale/generic/numeric_members.cc
CTIME_CC=config/locale/generic/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
*)
echo "$enable_clocale is an unknown locale package" 1>&2
@@ -3144,11 +3153,17 @@ fi
glibcpp_localedir=${glibcpp_builddir}/po/share/locale
+ # For the time being, transform ctype_noninline.h to ctype_members_char.cc
+# CCTYPE_CHAR_CC=config/${os_include_dir}/ctype_noninline.h
+
+
+
+# AC_LINK_FILES($CCTYPE_CHAR_CC, src/ctype_members_char.cc)
@@ -3193,16 +3208,16 @@ cross_compiling=$ac_cv_prog_cxx_cross
# Check for the existence of <math.h> functions used if C99 is enabled.
ac_c99_math=yes;
echo $ac_n "checking for ISO C99 support in <math.h>""... $ac_c" 1>&6
-echo "configure:3197: checking for ISO C99 support in <math.h>" >&5
+echo "configure:3212: checking for ISO C99 support in <math.h>" >&5
cat > conftest.$ac_ext <<EOF
-#line 3199 "configure"
+#line 3214 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
fpclassify(0.0);
; return 0; }
EOF
-if { (eval echo configure:3206: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3212,14 +3227,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3216 "configure"
+#line 3231 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isfinite(0.0);
; return 0; }
EOF
-if { (eval echo configure:3223: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3238: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3229,14 +3244,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3233 "configure"
+#line 3248 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isinf(0.0);
; return 0; }
EOF
-if { (eval echo configure:3240: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3255: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3246,14 +3261,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3250 "configure"
+#line 3265 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isnan(0.0);
; return 0; }
EOF
-if { (eval echo configure:3257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3263,14 +3278,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3267 "configure"
+#line 3282 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isnormal(0.0);
; return 0; }
EOF
-if { (eval echo configure:3274: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3289: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3280,14 +3295,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3284 "configure"
+#line 3299 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
signbit(0.0);
; return 0; }
EOF
-if { (eval echo configure:3291: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3306: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3297,14 +3312,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3301 "configure"
+#line 3316 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isgreater(0.0,0.0);
; return 0; }
EOF
-if { (eval echo configure:3308: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3314,14 +3329,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3318 "configure"
+#line 3333 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isgreaterequal(0.0,0.0);
; return 0; }
EOF
-if { (eval echo configure:3325: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3331,14 +3346,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3335 "configure"
+#line 3350 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isless(0.0,0.0);
; return 0; }
EOF
-if { (eval echo configure:3342: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3357: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3348,14 +3363,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3352 "configure"
+#line 3367 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
islessequal(0.0,0.0);
; return 0; }
EOF
-if { (eval echo configure:3359: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3374: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3365,14 +3380,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3369 "configure"
+#line 3384 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
islessgreater(0.0,0.0);
; return 0; }
EOF
-if { (eval echo configure:3376: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3391: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3382,14 +3397,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3386 "configure"
+#line 3401 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
isunordered(0.0,0.0);
; return 0; }
EOF
-if { (eval echo configure:3393: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3408: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3403,16 +3418,16 @@ rm -f conftest*
# Check for the existence in <stdio.h> of vscanf, et. al.
ac_c99_stdio=yes;
echo $ac_n "checking for ISO C99 support in <stdio.h>""... $ac_c" 1>&6
-echo "configure:3407: checking for ISO C99 support in <stdio.h>" >&5
+echo "configure:3422: checking for ISO C99 support in <stdio.h>" >&5
cat > conftest.$ac_ext <<EOF
-#line 3409 "configure"
+#line 3424 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
snprintf("12", 0, "%i");
; return 0; }
EOF
-if { (eval echo configure:3416: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3431: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3422,7 +3437,7 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3426 "configure"
+#line 3441 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <stdarg.h>
@@ -3433,7 +3448,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:3437: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3452: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3443,7 +3458,7 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3447 "configure"
+#line 3462 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <stdarg.h>
@@ -3454,7 +3469,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:3458: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3473: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3464,7 +3479,7 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3468 "configure"
+#line 3483 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <stdarg.h>
@@ -3475,7 +3490,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:3479: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3494: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3485,7 +3500,7 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3489 "configure"
+#line 3504 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <stdarg.h>
@@ -3496,7 +3511,7 @@ int main() {
; return 0; }
EOF
-if { (eval echo configure:3500: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3515: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3510,20 +3525,20 @@ rm -f conftest*
# Check for the existence in <stdlib.h> of lldiv_t, et. al.
ac_c99_stdlib=yes;
echo $ac_n "checking for lldiv_t declaration""... $ac_c" 1>&6
-echo "configure:3514: checking for lldiv_t declaration" >&5
+echo "configure:3529: checking for lldiv_t declaration" >&5
if eval "test \"`echo '$''{'ac_c99_lldiv_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3520 "configure"
+#line 3535 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
lldiv_t mydivt;
; return 0; }
EOF
-if { (eval echo configure:3527: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_c99_lldiv_t=yes
else
@@ -3539,16 +3554,16 @@ fi
echo "$ac_t""$ac_c99_lldiv_t" 1>&6
echo $ac_n "checking for ISO C99 support in <stdlib.h>""... $ac_c" 1>&6
-echo "configure:3543: checking for ISO C99 support in <stdlib.h>" >&5
+echo "configure:3558: checking for ISO C99 support in <stdlib.h>" >&5
cat > conftest.$ac_ext <<EOF
-#line 3545 "configure"
+#line 3560 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
char* tmp; strtof("gnu", &tmp);
; return 0; }
EOF
-if { (eval echo configure:3552: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3567: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3558,14 +3573,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3562 "configure"
+#line 3577 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
char* tmp; strtold("gnu", &tmp);
; return 0; }
EOF
-if { (eval echo configure:3569: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3584: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3575,14 +3590,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3579 "configure"
+#line 3594 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
llabs(10);
; return 0; }
EOF
-if { (eval echo configure:3586: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3601: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3592,14 +3607,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3596 "configure"
+#line 3611 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
lldiv(10,1);
; return 0; }
EOF
-if { (eval echo configure:3603: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3618: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3609,14 +3624,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3613 "configure"
+#line 3628 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
atoll("10");
; return 0; }
EOF
-if { (eval echo configure:3620: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3635: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3626,14 +3641,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3630 "configure"
+#line 3645 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
_Exit(0);
; return 0; }
EOF
-if { (eval echo configure:3637: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3652: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3651,16 +3666,16 @@ rm -f conftest*
# XXX the wchar.h checks should be rolled into the general C99 bits.
ac_c99_wchar=yes;
echo $ac_n "checking for additional ISO C99 support in <wchar.h>""... $ac_c" 1>&6
-echo "configure:3655: checking for additional ISO C99 support in <wchar.h>" >&5
+echo "configure:3670: checking for additional ISO C99 support in <wchar.h>" >&5
cat > conftest.$ac_ext <<EOF
-#line 3657 "configure"
+#line 3672 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
wcstold(L"10.0", NULL);
; return 0; }
EOF
-if { (eval echo configure:3664: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3679: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3670,14 +3685,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3674 "configure"
+#line 3689 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
wcstoll(L"10", NULL, 10);
; return 0; }
EOF
-if { (eval echo configure:3681: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3696: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3687,14 +3702,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3691 "configure"
+#line 3706 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
wcstoull(L"10", NULL, 10);
; return 0; }
EOF
-if { (eval echo configure:3698: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3713: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3706,7 +3721,7 @@ rm -f conftest*
echo "$ac_t""$ac_c99_wchar" 1>&6
echo $ac_n "checking for enabled ISO C99 support""... $ac_c" 1>&6
-echo "configure:3710: checking for enabled ISO C99 support" >&5
+echo "configure:3725: checking for enabled ISO C99 support" >&5
if test x"$ac_c99_math" = x"no" ||
test x"$ac_c99_stdio" = x"no" ||
test x"$ac_c99_stdlib" = x"no" ||
@@ -3754,17 +3769,17 @@ cross_compiling=$ac_cv_prog_cxx_cross
echo $ac_n "checking for enabled long long I/O support""... $ac_c" 1>&6
-echo "configure:3758: checking for enabled long long I/O support" >&5
+echo "configure:3773: checking for enabled long long I/O support" >&5
# iostreams require strtoll, strtoull to compile
cat > conftest.$ac_ext <<EOF
-#line 3761 "configure"
+#line 3776 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
char* tmp; strtoll("gnu", &tmp, 10);
; return 0; }
EOF
-if { (eval echo configure:3768: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3783: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3774,14 +3789,14 @@ else
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 3778 "configure"
+#line 3793 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
char* tmp; strtoull("gnu", &tmp, 10);
; return 0; }
EOF
-if { (eval echo configure:3785: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3800: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
:
else
echo "configure: failed program was:" >&5
@@ -3809,7 +3824,7 @@ cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking for c header strategy to use""... $ac_c" 1>&6
-echo "configure:3813: checking for c header strategy to use" >&5
+echo "configure:3828: checking for c header strategy to use" >&5
# Check whether --enable-cheaders or --disable-cheaders was given.
if test "${enable_cheaders+set}" = set; then
enableval="$enable_cheaders"
@@ -3821,9 +3836,6 @@ if test "${enable_cheaders+set}" = set; then
c_std)
enable_cheaders=c_std
;;
- c_shadow)
- enable_cheaders=c_shadow
- ;;
*) { echo "configure: error: Unknown argument to enable/disable "C" headers" 1>&2; exit 1; }
;;
esac
@@ -3834,9 +3846,6 @@ fi
echo "$ac_t""$enable_cheaders" 1>&6
case "$enable_cheaders" in
- c_shadow)
- C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_shadow'
- ;;
c_std)
C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_std'
;;
@@ -3876,7 +3885,7 @@ fi
echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6
-echo "configure:3880: checking for thread model used by GCC" >&5
+echo "configure:3889: checking for thread model used by GCC" >&5
target_thread_file=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
echo "$ac_t""$target_thread_file" 1>&6
@@ -3929,7 +3938,7 @@ EXTRA_CXX_FLAGS="$enable_cxx_flags"
echo $ac_n "checking for exception model to use""... $ac_c" 1>&6
-echo "configure:3933: checking for exception model to use" >&5
+echo "configure:3942: checking for exception model to use" >&5
ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -3944,7 +3953,7 @@ if test "${enable_sjlj_exceptions+set}" = set; then
:
else
cat > conftest.$ac_ext << EOF
-#line 3948 "configure"
+#line 3957 "configure"
struct S { ~S(); };
void bar();
void foo()
@@ -3955,7 +3964,7 @@ void foo()
EOF
old_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=-S
- if { (eval echo configure:3959: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ if { (eval echo configure:3968: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
enable_sjlj_exceptions=yes
elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
@@ -3988,7 +3997,7 @@ cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking for use of libunwind""... $ac_c" 1>&6
-echo "configure:3992: checking for use of libunwind" >&5
+echo "configure:4001: checking for use of libunwind" >&5
# Check whether --enable-libunwind-exceptions or --disable-libunwind-exceptions was given.
if test "${enable_libunwind_exceptions+set}" = set; then
enableval="$enable_libunwind_exceptions"
@@ -4029,17 +4038,17 @@ for ac_hdr in string.h stdlib.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4033: checking for $ac_hdr" >&5
+echo "configure:4042: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4038 "configure"
+#line 4047 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4043: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4052: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4098,7 +4107,7 @@ if test -n "$with_cross_host" || test x"$build" != x"$host"; then
# GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT
# GLIBCPP_CHECK_MATH_SUPPORT
- case "$target_alias" in
+ case "$target" in
*-linux*)
os_include_dir="os/gnu-linux"
for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \
@@ -4107,17 +4116,17 @@ if test -n "$with_cross_host" || test x"$build" != x"$host"; then
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4111: checking for $ac_hdr" >&5
+echo "configure:4120: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4116 "configure"
+#line 4125 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4121: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4130: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4195,12 +4204,12 @@ done
# used sections, first .eh_frame and now some of the glibc sections for
# iconv). Bzzzzt. Thanks for playing, maybe next time.
echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
-echo "configure:4199: checking for ld that supports -Wl,--gc-sections" >&5
+echo "configure:4208: checking for ld that supports -Wl,--gc-sections" >&5
if test "$cross_compiling" = yes; then
ac_sectionLDflags=yes
else
cat > conftest.$ac_ext <<EOF
-#line 4204 "configure"
+#line 4213 "configure"
#include "confdefs.h"
int main(void)
@@ -4211,7 +4220,7 @@ else
}
EOF
-if { (eval echo configure:4215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4224: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_sectionLDflags=yes
else
@@ -4245,7 +4254,7 @@ fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:4249: checking for main in -lm" >&5
+echo "configure:4258: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -4253,14 +4262,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4257 "configure"
+#line 4266 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:4264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -4290,12 +4299,12 @@ fi
for ac_func in nan copysignf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4294: checking for $ac_func" >&5
+echo "configure:4303: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4299 "configure"
+#line 4308 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4318,7 +4327,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4331: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4347,12 +4356,12 @@ done
for ac_func in __signbit
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4351: checking for $ac_func" >&5
+echo "configure:4360: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4356 "configure"
+#line 4365 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4375,7 +4384,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4388: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4403,12 +4412,12 @@ done
for ac_func in __signbitf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4407: checking for $ac_func" >&5
+echo "configure:4416: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4412 "configure"
+#line 4421 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4431,7 +4440,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4444: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4461,12 +4470,12 @@ done
for ac_func in __signbitl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4465: checking for $ac_func" >&5
+echo "configure:4474: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4470 "configure"
+#line 4479 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4489,7 +4498,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4493: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4521,16 +4530,16 @@ done
echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
-echo "configure:4525: checking for mbstate_t" >&5
+echo "configure:4534: checking for mbstate_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 4527 "configure"
+#line 4536 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t teststate;
; return 0; }
EOF
-if { (eval echo configure:4534: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4543: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_mbstate_t=yes
else
@@ -4552,17 +4561,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4556: checking for $ac_hdr" >&5
+echo "configure:4565: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4561 "configure"
+#line 4570 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4566: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4575: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4593,17 +4602,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4597: checking for $ac_hdr" >&5
+echo "configure:4606: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4602 "configure"
+#line 4611 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4607: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4616: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4636,16 +4645,16 @@ done
test x"$enable_c_mbchar" != xno; then
echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
-echo "configure:4640: checking for WCHAR_MIN and WCHAR_MAX" >&5
+echo "configure:4649: checking for WCHAR_MIN and WCHAR_MAX" >&5
cat > conftest.$ac_ext <<EOF
-#line 4642 "configure"
+#line 4651 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
int i = WCHAR_MIN; int j = WCHAR_MAX;
; return 0; }
EOF
-if { (eval echo configure:4649: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4658: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_wchar_minmax=yes
else
@@ -4658,9 +4667,9 @@ rm -f conftest*
echo "$ac_t""$has_wchar_minmax" 1>&6
echo $ac_n "checking for WEOF""... $ac_c" 1>&6
-echo "configure:4662: checking for WEOF" >&5
+echo "configure:4671: checking for WEOF" >&5
cat > conftest.$ac_ext <<EOF
-#line 4664 "configure"
+#line 4673 "configure"
#include "confdefs.h"
#include <wchar.h>
@@ -4669,7 +4678,7 @@ int main() {
wint_t i = WEOF;
; return 0; }
EOF
-if { (eval echo configure:4673: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4682: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_weof=yes
else
@@ -4685,12 +4694,12 @@ rm -f conftest*
for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4689: checking for $ac_func" >&5
+echo "configure:4698: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4694 "configure"
+#line 4703 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4713,7 +4722,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4748,12 +4757,12 @@ done
wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4752: checking for $ac_func" >&5
+echo "configure:4761: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4757 "configure"
+#line 4766 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4776,7 +4785,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4780: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4789: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4804,7 +4813,7 @@ done
echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
-echo "configure:4808: checking for ISO C99 wchar_t support" >&5
+echo "configure:4817: checking for ISO C99 wchar_t support" >&5
if test x"$has_weof" = xyes &&
test x"$has_wchar_minmax" = xyes &&
test x"$ac_wfuncs" = xyes; then
@@ -4816,17 +4825,17 @@ echo "configure:4808: checking for ISO C99 wchar_t support" >&5
ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
-echo "configure:4820: checking for iconv.h" >&5
+echo "configure:4829: checking for iconv.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4825 "configure"
+#line 4834 "configure"
#include "confdefs.h"
#include <iconv.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4830: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4839: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4850,17 +4859,17 @@ fi
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
-echo "configure:4854: checking for langinfo.h" >&5
+echo "configure:4863: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4859 "configure"
+#line 4868 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4864: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4873: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4884,7 +4893,7 @@ fi
echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
-echo "configure:4888: checking for iconv in -liconv" >&5
+echo "configure:4897: checking for iconv in -liconv" >&5
ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -4892,7 +4901,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-liconv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4896 "configure"
+#line 4905 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -4903,7 +4912,7 @@ int main() {
iconv()
; return 0; }
EOF
-if { (eval echo configure:4907: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -4929,12 +4938,12 @@ fi
for ac_func in iconv_open iconv_close iconv nl_langinfo
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4933: checking for $ac_func" >&5
+echo "configure:4942: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4938 "configure"
+#line 4947 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4957,7 +4966,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4970: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4987,7 +4996,7 @@ done
LIBS="$ac_save_LIBS"
echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
-echo "configure:4991: checking for XPG2 wchar_t support" >&5
+echo "configure:5000: checking for XPG2 wchar_t support" >&5
if test x"$ac_has_iconv_h" = xyes &&
test x"$ac_has_langinfo_h" = xyes &&
test x"$ac_XPG2funcs" = xyes; then
@@ -4998,7 +5007,7 @@ echo "configure:4991: checking for XPG2 wchar_t support" >&5
echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
-echo "configure:5002: checking for enabled wchar_t specializations" >&5
+echo "configure:5011: checking for enabled wchar_t specializations" >&5
if test x"$ac_isoC99_wchar_t" = xyes &&
test x"$ac_XPG2_wchar_t" = xyes; then
cat >> confdefs.h <<\EOF
@@ -5088,17 +5097,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5092: checking for $ac_hdr" >&5
+echo "configure:5101: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5097 "configure"
+#line 5106 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5102: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5111: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5176,12 +5185,12 @@ done
# used sections, first .eh_frame and now some of the glibc sections for
# iconv). Bzzzzt. Thanks for playing, maybe next time.
echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
-echo "configure:5180: checking for ld that supports -Wl,--gc-sections" >&5
+echo "configure:5189: checking for ld that supports -Wl,--gc-sections" >&5
if test "$cross_compiling" = yes; then
ac_sectionLDflags=yes
else
cat > conftest.$ac_ext <<EOF
-#line 5185 "configure"
+#line 5194 "configure"
#include "confdefs.h"
int main(void)
@@ -5192,7 +5201,7 @@ else
}
EOF
-if { (eval echo configure:5196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_sectionLDflags=yes
else
@@ -5226,7 +5235,7 @@ fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:5230: checking for main in -lm" >&5
+echo "configure:5239: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5234,14 +5243,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5238 "configure"
+#line 5247 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:5245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5271,12 +5280,12 @@ fi
for ac_func in nan copysignf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5275: checking for $ac_func" >&5
+echo "configure:5284: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5280 "configure"
+#line 5289 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5299,7 +5308,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5312: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5328,12 +5337,12 @@ done
for ac_func in __signbit
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5332: checking for $ac_func" >&5
+echo "configure:5341: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5337 "configure"
+#line 5346 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5356,7 +5365,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5360: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5384,12 +5393,12 @@ done
for ac_func in __signbitf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5388: checking for $ac_func" >&5
+echo "configure:5397: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5393 "configure"
+#line 5402 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5412,7 +5421,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5442,12 +5451,12 @@ done
for ac_func in __signbitl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5446: checking for $ac_func" >&5
+echo "configure:5455: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5451 "configure"
+#line 5460 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5470,7 +5479,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5474: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5502,16 +5511,16 @@ done
echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
-echo "configure:5506: checking for mbstate_t" >&5
+echo "configure:5515: checking for mbstate_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 5508 "configure"
+#line 5517 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t teststate;
; return 0; }
EOF
-if { (eval echo configure:5515: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5524: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_mbstate_t=yes
else
@@ -5533,17 +5542,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5537: checking for $ac_hdr" >&5
+echo "configure:5546: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5542 "configure"
+#line 5551 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5547: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5556: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5574,17 +5583,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5578: checking for $ac_hdr" >&5
+echo "configure:5587: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5583 "configure"
+#line 5592 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5588: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5597: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5617,16 +5626,16 @@ done
test x"$enable_c_mbchar" != xno; then
echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
-echo "configure:5621: checking for WCHAR_MIN and WCHAR_MAX" >&5
+echo "configure:5630: checking for WCHAR_MIN and WCHAR_MAX" >&5
cat > conftest.$ac_ext <<EOF
-#line 5623 "configure"
+#line 5632 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
int i = WCHAR_MIN; int j = WCHAR_MAX;
; return 0; }
EOF
-if { (eval echo configure:5630: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5639: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_wchar_minmax=yes
else
@@ -5639,9 +5648,9 @@ rm -f conftest*
echo "$ac_t""$has_wchar_minmax" 1>&6
echo $ac_n "checking for WEOF""... $ac_c" 1>&6
-echo "configure:5643: checking for WEOF" >&5
+echo "configure:5652: checking for WEOF" >&5
cat > conftest.$ac_ext <<EOF
-#line 5645 "configure"
+#line 5654 "configure"
#include "confdefs.h"
#include <wchar.h>
@@ -5650,7 +5659,7 @@ int main() {
wint_t i = WEOF;
; return 0; }
EOF
-if { (eval echo configure:5654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5663: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_weof=yes
else
@@ -5666,12 +5675,12 @@ rm -f conftest*
for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5670: checking for $ac_func" >&5
+echo "configure:5679: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5675 "configure"
+#line 5684 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5694,7 +5703,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5707: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5729,12 +5738,12 @@ done
wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5733: checking for $ac_func" >&5
+echo "configure:5742: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5738 "configure"
+#line 5747 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5757,7 +5766,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5761: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5785,7 +5794,7 @@ done
echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
-echo "configure:5789: checking for ISO C99 wchar_t support" >&5
+echo "configure:5798: checking for ISO C99 wchar_t support" >&5
if test x"$has_weof" = xyes &&
test x"$has_wchar_minmax" = xyes &&
test x"$ac_wfuncs" = xyes; then
@@ -5797,17 +5806,17 @@ echo "configure:5789: checking for ISO C99 wchar_t support" >&5
ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
-echo "configure:5801: checking for iconv.h" >&5
+echo "configure:5810: checking for iconv.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5806 "configure"
+#line 5815 "configure"
#include "confdefs.h"
#include <iconv.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5811: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5831,17 +5840,17 @@ fi
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
-echo "configure:5835: checking for langinfo.h" >&5
+echo "configure:5844: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5840 "configure"
+#line 5849 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5854: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -5865,7 +5874,7 @@ fi
echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
-echo "configure:5869: checking for iconv in -liconv" >&5
+echo "configure:5878: checking for iconv in -liconv" >&5
ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -5873,7 +5882,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-liconv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5877 "configure"
+#line 5886 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -5884,7 +5893,7 @@ int main() {
iconv()
; return 0; }
EOF
-if { (eval echo configure:5888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5897: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -5910,12 +5919,12 @@ fi
for ac_func in iconv_open iconv_close iconv nl_langinfo
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5914: checking for $ac_func" >&5
+echo "configure:5923: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5919 "configure"
+#line 5928 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -5938,7 +5947,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:5942: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -5968,7 +5977,7 @@ done
LIBS="$ac_save_LIBS"
echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
-echo "configure:5972: checking for XPG2 wchar_t support" >&5
+echo "configure:5981: checking for XPG2 wchar_t support" >&5
if test x"$ac_has_iconv_h" = xyes &&
test x"$ac_has_langinfo_h" = xyes &&
test x"$ac_XPG2funcs" = xyes; then
@@ -5979,7 +5988,7 @@ echo "configure:5972: checking for XPG2 wchar_t support" >&5
echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
-echo "configure:5983: checking for enabled wchar_t specializations" >&5
+echo "configure:5992: checking for enabled wchar_t specializations" >&5
if test x"$ac_isoC99_wchar_t" = xyes &&
test x"$ac_XPG2_wchar_t" = xyes; then
cat >> confdefs.h <<\EOF
@@ -6011,7 +6020,7 @@ EOF
#define HAVE_HYPOT 1
EOF
- case "$target_alias" in
+ case "$target" in
*-hpux10*)
cat >> confdefs.h <<\EOF
#define HAVE_FINITE 1
@@ -6049,17 +6058,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6053: checking for $ac_hdr" >&5
+echo "configure:6062: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6058 "configure"
+#line 6067 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6063: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6072: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6137,12 +6146,12 @@ done
# used sections, first .eh_frame and now some of the glibc sections for
# iconv). Bzzzzt. Thanks for playing, maybe next time.
echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
-echo "configure:6141: checking for ld that supports -Wl,--gc-sections" >&5
+echo "configure:6150: checking for ld that supports -Wl,--gc-sections" >&5
if test "$cross_compiling" = yes; then
ac_sectionLDflags=yes
else
cat > conftest.$ac_ext <<EOF
-#line 6146 "configure"
+#line 6155 "configure"
#include "confdefs.h"
int main(void)
@@ -6153,7 +6162,7 @@ else
}
EOF
-if { (eval echo configure:6157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6166: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_sectionLDflags=yes
else
@@ -6187,7 +6196,7 @@ fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:6191: checking for main in -lm" >&5
+echo "configure:6200: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -6195,14 +6204,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6199 "configure"
+#line 6208 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:6206: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -6232,12 +6241,12 @@ fi
for ac_func in nan copysignf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6236: checking for $ac_func" >&5
+echo "configure:6245: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6241 "configure"
+#line 6250 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6260,7 +6269,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6289,12 +6298,12 @@ done
for ac_func in __signbit
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6293: checking for $ac_func" >&5
+echo "configure:6302: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6298 "configure"
+#line 6307 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6317,7 +6326,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6345,12 +6354,12 @@ done
for ac_func in __signbitf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6349: checking for $ac_func" >&5
+echo "configure:6358: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6354 "configure"
+#line 6363 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6373,7 +6382,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6403,12 +6412,12 @@ done
for ac_func in __signbitl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6407: checking for $ac_func" >&5
+echo "configure:6416: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6412 "configure"
+#line 6421 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6431,7 +6440,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6444: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6463,16 +6472,16 @@ done
echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
-echo "configure:6467: checking for mbstate_t" >&5
+echo "configure:6476: checking for mbstate_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 6469 "configure"
+#line 6478 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t teststate;
; return 0; }
EOF
-if { (eval echo configure:6476: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6485: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_mbstate_t=yes
else
@@ -6494,17 +6503,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6498: checking for $ac_hdr" >&5
+echo "configure:6507: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6503 "configure"
+#line 6512 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6517: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6535,17 +6544,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6539: checking for $ac_hdr" >&5
+echo "configure:6548: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6544 "configure"
+#line 6553 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6549: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6558: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6578,16 +6587,16 @@ done
test x"$enable_c_mbchar" != xno; then
echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
-echo "configure:6582: checking for WCHAR_MIN and WCHAR_MAX" >&5
+echo "configure:6591: checking for WCHAR_MIN and WCHAR_MAX" >&5
cat > conftest.$ac_ext <<EOF
-#line 6584 "configure"
+#line 6593 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
int i = WCHAR_MIN; int j = WCHAR_MAX;
; return 0; }
EOF
-if { (eval echo configure:6591: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6600: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_wchar_minmax=yes
else
@@ -6600,9 +6609,9 @@ rm -f conftest*
echo "$ac_t""$has_wchar_minmax" 1>&6
echo $ac_n "checking for WEOF""... $ac_c" 1>&6
-echo "configure:6604: checking for WEOF" >&5
+echo "configure:6613: checking for WEOF" >&5
cat > conftest.$ac_ext <<EOF
-#line 6606 "configure"
+#line 6615 "configure"
#include "confdefs.h"
#include <wchar.h>
@@ -6611,7 +6620,7 @@ int main() {
wint_t i = WEOF;
; return 0; }
EOF
-if { (eval echo configure:6615: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_weof=yes
else
@@ -6627,12 +6636,12 @@ rm -f conftest*
for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6631: checking for $ac_func" >&5
+echo "configure:6640: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6636 "configure"
+#line 6645 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6655,7 +6664,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6668: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6690,12 +6699,12 @@ done
wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6694: checking for $ac_func" >&5
+echo "configure:6703: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6699 "configure"
+#line 6708 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6718,7 +6727,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6746,7 +6755,7 @@ done
echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
-echo "configure:6750: checking for ISO C99 wchar_t support" >&5
+echo "configure:6759: checking for ISO C99 wchar_t support" >&5
if test x"$has_weof" = xyes &&
test x"$has_wchar_minmax" = xyes &&
test x"$ac_wfuncs" = xyes; then
@@ -6758,17 +6767,17 @@ echo "configure:6750: checking for ISO C99 wchar_t support" >&5
ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
-echo "configure:6762: checking for iconv.h" >&5
+echo "configure:6771: checking for iconv.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6767 "configure"
+#line 6776 "configure"
#include "confdefs.h"
#include <iconv.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6772: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6792,17 +6801,17 @@ fi
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
-echo "configure:6796: checking for langinfo.h" >&5
+echo "configure:6805: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6801 "configure"
+#line 6810 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6806: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -6826,7 +6835,7 @@ fi
echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
-echo "configure:6830: checking for iconv in -liconv" >&5
+echo "configure:6839: checking for iconv in -liconv" >&5
ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -6834,7 +6843,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-liconv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6838 "configure"
+#line 6847 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -6845,7 +6854,7 @@ int main() {
iconv()
; return 0; }
EOF
-if { (eval echo configure:6849: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -6871,12 +6880,12 @@ fi
for ac_func in iconv_open iconv_close iconv nl_langinfo
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6875: checking for $ac_func" >&5
+echo "configure:6884: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6880 "configure"
+#line 6889 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -6899,7 +6908,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:6903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -6929,7 +6938,7 @@ done
LIBS="$ac_save_LIBS"
echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
-echo "configure:6933: checking for XPG2 wchar_t support" >&5
+echo "configure:6942: checking for XPG2 wchar_t support" >&5
if test x"$ac_has_iconv_h" = xyes &&
test x"$ac_has_langinfo_h" = xyes &&
test x"$ac_XPG2funcs" = xyes; then
@@ -6940,7 +6949,7 @@ echo "configure:6933: checking for XPG2 wchar_t support" >&5
echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
-echo "configure:6944: checking for enabled wchar_t specializations" >&5
+echo "configure:6953: checking for enabled wchar_t specializations" >&5
if test x"$ac_isoC99_wchar_t" = xyes &&
test x"$ac_XPG2_wchar_t" = xyes; then
cat >> confdefs.h <<\EOF
@@ -7011,22 +7020,1013 @@ EOF
fi
;;
+ *-freebsd*)
+ # Check for available headers.
+ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \
+ machine/endian.h machine/param.h sys/machine.h sys/types.h \
+ fp.h locale.h float.h inttypes.h sys/resource.h sys/stat.h \
+ sys/time.h unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:7033: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7038 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7043: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ SECTION_FLAGS='-ffunction-sections -fdata-sections'
+
+
+ # If we're not using GNU ld, then there's no point in even trying these
+ # tests. Check for that first. We should have already tested for gld
+ # by now (in libtool), but require it now just to be safe...
+ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
+ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
+
+
+ # The name set by libtool depends on the version of libtool. Shame on us
+ # for depending on an impl detail, but c'est la vie. Older versions used
+ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
+ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
+ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't
+ # set (hence we're using an older libtool), then set it.
+ if test x${with_gnu_ld+set} != xset; then
+ if test x${ac_cv_prog_gnu_ld+set} != xset; then
+ # We got through "ac_require(ac_prog_ld)" and still not set? Huh?
+ with_gnu_ld=no
+ else
+ with_gnu_ld=$ac_cv_prog_gnu_ld
+ fi
+ fi
+
+ # Start by getting the version number. I think the libtool test already
+ # does some of this, but throws away the result.
+
+ ldver=`$LD --version 2>/dev/null | head -1 | \
+ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
+
+ glibcpp_gnu_ld_version=`echo $ldver | \
+ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
+
+ # Set --gc-sections.
+ if test "$with_gnu_ld" = "notbroken"; then
+ # GNU ld it is! Joy and bunny rabbits!
+
+ # All these tests are for C++; save the language and the compiler flags.
+ # Need to do this so that g++ won't try to link in libstdc++
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS='-x c++ -Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ # XXX This test is broken at the moment, as symbols required for
+ # linking are now in libsupc++ (not built yet.....). In addition,
+ # this test has cored on solaris in the past. In addition,
+ # --gc-sections doesn't really work at the moment (keeps on discarding
+ # used sections, first .eh_frame and now some of the glibc sections for
+ # iconv). Bzzzzt. Thanks for playing, maybe next time.
+ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
+echo "configure:7121: checking for ld that supports -Wl,--gc-sections" >&5
+ if test "$cross_compiling" = yes; then
+ ac_sectionLDflags=yes
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7126 "configure"
+#include "confdefs.h"
+
+ int main(void)
+ {
+ try { throw 1; }
+ catch (...) { };
+ return 0;
+ }
+
+EOF
+if { (eval echo configure:7137: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_sectionLDflags=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_sectionLDflags=no
+fi
+rm -fr conftest*
+fi
+
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ # this is the suspicious part
+ CFLAGS=''
+ fi
+ if test "$ac_sectionLDflags" = "yes"; then
+ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
+ fi
+ echo "$ac_t""$ac_sectionLDflags" 1>&6
+ fi
+
+ # Set linker optimization flags.
+ if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
+ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
+ fi
+
+
+
+
+
+ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
+echo "configure:7171: checking for main in -lm" >&5
+ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7179 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:7186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lm $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ for ac_func in nan copysignf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7216: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7221 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"
+fi
+done
+
+
+ for ac_func in __signbit
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7273: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7278 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBMATHOBJS="$LIBMATHOBJS signbit.lo"
+fi
+done
+
+ for ac_func in __signbitf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7329: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7334 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"
+fi
+done
+
+
+ if test x$ac_cv_func_copysignl = x"yes"; then
+ for ac_func in __signbitl
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7387: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7392 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"
+fi
+done
+
+ fi
+
+
+
+
+
+ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
+echo "configure:7447: checking for mbstate_t" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 7449 "configure"
+#include "confdefs.h"
+#include <wchar.h>
+int main() {
+mbstate_t teststate;
+; return 0; }
+EOF
+if { (eval echo configure:7456: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ have_mbstate_t=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ have_mbstate_t=no
+fi
+rm -f conftest*
+ echo "$ac_t""$have_mbstate_t" 1>&6
+ if test x"$have_mbstate_t" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MBSTATE_T 1
+EOF
+
+ fi
+
+ for ac_hdr in wchar.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:7478: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7483 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_has_wchar_h=yes
+else
+ echo "$ac_t""no" 1>&6
+ac_has_wchar_h=no
+fi
+done
+
+ for ac_hdr in wctype.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:7519: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7524 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7529: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_has_wctype_h=yes
+else
+ echo "$ac_t""no" 1>&6
+ac_has_wctype_h=no
+fi
+done
+
+
+ if test x"$ac_has_wchar_h" = xyes &&
+ test x"$ac_has_wctype_h" = xyes &&
+ test x"$enable_c_mbchar" != xno; then
+
+ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
+echo "configure:7562: checking for WCHAR_MIN and WCHAR_MAX" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 7564 "configure"
+#include "confdefs.h"
+#include <wchar.h>
+int main() {
+int i = WCHAR_MIN; int j = WCHAR_MAX;
+; return 0; }
+EOF
+if { (eval echo configure:7571: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ has_wchar_minmax=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ has_wchar_minmax=no
+fi
+rm -f conftest*
+ echo "$ac_t""$has_wchar_minmax" 1>&6
+
+ echo $ac_n "checking for WEOF""... $ac_c" 1>&6
+echo "configure:7584: checking for WEOF" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 7586 "configure"
+#include "confdefs.h"
+
+ #include <wchar.h>
+ #include <stddef.h>
+int main() {
+wint_t i = WEOF;
+; return 0; }
+EOF
+if { (eval echo configure:7595: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ has_weof=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ has_weof=no
+fi
+rm -f conftest*
+ echo "$ac_t""$has_weof" 1>&6
+
+ ac_wfuncs=yes
+ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7611: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7616 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7639: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+\
+ ac_wfuncs=no
+fi
+done
+
+
+ for ac_func in btowc wctob fgetwc fgetwc fgetws fputwc fputws fwide \
+ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \
+ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \
+ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \
+ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \
+ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7674: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7679 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7702: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+\
+ ac_wfuncs=no
+fi
+done
+
+
+ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
+echo "configure:7730: checking for ISO C99 wchar_t support" >&5
+ if test x"$has_weof" = xyes &&
+ test x"$has_wchar_minmax" = xyes &&
+ test x"$ac_wfuncs" = xyes; then
+ ac_isoC99_wchar_t=yes
+ else
+ ac_isoC99_wchar_t=no
+ fi
+ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6
+
+ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
+echo "configure:7742: checking for iconv.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7747 "configure"
+#include "confdefs.h"
+#include <iconv.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7752: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_has_iconv_h=yes
+else
+ echo "$ac_t""no" 1>&6
+ac_has_iconv_h=no
+fi
+
+ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
+echo "configure:7776: checking for langinfo.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7781 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7786: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_has_langinfo_h=yes
+else
+ echo "$ac_t""no" 1>&6
+ac_has_langinfo_h=no
+fi
+
+
+ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
+echo "configure:7810: checking for iconv in -liconv" >&5
+ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-liconv $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7818 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char iconv();
+
+int main() {
+iconv()
+; return 0; }
+EOF
+if { (eval echo configure:7829: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ libiconv="-liconv"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $libiconv"
+
+ for ac_func in iconv_open iconv_close iconv nl_langinfo
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:7855: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 7860 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:7883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ \
+ ac_XPG2funcs=yes
+else
+ echo "$ac_t""no" 1>&6
+ac_XPG2funcs=no
+fi
+done
+
+
+ LIBS="$ac_save_LIBS"
+
+ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
+echo "configure:7913: checking for XPG2 wchar_t support" >&5
+ if test x"$ac_has_iconv_h" = xyes &&
+ test x"$ac_has_langinfo_h" = xyes &&
+ test x"$ac_XPG2funcs" = xyes; then
+ ac_XPG2_wchar_t=yes
+ else
+ ac_XPG2_wchar_t=no
+ fi
+ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
+
+ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
+echo "configure:7924: checking for enabled wchar_t specializations" >&5
+ if test x"$ac_isoC99_wchar_t" = xyes &&
+ test x"$ac_XPG2_wchar_t" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define _GLIBCPP_USE_WCHAR_T 1
+EOF
+
+ echo "$ac_t"""yes"" 1>&6
+ else
+ echo "$ac_t"""no"" 1>&6
+ fi
+ else
+ echo "configure: warning: wchar_t support disabled." 1>&2
+ fi
+
+ os_include_dir="os/bsd/freebsd"
+ cat >> confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_DRAND48 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETPAGESIZE 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_SETENV 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_SIGSETJMP 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_COPYSIGN 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_COPYSIGNF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FINITEF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FINITE 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FREXPF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_HYPOT 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_HYPOTF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ISINF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ISNAN 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ISNANF 1
+EOF
+
+ if test x"long_double_math_on_this_cpu" = x"yes"; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_FINITEL 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ISINFL 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ISNANL 1
+EOF
+
+ fi
+ ;;
*-mingw32*)
for ac_hdr in sys/types.h locale.h float.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7020: checking for $ac_hdr" >&5
+echo "configure:8020: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7025 "configure"
+#line 8025 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7030: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8030: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -7102,12 +8102,12 @@ done
# used sections, first .eh_frame and now some of the glibc sections for
# iconv). Bzzzzt. Thanks for playing, maybe next time.
echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
-echo "configure:7106: checking for ld that supports -Wl,--gc-sections" >&5
+echo "configure:8106: checking for ld that supports -Wl,--gc-sections" >&5
if test "$cross_compiling" = yes; then
ac_sectionLDflags=yes
else
cat > conftest.$ac_ext <<EOF
-#line 7111 "configure"
+#line 8111 "configure"
#include "confdefs.h"
int main(void)
@@ -7118,7 +8118,7 @@ else
}
EOF
-if { (eval echo configure:7122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:8122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_sectionLDflags=yes
else
@@ -7152,7 +8152,7 @@ fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:7156: checking for main in -lm" >&5
+echo "configure:8156: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7160,14 +8160,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7164 "configure"
+#line 8164 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:7171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -7197,12 +8197,12 @@ fi
for ac_func in nan copysignf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7201: checking for $ac_func" >&5
+echo "configure:8201: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7206 "configure"
+#line 8206 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7225,7 +8225,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7254,12 +8254,12 @@ done
for ac_func in __signbit
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7258: checking for $ac_func" >&5
+echo "configure:8258: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7263 "configure"
+#line 8263 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7282,7 +8282,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7310,12 +8310,12 @@ done
for ac_func in __signbitf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7314: checking for $ac_func" >&5
+echo "configure:8314: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7319 "configure"
+#line 8319 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7338,7 +8338,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7368,12 +8368,12 @@ done
for ac_func in __signbitl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7372: checking for $ac_func" >&5
+echo "configure:8372: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7377 "configure"
+#line 8377 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7396,7 +8396,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7428,16 +8428,16 @@ done
echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
-echo "configure:7432: checking for mbstate_t" >&5
+echo "configure:8432: checking for mbstate_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 7434 "configure"
+#line 8434 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t teststate;
; return 0; }
EOF
-if { (eval echo configure:7441: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8441: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_mbstate_t=yes
else
@@ -7459,17 +8459,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7463: checking for $ac_hdr" >&5
+echo "configure:8463: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7468 "configure"
+#line 8468 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7473: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8473: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -7500,17 +8500,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7504: checking for $ac_hdr" >&5
+echo "configure:8504: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7509 "configure"
+#line 8509 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7514: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8514: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -7543,16 +8543,16 @@ done
test x"$enable_c_mbchar" != xno; then
echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
-echo "configure:7547: checking for WCHAR_MIN and WCHAR_MAX" >&5
+echo "configure:8547: checking for WCHAR_MIN and WCHAR_MAX" >&5
cat > conftest.$ac_ext <<EOF
-#line 7549 "configure"
+#line 8549 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
int i = WCHAR_MIN; int j = WCHAR_MAX;
; return 0; }
EOF
-if { (eval echo configure:7556: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8556: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_wchar_minmax=yes
else
@@ -7565,9 +8565,9 @@ rm -f conftest*
echo "$ac_t""$has_wchar_minmax" 1>&6
echo $ac_n "checking for WEOF""... $ac_c" 1>&6
-echo "configure:7569: checking for WEOF" >&5
+echo "configure:8569: checking for WEOF" >&5
cat > conftest.$ac_ext <<EOF
-#line 7571 "configure"
+#line 8571 "configure"
#include "confdefs.h"
#include <wchar.h>
@@ -7576,7 +8576,7 @@ int main() {
wint_t i = WEOF;
; return 0; }
EOF
-if { (eval echo configure:7580: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8580: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_weof=yes
else
@@ -7592,12 +8592,12 @@ rm -f conftest*
for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7596: checking for $ac_func" >&5
+echo "configure:8596: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7601 "configure"
+#line 8601 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7620,7 +8620,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7624: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8624: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7655,12 +8655,12 @@ done
wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7659: checking for $ac_func" >&5
+echo "configure:8659: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7664 "configure"
+#line 8664 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7683,7 +8683,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7711,7 +8711,7 @@ done
echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
-echo "configure:7715: checking for ISO C99 wchar_t support" >&5
+echo "configure:8715: checking for ISO C99 wchar_t support" >&5
if test x"$has_weof" = xyes &&
test x"$has_wchar_minmax" = xyes &&
test x"$ac_wfuncs" = xyes; then
@@ -7723,17 +8723,17 @@ echo "configure:7715: checking for ISO C99 wchar_t support" >&5
ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
-echo "configure:7727: checking for iconv.h" >&5
+echo "configure:8727: checking for iconv.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7732 "configure"
+#line 8732 "configure"
#include "confdefs.h"
#include <iconv.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7737: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8737: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -7757,17 +8757,17 @@ fi
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
-echo "configure:7761: checking for langinfo.h" >&5
+echo "configure:8761: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7766 "configure"
+#line 8766 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -7791,7 +8791,7 @@ fi
echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
-echo "configure:7795: checking for iconv in -liconv" >&5
+echo "configure:8795: checking for iconv in -liconv" >&5
ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -7799,7 +8799,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-liconv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7803 "configure"
+#line 8803 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -7810,7 +8810,7 @@ int main() {
iconv()
; return 0; }
EOF
-if { (eval echo configure:7814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -7836,12 +8836,12 @@ fi
for ac_func in iconv_open iconv_close iconv nl_langinfo
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7840: checking for $ac_func" >&5
+echo "configure:8840: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7845 "configure"
+#line 8845 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -7864,7 +8864,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:7868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -7894,7 +8894,7 @@ done
LIBS="$ac_save_LIBS"
echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
-echo "configure:7898: checking for XPG2 wchar_t support" >&5
+echo "configure:8898: checking for XPG2 wchar_t support" >&5
if test x"$ac_has_iconv_h" = xyes &&
test x"$ac_has_langinfo_h" = xyes &&
test x"$ac_XPG2funcs" = xyes; then
@@ -7905,7 +8905,7 @@ echo "configure:7898: checking for XPG2 wchar_t support" >&5
echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
-echo "configure:7909: checking for enabled wchar_t specializations" >&5
+echo "configure:8909: checking for enabled wchar_t specializations" >&5
if test x"$ac_isoC99_wchar_t" = xyes &&
test x"$ac_XPG2_wchar_t" = xyes; then
cat >> confdefs.h <<\EOF
@@ -7978,12 +8978,12 @@ EOF
# used sections, first .eh_frame and now some of the glibc sections for
# iconv). Bzzzzt. Thanks for playing, maybe next time.
echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
-echo "configure:7982: checking for ld that supports -Wl,--gc-sections" >&5
+echo "configure:8982: checking for ld that supports -Wl,--gc-sections" >&5
if test "$cross_compiling" = yes; then
ac_sectionLDflags=yes
else
cat > conftest.$ac_ext <<EOF
-#line 7987 "configure"
+#line 8987 "configure"
#include "confdefs.h"
int main(void)
@@ -7994,7 +8994,7 @@ else
}
EOF
-if { (eval echo configure:7998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:8998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_sectionLDflags=yes
else
@@ -8028,7 +9028,7 @@ fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:8032: checking for main in -lm" >&5
+echo "configure:9032: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -8036,14 +9036,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 8040 "configure"
+#line 9040 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:8047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -8073,12 +9073,12 @@ fi
for ac_func in nan copysignf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8077: checking for $ac_func" >&5
+echo "configure:9077: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8082 "configure"
+#line 9082 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8101,7 +9101,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8130,12 +9130,12 @@ done
for ac_func in __signbit
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8134: checking for $ac_func" >&5
+echo "configure:9134: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8139 "configure"
+#line 9139 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8158,7 +9158,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8186,12 +9186,12 @@ done
for ac_func in __signbitf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8190: checking for $ac_func" >&5
+echo "configure:9190: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8195 "configure"
+#line 9195 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8214,7 +9214,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8244,12 +9244,12 @@ done
for ac_func in __signbitl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8248: checking for $ac_func" >&5
+echo "configure:9248: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8253 "configure"
+#line 9253 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8272,7 +9272,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8304,16 +9304,16 @@ done
echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
-echo "configure:8308: checking for mbstate_t" >&5
+echo "configure:9308: checking for mbstate_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 8310 "configure"
+#line 9310 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t teststate;
; return 0; }
EOF
-if { (eval echo configure:8317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_mbstate_t=yes
else
@@ -8335,17 +9335,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8339: checking for $ac_hdr" >&5
+echo "configure:9339: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8344 "configure"
+#line 9344 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8349: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9349: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -8376,17 +9376,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8380: checking for $ac_hdr" >&5
+echo "configure:9380: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8385 "configure"
+#line 9385 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -8419,16 +9419,16 @@ done
test x"$enable_c_mbchar" != xno; then
echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
-echo "configure:8423: checking for WCHAR_MIN and WCHAR_MAX" >&5
+echo "configure:9423: checking for WCHAR_MIN and WCHAR_MAX" >&5
cat > conftest.$ac_ext <<EOF
-#line 8425 "configure"
+#line 9425 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
int i = WCHAR_MIN; int j = WCHAR_MAX;
; return 0; }
EOF
-if { (eval echo configure:8432: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9432: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_wchar_minmax=yes
else
@@ -8441,9 +9441,9 @@ rm -f conftest*
echo "$ac_t""$has_wchar_minmax" 1>&6
echo $ac_n "checking for WEOF""... $ac_c" 1>&6
-echo "configure:8445: checking for WEOF" >&5
+echo "configure:9445: checking for WEOF" >&5
cat > conftest.$ac_ext <<EOF
-#line 8447 "configure"
+#line 9447 "configure"
#include "confdefs.h"
#include <wchar.h>
@@ -8452,7 +9452,7 @@ int main() {
wint_t i = WEOF;
; return 0; }
EOF
-if { (eval echo configure:8456: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9456: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_weof=yes
else
@@ -8468,12 +9468,12 @@ rm -f conftest*
for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8472: checking for $ac_func" >&5
+echo "configure:9472: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8477 "configure"
+#line 9477 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8496,7 +9496,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8531,12 +9531,12 @@ done
wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8535: checking for $ac_func" >&5
+echo "configure:9535: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8540 "configure"
+#line 9540 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8559,7 +9559,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8587,7 +9587,7 @@ done
echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
-echo "configure:8591: checking for ISO C99 wchar_t support" >&5
+echo "configure:9591: checking for ISO C99 wchar_t support" >&5
if test x"$has_weof" = xyes &&
test x"$has_wchar_minmax" = xyes &&
test x"$ac_wfuncs" = xyes; then
@@ -8599,17 +9599,17 @@ echo "configure:8591: checking for ISO C99 wchar_t support" >&5
ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
-echo "configure:8603: checking for iconv.h" >&5
+echo "configure:9603: checking for iconv.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8608 "configure"
+#line 9608 "configure"
#include "confdefs.h"
#include <iconv.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8613: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9613: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -8633,17 +9633,17 @@ fi
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
-echo "configure:8637: checking for langinfo.h" >&5
+echo "configure:9637: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8642 "configure"
+#line 9642 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8647: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9647: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -8667,7 +9667,7 @@ fi
echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
-echo "configure:8671: checking for iconv in -liconv" >&5
+echo "configure:9671: checking for iconv in -liconv" >&5
ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -8675,7 +9675,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-liconv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 8679 "configure"
+#line 9679 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -8686,7 +9686,7 @@ int main() {
iconv()
; return 0; }
EOF
-if { (eval echo configure:8690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -8712,12 +9712,12 @@ fi
for ac_func in iconv_open iconv_close iconv nl_langinfo
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8716: checking for $ac_func" >&5
+echo "configure:9716: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8721 "configure"
+#line 9721 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -8740,7 +9740,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:8744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -8770,7 +9770,7 @@ done
LIBS="$ac_save_LIBS"
echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
-echo "configure:8774: checking for XPG2 wchar_t support" >&5
+echo "configure:9774: checking for XPG2 wchar_t support" >&5
if test x"$ac_has_iconv_h" = xyes &&
test x"$ac_has_langinfo_h" = xyes &&
test x"$ac_XPG2funcs" = xyes; then
@@ -8781,7 +9781,7 @@ echo "configure:8774: checking for XPG2 wchar_t support" >&5
echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
-echo "configure:8785: checking for enabled wchar_t specializations" >&5
+echo "configure:9785: checking for enabled wchar_t specializations" >&5
if test x"$ac_isoC99_wchar_t" = xyes &&
test x"$ac_XPG2_wchar_t" = xyes; then
cat >> confdefs.h <<\EOF
@@ -8855,7 +9855,7 @@ EOF
;;
esac
- case "$target_alias" in
+ case "$target" in
*-mingw32*)
;;
*-windiss*)
@@ -8956,6 +9956,109 @@ EOF
EOF
;;
+ *-freebsd*)
+ # Must replicate generic section since we don't have strtof or strtold.
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ACOSF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ASINF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ATAN2F 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_ATANF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_CEILF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_COPYSIGN 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_COPYSIGNF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_COSF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_COSHF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_EXPF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FABSF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FLOORF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FMODF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_FREXPF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_LDEXPF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_LOG10F 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_LOGF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_MODFF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_POWF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_SINF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_SINHF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_SQRTF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_TANF 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_TANHF 1
+EOF
+
+ ;;
*)
# GLIBCPP_CHECK_STDLIB_SUPPORT
cat >> confdefs.h <<\EOF
@@ -9187,17 +10290,17 @@ else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9191: checking for $ac_hdr" >&5
+echo "configure:10294: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9196 "configure"
+#line 10299 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9201: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10304: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -9248,10 +10351,10 @@ cross_compiling=$ac_cv_prog_cxx_cross
# Check for -ffunction-sections -fdata-sections
echo $ac_n "checking for g++ that supports -ffunction-sections -fdata-sections""... $ac_c" 1>&6
-echo "configure:9252: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
+echo "configure:10355: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
CXXFLAGS='-Werror -ffunction-sections -fdata-sections'
cat > conftest.$ac_ext <<EOF
-#line 9255 "configure"
+#line 10358 "configure"
#include "confdefs.h"
int main() {
@@ -9259,7 +10362,7 @@ int foo;
; return 0; }
EOF
-if { (eval echo configure:9263: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10366: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_fdsections=yes
else
@@ -9341,12 +10444,12 @@ cross_compiling=$ac_cv_prog_cc_cross
# used sections, first .eh_frame and now some of the glibc sections for
# iconv). Bzzzzt. Thanks for playing, maybe next time.
echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
-echo "configure:9345: checking for ld that supports -Wl,--gc-sections" >&5
+echo "configure:10448: checking for ld that supports -Wl,--gc-sections" >&5
if test "$cross_compiling" = yes; then
ac_sectionLDflags=yes
else
cat > conftest.$ac_ext <<EOF
-#line 9350 "configure"
+#line 10453 "configure"
#include "confdefs.h"
int main(void)
@@ -9357,7 +10460,7 @@ else
}
EOF
-if { (eval echo configure:9361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:10464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_sectionLDflags=yes
else
@@ -9392,7 +10495,7 @@ fi
echo $ac_n "checking for __builtin_abs declaration""... $ac_c" 1>&6
-echo "configure:9396: checking for __builtin_abs declaration" >&5
+echo "configure:10499: checking for __builtin_abs declaration" >&5
if test x${glibcpp_cv_func___builtin_abs_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_abs_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9407,14 +10510,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9411 "configure"
+#line 10514 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_abs(0);
; return 0; }
EOF
-if { (eval echo configure:9418: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10521: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_abs_use=yes
else
@@ -9438,21 +10541,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_abs_use" 1>&6
if test x$glibcpp_cv_func___builtin_abs_use = x"yes"; then
echo $ac_n "checking for __builtin_abs linkage""... $ac_c" 1>&6
-echo "configure:9442: checking for __builtin_abs linkage" >&5
+echo "configure:10545: checking for __builtin_abs linkage" >&5
if test x${glibcpp_cv_func___builtin_abs_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_abs_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9449 "configure"
+#line 10552 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_abs(0);
; return 0; }
EOF
-if { (eval echo configure:9456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_abs_link=yes
else
@@ -9478,7 +10581,7 @@ EOF
echo $ac_n "checking for __builtin_fabsf declaration""... $ac_c" 1>&6
-echo "configure:9482: checking for __builtin_fabsf declaration" >&5
+echo "configure:10585: checking for __builtin_fabsf declaration" >&5
if test x${glibcpp_cv_func___builtin_fabsf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9493,14 +10596,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9497 "configure"
+#line 10600 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_fabsf(0);
; return 0; }
EOF
-if { (eval echo configure:9504: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10607: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_fabsf_use=yes
else
@@ -9524,21 +10627,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_fabsf_use" 1>&6
if test x$glibcpp_cv_func___builtin_fabsf_use = x"yes"; then
echo $ac_n "checking for __builtin_fabsf linkage""... $ac_c" 1>&6
-echo "configure:9528: checking for __builtin_fabsf linkage" >&5
+echo "configure:10631: checking for __builtin_fabsf linkage" >&5
if test x${glibcpp_cv_func___builtin_fabsf_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsf_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9535 "configure"
+#line 10638 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_fabsf(0);
; return 0; }
EOF
-if { (eval echo configure:9542: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_fabsf_link=yes
else
@@ -9564,7 +10667,7 @@ EOF
echo $ac_n "checking for __builtin_fabs declaration""... $ac_c" 1>&6
-echo "configure:9568: checking for __builtin_fabs declaration" >&5
+echo "configure:10671: checking for __builtin_fabs declaration" >&5
if test x${glibcpp_cv_func___builtin_fabs_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabs_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9579,14 +10682,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9583 "configure"
+#line 10686 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_fabs(0);
; return 0; }
EOF
-if { (eval echo configure:9590: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10693: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_fabs_use=yes
else
@@ -9610,21 +10713,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_fabs_use" 1>&6
if test x$glibcpp_cv_func___builtin_fabs_use = x"yes"; then
echo $ac_n "checking for __builtin_fabs linkage""... $ac_c" 1>&6
-echo "configure:9614: checking for __builtin_fabs linkage" >&5
+echo "configure:10717: checking for __builtin_fabs linkage" >&5
if test x${glibcpp_cv_func___builtin_fabs_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabs_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9621 "configure"
+#line 10724 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_fabs(0);
; return 0; }
EOF
-if { (eval echo configure:9628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_fabs_link=yes
else
@@ -9650,7 +10753,7 @@ EOF
echo $ac_n "checking for __builtin_fabsl declaration""... $ac_c" 1>&6
-echo "configure:9654: checking for __builtin_fabsl declaration" >&5
+echo "configure:10757: checking for __builtin_fabsl declaration" >&5
if test x${glibcpp_cv_func___builtin_fabsl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9665,14 +10768,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9669 "configure"
+#line 10772 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_fabsl(0);
; return 0; }
EOF
-if { (eval echo configure:9676: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10779: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_fabsl_use=yes
else
@@ -9696,21 +10799,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_fabsl_use" 1>&6
if test x$glibcpp_cv_func___builtin_fabsl_use = x"yes"; then
echo $ac_n "checking for __builtin_fabsl linkage""... $ac_c" 1>&6
-echo "configure:9700: checking for __builtin_fabsl linkage" >&5
+echo "configure:10803: checking for __builtin_fabsl linkage" >&5
if test x${glibcpp_cv_func___builtin_fabsl_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsl_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9707 "configure"
+#line 10810 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_fabsl(0);
; return 0; }
EOF
-if { (eval echo configure:9714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10817: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_fabsl_link=yes
else
@@ -9736,7 +10839,7 @@ EOF
echo $ac_n "checking for __builtin_labs declaration""... $ac_c" 1>&6
-echo "configure:9740: checking for __builtin_labs declaration" >&5
+echo "configure:10843: checking for __builtin_labs declaration" >&5
if test x${glibcpp_cv_func___builtin_labs_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_labs_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9751,14 +10854,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9755 "configure"
+#line 10858 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_labs(0);
; return 0; }
EOF
-if { (eval echo configure:9762: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10865: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_labs_use=yes
else
@@ -9782,21 +10885,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_labs_use" 1>&6
if test x$glibcpp_cv_func___builtin_labs_use = x"yes"; then
echo $ac_n "checking for __builtin_labs linkage""... $ac_c" 1>&6
-echo "configure:9786: checking for __builtin_labs linkage" >&5
+echo "configure:10889: checking for __builtin_labs linkage" >&5
if test x${glibcpp_cv_func___builtin_labs_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_labs_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9793 "configure"
+#line 10896 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_labs(0);
; return 0; }
EOF
-if { (eval echo configure:9800: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_labs_link=yes
else
@@ -9823,7 +10926,7 @@ EOF
echo $ac_n "checking for __builtin_sqrtf declaration""... $ac_c" 1>&6
-echo "configure:9827: checking for __builtin_sqrtf declaration" >&5
+echo "configure:10930: checking for __builtin_sqrtf declaration" >&5
if test x${glibcpp_cv_func___builtin_sqrtf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9838,14 +10941,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9842 "configure"
+#line 10945 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sqrtf(0);
; return 0; }
EOF
-if { (eval echo configure:9849: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10952: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_sqrtf_use=yes
else
@@ -9869,21 +10972,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_sqrtf_use" 1>&6
if test x$glibcpp_cv_func___builtin_sqrtf_use = x"yes"; then
echo $ac_n "checking for __builtin_sqrtf linkage""... $ac_c" 1>&6
-echo "configure:9873: checking for __builtin_sqrtf linkage" >&5
+echo "configure:10976: checking for __builtin_sqrtf linkage" >&5
if test x${glibcpp_cv_func___builtin_sqrtf_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtf_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9880 "configure"
+#line 10983 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sqrtf(0);
; return 0; }
EOF
-if { (eval echo configure:9887: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_sqrtf_link=yes
else
@@ -9909,7 +11012,7 @@ EOF
echo $ac_n "checking for __builtin_sqrt declaration""... $ac_c" 1>&6
-echo "configure:9913: checking for __builtin_sqrt declaration" >&5
+echo "configure:11016: checking for __builtin_sqrt declaration" >&5
if test x${glibcpp_cv_func___builtin_sqrt_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrt_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -9924,14 +11027,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 9928 "configure"
+#line 11031 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sqrt(0);
; return 0; }
EOF
-if { (eval echo configure:9935: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11038: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_sqrt_use=yes
else
@@ -9955,21 +11058,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_sqrt_use" 1>&6
if test x$glibcpp_cv_func___builtin_sqrt_use = x"yes"; then
echo $ac_n "checking for __builtin_sqrt linkage""... $ac_c" 1>&6
-echo "configure:9959: checking for __builtin_sqrt linkage" >&5
+echo "configure:11062: checking for __builtin_sqrt linkage" >&5
if test x${glibcpp_cv_func___builtin_sqrt_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrt_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9966 "configure"
+#line 11069 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sqrt(0);
; return 0; }
EOF
-if { (eval echo configure:9973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_sqrt_link=yes
else
@@ -9995,7 +11098,7 @@ EOF
echo $ac_n "checking for __builtin_sqrtl declaration""... $ac_c" 1>&6
-echo "configure:9999: checking for __builtin_sqrtl declaration" >&5
+echo "configure:11102: checking for __builtin_sqrtl declaration" >&5
if test x${glibcpp_cv_func___builtin_sqrtl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10010,14 +11113,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10014 "configure"
+#line 11117 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sqrtl(0);
; return 0; }
EOF
-if { (eval echo configure:10021: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11124: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_sqrtl_use=yes
else
@@ -10041,21 +11144,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_sqrtl_use" 1>&6
if test x$glibcpp_cv_func___builtin_sqrtl_use = x"yes"; then
echo $ac_n "checking for __builtin_sqrtl linkage""... $ac_c" 1>&6
-echo "configure:10045: checking for __builtin_sqrtl linkage" >&5
+echo "configure:11148: checking for __builtin_sqrtl linkage" >&5
if test x${glibcpp_cv_func___builtin_sqrtl_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtl_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10052 "configure"
+#line 11155 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sqrtl(0);
; return 0; }
EOF
-if { (eval echo configure:10059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_sqrtl_link=yes
else
@@ -10082,7 +11185,7 @@ EOF
echo $ac_n "checking for __builtin_sinf declaration""... $ac_c" 1>&6
-echo "configure:10086: checking for __builtin_sinf declaration" >&5
+echo "configure:11189: checking for __builtin_sinf declaration" >&5
if test x${glibcpp_cv_func___builtin_sinf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10097,14 +11200,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10101 "configure"
+#line 11204 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sinf(0);
; return 0; }
EOF
-if { (eval echo configure:10108: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11211: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_sinf_use=yes
else
@@ -10128,21 +11231,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_sinf_use" 1>&6
if test x$glibcpp_cv_func___builtin_sinf_use = x"yes"; then
echo $ac_n "checking for __builtin_sinf linkage""... $ac_c" 1>&6
-echo "configure:10132: checking for __builtin_sinf linkage" >&5
+echo "configure:11235: checking for __builtin_sinf linkage" >&5
if test x${glibcpp_cv_func___builtin_sinf_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinf_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10139 "configure"
+#line 11242 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sinf(0);
; return 0; }
EOF
-if { (eval echo configure:10146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11249: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_sinf_link=yes
else
@@ -10168,7 +11271,7 @@ EOF
echo $ac_n "checking for __builtin_sin declaration""... $ac_c" 1>&6
-echo "configure:10172: checking for __builtin_sin declaration" >&5
+echo "configure:11275: checking for __builtin_sin declaration" >&5
if test x${glibcpp_cv_func___builtin_sin_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sin_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10183,14 +11286,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10187 "configure"
+#line 11290 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sin(0);
; return 0; }
EOF
-if { (eval echo configure:10194: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11297: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_sin_use=yes
else
@@ -10214,21 +11317,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_sin_use" 1>&6
if test x$glibcpp_cv_func___builtin_sin_use = x"yes"; then
echo $ac_n "checking for __builtin_sin linkage""... $ac_c" 1>&6
-echo "configure:10218: checking for __builtin_sin linkage" >&5
+echo "configure:11321: checking for __builtin_sin linkage" >&5
if test x${glibcpp_cv_func___builtin_sin_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sin_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10225 "configure"
+#line 11328 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sin(0);
; return 0; }
EOF
-if { (eval echo configure:10232: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_sin_link=yes
else
@@ -10254,7 +11357,7 @@ EOF
echo $ac_n "checking for __builtin_sinl declaration""... $ac_c" 1>&6
-echo "configure:10258: checking for __builtin_sinl declaration" >&5
+echo "configure:11361: checking for __builtin_sinl declaration" >&5
if test x${glibcpp_cv_func___builtin_sinl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10269,14 +11372,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10273 "configure"
+#line 11376 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sinl(0);
; return 0; }
EOF
-if { (eval echo configure:10280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11383: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_sinl_use=yes
else
@@ -10300,21 +11403,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_sinl_use" 1>&6
if test x$glibcpp_cv_func___builtin_sinl_use = x"yes"; then
echo $ac_n "checking for __builtin_sinl linkage""... $ac_c" 1>&6
-echo "configure:10304: checking for __builtin_sinl linkage" >&5
+echo "configure:11407: checking for __builtin_sinl linkage" >&5
if test x${glibcpp_cv_func___builtin_sinl_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinl_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10311 "configure"
+#line 11414 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_sinl(0);
; return 0; }
EOF
-if { (eval echo configure:10318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_sinl_link=yes
else
@@ -10341,7 +11444,7 @@ EOF
echo $ac_n "checking for __builtin_cosf declaration""... $ac_c" 1>&6
-echo "configure:10345: checking for __builtin_cosf declaration" >&5
+echo "configure:11448: checking for __builtin_cosf declaration" >&5
if test x${glibcpp_cv_func___builtin_cosf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10356,14 +11459,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10360 "configure"
+#line 11463 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_cosf(0);
; return 0; }
EOF
-if { (eval echo configure:10367: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11470: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_cosf_use=yes
else
@@ -10387,21 +11490,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_cosf_use" 1>&6
if test x$glibcpp_cv_func___builtin_cosf_use = x"yes"; then
echo $ac_n "checking for __builtin_cosf linkage""... $ac_c" 1>&6
-echo "configure:10391: checking for __builtin_cosf linkage" >&5
+echo "configure:11494: checking for __builtin_cosf linkage" >&5
if test x${glibcpp_cv_func___builtin_cosf_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosf_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10398 "configure"
+#line 11501 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_cosf(0);
; return 0; }
EOF
-if { (eval echo configure:10405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_cosf_link=yes
else
@@ -10427,7 +11530,7 @@ EOF
echo $ac_n "checking for __builtin_cos declaration""... $ac_c" 1>&6
-echo "configure:10431: checking for __builtin_cos declaration" >&5
+echo "configure:11534: checking for __builtin_cos declaration" >&5
if test x${glibcpp_cv_func___builtin_cos_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cos_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10442,14 +11545,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10446 "configure"
+#line 11549 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_cos(0);
; return 0; }
EOF
-if { (eval echo configure:10453: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11556: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_cos_use=yes
else
@@ -10473,21 +11576,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_cos_use" 1>&6
if test x$glibcpp_cv_func___builtin_cos_use = x"yes"; then
echo $ac_n "checking for __builtin_cos linkage""... $ac_c" 1>&6
-echo "configure:10477: checking for __builtin_cos linkage" >&5
+echo "configure:11580: checking for __builtin_cos linkage" >&5
if test x${glibcpp_cv_func___builtin_cos_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cos_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10484 "configure"
+#line 11587 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_cos(0);
; return 0; }
EOF
-if { (eval echo configure:10491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_cos_link=yes
else
@@ -10513,7 +11616,7 @@ EOF
echo $ac_n "checking for __builtin_cosl declaration""... $ac_c" 1>&6
-echo "configure:10517: checking for __builtin_cosl declaration" >&5
+echo "configure:11620: checking for __builtin_cosl declaration" >&5
if test x${glibcpp_cv_func___builtin_cosl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10528,14 +11631,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10532 "configure"
+#line 11635 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_cosl(0);
; return 0; }
EOF
-if { (eval echo configure:10539: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11642: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func___builtin_cosl_use=yes
else
@@ -10559,21 +11662,21 @@ fi
echo "$ac_t""$glibcpp_cv_func___builtin_cosl_use" 1>&6
if test x$glibcpp_cv_func___builtin_cosl_use = x"yes"; then
echo $ac_n "checking for __builtin_cosl linkage""... $ac_c" 1>&6
-echo "configure:10563: checking for __builtin_cosl linkage" >&5
+echo "configure:11666: checking for __builtin_cosl linkage" >&5
if test x${glibcpp_cv_func___builtin_cosl_link+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosl_link'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10570 "configure"
+#line 11673 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
__builtin_cosl(0);
; return 0; }
EOF
-if { (eval echo configure:10577: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_cv_func___builtin_cosl_link=yes
else
@@ -10664,7 +11767,7 @@ EOF
CXXFLAGS='-fno-builtins -D_GNU_SOURCE'
echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
-echo "configure:10668: checking for sin in -lm" >&5
+echo "configure:11771: checking for sin in -lm" >&5
ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10672,7 +11775,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10676 "configure"
+#line 11779 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -10683,7 +11786,7 @@ int main() {
sin()
; return 0; }
EOF
-if { (eval echo configure:10687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11790: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -10709,7 +11812,7 @@ fi
echo $ac_n "checking for isinf declaration""... $ac_c" 1>&6
-echo "configure:10713: checking for isinf declaration" >&5
+echo "configure:11816: checking for isinf declaration" >&5
if test x${glibcpp_cv_func_isinf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_isinf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10724,7 +11827,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10728 "configure"
+#line 11831 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -10735,7 +11838,7 @@ int main() {
isinf(0);
; return 0; }
EOF
-if { (eval echo configure:10739: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11842: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_isinf_use=yes
else
@@ -10762,12 +11865,12 @@ fi
for ac_func in isinf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10766: checking for $ac_func" >&5
+echo "configure:11869: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10771 "configure"
+#line 11874 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -10790,7 +11893,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:10794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11897: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -10817,7 +11920,7 @@ done
else
echo $ac_n "checking for _isinf declaration""... $ac_c" 1>&6
-echo "configure:10821: checking for _isinf declaration" >&5
+echo "configure:11924: checking for _isinf declaration" >&5
if test x${glibcpp_cv_func__isinf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__isinf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10832,7 +11935,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10836 "configure"
+#line 11939 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -10843,7 +11946,7 @@ int main() {
_isinf(0);
; return 0; }
EOF
-if { (eval echo configure:10847: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11950: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__isinf_use=yes
else
@@ -10870,12 +11973,12 @@ fi
for ac_func in _isinf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10874: checking for $ac_func" >&5
+echo "configure:11977: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10879 "configure"
+#line 11982 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -10898,7 +12001,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:10902: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -10928,7 +12031,7 @@ done
echo $ac_n "checking for isnan declaration""... $ac_c" 1>&6
-echo "configure:10932: checking for isnan declaration" >&5
+echo "configure:12035: checking for isnan declaration" >&5
if test x${glibcpp_cv_func_isnan_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_isnan_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -10943,7 +12046,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 10947 "configure"
+#line 12050 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -10954,7 +12057,7 @@ int main() {
isnan(0);
; return 0; }
EOF
-if { (eval echo configure:10958: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12061: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_isnan_use=yes
else
@@ -10981,12 +12084,12 @@ fi
for ac_func in isnan
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10985: checking for $ac_func" >&5
+echo "configure:12088: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10990 "configure"
+#line 12093 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11009,7 +12112,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11013: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11036,7 +12139,7 @@ done
else
echo $ac_n "checking for _isnan declaration""... $ac_c" 1>&6
-echo "configure:11040: checking for _isnan declaration" >&5
+echo "configure:12143: checking for _isnan declaration" >&5
if test x${glibcpp_cv_func__isnan_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__isnan_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11051,7 +12154,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11055 "configure"
+#line 12158 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -11062,7 +12165,7 @@ int main() {
_isnan(0);
; return 0; }
EOF
-if { (eval echo configure:11066: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12169: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__isnan_use=yes
else
@@ -11089,12 +12192,12 @@ fi
for ac_func in _isnan
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11093: checking for $ac_func" >&5
+echo "configure:12196: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11098 "configure"
+#line 12201 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11117,7 +12220,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11121: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12224: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11147,7 +12250,7 @@ done
echo $ac_n "checking for finite declaration""... $ac_c" 1>&6
-echo "configure:11151: checking for finite declaration" >&5
+echo "configure:12254: checking for finite declaration" >&5
if test x${glibcpp_cv_func_finite_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_finite_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11162,7 +12265,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11166 "configure"
+#line 12269 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -11173,7 +12276,7 @@ int main() {
finite(0);
; return 0; }
EOF
-if { (eval echo configure:11177: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_finite_use=yes
else
@@ -11200,12 +12303,12 @@ fi
for ac_func in finite
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11204: checking for $ac_func" >&5
+echo "configure:12307: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11209 "configure"
+#line 12312 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11228,7 +12331,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11232: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11255,7 +12358,7 @@ done
else
echo $ac_n "checking for _finite declaration""... $ac_c" 1>&6
-echo "configure:11259: checking for _finite declaration" >&5
+echo "configure:12362: checking for _finite declaration" >&5
if test x${glibcpp_cv_func__finite_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__finite_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11270,7 +12373,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11274 "configure"
+#line 12377 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -11281,7 +12384,7 @@ int main() {
_finite(0);
; return 0; }
EOF
-if { (eval echo configure:11285: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12388: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__finite_use=yes
else
@@ -11308,12 +12411,12 @@ fi
for ac_func in _finite
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11312: checking for $ac_func" >&5
+echo "configure:12415: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11317 "configure"
+#line 12420 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11336,7 +12439,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12443: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11366,7 +12469,7 @@ done
echo $ac_n "checking for copysign declaration""... $ac_c" 1>&6
-echo "configure:11370: checking for copysign declaration" >&5
+echo "configure:12473: checking for copysign declaration" >&5
if test x${glibcpp_cv_func_copysign_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_copysign_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11381,14 +12484,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11385 "configure"
+#line 12488 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
copysign(0, 0);
; return 0; }
EOF
-if { (eval echo configure:11392: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12495: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_copysign_use=yes
else
@@ -11415,12 +12518,12 @@ fi
for ac_func in copysign
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11419: checking for $ac_func" >&5
+echo "configure:12522: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11424 "configure"
+#line 12527 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11443,7 +12546,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12550: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11470,7 +12573,7 @@ done
else
echo $ac_n "checking for _copysign declaration""... $ac_c" 1>&6
-echo "configure:11474: checking for _copysign declaration" >&5
+echo "configure:12577: checking for _copysign declaration" >&5
if test x${glibcpp_cv_func__copysign_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__copysign_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11485,14 +12588,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11489 "configure"
+#line 12592 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_copysign(0, 0);
; return 0; }
EOF
-if { (eval echo configure:11496: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12599: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__copysign_use=yes
else
@@ -11519,12 +12622,12 @@ fi
for ac_func in _copysign
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11523: checking for $ac_func" >&5
+echo "configure:12626: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11528 "configure"
+#line 12631 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11547,7 +12650,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11577,7 +12680,7 @@ done
echo $ac_n "checking for sincos declaration""... $ac_c" 1>&6
-echo "configure:11581: checking for sincos declaration" >&5
+echo "configure:12684: checking for sincos declaration" >&5
if test x${glibcpp_cv_func_sincos_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_sincos_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11592,14 +12695,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11596 "configure"
+#line 12699 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
sincos(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:11603: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12706: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_sincos_use=yes
else
@@ -11626,12 +12729,12 @@ fi
for ac_func in sincos
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11630: checking for $ac_func" >&5
+echo "configure:12733: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11635 "configure"
+#line 12738 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11654,7 +12757,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11658: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12761: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11681,7 +12784,7 @@ done
else
echo $ac_n "checking for _sincos declaration""... $ac_c" 1>&6
-echo "configure:11685: checking for _sincos declaration" >&5
+echo "configure:12788: checking for _sincos declaration" >&5
if test x${glibcpp_cv_func__sincos_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__sincos_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11696,14 +12799,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11700 "configure"
+#line 12803 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_sincos(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:11707: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__sincos_use=yes
else
@@ -11730,12 +12833,12 @@ fi
for ac_func in _sincos
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11734: checking for $ac_func" >&5
+echo "configure:12837: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11739 "configure"
+#line 12842 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11758,7 +12861,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11762: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11788,7 +12891,7 @@ done
echo $ac_n "checking for fpclass declaration""... $ac_c" 1>&6
-echo "configure:11792: checking for fpclass declaration" >&5
+echo "configure:12895: checking for fpclass declaration" >&5
if test x${glibcpp_cv_func_fpclass_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_fpclass_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11803,7 +12906,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11807 "configure"
+#line 12910 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -11814,7 +12917,7 @@ int main() {
fpclass(0);
; return 0; }
EOF
-if { (eval echo configure:11818: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12921: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_fpclass_use=yes
else
@@ -11841,12 +12944,12 @@ fi
for ac_func in fpclass
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11845: checking for $ac_func" >&5
+echo "configure:12948: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11850 "configure"
+#line 12953 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11869,7 +12972,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11873: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -11896,7 +12999,7 @@ done
else
echo $ac_n "checking for _fpclass declaration""... $ac_c" 1>&6
-echo "configure:11900: checking for _fpclass declaration" >&5
+echo "configure:13003: checking for _fpclass declaration" >&5
if test x${glibcpp_cv_func__fpclass_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__fpclass_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -11911,7 +13014,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 11915 "configure"
+#line 13018 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -11922,7 +13025,7 @@ int main() {
_fpclass(0);
; return 0; }
EOF
-if { (eval echo configure:11926: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13029: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__fpclass_use=yes
else
@@ -11949,12 +13052,12 @@ fi
for ac_func in _fpclass
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11953: checking for $ac_func" >&5
+echo "configure:13056: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11958 "configure"
+#line 13061 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -11977,7 +13080,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:11981: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12007,7 +13110,7 @@ done
echo $ac_n "checking for qfpclass declaration""... $ac_c" 1>&6
-echo "configure:12011: checking for qfpclass declaration" >&5
+echo "configure:13114: checking for qfpclass declaration" >&5
if test x${glibcpp_cv_func_qfpclass_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_qfpclass_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12022,7 +13125,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12026 "configure"
+#line 13129 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -12033,7 +13136,7 @@ int main() {
qfpclass(0);
; return 0; }
EOF
-if { (eval echo configure:12037: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13140: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_qfpclass_use=yes
else
@@ -12060,12 +13163,12 @@ fi
for ac_func in qfpclass
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12064: checking for $ac_func" >&5
+echo "configure:13167: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12069 "configure"
+#line 13172 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12088,7 +13191,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12115,7 +13218,7 @@ done
else
echo $ac_n "checking for _qfpclass declaration""... $ac_c" 1>&6
-echo "configure:12119: checking for _qfpclass declaration" >&5
+echo "configure:13222: checking for _qfpclass declaration" >&5
if test x${glibcpp_cv_func__qfpclass_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__qfpclass_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12130,7 +13233,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12134 "configure"
+#line 13237 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -12141,7 +13244,7 @@ int main() {
_qfpclass(0);
; return 0; }
EOF
-if { (eval echo configure:12145: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13248: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__qfpclass_use=yes
else
@@ -12168,12 +13271,12 @@ fi
for ac_func in _qfpclass
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12172: checking for $ac_func" >&5
+echo "configure:13275: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12177 "configure"
+#line 13280 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12196,7 +13299,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12226,7 +13329,7 @@ done
echo $ac_n "checking for hypot declaration""... $ac_c" 1>&6
-echo "configure:12230: checking for hypot declaration" >&5
+echo "configure:13333: checking for hypot declaration" >&5
if test x${glibcpp_cv_func_hypot_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_hypot_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12241,14 +13344,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12245 "configure"
+#line 13348 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
hypot(0, 0);
; return 0; }
EOF
-if { (eval echo configure:12252: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13355: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_hypot_use=yes
else
@@ -12275,12 +13378,12 @@ fi
for ac_func in hypot
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12279: checking for $ac_func" >&5
+echo "configure:13382: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12284 "configure"
+#line 13387 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12303,7 +13406,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12330,7 +13433,7 @@ done
else
echo $ac_n "checking for _hypot declaration""... $ac_c" 1>&6
-echo "configure:12334: checking for _hypot declaration" >&5
+echo "configure:13437: checking for _hypot declaration" >&5
if test x${glibcpp_cv_func__hypot_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__hypot_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12345,14 +13448,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12349 "configure"
+#line 13452 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_hypot(0, 0);
; return 0; }
EOF
-if { (eval echo configure:12356: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13459: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__hypot_use=yes
else
@@ -12379,12 +13482,12 @@ fi
for ac_func in _hypot
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12383: checking for $ac_func" >&5
+echo "configure:13486: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12388 "configure"
+#line 13491 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12407,7 +13510,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12437,7 +13540,7 @@ done
echo $ac_n "checking for float trig functions""... $ac_c" 1>&6
-echo "configure:12441: checking for float trig functions" >&5
+echo "configure:13544: checking for float trig functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func_float_trig_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -12451,7 +13554,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12455 "configure"
+#line 13558 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
@@ -12460,7 +13563,7 @@ int main() {
coshf sinhf tanhf; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:12464: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13567: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_float_trig_use=yes
else
@@ -12486,12 +13589,12 @@ fi
coshf sinhf tanhf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12490: checking for $ac_func" >&5
+echo "configure:13593: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12495 "configure"
+#line 13598 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12514,7 +13617,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12518: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12542,7 +13645,7 @@ done
echo $ac_n "checking for float round functions""... $ac_c" 1>&6
-echo "configure:12546: checking for float round functions" >&5
+echo "configure:13649: checking for float round functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func_float_round_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -12556,14 +13659,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12560 "configure"
+#line 13663 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
`for x in ceilf floorf; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:12567: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13670: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_float_round_use=yes
else
@@ -12587,12 +13690,12 @@ fi
for ac_func in ceilf floorf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12591: checking for $ac_func" >&5
+echo "configure:13694: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12596 "configure"
+#line 13699 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12615,7 +13718,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12619: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12644,7 +13747,7 @@ done
echo $ac_n "checking for expf declaration""... $ac_c" 1>&6
-echo "configure:12648: checking for expf declaration" >&5
+echo "configure:13751: checking for expf declaration" >&5
if test x${glibcpp_cv_func_expf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_expf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12659,7 +13762,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12663 "configure"
+#line 13766 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -12670,7 +13773,7 @@ int main() {
expf(0);
; return 0; }
EOF
-if { (eval echo configure:12674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_expf_use=yes
else
@@ -12697,12 +13800,12 @@ fi
for ac_func in expf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12701: checking for $ac_func" >&5
+echo "configure:13804: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12706 "configure"
+#line 13809 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12725,7 +13828,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13832: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12752,7 +13855,7 @@ done
else
echo $ac_n "checking for _expf declaration""... $ac_c" 1>&6
-echo "configure:12756: checking for _expf declaration" >&5
+echo "configure:13859: checking for _expf declaration" >&5
if test x${glibcpp_cv_func__expf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__expf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12767,7 +13870,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12771 "configure"
+#line 13874 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -12778,7 +13881,7 @@ int main() {
_expf(0);
; return 0; }
EOF
-if { (eval echo configure:12782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13885: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__expf_use=yes
else
@@ -12805,12 +13908,12 @@ fi
for ac_func in _expf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12809: checking for $ac_func" >&5
+echo "configure:13912: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12814 "configure"
+#line 13917 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12833,7 +13936,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12837: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12863,7 +13966,7 @@ done
echo $ac_n "checking for isnanf declaration""... $ac_c" 1>&6
-echo "configure:12867: checking for isnanf declaration" >&5
+echo "configure:13970: checking for isnanf declaration" >&5
if test x${glibcpp_cv_func_isnanf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_isnanf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12878,7 +13981,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12882 "configure"
+#line 13985 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -12889,7 +13992,7 @@ int main() {
isnanf(0);
; return 0; }
EOF
-if { (eval echo configure:12893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13996: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_isnanf_use=yes
else
@@ -12916,12 +14019,12 @@ fi
for ac_func in isnanf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12920: checking for $ac_func" >&5
+echo "configure:14023: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12925 "configure"
+#line 14028 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -12944,7 +14047,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:12948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14051: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -12971,7 +14074,7 @@ done
else
echo $ac_n "checking for _isnanf declaration""... $ac_c" 1>&6
-echo "configure:12975: checking for _isnanf declaration" >&5
+echo "configure:14078: checking for _isnanf declaration" >&5
if test x${glibcpp_cv_func__isnanf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__isnanf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -12986,7 +14089,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 12990 "configure"
+#line 14093 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -12997,7 +14100,7 @@ int main() {
_isnanf(0);
; return 0; }
EOF
-if { (eval echo configure:13001: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14104: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__isnanf_use=yes
else
@@ -13024,12 +14127,12 @@ fi
for ac_func in _isnanf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13028: checking for $ac_func" >&5
+echo "configure:14131: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13033 "configure"
+#line 14136 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13052,7 +14155,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14159: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13082,7 +14185,7 @@ done
echo $ac_n "checking for isinff declaration""... $ac_c" 1>&6
-echo "configure:13086: checking for isinff declaration" >&5
+echo "configure:14189: checking for isinff declaration" >&5
if test x${glibcpp_cv_func_isinff_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_isinff_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13097,7 +14200,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13101 "configure"
+#line 14204 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -13108,7 +14211,7 @@ int main() {
isinff(0);
; return 0; }
EOF
-if { (eval echo configure:13112: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14215: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_isinff_use=yes
else
@@ -13135,12 +14238,12 @@ fi
for ac_func in isinff
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13139: checking for $ac_func" >&5
+echo "configure:14242: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13144 "configure"
+#line 14247 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13163,7 +14266,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13190,7 +14293,7 @@ done
else
echo $ac_n "checking for _isinff declaration""... $ac_c" 1>&6
-echo "configure:13194: checking for _isinff declaration" >&5
+echo "configure:14297: checking for _isinff declaration" >&5
if test x${glibcpp_cv_func__isinff_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__isinff_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13205,7 +14308,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13209 "configure"
+#line 14312 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -13216,7 +14319,7 @@ int main() {
_isinff(0);
; return 0; }
EOF
-if { (eval echo configure:13220: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__isinff_use=yes
else
@@ -13243,12 +14346,12 @@ fi
for ac_func in _isinff
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13247: checking for $ac_func" >&5
+echo "configure:14350: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13252 "configure"
+#line 14355 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13271,7 +14374,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13301,7 +14404,7 @@ done
echo $ac_n "checking for atan2f declaration""... $ac_c" 1>&6
-echo "configure:13305: checking for atan2f declaration" >&5
+echo "configure:14408: checking for atan2f declaration" >&5
if test x${glibcpp_cv_func_atan2f_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_atan2f_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13316,14 +14419,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13320 "configure"
+#line 14423 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
atan2f(0, 0);
; return 0; }
EOF
-if { (eval echo configure:13327: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_atan2f_use=yes
else
@@ -13350,12 +14453,12 @@ fi
for ac_func in atan2f
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13354: checking for $ac_func" >&5
+echo "configure:14457: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13359 "configure"
+#line 14462 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13378,7 +14481,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13382: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13405,7 +14508,7 @@ done
else
echo $ac_n "checking for _atan2f declaration""... $ac_c" 1>&6
-echo "configure:13409: checking for _atan2f declaration" >&5
+echo "configure:14512: checking for _atan2f declaration" >&5
if test x${glibcpp_cv_func__atan2f_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__atan2f_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13420,14 +14523,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13424 "configure"
+#line 14527 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_atan2f(0, 0);
; return 0; }
EOF
-if { (eval echo configure:13431: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14534: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__atan2f_use=yes
else
@@ -13454,12 +14557,12 @@ fi
for ac_func in _atan2f
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13458: checking for $ac_func" >&5
+echo "configure:14561: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13463 "configure"
+#line 14566 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13482,7 +14585,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14589: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13512,7 +14615,7 @@ done
echo $ac_n "checking for fabsf declaration""... $ac_c" 1>&6
-echo "configure:13516: checking for fabsf declaration" >&5
+echo "configure:14619: checking for fabsf declaration" >&5
if test x${glibcpp_cv_func_fabsf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_fabsf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13527,7 +14630,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13531 "configure"
+#line 14634 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -13538,7 +14641,7 @@ int main() {
fabsf(0);
; return 0; }
EOF
-if { (eval echo configure:13542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14645: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_fabsf_use=yes
else
@@ -13565,12 +14668,12 @@ fi
for ac_func in fabsf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13569: checking for $ac_func" >&5
+echo "configure:14672: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13574 "configure"
+#line 14677 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13593,7 +14696,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13597: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13620,7 +14723,7 @@ done
else
echo $ac_n "checking for _fabsf declaration""... $ac_c" 1>&6
-echo "configure:13624: checking for _fabsf declaration" >&5
+echo "configure:14727: checking for _fabsf declaration" >&5
if test x${glibcpp_cv_func__fabsf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__fabsf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13635,7 +14738,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13639 "configure"
+#line 14742 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -13646,7 +14749,7 @@ int main() {
_fabsf(0);
; return 0; }
EOF
-if { (eval echo configure:13650: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14753: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__fabsf_use=yes
else
@@ -13673,12 +14776,12 @@ fi
for ac_func in _fabsf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13677: checking for $ac_func" >&5
+echo "configure:14780: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13682 "configure"
+#line 14785 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13701,7 +14804,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13731,7 +14834,7 @@ done
echo $ac_n "checking for fmodf declaration""... $ac_c" 1>&6
-echo "configure:13735: checking for fmodf declaration" >&5
+echo "configure:14838: checking for fmodf declaration" >&5
if test x${glibcpp_cv_func_fmodf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_fmodf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13746,14 +14849,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13750 "configure"
+#line 14853 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
fmodf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:13757: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14860: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_fmodf_use=yes
else
@@ -13780,12 +14883,12 @@ fi
for ac_func in fmodf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13784: checking for $ac_func" >&5
+echo "configure:14887: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13789 "configure"
+#line 14892 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13808,7 +14911,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13835,7 +14938,7 @@ done
else
echo $ac_n "checking for _fmodf declaration""... $ac_c" 1>&6
-echo "configure:13839: checking for _fmodf declaration" >&5
+echo "configure:14942: checking for _fmodf declaration" >&5
if test x${glibcpp_cv_func__fmodf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__fmodf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13850,14 +14953,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13854 "configure"
+#line 14957 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_fmodf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:13861: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14964: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__fmodf_use=yes
else
@@ -13884,12 +14987,12 @@ fi
for ac_func in _fmodf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13888: checking for $ac_func" >&5
+echo "configure:14991: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13893 "configure"
+#line 14996 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -13912,7 +15015,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:13916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -13942,7 +15045,7 @@ done
echo $ac_n "checking for frexpf declaration""... $ac_c" 1>&6
-echo "configure:13946: checking for frexpf declaration" >&5
+echo "configure:15049: checking for frexpf declaration" >&5
if test x${glibcpp_cv_func_frexpf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_frexpf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -13957,14 +15060,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 13961 "configure"
+#line 15064 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
frexpf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:13968: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15071: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_frexpf_use=yes
else
@@ -13991,12 +15094,12 @@ fi
for ac_func in frexpf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13995: checking for $ac_func" >&5
+echo "configure:15098: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14000 "configure"
+#line 15103 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14019,7 +15122,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15126: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14046,7 +15149,7 @@ done
else
echo $ac_n "checking for _frexpf declaration""... $ac_c" 1>&6
-echo "configure:14050: checking for _frexpf declaration" >&5
+echo "configure:15153: checking for _frexpf declaration" >&5
if test x${glibcpp_cv_func__frexpf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__frexpf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14061,14 +15164,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14065 "configure"
+#line 15168 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_frexpf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:14072: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15175: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__frexpf_use=yes
else
@@ -14095,12 +15198,12 @@ fi
for ac_func in _frexpf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14099: checking for $ac_func" >&5
+echo "configure:15202: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14104 "configure"
+#line 15207 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14123,7 +15226,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15230: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14153,7 +15256,7 @@ done
echo $ac_n "checking for hypotf declaration""... $ac_c" 1>&6
-echo "configure:14157: checking for hypotf declaration" >&5
+echo "configure:15260: checking for hypotf declaration" >&5
if test x${glibcpp_cv_func_hypotf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_hypotf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14168,14 +15271,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14172 "configure"
+#line 15275 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
hypotf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:14179: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15282: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_hypotf_use=yes
else
@@ -14202,12 +15305,12 @@ fi
for ac_func in hypotf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14206: checking for $ac_func" >&5
+echo "configure:15309: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14211 "configure"
+#line 15314 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14230,7 +15333,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15337: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14257,7 +15360,7 @@ done
else
echo $ac_n "checking for _hypotf declaration""... $ac_c" 1>&6
-echo "configure:14261: checking for _hypotf declaration" >&5
+echo "configure:15364: checking for _hypotf declaration" >&5
if test x${glibcpp_cv_func__hypotf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__hypotf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14272,14 +15375,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14276 "configure"
+#line 15379 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_hypotf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:14283: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15386: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__hypotf_use=yes
else
@@ -14306,12 +15409,12 @@ fi
for ac_func in _hypotf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14310: checking for $ac_func" >&5
+echo "configure:15413: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14315 "configure"
+#line 15418 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14334,7 +15437,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15441: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14364,7 +15467,7 @@ done
echo $ac_n "checking for ldexpf declaration""... $ac_c" 1>&6
-echo "configure:14368: checking for ldexpf declaration" >&5
+echo "configure:15471: checking for ldexpf declaration" >&5
if test x${glibcpp_cv_func_ldexpf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_ldexpf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14379,14 +15482,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14383 "configure"
+#line 15486 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
ldexpf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:14390: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15493: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_ldexpf_use=yes
else
@@ -14413,12 +15516,12 @@ fi
for ac_func in ldexpf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14417: checking for $ac_func" >&5
+echo "configure:15520: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14422 "configure"
+#line 15525 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14441,7 +15544,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14468,7 +15571,7 @@ done
else
echo $ac_n "checking for _ldexpf declaration""... $ac_c" 1>&6
-echo "configure:14472: checking for _ldexpf declaration" >&5
+echo "configure:15575: checking for _ldexpf declaration" >&5
if test x${glibcpp_cv_func__ldexpf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__ldexpf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14483,14 +15586,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14487 "configure"
+#line 15590 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_ldexpf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:14494: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15597: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__ldexpf_use=yes
else
@@ -14517,12 +15620,12 @@ fi
for ac_func in _ldexpf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14521: checking for $ac_func" >&5
+echo "configure:15624: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14526 "configure"
+#line 15629 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14545,7 +15648,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14575,7 +15678,7 @@ done
echo $ac_n "checking for logf declaration""... $ac_c" 1>&6
-echo "configure:14579: checking for logf declaration" >&5
+echo "configure:15682: checking for logf declaration" >&5
if test x${glibcpp_cv_func_logf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_logf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14590,7 +15693,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14594 "configure"
+#line 15697 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -14601,7 +15704,7 @@ int main() {
logf(0);
; return 0; }
EOF
-if { (eval echo configure:14605: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15708: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_logf_use=yes
else
@@ -14628,12 +15731,12 @@ fi
for ac_func in logf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14632: checking for $ac_func" >&5
+echo "configure:15735: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14637 "configure"
+#line 15740 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14656,7 +15759,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14660: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14683,7 +15786,7 @@ done
else
echo $ac_n "checking for _logf declaration""... $ac_c" 1>&6
-echo "configure:14687: checking for _logf declaration" >&5
+echo "configure:15790: checking for _logf declaration" >&5
if test x${glibcpp_cv_func__logf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__logf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14698,7 +15801,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14702 "configure"
+#line 15805 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -14709,7 +15812,7 @@ int main() {
_logf(0);
; return 0; }
EOF
-if { (eval echo configure:14713: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15816: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__logf_use=yes
else
@@ -14736,12 +15839,12 @@ fi
for ac_func in _logf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14740: checking for $ac_func" >&5
+echo "configure:15843: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14745 "configure"
+#line 15848 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14764,7 +15867,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14768: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15871: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14794,7 +15897,7 @@ done
echo $ac_n "checking for log10f declaration""... $ac_c" 1>&6
-echo "configure:14798: checking for log10f declaration" >&5
+echo "configure:15901: checking for log10f declaration" >&5
if test x${glibcpp_cv_func_log10f_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_log10f_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14809,7 +15912,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14813 "configure"
+#line 15916 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -14820,7 +15923,7 @@ int main() {
log10f(0);
; return 0; }
EOF
-if { (eval echo configure:14824: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15927: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_log10f_use=yes
else
@@ -14847,12 +15950,12 @@ fi
for ac_func in log10f
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14851: checking for $ac_func" >&5
+echo "configure:15954: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14856 "configure"
+#line 15959 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14875,7 +15978,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14879: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -14902,7 +16005,7 @@ done
else
echo $ac_n "checking for _log10f declaration""... $ac_c" 1>&6
-echo "configure:14906: checking for _log10f declaration" >&5
+echo "configure:16009: checking for _log10f declaration" >&5
if test x${glibcpp_cv_func__log10f_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__log10f_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -14917,7 +16020,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 14921 "configure"
+#line 16024 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -14928,7 +16031,7 @@ int main() {
_log10f(0);
; return 0; }
EOF
-if { (eval echo configure:14932: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16035: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__log10f_use=yes
else
@@ -14955,12 +16058,12 @@ fi
for ac_func in _log10f
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14959: checking for $ac_func" >&5
+echo "configure:16062: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 14964 "configure"
+#line 16067 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -14983,7 +16086,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:14987: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16090: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15013,7 +16116,7 @@ done
echo $ac_n "checking for modff declaration""... $ac_c" 1>&6
-echo "configure:15017: checking for modff declaration" >&5
+echo "configure:16120: checking for modff declaration" >&5
if test x${glibcpp_cv_func_modff_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_modff_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15028,14 +16131,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15032 "configure"
+#line 16135 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
modff(0, 0);
; return 0; }
EOF
-if { (eval echo configure:15039: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16142: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_modff_use=yes
else
@@ -15062,12 +16165,12 @@ fi
for ac_func in modff
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15066: checking for $ac_func" >&5
+echo "configure:16169: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15071 "configure"
+#line 16174 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15090,7 +16193,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15117,7 +16220,7 @@ done
else
echo $ac_n "checking for _modff declaration""... $ac_c" 1>&6
-echo "configure:15121: checking for _modff declaration" >&5
+echo "configure:16224: checking for _modff declaration" >&5
if test x${glibcpp_cv_func__modff_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__modff_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15132,14 +16235,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15136 "configure"
+#line 16239 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_modff(0, 0);
; return 0; }
EOF
-if { (eval echo configure:15143: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16246: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__modff_use=yes
else
@@ -15166,12 +16269,12 @@ fi
for ac_func in _modff
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15170: checking for $ac_func" >&5
+echo "configure:16273: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15175 "configure"
+#line 16278 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15194,7 +16297,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15224,7 +16327,7 @@ done
echo $ac_n "checking for powf declaration""... $ac_c" 1>&6
-echo "configure:15228: checking for powf declaration" >&5
+echo "configure:16331: checking for powf declaration" >&5
if test x${glibcpp_cv_func_powf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_powf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15239,14 +16342,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15243 "configure"
+#line 16346 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
powf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:15250: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16353: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_powf_use=yes
else
@@ -15273,12 +16376,12 @@ fi
for ac_func in powf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15277: checking for $ac_func" >&5
+echo "configure:16380: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15282 "configure"
+#line 16385 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15301,7 +16404,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15305: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15328,7 +16431,7 @@ done
else
echo $ac_n "checking for _powf declaration""... $ac_c" 1>&6
-echo "configure:15332: checking for _powf declaration" >&5
+echo "configure:16435: checking for _powf declaration" >&5
if test x${glibcpp_cv_func__powf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__powf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15343,14 +16446,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15347 "configure"
+#line 16450 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_powf(0, 0);
; return 0; }
EOF
-if { (eval echo configure:15354: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16457: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__powf_use=yes
else
@@ -15377,12 +16480,12 @@ fi
for ac_func in _powf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15381: checking for $ac_func" >&5
+echo "configure:16484: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15386 "configure"
+#line 16489 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15405,7 +16508,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15435,7 +16538,7 @@ done
echo $ac_n "checking for sqrtf declaration""... $ac_c" 1>&6
-echo "configure:15439: checking for sqrtf declaration" >&5
+echo "configure:16542: checking for sqrtf declaration" >&5
if test x${glibcpp_cv_func_sqrtf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_sqrtf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15450,7 +16553,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15454 "configure"
+#line 16557 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -15461,7 +16564,7 @@ int main() {
sqrtf(0);
; return 0; }
EOF
-if { (eval echo configure:15465: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16568: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_sqrtf_use=yes
else
@@ -15488,12 +16591,12 @@ fi
for ac_func in sqrtf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15492: checking for $ac_func" >&5
+echo "configure:16595: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15497 "configure"
+#line 16600 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15516,7 +16619,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15520: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15543,7 +16646,7 @@ done
else
echo $ac_n "checking for _sqrtf declaration""... $ac_c" 1>&6
-echo "configure:15547: checking for _sqrtf declaration" >&5
+echo "configure:16650: checking for _sqrtf declaration" >&5
if test x${glibcpp_cv_func__sqrtf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__sqrtf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15558,7 +16661,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15562 "configure"
+#line 16665 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -15569,7 +16672,7 @@ int main() {
_sqrtf(0);
; return 0; }
EOF
-if { (eval echo configure:15573: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16676: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__sqrtf_use=yes
else
@@ -15596,12 +16699,12 @@ fi
for ac_func in _sqrtf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15600: checking for $ac_func" >&5
+echo "configure:16703: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15605 "configure"
+#line 16708 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15624,7 +16727,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15654,7 +16757,7 @@ done
echo $ac_n "checking for sincosf declaration""... $ac_c" 1>&6
-echo "configure:15658: checking for sincosf declaration" >&5
+echo "configure:16761: checking for sincosf declaration" >&5
if test x${glibcpp_cv_func_sincosf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_sincosf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15669,14 +16772,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15673 "configure"
+#line 16776 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
sincosf(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:15680: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16783: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_sincosf_use=yes
else
@@ -15703,12 +16806,12 @@ fi
for ac_func in sincosf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15707: checking for $ac_func" >&5
+echo "configure:16810: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15712 "configure"
+#line 16815 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15731,7 +16834,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15758,7 +16861,7 @@ done
else
echo $ac_n "checking for _sincosf declaration""... $ac_c" 1>&6
-echo "configure:15762: checking for _sincosf declaration" >&5
+echo "configure:16865: checking for _sincosf declaration" >&5
if test x${glibcpp_cv_func__sincosf_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__sincosf_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15773,14 +16876,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15777 "configure"
+#line 16880 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_sincosf(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:15784: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__sincosf_use=yes
else
@@ -15807,12 +16910,12 @@ fi
for ac_func in _sincosf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15811: checking for $ac_func" >&5
+echo "configure:16914: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15816 "configure"
+#line 16919 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15835,7 +16938,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16942: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15865,7 +16968,7 @@ done
echo $ac_n "checking for finitef declaration""... $ac_c" 1>&6
-echo "configure:15869: checking for finitef declaration" >&5
+echo "configure:16972: checking for finitef declaration" >&5
if test x${glibcpp_cv_func_finitef_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_finitef_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15880,7 +16983,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15884 "configure"
+#line 16987 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -15891,7 +16994,7 @@ int main() {
finitef(0);
; return 0; }
EOF
-if { (eval echo configure:15895: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:16998: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_finitef_use=yes
else
@@ -15918,12 +17021,12 @@ fi
for ac_func in finitef
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15922: checking for $ac_func" >&5
+echo "configure:17025: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 15927 "configure"
+#line 17030 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -15946,7 +17049,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:15950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17053: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -15973,7 +17076,7 @@ done
else
echo $ac_n "checking for _finitef declaration""... $ac_c" 1>&6
-echo "configure:15977: checking for _finitef declaration" >&5
+echo "configure:17080: checking for _finitef declaration" >&5
if test x${glibcpp_cv_func__finitef_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__finitef_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -15988,7 +17091,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 15992 "configure"
+#line 17095 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -15999,7 +17102,7 @@ int main() {
_finitef(0);
; return 0; }
EOF
-if { (eval echo configure:16003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17106: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__finitef_use=yes
else
@@ -16026,12 +17129,12 @@ fi
for ac_func in _finitef
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16030: checking for $ac_func" >&5
+echo "configure:17133: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16035 "configure"
+#line 17138 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16054,7 +17157,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16084,7 +17187,7 @@ done
echo $ac_n "checking for long double trig functions""... $ac_c" 1>&6
-echo "configure:16088: checking for long double trig functions" >&5
+echo "configure:17191: checking for long double trig functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func_long_double_trig_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -16098,7 +17201,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16102 "configure"
+#line 17205 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
@@ -16107,7 +17210,7 @@ int main() {
coshl sinhl tanhl; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:16111: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17214: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_long_double_trig_use=yes
else
@@ -16133,12 +17236,12 @@ fi
coshl sinhl tanhl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16137: checking for $ac_func" >&5
+echo "configure:17240: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16142 "configure"
+#line 17245 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16161,7 +17264,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17268: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16189,7 +17292,7 @@ done
echo $ac_n "checking for long double round functions""... $ac_c" 1>&6
-echo "configure:16193: checking for long double round functions" >&5
+echo "configure:17296: checking for long double round functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func_long_double_round_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -16203,14 +17306,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16207 "configure"
+#line 17310 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
`for x in ceill floorl; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:16214: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_long_double_round_use=yes
else
@@ -16234,12 +17337,12 @@ fi
for ac_func in ceill floorl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16238: checking for $ac_func" >&5
+echo "configure:17341: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16243 "configure"
+#line 17346 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16262,7 +17365,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16291,7 +17394,7 @@ done
echo $ac_n "checking for isnanl declaration""... $ac_c" 1>&6
-echo "configure:16295: checking for isnanl declaration" >&5
+echo "configure:17398: checking for isnanl declaration" >&5
if test x${glibcpp_cv_func_isnanl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_isnanl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16306,7 +17409,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16310 "configure"
+#line 17413 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -16317,7 +17420,7 @@ int main() {
isnanl(0);
; return 0; }
EOF
-if { (eval echo configure:16321: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17424: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_isnanl_use=yes
else
@@ -16344,12 +17447,12 @@ fi
for ac_func in isnanl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16348: checking for $ac_func" >&5
+echo "configure:17451: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16353 "configure"
+#line 17456 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16372,7 +17475,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16399,7 +17502,7 @@ done
else
echo $ac_n "checking for _isnanl declaration""... $ac_c" 1>&6
-echo "configure:16403: checking for _isnanl declaration" >&5
+echo "configure:17506: checking for _isnanl declaration" >&5
if test x${glibcpp_cv_func__isnanl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__isnanl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16414,7 +17517,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16418 "configure"
+#line 17521 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -16425,7 +17528,7 @@ int main() {
_isnanl(0);
; return 0; }
EOF
-if { (eval echo configure:16429: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17532: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__isnanl_use=yes
else
@@ -16452,12 +17555,12 @@ fi
for ac_func in _isnanl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16456: checking for $ac_func" >&5
+echo "configure:17559: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16461 "configure"
+#line 17564 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16480,7 +17583,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16484: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17587: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16510,7 +17613,7 @@ done
echo $ac_n "checking for isinfl declaration""... $ac_c" 1>&6
-echo "configure:16514: checking for isinfl declaration" >&5
+echo "configure:17617: checking for isinfl declaration" >&5
if test x${glibcpp_cv_func_isinfl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_isinfl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16525,7 +17628,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16529 "configure"
+#line 17632 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -16536,7 +17639,7 @@ int main() {
isinfl(0);
; return 0; }
EOF
-if { (eval echo configure:16540: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17643: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_isinfl_use=yes
else
@@ -16563,12 +17666,12 @@ fi
for ac_func in isinfl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16567: checking for $ac_func" >&5
+echo "configure:17670: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16572 "configure"
+#line 17675 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16591,7 +17694,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16618,7 +17721,7 @@ done
else
echo $ac_n "checking for _isinfl declaration""... $ac_c" 1>&6
-echo "configure:16622: checking for _isinfl declaration" >&5
+echo "configure:17725: checking for _isinfl declaration" >&5
if test x${glibcpp_cv_func__isinfl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__isinfl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16633,7 +17736,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16637 "configure"
+#line 17740 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -16644,7 +17747,7 @@ int main() {
_isinfl(0);
; return 0; }
EOF
-if { (eval echo configure:16648: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17751: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__isinfl_use=yes
else
@@ -16671,12 +17774,12 @@ fi
for ac_func in _isinfl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16675: checking for $ac_func" >&5
+echo "configure:17778: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16680 "configure"
+#line 17783 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16699,7 +17802,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16729,7 +17832,7 @@ done
echo $ac_n "checking for copysignl declaration""... $ac_c" 1>&6
-echo "configure:16733: checking for copysignl declaration" >&5
+echo "configure:17836: checking for copysignl declaration" >&5
if test x${glibcpp_cv_func_copysignl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_copysignl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16744,14 +17847,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16748 "configure"
+#line 17851 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
copysignl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:16755: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17858: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_copysignl_use=yes
else
@@ -16778,12 +17881,12 @@ fi
for ac_func in copysignl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16782: checking for $ac_func" >&5
+echo "configure:17885: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16787 "configure"
+#line 17890 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16806,7 +17909,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16810: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16833,7 +17936,7 @@ done
else
echo $ac_n "checking for _copysignl declaration""... $ac_c" 1>&6
-echo "configure:16837: checking for _copysignl declaration" >&5
+echo "configure:17940: checking for _copysignl declaration" >&5
if test x${glibcpp_cv_func__copysignl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__copysignl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16848,14 +17951,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16852 "configure"
+#line 17955 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_copysignl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:16859: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17962: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__copysignl_use=yes
else
@@ -16882,12 +17985,12 @@ fi
for ac_func in _copysignl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16886: checking for $ac_func" >&5
+echo "configure:17989: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16891 "configure"
+#line 17994 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -16910,7 +18013,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:16914: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18017: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -16940,7 +18043,7 @@ done
echo $ac_n "checking for atan2l declaration""... $ac_c" 1>&6
-echo "configure:16944: checking for atan2l declaration" >&5
+echo "configure:18047: checking for atan2l declaration" >&5
if test x${glibcpp_cv_func_atan2l_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_atan2l_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -16955,14 +18058,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 16959 "configure"
+#line 18062 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
atan2l(0, 0);
; return 0; }
EOF
-if { (eval echo configure:16966: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18069: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_atan2l_use=yes
else
@@ -16989,12 +18092,12 @@ fi
for ac_func in atan2l
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:16993: checking for $ac_func" >&5
+echo "configure:18096: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 16998 "configure"
+#line 18101 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17017,7 +18120,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18124: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17044,7 +18147,7 @@ done
else
echo $ac_n "checking for _atan2l declaration""... $ac_c" 1>&6
-echo "configure:17048: checking for _atan2l declaration" >&5
+echo "configure:18151: checking for _atan2l declaration" >&5
if test x${glibcpp_cv_func__atan2l_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__atan2l_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17059,14 +18162,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17063 "configure"
+#line 18166 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_atan2l(0, 0);
; return 0; }
EOF
-if { (eval echo configure:17070: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18173: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__atan2l_use=yes
else
@@ -17093,12 +18196,12 @@ fi
for ac_func in _atan2l
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17097: checking for $ac_func" >&5
+echo "configure:18200: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17102 "configure"
+#line 18205 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17121,7 +18224,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18228: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17151,7 +18254,7 @@ done
echo $ac_n "checking for expl declaration""... $ac_c" 1>&6
-echo "configure:17155: checking for expl declaration" >&5
+echo "configure:18258: checking for expl declaration" >&5
if test x${glibcpp_cv_func_expl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_expl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17166,7 +18269,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17170 "configure"
+#line 18273 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -17177,7 +18280,7 @@ int main() {
expl(0);
; return 0; }
EOF
-if { (eval echo configure:17181: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18284: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_expl_use=yes
else
@@ -17204,12 +18307,12 @@ fi
for ac_func in expl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17208: checking for $ac_func" >&5
+echo "configure:18311: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17213 "configure"
+#line 18316 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17232,7 +18335,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17236: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18339: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17259,7 +18362,7 @@ done
else
echo $ac_n "checking for _expl declaration""... $ac_c" 1>&6
-echo "configure:17263: checking for _expl declaration" >&5
+echo "configure:18366: checking for _expl declaration" >&5
if test x${glibcpp_cv_func__expl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__expl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17274,7 +18377,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17278 "configure"
+#line 18381 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -17285,7 +18388,7 @@ int main() {
_expl(0);
; return 0; }
EOF
-if { (eval echo configure:17289: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18392: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__expl_use=yes
else
@@ -17312,12 +18415,12 @@ fi
for ac_func in _expl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17316: checking for $ac_func" >&5
+echo "configure:18419: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17321 "configure"
+#line 18424 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17340,7 +18443,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17344: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17370,7 +18473,7 @@ done
echo $ac_n "checking for fabsl declaration""... $ac_c" 1>&6
-echo "configure:17374: checking for fabsl declaration" >&5
+echo "configure:18477: checking for fabsl declaration" >&5
if test x${glibcpp_cv_func_fabsl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_fabsl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17385,7 +18488,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17389 "configure"
+#line 18492 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -17396,7 +18499,7 @@ int main() {
fabsl(0);
; return 0; }
EOF
-if { (eval echo configure:17400: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18503: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_fabsl_use=yes
else
@@ -17423,12 +18526,12 @@ fi
for ac_func in fabsl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17427: checking for $ac_func" >&5
+echo "configure:18530: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17432 "configure"
+#line 18535 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17451,7 +18554,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17478,7 +18581,7 @@ done
else
echo $ac_n "checking for _fabsl declaration""... $ac_c" 1>&6
-echo "configure:17482: checking for _fabsl declaration" >&5
+echo "configure:18585: checking for _fabsl declaration" >&5
if test x${glibcpp_cv_func__fabsl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__fabsl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17493,7 +18596,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17497 "configure"
+#line 18600 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -17504,7 +18607,7 @@ int main() {
_fabsl(0);
; return 0; }
EOF
-if { (eval echo configure:17508: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18611: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__fabsl_use=yes
else
@@ -17531,12 +18634,12 @@ fi
for ac_func in _fabsl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17535: checking for $ac_func" >&5
+echo "configure:18638: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17540 "configure"
+#line 18643 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17559,7 +18662,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18666: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17589,7 +18692,7 @@ done
echo $ac_n "checking for fmodl declaration""... $ac_c" 1>&6
-echo "configure:17593: checking for fmodl declaration" >&5
+echo "configure:18696: checking for fmodl declaration" >&5
if test x${glibcpp_cv_func_fmodl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_fmodl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17604,14 +18707,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17608 "configure"
+#line 18711 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
fmodl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:17615: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18718: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_fmodl_use=yes
else
@@ -17638,12 +18741,12 @@ fi
for ac_func in fmodl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17642: checking for $ac_func" >&5
+echo "configure:18745: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17647 "configure"
+#line 18750 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17666,7 +18769,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17693,7 +18796,7 @@ done
else
echo $ac_n "checking for _fmodl declaration""... $ac_c" 1>&6
-echo "configure:17697: checking for _fmodl declaration" >&5
+echo "configure:18800: checking for _fmodl declaration" >&5
if test x${glibcpp_cv_func__fmodl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__fmodl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17708,14 +18811,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17712 "configure"
+#line 18815 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_fmodl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:17719: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18822: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__fmodl_use=yes
else
@@ -17742,12 +18845,12 @@ fi
for ac_func in _fmodl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17746: checking for $ac_func" >&5
+echo "configure:18849: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17751 "configure"
+#line 18854 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17770,7 +18873,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17774: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18877: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17800,7 +18903,7 @@ done
echo $ac_n "checking for frexpl declaration""... $ac_c" 1>&6
-echo "configure:17804: checking for frexpl declaration" >&5
+echo "configure:18907: checking for frexpl declaration" >&5
if test x${glibcpp_cv_func_frexpl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_frexpl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17815,14 +18918,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17819 "configure"
+#line 18922 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
frexpl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:17826: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:18929: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_frexpl_use=yes
else
@@ -17849,12 +18952,12 @@ fi
for ac_func in frexpl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17853: checking for $ac_func" >&5
+echo "configure:18956: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17858 "configure"
+#line 18961 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17877,7 +18980,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17881: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -17904,7 +19007,7 @@ done
else
echo $ac_n "checking for _frexpl declaration""... $ac_c" 1>&6
-echo "configure:17908: checking for _frexpl declaration" >&5
+echo "configure:19011: checking for _frexpl declaration" >&5
if test x${glibcpp_cv_func__frexpl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__frexpl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -17919,14 +19022,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 17923 "configure"
+#line 19026 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_frexpl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:17930: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19033: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__frexpl_use=yes
else
@@ -17953,12 +19056,12 @@ fi
for ac_func in _frexpl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:17957: checking for $ac_func" >&5
+echo "configure:19060: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 17962 "configure"
+#line 19065 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -17981,7 +19084,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:17985: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18011,7 +19114,7 @@ done
echo $ac_n "checking for hypotl declaration""... $ac_c" 1>&6
-echo "configure:18015: checking for hypotl declaration" >&5
+echo "configure:19118: checking for hypotl declaration" >&5
if test x${glibcpp_cv_func_hypotl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_hypotl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18026,14 +19129,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18030 "configure"
+#line 19133 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
hypotl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:18037: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19140: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_hypotl_use=yes
else
@@ -18060,12 +19163,12 @@ fi
for ac_func in hypotl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18064: checking for $ac_func" >&5
+echo "configure:19167: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18069 "configure"
+#line 19172 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18088,7 +19191,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18115,7 +19218,7 @@ done
else
echo $ac_n "checking for _hypotl declaration""... $ac_c" 1>&6
-echo "configure:18119: checking for _hypotl declaration" >&5
+echo "configure:19222: checking for _hypotl declaration" >&5
if test x${glibcpp_cv_func__hypotl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__hypotl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18130,14 +19233,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18134 "configure"
+#line 19237 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_hypotl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:18141: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19244: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__hypotl_use=yes
else
@@ -18164,12 +19267,12 @@ fi
for ac_func in _hypotl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18168: checking for $ac_func" >&5
+echo "configure:19271: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18173 "configure"
+#line 19276 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18192,7 +19295,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18222,7 +19325,7 @@ done
echo $ac_n "checking for ldexpl declaration""... $ac_c" 1>&6
-echo "configure:18226: checking for ldexpl declaration" >&5
+echo "configure:19329: checking for ldexpl declaration" >&5
if test x${glibcpp_cv_func_ldexpl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_ldexpl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18237,14 +19340,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18241 "configure"
+#line 19344 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
ldexpl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:18248: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19351: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_ldexpl_use=yes
else
@@ -18271,12 +19374,12 @@ fi
for ac_func in ldexpl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18275: checking for $ac_func" >&5
+echo "configure:19378: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18280 "configure"
+#line 19383 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18299,7 +19402,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18326,7 +19429,7 @@ done
else
echo $ac_n "checking for _ldexpl declaration""... $ac_c" 1>&6
-echo "configure:18330: checking for _ldexpl declaration" >&5
+echo "configure:19433: checking for _ldexpl declaration" >&5
if test x${glibcpp_cv_func__ldexpl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__ldexpl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18341,14 +19444,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18345 "configure"
+#line 19448 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_ldexpl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:18352: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19455: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__ldexpl_use=yes
else
@@ -18375,12 +19478,12 @@ fi
for ac_func in _ldexpl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18379: checking for $ac_func" >&5
+echo "configure:19482: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18384 "configure"
+#line 19487 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18403,7 +19506,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18433,7 +19536,7 @@ done
echo $ac_n "checking for logl declaration""... $ac_c" 1>&6
-echo "configure:18437: checking for logl declaration" >&5
+echo "configure:19540: checking for logl declaration" >&5
if test x${glibcpp_cv_func_logl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_logl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18448,7 +19551,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18452 "configure"
+#line 19555 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -18459,7 +19562,7 @@ int main() {
logl(0);
; return 0; }
EOF
-if { (eval echo configure:18463: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_logl_use=yes
else
@@ -18486,12 +19589,12 @@ fi
for ac_func in logl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18490: checking for $ac_func" >&5
+echo "configure:19593: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18495 "configure"
+#line 19598 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18514,7 +19617,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18518: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18541,7 +19644,7 @@ done
else
echo $ac_n "checking for _logl declaration""... $ac_c" 1>&6
-echo "configure:18545: checking for _logl declaration" >&5
+echo "configure:19648: checking for _logl declaration" >&5
if test x${glibcpp_cv_func__logl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__logl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18556,7 +19659,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18560 "configure"
+#line 19663 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -18567,7 +19670,7 @@ int main() {
_logl(0);
; return 0; }
EOF
-if { (eval echo configure:18571: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__logl_use=yes
else
@@ -18594,12 +19697,12 @@ fi
for ac_func in _logl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18598: checking for $ac_func" >&5
+echo "configure:19701: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18603 "configure"
+#line 19706 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18622,7 +19725,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18652,7 +19755,7 @@ done
echo $ac_n "checking for log10l declaration""... $ac_c" 1>&6
-echo "configure:18656: checking for log10l declaration" >&5
+echo "configure:19759: checking for log10l declaration" >&5
if test x${glibcpp_cv_func_log10l_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_log10l_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18667,7 +19770,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18671 "configure"
+#line 19774 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -18678,7 +19781,7 @@ int main() {
log10l(0);
; return 0; }
EOF
-if { (eval echo configure:18682: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19785: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_log10l_use=yes
else
@@ -18705,12 +19808,12 @@ fi
for ac_func in log10l
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18709: checking for $ac_func" >&5
+echo "configure:19812: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18714 "configure"
+#line 19817 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18733,7 +19836,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18760,7 +19863,7 @@ done
else
echo $ac_n "checking for _log10l declaration""... $ac_c" 1>&6
-echo "configure:18764: checking for _log10l declaration" >&5
+echo "configure:19867: checking for _log10l declaration" >&5
if test x${glibcpp_cv_func__log10l_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__log10l_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18775,7 +19878,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18779 "configure"
+#line 19882 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -18786,7 +19889,7 @@ int main() {
_log10l(0);
; return 0; }
EOF
-if { (eval echo configure:18790: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:19893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__log10l_use=yes
else
@@ -18813,12 +19916,12 @@ fi
for ac_func in _log10l
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18817: checking for $ac_func" >&5
+echo "configure:19920: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18822 "configure"
+#line 19925 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18841,7 +19944,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:19948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18871,7 +19974,7 @@ done
echo $ac_n "checking for modfl declaration""... $ac_c" 1>&6
-echo "configure:18875: checking for modfl declaration" >&5
+echo "configure:19978: checking for modfl declaration" >&5
if test x${glibcpp_cv_func_modfl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_modfl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18886,14 +19989,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18890 "configure"
+#line 19993 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
modfl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:18897: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20000: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_modfl_use=yes
else
@@ -18920,12 +20023,12 @@ fi
for ac_func in modfl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:18924: checking for $ac_func" >&5
+echo "configure:20027: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 18929 "configure"
+#line 20032 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -18948,7 +20051,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:18952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20055: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -18975,7 +20078,7 @@ done
else
echo $ac_n "checking for _modfl declaration""... $ac_c" 1>&6
-echo "configure:18979: checking for _modfl declaration" >&5
+echo "configure:20082: checking for _modfl declaration" >&5
if test x${glibcpp_cv_func__modfl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__modfl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -18990,14 +20093,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 18994 "configure"
+#line 20097 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_modfl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:19001: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20104: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__modfl_use=yes
else
@@ -19024,12 +20127,12 @@ fi
for ac_func in _modfl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19028: checking for $ac_func" >&5
+echo "configure:20131: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19033 "configure"
+#line 20136 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19052,7 +20155,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20159: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19082,7 +20185,7 @@ done
echo $ac_n "checking for powl declaration""... $ac_c" 1>&6
-echo "configure:19086: checking for powl declaration" >&5
+echo "configure:20189: checking for powl declaration" >&5
if test x${glibcpp_cv_func_powl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_powl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19097,14 +20200,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19101 "configure"
+#line 20204 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
powl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:19108: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20211: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_powl_use=yes
else
@@ -19131,12 +20234,12 @@ fi
for ac_func in powl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19135: checking for $ac_func" >&5
+echo "configure:20238: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19140 "configure"
+#line 20243 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19159,7 +20262,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19186,7 +20289,7 @@ done
else
echo $ac_n "checking for _powl declaration""... $ac_c" 1>&6
-echo "configure:19190: checking for _powl declaration" >&5
+echo "configure:20293: checking for _powl declaration" >&5
if test x${glibcpp_cv_func__powl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__powl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19201,14 +20304,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19205 "configure"
+#line 20308 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_powl(0, 0);
; return 0; }
EOF
-if { (eval echo configure:19212: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20315: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__powl_use=yes
else
@@ -19235,12 +20338,12 @@ fi
for ac_func in _powl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19239: checking for $ac_func" >&5
+echo "configure:20342: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19244 "configure"
+#line 20347 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19263,7 +20366,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19293,7 +20396,7 @@ done
echo $ac_n "checking for sqrtl declaration""... $ac_c" 1>&6
-echo "configure:19297: checking for sqrtl declaration" >&5
+echo "configure:20400: checking for sqrtl declaration" >&5
if test x${glibcpp_cv_func_sqrtl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_sqrtl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19308,7 +20411,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19312 "configure"
+#line 20415 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -19319,7 +20422,7 @@ int main() {
sqrtl(0);
; return 0; }
EOF
-if { (eval echo configure:19323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20426: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_sqrtl_use=yes
else
@@ -19346,12 +20449,12 @@ fi
for ac_func in sqrtl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19350: checking for $ac_func" >&5
+echo "configure:20453: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19355 "configure"
+#line 20458 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19374,7 +20477,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20481: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19401,7 +20504,7 @@ done
else
echo $ac_n "checking for _sqrtl declaration""... $ac_c" 1>&6
-echo "configure:19405: checking for _sqrtl declaration" >&5
+echo "configure:20508: checking for _sqrtl declaration" >&5
if test x${glibcpp_cv_func__sqrtl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__sqrtl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19416,7 +20519,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19420 "configure"
+#line 20523 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -19427,7 +20530,7 @@ int main() {
_sqrtl(0);
; return 0; }
EOF
-if { (eval echo configure:19431: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20534: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__sqrtl_use=yes
else
@@ -19454,12 +20557,12 @@ fi
for ac_func in _sqrtl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19458: checking for $ac_func" >&5
+echo "configure:20561: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19463 "configure"
+#line 20566 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19482,7 +20585,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20589: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19512,7 +20615,7 @@ done
echo $ac_n "checking for sincosl declaration""... $ac_c" 1>&6
-echo "configure:19516: checking for sincosl declaration" >&5
+echo "configure:20619: checking for sincosl declaration" >&5
if test x${glibcpp_cv_func_sincosl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_sincosl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19527,14 +20630,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19531 "configure"
+#line 20634 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
sincosl(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:19538: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20641: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_sincosl_use=yes
else
@@ -19561,12 +20664,12 @@ fi
for ac_func in sincosl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19565: checking for $ac_func" >&5
+echo "configure:20668: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19570 "configure"
+#line 20673 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19589,7 +20692,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19593: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19616,7 +20719,7 @@ done
else
echo $ac_n "checking for _sincosl declaration""... $ac_c" 1>&6
-echo "configure:19620: checking for _sincosl declaration" >&5
+echo "configure:20723: checking for _sincosl declaration" >&5
if test x${glibcpp_cv_func__sincosl_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__sincosl_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19631,14 +20734,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19635 "configure"
+#line 20738 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
_sincosl(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:19642: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20745: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__sincosl_use=yes
else
@@ -19665,12 +20768,12 @@ fi
for ac_func in _sincosl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19669: checking for $ac_func" >&5
+echo "configure:20772: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19674 "configure"
+#line 20777 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19693,7 +20796,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19697: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20800: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19723,7 +20826,7 @@ done
echo $ac_n "checking for finitel declaration""... $ac_c" 1>&6
-echo "configure:19727: checking for finitel declaration" >&5
+echo "configure:20830: checking for finitel declaration" >&5
if test x${glibcpp_cv_func_finitel_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_finitel_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19738,7 +20841,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19742 "configure"
+#line 20845 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -19749,7 +20852,7 @@ int main() {
finitel(0);
; return 0; }
EOF
-if { (eval echo configure:19753: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20856: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_finitel_use=yes
else
@@ -19776,12 +20879,12 @@ fi
for ac_func in finitel
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19780: checking for $ac_func" >&5
+echo "configure:20883: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19785 "configure"
+#line 20888 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19804,7 +20907,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:20911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19831,7 +20934,7 @@ done
else
echo $ac_n "checking for _finitel declaration""... $ac_c" 1>&6
-echo "configure:19835: checking for _finitel declaration" >&5
+echo "configure:20938: checking for _finitel declaration" >&5
if test x${glibcpp_cv_func__finitel_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func__finitel_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -19846,7 +20949,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19850 "configure"
+#line 20953 "configure"
#include "confdefs.h"
#include <math.h>
#ifdef HAVE_IEEEFP_H
@@ -19857,7 +20960,7 @@ int main() {
_finitel(0);
; return 0; }
EOF
-if { (eval echo configure:19861: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:20964: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__finitel_use=yes
else
@@ -19884,12 +20987,12 @@ fi
for ac_func in _finitel
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19888: checking for $ac_func" >&5
+echo "configure:20991: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 19893 "configure"
+#line 20996 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -19912,7 +21015,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:19916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -19943,7 +21046,7 @@ done
echo $ac_n "checking for _float trig functions""... $ac_c" 1>&6
-echo "configure:19947: checking for _float trig functions" >&5
+echo "configure:21050: checking for _float trig functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func__float_trig_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -19957,7 +21060,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 19961 "configure"
+#line 21064 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
@@ -19966,7 +21069,7 @@ int main() {
_coshf _sinhf _tanhf; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:19970: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21073: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__float_trig_use=yes
else
@@ -19992,12 +21095,12 @@ fi
_coshf _sinhf _tanhf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:19996: checking for $ac_func" >&5
+echo "configure:21099: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20001 "configure"
+#line 21104 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20020,7 +21123,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20048,7 +21151,7 @@ done
echo $ac_n "checking for _float round functions""... $ac_c" 1>&6
-echo "configure:20052: checking for _float round functions" >&5
+echo "configure:21155: checking for _float round functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func__float_round_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -20062,14 +21165,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 20066 "configure"
+#line 21169 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
`for x in _ceilf _floorf; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:20073: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21176: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__float_round_use=yes
else
@@ -20093,12 +21196,12 @@ fi
for ac_func in _ceilf _floorf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20097: checking for $ac_func" >&5
+echo "configure:21200: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20102 "configure"
+#line 21205 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20121,7 +21224,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21228: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20150,7 +21253,7 @@ done
echo $ac_n "checking for _long double trig functions""... $ac_c" 1>&6
-echo "configure:20154: checking for _long double trig functions" >&5
+echo "configure:21257: checking for _long double trig functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func__long_double_trig_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -20164,7 +21267,7 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 20168 "configure"
+#line 21271 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
@@ -20173,7 +21276,7 @@ int main() {
_coshl _sinhl _tanhl; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:20177: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__long_double_trig_use=yes
else
@@ -20199,12 +21302,12 @@ fi
_coshl _sinhl _tanhl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20203: checking for $ac_func" >&5
+echo "configure:21306: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20208 "configure"
+#line 21311 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20227,7 +21330,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21334: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20255,7 +21358,7 @@ done
echo $ac_n "checking for _long double round functions""... $ac_c" 1>&6
-echo "configure:20259: checking for _long double round functions" >&5
+echo "configure:21362: checking for _long double round functions" >&5
if eval "test \"`echo '$''{'glibcpp_cv_func__long_double_round_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -20269,14 +21372,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 20273 "configure"
+#line 21376 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
`for x in _ceill _floorl; do echo "$x (0);"; done`
; return 0; }
EOF
-if { (eval echo configure:20280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21383: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func__long_double_round_use=yes
else
@@ -20300,12 +21403,12 @@ fi
for ac_func in _ceill _floorl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20304: checking for $ac_func" >&5
+echo "configure:21407: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20309 "configure"
+#line 21412 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20328,7 +21431,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20332: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20360,7 +21463,7 @@ done
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:20364: checking for main in -lm" >&5
+echo "configure:21467: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -20368,14 +21471,14 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 20372 "configure"
+#line 21475 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:20379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21482: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -20405,12 +21508,12 @@ fi
for ac_func in nan copysignf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20409: checking for $ac_func" >&5
+echo "configure:21512: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20414 "configure"
+#line 21517 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20433,7 +21536,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21540: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20462,12 +21565,12 @@ done
for ac_func in __signbit
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20466: checking for $ac_func" >&5
+echo "configure:21569: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20471 "configure"
+#line 21574 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20490,7 +21593,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21597: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20518,12 +21621,12 @@ done
for ac_func in __signbitf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20522: checking for $ac_func" >&5
+echo "configure:21625: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20527 "configure"
+#line 21630 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20546,7 +21649,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20550: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20576,12 +21679,12 @@ done
for ac_func in __signbitl
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20580: checking for $ac_func" >&5
+echo "configure:21683: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20585 "configure"
+#line 21688 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20604,7 +21707,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20636,16 +21739,16 @@ done
echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
-echo "configure:20640: checking for mbstate_t" >&5
+echo "configure:21743: checking for mbstate_t" >&5
cat > conftest.$ac_ext <<EOF
-#line 20642 "configure"
+#line 21745 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t teststate;
; return 0; }
EOF
-if { (eval echo configure:20649: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21752: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_mbstate_t=yes
else
@@ -20667,17 +21770,17 @@ EOF
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:20671: checking for $ac_hdr" >&5
+echo "configure:21774: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20676 "configure"
+#line 21779 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:20681: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:21784: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -20708,17 +21811,17 @@ done
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:20712: checking for $ac_hdr" >&5
+echo "configure:21815: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20717 "configure"
+#line 21820 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:20722: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:21825: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -20751,16 +21854,16 @@ done
test x"$enable_c_mbchar" != xno; then
echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
-echo "configure:20755: checking for WCHAR_MIN and WCHAR_MAX" >&5
+echo "configure:21858: checking for WCHAR_MIN and WCHAR_MAX" >&5
cat > conftest.$ac_ext <<EOF
-#line 20757 "configure"
+#line 21860 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
int i = WCHAR_MIN; int j = WCHAR_MAX;
; return 0; }
EOF
-if { (eval echo configure:20764: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21867: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_wchar_minmax=yes
else
@@ -20773,9 +21876,9 @@ rm -f conftest*
echo "$ac_t""$has_wchar_minmax" 1>&6
echo $ac_n "checking for WEOF""... $ac_c" 1>&6
-echo "configure:20777: checking for WEOF" >&5
+echo "configure:21880: checking for WEOF" >&5
cat > conftest.$ac_ext <<EOF
-#line 20779 "configure"
+#line 21882 "configure"
#include "confdefs.h"
#include <wchar.h>
@@ -20784,7 +21887,7 @@ int main() {
wint_t i = WEOF;
; return 0; }
EOF
-if { (eval echo configure:20788: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:21891: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
has_weof=yes
else
@@ -20800,12 +21903,12 @@ rm -f conftest*
for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20804: checking for $ac_func" >&5
+echo "configure:21907: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20809 "configure"
+#line 21912 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20828,7 +21931,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20832: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20863,12 +21966,12 @@ done
wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:20867: checking for $ac_func" >&5
+echo "configure:21970: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20872 "configure"
+#line 21975 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -20891,7 +21994,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:20895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:21998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -20919,7 +22022,7 @@ done
echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
-echo "configure:20923: checking for ISO C99 wchar_t support" >&5
+echo "configure:22026: checking for ISO C99 wchar_t support" >&5
if test x"$has_weof" = xyes &&
test x"$has_wchar_minmax" = xyes &&
test x"$ac_wfuncs" = xyes; then
@@ -20931,17 +22034,17 @@ echo "configure:20923: checking for ISO C99 wchar_t support" >&5
ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
-echo "configure:20935: checking for iconv.h" >&5
+echo "configure:22038: checking for iconv.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20940 "configure"
+#line 22043 "configure"
#include "confdefs.h"
#include <iconv.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:20945: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:22048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -20965,17 +22068,17 @@ fi
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
-echo "configure:20969: checking for langinfo.h" >&5
+echo "configure:22072: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 20974 "configure"
+#line 22077 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:20979: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:22082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -20999,7 +22102,7 @@ fi
echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
-echo "configure:21003: checking for iconv in -liconv" >&5
+echo "configure:22106: checking for iconv in -liconv" >&5
ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -21007,7 +22110,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-liconv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 21011 "configure"
+#line 22114 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -21018,7 +22121,7 @@ int main() {
iconv()
; return 0; }
EOF
-if { (eval echo configure:21022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -21044,12 +22147,12 @@ fi
for ac_func in iconv_open iconv_close iconv nl_langinfo
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:21048: checking for $ac_func" >&5
+echo "configure:22151: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21053 "configure"
+#line 22156 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -21072,7 +22175,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:21076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -21102,7 +22205,7 @@ done
LIBS="$ac_save_LIBS"
echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
-echo "configure:21106: checking for XPG2 wchar_t support" >&5
+echo "configure:22209: checking for XPG2 wchar_t support" >&5
if test x"$ac_has_iconv_h" = xyes &&
test x"$ac_has_langinfo_h" = xyes &&
test x"$ac_XPG2funcs" = xyes; then
@@ -21113,7 +22216,7 @@ echo "configure:21106: checking for XPG2 wchar_t support" >&5
echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
-echo "configure:21117: checking for enabled wchar_t specializations" >&5
+echo "configure:22220: checking for enabled wchar_t specializations" >&5
if test x"$ac_isoC99_wchar_t" = xyes &&
test x"$ac_XPG2_wchar_t" = xyes; then
cat >> confdefs.h <<\EOF
@@ -21135,7 +22238,7 @@ EOF
echo $ac_n "checking for strtold declaration""... $ac_c" 1>&6
-echo "configure:21139: checking for strtold declaration" >&5
+echo "configure:22242: checking for strtold declaration" >&5
if test x${glibcpp_cv_func_strtold_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_strtold_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -21150,14 +22253,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 21154 "configure"
+#line 22257 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
strtold(0, 0);
; return 0; }
EOF
-if { (eval echo configure:21161: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:22264: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_strtold_use=yes
else
@@ -21183,12 +22286,12 @@ fi
for ac_func in strtold
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:21187: checking for $ac_func" >&5
+echo "configure:22290: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21192 "configure"
+#line 22295 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -21211,7 +22314,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:21215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -21239,7 +22342,7 @@ done
echo $ac_n "checking for strtof declaration""... $ac_c" 1>&6
-echo "configure:21243: checking for strtof declaration" >&5
+echo "configure:22346: checking for strtof declaration" >&5
if test x${glibcpp_cv_func_strtof_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_strtof_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -21254,14 +22357,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 21258 "configure"
+#line 22361 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
strtof(0, 0);
; return 0; }
EOF
-if { (eval echo configure:21265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:22368: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_strtof_use=yes
else
@@ -21287,12 +22390,12 @@ fi
for ac_func in strtof
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:21291: checking for $ac_func" >&5
+echo "configure:22394: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21296 "configure"
+#line 22399 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -21315,7 +22418,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:21319: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22422: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -21344,12 +22447,12 @@ done
for ac_func in drand48
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:21348: checking for $ac_func" >&5
+echo "configure:22451: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21353 "configure"
+#line 22456 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -21372,7 +22475,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:21376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -21402,17 +22505,17 @@ done
ac_safe=`echo "locale.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for locale.h""... $ac_c" 1>&6
-echo "configure:21406: checking for locale.h" >&5
+echo "configure:22509: checking for locale.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21411 "configure"
+#line 22514 "configure"
#include "confdefs.h"
#include <locale.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:21416: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:22519: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -21430,19 +22533,19 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:21434: checking for LC_MESSAGES" >&5
+echo "configure:22537: checking for LC_MESSAGES" >&5
if eval "test \"`echo '$''{'ac_cv_val_LC_MESSAGES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21439 "configure"
+#line 22542 "configure"
#include "confdefs.h"
#include <locale.h>
int main() {
return LC_MESSAGES
; return 0; }
EOF
-if { (eval echo configure:21446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_val_LC_MESSAGES=yes
else
@@ -21469,7 +22572,7 @@ fi
cat > conftest.$ac_ext <<EOF
-#line 21473 "configure"
+#line 22576 "configure"
#include "confdefs.h"
#include <setjmp.h>
@@ -21478,7 +22581,7 @@ int main() {
sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);
; return 0; }
EOF
-if { (eval echo configure:21482: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:22585: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_SIGSETJMP 1
@@ -21491,21 +22594,21 @@ else
fi
rm -f conftest*
- for ac_hdr in stdlib.h unistd.h sys/stat.h sys/types.h
+ for ac_hdr in unistd.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:21499: checking for $ac_hdr" >&5
+echo "configure:22602: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21504 "configure"
+#line 22607 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:21509: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:22612: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -21534,12 +22637,12 @@ done
for ac_func in getpagesize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:21538: checking for $ac_func" >&5
+echo "configure:22641: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21543 "configure"
+#line 22646 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -21562,7 +22665,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:21566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:22669: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -21587,7 +22690,7 @@ fi
done
echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:21591: checking for working mmap" >&5
+echo "configure:22694: checking for working mmap" >&5
if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -21595,7 +22698,7 @@ else
ac_cv_func_mmap_fixed_mapped=no
else
cat > conftest.$ac_ext <<EOF
-#line 21599 "configure"
+#line 22702 "configure"
#include "confdefs.h"
/* Thanks to Mike Haertel and Jim Avera for this test.
@@ -21623,24 +22726,11 @@ else
#include <fcntl.h>
#include <sys/mman.h>
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
/* This mess was copied from the GNU getpagesize.h. */
#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
/* Assume that all systems that can run configure have sys/param.h. */
# ifndef HAVE_SYS_PARAM_H
@@ -21748,7 +22838,7 @@ main()
}
EOF
-if { (eval echo configure:21752: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:22842: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_mmap_fixed_mapped=yes
else
@@ -21779,17 +22869,17 @@ fi
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:21783: checking for $ac_hdr" >&5
+echo "configure:22873: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 21788 "configure"
+#line 22878 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:21793: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:22883: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -21822,7 +22912,7 @@ done
# Can't do these in a loop, else the resulting syntax is wrong.
cat > conftest.$ac_ext <<EOF
-#line 21826 "configure"
+#line 22916 "configure"
#include "confdefs.h"
#include <unistd.h>
#include <sys/time.h>
@@ -21832,7 +22922,7 @@ int main() {
int f = RLIMIT_DATA ;
; return 0; }
EOF
-if { (eval echo configure:21836: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:22926: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_mresult=1
else
@@ -21849,7 +22939,7 @@ EOF
cat > conftest.$ac_ext <<EOF
-#line 21853 "configure"
+#line 22943 "configure"
#include "confdefs.h"
#include <unistd.h>
#include <sys/time.h>
@@ -21859,7 +22949,7 @@ int main() {
int f = RLIMIT_RSS ;
; return 0; }
EOF
-if { (eval echo configure:21863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:22953: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_mresult=1
else
@@ -21876,7 +22966,7 @@ EOF
cat > conftest.$ac_ext <<EOF
-#line 21880 "configure"
+#line 22970 "configure"
#include "confdefs.h"
#include <unistd.h>
#include <sys/time.h>
@@ -21886,7 +22976,7 @@ int main() {
int f = RLIMIT_VMEM ;
; return 0; }
EOF
-if { (eval echo configure:21890: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:22980: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_mresult=1
else
@@ -21903,7 +22993,7 @@ EOF
cat > conftest.$ac_ext <<EOF
-#line 21907 "configure"
+#line 22997 "configure"
#include "confdefs.h"
#include <unistd.h>
#include <sys/time.h>
@@ -21913,7 +23003,7 @@ int main() {
int f = RLIMIT_AS ;
; return 0; }
EOF
-if { (eval echo configure:21917: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:23007: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_mresult=1
else
@@ -21935,7 +23025,7 @@ EOF
else
cat > conftest.$ac_ext <<EOF
-#line 21939 "configure"
+#line 23029 "configure"
#include "confdefs.h"
#include <unistd.h>
#include <sys/time.h>
@@ -21945,7 +23035,7 @@ int main() {
struct rlimit r; setrlimit(0, &r);
; return 0; }
EOF
-if { (eval echo configure:21949: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:23039: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_setrlimit=yes
else
@@ -21961,7 +23051,7 @@ fi
fi
echo $ac_n "checking for testsuite memory limit support""... $ac_c" 1>&6
-echo "configure:21965: checking for testsuite memory limit support" >&5
+echo "configure:23055: checking for testsuite memory limit support" >&5
if test $setrlimit_have_headers = yes && test $ac_setrlimit = yes; then
ac_mem_limits=yes
cat >> confdefs.h <<\EOF
@@ -21977,7 +23067,7 @@ EOF
# Look for setenv, so that extended locale tests can be performed.
echo $ac_n "checking for setenv declaration""... $ac_c" 1>&6
-echo "configure:21981: checking for setenv declaration" >&5
+echo "configure:23071: checking for setenv declaration" >&5
if test x${glibcpp_cv_func_setenv_use+set} != xset; then
if eval "test \"`echo '$''{'glibcpp_cv_func_setenv_use'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -21992,14 +23082,14 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes
cross_compiling=$ac_cv_prog_cxx_cross
cat > conftest.$ac_ext <<EOF
-#line 21996 "configure"
+#line 23086 "configure"
#include "confdefs.h"
#include <stdlib.h>
int main() {
setenv(0, 0, 0);
; return 0; }
EOF
-if { (eval echo configure:22003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:23093: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
glibcpp_cv_func_setenv_use=yes
else
@@ -22025,12 +23115,12 @@ fi
for ac_func in setenv
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:22029: checking for $ac_func" >&5
+echo "configure:23119: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 22034 "configure"
+#line 23124 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -22053,7 +23143,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:22057: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:23147: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -22081,9 +23171,20 @@ done
# Export file names for ABI checking.
- baseline_file="${glibcpp_srcdir}/config/abi/${target_alias}/baseline_symbols.txt"
+ baseline_file="${glibcpp_srcdir}/config/abi/${abi_baseline_triplet}/baseline_symbols.txt"
+ # Don't do ABI checking unless native.
+
+
+if test x"$build" = x"$host" && test -z "$with_cross_host"; then
+ GLIBCPP_BUILD_ABI_CHECK_TRUE=
+ GLIBCPP_BUILD_ABI_CHECK_FALSE='#'
+else
+ GLIBCPP_BUILD_ABI_CHECK_TRUE='#'
+ GLIBCPP_BUILD_ABI_CHECK_FALSE=
+fi
+
fi
# This depends on the possibly-skipped linker test above.
@@ -22113,18 +23214,18 @@ fi
# Check to see if libgcc_s exists, indicating that shared libgcc is possible.
if test $enable_symvers != no; then
echo $ac_n "checking for shared libgcc""... $ac_c" 1>&6
-echo "configure:22117: checking for shared libgcc" >&5
+echo "configure:23218: checking for shared libgcc" >&5
ac_save_CFLAGS="$CFLAGS"
CFLAGS=' -lgcc_s'
cat > conftest.$ac_ext <<EOF
-#line 22121 "configure"
+#line 23222 "configure"
#include "confdefs.h"
int main() {
return 0
; return 0; }
EOF
-if { (eval echo configure:22128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:23229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
glibcpp_shared_libgcc=yes
else
@@ -22159,14 +23260,14 @@ if test $enable_symvers = yes ; then
echo 'FOO { global: f[a-z]o; local: *; };' > conftest.map
cat > conftest.$ac_ext <<EOF
-#line 22163 "configure"
+#line 23264 "configure"
#include "confdefs.h"
int foo;
int main() {
; return 0; }
EOF
-if { (eval echo configure:22170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:23271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
enable_symvers=gnu
else
@@ -22194,6 +23295,10 @@ case $enable_symvers in
;;
gnu)
LINKER_MAP=config/linker-map.gnu
+ cat >> confdefs.h <<\EOF
+#define _GLIBCPP_SYMVER 1
+EOF
+
;;
esac
@@ -22208,17 +23313,15 @@ else
GLIBCPP_BUILD_VERSIONED_SHLIB_FALSE=
fi
echo $ac_n "checking versioning on shared library symbols""... $ac_c" 1>&6
-echo "configure:22212: checking versioning on shared library symbols" >&5
+echo "configure:23317: checking versioning on shared library symbols" >&5
echo "$ac_t""$enable_symvers" 1>&6
# Propagate the target-specific source directories through the build chain.
-# (Nothing currently uses cpu_include_dir directly; only ATOMICITYH and
-# CPULIMITSH [might] use it, and they only get used here.)
+# (Nothing currently uses cpu_include_dir directly; only ATOMICITYH
+# uses it, and they only get used here.)
OS_INC_SRCDIR=config/${os_include_dir}
ATOMICITY_INC_SRCDIR=config/${ATOMICITYH}
-CPU_LIMITS_INC_SRCDIR=config/${CPULIMITSH}
-
@@ -22297,7 +23400,7 @@ glibcpp_prefixdir=${prefix}
# Process the option --with-gxx-include-dir=<path to include-files directory>
echo $ac_n "checking for --with-gxx-include-dir""... $ac_c" 1>&6
-echo "configure:22301: checking for --with-gxx-include-dir" >&5
+echo "configure:23404: checking for --with-gxx-include-dir" >&5
# Check whether --with-gxx-include-dir or --without-gxx-include-dir was given.
if test "${with_gxx_include_dir+set}" = set; then
withval="$with_gxx_include_dir"
@@ -22321,7 +23424,7 @@ echo "$ac_t""$gxx_include_dir" 1>&6
# Process the option "--enable-version-specific-runtime-libs"
echo $ac_n "checking for --enable-version-specific-runtime-libs""... $ac_c" 1>&6
-echo "configure:22325: checking for --enable-version-specific-runtime-libs" >&5
+echo "configure:23428: checking for --enable-version-specific-runtime-libs" >&5
# Check whether --enable-version-specific-runtime-libs or --disable-version-specific-runtime-libs was given.
if test "${enable_version_specific_runtime_libs+set}" = set; then
enableval="$enable_version_specific_runtime_libs"
@@ -22367,7 +23470,7 @@ if test x"$glibcpp_toolexecdir" = x"no"; then
fi
echo $ac_n "checking for install location""... $ac_c" 1>&6
-echo "configure:22371: checking for install location" >&5
+echo "configure:23474: checking for install location" >&5
echo "$ac_t""$gxx_include_dir" 1>&6
@@ -22647,11 +23750,12 @@ s%@OPT_LDFLAGS@%$OPT_LDFLAGS%g
s%@LIBMATHOBJS@%$LIBMATHOBJS%g
s%@WERROR@%$WERROR%g
s%@baseline_file@%$baseline_file%g
+s%@GLIBCPP_BUILD_ABI_CHECK_TRUE@%$GLIBCPP_BUILD_ABI_CHECK_TRUE%g
+s%@GLIBCPP_BUILD_ABI_CHECK_FALSE@%$GLIBCPP_BUILD_ABI_CHECK_FALSE%g
s%@GLIBCPP_BUILD_VERSIONED_SHLIB_TRUE@%$GLIBCPP_BUILD_VERSIONED_SHLIB_TRUE%g
s%@GLIBCPP_BUILD_VERSIONED_SHLIB_FALSE@%$GLIBCPP_BUILD_VERSIONED_SHLIB_FALSE%g
s%@OS_INC_SRCDIR@%$OS_INC_SRCDIR%g
s%@ATOMICITY_INC_SRCDIR@%$ATOMICITY_INC_SRCDIR%g
-s%@CPU_LIMITS_INC_SRCDIR@%$CPU_LIMITS_INC_SRCDIR%g
s%@GLIBCPP_IS_CROSS_COMPILING@%$GLIBCPP_IS_CROSS_COMPILING%g
s%@CANADIAN_TRUE@%$CANADIAN_TRUE%g
s%@CANADIAN_FALSE@%$CANADIAN_FALSE%g
@@ -22880,8 +23984,8 @@ fi; done
EOF
cat >> $CONFIG_STATUS <<EOF
-ac_sources="$BASIC_FILE_CC $CLOCALE_CC $CCOLLATE_CC $CCTYPE_CC $CMESSAGES_CC $CMONEY_CC $CNUMERIC_CC $CTIME_CC $LINKER_MAP"
-ac_dests="src/basic_file.cc src/c++locale.cc src/collate.cc src/ctype.cc src/messages.cc src/monetary.cc src/numeric.cc src/time.cc src/linker.map"
+ac_sources="$BASIC_FILE_CC $CLOCALE_CC $CCODECVT_CC $CCOLLATE_CC $CCTYPE_CC $CMESSAGES_CC $CMONEY_CC $CNUMERIC_CC $CTIME_CC $CLOCALE_INTERNAL_H $LINKER_MAP"
+ac_dests="src/basic_file.cc src/c++locale.cc src/codecvt_members.cc src/collate_members.cc src/ctype_members.cc src/messages_members.cc src/monetary_members.cc src/numeric_members.cc src/time_members.cc src/c++locale_internal.h src/linker.map"
EOF
cat >> $CONFIG_STATUS <<\EOF
diff --git a/libstdc++-v3/configure.in b/libstdc++-v3/configure.in
index 0b6a26e87da..4be7d9db261 100644
--- a/libstdc++-v3/configure.in
+++ b/libstdc++-v3/configure.in
@@ -102,7 +102,7 @@ if test -n "$with_cross_host" || test x"$build" != x"$host"; then
# GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT
# GLIBCPP_CHECK_MATH_SUPPORT
- case "$target_alias" in
+ case "$target" in
*-linux*)
os_include_dir="os/gnu-linux"
AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
@@ -147,7 +147,7 @@ if test -n "$with_cross_host" || test x"$build" != x"$host"; then
AC_DEFINE(HAVE_COPYSIGNF)
AC_DEFINE(HAVE_FREXPF)
AC_DEFINE(HAVE_HYPOT)
- case "$target_alias" in
+ case "$target" in
*-hpux10*)
AC_DEFINE(HAVE_FINITE)
AC_DEFINE(HAVE_FINITEF)
@@ -186,6 +186,39 @@ if test -n "$with_cross_host" || test x"$build" != x"$host"; then
AC_DEFINE(HAVE_ISNANL)
fi
;;
+ *-freebsd*)
+ # Check for available headers.
+ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+ machine/endian.h machine/param.h sys/machine.h sys/types.h \
+ fp.h locale.h float.h inttypes.h sys/resource.h sys/stat.h \
+ sys/time.h unistd.h])
+ SECTION_FLAGS='-ffunction-sections -fdata-sections'
+ AC_SUBST(SECTION_FLAGS)
+ GLIBCPP_CHECK_LINKER_FEATURES
+ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
+ GLIBCPP_CHECK_WCHAR_T_SUPPORT
+ os_include_dir="os/bsd/freebsd"
+ AC_DEFINE(HAVE_LC_MESSAGES)
+ AC_DEFINE(HAVE_DRAND48)
+ AC_DEFINE(HAVE_GETPAGESIZE)
+ AC_DEFINE(HAVE_SETENV)
+ AC_DEFINE(HAVE_SIGSETJMP)
+ AC_DEFINE(HAVE_COPYSIGN)
+ AC_DEFINE(HAVE_COPYSIGNF)
+ AC_DEFINE(HAVE_FINITEF)
+ AC_DEFINE(HAVE_FINITE)
+ AC_DEFINE(HAVE_FREXPF)
+ AC_DEFINE(HAVE_HYPOT)
+ AC_DEFINE(HAVE_HYPOTF)
+ AC_DEFINE(HAVE_ISINF)
+ AC_DEFINE(HAVE_ISNAN)
+ AC_DEFINE(HAVE_ISNANF)
+ if test x"long_double_math_on_this_cpu" = x"yes"; then
+ AC_DEFINE(HAVE_FINITEL)
+ AC_DEFINE(HAVE_ISINFL)
+ AC_DEFINE(HAVE_ISNANL)
+ fi
+ ;;
*-mingw32*)
AC_CHECK_HEADERS([sys/types.h locale.h float.h])
GLIBCPP_CHECK_LINKER_FEATURES
@@ -224,7 +257,7 @@ changequote([,])dnl
;;
esac
- case "$target_alias" in
+ case "$target" in
*-mingw32*)
;;
*-windiss*)
@@ -253,6 +286,34 @@ changequote([,])dnl
AC_DEFINE(HAVE_TANF)
AC_DEFINE(HAVE_TANHF)
;;
+ *-freebsd*)
+ # Must replicate generic section since we don't have strtof or strtold.
+ AC_DEFINE(HAVE_MMAP)
+ AC_DEFINE(HAVE_ACOSF)
+ AC_DEFINE(HAVE_ASINF)
+ AC_DEFINE(HAVE_ATAN2F)
+ AC_DEFINE(HAVE_ATANF)
+ AC_DEFINE(HAVE_CEILF)
+ AC_DEFINE(HAVE_COPYSIGN)
+ AC_DEFINE(HAVE_COPYSIGNF)
+ AC_DEFINE(HAVE_COSF)
+ AC_DEFINE(HAVE_COSHF)
+ AC_DEFINE(HAVE_EXPF)
+ AC_DEFINE(HAVE_FABSF)
+ AC_DEFINE(HAVE_FLOORF)
+ AC_DEFINE(HAVE_FMODF)
+ AC_DEFINE(HAVE_FREXPF)
+ AC_DEFINE(HAVE_LDEXPF)
+ AC_DEFINE(HAVE_LOG10F)
+ AC_DEFINE(HAVE_LOGF)
+ AC_DEFINE(HAVE_MODFF)
+ AC_DEFINE(HAVE_POWF)
+ AC_DEFINE(HAVE_SINF)
+ AC_DEFINE(HAVE_SINHF)
+ AC_DEFINE(HAVE_SQRTF)
+ AC_DEFINE(HAVE_TANF)
+ AC_DEFINE(HAVE_TANHF)
+ ;;
*)
# GLIBCPP_CHECK_STDLIB_SUPPORT
AC_DEFINE(HAVE_STRTOF)
@@ -354,14 +415,12 @@ fi
GLIBCPP_ENABLE_SYMVERS([yes])
# Propagate the target-specific source directories through the build chain.
-# (Nothing currently uses cpu_include_dir directly; only ATOMICITYH and
-# CPULIMITSH [might] use it, and they only get used here.)
+# (Nothing currently uses cpu_include_dir directly; only ATOMICITYH
+# uses it, and they only get used here.)
OS_INC_SRCDIR=config/${os_include_dir}
ATOMICITY_INC_SRCDIR=config/${ATOMICITYH}
-CPU_LIMITS_INC_SRCDIR=config/${CPULIMITSH}
AC_SUBST(OS_INC_SRCDIR)
AC_SUBST(ATOMICITY_INC_SRCDIR)
-AC_SUBST(CPU_LIMITS_INC_SRCDIR)
# Set up cross-compile flags
AC_SUBST(GLIBCPP_IS_CROSS_COMPILING) dnl Unused so far.
diff --git a/libstdc++-v3/configure.target b/libstdc++-v3/configure.target
index e202185e57a..dc9c44b6f75 100644
--- a/libstdc++-v3/configure.target
+++ b/libstdc++-v3/configure.target
@@ -19,10 +19,6 @@
# cpu_include_dir CPU-specific directory, defaults to cpu/generic
# if cpu/target_cpu doesn't exist. This is
# used to set the next two:
-# ATOMICITYH location of atomicity.h,
-# defaults to cpu_include_dir
-# CPULIMITSH location of cpu_limits.h,
-# defaults to cpu_include_dir
#
# os_include_dir OS-specific directory, defaults to os/generic.
#
@@ -31,6 +27,12 @@
# c_compatibility if "C" compatibility headers are necessary,
# defaults to no.
#
+# abi_baseline_triplet directory name for ABI compat testing,
+# defaults to target (as per config.guess)
+#
+# ATOMICITYH location of atomicity.h,
+# defaults to cpu_include_dir
+#
# It possibly modifies the following variables:
#
# OPT_LDFLAGS extra flags to pass when linking the library, of
@@ -54,6 +56,8 @@ else
cpu_include_dir="cpu/generic"
fi
+abi_baseline_triplet=${target}
+
c_model=c_std
c_compatibility=no
@@ -67,12 +71,12 @@ case "${target_cpu}" in
alpha*)
cpu_include_dir="cpu/alpha"
;;
- arm*)
+ arm* | strongarm* | xscale* )
cpu_include_dir="cpu/arm"
;;
i486 | i586 | i686 | i786)
+ # add athlons here maybe
cpu_include_dir="cpu/i486"
- CPULIMITSH="cpu/i386"
;;
m68k | m680[246]0)
cpu_include_dir="cpu/m68k"
@@ -91,11 +95,8 @@ case "${target_cpu}" in
s390 | s390x)
cpu_include_dir="cpu/s390"
;;
- sparc64 | ultrasparc)
- cpu_include_dir="cpu/sparc/sparc64"
- ;;
- sparc*)
- cpu_include_dir="cpu/sparc/sparc32"
+ sparc* | ultrasparc)
+ cpu_include_dir="cpu/sparc"
;;
x86_64*)
cpu_include_dir="cpu/x86-64"
@@ -103,7 +104,7 @@ case "${target_cpu}" in
esac
-# Now look for the two files usually tied to a CPU model, and make default
+# Now look for the file(s) usually tied to a CPU model, and make default
# choices for those if they haven't been explicitly set already.
_cpu_incdir_fullpath=${glibcpp_srcdir}/config/${cpu_include_dir}
if test x${ATOMICITYH+set} != xset; then
@@ -113,13 +114,6 @@ if test x${ATOMICITYH+set} != xset; then
ATOMICITYH="cpu/generic"
fi
fi
-if test x${CPULIMITSH+set} != xset; then
- if test -f ${_cpu_incdir_fullpath}/cpu_limits.h; then
- CPULIMITSH=$cpu_include_dir
- else
- CPULIMITSH="cpu/generic"
- fi
-fi
unset _cpu_incdir_fullpath
@@ -144,7 +138,8 @@ case "${target_os}" in
aix*)
ATOMICITYH="cpu/generic"
;;
- bsd* | freebsd* )
+ bsd*)
+ # Plain BSD attempts to share FreeBSD files.
os_include_dir="os/bsd/freebsd"
;;
cygwin*)
@@ -153,12 +148,16 @@ case "${target_os}" in
*djgpp*) # leading * picks up "msdosdjgpp"
os_include_dir="os/djgpp"
;;
+ freebsd*)
+ os_include_dir="os/bsd/freebsd"
+ # The FreeBSD ABI is expressed in the major version number only.
+ abi_baseline_triplet=`echo ${target} | sed 's,\(\.[0-9]*\)*$,,'`
+ ;;
gnu* | linux*)
os_include_dir="os/gnu-linux"
;;
hpux*)
os_include_dir="os/hpux"
- CPULIMITSH="os/hpux"
;;
irix[1-6] | irix[1-5].* | irix6.[0-4]*)
# This is known to work on at least IRIX 5.2 and 6.3.
@@ -200,9 +199,6 @@ esac
# Set any OS-dependent and CPU-dependent bits.
# THIS TABLE IS SORTED. KEEP IT THAT WAY.
case "${target}" in
- alpha*-*-*osf5*)
- CPULIMITSH="os/osf/osf5.0"
- ;;
mips*-*-linux*)
ATOMICITYH="cpu/mips"
;;
diff --git a/libstdc++-v3/docs/doxygen/run_doxygen b/libstdc++-v3/docs/doxygen/run_doxygen
index df7d83859ba..d8ca2a91428 100644
--- a/libstdc++-v3/docs/doxygen/run_doxygen
+++ b/libstdc++-v3/docs/doxygen/run_doxygen
@@ -219,7 +219,8 @@ rm stdheader
# implementations of man(1), e.g., Linux's. We need to have another top-level
# *roff tag to /stop/ the .SH NAME entry.
#problematic=`egrep --files-without-match '^\.SH SYNOPSIS' [A-Z]*.3`
-problematic='Containers.3 Sequences.3 Assoc_containers.3 Allocators.3'
+problematic='Containers.3 Sequences.3 Assoc_containers.3 Allocators.3
+ Iterator_types.3'
for f in $problematic; do
sed '/^\.SH NAME/{
n
diff --git a/libstdc++-v3/docs/html/17_intro/C++STYLE b/libstdc++-v3/docs/html/17_intro/C++STYLE
index 46fe3f3f160..f838b830124 100644
--- a/libstdc++-v3/docs/html/17_intro/C++STYLE
+++ b/libstdc++-v3/docs/html/17_intro/C++STYLE
@@ -173,7 +173,7 @@ Notable areas of divergence from what may be previous local practice
int foo;
13. Spacing WRT return statements.
- no extra spacing before returns
+ no extra spacing before returns, no parenthesis
ie
}
@@ -184,6 +184,12 @@ Notable areas of divergence from what may be previous local practice
return __ret;
+ -NOT-
+
+ }
+ return (__ret);
+
+
14. Location of global variables.
All global variables of class type, whether in the "user visable"
space (e.g., cin) or the implementation namespace, must be defined
@@ -264,7 +270,7 @@ namespace std
int
two_lines(const char* arg)
- { return strchr(arg, 'a'); }
+ { return strchr(arg, 'a'); }
inline int
three_lines(); // inline, but defined below.
@@ -360,7 +366,3 @@ namespace std
}
} // namespace std
-
-
-
-
diff --git a/libstdc++-v3/docs/html/17_intro/contribute.html b/libstdc++-v3/docs/html/17_intro/contribute.html
index 4f16b845d48..17bc65f4ed0 100644
--- a/libstdc++-v3/docs/html/17_intro/contribute.html
+++ b/libstdc++-v3/docs/html/17_intro/contribute.html
@@ -1,19 +1,23 @@
-<!--990301 slightly modified version of the GCC contribute.html file-->
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>How to contribute</title>
</head>
-<!--#include virtual="/include/header-subpages.html"-->
+<!--990301 slightly modified version of the GCC contribute.html file-->
+<!-- #include virtual="/include/header-subpages.html"-->
+<body>
<h2>How to contribute</h2>
<p>
The Standard C++ Library v3, or libstc++-2.90.x, follows an open development model. Active contributors are assigned maintainer-ship responsibility, and given write access to the CVS repository. First time submitors and all other potential contributors should follow this procedure:
+</p>
-<p>
-<hr>
+<hr />
<h4>ONE : read the documentation</h4>
-<p>
-<p>
<ul>
<li> Get and read the relevant sections of the C++ language
specification. Copies of the full ISO 14882 standard are available on
@@ -27,25 +31,30 @@ and their web-site is right
<a href="http://www.ansi.org">here.</a>
(And if you've already registered with them, clicking this link will take you to directly to the place where you can
<a href="http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998">buy the standard on-line.)</a>
+</li>
<li> The library working group bugs, and known defects, can be obtained at these web sites:
<a href="http://www.dkuug.dk/jtc1/sc22/wg21/">http://www.dkuug.dk/jtc1/sc22/wg21 </a>
and <a href="http://www.comeaucomputing.com/iso/">http://www.comeaucomputing.com/iso/</a>
+</li>
<li> The newsgroup dedicated to standardization issues is comp.std.c++: this FAQ for this group is quite useful and can be found <a href="http://reality.sgi.com/austern_mti/std-c++/faq.html"> here </a>.
+</li>
<li> Peruse the <a href="http://www.gnu.ai.mit.edu/prep/standards_toc.html">GNU Coding Standards</a>, and chuckle when you hit the part about "Using Languages Other Than C."
+</li>
<li> Be familiar with the extensions that preceded these general GNU rules. These style issues for libstdc++ can be found in the file C++STYLE, located in the root level of the distribution, or <a href="C++STYLE"> here. </a>
+</li>
<li> And last but certainly not least, read the library-specific information found <a href="../documentation.html"> here.</a>
+</li>
</ul>
-<p>
-<hr>
+<hr />
<h4>TWO : copyright assignment</h4>
<p>
Small changes can be accepted without a copyright assignment form on
@@ -56,40 +65,43 @@ to fill out appropriate disclaimer forms as well. Here is the <a href="libstdc++
Please contact <a href="mailto:benjamin@cygnus.com">Benjamin
Kosnik</a> if you are confused about the assignment or have general
licensing questions.
+</p>
-<p>
-<hr>
+<hr />
<h4>THREE : submitting patches</h4>
-<p>
+<p>
Every patch must have several pieces of information before it can be
properly evaluated. Ideally (and to ensure the fastest possible
response from the maintainers) it would have all of these pieces:
-<p>
+</p>
+
<ul>
<li> A description of the bug and how your patch fixes this bug. For
- new features a description of the feature and your implementation.
+ new features a description of the feature and your implementation. </li>
<li> A ChangeLog entry as plaintext; see the various ChangeLog files
for format and content. If using you are using emacs as your editor,
simply position the insertion point at the beginning of your change
and hit CX-4a to bring up the appropriate ChangeLog
- entry. See--magic! Similar functionality also exists for vi.
+ entry. See--magic! Similar functionality also exists for vi. </li>
<li> A testsuite submission or sample program that will easily and
- simply show the existing error or test new functionality.
+ simply show the existing error or test new functionality. </li>
<li> The patch itself. If you are accessing the CVS repository at
Cygnus, use "cvs update; cvs diff -c3p NEW"; else, use "diff -c3p OLD
NEW" ... If your version of diff does not support these options, then
- get the latest version of GNU diff.
+ get the latest version of GNU diff. </li>
<li> When you have all these pieces, bundle them up in a mail message
and send it to libstdc++@gcc.gnu.org. All patches and related
-discussion should be sent to the libstdc++ mailinglist.
+discussion should be sent to the libstdc++ mailinglist. </li>
</ul>
+</body>
+</html>
diff --git a/libstdc++-v3/docs/html/17_intro/howto.html b/libstdc++-v3/docs/html/17_intro/howto.html
index 21f83f97e69..137829df6f8 100644
--- a/libstdc++-v3/docs/html/17_intro/howto.html
+++ b/libstdc++-v3/docs/html/17_intro/howto.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, gcc, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for libstdc++ chapter 17.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, gcc, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for libstdc++ chapter 17." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 17</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -21,18 +25,18 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#2">The Standard C++ header files</a>
- <li><a href="#3">The Standard C++ library and multithreading</a>
- <li><a href="#4"><code>&lt;foo&gt;</code> vs <code>&lt;foo.h&gt;</code></a>
- <li><a href="porting-howto.html">Porting HOWTO</a>
- <li><a href="#5">Behavior specific to libstdc++-v3</a>
- <li><a href="#6">Preprocessor macros controlling the library</a>
+ <li><a href="#2">The Standard C++ header files</a></li>
+ <li><a href="#3">The Standard C++ library and multithreading</a></li>
+ <li><a href="#4"><code>&lt;foo&gt;</code> vs <code>&lt;foo.h&gt;</code></a></li>
+ <li><a href="porting-howto.html">Porting HOWTO</a></li>
+ <li><a href="#5">Behavior specific to libstdc++-v3</a></li>
+ <li><a href="#6">Preprocessor macros controlling the library</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -51,7 +55,7 @@
all compile and run.
</p>
-<hr>
+<hr />
<h2><a name="3">The Standard C++ library and multithreading</a></h2>
<p>This section discusses issues surrounding the proper compilation
of multithreaded applications which use the Standard C++
@@ -129,16 +133,17 @@
relevant message in the thread; from there you can use
&quot;Thread Next&quot; to move down the thread. This farm is in
latest-to-oldest order.
+ </p>
<ul>
<li>Our threading expert Loren gives a breakdown of
<a href="http://gcc.gnu.org/ml/libstdc++/2001-10/msg00024.html">the
- six situations involving threads</a> for the 3.0 release series.
+ six situations involving threads</a> for the 3.0 release series.</li>
<li><a href="http://gcc.gnu.org/ml/libstdc++/2001-05/msg00384.html">
This message</a> inspired a recent updating of issues with threading
and the SGI STL library. It also contains some example
- POSIX-multithreaded STL code.
+ POSIX-multithreaded STL code.</li>
</ul>
- (A large selection of links to older messages has been removed; many
+ <p> (A large selection of links to older messages has been removed; many
of the messages from 1999 were lost in a disk crash, and the few
people with access to the backup tapes have been too swamped with work
to restore them. Many of the points have been superseded anyhow.)
@@ -150,7 +155,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4"><code>&lt;foo&gt;</code> vs <code>&lt;foo.h&gt;</code></a></h2>
<p>The new-style headers are fully supported in libstdc++-v3. The compiler
itself fully supports namespaces, including <code>std::</code>.
@@ -158,22 +163,24 @@
<p>For those of you new to ISO C++98, no, that isn't a typo, the headers
really have new names. Marshall Cline's C++ FAQ Lite has a good
explanation in
-<a href="http://www.cerfnet.com/~mpcline/On-Line-C++-FAQ/coding-standards.html#[25.4]">item [25.4]</a>.
+<a href="http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-26.4">item [26.4]</a>.
</p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="5">Behavior specific to libstdc++-v3</a></h2>
<p>The ISO standard defines the following phrase:
+ </p>
<blockquote><dl>
- <dt><code>[1.3.5] implementation-defined behavior</code>
+ <dt><code>[1.3.5] implementation-defined behavior</code></dt>
<dd>behavior, for a well-formed program construct and correct data, that
depends on the implementation <strong>and that each implementation
shall document</strong>.
+ </dd>
</dl></blockquote>
- We do so here, for the C++ library only. Behavior of the compiler,
+ <p>We do so here, for the C++ library only. Behavior of the compiler,
linker, runtime loader, and other elements of &quot;the
implementation&quot; are documented elsewhere. Everything listed in
Annex B, Implemenation Qualities, are also part of the compiler, not
@@ -196,10 +203,10 @@
sections, libstdc++-v3 has zero control over what the cleanup code hands
back to the runtime loader. Talk to the compiler people. :-)
</p>
- <p><strong>[18.4.2.1]/5</strong> (bad_alloc),<br>
- <strong>[18.5.2]/5</strong> (bad_cast),<br>
- <strong>[18.5.3]/5</strong> (bad_typeid),<br>
- <strong>[18.6.1]/8</strong> (exception),<br>
+ <p><strong>[18.4.2.1]/5</strong> (bad_alloc),<br />
+ <strong>[18.5.2]/5</strong> (bad_cast),<br />
+ <strong>[18.5.3]/5</strong> (bad_typeid),<br />
+ <strong>[18.6.1]/8</strong> (exception),<br />
<strong>[18.6.2.1]/5</strong> (bad_exception): The <code>what()</code>
member function of class <code>std::exception</code>, and these other
classes publicly derived from it, simply returns the name of the
@@ -225,10 +232,10 @@
have any allocators which compare non-equal, so we can't describe how
they behave.
</p>
- <p><strong>[21.1.3.1]/3,4</strong>,<br>
- <strong>[21.1.3.2]/2</strong>,<br>
- <strong>[23.*]'s foo::iterator</strong>,<br>
- <strong>[27.*]'s foo::*_type</strong>,<br>
+ <p><strong>[21.1.3.1]/3,4</strong>,<br />
+ <strong>[21.1.3.2]/2</strong>,<br />
+ <strong>[23.*]'s foo::iterator</strong>,<br />
+ <strong>[27.*]'s foo::*_type</strong>,<br />
<strong>others...</strong>
Nope, these types are called implementation-defined because you
shouldn't be taking advantage of their underlying types. Listing them
@@ -257,7 +264,7 @@
than the minimum required. I don't think we're currently taking
advantage of this yet.
</p>
- <p><strong>[27.7.1.3]/16</strong>,<br>
+ <p><strong>[27.7.1.3]/16</strong>,<br />
<strong>[27.8.1.4]/10</strong>
The effects of <code>pubsetbuf/setbuf</code> are described
<a href="../27_io/howto.html#2">in this chapter</a>.
@@ -269,7 +276,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="6">Preprocessor macros controlling the library</a></h2>
<p>Some of the semantics of the libstdc++-v3 implementation are
controlled by preprocessor macros, both during build/installation and
@@ -297,6 +304,7 @@
The default state of the symbol is listed. &quot;Configurable&quot;
(or &quot;Not configurable&quot;) means that the symbol is initially
chosen (or not) based on --enable/--disable options at configure time.
+ </p>
<dl>
<dt><code>_GLIBCPP_DEPRECATED</code></dt>
<dd>Undefined by default. Not configurable. Turning this on enables
@@ -329,7 +337,6 @@
</dd>
-->
</dl>
- </p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
@@ -338,7 +345,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/17_intro/license.html b/libstdc++-v3/docs/html/17_intro/license.html
index c3449b1ff2f..a0a2c9135ea 100644
--- a/libstdc++-v3/docs/html/17_intro/license.html
+++ b/libstdc++-v3/docs/html/17_intro/license.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="libstdc++, license, licence">
- <meta name="DESCRIPTION" content="Copying restrictions for libstdc++.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="libstdc++, license, licence" />
+ <meta name="DESCRIPTION" content="Copying restrictions for libstdc++." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 copying</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -21,7 +25,7 @@
writing this page is a programmer, not a lawyer.
</p>
-<hr>
+<hr />
<h2>The Code: Runtime GPL</h2>
@@ -29,7 +33,8 @@
<a href="COPYING">GNU General Public License</a>, with the so-called
&quot;runtime exception,&quot; as follows (or see any header or
implementation file):
- <pre>
+</p>
+<pre>
As a special exception, you may use this file as part of a free software
library without restriction. Specifically, if other files instantiate
templates or use macros or inline functions from this file, or you compile
@@ -38,8 +43,7 @@
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.
- </pre>
-</p>
+</pre>
<p>Hopefully that text is self-explanatory. If it isn't, you need to speak
to your lawyer, or the Free Software Foundation.
@@ -50,14 +54,14 @@
http://gcc.gnu.org/ml/libstdc++/2000-q2/subjects.html#00050
-->
<p><strong>Q: So any program which uses libstdc++ falls under the GPL?</strong>
- <br>A: <strong>No.</strong> The special exception permits use of the
+ <br />A: <strong>No.</strong> The special exception permits use of the
library in proprietary applications.
</p>
<p><strong>Q: How is that different from the GNU {Lesser,Library}
GPL?</strong>
<!-- Quoting Jason Merrill from the thread above: -->
- <br>A: The LGPL requires that users be able to replace the LGPL code with a
+ <br />A: The LGPL requires that users be able to replace the LGPL code with a
modified version; this is trivial if the library in question is a C
shared library. But there's no way to make that work with C++, where
much of the library consists of inline functions and templates, which
@@ -68,11 +72,11 @@
<p><strong>Q: I see. So, what restrictions <em>are</em> there on
programs that use the library?</strong>
- <br>A: None. We encourage such programs to be released as open source,
+ <br />A: None. We encourage such programs to be released as open source,
but we won't punish you or sue you if you choose otherwise.
</p>
-<hr>
+<hr />
<h2>The Docs: FDL</h2>
@@ -92,7 +96,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
Comments and suggestions about this page are welcome, and may be sent to
<a href="mailto:libstdc++@gcc.gnu.org">the libstdc++ mailing list</a>.
diff --git a/libstdc++-v3/docs/html/17_intro/porting.html b/libstdc++-v3/docs/html/17_intro/porting.html
index e791f92dc74..c28f89f407f 100644
--- a/libstdc++-v3/docs/html/17_intro/porting.html
+++ b/libstdc++-v3/docs/html/17_intro/porting.html
@@ -68,12 +68,13 @@ directory. The important information is that there needs to be a
directory under <code>config/os</code> to store the files for your operating
system.
-<p>You'll have to change the <code>configure.target</code> file to ensure that
-your new directory is activated. Look for the switch statement that
-sets <code>os_include_dir</code>, and add a pattern to handle your operating
-system. The switch statement switches on only the OS portion of the
-standard target triplet; e.g., the <code>solaris2.8</code> in
-<code>sparc-sun-solaris2.8</code>.
+<p>You might have to change the <code>configure.target</code> file to ensure that
+your new directory is activated. Look for the switch statement that sets
+<code>os_include_dir</code>, and add a pattern to handle your operating system
+if the default will not suffice. The switch statement switches on only
+the OS portion of the standard target triplet; e.g., the <code>solaris2.8</code>
+in <code>sparc-sun-solaris2.8</code>. If the new directory is named after the
+OS portion of the triplet (the default), then nothing needs to be changed.
<p>The first file to create in this directory, should be called
<code>os_defines.h</code>. This file contains basic macro definitions
diff --git a/libstdc++-v3/docs/html/17_intro/porting.texi b/libstdc++-v3/docs/html/17_intro/porting.texi
index 142a354a032..6c6ec1f7f48 100644
--- a/libstdc++-v3/docs/html/17_intro/porting.texi
+++ b/libstdc++-v3/docs/html/17_intro/porting.texi
@@ -102,12 +102,13 @@ directory. The important information is that there needs to be a
directory under @file{config/os} to store the files for your operating
system.
-You'll have to change the @file{configure.target} file to ensure that
-your new directory is activated. Look for the switch statement that
-sets @code{os_include_dir}, and add a pattern to handle your operating
-system. The switch statement switches on only the OS portion of the
-standard target triplet; e.g., the @code{solaris2.8} in
-@code{sparc-sun-solaris2.8}.
+You might have to change the @file{configure.target} file to ensure that
+your new directory is activated. Look for the switch statement that sets
+@code{os_include_dir}, and add a pattern to handle your operating system
+if the default will not suffice. The switch statement switches on only
+the OS portion of the standard target triplet; e.g., the @code{solaris2.8}
+in @code{sparc-sun-solaris2.8}. If the new directory is named after the
+OS portion of the triplet (the default), then nothing needs to be changed.
The first file to create in this directory, should be called
@file{os_defines.h}. This file contains basic macro definitions
diff --git a/libstdc++-v3/docs/html/18_support/howto.html b/libstdc++-v3/docs/html/18_support/howto.html
index 10c74a9cbff..c95f956a370 100644
--- a/libstdc++-v3/docs/html/18_support/howto.html
+++ b/libstdc++-v3/docs/html/18_support/howto.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 18.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 18." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 18</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -24,17 +28,17 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Types</a>
- <li><a href="#2">Implementation properties</a>
- <li><a href="#3">Start and Termination</a>
- <li><a href="#4">Dynamic memory management</a>
- <li><a href="#5">RTTI, the ABI, and demangling</a>
+ <li><a href="#1">Types</a></li>
+ <li><a href="#2">Implementation properties</a></li>
+ <li><a href="#3">Start and Termination</a></li>
+ <li><a href="#4">Dynamic memory management</a></li>
+ <li><a href="#5">RTTI, the ABI, and demangling</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -55,12 +59,13 @@
always a pointer.)
</p>
<p>In his book
- <a href="http://cseng.aw.com/bookdetail.qry?ISBN=0-201-92488-9&ptype=0"><em>Effective C++</em></a>,
+ <a href="http://cseng.aw.com/bookdetail.qry?ISBN=0-201-92488-9&amp;ptype=0"><em>Effective C++</em></a>,
Scott Meyers points out that the best way to solve this problem is to
not overload on pointer-vs-integer types to begin with. He also
offers a way to make your own magic NULL that will match pointers
before it matches integers:
- <pre>
+ </p>
+ <pre>
const // this is a const object...
class {
public:
@@ -77,7 +82,8 @@
// taken (see Item 27)...
} NULL; // and whose name is NULL
- </pre>(Cribbed from the published version of
+ </pre>
+ <p>(Cribbed from the published version of
<a href="http://www.awlonline.com/cseng/meyerscddemo/">the
Effective C++ CD</a>, reproduced here with permission.)
</p>
@@ -93,7 +99,7 @@
print this stuff, it prompted him to run this code through current
compilers to see what the state of the art is with respect to member
template functions. He posted
- <a href="http://www.deja.com/threadmsg_md.xp?AN=644660779.1&CONTEXT=964036823.871301239">an
+ <a href="http://www.deja.com/threadmsg_md.xp?AN=644660779.1&amp;CONTEXT=964036823.871301239">an
article to Usenet</a> after discovering that the code above is not
valid! Even though it has no data members, it still needs a
user-defined constructor (which means that the class needs a type name
@@ -105,14 +111,14 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">Implementation properties</a></h2>
- <p>
<h3><code>&lt;limits&gt;</code></h3>
- This header mainly defines traits classes to give access to various
+ <p>This header mainly defines traits classes to give access to various
implementation defined-aspects of the fundamental types. The
traits classes -- fourteen in total -- are all specilizations of the
template class <code>numeric_limits</code> defined as follows:
+ </p>
<pre>
template&lt;typename T&gt; struct class {
static const bool is_specialized;
@@ -150,12 +156,11 @@
static const bool tinyness_before;
static const float_round_style round_style;
};</pre>
- </p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Start and Termination</a></h2>
<p>Not many changes here to <code>&lt;cstdlib&gt;</code> (the old stdlib.h).
You should note that the <code>abort()</code> function does not call
@@ -166,11 +171,14 @@
</p>
<p>The good old <code>exit()</code> function can be a bit funky, too, until
you look closer. Basically, three points to remember are:
+ </p>
<ol>
<li>Static objects are destroyed in reverse order of their creation.
+ </li>
<li>Functions registered with <code>atexit()</code> are called in
reverse order of registration, once per registration call.
(This isn't actually new.)
+ </li>
<li>The previous two actions are &quot;interleaved,&quot; that is,
given this pseudocode:
<pre>
@@ -181,12 +189,13 @@
atexit(f1);
static Thing obj2;
atexit(f2);
- </pre>then at a call of <code>exit()</code>, f2 will be called, then
+ </pre>
+ then at a call of <code>exit()</code>, f2 will be called, then
obj2 will be destroyed, then f1 will be called, and finally obj1
will be destroyed. If f1 or f2 allow an exception to propagate
out of them, Bad Things happen.
+ </li>
</ol>
- </p>
<p>Note also that <code>atexit()</code> is only required to store 32
functions, and the compiler/library might already be using some of
those slots. If you think you may run out, we recommend using
@@ -196,21 +205,22 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">Dynamic memory management</a></h2>
<p>There are six flavors each of <code>new</code> and <code>delete</code>, so
make certain that you're using the right ones! Here are quickie
descriptions of <code>new</code>:
- <ul>
- <li>single object form, throwing a <code>bad_alloc</code> on errors;
- this is what most people are used to using
- <li>single object &quot;nothrow&quot; form, returning NULL on errors
- <li>array new, throwing <code>bad_alloc</code> on errors
- <li>array nothrow new, returning NULL on errors
- <li>placement new, which does nothing (like it's supposed to)
- <li>placement array new, which also does nothing
- </ul>
- They are distinguished by the parameters that you pass to them, like
+ </p>
+ <ul>
+ <li>single object form, throwing a <code>bad_alloc</code> on errors;
+ this is what most people are used to using</li>
+ <li>single object &quot;nothrow&quot; form, returning NULL on errors</li>
+ <li>array new, throwing <code>bad_alloc</code> on errors</li>
+ <li>array nothrow new, returning NULL on errors</li>
+ <li>placement new, which does nothing (like it's supposed to)</li>
+ <li>placement array new, which also does nothing</li>
+ </ul>
+ <p>They are distinguished by the parameters that you pass to them, like
any other overloaded function. The six flavors of <code>delete</code>
are distinguished the same way, but none of them are allowed to throw
an exception under any circumstances anyhow. (They match up for
@@ -225,7 +235,8 @@
<code>bad_alloc</code> exception (or, technically, some class derived
from it). You can change this by writing your own function (called a
new-handler) and then registering it with <code>set_new_handler()</code>:
- <pre>
+ </p>
+ <pre>
typedef void (*PFV)(void);
static char* safety;
@@ -247,8 +258,7 @@
old_handler = set_new_handler (&amp;my_new_handler);
...
}
- </pre>
- </p>
+ </pre>
<p><code>bad_alloc</code> is derived from the base <code>exception</code>
class defined in Chapter 19.
</p>
@@ -256,7 +266,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="5">RTTI, the ABI, and demangling</a></h2>
<p>If you have read the <a href="../documentation.html#4">source
documentation</a> for <code> namespace abi </code> then you are aware
@@ -271,7 +281,8 @@
<p>Probably the only times you'll be interested in demangling at runtime
are when you're seeing <code>typeid</code> strings in RTTI, or when
you're handling the runtime-support exception classes. For example:
- <pre>
+ </p>
+ <pre>
#include &lt;exception&gt;
#include &lt;iostream&gt;
#include &lt;cxxabi.h&gt;
@@ -304,11 +315,12 @@ int main()
free(realname);
return 0;
-}</pre></p>
- <p>With GCC 3.1 and later, this prints<pre>
- St13bad_exception =&gt; std::bad_exception : 0
- 3barI5emptyLi17EE =&gt; bar&lt;empty, 17&gt; : 0</pre>
+}</pre>
+ <p>With GCC 3.1 and later, this prints
</p>
+ <pre>
+ St13bad_exception =&gt; std::bad_exception : 0
+ 3barI5emptyLi17EE =&gt; bar&lt;empty, 17&gt; : 0 </pre>
<p>The demangler interface is described in the source documentation
linked to above. It is actually written in C, so you don't need to
be writing C++ in order to demangle C++. (That also means we have to
@@ -322,7 +334,7 @@ int main()
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/19_diagnostics/howto.html b/libstdc++-v3/docs/html/19_diagnostics/howto.html
index 3d8bf6f8bbc..d1d759d5a43 100644
--- a/libstdc++-v3/docs/html/19_diagnostics/howto.html
+++ b/libstdc++-v3/docs/html/19_diagnostics/howto.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 19.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 19." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 19</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -20,16 +24,16 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Adding data to exceptions</a>
- <li><a href="#2">Exception class hierarchy diagram</a>
- <li><a href="#3">Concept checkers -- <strong>new and improved!</strong></a>
- <li><a href="#4">Verbose <code>terminate</code></a>
+ <li><a href="#1">Adding data to exceptions</a></li>
+ <li><a href="#2">Exception class hierarchy diagram</a></li>
+ <li><a href="#3">Concept checkers -- <strong>new and improved!</strong></a></li>
+ <li><a href="#4">Verbose <code>terminate</code></a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -56,7 +60,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">Exception class hierarchy diagram</a></h2>
<p>At one point we were going to make up a PDF of the exceptions
hierarchy, akin to the one done for the I/O class hierarchy.
@@ -72,7 +76,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Concept checkers -- <strong>new and improved!</strong></a></h2>
<p>Better taste! Less fat! Literally!</p>
<p>In 1999, SGI added <em>concept checkers</em> to their implementation
@@ -89,7 +93,7 @@
were found in it on more than one occasion.
</p>
<p>The primary author of the checking code, Jeremy Siek, had already
- started work on a replcement implementation. The new code has been
+ started work on a replacement implementation. The new code has been
formally reviewed and accepted into
<a href="http://www.boost.org/libs/concept_check/concept_check.htm">the
Boost libraries</a>, and we are pleased to incorporate it into the
@@ -109,12 +113,13 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">Verbose <code>terminate</code></a></h2>
<p>If you are having difficulty with uncaught exceptions and want a
little bit of help debugging the causes of the core dumps, you can
make use of a GNU extension in GCC 3.1 and later:
- <pre>
+ </p>
+ <pre>
#include &lt;exception&gt;
int main()
@@ -123,7 +128,6 @@
...
throw <em>anything</em>;
}</pre>
- </p>
<p>The <code> __verbose_terminate_handler </code> function obtains the name
of the current exception, attempts to demangle it, and prints it to
stderr. If the exception is derived from <code> std::exception </code>
@@ -133,7 +137,8 @@
without returning; this one calls abort.
</p>
<p>For example:
- <pre>
+ </p>
+ <pre>
#include &lt;exception&gt;
#include &lt;stdexcept&gt;
@@ -151,9 +156,9 @@
else
throw argc;
}</pre>
- </p>
<p>In GCC 3.1 and later, this gives
- <pre>
+ </p>
+ <pre>
% ./a.out
terminate called after throwing a `int'
Aborted
@@ -162,7 +167,7 @@
what(): argc is greater than 5!
Aborted
%</pre>
- The 'Aborted' line comes from the call to abort(), of course.
+ <p>The 'Aborted' line comes from the call to abort(), of course.
</p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
@@ -171,7 +176,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/20_util/howto.html b/libstdc++-v3/docs/html/20_util/howto.html
index b66d557f50e..28021d20635 100644
--- a/libstdc++-v3/docs/html/20_util/howto.html
+++ b/libstdc++-v3/docs/html/20_util/howto.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 20.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 20." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 20</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -19,16 +23,16 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1"><code>auto_ptr</code> is not omnipotent</a>
- <li><a href="#2"><code>auto_ptr</code> inside container classes</a>
- <li><a href="#3">Functors</a>
- <li><a href="#4">Pairs</a>
+ <li><a href="#1"><code>auto_ptr</code> is not omnipotent</a></li>
+ <li><a href="#2"><code>auto_ptr</code> inside container classes</a></li>
+ <li><a href="#3">Functors</a></li>
+ <li><a href="#4">Pairs</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -47,7 +51,8 @@
</p>
<p>AP <em>is</em> meant to prevent nasty leaks in the presence of
exceptions. That's <em>all</em>. This code is AP-friendly:
- <pre>
+ </p>
+ <pre>
// not a recommend naming scheme, but good for web-based FAQs
typedef std::auto_ptr&lt;MyClass&gt; APMC;
@@ -62,21 +67,24 @@
function_taking_MyClass_pointer (ap.get());
}
- </pre>When an exception gets thrown, the instance of MyClass that's
+ </pre>
+ <p>When an exception gets thrown, the instance of MyClass that's
been created on the heap will be <code>delete</code>'d as the stack is
unwound past <code>func()</code>.
</p>
<p>Changing that code as follows is <em>not</em> AP-friendly:
- <pre>
+ </p>
+ <pre>
APMC ap (new MyClass[22]);
- </pre>You will get the same problems as you would without the use
+ </pre>
+ <p>You will get the same problems as you would without the use
of AP:
- <pre>
+ </p>
+ <pre>
char* array = new char[10]; // array new...
...
delete array; // ...but single-object delete
- </pre>
- </p>
+ </pre>
<p>AP cannot tell whether the pointer you've passed at creation points
to one or many things. If it points to many things, you are about
to die. AP is trivial to write, however, so you could write your
@@ -87,18 +95,19 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2"><code>auto_ptr</code> inside container classes</a></h2>
<p>All of the <a href="../23_containers/howto.html">containers</a>
described in the standard library require their contained types
to have, among other things, a copy constructor like this:
- <pre>
+ </p>
+ <pre>
struct My_Type
{
My_Type (My_Type const&amp;);
};
- </pre>
- Note the const keyword; the object being copied shouldn't change.
+ </pre>
+ <p>Note the const keyword; the object being copied shouldn't change.
The template class <code>auto_ptr</code> (called AP here) does not
meet this requirement. Creating a new AP by copying an existing
one transfers ownership of the pointed-to object, which means that
@@ -113,7 +122,8 @@
<a href="../19_diagnostics/howto.html#3">concept checks</a> built
in to this implementation will issue an error if you try to
compile code like this:
- <pre>
+ </p>
+ <pre>
#include &lt;vector&gt;
#include &lt;memory&gt;
@@ -121,14 +131,14 @@
{
std::vector&lt; std::auto_ptr&lt;int&gt; &gt; vec_ap_int;
}
- </pre>
- Should you try this with the checks enabled, you will see an error.
+ </pre>
+ <p>Should you try this with the checks enabled, you will see an error.
</p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Functors</a></h2>
<p>If you don't know what functors are, you're not alone. Many people
get slightly the wrong idea. In the interest of not reinventing
@@ -141,7 +151,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">Pairs</a></h2>
<p>The <code>pair&lt;T1,T2&gt;</code> is a simple and handy way to
carry around a pair of objects. One is of type T1, and another of
@@ -151,16 +161,20 @@
</p>
<p>Construction is simple. The default ctor initializes each member
with its respective default ctor. The other simple ctor,
- <pre>
+ </p>
+ <pre>
pair (const T1&amp; x, const T2&amp; y);
- </pre>does what you think it does, <code>first</code> getting <code>x</code>
+ </pre>
+ <p>does what you think it does, <code>first</code> getting <code>x</code>
and <code>second</code> getting <code>y</code>.
</p>
<p>There is a copy constructor, but it requires that your compiler
handle member function templates:
- <pre>
+ </p>
+ <pre>
template &lt;class U, class V&gt; pain (const pair&lt;U,V&gt;&amp; p);
- </pre>The compiler will convert as necessary from U to T1 and from
+ </pre>
+ <p>The compiler will convert as necessary from U to T1 and from
V to T2 in order to perform the respective initializations.
</p>
<p>The comparison operators are done for you. Equality
@@ -170,24 +184,25 @@
<code>operator==</code> functions (for types like MyClass) or builtin
comparisons (for types like int, char, etc).
</p>
- <a name="pairlt">
- <p>The less-than operator is a bit odd the first time you see it. It
+ <p><a name="pairlt">
+ The less-than operator is a bit odd the first time you see it. It
is defined as evaluating to:
- <pre>
+ </a>
+ </p>
+ <pre>
x.first &lt; y.first ||
( !(y.first &lt; x.first) &amp;&amp; x.second &lt; y.second )
- </pre>
- The other operators are not defined using the <code>rel_ops</code>
+ </pre>
+ <p>The other operators are not defined using the <code>rel_ops</code>
functions above, but their semantics are the same.
</p>
- </a>
<p>Finally, there is a template function called <code>make_pair</code>
that takes two references-to-const objects and returns an
instance of a pair instantiated on their respective types:
- <pre>
- pair&lt;int,MyClass&gt; p = make_pair(4,myobject);
- </pre>
</p>
+ <pre>
+ pair&lt;int,MyClass&gt; p = make_pair(4,myobject);
+ </pre>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
@@ -197,7 +212,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/21_strings/howto.html b/libstdc++-v3/docs/html/21_strings/howto.html
index 6acd357c959..cba9c3f21d4 100644
--- a/libstdc++-v3/docs/html/21_strings/howto.html
+++ b/libstdc++-v3/docs/html/21_strings/howto.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 21.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 21." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 21</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -18,16 +22,17 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">MFC's CString</a>
- <li><a href="#2">A case-insensitive string class</a>
- <li><a href="#3">Breaking a C++ string into tokens</a>
- <li><a href="#4">Simple transformations</a>
+ <li><a href="#1">MFC's CString</a></li>
+ <li><a href="#2">A case-insensitive string class</a></li>
+ <li><a href="#3">Breaking a C++ string into tokens</a></li>
+ <li><a href="#4">Simple transformations</a></li>
+ <li><a href="#5">Making strings of arbitrary character types</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -42,24 +47,29 @@
<p>Things are not as bad as they seem. In
<a href="http://gcc.gnu.org/ml/gcc/1999-04n/msg00236.html">this
message</a>, Joe Buck points out a few very important things:
+ </p>
<ul>
<li>The Standard <code>string</code> supports all the operations
that CString does, with three exceptions.
+ </li>
<li>Two of those exceptions (whitespace trimming and case
conversion) are trivial to implement. In fact, we do so
on this page.
+ </li>
<li>The third is <code>CString::Format</code>, which allows formatting
in the style of <code>sprintf</code>. This deserves some mention:
+ </li>
</ul>
- </p>
- <a name="1.1internal"> <!-- Coming from Chapter 27 -->
- <p>The old libg++ library had a function called form(), which did much
+ <p><a name="1.1internal"> <!-- Coming from Chapter 27 -->
+ The old libg++ library had a function called form(), which did much
the same thing. But for a Standard solution, you should use the
stringstream classes. These are the bridge between the iostream
hierarchy and the string class, and they operate with regular
streams seamlessly because they inherit from the iostream
hierarchy. An quick example:
- <pre>
+ </a>
+ </p>
+ <pre>
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
@@ -79,10 +89,10 @@
return output_stream.str();
} </pre>
- </p></a>
<p>A serious problem with CString is a design bug in its memory
allocation. Specifically, quoting from that same message:
- <pre>
+ </p>
+ <pre>
CString suffers from a common programming error that results in
poor performance. Consider the following code:
@@ -103,22 +113,25 @@
If you replace CString with string in the above function, the
performance is O(n).
- </pre>
- </p>
+ </pre>
<p>Joe Buck also pointed out some other things to keep in mind when
comparing CString and the Standard string class:
+ </p>
<ul>
<li>CString permits access to its internal representation; coders
who exploited that may have problems moving to <code>string</code>.
+ </li>
<li>Microsoft ships the source to CString (in the files
MFC\SRC\Str{core,ex}.cpp), so you could fix the allocation
bug and rebuild your MFC libraries.
- <em><B>Note:</B> It looks like the the CString shipped with
- VC++6.0 has fixed this, although it may in fact have been one
- of the VC++ SPs that did it.</em>
+ <em><strong>Note:</strong> It looks like the the CString shipped
+ with VC++6.0 has fixed this, although it may in fact have been
+ one of the VC++ SPs that did it.</em>
+ </li>
<li><code>string</code> operations like this have O(n) complexity
<em>if the implementors do it correctly</em>. The libstdc++
implementors did it correctly. Other vendors might not.
+ </li>
<li>While parts of the SGI STL are used in libstdc++-v3, their
string class is not. The SGI <code>string</code> is essentially
<code>vector&lt;char&gt;</code> and does not do any reference
@@ -128,13 +141,13 @@
libstdc++ string, the SGI string, and the SGI rope, and this
is all before any allocator or traits customizations! (More
choices than you can shake a stick at -- want fries with that?)
+ </li>
</ul>
- </p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">A case-insensitive string class</a></h2>
<p>The well-known-and-if-it-isn't-well-known-it-ought-to-be
<a href="http://www.peerdirect.com/resources/">Guru of the Week</a>
@@ -143,7 +156,8 @@
is identical to the standard 'string' class, but is
case-insensitive in the same way as the (common but nonstandard)
C function stricmp():&quot;
- <pre>
+ </p>
+ <pre>
ci_string s( "AbCdE" );
// case insensitive
@@ -153,7 +167,6 @@
// still case-preserving, of course
assert( strcmp( s.c_str(), "AbCdE" ) == 0 );
assert( strcmp( s.c_str(), "abcde" ) != 0 ); </pre>
- </p>
<p>The solution is surprisingly easy. The original answer pages
on the GotW website were removed into cold storage, in
@@ -188,7 +201,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Breaking a C++ string into tokens</a></h2>
<p>The Standard C (and C++) function <code>strtok()</code> leaves a lot to
be desired in terms of user-friendliness. It's unintuitive, it
@@ -209,21 +222,23 @@
comments on what kind of string it will accept). The author uses
a more general (but less readable) form of it for parsing command
strings and the like. If you compiled and ran this code using it:
- <pre>
+ </p>
+ <pre>
std::list&lt;string&gt; ls;
stringtok (ls, " this \t is\t\n a test ");
for (std::list&lt;string&gt;const_iterator i = ls.begin();
i != ls.end(); ++i)
{
std::cerr &lt;&lt; ':' &lt;&lt; (*i) &lt;&lt; ":\n";
- }</pre>
- You would see this as output:
- <pre>
+ } </pre>
+ <p>You would see this as output:
+ </p>
+ <pre>
:this:
:is:
:a:
- :test:</pre>
- with all the whitespace removed. The original <code>s</code> is still
+ :test: </pre>
+ <p>with all the whitespace removed. The original <code>s</code> is still
available for use, <code>ls</code> will clean up after itself, and
<code>ls.size()</code> will return how many tokens there were.
</p>
@@ -247,7 +262,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">Simple transformations</a></h2>
<p>Here are Standard, simple, and portable ways to perform common
transformations on a <code>string</code> instance, such as &quot;convert
@@ -257,7 +272,8 @@
</p>
<p>This code will go through some iterations (no pun). Here's the
simplistic version usually seen on Usenet:
- <pre>
+ </p>
+ <pre>
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;cctype&gt; // old &lt;ctype.h&gt;
@@ -275,7 +291,7 @@
std::string capital_s;
capital_s.reserve(s.size());
std::transform (s.begin(), s.end(), capital_s.begin(), tolower); </pre>
- <span class="larger"><strong>Note</strong></span> that these calls all
+ <p><span class="larger"><strong>Note</strong></span> that these calls all
involve the global C locale through the use of the C functions
<code>toupper/tolower</code>. This is absolutely guaranteed to work --
but <em>only</em> if the string contains <em>only</em> characters
@@ -286,12 +302,12 @@
characters (hahahahahaha), then you're done.
</p>
<p>At minimum, you can write short wrappers like
- <pre>
+ </p>
+ <pre>
char toLower (char c)
{
return tolower(static_cast&lt;unsigned char&gt;(c));
- }</pre>
- </p>
+ } </pre>
<p>The correct method is to use a facet for a particular locale
and call its conversion functions. These are discussed more in
Chapter 22; the specific part is
@@ -303,7 +319,8 @@
like transformations, this task is trivial with the use of string's
<code>find</code> family. These examples are broken into multiple
statements for readability:
- <pre>
+ </p>
+ <pre>
std::string str (" \t blah blah blah \n ");
// trim leading whitespace
@@ -313,7 +330,7 @@
// trim trailing whitespace
notwhite = str.find_last_not_of(" \t\n");
str.erase(notwhite+1); </pre>
- Obviously, the calls to <code>find</code> could be inserted directly
+ <p>Obviously, the calls to <code>find</code> could be inserted directly
into the calls to <code>erase</code>, in case your compiler does not
optimize named temporaries out of existence.
</p>
@@ -321,11 +338,83 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
+<hr />
+<h2><a name="5">Making strings of arbitrary character types</a></h2>
+ <p>The <code>std::basic_string</code> is tantalizingly general, in that
+ it is parameterized on the type of the characters which it holds.
+ In theory, you could whip up a Unicode character class and instantiate
+ <code>std::basic_string&lt;my_unicode_char&gt;</code>, or assuming
+ that integers are wider than characters on your platform, maybe just
+ declare variables of type <code>std::basic_string&lt;int&gt;</code>.
+ </p>
+ <p>That's the theory. Remember however that basic_string has additional
+ type parameters, which take default arguments based on the character
+ type (called CharT here):
+ </p>
+ <pre>
+ template &lt;typename CharT,
+ typename Traits = char_traits&lt;CharT&gt;,
+ typename Alloc = allocator&lt;CharT&gt; &gt;
+ class basic_string { .... };</pre>
+ <p>Now, <code>allocator&lt;CharT&gt;</code> will probably Do The Right
+ Thing by default, unless you need to implement your own allocator
+ for your characters.
+ </p>
+ <p>But <code>char_traits</code> takes more work. The char_traits
+ template is <em>declared</em> but not <em>defined</em>.
+ That means there is only
+ </p>
+ <pre>
+ template &lt;typename CharT&gt;
+ struct char_traits
+ {
+ static void foo (type1 x, type2 y);
+ ...
+ };</pre>
+ <p>and functions such as char_traits&lt;CharT&gt;::foo() are not
+ actually defined anywhere for the general case. The C++ standard
+ permits this, because writing such a definition to fit all possible
+ CharT's cannot be done. (For a time, in earlier versions of GCC,
+ there was a mostly-correct implementation that let programmers be
+ lazy. :-) But it broke under many situations, so it was removed.
+ You are no longer allowed to be lazy and non-portable.)
+ </p>
+ <p>The C++ standard also requires that char_traits be specialized for
+ instantiations of <code>char</code> and <code>wchar_t</code>, and it
+ is these template specializations that permit entities like
+ <code>basic_string&lt;char,char_traits&lt;char&gt;&gt;</code> to work.
+ </p>
+ <p>If you want to use character types other than char and wchar_t,
+ such as <code>unsigned char</code> and <code>int</code>, you will
+ need to write specializations for them at the present time. If you
+ want to use your own special character class, then you have
+ <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00163.html">a lot
+ of work to do</a>, especially if you with to use i18n features
+ (facets require traits information but don't have a traits argument).
+ </p>
+ <p>One example of how to specialize char_traits is given
+ <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00260.html">in
+ this message</a>. We agree that the way it's used with basic_string
+ (scroll down to main()) doesn't look nice, but that's because
+ <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00236.html">the
+ nice-looking first attempt</a> turned out to
+ <a href="http://gcc.gnu.org/ml/libstdc++/2002-08/msg00242.html">not
+ be conforming C++</a>, due to the rule that CharT must be a POD.
+ (See how tricky this is?)
+ </p>
+ <p>Other approaches were suggested in that same thread, such as providing
+ more specializations and/or some helper types in the library to assist
+ users writing such code. So far nobody has had the time...
+ <a href="../17_intro/contribute.html">do you?</a>
+ </p>
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/22_locale/codecvt.html b/libstdc++-v3/docs/html/22_locale/codecvt.html
index a841c35fbce..6acd416fc07 100644
--- a/libstdc++-v3/docs/html/22_locale/codecvt.html
+++ b/libstdc++-v3/docs/html/22_locale/codecvt.html
@@ -1,18 +1,26 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <title>
- Notes on the codecvt implementation.
- </title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="bkoz@redhat.com (Benjamin Kosnik)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="Notes on the codecvt implementation." />
+ <title>Notes on the codecvt implementation.</title>
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
<h1>
Notes on the codecvt implementation.
</h1>
<p>
-<I>
+<em>
prepared by Benjamin Kosnik (bkoz@redhat.com) on August 28, 2000
-</I>
+</em>
+</p>
<h2>
1. Abstract
@@ -33,26 +41,25 @@ wide and narrow characters and the implementation-provided extended
functionality are given.
</p>
-<p>
<h2>
2. What the standard says
</h2>
Around page 425 of the C++ Standard, this charming heading comes into view:
-<BLOCKQUOTE>
+<blockquote>
22.2.1.5 - Template class codecvt [lib.locale.codecvt]
-</BLOCKQUOTE>
+</blockquote>
The text around the codecvt definition gives some clues:
-<BLOCKQUOTE>
-<I>
+<blockquote>
+<em>
-1- The class codecvt&lt;internT,externT,stateT&gt; is for use when
converting from one codeset to another, such as from wide characters
to multibyte characters, between wide character encodings such as
Unicode and EUC.
-</I>
-</BLOCKQUOTE>
+</em>
+</blockquote>
<p>
Hmm. So, in some unspecified way, Unicode encodings and
@@ -60,18 +67,18 @@ translations between other character sets should be handled by this
class.
</p>
-<BLOCKQUOTE>
-<I>
+<blockquote>
+<em>
-2- The stateT argument selects the pair of codesets being mapped between.
-</I>
-</BLOCKQUOTE>
+</em>
+</blockquote>
<p>
Ah ha! Another clue...
</p>
-<BLOCKQUOTE>
-<I>
+<blockquote>
+<em>
-3- The instantiations required in the Table ??
(lib.locale.category), namely codecvt&lt;wchar_t,char,mbstate_t&gt; and
codecvt&lt;char,char,mbstate_t&gt;, convert the implementation-defined
@@ -83,11 +90,12 @@ mbstate_t perform conversion between encodings known to the library
implementor. Other encodings can be converted by specializing on a
user-defined stateT type. The stateT object can contain any state that
is useful to communicate to or from the specialized do_convert member.
-</I>
-</BLOCKQUOTE>
+</em>
+</blockquote>
<p>
At this point, a couple points become clear:
+</p>
<p>
One: The standard clearly implies that attempts to add non-required
@@ -100,7 +108,6 @@ template parameter, imply an implementation strategy that is mostly
(or wholly) based on the underlying C library, and the functions
mcsrtombs and wcsrtombs in particular.</p>
-<p>
<h2>
3. Some thoughts on what would be useful
</h2>
@@ -121,15 +128,19 @@ represent wide characters, and use an internal encoding of
UCS4. (GNU/Linux systems using glibc, in particular.) The C
programming language (and thus C++) does not specify a specific size
for the type wchar_t.
+</p>
<p>
Thus, portable C++ code cannot assume a byte size (or endianness) either.
+</p>
<p>
Getting back to the frequently asked question: What about Unicode strings?
+</p>
<p>
What magic spell will do this conversion?
+</p>
<p>
A couple of comments:
@@ -153,12 +164,14 @@ example, using the iconv family of functions from the Single Unix
Specification (what used to be called X/Open) hosted on the GNU/Linux
operating system allows bi-directional mapping between far more than
the following tantalizing possibilities:
+</p>
<p>
(An edited list taken from <code>`iconv --list`</code> on a Red Hat 6.2/Intel system:
+</p>
-<BLOCKQUOTE>
-<PRE>
+<blockquote>
+<pre>
8859_1, 8859_9, 10646-1:1993, 10646-1:1993/UCS4, ARABIC, ARABIC7,
ASCII, EUC-CN, EUC-JP, EUC-KR, EUC-TW, GREEK-CCIcode, GREEK, GREEK7-OLD,
GREEK7, GREEK8, HEBREW, ISO-8859-1, ISO-8859-2, ISO-8859-3,
@@ -168,8 +181,8 @@ ISO-8859-15, ISO-10646, ISO-10646/UCS2, ISO-10646/UCS4,
ISO-10646/UTF-8, ISO-10646/UTF8, SHIFT-JIS, SHIFT_JIS, UCS-2, UCS-4,
UCS2, UCS4, UNICODE, UNICODEBIG, UNICODELIcodeLE, US-ASCII, US, UTF-8,
UTF-16, UTF8, UTF16).
-</PRE>
-</BLOCKQUOTE>
+</pre>
+</blockquote>
<p>
For iconv-based implementations, string literals for each of the
@@ -177,9 +190,12 @@ encodings (ie. &quot;UCS-2&quot; and &quot;UTF-8&quot;) are necessary,
although for other,
non-iconv implementations a table of enumerated values or some other
mechanism may be required.
+</p>
+</li>
<li>
Maximum length of the identifying string literal.
+</li>
<li>
Some encodings are require explicit endian-ness. As such, some kind
@@ -187,6 +203,7 @@ mechanism may be required.
&quot;Footnotes for C/C++ developers&quot; in Haible for more information on
UCS-2/Unicode endian issues. (Summary: big endian seems most likely,
however implementations, most notably Microsoft, vary.)
+</li>
<li>
Types representing the conversion state, for conversions involving
@@ -194,24 +211,28 @@ mechanism may be required.
conversions using iconv (such as the type iconv_t.) Note that the
conversion descriptor encodes more information than a simple encoding
state type.
+</li>
<li>
Conversion descriptors for both directions of encoding. (ie, both
UCS-2 to UTF-8 and UTF-8 to UCS-2.)
+</li>
<li>
Something to indicate if the conversion requested if valid.
+</li>
<li>
Something to represent if the conversion descriptors are valid.
+</li>
<li>
Some way to enforce strict type checking on the internal and
external types. As part of this, the size of the internal and
external types will need to be known.
+</li>
</ul>
-<p>
<h2>
4. Problems with &quot;C&quot; code conversions : thread safety, global
locales, termination.
@@ -224,11 +245,13 @@ when implemented using standard &quot;C&quot; functions.
<p>
Three problems arise, one big, one of medium importance, and one small.
+</p>
<p>
First, the small: mcsrtombs and wcsrtombs may not be multithread-safe
on all systems required by the GNU tools. For GNU/Linux and glibc,
this is not an issue.
+</p>
<p>
Of medium concern, in the grand scope of things, is that the functions
@@ -236,6 +259,7 @@ used to implement this specialization work on null-terminated
strings. Buffers, especially file buffers, may not be null-terminated,
thus giving conversions that end prematurely or are otherwise
incorrect. Yikes!
+</p>
<p>
The last, and fundamental problem, is the assumption of a global
@@ -247,14 +271,15 @@ the GNU C++ library would like to offer a solution that allows
multiple locales and or simultaneous usage with computationally
correct results. In short, libstdc++-v3 is trying to offer, as an
option, a high-quality implementation, damn the additional complexity!
+</p>
<p>
For the required specialization codecvt&lt;wchar_t, char, mbstate_t&gt; ,
conversions are made between the internal character set (always UCS4
on GNU/Linux) and whatever the currently selected locale for the
LC_CTYPE category implements.
+</p>
-<p>
<h2>
5. Design
</h2>
@@ -264,25 +289,30 @@ The two required specializations are implemented as follows:
<code>
codecvt&lt;char, char, mbstate_t&gt;
</code>
+</p>
<p>
This is a degenerate (ie, does nothing) specialization. Implementing
this was a piece of cake.
+</p>
<p>
<code>
codecvt&lt;char, wchar_t, mbstate_t&gt;
</code>
+</p>
<p>
This specialization, by specifying all the template parameters, pretty
much ties the hands of implementors. As such, the implementation is
straightforward, involving mcsrtombs for the conversions between char
to wchar_t and wcsrtombs for conversions between wchar_t and char.
+</p>
<p>
Neither of these two required specializations deals with Unicode
characters. As such, libstdc++-v3 implements a partial specialization
of the codecvt class with and iconv wrapper class, __enc_traits as the
third template parameter.
+</p>
<p>
This implementation should be standards conformant. First of all, the
@@ -293,33 +323,40 @@ non-required conversions. Second of all, the standard says (in Chapter
of all, the requirements for the stateT type elsewhere in the standard
(see 21.1.2 traits typedefs) only indicate that this type be copy
constructible.
+</p>
<p>
As such, the type __enc_traits is defined as a non-templatized, POD
type to be used as the third type of a codecvt instantiation. This
type is just a wrapper class for iconv, and provides an easy interface
to iconv functionality.
+</p>
<p>
There are two constructors for __enc_traits:
+</p>
<p>
<code>
__enc_traits() : __in_desc(0), __out_desc(0)
</code>
+</p>
<p>
This default constructor sets the internal encoding to some default
(currently UCS4) and the external encoding to whatever is returned by
nl_langinfo(CODESET).
+</p>
<p>
<code>
__enc_traits(const char* __int, const char* __ext)
</code>
+</p>
<p>
This constructor takes as parameters string literals that indicate the
desired internal and external encoding. There are no defaults for
either argument.
+</p>
<p>
One of the issues with iconv is that the string literals identifying
@@ -330,24 +367,28 @@ inducing) strategy was implemented: end-users can specify any string
(subject to a pre-determined length qualifier, currently 32 bytes) for
encodings. It is up to the user to make sure that these strings are
valid on the target system.
+</p>
<p>
<code>
void
_M_init()
</code>
+</p>
<p>
Strangely enough, this member function attempts to open conversion
descriptors for a given __enc_traits object. If the conversion
descriptors are not valid, the conversion descriptors returned will
not be valid and the resulting calls to the codecvt conversion
functions will return error.
+</p>
<p>
<code>
bool
_M_good()
</code>
+</p>
<p>
Provides a way to see if the given __enc_traits object has been
properly initialized. If the string literals describing the desired
@@ -356,57 +397,60 @@ fail, and this will return false. If the internal and external
encodings are valid, but iconv_open could not allocate conversion
descriptors, this will also return false. Otherwise, the object is
ready to convert and will return true.
+</p>
<p>
<code>
__enc_traits(const __enc_traits&amp;)
</code>
+</p>
<p>
As iconv allocates memory and sets up conversion descriptors, the copy
constructor can only copy the member data pertaining to the internal
and external code conversions, and not the conversion descriptors
themselves.
+</p>
<p>
Definitions for all the required codecvt member functions are provided
for this specialization, and usage of codecvt&lt;internal character type,
external character type, __enc_traits&gt; is consistent with other
codecvt usage.
+</p>
-<p>
<h2>
6. Examples
</h2>
<ul>
- <li>
- a. conversions involving string literals
+ <li>
+ a. conversions involving string literals
<pre>
- typedef codecvt_base::result result;
- typedef unsigned short unicode_t;
- typedef unicode_t int_type;
- typedef char ext_type;
- typedef __enc_traits enc_type;
- typedef codecvt&lt;int_type, ext_type, enc_type&gt; unicode_codecvt;
-
- const ext_type* e_lit = "black pearl jasmine tea";
- int size = strlen(e_lit);
- int_type i_lit_base[24] =
+ typedef codecvt_base::result result;
+ typedef unsigned short unicode_t;
+ typedef unicode_t int_type;
+ typedef char ext_type;
+ typedef __enc_traits enc_type;
+ typedef codecvt&lt;int_type, ext_type, enc_type&gt; unicode_codecvt;
+
+ const ext_type* e_lit = "black pearl jasmine tea";
+ int size = strlen(e_lit);
+ int_type i_lit_base[24] =
{ 25088, 27648, 24832, 25344, 27392, 8192, 28672, 25856, 24832, 29184,
27648, 8192, 27136, 24832, 29440, 27904, 26880, 28160, 25856, 8192, 29696,
25856, 24832, 2560
};
- const int_type* i_lit = i_lit_base;
+ const int_type* i_lit = i_lit_base;
const ext_type* efrom_next;
const int_type* ifrom_next;
- ext_type* e_arr = new ext_type[size + 1];
- ext_type* eto_next;
- int_type* i_arr = new int_type[size + 1];
- int_type* ito_next;
+ ext_type* e_arr = new ext_type[size + 1];
+ ext_type* eto_next;
+ int_type* i_arr = new int_type[size + 1];
+ int_type* ito_next;
// construct a locale object with the specialized facet.
- locale loc(locale::classic(), new unicode_codecvt);
+ locale loc(locale::classic(), new unicode_codecvt);
// sanity check the constructed locale has the specialized facet.
VERIFY( has_facet&lt;unicode_codecvt&gt;(loc) );
const unicode_codecvt&amp; cvt = use_facet&lt;unicode_codecvt&gt;(loc);
@@ -414,70 +458,80 @@ codecvt usage.
unicode_codecvt::state_type state01("UNICODE", "ISO_8859-1");
initialize_state(state01);
result r1 = cvt.in(state01, e_lit, e_lit + size, efrom_next,
- i_arr, i_arr + size, ito_next);
+ i_arr, i_arr + size, ito_next);
VERIFY( r1 == codecvt_base::ok );
VERIFY( !int_traits::compare(i_arr, i_lit, size) );
VERIFY( efrom_next == e_lit + size );
VERIFY( ito_next == i_arr + size );
</pre>
- <li>
- b. conversions involving std::string
- <li>
- c. conversions involving std::filebuf and std::ostream
+ </li>
+ <li>
+ b. conversions involving std::string
+ </li>
+ <li>
+ c. conversions involving std::filebuf and std::ostream
+ </li>
</ul>
More information can be found in the following testcases:
<ul>
-<li> testsuite/22_locale/codecvt_char_char.cc
-<li> testsuite/22_locale/codecvt_unicode_wchar_t.cc
-<li> testsuite/22_locale/codecvt_unicode_char.cc
-<li> testsuite/22_locale/codecvt_wchar_t_char.cc
+<li> testsuite/22_locale/codecvt_char_char.cc </li>
+<li> testsuite/22_locale/codecvt_unicode_wchar_t.cc </li>
+<li> testsuite/22_locale/codecvt_unicode_char.cc </li>
+<li> testsuite/22_locale/codecvt_wchar_t_char.cc </li>
</ul>
-<p>
<h2>
7. Unresolved Issues
</h2>
<ul>
<li>
- a. things that are sketchy, or remain unimplemented:
- do_encoding, max_length and length member functions
- are only weakly implemented. I have no idea how to do
- this correctly, and in a generic manner. Nathan?
+ a. things that are sketchy, or remain unimplemented:
+ do_encoding, max_length and length member functions
+ are only weakly implemented. I have no idea how to do
+ this correctly, and in a generic manner. Nathan?
+</li>
<li>
- b. conversions involving std::string
-
- <ul>
- <li>
- how should operators != and == work for string of
- different/same encoding?
-
- <li>
- what is equal? A byte by byte comparison or an
- encoding then byte comparison?
-
- <li>
- conversions between narrow, wide, and unicode strings
- </ul>
+ b. conversions involving std::string
+
+ <ul>
+ <li>
+ how should operators != and == work for string of
+ different/same encoding?
+ </li>
+
+ <li>
+ what is equal? A byte by byte comparison or an
+ encoding then byte comparison?
+ </li>
+
+ <li>
+ conversions between narrow, wide, and unicode strings
+ </li>
+ </ul>
+</li>
<li>
- c. conversions involving std::filebuf and std::ostream
- <ul>
- <li>
- how to initialize the state object in a
- standards-conformant manner?
-
- <li>
- how to synchronize the &quot;C&quot; and &quot;C++&quot;
- conversion information?
-
- <li>
- wchar_t/char internal buffers and conversions between
- internal/external buffers?
- </ul>
+ c. conversions involving std::filebuf and std::ostream
+ <ul>
+ <li>
+ how to initialize the state object in a
+ standards-conformant manner?
+ </li>
+
+ <li>
+ how to synchronize the &quot;C&quot; and &quot;C++&quot;
+ conversion information?
+ </li>
+
+ <li>
+ wchar_t/char internal buffers and conversions between
+ internal/external buffers?
+ </li>
+ </ul>
+</li>
</ul>
-<p>
<h2>
8. Acknowledgments
</h2>
@@ -485,7 +539,6 @@ Ulrich Drepper for the iconv suggestions and patient answering of
late-night questions, Jason Merrill for the template partial
specialization hints, language clarification, and wchar_t fixes.
-<p>
<h2>
9. Bibliography / Referenced Documents
</h2>
@@ -494,35 +547,44 @@ Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters &quot;6. C
<p>
Drepper, Ulrich, Numerous, late-night email correspondence
+</p>
<p>
Feather, Clive, &quot;A brief description of Normative Addendum 1,&quot; in particular the parts on Extended Character Sets
http://www.lysator.liu.se/c/na1.html
+</p>
<p>
Haible, Bruno, &quot;The Unicode HOWTO&quot; v0.18, 4 August 2000
ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html
+</p>
<p>
ISO/IEC 14882:1998 Programming languages - C++
+</p>
<p>
ISO/IEC 9899:1999 Programming languages - C
+</p>
<p>
Khun, Markus, &quot;UTF-8 and Unicode FAQ for Unix/Linux&quot;
http://www.cl.cam.ac.uk/~mgk25/unicode.html
+</p>
<p>
Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000
+</p>
<p>
Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000
+</p>
<p>
System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x)
The Open Group/The Institute of Electrical and Electronics Engineers, Inc.
http://www.opennc.org/austin/docreg.html
+</p>
</body>
</html>
diff --git a/libstdc++-v3/docs/html/22_locale/ctype.html b/libstdc++-v3/docs/html/22_locale/ctype.html
index a47d9f81ef0..3043123f041 100644
--- a/libstdc++-v3/docs/html/22_locale/ctype.html
+++ b/libstdc++-v3/docs/html/22_locale/ctype.html
@@ -1,19 +1,25 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <title>
- Notes on the ctype implementation.
- </title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="bkoz@redhat.com (Benjamin Kosnik)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="Notes on the ctype implementation." />
+ <title>Notes on the ctype implementation.</title>
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
<h1>
Notes on the ctype implementation.
</h1>
-<I>
+<em>
prepared by Benjamin Kosnik (bkoz@redhat.com) on August 30, 2000
-</I>
+</em>
-<p>
<h2>
1. Abstract
</h2>
@@ -21,13 +27,11 @@ prepared by Benjamin Kosnik (bkoz@redhat.com) on August 30, 2000
Woe is me.
</p>
-<p>
<h2>
2. What the standard says
</h2>
-<p>
<h2>
3. Problems with &quot;C&quot; ctype : global locales, termination.
</h2>
@@ -37,8 +41,8 @@ For the required specialization codecvt&lt;wchar_t, char, mbstate_t&gt; ,
conversions are made between the internal character set (always UCS4
on GNU/Linux) and whatever the currently selected locale for the
LC_CTYPE category implements.
+</p>
-<p>
<h2>
4. Design
</h2>
@@ -48,24 +52,28 @@ The two required specializations are implemented as follows:
<code>
ctype&lt;char&gt;
</code>
+</p>
<p>
This is simple specialization. Implementing this was a piece of cake.
+</p>
<p>
<code>
ctype&lt;wchar_t&gt;
</code>
+</p>
<p>
This specialization, by specifying all the template parameters, pretty
much ties the hands of implementors. As such, the implementation is
straightforward, involving mcsrtombs for the conversions between char
to wchar_t and wcsrtombs for conversions between wchar_t and char.
+</p>
<p>
Neither of these two required specializations deals with Unicode
characters. As such, libstdc++-v3 implements
+</p>
-<p>
<h2>
5. Examples
</h2>
@@ -76,50 +84,47 @@ characters. As such, libstdc++-v3 implements
More information can be found in the following testcases:
<ul>
-<li> testsuite/22_locale/ctype_char_members.cc
-<li> testsuite/22_locale/ctype_wchar_t_members.cc
+<li> testsuite/22_locale/ctype_char_members.cc </li>
+<li> testsuite/22_locale/ctype_wchar_t_members.cc </li>
</ul>
-<p>
<h2>
6. Unresolved Issues
</h2>
<ul>
- <li> how to deal with the global locale issue?
+ <li> how to deal with the global locale issue? </li>
- <li> how to deal with different types than char, wchar_t?
+ <li> how to deal with different types than char, wchar_t? </li>
- <li> codecvt/ctype overlap: narrow/widen
+ <li> codecvt/ctype overlap: narrow/widen </li>
- <li> mask typedef in codecvt_base, argument types in codecvt.
- what is know about this type?
+ <li> mask typedef in codecvt_base, argument types in codecvt.
+ what is know about this type? </li>
- <li> why mask* argument in codecvt?
-
- <li> can this be made (more) generic? is there a simple way to
- straighten out the configure-time mess that is a by-product of
- this class?
+ <li> why mask* argument in codecvt? </li>
+
+ <li> can this be made (more) generic? is there a simple way to
+ straighten out the configure-time mess that is a by-product of
+ this class? </li>
- <li> get the ctype&lt;wchar_t&gt;::mask stuff under control. Need to
- make some kind of static table, and not do lookup evertime
- somebody hits the do_is... functions. Too bad we can't just
- redefine mask for ctype&lt;wchar_t&gt;
-
- <li> rename abstract base class. See if just smash-overriding
- is a better approach. Clarify, add sanity to naming.
+ <li> get the ctype&lt;wchar_t&gt;::mask stuff under control. Need to
+ make some kind of static table, and not do lookup evertime
+ somebody hits the do_is... functions. Too bad we can't just
+ redefine mask for ctype&lt;wchar_t&gt; </li>
+
+ <li> rename abstract base class. See if just smash-overriding
+ is a better approach. Clarify, add sanity to naming. </li>
</ul>
-<p>
<h2>
7. Acknowledgments
</h2>
Ulrich Drepper for patient answering of late-night questions, skeletal
examples, and C language expertise.
-<p>
<h2>
8. Bibliography / Referenced Documents
</h2>
@@ -128,23 +133,29 @@ Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters &quot;6. C
<p>
Drepper, Ulrich, Numerous, late-night email correspondence
+</p>
<p>
ISO/IEC 14882:1998 Programming languages - C++
+</p>
<p>
ISO/IEC 9899:1999 Programming languages - C
+</p>
<p>
Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000
+</p>
<p>
Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000
+</p>
<p>
System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x)
The Open Group/The Institute of Electrical and Electronics Engineers, Inc.
http://www.opennc.org/austin/docreg.html
+</p>
</body>
</html>
diff --git a/libstdc++-v3/docs/html/22_locale/howto.html b/libstdc++-v3/docs/html/22_locale/howto.html
index b8fe45d1e59..bd2526ddb4c 100644
--- a/libstdc++-v3/docs/html/22_locale/howto.html
+++ b/libstdc++-v3/docs/html/22_locale/howto.html
@@ -1,13 +1,17 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 22.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 22." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 22</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -16,33 +20,33 @@
<p>Chapter 22 deals with the C++ localization facilities.
</p>
<!-- I wanted to write that sentence in something requiring an exotic font,
- like Cryllic or Kanji. Probably more work than such cuteness is worth,
+ like Cyrllic or Kanji. Probably more work than such cuteness is worth,
but I still think it'd be funny.
-->
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">class locale</a>
- <li><a href="#2">class codecvt</a>
- <li><a href="#3">class ctype</a>
- <li><a href="#4">class messages</a>
- <li><a href="#5">Bjarne Stroustrup on Locales</a>
- <li><a href="#6">Nathan Myers on Locales</a>
- <li><a href="#7">Correct Transformations</a>
+ <li><a href="#1">class locale</a></li>
+ <li><a href="#2">class codecvt</a></li>
+ <li><a href="#3">class ctype</a></li>
+ <li><a href="#4">class messages</a></li>
+ <li><a href="#5">Bjarne Stroustrup on Locales</a></li>
+ <li><a href="#6">Nathan Myers on Locales</a></li>
+ <li><a href="#7">Correct Transformations</a></li>
</ul>
<!-- ####################################################### -->
-<hr>
+<hr />
<h2><a name="1">class locale</a></h2>
<p>Notes made during the implementation of locales can be found
<a href="locale.html">here</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">class codecvt</a></h2>
<p>Notes made during the implementation of codecvt can be found
<a href="codecvt.html">here</a>.
@@ -66,19 +70,19 @@
implementation-provided extended functionality are given.
</blockquote>
-<hr>
+<hr />
<h2><a name="3">class ctype</a></h2>
<p>Notes made during the implementation of ctype can be found
<a href="ctype.html">here</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">class messages</a></h2>
<p>Notes made during the implementation of messages can be found
<a href="messages.html">here</a>.
</p>
-<hr>
+<hr />
<h2><a name="5">Stroustrup on Locales</a></h2>
<p>Dr. Bjarne Stroustrup has released a
<a href="http://www.research.att.com/~bs/3rd_loc0.html">pointer</a>
@@ -96,14 +100,14 @@
avoid it.
</em></blockquote>
-<hr>
+<hr />
<h2><a name="6">Nathan Myers on Locales</a></h2>
<p>An article entitled &quot;The Standard C++ Locale&quot; was
published in Dr. Dobb's Journal and can be found
<a href="http://www.cantrip.org/locale.html">here</a>.
</p>
-<hr>
+<hr />
<h2><a name="7">Correct Transformations</a></h2>
<!-- Jumping directly to here from chapter 21. -->
<p>A very common question on newsgroups and mailing lists is, &quot;How
@@ -207,7 +211,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/22_locale/locale.html b/libstdc++-v3/docs/html/22_locale/locale.html
index 630f59986f1..6816204df8f 100644
--- a/libstdc++-v3/docs/html/22_locale/locale.html
+++ b/libstdc++-v3/docs/html/22_locale/locale.html
@@ -1,127 +1,504 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <title>
- Notes on the locale implementation.
- </title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="bkoz@redhat.com (Benjamin Kosnik)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, locale name LC_ALL" />
+ <meta name="DESCRIPTION" content="Notes on the locale implementation." />
+ <title>Notes on the locale implementation.</title>
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
<h1>
Notes on the locale implementation.
</h1>
-<I>
-prepared by Benjamin Kosnik (bkoz@redhat.com) on August 8, 2001
-</I>
+<em>
+prepared by Benjamin Kosnik (bkoz@redhat.com) on October 14, 2002
+</em>
-<p>
<h2>
-1. Abstract Describes the basic locale object, including nested
-classes id, facet, and the reference-counted implementation object,
-class _Impl.
+1. Abstract
</h2>
<p>
+Describes the basic locale object, including nested
+classes id, facet, and the reference-counted implementation object,
+class _Impl.
</p>
-<p>
<h2>
2. What the standard says
-See Chapter 22 of the standard.
</h2>
+Class locale is non-templatized and has two distinct types nested
+inside of it:
+<blockquote>
+<em>
+class facet
+22.1.1.1.2 Class locale::facet
+</em>
+</blockquote>
<p>
-<h2>
-3. Problems with &quot;C&quot; locales : global locales, termination.
-</h2>
+Facets actually implement locale functionality. For instance, a facet
+called numpunct is the data objects that can be used to query for the
+thousands separator is in the German locale.
+</p>
+
+Literally, a facet is strictly defined:
+<ul>
+ <li>containing the following public data member:
+ <p>
+ <code>static locale::id id;</code>
+ </p>
+ </li>
+
+ <li>derived from another facet:
+ <p>
+ <code> class gnu_codecvt: public std::ctype&lt;user-defined-type&gt;</code>
+ </p>
+ </li>
+</ul>
<p>
-The major problem is fitting an object-orientated and non-global locale
-design ontop of POSIX and other relevant stanards, which include the
-Single Unix (nee X/Open.)
+Of interest in this class are the memory management options explicitly
+specified as an argument to facet's constructor. Each constructor of a
+facet class takes a std::size_t __refs argument: if __refs == 0, the
+facet is deleted when the locale containing it is destroyed. If __refs
+== 1, the facet is not destroyed, even when it is no longer
+referenced.
+</p>
-Because POSIX falls down so completely, portibility is an issue.
+<blockquote>
+<em>
+class id
+22.1.1.1.3 - Class locale::id
+</em>
+</blockquote>
+
+<p>
+Provides an index for looking up specific facets.
<p>
+
<h2>
-4. Design
+3. Interacting with &quot;C&quot; locales.
</h2>
-Class locale in non-templatized and has three distinct types nested
-inside of it:
-class facet
-22.1.1.1.2 Class locale::facet
+<p>
+Some help on determining the underlying support for locales on a system.
+Note, this is specific to linux (and glibc-2.3.x)
+</p>
-Facets actually implement locale functionality. For instance, a facet
-called numpunct is the data objects that can be used to query for the
-thousands separator is in the German locale.
+<ul>
+ <li> <code>`locale -a`</code> displays available locales.
+<blockquote>
+<pre>
+af_ZA
+ar_AE
+ar_AE.utf8
+ar_BH
+ar_BH.utf8
+ar_DZ
+ar_DZ.utf8
+ar_EG
+ar_EG.utf8
+ar_IN
+ar_IQ
+ar_IQ.utf8
+ar_JO
+ar_JO.utf8
+ar_KW
+ar_KW.utf8
+ar_LB
+ar_LB.utf8
+ar_LY
+ar_LY.utf8
+ar_MA
+ar_MA.utf8
+ar_OM
+ar_OM.utf8
+ar_QA
+ar_QA.utf8
+ar_SA
+ar_SA.utf8
+ar_SD
+ar_SD.utf8
+ar_SY
+ar_SY.utf8
+ar_TN
+ar_TN.utf8
+ar_YE
+ar_YE.utf8
+be_BY
+be_BY.utf8
+bg_BG
+bg_BG.utf8
+br_FR
+bs_BA
+C
+ca_ES
+ca_ES@euro
+ca_ES.utf8
+ca_ES.utf8@euro
+cs_CZ
+cs_CZ.utf8
+cy_GB
+da_DK
+da_DK.iso885915
+da_DK.utf8
+de_AT
+de_AT@euro
+de_AT.utf8
+de_AT.utf8@euro
+de_BE
+de_BE@euro
+de_BE.utf8
+de_BE.utf8@euro
+de_CH
+de_CH.utf8
+de_DE
+de_DE@euro
+de_DE.utf8
+de_DE.utf8@euro
+de_LU
+de_LU@euro
+de_LU.utf8
+de_LU.utf8@euro
+el_GR
+el_GR.utf8
+en_AU
+en_AU.utf8
+en_BW
+en_BW.utf8
+en_CA
+en_CA.utf8
+en_DK
+en_DK.utf8
+en_GB
+en_GB.iso885915
+en_GB.utf8
+en_HK
+en_HK.utf8
+en_IE
+en_IE@euro
+en_IE.utf8
+en_IE.utf8@euro
+en_IN
+en_NZ
+en_NZ.utf8
+en_PH
+en_PH.utf8
+en_SG
+en_SG.utf8
+en_US
+en_US.iso885915
+en_US.utf8
+en_ZA
+en_ZA.utf8
+en_ZW
+en_ZW.utf8
+es_AR
+es_AR.utf8
+es_BO
+es_BO.utf8
+es_CL
+es_CL.utf8
+es_CO
+es_CO.utf8
+es_CR
+es_CR.utf8
+es_DO
+es_DO.utf8
+es_EC
+es_EC.utf8
+es_ES
+es_ES@euro
+es_ES.utf8
+es_ES.utf8@euro
+es_GT
+es_GT.utf8
+es_HN
+es_HN.utf8
+es_MX
+es_MX.utf8
+es_NI
+es_NI.utf8
+es_PA
+es_PA.utf8
+es_PE
+es_PE.utf8
+es_PR
+es_PR.utf8
+es_PY
+es_PY.utf8
+es_SV
+es_SV.utf8
+es_US
+es_US.utf8
+es_UY
+es_UY.utf8
+es_VE
+es_VE.utf8
+et_EE
+et_EE.utf8
+eu_ES
+eu_ES@euro
+eu_ES.utf8
+eu_ES.utf8@euro
+fa_IR
+fi_FI
+fi_FI@euro
+fi_FI.utf8
+fi_FI.utf8@euro
+fo_FO
+fo_FO.utf8
+fr_BE
+fr_BE@euro
+fr_BE.utf8
+fr_BE.utf8@euro
+fr_CA
+fr_CA.utf8
+fr_CH
+fr_CH.utf8
+fr_FR
+fr_FR@euro
+fr_FR.utf8
+fr_FR.utf8@euro
+fr_LU
+fr_LU@euro
+fr_LU.utf8
+fr_LU.utf8@euro
+ga_IE
+ga_IE@euro
+ga_IE.utf8
+ga_IE.utf8@euro
+gl_ES
+gl_ES@euro
+gl_ES.utf8
+gl_ES.utf8@euro
+gv_GB
+gv_GB.utf8
+he_IL
+he_IL.utf8
+hi_IN
+hr_HR
+hr_HR.utf8
+hu_HU
+hu_HU.utf8
+id_ID
+id_ID.utf8
+is_IS
+is_IS.utf8
+it_CH
+it_CH.utf8
+it_IT
+it_IT@euro
+it_IT.utf8
+it_IT.utf8@euro
+iw_IL
+iw_IL.utf8
+ja_JP.eucjp
+ja_JP.utf8
+ka_GE
+kl_GL
+kl_GL.utf8
+ko_KR.euckr
+ko_KR.utf8
+kw_GB
+kw_GB.utf8
+lt_LT
+lt_LT.utf8
+lv_LV
+lv_LV.utf8
+mi_NZ
+mk_MK
+mk_MK.utf8
+mr_IN
+ms_MY
+ms_MY.utf8
+mt_MT
+mt_MT.utf8
+nl_BE
+nl_BE@euro
+nl_BE.utf8
+nl_BE.utf8@euro
+nl_NL
+nl_NL@euro
+nl_NL.utf8
+nl_NL.utf8@euro
+nn_NO
+nn_NO.utf8
+no_NO
+no_NO.utf8
+oc_FR
+pl_PL
+pl_PL.utf8
+POSIX
+pt_BR
+pt_BR.utf8
+pt_PT
+pt_PT@euro
+pt_PT.utf8
+pt_PT.utf8@euro
+ro_RO
+ro_RO.utf8
+ru_RU
+ru_RU.koi8r
+ru_RU.utf8
+ru_UA
+ru_UA.utf8
+se_NO
+sk_SK
+sk_SK.utf8
+sl_SI
+sl_SI.utf8
+sq_AL
+sq_AL.utf8
+sr_YU
+sr_YU@cyrillic
+sr_YU.utf8
+sr_YU.utf8@cyrillic
+sv_FI
+sv_FI@euro
+sv_FI.utf8
+sv_FI.utf8@euro
+sv_SE
+sv_SE.iso885915
+sv_SE.utf8
+ta_IN
+te_IN
+tg_TJ
+th_TH
+th_TH.utf8
+tl_PH
+tr_TR
+tr_TR.utf8
+uk_UA
+uk_UA.utf8
+ur_PK
+uz_UZ
+vi_VN
+vi_VN.tcvn
+wa_BE
+wa_BE@euro
+yi_US
+zh_CN
+zh_CN.gb18030
+zh_CN.gbk
+zh_CN.utf8
+zh_HK
+zh_HK.utf8
+zh_TW
+zh_TW.euctw
+zh_TW.utf8
+</pre>
+</blockquote>
+</li>
+
+ <li> <code>`locale`</code> displays environmental variables
+ that impact how locale("") will be deduced.
-Literally, a facet is strictly defined:
- - containing
-public:
- static locale::id id;
+<blockquote>
+<pre>
+LANG=en_US
+LC_CTYPE="en_US"
+LC_NUMERIC="en_US"
+LC_TIME="en_US"
+LC_COLLATE="en_US"
+LC_MONETARY="en_US"
+LC_MESSAGES="en_US"
+LC_PAPER="en_US"
+LC_NAME="en_US"
+LC_ADDRESS="en_US"
+LC_TELEPHONE="en_US"
+LC_MEASUREMENT="en_US"
+LC_IDENTIFICATION="en_US"
+LC_ALL=
+</pre>
+</blockquote>
+</li>
+</ul>
-- or derived from another facet
+<p>
+From Josuttis, p. 697-698, which says, that "there is only *one*
+relation (of the C++ locale mechanism) to the C locale mechanism: the
+global C locale is modified if a named C++ locale object is set as the
+global locale" (emphasis Paolo), that is:
+</p>
+ <code>std::locale::global(std::locale(""));</code>
-The only other thing of interest in this class is the memory
-management of facets. Each constructor of a facet class takes a
-std::size_t __refs argument: if __refs == 0, the facet is deleted when
-no longer used. if __refs == 1, the facet is not destroyed, even when
-it is no longer reference.
+<p>affects the C functions as if the following call was made:</p>
+ <code>std::setlocale(LC_ALL, "");</code>
-class id
-Provides an index for looking up specific facets.
+<p>
+On the other hand, there is *no* viceversa, that is, calling setlocale
+has *no* whatsoever on the C++ locale mechanism, in particular on the
+working of locale(""), which constructs the locale object from the
+environment of the running program, that is, in practice, the set of
+LC_ALL, LANG, etc. variable of the shell.
+</p>
-class _Impl
+
+<h2>
+4. Design
+</h2>
+
+
+<p>
+The major design challenge is fitting an object-orientated and
+non-global locale design ontop of POSIX and other relevant stanards,
+which include the Single Unix (nee X/Open.)
+</p>
<p>
+Because POSIX falls down so completely, portibility is an issue.
+</p>
+
+class _Impl
+The internal representation of the std::locale object.
+
+
<h2>
5. Examples
</h2>
-<pre>
- typedef __locale_t locale;
-</pre>
-
More information can be found in the following testcases:
<ul>
-<li> testsuite/22_locale/ctype_char_members.cc
-<li> testsuite/22_locale/ctype_wchar_t_members.cc
+<li> testsuite/22_locale/all </li>
</ul>
-<p>
<h2>
6. Unresolved Issues
</h2>
<ul>
- <li> locale -a displays available locales on linux
-
- <li> locale initialization: at what point does _S_classic,
- _S_global get initialized? Can named locales assume this
- initialization has already taken place?
-
- <li> document how named locales error check when filling data
- members. Ie, a fr_FR locale that doesn't have
- numpunct::truename(): does it use "true"? Or is it a blank
- string? What's the convention?
-
- <li> explain how locale aliasing happens. When does "de_DE"
- use "de" information? What is the rule for locales composed of
- just an ISO language code (say, "de") and locales with both an
- ISO language code and ISO country code (say, "de_DE").
-
- <li> what should non-required facet instantiations do? If the
- generic implemenation is provided, then how to end-users
- provide specializations?
+ <li> locale initialization: at what point does _S_classic,
+ _S_global get initialized? Can named locales assume this
+ initialization has already taken place? </li>
+
+ <li> document how named locales error check when filling data
+ members. Ie, a fr_FR locale that doesn't have
+ numpunct::truename(): does it use "true"? Or is it a blank
+ string? What's the convention? </li>
+
+ <li> explain how locale aliasing happens. When does "de_DE"
+ use "de" information? What is the rule for locales composed of
+ just an ISO language code (say, "de") and locales with both an
+ ISO language code and ISO country code (say, "de_DE"). </li>
+
+ <li> what should non-required facet instantiations do? If the
+ generic implemenation is provided, then how to end-users
+ provide specializations? </li>
</ul>
-<p>
<h2>
7. Acknowledgments
</h2>
-<p>
<h2>
8. Bibliography / Referenced Documents
</h2>
@@ -130,20 +507,31 @@ Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters &quot;6. C
<p>
Drepper, Ulrich, Numerous, late-night email correspondence
+</p>
<p>
ISO/IEC 14882:1998 Programming languages - C++
+</p>
<p>
ISO/IEC 9899:1999 Programming languages - C
+</p>
<p>
Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000
+</p>
<p>
Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000
+</p>
<p>
System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x)
The Open Group/The Institute of Electrical and Electronics Engineers, Inc.
http://www.opennc.org/austin/docreg.html
+</p>
+
+</body>
+</html>
+
+
diff --git a/libstdc++-v3/docs/html/22_locale/messages.html b/libstdc++-v3/docs/html/22_locale/messages.html
index 39ee9cfbee7..68d387612ff 100644
--- a/libstdc++-v3/docs/html/22_locale/messages.html
+++ b/libstdc++-v3/docs/html/22_locale/messages.html
@@ -1,19 +1,24 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <title>
- Notes on the messages implementation.
- </title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="bkoz@redhat.com (Benjamin Kosnik)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="Notes on the messages implementation." />
+ <title>Notes on the messages implementation.</title>
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
<h1>
Notes on the messages implementation.
</h1>
-<I>
+<em>
prepared by Benjamin Kosnik (bkoz@redhat.com) on August 8, 2001
-</I>
+</em>
-<p>
<h2>
1. Abstract
</h2>
@@ -23,7 +28,6 @@ equivalent to Java's java.text.MessageFormat .using either GNU gettext
or IEEE 1003.1-200 functions.
</p>
-<p>
<h2>
2. What the standard says
</h2>
@@ -34,9 +38,9 @@ locale to the other. For instance, converting the "C" locale's
<code>const char* c = "please"</code> to a German-localized <code>"bitte"</code>
during program execution.
-<BLOCKQUOTE>
+<blockquote>
22.2.7.1 - Template class messages [lib.locale.messages]
-</BLOCKQUOTE>
+</blockquote>
This class has three public member functions, which directly
correspond to three protected virtual member functions.
@@ -45,51 +49,57 @@ The public member functions are:
<p>
<code>catalog open(const string&amp;, const locale&amp;) const</code>
+</p>
<p>
<code>string_type get(catalog, int, int, const string_type&amp;) const</code>
+</p>
<p>
<code>void close(catalog) const</code>
+</p>
<p>
While the virtual functions are:
+</p>
<p>
<code>catalog do_open(const string&amp;, const locale&amp;) const</code>
-<BLOCKQUOTE>
-<I>
+</p>
+<blockquote>
+<em>
-1- Returns: A value that may be passed to get() to retrieve a
message, from the message catalog identified by the string name
according to an implementation-defined mapping. The result can be used
until it is passed to close(). Returns a value less than 0 if no such
catalog can be opened.
-</I>
-</BLOCKQUOTE>
+</em>
+</blockquote>
<p>
<code>string_type do_get(catalog, int, int, const string_type&amp;) const</code>
-<BLOCKQUOTE>
-<I>
+</p>
+<blockquote>
+<em>
-3- Requires: A catalog cat obtained from open() and not yet closed.
-4- Returns: A message identified by arguments set, msgid, and dfault,
according to an implementation-defined mapping. If no such message can
be found, returns dfault.
-</I>
-</BLOCKQUOTE>
+</em>
+</blockquote>
<p>
<code>void do_close(catalog) const</code>
-<BLOCKQUOTE>
-<I>
+</p>
+<blockquote>
+<em>
-5- Requires: A catalog cat obtained from open() and not yet closed.
-6- Effects: Releases unspecified resources associated with cat.
-7- Notes: The limit on such resources, if any, is implementation-defined.
-</I>
-</BLOCKQUOTE>
+</em>
+</blockquote>
-<p>
<h2>
3. Problems with &quot;C&quot; messages: thread safety,
over-specification, and assumptions.
@@ -101,12 +111,14 @@ First, why is <code>messages_base::catalog</code> specified as a typedef
to int? This makes sense for implementations that use
<code>catopen</code>, but not for others. Fortunately, it's not heavily
used and so only a minor irritant.
+</p>
<p>
Second, by making the member functions <code>const</code>, it is
impossible to save state in them. Thus, storing away information used
in the 'open' member function for use in 'get' is impossible. This is
unfortunate.
+</p>
<p>
The 'open' member function in particular seems to be oddly
@@ -118,20 +130,22 @@ argument useful? What was the intent? It might make sense if a locale
argument was associated with a given default message string in the
'open' member function, for instance. Quite murky and unclear, on
reflection.
+</p>
<p>
Lastly, it seems odd that messages, which explicitly require code
conversion, don't use the codecvt facet. Because the messages facet
has only one template parameter, it is assumed that ctype, and not
codecvt, is to be used to convert between character sets.
+</p>
<p>
It is implicitly assumed that the locale for the default message
string in 'get' is in the "C" locale. Thus, all source code is assumed
to be written in English, so translations are always from "en_US" to
other, explicitly named locales.
+</p>
-<p>
<h2>
4. Design and Implementation Details
</h2>
@@ -145,35 +159,39 @@ dependent on the capabilities of the underlying operating system.
<p>
Three different mechanisms have been provided, selectable via
configure flags:
+</p>
<ul>
- <li> generic
- <p>
- This model does very little, and is what is used by default.
- </p>
-
- <li> gnu
- <p>
- The gnu model is complete and fully tested. It's based on the
- GNU gettext package, which is part of glibc. It uses the functions
- <code>textdomain, bindtextdomain, gettext</code>
- to implement full functionality. Creating message
- catalogs is a relatively straight-forward process and is
- lightly documented below, and fully documented in gettext's
- distributed documentation.
- </p>
-
- <li> ieee_1003.1-200x
- <p>
- This is a complete, though untested, implementation based on
- the IEEE standard. The functions
- <code>catopen, catgets, catclose</code>
- are used to retrieve locale-specific messages given the
- appropriate message catalogs that have been constructed for
- their use. Note, the script <code> po2msg.sed</code> that is part
- of the gettext distribution can convert gettext catalogs into
- catalogs that <code>catopen</code> can use.
- </p>
+ <li> generic
+ <p>
+ This model does very little, and is what is used by default.
+ </p>
+ </li>
+
+ <li> gnu
+ <p>
+ The gnu model is complete and fully tested. It's based on the
+ GNU gettext package, which is part of glibc. It uses the functions
+ <code>textdomain, bindtextdomain, gettext</code>
+ to implement full functionality. Creating message
+ catalogs is a relatively straight-forward process and is
+ lightly documented below, and fully documented in gettext's
+ distributed documentation.
+ </p>
+ </li>
+
+ <li> ieee_1003.1-200x
+ <p>
+ This is a complete, though untested, implementation based on
+ the IEEE standard. The functions
+ <code>catopen, catgets, catclose</code>
+ are used to retrieve locale-specific messages given the
+ appropriate message catalogs that have been constructed for
+ their use. Note, the script <code> po2msg.sed</code> that is part
+ of the gettext distribution can convert gettext catalogs into
+ catalogs that <code>catopen</code> can use.
+ </p>
+ </li>
</ul>
<p>
@@ -181,9 +199,11 @@ A new, standards-conformant non-virtual member function signature was
added for 'open' so that a directory could be specified with a given
message catalog. This simplifies calling conventions for the gnu
model.
+</p>
<p>
The rest of this document discusses details of the GNU model.
+</p>
<p>
The messages facet, because it is retrieving and converting between
@@ -193,67 +213,79 @@ necessary for more than just the <code>LC_MESSAGES</code> mask:
<code>LC_CTYPE</code> is also necessary. To avoid any unpleasantness, all
bits of the "C" mask (ie <code>LC_ALL</code>) are set before retrieving
messages.
+</p>
<p>
Making the message catalogs can be initially tricky, but become quite
simple with practice. For complete info, see the gettext
documentation. Here's an idea of what is required:
+</p>
<ul>
- <LI > Make a source file with the required string literals
- that need to be translated. See
- <code>intl/string_literals.cc</code> for an example.
-
- <p>
- <li> Make initial catalog (see "4 Making the PO Template File"
- from the gettext docs).
- <p>
- <code> xgettext --c++ --debug string_literals.cc -o libstdc++.pot </code>
-
- <p>
- <li> Make language and country-specific locale catalogs.
- <p>
- <code>cp libstdc++.pot fr_FR.po</code>
- <p>
- <code>cp libstdc++.pot de_DE.po</code>
-
- <p>
- <li> Edit localized catalogs in emacs so that strings are
- translated.
- <p>
- <code>emacs fr_FR.po</code>
-
- <p>
- <li> Make the binary mo files.
- <p>
- <code>msgfmt fr_FR.po -o fr_FR.mo</code>
- <p>
- <code>msgfmt de_DE.po -o de_DE.mo</code>
-
- <p>
- <li> Copy the binary files into the correct directory structure.
- <p>
- <code>cp fr_FR.mo (dir)/fr_FR/LC_MESSAGES/libstdc++-v3.mo</code>
- <p>
- <code>cp de_DE.mo (dir)/de_DE/LC_MESSAGES/libstdc++-v3.mo</code>
-
- <p>
- <li> Use the new message catalogs.
- <p>
- <code>locale loc_de("de_DE");</code>
- <p>
- <code>
- use_facet&lt;messages&lt;char&gt; &gt;(loc_de).open("libstdc++", locale(), dir);
- </code>
+ <li> Make a source file with the required string literals
+ that need to be translated. See
+ <code>intl/string_literals.cc</code> for an example.
+ </li>
+
+ <li> Make initial catalog (see "4 Making the PO Template File"
+ from the gettext docs).
+ <p>
+ <code> xgettext --c++ --debug string_literals.cc -o libstdc++.pot </code>
+ </p>
+ </li>
+
+ <li> Make language and country-specific locale catalogs.
+ <p>
+ <code>cp libstdc++.pot fr_FR.po</code>
+ </p>
+ <p>
+ <code>cp libstdc++.pot de_DE.po</code>
+ </p>
+ </li>
+
+ <li> Edit localized catalogs in emacs so that strings are
+ translated.
+ <p>
+ <code>emacs fr_FR.po</code>
+ </p>
+ </li>
+
+ <li> Make the binary mo files.
+ <p>
+ <code>msgfmt fr_FR.po -o fr_FR.mo</code>
+ </p>
+ <p>
+ <code>msgfmt de_DE.po -o de_DE.mo</code>
+ </p>
+ </li>
+
+ <li> Copy the binary files into the correct directory structure.
+ <p>
+ <code>cp fr_FR.mo (dir)/fr_FR/LC_MESSAGES/libstdc++-v3.mo</code>
+ </p>
+ <p>
+ <code>cp de_DE.mo (dir)/de_DE/LC_MESSAGES/libstdc++-v3.mo</code>
+ </p>
+ </li>
+
+ <li> Use the new message catalogs.
+ <p>
+ <code>locale loc_de("de_DE");</code>
+ </p>
+ <p>
+ <code>
+ use_facet&lt;messages&lt;char&gt; &gt;(loc_de).open("libstdc++", locale(), dir);
+ </code>
+ </p>
+ </li>
</ul>
-<p>
<h2>
5. Examples
</h2>
<ul>
- <li> message converting, simple example using the GNU model.
+ <li> message converting, simple example using the GNU model.
<pre>
#include &lt;iostream&gt;
@@ -276,82 +308,87 @@ void test01()
mssg_de.close(cat_de);
}
</pre>
+ </li>
</ul>
More information can be found in the following testcases:
<ul>
-<li> testsuite/22_locale/messages.cc
-<li> testsuite/22_locale/messages_byname.cc
-<li> testsuite/22_locale/messages_char_members.cc
+<li> testsuite/22_locale/messages.cc </li>
+<li> testsuite/22_locale/messages_byname.cc </li>
+<li> testsuite/22_locale/messages_char_members.cc </li>
</ul>
-<p>
<h2>
6. Unresolved Issues
</h2>
<ul>
-<li> Things that are sketchy, or remain unimplemented:
- <ul>
- <li>_M_convert_from_char, _M_convert_to_char are in
- flux, depending on how the library ends up doing
- character set conversions. It might not be possible to
- do a real character set based conversion, due to the
- fact that the template parameter for messages is not
- enough to instantiate the codecvt facet (1 supplied,
- need at least 2 but would prefer 3).
-
- <li> There are issues with gettext needing the global
- locale set to extract a message. This dependence on
- the global locale makes the current "gnu" model non
- MT-safe. Future versions of glibc, ie glibc 2.3.x will
- fix this, and the C++ library bits are already in
- place.
- </ul>
-
-<p>
-<li> Development versions of the GNU "C" library, glibc 2.3 will allow
- a more efficient, MT implementation of std::messages, and will
- allow the removal of the _M_name_messages data member. If this
- is done, it will change the library ABI. The C++ parts to
- support glibc 2.3 have already been coded, but are not in use:
- once this version of the "C" library is released, the marked
- parts of the messages implementation can be switched over to
- the new "C" library functionality.
-<p>
+<li> Things that are sketchy, or remain unimplemented:
+ <ul>
+ <li>_M_convert_from_char, _M_convert_to_char are in
+ flux, depending on how the library ends up doing
+ character set conversions. It might not be possible to
+ do a real character set based conversion, due to the
+ fact that the template parameter for messages is not
+ enough to instantiate the codecvt facet (1 supplied,
+ need at least 2 but would prefer 3).
+ </li>
+
+ <li> There are issues with gettext needing the global
+ locale set to extract a message. This dependence on
+ the global locale makes the current "gnu" model non
+ MT-safe. Future versions of glibc, ie glibc 2.3.x will
+ fix this, and the C++ library bits are already in
+ place.
+ </li>
+ </ul>
+</li>
+
+<li> Development versions of the GNU "C" library, glibc 2.3 will allow
+ a more efficient, MT implementation of std::messages, and will
+ allow the removal of the _M_name_messages data member. If this
+ is done, it will change the library ABI. The C++ parts to
+ support glibc 2.3 have already been coded, but are not in use:
+ once this version of the "C" library is released, the marked
+ parts of the messages implementation can be switched over to
+ the new "C" library functionality.
+</li>
<li> At some point in the near future, std::numpunct will probably use
- std::messages facilities to implement truename/falename
- correctly. This is currently not done, but entries in
- libstdc++.pot have already been made for "true" and "false"
- string literals, so all that remains is the std::numpunct
- coding and the configure/make hassles to make the installed
- library search its own catalog. Currently the libstdc++.mo
- catalog is only searched for the testsuite cases involving
- messages members.
-
-<p>
-<li> The following member functions:
-
- <p>
- <code>
+ std::messages facilities to implement truename/falename
+ correctly. This is currently not done, but entries in
+ libstdc++.pot have already been made for "true" and "false"
+ string literals, so all that remains is the std::numpunct
+ coding and the configure/make hassles to make the installed
+ library search its own catalog. Currently the libstdc++.mo
+ catalog is only searched for the testsuite cases involving
+ messages members.
+</li>
+
+<li> The following member functions:
+
+ <p>
+ <code>
catalog
open(const basic_string&lt;char&gt;&amp; __s, const locale&amp; __loc) const
- </code>
-
- <p>
- <code>
- catalog
- open(const basic_string&lt;char&gt;&amp;, const locale&amp;, const char*) const;
- </code>
-
- <p>
- Don't actually return a "value less than 0 if no such catalog
- can be opened" as required by the standard in the "gnu"
- model. As of this writing, it is unknown how to query to see
- if a specified message catalog exists using the gettext
- package.
+ </code>
+ </p>
+
+ <p>
+ <code>
+ catalog
+ open(const basic_string&lt;char&gt;&amp;, const locale&amp;, const char*) const;
+ </code>
+ </p>
+
+ <p>
+ Don't actually return a "value less than 0 if no such catalog
+ can be opened" as required by the standard in the "gnu"
+ model. As of this writing, it is unknown how to query to see
+ if a specified message catalog exists using the gettext
+ package.
+ </p>
+</li>
</ul>
-<p>
<h2>
7. Acknowledgments
</h2>
@@ -359,7 +396,6 @@ Ulrich Drepper for the character set explanations, gettext details,
and patient answering of late-night questions, Tom Tromey for the java details.
-<p>
<h2>
8. Bibliography / Referenced Documents
</h2>
@@ -371,36 +407,49 @@ Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters
Drepper, Ulrich, Thread-Aware Locale Model, A proposal. This is a
draft document describing the design of glibc 2.3 MT locale
functionality.
+</p>
<p>
Drepper, Ulrich, Numerous, late-night email correspondence
+</p>
<p>
ISO/IEC 9899:1999 Programming languages - C
+</p>
<p>
ISO/IEC 14882:1998 Programming languages - C++
+</p>
<p>
Java 2 Platform, Standard Edition, v 1.3.1 API Specification. In
particular, java.util.Properties, java.text.MessageFormat,
java.util.Locale, java.util.ResourceBundle.
http://java.sun.com/j2se/1.3/docs/api
+</p>
<p>
System Interface Definitions, Issue 7 (IEEE Std. 1003.1-200x)
The Open Group/The Institute of Electrical and Electronics Engineers, Inc.
In particular see lines 5268-5427.
http://www.opennc.org/austin/docreg.html
+</p>
<p> GNU gettext tools, version 0.10.38, Native Language Support
Library and Tools.
http://sources.redhat.com/gettext
+</p>
<p>
Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales,
Advanced Programmer's Guide and Reference, Addison Wesley Longman,
Inc. 2000. See page 725, Internationalized Messages.
+</p>
<p>
Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000
+</p>
+
+</body>
+</html>
+
diff --git a/libstdc++-v3/docs/html/23_containers/howto.html b/libstdc++-v3/docs/html/23_containers/howto.html
index a64d79c75ae..008017a8827 100644
--- a/libstdc++-v3/docs/html/23_containers/howto.html
+++ b/libstdc++-v3/docs/html/23_containers/howto.html
@@ -1,13 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 23.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 23." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 23</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -18,19 +21,19 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Making code unaware of the container/array difference</a>
- <li><a href="#2">Variable-sized bitmasks</a>
- <li><a href="#3">Containers and multithreading</a>
- <li><a href="#4">&quot;Hinting&quot; during insertion</a>
- <li><a href="#5">Bitmasks and string arguments</a>
- <li><a href="#6"><code>std::list::size()</code> is O(n)!</a>
- <li><a href="#7">Space overhead management for vectors</a>
+ <li><a href="#1">Making code unaware of the container/array difference</a></li>
+ <li><a href="#2">Variable-sized bitmasks</a></li>
+ <li><a href="#3">Containers and multithreading</a></li>
+ <li><a href="#4">&quot;Hinting&quot; during insertion</a></li>
+ <li><a href="#5">Bitmasks and string arguments</a></li>
+ <li><a href="#6"><code>std::list::size()</code> is O(n)!</a></li>
+ <li><a href="#7">Space overhead management for vectors</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -65,9 +68,10 @@
code size or execution time.
</p>
<p>The result is that if all your algorithm calls look like
- <pre>
+ </p>
+ <pre>
std::transform(beginof(foo), endof(foo), beginof(foo), SomeFunction);</pre>
- then the type of foo can change from an array of ints to a vector
+ <p>then the type of foo can change from an array of ints to a vector
of ints to a deque of ints and back again, without ever changing any
client code.
</p>
@@ -86,19 +90,21 @@
give the extra three lines and avoid confusion.
</p>
<p>Second, the line
- <pre>
+ </p>
+ <pre>
inline unsigned int lengthof (T (&amp;)[sz]) { return sz; } </pre>
- looks just weird! Hint: unused parameters can be left nameless.
+ <p>looks just weird! Hint: unused parameters can be left nameless.
</p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">Variable-sized bitmasks</a></h2>
<p>No, you cannot write code of the form
+ </p>
<!-- Careful, the leading spaces in PRE show up directly. -->
- <pre>
+ <pre>
#include &lt;bitset&gt;
void foo (size_t n)
@@ -106,19 +112,19 @@
std::bitset&lt;n&gt; bits;
....
} </pre>
- because <code>n</code> must be known at compile time. Your compiler is
+ <p>because <code>n</code> must be known at compile time. Your compiler is
correct; it is not a bug. That's the way templates work. (Yes, it
<em>is</em> a feature.)
</p>
<p>There are a couple of ways to handle this kind of thing. Please
consider all of them before passing judgement. They include, in
no particular order:
+ </p>
<ul>
- <li>A very large N in <code>bitset&lt;N&gt;</code>.
- <li>A container&lt;bool&gt;.
- <li>Extremely weird solutions.
+ <li>A very large N in <code>bitset&lt;N&gt;</code>.</li>
+ <li>A container&lt;bool&gt;.</li>
+ <li>Extremely weird solutions.</li>
</ul>
- </p>
<p><strong>A very large N in
<code>bitset&lt;N&gt;</code>.&nbsp;&nbsp;</strong> It has
been pointed out a few times in newsgroups that N bits only takes up
@@ -192,7 +198,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Containers and multithreading</a></h2>
<p>This section discusses issues surrounding the design of
multithreaded applications which use Standard C++ containers.
@@ -204,14 +210,14 @@
multithreading as it relates to libstdc++, including details on
the proper compilation of threaded code (and compatibility between
threaded and non-threaded code), see Chapter 17.
- </p>
+ </p>
<p>Two excellent pages to read when working with the Standard C++
containers and threads are
<a href="http://www.sgi.com/tech/stl/thread_safety.html">SGI's
http://www.sgi.com/tech/stl/thread_safety.html</a> and
<a href="http://www.sgi.com/tech/stl/Allocators.html">SGI's
http://www.sgi.com/tech/stl/Allocators.html</a>.
- </p>
+ </p>
<p><em>However, please ignore all discussions about the user-level
configuration of the lock implementation inside the STL
container-memory allocator on those pages. For the sake of this
@@ -223,7 +229,7 @@
STL. This is no longer required for any port and should no
longer be done unless you really know what you are doing and
assume all responsibility.</em>
- </p>
+ </p>
<p>Since the container implementation of libstdc++-v3 uses the SGI
code, we use the same definition of thread safety as SGI when
discussing design. A key point that beginners may miss is the
@@ -235,7 +241,7 @@
element is constructed uses an internal lock obtained and
released solely within libstdc++-v3 code (in fact, this is the
reason STL requires any knowledge of the thread configuration).
- </p>
+ </p>
<p>For implementing a container which does its own locking, it is
trivial to provide a wrapper class which obtains the lock (as
SGI suggests), performs the container operation, and then
@@ -245,40 +251,11 @@
solution would probably be more trouble than it's worth.
</p>
<p>The STL implementation is currently configured to use the
- high-speed caching memory allocator. If you absolutely think
- you must change this on a global basis for your platform to better
- support multi-threading, then please consult all commentary in
- include/bits/stl_alloc.h and the allocators link below.
- <blockquote>
- <p>(Explicit warning since so many people get confused while
- attempting this:)
- </p>
- <p><strong>Adding -D__USE_MALLOC on the command
- line is almost certainly a bad idea.</strong> Memory efficiency is
- almost guaranteed to suffer as a result; this is
- <a href="http://gcc.gnu.org/ml/libstdc++/2001-05/msg00136.html">why
- we disabled it for 3.0 in the first place</a>.
- </p>
- <p>Related to threading or otherwise, the current recommendation is
- that users not add any macro defines on the command line to remove or
- otherwise disable features of libstdc++-v3. There is
- no condition under which it will help you without causing other
- issues to perhaps raise up (possible linkage/ABI problems). In
- particular, __USE_MALLOC should only be added to a libstdc++-v3
- configuration file, include/bits/c++config (where such user
- action is cautioned against), and the entire library should be
- rebuilt. If you do not, then you might be violating the
- one-definition rule of C/C++ and you might cause yourself untold
- problems.
- </p>
- </blockquote>
- If you find any platform where gcc reports a
- threading model other than single, and where libstdc++-v3 builds
- a buggy container allocator when used with threads unless you
- define __USE_MALLOC, we want to hear about it ASAP. In the
- past, correctness was the main reason people were led to believe
- that they should define __USE_MALLOC when using threads.
- </p>
+ high-speed caching memory allocator. Some people like to
+ test and/or normally run threaded programs with a different
+ default. For all details about how to globally override this
+ at application run-time see <a href="../ext/howto.html#3">here</a>.
+ </p>
<p>There is a better way (not standardized yet): It is possible to
force the malloc-based allocator on a per-case-basis for some
application code. The library team generally believes that this
@@ -290,13 +267,14 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">&quot;Hinting&quot; during insertion</a></h2>
<p>Section [23.1.2], Table 69, of the C++ standard lists this function
for all of the associative containers (map, set, etc):
- <pre>
+ </p>
+ <pre>
a.insert(p,t);</pre>
- where 'p' is an iterator into the container 'a', and 't' is the item
+ <p>where 'p' is an iterator into the container 'a', and 't' is the item
to insert. The standard says that &quot;iterator p is a hint
pointing to where the insert should start to search,&quot; but
specifies nothing more. (LWG Issue #233, currently in review,
@@ -321,23 +299,26 @@
their new meanings in the next paragraph. *grin*
</p>
<p>If the <code>hint</code> parameter ('p' above) is equivalent to:
+ </p>
<ul>
<li><code>begin()</code>, then the item being inserted should have a key
less than all the other keys in the container. The item will
be inserted at the beginning of the container, becoming the new
entry at <code>begin()</code>.
+ </li>
<li><code>end()</code>, then the item being inserted should have a key
greater than all the other keys in the container. The item will
be inserted at the end of the container, becoming the new entry
at <code>end()</code>.
+ </li>
<li>neither <code>begin()</code> nor <code>end()</code>, then: Let <code>h</code>
be the entry in the container pointed to by <code>hint</code>, that
is, <code>h = *hint</code>. Then the item being inserted should have
a key less than that of <code>h</code>, and greater than that of the
item preceding <code>h</code>. The new item will be inserted
between <code>h</code> and <code>h</code>'s predecessor.
+ </li>
</ul>
- </p>
<p>For <code>multimap</code> and <code>multiset</code>, the restrictions are
slightly looser: &quot;greater than&quot; should be replaced by
&quot;not less than&quot; and &quot;less than&quot; should be replaced
@@ -372,7 +353,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="5">Bitmasks and string arguments</a></h2>
<p>Bitmasks do not take char* nor const char* arguments in their
constructors. This is something of an accident, but you can read
@@ -383,6 +364,7 @@
</p>
<p>For now you can simply make a temporary string object using the
constructor expression:
+ </p>
<pre>
std::bitset&lt;5&gt; b ( std::string(&quot;10110&quot;) );
</pre>
@@ -390,17 +372,17 @@
<pre>
std::bitset&lt;5&gt; b ( &quot;10110&quot; ); // invalid
</pre>
- </p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="6"><code>std::list::size()</code> is O(n)!</a></h2>
<p>Yes it is, and that's okay. This is a decision that we preserved when
we imported SGI's STL implementation. The following is quoted from
<a href="http://www.sgi.com/tech/stl/FAQ.html">their FAQ</a>:
- <blockquote>
+ </p>
+ <blockquote>
<p>The size() member function, for list and slist, takes time
proportional to the number of elements in the list. This was a
deliberate tradeoff. The only way to get a constant-time size() for
@@ -419,6 +401,7 @@
is supposed to do something unless there is a good reason not to.
</p>
<p>One implication of linear time size(): you should never write
+ </p>
<pre>
if (L.size() == 0)
...</pre>
@@ -426,15 +409,13 @@
<pre>
if (L.empty())
...</pre>
- </p>
- </blockquote>
- </p>
+ </blockquote>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
-<h2><a name="7">Space overhead management for vectors</h2>
+<hr />
+<h2><a name="7">Space overhead management for vectors</a></h2>
<p>In
<a href="http://gcc.gnu.org/ml/libstdc++/2002-04/msg00105.html">this
message to the list</a>, Daniel Kostecky announced work on an
@@ -457,7 +438,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/24_iterators/howto.html b/libstdc++-v3/docs/html/24_iterators/howto.html
index 90c53df18ac..d8df4420444 100644
--- a/libstdc++-v3/docs/html/24_iterators/howto.html
+++ b/libstdc++-v3/docs/html/24_iterators/howto.html
@@ -1,13 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 24.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 24." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 24</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -19,14 +22,14 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">They ain't pointers!</a>
- <li><a href="#2">It ends <em>where?</em></a>
+ <li><a href="#1">They ain't pointers!</a></li>
+ <li><a href="#2">It ends <em>where?</em></a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -67,41 +70,46 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">It ends <em>where?</em></a></h2>
<p>This starts off sounding complicated, but is actually very easy,
especially towards the end. Trust me.
- </p>
+ </p>
<p>Beginners usually have a little trouble understand the whole
'past-the-end' thing, until they remember their early algebra classes
- (see, they </em>told</em> you that stuff would come in handy!) and
+ (see, they <em>told</em> you that stuff would come in handy!) and
the concept of half-open ranges.
</p>
<p>First, some history, and a reminder of some of the funkier rules in
C and C++ for builtin arrays. The following rules have always been
true for both languages:
- <ol>
- <li>You can point anywhere in the array, <em>or to the first element
- past the end of the array</em>. A pointer that points to one
- past the end of the array is guaranteed to be as unique as a
- pointer to somewhere inside the array, so that you can compare
- such pointers safely.
- <li>You can only dereference a pointer that points into an array.
- If your array pointer points outside the array -- even to just
- one past the end -- and you dereference it, Bad Things happen.
- <li>Strictly speaking, simply pointing anywhere else invokes
- undefined behavior. Most programs won't puke until such a
- pointer is actually dereferenced, but the standards leave that
- up to the platform.
- </ol>
- The reason this past-the-end addressing was allowed is to make it
+ </p>
+ <ol>
+ <li>You can point anywhere in the array, <em>or to the first element
+ past the end of the array</em>. A pointer that points to one
+ past the end of the array is guaranteed to be as unique as a
+ pointer to somewhere inside the array, so that you can compare
+ such pointers safely.
+ </li>
+ <li>You can only dereference a pointer that points into an array.
+ If your array pointer points outside the array -- even to just
+ one past the end -- and you dereference it, Bad Things happen.
+ </li>
+ <li>Strictly speaking, simply pointing anywhere else invokes
+ undefined behavior. Most programs won't puke until such a
+ pointer is actually dereferenced, but the standards leave that
+ up to the platform.
+ </li>
+ </ol>
+ <p>The reason this past-the-end addressing was allowed is to make it
easy to write a loop to go over an entire array, e.g.,
while (*d++ = *s++);.
</p>
<p>So, when you think of two pointers delimiting an array, don't think
of them as indexing 0 through n-1. Think of them as <em>boundary
markers</em>:
- <pre>
+ </p>
+ <pre>
beginning end
| |
@@ -121,8 +129,8 @@
| | dereference 'end'.
beginning end
- </pre>
- See? Everything between the boundary markers is part of the array.
+ </pre>
+ <p>See? Everything between the boundary markers is part of the array.
Simple.
</p>
<p>Now think back to your junior-high school algebra course, when you
@@ -171,7 +179,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/25_algorithms/howto.html b/libstdc++-v3/docs/html/25_algorithms/howto.html
index 8cdfe94a471..19c362454c1 100644
--- a/libstdc++-v3/docs/html/25_algorithms/howto.html
+++ b/libstdc++-v3/docs/html/25_algorithms/howto.html
@@ -1,13 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 25.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 25." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 25</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -19,14 +22,14 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Prerequisites</a>
- <li><a href="#2">Special <code>swap</code>s</a>
+ <li><a href="#1">Prerequisites</a></li>
+ <li><a href="#2">Special <code>swap</code>s</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -34,16 +37,18 @@
<p>The neatest accomplishment of the algorithms chapter is that all the
work is done via iterators, not containers directly. This means two
important things:
- <ol>
- <li>Anything that behaves like an iterator can be used in one of
- these algorithms. Raw pointers make great candidates, thus
- built-in arrays are fine containers, as well as your own iterators.
- <li>The algorithms do not (and cannot) affect the container as a
- whole; only the things between the two iterator endpoints. If
- you pass a range of iterators only enclosing the middle third of
- a container, then anything outside that range is inviolate.
- </ol>
</p>
+ <ol>
+ <li>Anything that behaves like an iterator can be used in one of
+ these algorithms. Raw pointers make great candidates, thus
+ built-in arrays are fine containers, as well as your own iterators.
+ </li>
+ <li>The algorithms do not (and cannot) affect the container as a
+ whole; only the things between the two iterator endpoints. If
+ you pass a range of iterators only enclosing the middle third of
+ a container, then anything outside that range is inviolate.
+ </li>
+ </ol>
<p>Even strings can be fed through the algorithms here, although the
string class has specialized versions of many of these functions (for
example, <code>string::find()</code>). Most of the examples on this
@@ -67,7 +72,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">Special <code>swap</code>s</a></h2>
<p>If you call <code> std::swap(x,y); </code> where x and y are standard
containers, then the call will automatically be replaced by a call to
@@ -90,7 +95,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/26_numerics/howto.html b/libstdc++-v3/docs/html/26_numerics/howto.html
index e15870f57bf..6074e358291 100644
--- a/libstdc++-v3/docs/html/26_numerics/howto.html
+++ b/libstdc++-v3/docs/html/26_numerics/howto.html
@@ -1,13 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 26.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 26." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 26</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -15,29 +18,32 @@
<p>Chapter 26 deals with building block abstractions to aid in
numerical computing:
- <ul>
- <li>Template data structures such as <code>valarray&lt;&gt;</code>
- and <code>complex&lt;&gt;</code>.
- <li>Template numerical functions such as <code>accumulate</code>,
- <code>inner_product</code>, <code>partial_sum</code>, and
- <code>adjacent_difference</code>.
- </ul>
- All of the Standard C math functions are of course included in C++,
+</p>
+<ul>
+ <li>Template data structures such as <code>valarray&lt;&gt;</code>
+ and <code>complex&lt;&gt;</code>.
+ </li>
+ <li>Template numerical functions such as <code>accumulate</code>,
+ <code>inner_product</code>, <code>partial_sum</code>, and
+ <code>adjacent_difference</code>.
+ </li>
+</ul>
+<p>All of the Standard C math functions are of course included in C++,
and overloaded versions for <code>long</code>, <code>float</code>, and
<code>long double</code> have been added for all of them.
</p>
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Complex Number Processing</a>
- <li><a href="#2">Array Processing</a>
- <li><a href="#3">Numerical Functions</a>
- <li><a href="#4">C99</a>
+ <li><a href="#1">Complex Number Processing</a></li>
+ <li><a href="#2">Array Processing</a></li>
+ <li><a href="#3">Numerical Functions</a></li>
+ <li><a href="#4">C99</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -62,7 +68,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">Array Processing</a></h2>
<p>One of the major reasons why FORTRAN can chew through numbers so well
is that it is defined to be free of pointer aliasing, an assumption
@@ -87,22 +93,23 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Numerical Functions</a></h2>
<p>There are four generalized functions in the &lt;numeric&gt; header
that follow the same conventions as those in &lt;algorithm&gt;. Each
of them is overloaded: one signature for common default operations,
and a second for fully general operations. Their names are
self-explanatory to anyone who works with numerics on a regular basis:
- <ul>
- <li><code>accumulate</code>
- <li><code>inner_product</code>
- <li><code>partial_sum</code>
- <li><code>adjacent_difference</code>
- </ul>
</p>
+ <ul>
+ <li><code>accumulate</code></li>
+ <li><code>inner_product</code></li>
+ <li><code>partial_sum</code></li>
+ <li><code>adjacent_difference</code></li>
+ </ul>
<p>Here is a simple example of the two forms of <code>accumulate</code>.
- <pre>
+ </p>
+ <pre>
int ar[50];
int someval = somefunction();
@@ -111,8 +118,8 @@
int sum = std::accumulate(ar,ar+50,0);
int sum_stuff = std::accumulate(ar,ar+50,someval);
int product = std::accumulate(ar,ar+50,1,std::multiplies&lt;int&gt;());
- </pre>
- The first call adds all the members of the array, using zero as an
+ </pre>
+ <p>The first call adds all the members of the array, using zero as an
initial value for <code>sum</code>. The second does the same, but uses
<code>someval</code> as the starting value (thus, <code>sum_stuff == sum +
someval</code>). The final call uses the second of the two signatures,
@@ -125,7 +132,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">C99</a></h2>
<p>In addition to the other topics on this page, we'll note here some
of the C99 features that appear in libstdc++-v3.
@@ -151,7 +158,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/27_io/howto.html b/libstdc++-v3/docs/html/27_io/howto.html
index bf235560dfa..73187d3f1c2 100644
--- a/libstdc++-v3/docs/html/27_io/howto.html
+++ b/libstdc++-v3/docs/html/27_io/howto.html
@@ -1,13 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 27.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 27." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Chapter 27</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -19,20 +22,20 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Copying a file</a>
- <li><a href="#2">The buffering is screwing up my program!</a>
- <li><a href="#3">Binary I/O</a>
- <li><a href="#5">What is this &lt;sstream&gt;/stringstreams thing?</a>
- <li><a href="#6">Deriving a stream buffer</a>
- <li><a href="#7">More on binary I/O</a>
- <li><a href="#8">Pathetic performance? Ditch C.</a>
- <li><a href="#9">Threads and I/O</a>
+ <li><a href="#1">Copying a file</a></li>
+ <li><a href="#2">The buffering is screwing up my program!</a></li>
+ <li><a href="#3">Binary I/O</a></li>
+ <li><a href="#5">What is this &lt;sstream&gt;/stringstreams thing?</a></li>
+ <li><a href="#6">Deriving a stream buffer</a></li>
+ <li><a href="#7">More on binary I/O</a></li>
+ <li><a href="#8">Pathetic performance? Ditch C.</a></li>
+ <li><a href="#9">Threads and I/O</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -40,27 +43,29 @@
<p>So you want to copy a file quickly and easily, and most important,
completely portably. And since this is C++, you have an open
ifstream (call it IN) and an open ofstream (call it OUT):
- <pre>
+ </p>
+ <pre>
#include &lt;fstream&gt;
std::ifstream IN ("input_file");
std::ofstream OUT ("output_file"); </pre>
- </p>
<p>Here's the easiest way to get it completely wrong:
- <pre>
+ </p>
+ <pre>
OUT &lt;&lt; IN;</pre>
- For those of you who don't already know why this doesn't work
+ <p>For those of you who don't already know why this doesn't work
(probably from having done it before), I invite you to quickly
create a simple text file called &quot;input_file&quot; containing
the sentence
+ </p>
<pre>
- The quick brown fox jumped over the lazy dog.</pre>
- surrounded by blank lines. Code it up and try it. The contents
+ The quick brown fox jumped over the lazy dog.</pre>
+ <p>surrounded by blank lines. Code it up and try it. The contents
of &quot;output_file&quot; may surprise you.
</p>
<p>Seriously, go do it. Get surprised, then come back. It's worth it.
</p>
- <hr width="60%">
+ <hr width="60%" />
<p>The thing to remember is that the <code>basic_[io]stream</code> classes
handle formatting, nothing else. In particular, they break up on
whitespace. The actual reading, writing, and storing of data is
@@ -76,9 +81,9 @@
as well as the streams themselves. The pointer is easily retrieved
using the <code>rdbuf()</code> member function. Therefore, the easiest
way to copy the file is:
- <pre>
- OUT &lt;&lt; IN.rdbuf();</pre>
</p>
+ <pre>
+ OUT &lt;&lt; IN.rdbuf();</pre>
<p>So what <em>was</em> happening with OUT&lt;&lt;IN? Undefined
behavior, since that particular &lt;&lt; isn't defined by the Standard.
I have seen instances where it is implemented, but the character
@@ -89,7 +94,7 @@
file then contains a perfect text representation of a hexidecimal
address (quite a big surprise). Others don't compile at all.
</p>
- <p>Also note that none of this is specific to o<B>*f*</B>streams.
+ <p>Also note that none of this is specific to o<b>*f*</b>streams.
The operators shown above are all defined in the parent
basic_ostream class and are therefore available with all possible
descendents.
@@ -98,7 +103,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">The buffering is screwing up my program!</a></h2>
<!--
This is not written very well. I need to redo this section.
@@ -122,35 +127,38 @@
is the effect you want when writing to a screen -- get the text
out as soon as possible, etc -- but the buffering is largely
wasted when doing this to a file:
- <pre>
+ </p>
+ <pre>
output &lt;&lt; &quot;a line of text&quot; &lt;&lt; endl;
output &lt;&lt; some_data_variable &lt;&lt; endl;
output &lt;&lt; &quot;another line of text&quot; &lt;&lt; endl; </pre>
- The proper thing to do in this case to just write the data out
+ <p>The proper thing to do in this case to just write the data out
and let the libraries and the system worry about the buffering.
If you need a newline, just write a newline:
- <pre>
+ </p>
+ <pre>
output &lt;&lt; &quot;a line of text\n&quot;
&lt;&lt; some_data_variable &lt;&lt; '\n'
&lt;&lt; &quot;another line of text\n&quot;; </pre>
- I have also joined the output statements into a single statement.
+ <p>I have also joined the output statements into a single statement.
You could make the code prettier by moving the single newline to
the start of the quoted text on the thing line, for example.
</p>
<p>If you do need to flush the buffer above, you can send an
<code>endl</code> if you also need a newline, or just flush the buffer
yourself:
- <pre>
+ </p>
+ <pre>
output &lt;&lt; ...... &lt;&lt; flush; // can use std::flush manipulator
output.flush(); // or call a member fn </pre>
- </p>
<p>On the other hand, there are times when writing to a file should
be like writing to standard error; no buffering should be done
because the data needs to appear quickly (a prime example is a
log file for security-related information). The way to do this is
just to turn off the buffering <em>before any I/O operations at
all</em> have been done, i.e., as soon as possible after opening:
- <pre>
+ </p>
+ <pre>
std::ofstream os (&quot;/foo/bar/baz&quot;);
std::ifstream is (&quot;/qux/quux/quuux&quot;);
int i;
@@ -160,7 +168,6 @@
...
os &lt;&lt; &quot;this data is written immediately\n&quot;;
is &gt;&gt; i; // and this will probably cause a disk read </pre>
- </p>
<p>Since all aspects of buffering are handled by a streambuf-derived
member, it is necessary to get at that member with <code>rdbuf()</code>.
Then the public version of <code>setbuf</code> can be called. The
@@ -189,7 +196,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Binary I/O</a></h2>
<p>The first and most important thing to remember about binary I/O is
that opening a file with <code>ios::binary</code> is not, repeat
@@ -234,25 +241,28 @@
of <em>formatting</em> functions and classes to perform something
which <em>requires</em> that formatting not be done? There are a
seemingly infinite number of solutions, and a few are listed here:
- <ul>
- <li>&quot;Derive your own fstream-type classes and write your own
- &lt;&lt;/&gt;&gt; operators to do binary I/O on whatever data
- types you're using.&quot; This is a Bad Thing, because while
- the compiler would probably be just fine with it, other humans
- are going to be confused. The overloaded bitshift operators
- have a well-defined meaning (formatting), and this breaks it.
- <li>&quot;Build the file structure in memory, then <code>mmap()</code>
- the file and copy the structure.&quot; Well, this is easy to
- make work, and easy to break, and is pretty equivalent to
- using <code>::read()</code> and <code>::write()</code> directly, and
- makes no use of the iostream library at all...
- <li>&quot;Use streambufs, that's what they're there for.&quot;
- While not trivial for the beginner, this is the best of all
- solutions. The streambuf/filebuf layer is the layer that is
- responsible for actual I/O. If you want to use the C++
- library for binary I/O, this is where you start.
- </ul>
</p>
+ <ul>
+ <li>&quot;Derive your own fstream-type classes and write your own
+ &lt;&lt;/&gt;&gt; operators to do binary I/O on whatever data
+ types you're using.&quot; This is a Bad Thing, because while
+ the compiler would probably be just fine with it, other humans
+ are going to be confused. The overloaded bitshift operators
+ have a well-defined meaning (formatting), and this breaks it.
+ </li>
+ <li>&quot;Build the file structure in memory, then <code>mmap()</code>
+ the file and copy the structure.&quot; Well, this is easy to
+ make work, and easy to break, and is pretty equivalent to
+ using <code>::read()</code> and <code>::write()</code> directly, and
+ makes no use of the iostream library at all...
+ </li>
+ <li>&quot;Use streambufs, that's what they're there for.&quot;
+ While not trivial for the beginner, this is the best of all
+ solutions. The streambuf/filebuf layer is the layer that is
+ responsible for actual I/O. If you want to use the C++
+ library for binary I/O, this is where you start.
+ </li>
+ </ul>
<p>How to go about using streambufs is a bit beyond the scope of this
document (at least for now), but while streambufs go a long way,
they still leave a couple of things up to you, the programmer.
@@ -287,7 +297,7 @@
made are good ones.)
</p>
-<hr>
+<hr />
<h2><a name="5">What is this &lt;sstream&gt;/stringstreams thing?</a></h2>
<p>Stringstreams (defined in the header <code>&lt;sstream&gt;</code>)
are in this author's opinion one of the coolest things since
@@ -311,7 +321,7 @@
<p>This only works if you've written your
<code>&lt;&lt;</code>/<code>&gt;&gt;</code> functions correctly, though,
and correctly means that they take istreams and ostreams as
- parameters, not i<B>f</B>streams and o<B>f</B>streams. If they
+ parameters, not i<b>f</b>streams and o<b>f</b>streams. If they
take the latter, then your I/O operators will work fine with
file streams, but with nothing else -- including stringstreams.
</p>
@@ -324,7 +334,7 @@
support them, and 2) if you use them, people will laugh at you.
</p>
-<hr>
+<hr />
<h2><a name="6">Deriving a stream buffer</a></h2>
<p>Creating your own stream buffers for I/O can be remarkably easy.
If you are interested in doing so, we highly recommend two very
@@ -339,7 +349,8 @@
transforms everything sent through it to uppercase. This version
assumes many things about the nature of the character type being
used (for more information, read the books or the newsgroups):
- <pre>
+ </p>
+ <pre>
#include &lt;iostream&gt;
#include &lt;streambuf&gt;
#include &lt;locale&gt;
@@ -377,11 +388,11 @@
return 0;
}
</pre>
- Try it yourself! More examples can be found in 3.1.x code, in
+ <p>Try it yourself! More examples can be found in 3.1.x code, in
<code>include/ext/*_filebuf.h</code>.
</p>
-<hr>
+<hr />
<h2><a name="7">More on binary I/O</a></h2>
<p>Towards the beginning of February 2001, the subject of
&quot;binary&quot; I/O was brought up in a couple of places at the
@@ -406,22 +417,23 @@
a portable binary format.
</p>
-<hr>
+<hr />
<h2><a name="8">Pathetic performance? Ditch C.</a></h2>
<p>It sounds like a flame on C, but it isn't. Really. Calm down.
I'm just saying it to get your attention.
</p>
<p>Because the C++ library includes the C library, both C-style and
C++-style I/O have to work at the same time. For example:
- <pre>
+ </p>
+ <pre>
#include &lt;iostream&gt;
#include &lt;cstdio&gt;
std::cout &lt;&lt; &quot;Hel&quot;;
std::printf (&quot;lo, worl&quot;);
std::cout &lt;&lt; &quot;d!\n&quot;;
- </pre>
- This must do what you think it does.
+ </pre>
+ <p>This must do what you think it does.
</p>
<p>Alert members of the audience will immediately notice that buffering
is going to make a hash of the output unless special steps are taken.
@@ -440,12 +452,12 @@
when both libraries' facilities are in use. If your program only uses
C++ I/O, then there's no need to sync with the C streams. The right
thing to do in this case is to call
- <pre>
+ </p>
+ <pre>
#include <em>any of the I/O headers such as ios, iostream, etc</em>
std::ios::sync_with_stdio(false);
- </pre>
- </p>
+ </pre>
<p>You must do this before performing any I/O via the C++ stream objects.
Once you call this, the C++ streams will operate independently of the
(unused) C streams. For GCC 3.x, this means that <code>cout</code> and
@@ -459,7 +471,7 @@
buffered.
</p>
-<hr>
+<hr />
<h2><a name="9">Threads and I/O</a></h2>
<p>I'll assume that you have already read the
<a href="../17_intro/howto.html#3">general notes on library threads</a>,
@@ -548,7 +560,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/Makefile b/libstdc++-v3/docs/html/Makefile
index 73d20288ca4..efc75bec86f 100644
--- a/libstdc++-v3/docs/html/Makefile
+++ b/libstdc++-v3/docs/html/Makefile
@@ -1,10 +1,28 @@
-PWD=$${PWDCMD-pwd}
+PWD=$${PWDCMD-pwd}
MAKEINFO=makeinfo
INC=../../../gcc/doc/include
-all: faq/index.txt 17_intro/porting.html 17_intro/porting-howto.html
+all: documentation.html \
+ faq/index.txt \
+ 17_intro/porting.html \
+ 17_intro/porting-howto.html
+# chock full of GNUism, probably
+documentation.html: $(wildcard */howto.html)
+ sed -n '1,/beginlist/p' $@ > tmp.top
+ sed -n '/endlist/,$$p' $@ > tmp.bottom
+ echo ' <ul>' > tmp.middle
+ for i in [0-9]*/howto.html; do \
+ title=`grep 'h1 ' $$i |\
+ sed 's=.*\(Chapter [[:digit:]]*\):[[:space:]]*\(.*\)</a>.*=\2 (\1)='` ;\
+ awk -v file=$$i -v "title=$$title" -f makedoc.awk $$i >> tmp.middle ;\
+ done
+ awk -v file=ext/howto.html -v "title=Extensions to the Standard Library"\
+ -f makedoc.awk ext/howto.html >> tmp.middle ;\
+ echo ' </ul>' >> tmp.middle
+ cat tmp.top tmp.middle tmp.bottom > $@
+ rm tmp.top tmp.middle tmp.bottom
faq/index.txt: faq/index.html
lynx -dump $< | sed "s%file://localhost`${PWD}`%..%" > $@
@@ -16,3 +34,4 @@ faq/index.txt: faq/index.html
17_intro/porting-howto.html: 17_intro/porting-howto.xml
xltproc -o $@ /usr/share/xml/docbook/xsl-stylesheets-1.48-2/html/docbook.xsl $<
+# vim:noet ts=4
diff --git a/libstdc++-v3/docs/html/abi.txt b/libstdc++-v3/docs/html/abi.txt
index 216b1597121..73cb46c9c09 100644
--- a/libstdc++-v3/docs/html/abi.txt
+++ b/libstdc++-v3/docs/html/abi.txt
@@ -1,12 +1,5 @@
-===========================
-
-See http://gcc.gnu.org/ml/libstdc++/2002-07/msg00054.html for why this
-document exists, why it's incomplete, and what needs to be done still.
-
-===========================
-
-2002-07-30 Benjamin Kosnik
+2002-10-14 Benjamin Kosnik
Description of the libstdc++ ABI.
@@ -131,7 +124,7 @@ I. What is an ABI? What's covered? What's not?
gcc-3.0.4: 20020220
gcc-3.1.0: 20020514
gcc-3.1.1: 20020725
- gcc-3.2.0: (20020731)
+ gcc-3.2.0: 20020814
- Incremental bumping of a library pre-defined macro,
@@ -152,7 +145,7 @@ I. What is an ABI? What's covered? What's not?
gcc-3.0.4: "3.0.0" (Error, should be "3.0.4")
gcc-3.1.0: "3.1.0"
gcc-3.1.1: "3.1.1"
- gcc-3.2.0: ("3.2.0")
+ gcc-3.2.0: "3.2"
- Matching each specific C++ compiler release to a specific set of
@@ -195,9 +188,17 @@ I. What is an ABI? What's covered? What's not?
gcc-3.1.x tools, will meet the requirements above.
- What configure options impact symbol versioning?
- There is only one: --enable-symvers. For more information see:
+
+ It turns out that most of the configure options that change default
+ behavior will impact the mangled names of exported symbols, and thus
+ impact versioning and compatibility.
+
+ For more information on configure options, including ABI impacts, see:
http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html
+ There is one flag that explicitly deals with symbol versioning:
+ --enable-symvers.
+
In particular, libstdc++-v3/acinclude.m4 has a macro called
GLIBCPP_ENABLE_SYMVERS that defaults to yes (or the argument passed
in via --enable-symvers=foo). At that point, the macro attempts to
@@ -236,7 +237,7 @@ II. Library ABI changes
The following will cause the library major version number to
increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.4.0.0".
-- any g++ compiler ABI changes
+- (anything) changing in the gcc/g++ compiler ABI
- (anything) changing size of an exported symbol
@@ -248,7 +249,14 @@ increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.4.0.0".
- (anything) deleting an exported symbol
-Note: adding an exported symbol, if it's in a new linker map name, is ok.
+- (anything) changing the size, alignment, or layout of types
+ specified in the C++ standard. These may not necessarily be
+ instantiated or otherwise exported in the library binary, and
+ include all the required locale facets, as well as things like
+ std::basic_streambuf, et al.
+
+Note: adding an exported symbol, if it's in a new and dependent
+interface name, is ok.
The following will cause the library revision version number to
increase, say from "libstdc++.so.5.0.0" to "libstdc++.so.5.0.1".
@@ -281,42 +289,66 @@ III. Versioning
IV. Testing ABI changes
-Currently, there is no formal testing for changes in the libstdc++
-ABI. It would be in the best interest of GNU C++ users everywhere to
-have such a test, and work to develop this test is ongoing.
+Testing for GNU C++ ABI changes is composed of two distinct areas:
+testing the C++ compiler (g++) for compiler changes, and testing the
+C++ library (libstdc++) for library changes.
+
+Testing the C++ compiler ABI can be done various ways.
-There is a formal method for checking the compiler parts of the C++
-ABI, donated by Intel. More information can be obtained
+One.
+Intel ABI checker. More information can be obtained
<a href="http://developer.intel.com/software/products/opensource/">here.</a>
-To test the library, the following two ideas have been suggested:
+Two.
+The second is yet unreleased, but has been announced on the gcc
+mailing list. It is yet unspecified if these tools will be freely
+available, and able to be included in a GNU project. Please contact
+Mark Mitchell (mark@codesourcery.com) for more details, and current
+status.
+
+Three.
+Involves using the vlad.consistency test framework. This has also been
+discussed on the gcc mailing lists.
+
+Testing the C++ library ABI can also be done various ways.
One.
(Brendan Kehoe, Jeff Law suggestion to run 'make check-c++' two ways,
one with a new compiler and an old library, and the other with an old
compiler and a new library, and look for testsuite regressions)
+Details on how to set this kind of test up can be found here:
+http://gcc.gnu.org/ml/gcc/2002-08/msg00142.html
+
Two.
-Have the libstdc++ testsuite proactive check the library ABI. Probably
-a couple of items would be covered, although perhaps not all would
-need to be done at once for this to be useful. Compute the list of
-names exported in the shared version of libstdc++ binary. Then, save
-this list of names. Have this list of names re-computed for each new
-binary of the same version. Next, use sizeof, alignof, and offset to
-compute offsets for each structure and type in the standard library,
-saving to another datafile. Then, compute this for new binaries, and
-look for differences.
-
-An example of a way to compute the list of names exported by the
-shared libstdc++ binary is:
-
-nm --extern-only --portability libstdc++.so.5.0.0 | awk '{ print $1 $2}'
-
-The thought is to choose one or both of these approaches, and to use a
-Makefile hook, perhaps 'make check-abi', to add this capability to the
-libstdc++ testsuite.
-
-Perhaps there are other Library ABI checkers. If so, please notify us.
+Use the 'make check-abi' rule in the libstdc++-v3 Makefile.
+
+This is a proactive check the library ABI. Currently, exported symbol
+names that are either weak or defined are checked against a last known
+good baseline. Currently, this baseline is keyed off of 3.2.0
+binaries, as this was the last time the .so number was incremented. In
+addition, all exported names are demangled, and the exported objects
+are checked to make sure they are the same size as the same object in
+the baseline.
+
+This dataset is insufficient, yet a start. Also needed is a
+comprehensive check for all user-visible types part of the standard
+library for sizeof() and alignof() changes.
+
+Verifying compatible layouts of objects is not even attempted. It
+should be possible to use sizeof, alignof, and offsetof to compute
+offsets for each structure and type in the standard library, saving to
+another datafile. Then, compute this in a similar way for new
+binaries, and look for differences.
+
+Another approach might be to use the -fdump-class-hierarchy flag to
+get information. However, currently this approach gives insufficient
+data for use in library testing, as class data members, their offsets,
+and other detailed data is not displayed with this flag.
+(See g++/7470 on how this was used to find bugs.)
+
+Perhaps there are other C++ ABI checkers. If so, please notify
+us. We'd like to know about them!
V. Issues not directly addressed, and possible suggestions
diff --git a/libstdc++-v3/docs/html/configopts.html b/libstdc++-v3/docs/html/configopts.html
index 4fae2659799..eab9864f330 100644
--- a/libstdc++-v3/docs/html/configopts.html
+++ b/libstdc++-v3/docs/html/configopts.html
@@ -1,12 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++">
- <meta name="DESCRIPTION" content="Configuration options for libstdc++-v3.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++" />
+ <meta name="DESCRIPTION" content="Configuration options for libstdc++-v3." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 configure options</title>
-<link rel="StyleSheet" href="lib3styles.css">
+<link rel="StyleSheet" href="lib3styles.css" />
</head>
<body>
@@ -19,10 +23,10 @@ options</a></h1>
</p>
<p>To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>.
-
+</p>
<!-- ####################################################### -->
-<hr>
+<hr />
<p>Here are some of the non-obvious options to libstdc++'s configure.
Keep in mind that
<!-- This SECnn should be the "Choosing Package Options" section. -->
@@ -37,15 +41,47 @@ options</a></h1>
</p>
<dl>
- <dt><code>--enable-multilib </code>[default]
+ <dt><code>--enable-multilib </code>[default]</dt>
<dd><p>This is part of the generic multilib support for building cross
compilers. As such, targets like &quot;powerpc-elf&quot; will have
libstdc++ built many different ways: &quot;-msoft-float&quot;
and not, etc. A different libstdc++ will be built for each of
the different multilib versions. This option is on by default.
</p>
+ </dd>
+
+ <dt><code>--enable-sjlj-exceptions </code></dt>
+ <dd><p>Forces old, set-jump/long-jump exception handling model. If
+ at all possible, the new, frame unwinding exception handling routines
+ should be used instead, as they significantly reduce both
+ runtime memory usage and executable size. This option can
+ change the library ABI.
+ </p>
+ </dd>
+
+ <dt><code>--enable-version-specific-runtime-libs </code></dt>
+ <dd><p>Specify that run-time libraries should be installed in the
+ compiler-specific subdirectory (i.e.,
+ <code>${libdir}/gcc-lib/${target_alias}/${gcc_version}</code>)
+ instead of <code>${libdir}</code>. This option is useful if you
+ intend to use several versions of gcc in parallel. In addition,
+ libstdc++'s include files will be installed in
+ <code>${libdir}/gcc-lib/${target_alias}/${gcc_version}/include/g++</code>,
+ unless you also specify
+ <code>--with-gxx-include-dir=<em>dirname</em></code> during configuration.
+ </p>
+ </dd>
- <dt><code>--enable-debug </code>
+ <dt><code>--with-gxx-include-dir=&lt;include-files dir&gt;</code></dt>
+ <dd><p>Adds support for named libstdc++ include directory. For instance,
+ the following puts all the libstdc++ headers into a directory
+ called &quot;2.97-20001008&quot; instead of the usual
+ &quot;g++-v3&quot;.
+ </p>
+ <pre>
+ --with-gxx-include-dir=/foo/H-x86-gcc-3-c-gxx-inc/include/2.97-20001008</pre> </dd>
+
+ <dt><code>--enable-debug </code></dt>
<dd><p>The configure script will automatically detect the highest
level of optimization that the compiler in use can use.
This --enable flag will disable all optimizations and instruct
@@ -55,13 +91,15 @@ options</a></h1>
configuration difference:
<code>make CXXFLAGS='-g -O0' all</code>
</p>
+ </dd>
- <dt><code>--enable-cstdio </code>
+ <dt><code>--enable-cstdio </code></dt>
<dd><p>This is an abbreviated form of <code>'--enable-cstdio=stdio'</code>
- (described next).
+ (described next). This option can change the library ABI.
</p>
+ </dd>
- <dt><code>--enable-cstdio=LIB </code>
+ <dt><code>--enable-cstdio=OPTION </code></dt>
<dd><p>Select a target-specific I/O package. As of libstdc++-v3
snapshot 3.0.96, the choices are 'libio' to specify the GNU
I/O package (from
@@ -70,101 +108,60 @@ options</a></h1>
abstraction. The default is 'stdio'. A longer explanation
is <a href="explanations.html#cstdio">here</a>.
</p>
+ </dd>
- <dt><code>--enable-sjlj-exceptions </code>
- <dd><p>Forces old, set-jump/long-jump exception handling model. If
- at all possible, the new, frame unwinding exception handling routines
- should be used instead, as they significantly reduce both runtime
- memory usage and executable size.
- </p>
-
- <dt><code>--enable-clocale </code>
+ <dt><code>--enable-clocale </code></dt>
<dd><p>This is an abbreviated form of <code>'--enable-clocale=generic'</code>
- (described next).
+ (described next). This option can change the library ABI.
</p>
+ </dd>
- <dt><code>--enable-clocale=MODEL </code>
+ <dt><code>--enable-clocale=OPTION </code></dt>
<dd><p>Select a target-specific underlying locale package. The
choices are 'ieee_1003.1-2001' to specify an X/Open, Standard Unix
(IEEE Std. 1003.1-2001) model based on langinfo/iconv/catgets,
'gnu' to specify a model based on functionality from the GNU C
- library (langinfo/iconv/gettext) (from <A
+ library (langinfo/iconv/gettext) (from <a
href="http://sources.redhat.com/glibc/">glibc</a>, the GNU C
library), or 'generic' to use a generic &quot;C&quot;
- abstraction which consists of &quot;C&quot; locale info. The
- default is 'generic'.
+ abstraction which consists of &quot;C&quot; locale info.
</p>
- <dt><code>--enable-c99 </code>
- <dd><p>The &quot;long long&quot; type was introduced in C99, along
- with many other functions for wide characters, and math
- classification macros, etc. If enabled, all C99 functions not
- specified by the C++ standard will be put into <code>namespace
- __gnu_cxx</code>, and then all these names will
- be injected into namespace std, so that C99 functions can be
- used &quot;as if&quot; they were in the C++ standard (as they
- will eventually be in some future revision of the standard,
- without a doubt). By default, C99 support is on, assuming the
- configure probes find all the necessary functions and bits
- necessary.
- </p>
-
- <dt><code>--enable-long-long </code>
- <dd><p>The &quot;long long&quot; type was introduced in C99. It is
- provided as a GNU extension to C++98 in g++. This flag builds
- support for &quot;long long&quot; into the library (specialized
- templates and the like for iostreams). This option is on by default:
- if enabled, users will have to either use the new-style &quot;C&quot;
- headers by default (i.e., &lt;cmath&gt; not &lt;math.h&gt;)
- or add appropriate compile-time flags to all compile lines to
- allow &quot;C&quot; visibility of this feature (on GNU/Linux,
- the flag is -D_ISOC99_SOURCE, which is added automatically via
- CPLUSPLUS_CPP_SPEC's addition of _GNU_SOURCE).
+ <p>As part of the configuration process, the "C" library is
+ probed both for sufficient vintage, and installed locale
+ data. If either of these elements are not present, the C++
+ locale model default to 'generic.' On glibc-based systems of
+ version 2.2.5 and above with installed locale files, 'gnu' is
+ automatically selected.
</p>
+ </dd>
- <dt><code>--enable-cheaders=OPTION </code>
+ <dt><code>--enable-cheaders=OPTION </code></dt>
<dd><p>This allows the user to define what kind of C headers are
used. Options are: c, c_std, and c_shadow. These correspond
to the source directory's include/c, include/c_std, and
include/c_shadow directories. The default is c_std.
</p>
+ </dd>
- <dt><code>--enable-threads </code>
+ <dt><code>--enable-threads </code></dt>
<dd><p>This is an abbreviated form of <code>'--enable-threads=yes'</code>
- (described next).
+ (described next). This option can change the library ABI.
</p>
+ </dd>
- <dt><code>--enable-threads=LIB </code>
+ <dt><code>--enable-threads=OPTION </code></dt>
<dd><p>Select a threading library. A full description is given in the
general <a href="http://gcc.gnu.org/install/configure.html">compiler
configuration instructions</a>.
</p>
+ </dd>
- <dt><code>--enable-version-specific-runtime-libs </code>
- <dd><p>Specify that run-time libraries should be installed in the
- compiler-specific subdirectory (i.e.,
- <code>${libdir}/gcc-lib/${target_alias}/${gcc_version}</code>)
- instead of <code>${libdir}</code>. This option is useful if you
- intend to use several versions of gcc in parallel. In addition,
- libstdc++'s include files will be installed in
- <code>${libdir}/gcc-lib/${target_alias}/${gcc_version}/include/g++</code>,
- unless you also specify
- <code>--with-gxx-include-dir=<em>dirname</em></code> during configuration.
- </p>
-
- <dt><code>--with-gxx-include-dir=&lt;include-files dir&gt;</code>
- <dd><p>Adds support for named libstdc++ include directory. For instance,
- the following puts all the libstdc++ headers into a directory
- called &quot;2.97-20001008&quot; instead of the usual
- &quot;g++-v3&quot;.
- </p>
- <pre>
- --with-gxx-include-dir=/foo/H-x86-gcc-3-c-gxx-inc/include/2.97-20001008</pre>
-
- <dt><code>--enable-cxx-flags=FLAGS</code>
+ <dt><code>--enable-cxx-flags=FLAGS</code></dt>
<dd><p>With this option, you can pass a string of -f (functionality)
- flags to the compiler to use when building libstdc++. FLAGS
- is a quoted string of options, like
+ flags to the compiler to use when building libstdc++. This
+ option can change the library ABI. FLAGS is a quoted string of
+ options, like
</p>
<pre>
--enable-cxx-flags='-fvtable-gc -fomit-frame-pointer -ansi'</pre>
@@ -188,25 +185,59 @@ options</a></h1>
<p>and opposite forms (-fno-) of the same. Tell us (the libstdc++
mailing list) if you discover more!
</p>
+ </dd>
+
+ <dt><code>--enable-c99 </code></dt>
+ <dd><p>The &quot;long long&quot; type was introduced in C99, along
+ with many other functions for wide characters, and math
+ classification macros, etc. If enabled, all C99 functions not
+ specified by the C++ standard will be put into <code>namespace
+ __gnu_cxx</code>, and then all these names will
+ be injected into namespace std, so that C99 functions can be
+ used &quot;as if&quot; they were in the C++ standard (as they
+ will eventually be in some future revision of the standard,
+ without a doubt). By default, C99 support is on, assuming the
+ configure probes find all the necessary functions and bits
+ necessary. This option can change the library ABI.
+ </p>
+ </dd>
- <dt><code>--enable-c-mbchar </code>[default]
+ <dt><code>--enable-c-mbchar </code>[default]</dt>
<dd><p>Certain template specializations are required for wide
character conversion support. This is tricky and currently
changing rapidly, and can cause problems on new platforms.
Disabling wide character specializations is useful for initial
porting steps, but builds only a subset of what is required by
- ISO. By default, this option is on.
+ ISO. By default, this option is on. This option can change
+ the library ABI.
+ </p>
+ </dd>
+
+ <dt><code>--enable-long-long </code></dt>
+ <dd><p>The &quot;long long&quot; type was introduced in C99. It is
+ provided as a GNU extension to C++98 in g++. This flag builds
+ support for &quot;long long&quot; into the library (specialized
+ templates and the like for iostreams). This option is on by default:
+ if enabled, users will have to either use the new-style &quot;C&quot;
+ headers by default (i.e., &lt;cmath&gt; not &lt;math.h&gt;)
+ or add appropriate compile-time flags to all compile lines to
+ allow &quot;C&quot; visibility of this feature (on GNU/Linux,
+ the flag is -D_ISOC99_SOURCE, which is added automatically via
+ CPLUSPLUS_CPP_SPEC's addition of _GNU_SOURCE).
+ This option can change the library ABI.
</p>
+ </dd>
- <dt><code>--enable-concept-checks </code>
+ <dt><code>--enable-concept-checks </code></dt>
<dd><p>This turns on additional compile-time checks for instantiated
library templates, in the form of specialized templates,
<a href="19_diagnostics/howto.html#3">described here</a>. They
can help users discover when they break the rules of the STL, before
their programs run.
</p>
+ </dd>
- <dt><code>--enable-symvers[=style] </code>
+ <dt><code>--enable-symvers[=style] </code></dt>
<dd><p>In 3.1, tries to turn on symbol versioning in the shared library (if a
shared library has been requested). The only 'style' currently
supported is 'gnu' which requires that a recent version of the GNU
@@ -214,6 +245,7 @@ options</a></h1>
try to guess if the 'gnu' style can be used, and if so, will turn it
on. Hopefully people will volunteer to do other 'style' options.
</p>
+ </dd>
</dl>
<p>Return <a href="#top">to the top of the page</a> or
<a href="http://gcc.gnu.org/libstdc++/">to the libstdc++ homepage</a>.
@@ -222,7 +254,7 @@ options</a></h1>
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/documentation.html b/libstdc++-v3/docs/html/documentation.html
index 8987a521d06..a4a79e32b54 100644
--- a/libstdc++-v3/docs/html/documentation.html
+++ b/libstdc++-v3/docs/html/documentation.html
@@ -1,10 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta name="KEYWORDS"
- content="libstdc++, homepage, home, C++, library, c++, std, g++, ABI, STL">
+ content="libstdc++, homepage, home, C++, library, c++, std, g++, ABI, STL" />
<title>GNU C++ Standard Library</title>
-<link rel="StyleSheet" href="lib3styles.css">
+<link rel="StyleSheet" href="lib3styles.css" />
</head>
<body>
@@ -15,40 +19,40 @@
automatically-generated source documentation, available separately.
</p>
-
<hr />
-<br>
+<br />
<h2><a name="1">Introduction</a></h2>
<p>This is a short list of text files pertaining to this implementation of
ISO 14882. A brief description may follow the name of the file.
+ </p>
<ul>
<li><a href="17_intro/COPYING">License</a>
- - GPL v2 license terms
- <li><a href="abi.txt">ABI Policy and Guidelines</a>
- <li><a href="17_intro/BUGS">BUGS</a>
+ - GPL v2 license terms</li>
+ <li><a href="abi.txt">ABI Policy and Guidelines</a></li>
+ <li><a href="17_intro/BUGS">BUGS</a></li>
<li><a href="17_intro/PROBLEMS">PROBLEMS</a>
- - target-specific known issues
+ - target-specific known issues</li>
<!-- Linking to "../README" doesn't work; we are at the top level
of the web pages. Punt. -->
- <li>README - directory structure
+ <li>README - directory structure</li>
<li><a href="17_intro/RELEASE-NOTES">RELEASE-NOTES</a>
- - latest version info, recent changes and news
+ - latest version info, recent changes and news</li>
<li><a href="17_intro/TODO">TODO</a>
- - tasks yet undone
+ - tasks yet undone</li>
</ul>
-
<hr />
-<br>
+<br />
<h2><a name="2">Configuring, Building, Installing</a></h2>
- <ul>
- <li><a href="configopts.html">Configure options</a>
- <li><a href="install.html">Getting started: configure, build, install</a>
- </ul>
+<ul>
+ <li><a href="configopts.html">Configure options</a></li>
+ <li><a href="install.html">Getting started: configure, build, install</a>
+ </li>
+</ul>
<hr />
-<br>
+<br />
<h2><a name="4">Source-Level Documentation</a></h2>
<p>The library sources have been specially formatted so that with the
proper invocation of another tool (Doxygen), a set of HTML pages
@@ -58,13 +62,16 @@
the library classes, finding out what is in a particular include
file, looking at inheritance diagrams, etc.
</p>
-<p>The Source-Level documentation can be viewed online:
- <ul>
+<p>The Source-Level documentation can be viewed online:</p>
+<ul>
<li><a href="libstdc++-html-USERS-3.1/index.html">for the 3.1 release</a>
+ </li>
<li><a href="libstdc++-html-USERS-3.2/index.html">for the 3.2 release</a>
+ </li>
<li><a href="latest-doxygen/index.html">&quot;the latest collection&quot;</a>
(for the snapshot or later; see the date on the first page)
- </ul>
+ </li>
+</ul>
<p>This generated HTML collection, as above, is also available for download in
the libstdc++ snapshots directory at
<code>&lt;URL:ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/&gt;</code>.
@@ -81,142 +88,160 @@
<hr />
-<br>
+<br />
<h2><a name="3">Chapter-Specific Documentation</a></h2>
<p>Information, extensions, notes and advice on specific implementation
- capabilites and or liabilities broken down into chapter names based on the
+ capabilites and/or liabilities broken down into chapter names based on the
C++ standard.
</p>
- <ul>
- <li>Intro (Chapter 17)
- <ul>
- <li><a href="17_intro/howto.html#1">Header files</a>
- <li><a href="17_intro/howto.html#3">Using &lt;foo&gt; vs &lt;foo.h&gt;</a>
- <li><a href="17_intro/howto.html#2">Multithreading</a>
- <li><a href="17_intro/howto.html#4">Porting</a>
- <li><a href="17_intro/howto.html#5">Implementation-specific behavior</a>
- <li><a href="17_intro/howto.html#6">Using preprocessor macros to change behavior of the library</a>
- </ul>
-
- <li>Library Support (Chapter 18)
- <ul>
- <li><a href="18_support/howto.html#1">Types</a>
- <li><a href="18_support/howto.html#2">Implementation properties</a>
- <li><a href="18_support/howto.html#3">Start and Termination</a>
- <li><a href="18_support/howto.html#4">Dynamic memory management</a>
- <li><a href="18_support/howto.html#5">RTTI, the ABI, and demangling</a>
- </ul>
-
-
- <li>Diagnostics (Chapter 19)
- <ul>
- <li><a href="19_diagnostics/howto.html#1">Adding data to exceptions</a>
- <li><a href="19_diagnostics/howto.html#2">Exception class hierarchy diagram</a>
- <li><a href="19_diagnostics/howto.html#3">Concept checkers -- new and improved!</a>
- <li><a href="19_diagnostics/howto.html#4">Verbose terminate</a>
- </ul>
-
- <li>Utilities (Chapter 20)
- <ul>
- <li><a href="20_util/howto.html#1">auto_ptr is not omnipotent</a>
- <li><a href="20_util/howto.html#1">auto_ptr inside container classes</a>
- <li><a href="20_util/howto.html#1">Functors</a>
- <li><a href="20_util/howto.html#1">Pairs</a>
- </ul>
-
-
- <li>Strings (Chapter 21)
- <ul>
- <li><a href="21_strings/howto.html#1">MFC's CString</a>
- <li><a href="21_strings/howto.html#2">A case-insensitive string class</a>
- <li><a href="21_strings/howto.html#3">Breaking a C++ string into tokens</a>
- <li><a href="21_strings/howto.html#4">Simple transformations</a>
- </ul>
-
- <li>Localization (Chapter 22)
- <ul>
- <li><a href="22_locale/howto.html#1">Class locale</a>
- <li><a href="22_locale/howto.html#2">Class codecvt</a>
- <li><a href="22_locale/howto.html#3">Class ctype</a>
- <li><a href="22_locale/howto.html#4">Class messages</a>
- <li><a href="22_locale/howto.html#5">Bjarne Stroustrup on Locales</a>
- <li><a href="22_locale/howto.html#6">Nathan Myers on Locales</a>
- <li><a href="22_locale/howto.html#7">Correct Transformations </a>
- </ul>
-
- <li>Containers (Chapter 23)
- <ul>
- <li><a href="23_containers/howto.html#1">Making code unaware of the container/array difference</a>
- <li><a href="23_containers/howto.html#2">Variable-sized bitmasks</a>
- <li><a href="23_containers/howto.html#3">Containers and multithreading</a>
- <li><a href="23_containers/howto.html#4">&quot;Hinting&quot; during insertion</a>
- <li><a href="23_containers/howto.html#5">Bitmasks and string arguments</a>
- <li><a href="23_containers/howto.html#6"><code>std::list::size()</code> is O(n)!</a>
- <li><a href="23_containers/howto.html#7">Space overhead management for vectors </a>
- </ul>
-
- <li>Iterators (Chapter24)
- <ul>
- <li><a href="24_iterators/howto.html#1">They aren't pointers!</a>
- <li><a href="24_iterators/howto.html#1">It ends where?</a>
- </ul>
-
- <li>Algorithms (Chapter 25)
- <ul>
- <li><a href="25_algorithms/howto.html#1">Prerequisites</a>
- <li><a href="25_algorithms/howto.html#2">Special swaps</a>
- </ul>
-
- <li>Numerics (Chapter 26)
- <ul>
- <li><a href="26_numerics/howto.html#1">Complex Number Processing</a>
- <li><a href="26_numerics/howto.html#2">Array Processing</a>
- <li><a href="26_numerics/howto.html#3">Numerical Functions</a>
- <li><a href="26_numerics/howto.html#4">C99</a>
- </ul>
-
- <li>I/O (Chapter 27)
- <ul>
- <li><a href="27_io/howto.html#1">Copying a file</a>
- <li><a href="27_io/howto.html#2">The buffering is screwing up my program!</a>
- </ul>
- <ul>
- <li><a href="27_io/howto.html#3">Binary I/O</a>
- <li><a href="27_io/howto.html#6">More on binary I/O</a>
- <li><a href="27_io/howto.html#5">Deriving a stream buffer</a>
- <li><a href="27_io/howto.html#4">What is this &lt;sstream&gt;/stringstreams thing?</a>
- <li><a href="27_io/howto.html#7">Pathetic performance? Ditch C.</a>
- <li><a href="27_io/howto.html#8">Threads and I/O</a>
- </ul>
-
- <li>Extensions to the Standard Library
- <ul>
- <li><a href="ext/howto.html#1">Ropes and trees and hashes, oh my!</a>
- <li><a href="ext/howto.html#2">Added members and types</a>
- <li><a href="ext/howto.html#3">Allocators (versions 3.0, 3.1, 3.2)</a>
- <li><a href="ext/howto.html#4">Allocators (version 3.3)</a>
- <li><a href="ext/howto.html#5">Compile-time checks</a>
- <li><a href="ext/howto.html#6">LWG Issues</a>
- </ul>
- </ul>
+<!--
+ The list below is automatically generated. To make changes in the text,
+ edit the appropriate HOWTO file and run "make" in this directory. In
+ those files, you may reorder entries as you like, but DO NOT change the
+ "#number"s in anchors, for they are used elsewhere and in bookmarks.
+-->
+<!-- beginlist -->
+ <ul>
+ <li>Library Introduction (Chapter 17)
+ <ul>
+ <li><a href="17_intro/howto.html#2">The Standard C++ header files</a></li>
+ <li><a href="17_intro/howto.html#3">The Standard C++ library and multithreading</a></li>
+ <li><a href="17_intro/howto.html#4"><code>&lt;foo&gt;</code> vs <code>&lt;foo.h&gt;</code></a></li>
+ <li><a href="17_intro/porting-howto.html">Porting HOWTO</a></li>
+ <li><a href="17_intro/howto.html#5">Behavior specific to libstdc++-v3</a></li>
+ <li><a href="17_intro/howto.html#6">Preprocessor macros controlling the library</a></li>
+ </ul>
+ </li>
+
+ <li>Library Support (Chapter 18)
+ <ul>
+ <li><a href="18_support/howto.html#1">Types</a></li>
+ <li><a href="18_support/howto.html#2">Implementation properties</a></li>
+ <li><a href="18_support/howto.html#3">Start and Termination</a></li>
+ <li><a href="18_support/howto.html#4">Dynamic memory management</a></li>
+ <li><a href="18_support/howto.html#5">RTTI, the ABI, and demangling</a></li>
+ </ul>
+ </li>
+
+ <li>Diagnostics (Chapter 19)
+ <ul>
+ <li><a href="19_diagnostics/howto.html#1">Adding data to exceptions</a></li>
+ <li><a href="19_diagnostics/howto.html#2">Exception class hierarchy diagram</a></li>
+ <li><a href="19_diagnostics/howto.html#3">Concept checkers -- <strong>new and improved!</strong></a></li>
+ <li><a href="19_diagnostics/howto.html#4">Verbose <code>terminate</code></a></li>
+ </ul>
+ </li>
+
+ <li>General Utilities (Chapter 20)
+ <ul>
+ <li><a href="20_util/howto.html#1"><code>auto_ptr</code> is not omnipotent</a></li>
+ <li><a href="20_util/howto.html#2"><code>auto_ptr</code> inside container classes</a></li>
+ <li><a href="20_util/howto.html#3">Functors</a></li>
+ <li><a href="20_util/howto.html#4">Pairs</a></li>
+ </ul>
+ </li>
+
+ <li>Strings (Chapter 21)
+ <ul>
+ <li><a href="21_strings/howto.html#1">MFC's CString</a></li>
+ <li><a href="21_strings/howto.html#2">A case-insensitive string class</a></li>
+ <li><a href="21_strings/howto.html#3">Breaking a C++ string into tokens</a></li>
+ <li><a href="21_strings/howto.html#4">Simple transformations</a></li>
+ <li><a href="21_strings/howto.html#5">Making strings of arbitrary character types</a></li>
+ </ul>
+ </li>
+
+ <li>Localization (Chapter 22)
+ <ul>
+ <li><a href="22_locale/howto.html#1">class locale</a></li>
+ <li><a href="22_locale/howto.html#2">class codecvt</a></li>
+ <li><a href="22_locale/howto.html#3">class ctype</a></li>
+ <li><a href="22_locale/howto.html#4">class messages</a></li>
+ <li><a href="22_locale/howto.html#5">Bjarne Stroustrup on Locales</a></li>
+ <li><a href="22_locale/howto.html#6">Nathan Myers on Locales</a></li>
+ <li><a href="22_locale/howto.html#7">Correct Transformations</a></li>
+ </ul>
+ </li>
+
+ <li>Containers (Chapter 23)
+ <ul>
+ <li><a href="23_containers/howto.html#1">Making code unaware of the container/array difference</a></li>
+ <li><a href="23_containers/howto.html#2">Variable-sized bitmasks</a></li>
+ <li><a href="23_containers/howto.html#3">Containers and multithreading</a></li>
+ <li><a href="23_containers/howto.html#4">&quot;Hinting&quot; during insertion</a></li>
+ <li><a href="23_containers/howto.html#5">Bitmasks and string arguments</a></li>
+ <li><a href="23_containers/howto.html#6"><code>std::list::size()</code> is O(n)!</a></li>
+ <li><a href="23_containers/howto.html#7">Space overhead management for vectors</a></li>
+ </ul>
+ </li>
+
+ <li>Iterators (Chapter 24)
+ <ul>
+ <li><a href="24_iterators/howto.html#1">They ain't pointers!</a></li>
+ <li><a href="24_iterators/howto.html#2">It ends <em>where?</em></a></li>
+ </ul>
+ </li>
+
+ <li>Algorithms (Chapter 25)
+ <ul>
+ <li><a href="25_algorithms/howto.html#1">Prerequisites</a></li>
+ <li><a href="25_algorithms/howto.html#2">Special <code>swap</code>s</a></li>
+ </ul>
+ </li>
+
+ <li>Numerics (Chapter 26)
+ <ul>
+ <li><a href="26_numerics/howto.html#1">Complex Number Processing</a></li>
+ <li><a href="26_numerics/howto.html#2">Array Processing</a></li>
+ <li><a href="26_numerics/howto.html#3">Numerical Functions</a></li>
+ <li><a href="26_numerics/howto.html#4">C99</a></li>
+ </ul>
+ </li>
+
+ <li>Input/Output (Chapter 27)
+ <ul>
+ <li><a href="27_io/howto.html#1">Copying a file</a></li>
+ <li><a href="27_io/howto.html#2">The buffering is screwing up my program!</a></li>
+ <li><a href="27_io/howto.html#3">Binary I/O</a></li>
+ <li><a href="27_io/howto.html#5">What is this &lt;sstream&gt;/stringstreams thing?</a></li>
+ <li><a href="27_io/howto.html#6">Deriving a stream buffer</a></li>
+ <li><a href="27_io/howto.html#7">More on binary I/O</a></li>
+ <li><a href="27_io/howto.html#8">Pathetic performance? Ditch C.</a></li>
+ <li><a href="27_io/howto.html#9">Threads and I/O</a></li>
+ </ul>
+ </li>
+
+ <li>Extensions to the Standard Library
+ <ul>
+ <li><a href="ext/howto.html#1">Ropes and trees and hashes, oh my!</a></li>
+ <li><a href="ext/howto.html#2">Added members and types</a></li>
+ <li><a href="ext/howto.html#3">Allocators (versions 3.0, 3.1, 3.2)</a></li>
+ <li><a href="ext/howto.html#6">Allocators (version 3.3)</a></li>
+ <li><a href="ext/howto.html#4">Compile-time checks</a></li>
+ <li><a href="ext/howto.html#5">LWG Issues</a></li>
+ </ul>
+ </li>
+
+ </ul>
+<!-- endlist -->
<hr />
-<br>
+<br />
<h2><a name="5">Contributor-Specific Information</a></h2>
- <ul>
- <li><a href="17_intro/contribute.html">Contributor checklist</a>
- <li><a href="17_intro/libstdc++-assign.txt">Copyright assignment form for libstdc++-v3</a>
- <li><a href="17_intro/BADNAMES">BADNAMES</a>
- - names to avoid because of potential collisions
- <li><a href="17_intro/C++STYLE">C++STYLE</a>
- - coding style by example
- <li><a href="17_intro/CHECKLIST">CHECKLIST</a>
- - a list of required features and their status.
- <li><a href="17_intro/DESIGN">DESIGN</a>
- - overview of the implementation plan
- <li><a href="17_intro/HEADER_POLICY">HEADER_POLICY</a>
- - header naming and sub-include structure
- </ul>
+<ul>
+ <li><a href="17_intro/contribute.html">Contributor checklist</a></li>
+ <li><a href="17_intro/libstdc++-assign.txt">Copyright assignment form for libstdc++-v3</a></li>
+ <li><a href="17_intro/BADNAMES">BADNAMES</a>
+ - names to avoid because of potential collisions</li>
+ <li><a href="17_intro/C++STYLE">C++STYLE</a>
+ - coding style by example</li>
+ <li><a href="17_intro/CHECKLIST">CHECKLIST</a>
+ - a list of required features and their status.</li>
+ <li><a href="17_intro/DESIGN">DESIGN</a>
+ - overview of the implementation plan</li>
+ <li><a href="17_intro/HEADER_POLICY">HEADER_POLICY</a>
+ - header naming and sub-include structure</li>
+</ul>
<!-- ####################################################### -->
diff --git a/libstdc++-v3/docs/html/explanations.html b/libstdc++-v3/docs/html/explanations.html
index 164a5a1cf8e..dac57b87288 100644
--- a/libstdc++-v3/docs/html/explanations.html
+++ b/libstdc++-v3/docs/html/explanations.html
@@ -1,12 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++">
- <meta name="DESCRIPTION" content="Explanatory notes about libstdc++-v3.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++" />
+ <meta name="DESCRIPTION" content="Explanatory notes about libstdc++-v3." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>Explanatory notes about libstdc++-v3 design</title>
-<link rel="StyleSheet" href="lib3styles.css">
+<link rel="StyleSheet" href="lib3styles.css" />
</head>
<body>
@@ -19,11 +23,12 @@ design</a></h1>
</p>
<p>To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>.
+</p>
<!-- ####################################################### -->
-<hr>
-<a name="cstdio"><h3>&quot;I/O packages&quot;, <code>--enable-cstdio</code></h3></a>
+<hr />
+<h3><a name="cstdio">&quot;I/O packages&quot;, <code>--enable-cstdio</code></a></h3>
<p>In addition to all the nifty things which C++ can do for I/O, its library
also includes all of the I/O capabilites of C. Making them work together
can be a challenge, not only
@@ -61,8 +66,8 @@ design</a></h1>
</p>
-<hr>
-<a name="alloc"><h3>Internal Allocators</h3></a>
+<hr />
+<h3><a name="alloc">Internal Allocators</a></h3>
<p>
</p>
<p>Return <a href="#top">to the top of the page</a> or
@@ -72,7 +77,7 @@ design</a></h1>
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/ext/howto.html b/libstdc++-v3/docs/html/ext/howto.html
index d5755c6cd67..007335b6569 100644
--- a/libstdc++-v3/docs/html/ext/howto.html
+++ b/libstdc++-v3/docs/html/ext/howto.html
@@ -1,13 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="Notes for the libstdc++ extensions.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="Notes for the libstdc++ extensions." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 HOWTO: Extensions</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
</head>
<body>
@@ -18,45 +21,46 @@
and some just seemed to appear on the doorstep.
</p>
<p><strong>Before you leap in and use these</strong>, be aware of two things:
- <ol>
- <li>Non-Standard means exactly that. The behavior, and the very
- existence, of these extensions may change with little or no
- warning. (Ideally, the really good ones will appear in the next
- revision of C++.) Also, other platforms, other compilers, other
- versions of g++ or libstdc++-v3 may not recognize these names, or
- treat them differently, or...
- <li>You should know how to <a href="../faq/index.html#5_4">access
- these headers properly</a>.
- </ol>
</p>
+<ol>
+ <li>Non-Standard means exactly that. The behavior, and the very
+ existence, of these extensions may change with little or no
+ warning. (Ideally, the really good ones will appear in the next
+ revision of C++.) Also, other platforms, other compilers, other
+ versions of g++ or libstdc++-v3 may not recognize these names, or
+ treat them differently, or... </li>
+ <li>You should know how to <a href="../faq/index.html#5_4">access
+ these headers properly</a>. </li>
+</ol>
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Contents</h1>
<ul>
- <li><a href="#1">Ropes and trees and hashes, oh my!</a>
- <li><a href="#2">Added members and types</a>
- <li><a href="#3">Allocators (versions 3.0, 3.1, 3.2)</a>
- <li><a href="#6">Allocators (version 3.3)</a>
- <li><a href="#4">Compile-time checks</a>
- <li><a href="#5">LWG Issues</a>
+ <li><a href="#1">Ropes and trees and hashes, oh my!</a></li>
+ <li><a href="#2">Added members and types</a></li>
+ <li><a href="#3">Allocators (versions 3.0, 3.1, 3.2)</a></li>
+ <li><a href="#6">Allocators (version 3.3)</a></li>
+ <li><a href="#4">Compile-time checks</a></li>
+ <li><a href="#5">LWG Issues</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
<h2><a name="1">Ropes and trees and hashes, oh my!</a></h2>
- <p>The SGI headers
- <pre>
+ <p>The SGI headers</p>
+ <pre>
&lt;bvector&gt;
&lt;hash_map&gt;
&lt;hash_set&gt;
&lt;rope&gt;
&lt;slist&gt;
&lt;tree&gt;
- </pre> are all here; <code>&lt;bvector&gt;</code> exposes the old bit_vector
+ </pre>
+ <p>are all here; <code>&lt;bvector&gt;</code> exposes the old bit_vector
class that was used before specialization of vector&lt;bool&gt; was
available (it's actually a typedef for the specialization now).
<code>&lt;hash_map&gt;</code> and <code>&lt;hash_set&gt;</code>
@@ -88,25 +92,25 @@
</p>
<p>Why would you want to use a hashing class instead of the
&quot;normal&quot; implementations? Matt Austern writes:
- <blockquote><em>[W]ith a well chosen hash function, hash tables
- generally provide much better average-case performance than binary
- search trees, and much worse worst-case performance. So if your
- implementation has hash_map, if you don't mind using nonstandard
- components, and if you aren't scared about the possibility of
- pathological cases, you'll probably get better performance from
- hash_map.</em></blockquote>
</p>
+ <blockquote><em>[W]ith a well chosen hash function, hash tables
+ generally provide much better average-case performance than binary
+ search trees, and much worse worst-case performance. So if your
+ implementation has hash_map, if you don't mind using nonstandard
+ components, and if you aren't scared about the possibility of
+ pathological cases, you'll probably get better performance from
+ hash_map.</em></blockquote>
<p>(Side note: for those of you wondering, <strong>&quot;Why wasn't a hash
table included in the Standard in the first #!$@ place?&quot;</strong>
I'll give a quick answer: it was proposed, but too late and in too
unorganized a fashion. Some sort of hashing will undoubtedly be
- included in a future Standard.
+ included in a future Standard.)
</p>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="2">Added members and types</a></h2>
<p>Some of the classes in the Standard Library have additional
publicly-available members, and some classes are themselves not in
@@ -114,29 +118,32 @@
for example, additional typedefs. Those won't be described here
(or anywhere else).
</p>
- <p>
- <ul>
+ <ul>
<li>The extensions added by SGI are so numerous that they have
<a href="sgiexts.html">their own page</a>. Since the SGI STL is no
longer actively maintained, we will try and keep this code working
ourselves.</li>
- <li>3.0.x <code>filebuf</code>s have another ctor with this signature:<br>
-<code>basic_filebuf(__c_file_type*, ios_base::openmode, int_type);</code>
- <br>This comes in very handy in a number of places, such as
+ <li>3.0.x <code>filebuf</code>s have another ctor with this signature:
+ <br />
+ <code>basic_filebuf(__c_file_type*, ios_base::openmode, int_type);</code>
+ <br />This comes in very handy in a number of places, such as
attaching Unix sockets, pipes, and anything else which uses file
descriptors, into the IOStream buffering classes. The three
arguments are as follows:
<ul>
<li><code>__c_file_type* F </code>
// the __c_file_type typedef usually boils down to stdio's FILE
+ </li>
<li><code>ios_base::openmode M </code>
// same as all the other uses of openmode
+ </li>
<li><code>int_type B </code>
// buffer size, defaults to BUFSIZ if not specified
+ </li>
</ul>
For those wanting to use file descriptors instead of FILE*'s, I
invite you to contemplate the mysteries of C's <code>fdopen()</code>.
- </li>
+ </li>
<li>In library snapshot 3.0.95 and later, <code>filebuf</code>s bring
back an old extension: the <code>fd()</code> member function. The
integer returned from this function can be used for whatever file
@@ -144,31 +151,35 @@
library cannot track what you do on your own with a file descriptor,
so if you perform any I/O directly, don't expect the library to be
aware of it.
+ </li>
<li>Beginning with 3.1, the extra <code>filebuf</code> constructor and
the <code>fd()</code> function were removed from the standard
filebuf. Instead, <code>&lt;ext/stdio_filebuf.h&gt;</code> contains
a derived class called <code>__gnu_cxx::stdio_filebuf</code>.
- </ul>
- </p>
+ </li>
+ </ul>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="3">Allocators (versions 3.0, 3.1, 3.2)</a></h2>
<p>Thread-safety, space efficiency, high speed, portability... this is a
mess. Where to begin?
</p>
<h3>The Rules</h3>
<p>The C++ standard only gives a few directives in this area:
- <ul>
+ </p>
+ <ul>
<li>When you add elements to a container, and the container must allocate
more memory to hold them, the container makes the request via its
<code>Allocator</code> template parameter. This includes adding
char's to the string class, which acts as a regular STL container
in this respect.
+ </li>
<li>The default <code>Allocator</code> of every container-of-T is
<code>std::allocator&lt;T&gt;</code>.
+ </li>
<li>The interface of the <code>allocator&lt;T&gt;</code> class is
extremely simple. It has about 20 public declarations (nested
typedefs, member functions, etc), but the two which concern us most
@@ -180,13 +191,14 @@
The <code>&quot;n&quot;</code> arguments in both those functions is a
<em>count</em> of the number of T's to allocate space for,
<em>not their total size</em>.
+ </li>
<li>&quot;The storage is obtained by calling
<code>::operator new(size_t)</code>, but it is unspecified when or
how often this function is called. The use of <code>hint</code>
is unspecified, but intended as an aid to locality if an
implementation so desires.&quot; [20.4.1.1]/6
- </ul>
- </p>
+ </li>
+ </ul>
<h3>Problems and Possibilities</h3>
<p>The easiest way of fulfilling the requirements is to call operator new
each time a container needs memory, and to call operator delete each
@@ -235,46 +247,49 @@
information for maintainers and contributors in addition to users.
</p>
<p>These classes are always available:
- <ul>
+ </p>
+ <ul>
<li><code>__new_alloc</code> simply wraps <code>::operator new</code>
and <code>::operator delete</code>.
+ </li>
<li><code>__malloc_alloc_template&lt;int inst&gt;</code> simply wraps
<code>malloc</code> and <code>free</code>. There is also a hook
for an out-of-memory handler (for new/delete this is taken care of
elsewhere). The <code>inst</code> parameter is described below.
This class was called <code>malloc_alloc</code> in earlier versions.
+ </li>
<li><code>allocator&lt;T&gt;</code> has already been described; it is
The Standard Allocator for instances of T. It uses the internal
<code>__alloc</code> typedef (see below) to satisy its requests.
+ </li>
<li><code>__simple_alloc&lt;T,A&gt;</code> is a wrapper around another
allocator, A, which itself is an allocator for instances of T.
This is primarily used in an internal &quot;allocator traits&quot;
class which helps encapsulate the different styles of allocators.
+ </li>
<li><code>__debug_alloc&lt;A&gt;</code> is also a wrapper around an
arbitrary allocator A. It passes on slightly increased size
requests to A, and uses the extra memory to store size information.
When a pointer is passed to <code>deallocate()</code>, the stored
size is checked, and assert() is used to guarantee they match.
+ </li>
<li><code>__allocator&lt;T,A&gt;</code> is an adaptor. Many of these
allocator classes have a consistent yet non-standard interface.
Such classes can be changed to a conforming interface with this
wrapper: <code>__allocator&lt;T, __alloc&gt;</code> is thus the
same as <code>allocator&lt;T&gt;</code>.
- </ul>
- </p>
- <p>An internal typedef, <code> __mem_interface </code>, is defined to be
- <code>__new_alloc</code> by default.
- </p>
+ </li>
+ </ul>
<p>Normally,
<code> __default_alloc_template&lt;bool thr, int inst&gt; </code>
is also available. This is the high-speed pool, called the default
node allocator. The reusable memory is shared among identical
instantiations of
- this type. It calls through <code>__mem_interface</code> to obtain
+ this type. It calls through <code>__new_alloc</code> to obtain
new memory when its lists run out. If a client container requests a
block larger than a certain threshold size, then the pool is bypassed,
and the allocate/deallocate request is passed to
- <code>__mem_interface</code> directly.
+ <code>__new_alloc</code> directly.
</p>
<p>Its <code>inst</code> parameter is described below. The
<code>thr</code> boolean determines whether the pool should be
@@ -295,16 +310,24 @@
</p>
<h3>A cannon to swat a fly:<code> __USE_MALLOC</code></h3>
<p>If you've already read <a href="../23_containers/howto.html#3">this
- advice</a> and decided to define this macro, then the situation changes
- thusly:
- <ol>
- <li><code>__mem_interface</code>, and
- <li><code>__alloc</code>, and
- <li><code>__single_client_alloc</code> are all typedef'd to
- <code>__malloc_alloc_template</code>.
- <li><code>__default_alloc_template</code> is no longer available.
- At all. Anywhere.
- </ol>
+ advice</a> but still think you remember how to use this macro from
+ SGI STL days. We have removed it in gcc 3.3. See next section
+ for the new way to get the same effect.
+ </p>
+ <h3>Globally disabling memory caching:<code> GLIBCPP_FORCE_NEW</code></h3>
+ <p>Starting with gcc 3.3, if you want to globally disable memory
+ caching within the library for the default allocator (i.e.
+ the one you get for all library objects when you do not specify
+ which one to use), merely set GLIBCPP_FORCE_NEW (at this time,
+ with any value) into your environment before running the
+ program. You will obtain a similar effect without having to
+ recompile your entire program and the entire library (the new
+ operator in gcc is a light wrapper around malloc). If your
+ program crashes with GLIBCPP_FORCE_NEW in the environment,
+ it likely means that you linked against objects built against
+ the older library. Code to support this extension is fully
+ compatible with 3.2 code if GLIBCPP_FORCE_NEW is not in the
+ environment.
</p>
<h3>Writing your own allocators</h3>
<p>Depending on your application (a specific program, a generic library,
@@ -326,12 +349,12 @@
(but nonportable)
method of specifying that only malloc/free should be used instead of
the default node allocator is:
- <pre>
+ </p>
+ <pre>
std::list &lt;my_type, std::__malloc_alloc_template&lt;0&gt; &gt; my_malloc_based_list;</pre>
Likewise, a debugging form of whichever allocator is currently in use:
<pre>
std::deque &lt;my_type, std::__debug_alloc&lt;std::__alloc&gt; &gt; debug_deque;</pre>
- </p>
<h3><code>inst</code></h3>
<p>The <code>__malloc_alloc_template</code> and
<code>__default_alloc_template</code> classes take an integer parameter,
@@ -339,11 +362,12 @@
</p>
<p>The point of the number is to allow multiple instantiations of the
classes without changing the semantics at all. All three of
- <pre>
+ </p>
+ <pre>
typedef __default_alloc_template&lt;true,0&gt; normal;
typedef __default_alloc_template&lt;true,1&gt; private;
typedef __default_alloc_template&lt;true,42&gt; also_private;</pre>
- behave exactly the same way. However, the memory pool for each type
+ <p>behave exactly the same way. However, the memory pool for each type
(and remember that different instantiations result in different types)
remains separate.
</p>
@@ -365,7 +389,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="6">Allocators (version 3.3)</a></h2>
<p>Changes are coming...
</p>
@@ -373,7 +397,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="4">Compile-time checks</a></h2>
<p>Currently libstdc++-v3 uses the concept checkers from the Boost
library to perform <a href="../19_diagnostics/howto.html#3">optional
@@ -384,7 +408,7 @@
<a href="../faq/index.html">to the FAQ</a>.
</p>
-<hr>
+<hr />
<h2><a name="5">LWG Issues</a></h2>
<p>Everybody's got issues. Even the C++ Standard Library.
</p>
@@ -418,134 +442,188 @@
examples of style. Note that we usually do not make changes to the code
until an issue has reached <a href="lwg-active.html#DR">DR</a> status.
</p>
- <p><dl>
+ <dl>
<dt><a href="lwg-defects.html#5">5</a>:
<em>string::compare specification questionable</em>
+ </dt>
<dd>This should be two overloaded functions rather than a single function.
+ </dd>
<dt><a href="lwg-defects.html#17">17</a>:
<em>Bad bool parsing</em>
+ </dt>
<dd>Apparently extracting Boolean values was messed up...
+ </dd>
<dt><a href="lwg-defects.html#22">22</a>:
<em>Member open vs flags</em>
+ </dt>
<dd>Re-opening a file stream does <em>not</em> clear the state flags.
+ </dd>
<dt><a href="lwg-defects.html#25">25</a>:
<em>String operator&lt;&lt; uses width() value wrong</em>
+ </dt>
<dd>Padding issues.
+ </dd>
<dt><a href="lwg-defects.html#48">48</a>:
<em>Use of non-existent exception constructor</em>
+ </dt>
<dd>An instance of <code>ios_base::failure</code> is constructed instead.
+ </dd>
<dt><a href="lwg-defects.html#49">49</a>:
<em>Underspecification of ios_base::sync_with_stdio</em>
+ </dt>
<dd>The return type is the <em>previous</em> state of synchronization.
+ </dd>
<dt><a href="lwg-defects.html#50">50</a>:
<em>Copy constructor and assignment operator of ios_base</em>
+ </dt>
<dd>These members functions are declared <code>private</code> and are
thus inaccessible. Specifying the correct semantics of
&quot;copying stream state&quot; was deemed too complicated.
+ </dd>
<dt><a href="lwg-defects.html#68">68</a>:
<em>Extractors for char* should store null at end</em>
+ </dt>
<dd>And they do now. An editing glitch in the last item in the list of
[27.6.1.2.3]/7.
+ </dd>
<dt><a href="lwg-defects.html#74">74</a>:
<em>Garbled text for codecvt::do_max_length</em>
+ </dt>
<dd>The text of the standard was gibberish. Typos gone rampant.
+ </dd>
<dt><a href="lwg-defects.html#83">83</a>:
<em>string::npos vs. string::max_size()</em>
+ </dt>
<dd>Safety checks on the size of the string should test against
<code>max_size()</code> rather than <code>npos</code>.
+ </dd>
<dt><a href="lwg-defects.html#109">109</a>:
<em>Missing binders for non-const sequence elements</em>
+ </dt>
<dd>The <code>binder1st</code> and <code>binder2nd</code> didn't have an
<code>operator()</code> taking a non-const parameter.
+ </dd>
<dt><a href="lwg-defects.html#110">110</a>:
<em>istreambuf_iterator::equal not const</em>
+ </dt>
<dd>This was not a const member function. Note that the DR says to
replace the function with a const one; we have instead provided an
overloaded version with identical contents.
+ </dd>
<dt><a href="lwg-defects.html#117">117</a>:
<em>basic_ostream uses nonexistent num_put member functions</em>
+ </dt>
<dd><code>num_put::put()</code> was overloaded on the wrong types.
+ </dd>
<dt><a href="lwg-defects.html#118">118</a>:
<em>basic_istream uses nonexistent num_get member functions</em>
+ </dt>
<dd>Same as 117, but for <code>num_get::get()</code>.
+ </dd>
<dt><a href="lwg-defects.html#129">129</a>:
<em>Need error indication from seekp() and seekg()</em>
+ </dt>
<dd>These functions set <code>failbit</code> on error now.
+ </dd>
<dt><a href="lwg-defects.html#136">136</a>:
<em>seekp, seekg setting wrong streams?</em>
+ </dt>
<dd><code>seekp</code> should only set the output stream, and
<code>seekg</code> should only set the input stream.
+ </dd>
<!--<dt><a href="lwg-defects.html#159">159</a>:
<em>Strange use of underflow()</em>
+ </dt>
<dd>In fstream.tcc, the basic_filebuf&lt;&gt;::showmanyc() function
- should probably not be calling <code>underflow()</code>.-->
+ should probably not be calling <code>underflow()</code>.
+ </dd> -->
<dt><a href="lwg-active.html#167">167</a>:
<em>Improper use of traits_type::length()</em>
+ </dt>
<dd><code>op&lt;&lt;</code> with a <code>const char*</code> was
calculating an incorrect number of characters to write.
+ </dd>
<dt><a href="lwg-defects.html#181">181</a>:
<em>make_pair() unintended behavior</em>
+ </dt>
<dd>This function used to take its arguments as reference-to-const, now
it copies them (pass by value).
+ </dd>
<dt><a href="lwg-defects.html#195">195</a>:
<em>Should basic_istream::sentry's constructor ever set eofbit?</em>
+ </dt>
<dd>Yes, it can, specifically if EOF is reached while skipping whitespace.
+ </dd>
<dt><a href="lwg-defects.html#211">211</a>:
<em>operator&gt;&gt;(istream&amp;, string&amp;) doesn't set failbit</em>
+ </dt>
<dd>If nothing is extracted into the string, <code>op&gt;&gt;</code> now
sets <code>failbit</code> (which can cause an exception, etc, etc).
+ </dd>
<dt><a href="lwg-defects.html#214">214</a>:
<em>set::find() missing const overload</em>
+ </dt>
<dd>Both <code>set</code> and <code>multiset</code> were missing
overloaded find, lower_bound, upper_bound, and equal_range functions
for const instances.
+ </dd>
<dt><a href="lwg-defects.html#251">251</a>:
<em>basic_stringbuf missing allocator_type</em>
+ </dt>
<dd>This nested typdef was originally not specified.
+ </dd>
<dt><a href="lwg-defects.html#265">265</a>:
<em>std::pair::pair() effects overly restrictive</em>
+ </dt>
<dd>The default ctor would build its members from copies of temporaries;
now it simply uses their respective default ctors.
+ </dd>
<dt><a href="lwg-defects.html#266">266</a>:
<em>bad_exception::~bad_exception() missing Effects clause</em>
+ </dt>
<dd>The <code>bad_</code>* classes no longer have destructors (they
are trivial), since no description of them was ever given.
+ </dd>
<dt><a href="lwg-defects.html#275">275</a>:
<em>Wrong type in num_get::get() overloads</em>
+ </dt>
<dd>Similar to 118.
+ </dd>
<!--
<dt><a href="lwg-defects.html#"></a>:
<em></em>
+ </dt>
<dd>
+ </dd>
-->
- </dl></p>
+ </dl>
<p>Return <a href="#top">to top of page</a> or
<a href="../faq/index.html">to the FAQ</a>.
</p>
@@ -553,7 +631,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/ext/sgiexts.html b/libstdc++-v3/docs/html/ext/sgiexts.html
index 674ffacc766..ad2b5b40f13 100644
--- a/libstdc++-v3/docs/html/ext/sgiexts.html
+++ b/libstdc++-v3/docs/html/ext/sgiexts.html
@@ -1,12 +1,15 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++, STL, SGI">
- <meta name="DESCRIPTION" content="SGI extensions preserved in libstdc++-v3.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++, STL, SGI" />
+ <meta name="DESCRIPTION" content="SGI extensions preserved in libstdc++-v3." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>SGI extensions to the library in libstdc++-v3</title>
-<link rel="StyleSheet" href="lib3styles.css">
+<link rel="StyleSheet" href="lib3styles.css" />
</head>
<body>
@@ -25,7 +28,7 @@ libstdc++-v3</a></h1>
for a description). Not every chapter may have extensions, and the
extensions may come and go. Also, this page is incomplete because the
author is pressed for time. Check back often; the latest change was on
- $Date: 2001/11/23 16:29:01 $ (UTC).
+ $Date: 2002/10/07 18:11:22 $ (UTC).
</p>
<p>Descriptions range from the scanty to the verbose. You should also check
@@ -36,30 +39,33 @@ libstdc++-v3</a></h1>
</p>
<p>Back to the <a href="howto.html">libstdc++-v3 extensions</a>.
+</p>
<!-- ####################################################### -->
-<hr>
-<a name="ch20"><h3>Chapter 20</h3></a>
+<hr />
+<h3><a name="ch20">Chapter 20</a></h3>
<p>The &lt;functional&gt; header contains many additional functors and
helper functions, extending section 20.3. They are implemented in the
file stl_function.h:
- <ul>
- <li><code>identity_element</code> for addition and multiplication. *
- <li>The functor <code>identity</code>, whose op() returns the argument
- unchanged. *
+</p>
+<ul>
+ <li><code>identity_element</code> for addition and multiplication. * </li>
+ <li>The functor <code>identity</code>, whose <code>operator()</code>
+ returns the argument unchanged. * </li>
<li>Composition functors <code>unary_function</code> and
<code>binary_function</code>, and their helpers <code>compose1</code>
- and <code>compose2</code>. *
- <li><code>select1st</code> and <code>select2nd</code>, to strip pairs. *
- <li><code>project1st</code> and <code>project2nd</code>. *
+ and <code>compose2</code>. * </li>
+ <li><code>select1st</code> and <code>select2nd</code>, to strip pairs. * </li>
+ <li><code>project1st</code> and <code>project2nd</code>. * </li>
<li>A set of functors/functions which always return the same result. They
- are <code>constant_void_fun, constant_binary_fun, constant_unary_fun,
- constant0, constant1, and constant2. *
- <li>The class <code>subtractive_rng</code>. *
- <li>mem_fun adaptor helpers mem_fun1 and mem_fun1_ref are provided for
- backwards compatibility.
-</ul></p>
+ are <code>constant_void_fun</code>, <code>constant_binary_fun</code>,
+ <code>constant_unary_fun</code>, <code>constant0</code>,
+ <code>constant1</code>, and <code>constant2</code>. * </li>
+ <li>The class <code>subtractive_rng</code>. * </li>
+ <li>mem_fun adaptor helpers <code>mem_fun1</code> and
+ <code>mem_fun1_ref</code> are provided for backwards compatibility. </li>
+</ul>
<p>20.4.1 can use several different allocators; they are described on the
main extensions page.
</p>
@@ -68,12 +74,12 @@ libstdc++-v3</a></h1>
is a pointer, which is ignored, but can be used to specify the template
type (instead of using explicit function template arguments like the
standard version does). That is, in addition to
+</p>
<pre>
get_temporary_buffer&lt;int&gt;(5);</pre>
you can also use
<pre>
get_temporary_buffer(5, (int*)0);</pre>
-</p>
<p>A class <code>temporary_buffer</code> is given in stl_tempbuf.h. *
</p>
<p>The specialized algorithms of section 20.4.4 are extended with
@@ -84,8 +90,8 @@ libstdc++-v3</a></h1>
</p>
-<hr>
-<a name="ch23"><h3>Chapter 23</h3></a>
+<hr />
+<h3><a name="ch23">Chapter 23</a></h3>
<p>A few extensions and nods to backwards-compatibility have been made with
containers. Those dealing with older SGI-style allocators are dealt with
elsewhere. The remaining ones all deal with bits:
@@ -105,18 +111,18 @@ libstdc++-v3</a></h1>
versions of single-bit test, set, reset, and flip member functions which
do no range-checking. If we call them member functions of an instantiation
of &quot;bitset&lt;N&gt;,&quot; then their names and signatures are:
+</p>
<pre>
bitset&lt;N&gt;&amp; _Unchecked_set (size_t pos);
bitset&lt;N&gt;&amp; _Unchecked_set (size_t pos, int val);
bitset&lt;N&gt;&amp; _Unchecked_reset (size_t pos);
bitset&lt;N&gt;&amp; _Unchecked_flip (size_t pos);
bool _Unchecked_test (size_t pos);</pre>
- Note that these may in fact be removed in the future, although we have
+<p>Note that these may in fact be removed in the future, although we have
no present plans to do so (and there doesn't seem to be any immediate
reason to).
</p>
-<p>
- The semantics of member function <code>operator[]</code> are not specified
+<p>The semantics of member function <code>operator[]</code> are not specified
in the C++ standard. A long-standing defect report calls for sensible
obvious semantics, which are already implemented here: <code>op[]</code>
on a const bitset returns a bool, and for a non-const bitset returns a
@@ -128,30 +134,31 @@ libstdc++-v3</a></h1>
<p>Finally, two additional searching functions have been added. They return
the index of the first &quot;on&quot; bit, and the index of the first
&quot;on&quot; bit that is after <code>prev</code>, respectively:
+</p>
<pre>
size_t _Find_first() const;
size_t _Find_next (size_t prev) const;</pre>
- The same caveat given for the _Unchecked_* functions applies here also.
+<p>The same caveat given for the _Unchecked_* functions applies here also.
</p>
<p>Return <a href="howto.html">to the main extensions page</a> or
<a href="http://gcc.gnu.org/libstdc++/">to the homepage</a>.
</p>
-<hr>
-<a name="ch24"><h3>Chapter 24</h3></a>
+<hr />
+<h3><a name="ch24">Chapter 24</a></h3>
<p>24.3.2 describes <code>struct iterator</code>, which didn't exist in the
original HP STL implementation (the language wasn't rich enough at the
time). For backwards compatibility, base classes are provided which
declare the same nested typedefs:
+</p>
<ul>
- <li>input_iterator
- <li>output_iterator
- <li>forward_iterator
- <li>bidirectional_iterator
- <li>random_access_iterator
+ <li>input_iterator</li>
+ <li>output_iterator</li>
+ <li>forward_iterator</li>
+ <li>bidirectional_iterator</li>
+ <li>random_access_iterator</li>
</ul>
-</p>
<p>24.3.4 describes iterator operation <code>distance</code>, which takes
two iterators and returns a result. It is extended by another signature
which takes two iterators and a reference to a result. The result is
@@ -162,50 +169,53 @@ libstdc++-v3</a></h1>
</p>
-<hr>
-<a name="ch25"><h3>Chapter 25</h3></a>
+<hr />
+<h3><a name="ch25">Chapter 25</a></h3>
<p>25.1.6 (count, count_if) is extended with two more versions of count
and count_if. The standard versions return their results. The
additional signatures return void, but take a final parameter by
reference to which they assign their results, e.g.,
+</p>
<pre>
void count (first, last, value, n);</pre>
-</p>
<p>25.2 (mutating algorithms) is extended with two families of signatures,
random_sample and random_sample_n.
</p>
<p>25.2.1 (copy) is extended with
+</p>
<pre>
copy_n (_InputIter first, _Size count, _OutputIter result);</pre>
- which copies the first 'count' elements at 'first' into 'result'.
+<p>which copies the first 'count' elements at 'first' into 'result'.
</p>
<p>25.3 (sorting 'n' heaps 'n' stuff) is extended with some helper
predicates. Look in the doxygen-generated pages for notes on these.
+</p>
<ul>
- <li><code>is_heap</code> tests whether or not a range is a heap.
+ <li><code>is_heap</code> tests whether or not a range is a heap.</li>
<li><code>is_sorted</code> tests whether or not a range is sorted in
- nondescending order.
+ nondescending order.</li>
</ul>
-</p>
<p>25.3.8 (lexigraphical_compare) is extended with
+</p>
<pre>
lexicographical_compare_3way(_InputIter1 first1, _InputIter1 last1,
_InputIter2 first2, _InputIter2 last2)</pre>
- which does... what?
+<p>which does... what?
</p>
<p>Return <a href="howto.html">to the main extensions page</a> or
<a href="http://gcc.gnu.org/libstdc++/">to the homepage</a>.
</p>
-<hr>
-<a name="ch26"><h3>Chapter 26</h3></a>
+<hr />
+<h3><a name="ch26">Chapter 26</a></h3>
<p>26.4, the generalized numeric operations such as accumulate, are extended
with the following functions:
+</p>
<pre>
power (x, n);
power (x, n, moniod_operation);</pre>
- Returns, in FORTRAN syntax, &quot;x ** n&quot; where n&gt;=0. In the
+<p>Returns, in FORTRAN syntax, &quot;x ** n&quot; where n&gt;=0. In the
case of n == 0, returns the <a href="#ch20">identity element</a> for the
monoid operation. The two-argument signature uses multiplication (for
a true &quot;power&quot; implementation), but addition is supported as well.
@@ -215,9 +225,9 @@ libstdc++-v3</a></h1>
Coolest Name. It &quot;assigns sequentially increasing values to a range.
That is, it assigns value to *first, value + 1 to *(first + 1) and so
on.&quot; Quoted from SGI documentation.
+</p>
<pre>
void iota(_ForwardIter first, _ForwardIter last, _Tp value);</pre>
-</p>
<p>Return <a href="howto.html">to the main extensions page</a> or
<a href="http://gcc.gnu.org/libstdc++/">to the homepage</a>.
</p>
@@ -225,7 +235,7 @@ libstdc++-v3</a></h1>
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/faq/index.html b/libstdc++-v3/docs/html/faq/index.html
index b795c652f60..c4f4e78a600 100644
--- a/libstdc++-v3/docs/html/faq/index.html
+++ b/libstdc++-v3/docs/html/faq/index.html
@@ -1,10 +1,14 @@
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++, libg++, STL">
- <meta name="DESCRIPTION" content="FAQ for the GNU libstdc++ effort.">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="FAQ for the GNU libstdc++ effort." />
<title>libstdc++-v3 FAQ</title>
-<link rel="StyleSheet" href="../lib3styles.css">
+<link rel="StyleSheet" href="../lib3styles.css" />
<!--
** Locations of "the most recent snapshot is the Nth" text are
** answers 1_1, 1_4, 4_1.
@@ -23,84 +27,92 @@
</p>
<p>To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>.
+</p>
<!-- ####################################################### -->
-<hr>
+<hr />
<h1>Questions</h1>
<ol>
<li><a href="#1_0">General Information</a>
<!-- I suspect these will mostly be links to/into existing documents. -->
<ol>
- <li><a href="#1_1">What is libstdc++-v3?</a>
- <li><a href="#1_2">Why should I use libstdc++?</a>
- <li><a href="#1_3">Who's in charge of it?</a>
- <li><a href="#1_4">How do I get libstdc++?</a>
- <li><a href="#1_5">When is libstdc++ going to be finished?</a>
- <li><a href="#1_6">How do I contribute to the effort?</a>
- <li><a href="#1_7">What happened to libg++? I need that!</a>
- <li><a href="#1_8">What if I have more questions?</a>
- <li><a href="#1_9">What are the license terms for libstdc++-v3?</a>
+ <li><a href="#1_1">What is libstdc++-v3?</a> </li>
+ <li><a href="#1_2">Why should I use libstdc++?</a> </li>
+ <li><a href="#1_3">Who's in charge of it?</a> </li>
+ <li><a href="#1_4">How do I get libstdc++?</a> </li>
+ <li><a href="#1_5">When is libstdc++ going to be finished?</a> </li>
+ <li><a href="#1_6">How do I contribute to the effort?</a> </li>
+ <li><a href="#1_7">What happened to libg++? I need that!</a> </li>
+ <li><a href="#1_8">What if I have more questions?</a> </li>
+ <li><a href="#1_9">What are the license terms for libstdc++-v3?</a> </li>
</ol>
+ </li>
<li><a href="#2_0">Installation</a>
<ol>
- <li><a href="#2_1">How do I install libstdc++-v3?</a>
- <li><a href="#2_2">[removed]</a>
+ <li><a href="#2_1">How do I install libstdc++-v3?</a> </li>
+ <li><a href="#2_2">[removed]</a> </li>
<li><a href="#2_3">What is this CVS thing that you keep
- mentioning?</a>
- <li><a href="#2_4">How do I know if it works?</a>
- <li><a href="#2_5">This library is HUGE! And what's libsupc++?</a>
+ mentioning?</a> </li>
+ <li><a href="#2_4">How do I know if it works?</a> </li>
+ <li><a href="#2_5">This library is HUGE! And what's libsupc++?</a> </li>
</ol>
+ </li>
<li><a href="#3_0">Platform-Specific Issues</a>
<ol>
<li><a href="#3_1">Can libstdc++-v3 be used with &lt;my
- favorite compiler&gt;?</a>
- <li><a href="#3_2">[removed]</a>
- <li><a href="#3_3">[removed]</a>
- <li><a href="#3_4">I can't use 'long long' on Solaris</a>
+ favorite compiler&gt;?</a> </li>
+ <li><a href="#3_2">[removed]</a> </li>
+ <li><a href="#3_3">[removed]</a> </li>
+ <li><a href="#3_4">I can't use 'long long' on Solaris</a> </li>
<li><a href="#3_5"><code>_XOPEN_SOURCE</code> /
<code>_GNU_SOURCE</code> / etc is always defined</a>
- <li><a href="#3_6">OS X ctype.h is broken! How can I hack it?</a>
+ </li>
+ <li><a href="#3_6">OS X ctype.h is broken! How can I hack it?</a> </li>
</ol>
+ </li>
<li><a href="#4_0">Known Bugs and Non-Bugs</a>
<ol>
- <li><a href="#4_1">What works already?</a>
- <li><a href="#4_2">Bugs in gcc/g++ (not libstdc++-v3)</a>
- <li><a href="#4_3">Bugs in the C++ language/lib specification</a>
+ <li><a href="#4_1">What works already?</a> </li>
+ <li><a href="#4_2">Bugs in gcc/g++ (not libstdc++-v3)</a> </li>
+ <li><a href="#4_3">Bugs in the C++ language/lib specification</a> </li>
<li><a href="#4_4">Things in libstdc++ that only look like bugs</a><ul>
- <li><a href="#4_4_iostreamclear">reopening a stream fails</a>
- <li><a href="#4_4_Weff">-Weffc++ complains too much</a>
+ <li><a href="#4_4_iostreamclear">reopening a stream fails</a> </li>
+ <li><a href="#4_4_Weff">-Weffc++ complains too much</a> </li>
<li><a href="#4_4_rel_ops">&quot;ambiguous overloads&quot;
- after including an old-style header</a>
+ after including an old-style header</a> </li>
<li><a href="#4_4_interface">The g++-3 headers are
- <strong>not ours</strong></a>
- <li><a href="#4_4_glibc">compilation errors from streambuf.h</a>
+ <strong>not ours</strong></a> </li>
+ <li><a href="#4_4_glibc">compilation errors from streambuf.h</a> </li>
<li><a href="#4_4_checks">errors about <em>*Concept</em> and
- <em>constraints</em> in the STL...</a>
+ <em>constraints</em> in the STL...</a> </li>
<li><a href="#4_4_dlsym">program crashes when using library code
- in a dynamically-loaded library</a>
+ in a dynamically-loaded library</a> </li>
</ul>
- <li><a href="#4_5">Aw, that's easy to fix!</a>
+ </li>
+ <li><a href="#4_5">Aw, that's easy to fix!</a> </li>
</ol>
+ </li>
<li><a href="#5_0">Miscellaneous</a>
<ol>
<li><a href="#5_1">string::iterator is not char*;
- vector&lt;T&gt;::iterator is not T*</a>
- <li><a href="#5_2">What's next after libstdc++-v3?</a>
- <li><a href="#5_3">What about the STL from SGI?</a>
- <li><a href="#5_4">Extensions and Backward Compatibility</a>
- <li><a href="#5_5">[removed]</a>
- <li><a href="#5_6">Is libstdc++-v3 thread-safe?</a>
- <li><a href="#5_7">How do I get a copy of the ISO C++ Standard?</a>
- <li><a href="#5_8">What's an ABI and why is it so messy?</a>
+ vector&lt;T&gt;::iterator is not T*</a> </li>
+ <li><a href="#5_2">What's next after libstdc++-v3?</a> </li>
+ <li><a href="#5_3">What about the STL from SGI?</a> </li>
+ <li><a href="#5_4">Extensions and Backward Compatibility</a> </li>
+ <li><a href="#5_5">[removed]</a> </li>
+ <li><a href="#5_6">Is libstdc++-v3 thread-safe?</a> </li>
+ <li><a href="#5_7">How do I get a copy of the ISO C++ Standard?</a> </li>
+ <li><a href="#5_8">What's an ABI and why is it so messy?</a> </li>
</ol>
+ </li>
</ol>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -127,7 +139,7 @@
official <a href="../17_intro/DESIGN">design document</a>.
</p>
-<hr>
+<hr />
<h2><a name="1_2">1.2 Why should I use libstdc++?</a></h2>
<p>The completion of the ISO C++ standardization gave the
C++ community a powerful set of reuseable tools in the form
@@ -153,13 +165,13 @@
nor be worried about platform-specific incompatibilities.
</p>
-<hr>
+<hr />
<h2><a name="1_3">1.3 Who's in charge of it?</a></h2>
<p>The libstdc++ project is contributed to by several developers
all over the world, in the same way as GCC or Linux.
Benjamin Kosnik, Gabriel Dos Reis, Phil Edwards, Ulrich Drepper,
- Loren James Rittle, and Paolo Carlini are the lead maintainers of
- the CVS archive.
+ Loren James Rittle, and Paolo Carlini are the lead maintainers of
+ the CVS archive.
</p>
<p>Development and discussion is held on the libstdc++ mailing
list. Subscribing to the list, or searching the list
@@ -168,7 +180,7 @@
If you have questions, ideas, code, or are just curious, sign up!
</p>
-<hr>
+<hr />
<h2><a name="1_4">1.4 How do I get libstdc++?</a></h2>
<p>The fourteenth (and latest) snapshot of libstdc++-v3 is
<a href="http://gcc.gnu.org/libstdc++/index.html#download">available
@@ -183,9 +195,9 @@
of the SGI STL.
</p>
-<hr>
+<hr />
<h2><a name="1_5">1.5 When is libstdc++ going to be finished?</a></h2>
-<!-- <p>Nathan Myers gave the best of all possible answers in <A
+<!-- <p>Nathan Myers gave the best of all possible answers in <a
href="http://www.deja.com/getdoc.xp?AN=469581698&fmt=text">a
Usenet article</a>.</p>
which is no longer available, thanks deja...-->
@@ -193,7 +205,7 @@ which is no longer available, thanks deja...-->
Usenet article asking this question: <em>Sooner, if you help.</em>
</p>
-<hr>
+<hr />
<h2><a name="1_6">1.6 How do I contribute to the effort?</a></h2>
<p>Here is <a href="../17_intro/contribute.html">a
page devoted to this topic</a>. Subscribing to the mailing
@@ -205,7 +217,7 @@ which is no longer available, thanks deja...-->
we all thought was working, is more than welcome!
</p>
-<hr>
+<hr />
<h2><a name="1_7">1.7 What happened to libg++? I need that!</a></h2>
<p>The most recent libg++ README states that libg++ is no longer
being actively maintained. It should not be used for new
@@ -244,7 +256,7 @@ which is no longer available, thanks deja...-->
describes where to find the last libg++ source.
</p>
-<hr>
+<hr />
<h2><a name="1_8">1.8 What if I have more questions?</a></h2>
<p>If you have read the README and RELEASE-NOTES files, and your
question remains unanswered, then just ask the mailing list.
@@ -260,13 +272,13 @@ which is no longer available, thanks deja...-->
or <a href="mailto:gdr@gcc.gnu.org">Gabriel Dos Reis</a>.
</p>
-<hr>
+<hr />
<h2><a name="1_9">1.9 What are the license terms for libstdc++-v3?</a></h2>
<p>See <a href="../17_intro/license.html">our license description</a>
for these and related questions.
</p>
-<hr>
+<hr />
<h1><a name="2_0">2.0 Installation</a></h1>
<h2><a name="2_1">2.1 How do I install libstdc++-v3?</a></h2>
<p>Complete instructions are not given here (this is a FAQ, not
@@ -277,9 +289,12 @@ which is no longer available, thanks deja...-->
easier and more automated than building the GCC 2.[78]
series was. If you are using GCC 2.95, you can still
build earlier snapshots of libstdc++.
+ </li>
<li> GNU Make is recommended, but should not be required.
+ </li>
<li> The GNU Autotools are needed if you are messing with
the configury or makefiles.
+ </li>
</ul>
<p>The file <a href="../documentation.html">documentation.html</a>
provides a good overview of the steps necessary to build, install,
@@ -295,18 +310,18 @@ which is no longer available, thanks deja...-->
&quot;.../docs/17_intro/&quot; directory of the distribution.
</p>
-<hr>
+<hr />
<h2><a name="2_2">2.2 [removed]</a></h2>
<p>This question has become moot and has been removed. The stub
is here to preserve numbering (and hence links/bookmarks).
</p>
-<hr>
+<hr />
<h2><a name="2_3">2.3 What is this CVS thing that you
keep mentioning?</a></h2>
<p>The <em>Concurrent Versions System</em> is one of several revision
control packages. It was selected for GNU projects because it's
- free (speech), free (beer), and very high quality. The <A
+ free (speech), free (beer), and very high quality. The <a
href="http://www.gnu.org/software/cvs/cvs.html">CVS entry in
the GNU software catalogue</a> has a better description as
well as a
@@ -321,7 +336,7 @@ which is no longer available, thanks deja...-->
<!-- wonder how long that'll live -->
</p>
-<hr>
+<hr />
<h2><a name="2_4">2.4 How do I know if it works?</a></h2>
<p>libstdc++-v3 comes with its own testsuite. You do not need
to actually install the library (&quot;<code>make
@@ -337,7 +352,7 @@ which is no longer available, thanks deja...-->
<strong>please</strong> write up your idea and send it to the list!
</p>
-<hr>
+<hr />
<h2><a name="2_5">2.4 This library is HUGE! And what's libsupc++?</a></h2>
<p>Usually the size of libraries on disk isn't noticeable. When a
link editor (or simply &quot;linker&quot;) pulls things from a
@@ -387,7 +402,7 @@ which is no longer available, thanks deja...-->
when building the library.
</p>
-<hr>
+<hr />
<h1><a name="3_0">3.0 Platform-Specific Issues</a></h1>
<h2><a name="3_1">3.1 Can libstdc++-v3 be used with &lt;my
favorite compiler&gt;?</a></h2>
@@ -409,19 +424,19 @@ which is no longer available, thanks deja...-->
GCC/g++, however.
</p>
-<hr>
+<hr />
<h2><a name="3_2">3.2 [removed]</a></h2>
<p>This question has become moot and has been removed. The stub
is here to preserve numbering (and hence links/bookmarks).
</p>
-<hr>
+<hr />
<h2><a name="3_3">3.3 [removed]</a></h2>
<p>This question has become moot and has been removed. The stub
is here to preserve numbering (and hence links/bookmarks).
</p>
-<hr>
+<hr />
<h2><a name="3_4">3.4 I can't use 'long long' on Solaris</a></h2>
<p>By default we try to support the C99 <code>long long</code> type.
This requires that certain functions from your C library be present.
@@ -433,7 +448,7 @@ which is no longer available, thanks deja...-->
<p>This has been fixed for 3.0.3 and onwards.
</p>
-<hr>
+<hr />
<h2><a name="3_5">3.5 <code>_XOPEN_SOURCE</code> / <code>_GNU_SOURCE</code>
/ etc is always defined</a></h2>
<p>On Solaris, g++ (but not gcc) always defines the preprocessor
@@ -465,13 +480,13 @@ which is no longer available, thanks deja...-->
a list of predefined macros for any particular installation.
</p>
<p>This has been discussed on the mailing lists
- <a href="http://gcc.gnu.org/cgi-bin/htsearch?method=and&format=builtin-long&sort=score&words=_XOPEN_SOURCE+Solaris">quite a bit</a>.
+ <a href="http://gcc.gnu.org/cgi-bin/htsearch?method=and&amp;format=builtin-long&amp;sort=score&amp;words=_XOPEN_SOURCE+Solaris">quite a bit</a>.
</p>
<p>This method is something of a wart. We'd like to find a cleaner
solution, but nobody yet has contributed the time.
</p>
-<hr>
+<hr />
<h2><a name="3_6">3.6 OS X ctype.h is broken! How can I hack it?</a></h2>
<p>This is a long-standing bug in the OS X support. Fortunately,
the patch is quite simple, and well-known.
@@ -479,7 +494,7 @@ which is no longer available, thanks deja...-->
link to the solution.</a>
</p>
-<hr>
+<hr />
<h1><a name="4_0">4.0 Known Bugs and Non-Bugs</a></h1>
<em>Note that this section can get rapdily outdated -- such is the
nature of an open-source project. For the latest information, join
@@ -571,7 +586,7 @@ New:
</pre>
-<hr>
+<hr />
<h2><a name="4_2">4.2 Bugs in gcc/g++ (not libstdc++-v3)</a></h2>
<p>This is by no means meant to be complete nor exhaustive, but
mentions some problems that users may encounter when building
@@ -596,7 +611,7 @@ New:
experiences. :-)</li>
</ul>
-<hr>
+<hr />
<h2><a name="4_3">4.3 Bugs in the C++ language/lib specification</a></h2>
<p>Yes, unfortunately, there are some. In a
<a href="http://gcc.gnu.org/ml/libstdc++/1998/msg00006.html">message
@@ -615,28 +630,26 @@ New:
Some of these have resulted in <a href="#5_2">code changes</a>.
</p>
-<hr>
+<hr />
<h2><a name="4_4">4.4 Things in libstdc++ that only look like bugs</a></h2>
<p>There are things which are not bugs in the compiler (4.2) nor
the language specification (4.3), but aren't really bugs in
libstdc++, either. Really! Please do not report these as bugs.
</p>
- <a name="4_4_Weff">
- <p><strong>-Weffc++</strong>
- The biggest of these is the quadzillions of warnings about the
- library headers emitted when <code>-Weffc++</code> is used. Making
- libstdc++ &quot;-Weffc++-clean&quot; is not a goal of the project,
- for a few reasons. Mainly, that option tries to enforce
- object-oriented programming, while the Standard Library isn't
- necessarily trying to be OO.
- </p>
- </a>
- <a name="4_4_iostreamclear">
- <p><strong>reopening a stream fails</strong>
- Did I just say that -Weffc++ was our biggest false-bug report? I
- lied. (It used to be.) Today it seems to be reports that after
- executing a sequence like
- <pre>
+ <p><a name="4_4_Weff"><strong>-Weffc++</strong></a>
+ The biggest of these is the quadzillions of warnings about the
+ library headers emitted when <code>-Weffc++</code> is used. Making
+ libstdc++ &quot;-Weffc++-clean&quot; is not a goal of the project,
+ for a few reasons. Mainly, that option tries to enforce
+ object-oriented programming, while the Standard Library isn't
+ necessarily trying to be OO.
+ </p>
+ <p><a name="4_4_iostreamclear"><strong>reopening a stream fails</strong>
+ </a> Did I just say that -Weffc++ was our biggest false-bug report?
+ I lied. (It used to be.) Today it seems to be reports that after
+ executing a sequence like
+ </p>
+ <pre>
#include &lt;fstream&gt;
...
std::fstream fs(&quot;a_file&quot;);
@@ -645,59 +658,54 @@ New:
// .
fs.close();
fs.open(&quot;a_new_file&quot;);</pre>
- all operations on the re-opened <code>fs</code> will fail, or at
- least act very strangely. Yes, they often will, especially if
- <code>fs</code> reached the EOF state on the previous file. The
- reason is that the state flags are <strong>not</strong> cleared
- on a successful call to open(). The standard unfortunately did
- not specify behavior in this case, and to everybody's great sorrow,
- the <a href="../ext/howto.html#5">proposed LWG resolution</a> (see
- DR #22) is to leave the flags unchanged. You must insert a call
- to <code>fs.clear()</code> between the calls to close() and open(),
- and then everything will work like we all expect it to work.
- </p>
- </a>
- <a name="4_4_rel_ops">
- <p><strong>rel_ops</strong>
- Another is the <code>rel_ops</code> namespace and the template
- comparison operator functions contained therein. If they become
- visible in the same namespace as other comparison functions
- (e.g., '<code>using</code>' them and the &lt;iterator&gt; header),
- then you will suddenly be faced with huge numbers of ambiguity
- errors. This was discussed on the -v3 list; Nathan Myers
- <a href="http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html">sums
- things up here</a>. The collisions with vector/string iterator
- types have been fixed for 3.1. <!-- more links to email here -->
- </p>
- </a>
- <a name="4_4_interface"><h3>The g++-3 headers are
- <em>not ours</em></h3>
- <p>If you have found an extremely broken header file which is
- causing problems for you, look carefully before submitting a
- &quot;high&quot; priority bug report (which you probably shouldn't
- do anyhow; see the last paragraph of the page describing
+ <p>all operations on the re-opened <code>fs</code> will fail, or at
+ least act very strangely. Yes, they often will, especially if
+ <code>fs</code> reached the EOF state on the previous file. The
+ reason is that the state flags are <strong>not</strong> cleared
+ on a successful call to open(). The standard unfortunately did
+ not specify behavior in this case, and to everybody's great sorrow,
+ the <a href="../ext/howto.html#5">proposed LWG resolution</a> (see
+ DR #22) is to leave the flags unchanged. You must insert a call
+ to <code>fs.clear()</code> between the calls to close() and open(),
+ and then everything will work like we all expect it to work.
+ </p>
+ <p><a name="4_4_rel_ops"><strong>rel_ops</strong></a>
+ Another is the <code>rel_ops</code> namespace and the template
+ comparison operator functions contained therein. If they become
+ visible in the same namespace as other comparison functions
+ (e.g., '<code>using</code>' them and the &lt;iterator&gt; header),
+ then you will suddenly be faced with huge numbers of ambiguity
+ errors. This was discussed on the -v3 list; Nathan Myers
+ <a href="http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html">sums
+ things up here</a>. The collisions with vector/string iterator
+ types have been fixed for 3.1. <!-- more links to email here -->
+ </p>
+ <h3><a name="4_4_interface">The g++-3 headers are <em>not ours</em></a></h3>
+ <p>If you have found an extremely broken header file which is
+ causing problems for you, look carefully before submitting a
+ &quot;high&quot; priority bug report (which you probably shouldn't
+ do anyhow; see the last paragraph of the page describing
<a href="http://gcc.gnu.org/gnatswrite.html">the GCC bug database</a>).
- </p>
- <p>If the headers are in <code>${prefix}/include/g++-3</code>, or if
- the installed library's name looks like <code>libstdc++-2.10.a</code>
- or <code>libstdc++-libc6-2.10.so</code>,
- then you are using the old libstdc++-v2 library, which is nonstandard
- and unmaintained. Do not report problems with -v2 to the -v3
- mailing list.
- </p>
- <p>Currently our header files are installed in
- <code>${prefix}/include/g++-v3</code> (see the 'v'?). This may
- change with the next release of GCC, as it may be too confusing,
- but <a href="http://gcc.gnu.org/ml/gcc/2000-10/msg00732.html">the
- question has not yet been decided</a>.
- </p>
- </a>
- <a name="4_4_glibc">
- <p><strong>glibc</strong>
- If you're on a GNU/Linux system and have just upgraded to
- glibc 2.2, but are still using gcc 2.95.2, then you should have
- read the glibc FAQ, specifically 2.34:
- <pre>
+ </p>
+ <p>If the headers are in <code>${prefix}/include/g++-3</code>, or if
+ the installed library's name looks like <code>libstdc++-2.10.a</code>
+ or <code>libstdc++-libc6-2.10.so</code>,
+ then you are using the old libstdc++-v2 library, which is nonstandard
+ and unmaintained. Do not report problems with -v2 to the -v3
+ mailing list.
+ </p>
+ <p>Currently our header files are installed in
+ <code>${prefix}/include/g++-v3</code> (see the 'v'?). This may
+ change with the next release of GCC, as it may be too confusing,
+ but <a href="http://gcc.gnu.org/ml/gcc/2000-10/msg00732.html">the
+ question has not yet been decided</a>.
+ </p>
+ <p><a name="4_4_glibc"><strong>glibc</strong></a>
+ If you're on a GNU/Linux system and have just upgraded to
+ glibc 2.2, but are still using gcc 2.95.2, then you should have
+ read the glibc FAQ, specifically 2.34:
+ </p>
+ <pre>
2.34. When compiling C++ programs, I get a compilation error in streambuf.h.
{BH} You are using g++ 2.95.2? After upgrading to glibc 2.2, you need to
@@ -705,34 +713,31 @@ apply a patch to the include files in /usr/include/g++, because the fpos_t
type has changed in glibc 2.2. The patch is at
http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
</pre>
- Note that 2.95.x shipped with the
- <a href="#4_4_interface">old v2 library</a> which is no longer
- maintained. Also note that gcc 2.95.3 fixes this problem, but
- requires a separate patch for libstdc++-v3.
- </p>
- </a>
- <a name="4_4_checks">
- <p><strong>concept checks</strong>
- If you see compilation errors containing messages about
- <code> <em>foo</em>Concept </code>and a<code> constraints </code>
- member function, then most likely you have violated one of the
- requirements for types used during instantiation of template
- containers and functions. For example, EqualityComparableConcept
- appears if your types must be comparable with == and you have not
- provided this capability (a typo, or wrong visibility, or you
- just plain forgot, etc).
- </p>
- <p>More information, including how to optionally enable/disable the
- checks, is available
- <a href="../19_diagnostics/howto.html#3">here</a>.
- </p>
- </a>
- <a name="4_4_dlsym">
- <p><strong>dlopen/dlsym</strong>
- If you are using the C++ library across dynamically-loaded
- objects, make certain that you are passing the correct options
- when compiling and linking:
- <pre>
+ <p>Note that 2.95.x shipped with the
+ <a href="#4_4_interface">old v2 library</a> which is no longer
+ maintained. Also note that gcc 2.95.3 fixes this problem, but
+ requires a separate patch for libstdc++-v3.
+ </p>
+ <p><a name="4_4_checks"><strong>concept checks</strong></a>
+ If you see compilation errors containing messages about
+ <code> <em>foo</em>Concept </code>and a<code> constraints </code>
+ member function, then most likely you have violated one of the
+ requirements for types used during instantiation of template
+ containers and functions. For example, EqualityComparableConcept
+ appears if your types must be comparable with == and you have not
+ provided this capability (a typo, or wrong visibility, or you
+ just plain forgot, etc).
+ </p>
+ <p>More information, including how to optionally enable/disable the
+ checks, is available
+ <a href="../19_diagnostics/howto.html#3">here</a>.
+ </p>
+ <p><a name="4_4_dlsym"><strong>dlopen/dlsym</strong></a>
+ If you are using the C++ library across dynamically-loaded
+ objects, make certain that you are passing the correct options
+ when compiling and linking:
+ </p>
+ <pre>
// compile the library components
g++ -fPIC -c a.cc
g++ -fPIC -c b.cc
@@ -743,10 +748,9 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o
// link the executable
- g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl</pre></p>
- </a>
+ g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl</pre>
-<hr>
+<hr />
<h2><a name="4_5">4.5 Aw, that's easy to fix!</a></h2>
<p>If you have found a bug in the library and you think you have
a working fix, then send it in! The main GCC site has a page
@@ -765,7 +769,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
<a href="#2_4">testsuite</a> -- but only if such a test exists.
</p>
-<hr>
+<hr />
<h1><a name="5_0">5.0 Miscellaneous</a></h1>
<h2><a name="5_1">5.1 string::iterator is not char*;
vector&lt;T&gt;::iterator is not T*</a></h2>
@@ -786,7 +790,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
vector&lt;&gt; (but not for basic_string&lt;&gt;).
</p>
-<hr>
+<hr />
<h2><a name="5_2">5.2 What's next after libstdc++-v3?</a></h2>
<p>Hopefully, not much. The goal of libstdc++-v3 is to produce
a fully-compliant, fully-portable Standard Library. After that,
@@ -802,16 +806,16 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
we add code to the library based on what the current proposed
resolution specifies. Those additions are listed in
<a href="../ext/howto.html#5">the extensions page</a>.
- </p>
+ </p></li>
<li><p>Performance tuning. Lots of performance tuning. This too is
already underway for post-3.0 releases, starting with memory
expansion in container classes and buffer usage in synchronized
stream objects.
- </p>
+ </p></li>
<li><p>An ABI for libstdc++ is being developed, so that
multiple binary-incompatible copies of the library can be replaced
with a single backwards-compatible library, like libgcc_s.so is.
- </p>
+ </p></li>
<li><p>The current libstdc++ contains extensions to the Library which
must be explicitly requested by client code (for example, the
hash tables from SGI). Other extensions may be added to
@@ -819,7 +823,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
(For example, the &quot;long long&quot; type from C99.)
Bugfixes and rewrites (to improve or fix thread safety, for
instance) will of course be a continuing task.
- </p>
+ </p></li>
</ol>
<p><a href="http://gcc.gnu.org/ml/libstdc++/1999/msg00080.html">This
question</a> about the next libstdc++ prompted some brief but
@@ -827,7 +831,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
<a href="http://gcc.gnu.org/ml/libstdc++/1999/msg00084.html">speculation</a>.
</p>
-<hr>
+<hr />
<h2><a name="5_3">5.3 What about the STL from SGI?</a></h2>
<p>The <a href="http://www.sgi.com/Technology/STL/">STL from SGI</a>,
version 3.3, was the most recent merge of the STL codebase. The
@@ -844,14 +848,15 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
recommended reading.
</p>
-<hr>
+<hr />
<h2><a name="5_4">5.4 Extensions and Backward Compatibility</a></h2>
<p>Headers in the <code>ext</code> and <code>backward</code>
subdirectories should be referred to by their relative paths:
<!-- Careful, the leading spaces in PRE show up directly. -->
- <pre>
+ </p>
+ <pre>
#include &lt;ext/hash_map&gt; </pre>
- rather than using <code>-I</code> or other options. This is more
+ <p>rather than using <code>-I</code> or other options. This is more
portable and forward-compatible. (The situation is the same as
that of other headers whose directories are not searched directly,
e.g., <code>&lt;sys/stat.h&gt;</code>, <code>&lt;X11/Xlib.h&gt;</code>.
@@ -860,13 +865,13 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
<a href="../ext/howto.html">their own page</a>.
</p>
-<hr>
+<hr />
<h2><a name="5_5">5.5 [removed]</a></h2>
<p>This question has become moot and has been removed. The stub
is here to preserve numbering (and hence links/bookmarks).
</p>
-<hr>
+<hr />
<h2><a name="5_6">5.6 Is libstdc++-v3 thread-safe?</a></h2>
<p>When the system's libc is itself thread-safe, a non-generic
implementation of atomicity.h exists for the architecture, and gcc
@@ -877,7 +882,8 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
what object locks must be held based on the objects referenced in
a method call. Without getting into great detail, here is an
example which requires user-level locks:
- <pre>
+ </p>
+ <pre>
library_class_a shared_object_a;
thread_main () {
@@ -887,18 +893,17 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
}
// Multiple copies of thread_main() are started in independent threads.</pre>
- </p>
<p>Under the assumption that object_a and object_b are never exposed to
another thread, here is an example that should not require any
user-level locks:
- <pre>
+ </p>
+ <pre>
thread_main () {
library_class_a object_a;
library_class_b *object_b = new library_class_b;
object_a.add_b (object_b);
object_a.mutate ();
} </pre>
- </p>
<p>All library objects are safe to use in a multithreaded program as
long as each thread carefully locks out access by any other thread
while it uses any object visible to another thread. In general,
@@ -913,7 +918,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
more information.
</p>
-<hr>
+<hr />
<h2><a name="5_7">5.7 How do I get a copy of the ISO C++ Standard?</a></h2>
<p>Copies of the full ISO 14882 standard are available on line via the
ISO mirror site for committee members. Non-members, or those who
@@ -931,7 +936,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
<a href="http://www.iso.ch/">ISO homepage</a> and find out!
</p>
-<hr>
+<hr />
<h2><a name="5_8">5.8 What's an ABI and why is it so messy?</a></h2>
<p>&quot;ABI&quot; stands for &quot;Application Binary Interface.&quot;
Conventionally, it refers to a great mass of details about how
@@ -980,7 +985,7 @@ http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/faq/index.txt b/libstdc++-v3/docs/html/faq/index.txt
index 30f32d3609f..59632af35d4 100644
--- a/libstdc++-v3/docs/html/faq/index.txt
+++ b/libstdc++-v3/docs/html/faq/index.txt
@@ -106,8 +106,8 @@
The libstdc++ project is contributed to by several developers all over
the world, in the same way as GCC or Linux. Benjamin Kosnik, Gabriel
- Dos Reis, Phil Edwards, Ulrich Drepper, Loren James Rittle, and
- Paolo Carlini are the lead maintainers of the CVS archive.
+ Dos Reis, Phil Edwards, Ulrich Drepper, Loren James Rittle, and Paolo
+ Carlini are the lead maintainers of the CVS archive.
Development and discussion is held on the libstdc++ mailing list.
Subscribing to the list, or searching the list archives, is open to
diff --git a/libstdc++-v3/docs/html/install.html b/libstdc++-v3/docs/html/install.html
index 6c2f6668d92..58439330200 100644
--- a/libstdc++-v3/docs/html/install.html
+++ b/libstdc++-v3/docs/html/install.html
@@ -1,12 +1,16 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)">
- <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++">
- <meta name="DESCRIPTION" content="README for the GNU libstdc++ effort.">
- <meta name="GENERATOR" content="vi and eight fingers">
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++" />
+ <meta name="DESCRIPTION" content="README for the GNU libstdc++ effort." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
<title>libstdc++-v3 Installation Instructions</title>
-<link rel="StyleSheet" href="lib3styles.css">
+<link rel="StyleSheet" href="lib3styles.css" />
</head>
<body>
@@ -18,21 +22,22 @@
</p>
<p>To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>.
+</p>
<!-- ####################################################### -->
-<hr>
+<hr />
<h2>Contents</h2>
<ul>
- <li><a href="#prereqs">Tools you will need beforehand</a>
- <li><a href="#srcsetup">Setting up the source directories</a>
- <li><a href="#config">Configuring</a>
- <li><a href="#install">Building and installing the library</a>
- <li><a href="#postinstall">Post-installation</a>
- <li><a href="#usage">Using the library</a>
+ <li><a href="#prereqs">Tools you will need beforehand</a></li>
+ <li><a href="#srcsetup">Setting up the source directories</a></li>
+ <li><a href="#config">Configuring</a></li>
+ <li><a href="#install">Building and installing the library</a></li>
+ <li><a href="#postinstall">Post-installation</a></li>
+ <li><a href="#usage">Using the library</a></li>
</ul>
-<hr>
+<hr />
<!-- ####################################################### -->
@@ -88,22 +93,32 @@
features if the underlying support is present.
</p>
- <p>Finally, a few system-specific requirements: </p>
- <dl>
+ <p>Finally, a few system-specific requirements: </p>
+ <dl>
<dt> linux </dt>
- <dd>If you are using gcc 3.1 or later on linux, and are using
- the gnu locale model (enabled by default for sufficient
- versions of glibc), the following locales are used and tested
- in the libstdc++ testsuites: en_HK, en_US, fr_FR, fr_FR@euro,
- de_DE, de_DE@euro, ja_JP.eucjp, and it_IT. Failure to have the
- underlying "C" library locale information installed will mean
- that C++ named locales for the above regions will not work:
- because of this, the libstdc++ testsuite will not pass the
- named locale tests. If this isn't an issue, don't worry about
- it. If named locales are needed, the underlying locale
- information must be installed. Note that rebuilding libstdc++
- after locales are installed is not necessary.
+ <dd>If gcc 3.1.0 or later on is being used on linux, an attempt
+ will be made to use "C" library functionality necessary for C++
+ named locale support.
+
+ <p>
+ The configure option --enable-clocale can be used force a
+ particular behavior.
+ </p>
+
+ <p>
+ If the 'gnu' locale model is being used, the following locales
+ are used and tested in the libstdc++ testsuites: en_HK, en_US,
+ fr_FR, fr_FR@euro, de_DE, de_DE@euro, ja_JP.eucjp, es_MX, en_PH,
+ and it_IT. Failure to have the underlying "C" library locale
+ information installed will mean that C++ named locales for the
+ above regions will not work: because of this, the libstdc++
+ testsuite will not pass the named locale tests. If this isn't an
+ issue, don't worry about it. If named locales are needed, the
+ underlying locale information must be installed. Note that
+ rebuilding libstdc++ after the "C" locales are installed is not
+ necessary.
+ </p>
<p> To install
support for locales, do only one of the following: </p>
@@ -119,9 +134,9 @@
</li>
</ul>
</dd>
- </dl>
+ </dl>
-<hr>
+<hr />
<h2><a name="srcsetup">Setting up the source directories</a></h2>
<p>The following definitions will be used throughout the rest of this
@@ -131,15 +146,20 @@
<li><em>gccsrcdir</em>: The directory holding the source of the
compiler. It should have several subdirectories like
<em>gccsrcdir</em>/libiberty and <em>gccsrcdir</em>/gcc.
+ </li>
<li><em>libsrcdir</em>: The directory holding the source of the
C++ library.
+ </li>
<li><em>gccbuilddir</em>: The build directory for the compiler
in <em>gccsrcdir</em>. GCC requires that it be built in
a different directory than its sources.
+ </li>
<li><em>libbuilddir</em>: The build directory for libstdc++.
+ </li>
<li><em>destdir</em>: The eventual installation directory for
the compiler/libraries, set with the --prefix option to
the configure script.
+ </li>
</ul>
<p> Note: </p>
<ol>
@@ -147,10 +167,12 @@
library that comes with the compiler, so <em>libsrcdir</em>
and <em>libbuilddir</em> must be contained under
<em>gccsrcdir</em> and <em>gccbuilddir</em>, respectively.
+ </li>
<li>The source, build, and installation directories should
not be parents of one another; i.e., these should all be
separate directories. Please don't build out of the
source directory.
+ </li>
</ol>
<p>Check out or download the GCC sources: the resulting source directory
@@ -175,7 +197,7 @@
mv <em>libsrcdir</em> libstdc++-v3</pre>
-<hr>
+<hr />
<h2><a name="config">Configuring</a></h2>
<p>If you have never done this before, you should read the basic
<a href="http://gcc.gnu.org/install/">GCC Installation
@@ -196,7 +218,7 @@
<em>gccsrcdir</em>/configure --prefix=<em>destdir</em> --other-opts...</pre>
-<hr>
+<hr />
<h2><a name="install">Building and installing the library</a></h2>
<p>Now you have a few options:</p>
<h3>[re]building <em>everything</em></h3>
@@ -236,14 +258,14 @@
make install-target-libstdc++-v3</pre>
-<hr>
+<hr />
<h2><a name="postinstall">Post-installation</a></h2>
<p>Installation will create the <em>destdir</em> directory and
populate it with subdirectories:
</p>
<pre>
lib/
- include/g++-v3/
+ include/c++/<em>gcc-version</em>
backward/
bits/
<em>cpu-vendor-os</em>/bits/
@@ -265,8 +287,24 @@
<a href="faq/index.html#2_4">FAQ 2.4</a> for which files to examine.
</p>
+ <p> In addition, there are some testing options that are mostly of
+ interest to library maintainers and system integrators. As such,
+ these tests may not work on all cpu and host combinations. These
+ options include, but are not necessarily limited to, the following:
+
+ <p>The library ABI can be tested using</p>
+ <pre>
+ make check-abi</pre>
+
+ <p>The library can also be tested using a bash script, instead of
+ the default dejagnu test harness</p>
+ <pre>
+ make check-script</pre>
+ or
+ <pre>
+ make check-script-install</pre>
-<hr>
+<hr />
<h2><a name="usage">Using the library</a></h2>
<h3>Find the new library at runtime (shared linking only)</h3>
<p>If you only built a static library (libstdc++.a), or if you
@@ -279,23 +317,25 @@
the usual ones are printed to the screen during installation.
They include:
</p>
- <ul>
+ <ul>
<li>At runtime set LD_LIBRARY_PATH in your environment correctly,
so that the shared library for libstdc++ can be found and
loaded. Be certain that you understand all of the other
implications and behavior of LD_LIBRARY_PATH first (few
people do, and they get into trouble).
+ </li>
<li>Compile the path to find the library at runtime into the
program. This can be done by passing certain options to g++,
which will in turn pass them on to the linker. The exact
format of the options is dependent on which linker you use:
<ul>
- <li>GNU ld (default on Linux):<code> -Wl,--rpath,<em>destdir</em>/lib</code>
- <li>IRIX ld:<code> -Wl,-rpath,<em>destdir</em>/lib</code>
- <li>Solaris ld:<code> -Wl,-R<em>destdir</em>/lib</code>
- <li>More...? Let us know!
+ <li>GNU ld (default on Linux):<code> -Wl,--rpath,<em>destdir</em>/lib</code></li>
+ <li>IRIX ld:<code> -Wl,-rpath,<em>destdir</em>/lib</code></li>
+ <li>Solaris ld:<code> -Wl,-R<em>destdir</em>/lib</code></li>
+ <li>More...? Let us know!</li>
</ul>
- </ul>
+ </li>
+ </ul>
<p>Use the <code>ldd(1)</code> utility to show which library the system
thinks it will get at runtime.
</p>
@@ -306,7 +346,7 @@
<!--
-<hr>
+<hr />
<h2><a name=""></a></h2>
<p>
</p>
@@ -315,7 +355,7 @@
<!-- ####################################################### -->
-<hr>
+<hr />
<p class="fineprint"><em>
See <a href="17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
diff --git a/libstdc++-v3/docs/html/makedoc.awk b/libstdc++-v3/docs/html/makedoc.awk
new file mode 100644
index 00000000000..9da77d9c1a1
--- /dev/null
+++ b/libstdc++-v3/docs/html/makedoc.awk
@@ -0,0 +1,69 @@
+# Take apart bits of HTML and puts them back together again in new and
+# fascinating ways. Copyright (C) 2002 Free Software Foundation, Inc.
+# Contributed by Phil Edwards <pme@gcc.gnu.org>. Simple two-state automaton
+# inspired by Richard Henderson's gcc/mkmap-symver.awk.
+
+# 'file' is the name of the file on stdin
+# 'title' is the text to print at the start of the list
+
+BEGIN {
+ state = "looking";
+ entries = 0;
+ printf (" <li>%s\n", title);
+ printf (" <ul>\n");
+}
+
+# Searching for the little table of contents at the top.
+state == "looking" && /^<h1>Contents/ {
+ state = "entries";
+ next;
+}
+
+# Ignore everything else up to that point.
+state == "looking" {
+ next;
+}
+
+# An entry in the table of contents. Pull that line apart.
+state == "entries" && /<li>/ {
+ extract_info($0);
+ next;
+}
+
+# End of the list. Don't bother reading the rest of the file. (It could
+# also contain more <li>'s, so that would be incorrect as well as wasteful.)
+state == "entries" && /^<\/ul>/ {
+ exit;
+}
+
+END {
+ for (i = 0; i < entries; i++)
+ printf (" %s\n", entry[i]);
+ printf (" </ul>\n </li>\n\n");
+}
+
+function extract_info(line) {
+ # thistarget will be things like "#5" or "elsewhere.html"
+ match(line,"href=\".*\"");
+ thistarget = substr(line,RSTART+6,RLENGTH-7);
+
+ # take apart the filename
+ split(file,X,"/");
+ if (thistarget ~ /^#/) {
+ # local name, use directory and filename
+ target = file thistarget
+ } else {
+ # different file, only use directory
+ target = X[1] "/" thistarget
+ }
+
+ # visible text
+ gsub("</a></li>","",line);
+ start = index(line,"\">") + 2;
+ thistext = substr(line,start);
+
+ # Assemble and store the HTML for later output.
+ entry[entries++] = "<li><a href=\"" target "\">" thistext "</a></li>"
+}
+
+# vim:sw=2
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 0563d2fb989..da7646aed05 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -47,7 +47,6 @@ bits_headers = \
${bits_srcdir}/fpos.h \
${bits_srcdir}/fstream.tcc \
${bits_srcdir}/functexcept.h \
- ${bits_srcdir}/generic_shadow.h \
${bits_srcdir}/gslice.h \
${bits_srcdir}/gslice_array.h \
${bits_srcdir}/indirect_array.h \
@@ -312,8 +311,7 @@ target_headers = \
${target_srcdir}/ctype_inline.h \
${target_srcdir}/ctype_noninline.h \
${target_srcdir}/os_defines.h \
- ${glibcpp_srcdir}/@ATOMICITY_INC_SRCDIR@/atomicity.h \
- ${glibcpp_srcdir}/@CPU_LIMITS_INC_SRCDIR@/cpu_limits.h
+ ${glibcpp_srcdir}/@ATOMICITY_INC_SRCDIR@/atomicity.h
# These target_headers_extra files are all built with ad hoc naming rules.
target_headers_extra = \
${target_builddir}/basic_file.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 35c7e9076ed..5441e974d4f 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -74,7 +74,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXXCPP = @CXXCPP@
C_INCLUDE_DIR = @C_INCLUDE_DIR@
@@ -154,7 +153,6 @@ bits_headers = \
${bits_srcdir}/fpos.h \
${bits_srcdir}/fstream.tcc \
${bits_srcdir}/functexcept.h \
- ${bits_srcdir}/generic_shadow.h \
${bits_srcdir}/gslice.h \
${bits_srcdir}/gslice_array.h \
${bits_srcdir}/indirect_array.h \
@@ -415,8 +413,7 @@ target_headers = \
${target_srcdir}/ctype_inline.h \
${target_srcdir}/ctype_noninline.h \
${target_srcdir}/os_defines.h \
- ${glibcpp_srcdir}/@ATOMICITY_INC_SRCDIR@/atomicity.h \
- ${glibcpp_srcdir}/@CPU_LIMITS_INC_SRCDIR@/cpu_limits.h
+ ${glibcpp_srcdir}/@ATOMICITY_INC_SRCDIR@/atomicity.h
# These target_headers_extra files are all built with ad hoc naming rules.
target_headers_extra = \
diff --git a/libstdc++-v3/include/backward/alloc.h b/libstdc++-v3/include/backward/alloc.h
index 4344a1d902c..9482e4cfeba 100644
--- a/libstdc++-v3/include/backward/alloc.h
+++ b/libstdc++-v3/include/backward/alloc.h
@@ -53,10 +53,6 @@ using std::__debug_alloc;
using std::__alloc;
using std::__single_client_alloc;
using std::allocator;
-#ifdef __USE_MALLOC
-using std::malloc_alloc;
-#else
using std::__default_alloc_template;
-#endif
#endif
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index b7d826dc08b..0f7247f7c9a 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -38,7 +38,7 @@
*/
#ifndef _CPP_BITS_STRING_H
-#define _CPP_BITS_STRING_H 1
+#define _CPP_BITS_STRING_H 1
#pragma GCC system_header
@@ -46,44 +46,64 @@
namespace std
{
- // Documentation? What's that?
- // Nathan Myers <ncm@cantrip.org>.
- //
- // A string looks like this:
- //
- // [_Rep]
- // _M_length
- // [basic_string<char_type>] _M_capacity
- // _M_dataplus _M_state
- // _M_p ----------------> unnamed array of char_type
-
- // Where the _M_p points to the first character in the string, and
- // you cast it to a pointer-to-_Rep and subtract 1 to get a
- // pointer to the header.
-
- // This approach has the enormous advantage that a string object
- // requires only one allocation. All the ugliness is confined
- // within a single pair of inline functions, which each compile to
- // a single "add" instruction: _Rep::_M_data(), and
- // string::_M_rep(); and the allocation function which gets a
- // block of raw bytes and with room enough and constructs a _Rep
- // object at the front.
-
- // The reason you want _M_data pointing to the character array and
- // not the _Rep is so that the debugger can see the string
- // contents. (Probably we should add a non-inline member to get
- // the _Rep for the debugger to use, so users can check the actual
- // string length.)
-
- // Note that the _Rep object is a POD so that you can have a
- // static "empty string" _Rep object already "constructed" before
- // static constructors have run. The reference-count encoding is
- // chosen so that a 0 indicates one reference, so you never try to
- // destroy the empty-string _Rep object.
-
- // All but the last paragraph is considered pretty conventional
- // for a C++ string implementation.
-
+ /**
+ * @class basic_string basic_string.h <string>
+ * @brief Managing sequences of characters and character-like objects.
+ *
+ * @ingroup Containers
+ * @ingroup Sequences
+ *
+ * Meets the requirements of a <a href="tables.html#65">container</a>, a
+ * <a href="tables.html#66">reversible container</a>, and a
+ * <a href="tables.html#67">sequence</a>. Of the
+ * <a href="tables.html#68">optional sequence requirements</a>, only
+ * @c push_back, @c at, and array access are supported.
+ *
+ * @doctodo
+ *
+ *
+ * @if maint
+ * Documentation? What's that?
+ * Nathan Myers <ncm@cantrip.org>.
+ *
+ * A string looks like this:
+ *
+ * @code
+ * [_Rep]
+ * _M_length
+ * [basic_string<char_type>] _M_capacity
+ * _M_dataplus _M_state
+ * _M_p ----------------> unnamed array of char_type
+ * @endcode
+ *
+ * Where the _M_p points to the first character in the string, and
+ * you cast it to a pointer-to-_Rep and subtract 1 to get a
+ * pointer to the header.
+ *
+ * This approach has the enormous advantage that a string object
+ * requires only one allocation. All the ugliness is confined
+ * within a single pair of inline functions, which each compile to
+ * a single "add" instruction: _Rep::_M_data(), and
+ * string::_M_rep(); and the allocation function which gets a
+ * block of raw bytes and with room enough and constructs a _Rep
+ * object at the front.
+ *
+ * The reason you want _M_data pointing to the character array and
+ * not the _Rep is so that the debugger can see the string
+ * contents. (Probably we should add a non-inline member to get
+ * the _Rep for the debugger to use, so users can check the actual
+ * string length.)
+ *
+ * Note that the _Rep object is a POD so that you can have a
+ * static "empty string" _Rep object already "constructed" before
+ * static constructors have run. The reference-count encoding is
+ * chosen so that a 0 indicates one reference, so you never try to
+ * destroy the empty-string _Rep object.
+ *
+ * All but the last paragraph is considered pretty conventional
+ * for a C++ string implementation.
+ * @endif
+ */
// 21.3 Template class basic_string
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
@@ -102,9 +122,9 @@ namespace std
typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
const_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
-
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+
private:
// _Rep: string representation
// Invariants:
@@ -125,7 +145,7 @@ namespace std
// Types:
typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
- // (Public) Data members:
+ // (Public) Data members:
// The maximum number of individual char_type elements of an
// individual string is determined by _S_max_size. This is the
@@ -133,10 +153,10 @@ namespace std
// is the maximum number of bytes the allocator can allocate.)
// If one was to divvy up the theoretical largest size string,
// with a terminating character and m _CharT elements, it'd
- // look like this:
+ // look like this:
// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
// Solving for m:
- // m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
+ // m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
// In addition, this implementation quarters this ammount.
static const size_type _S_max_size;
static const _CharT _S_terminal;
@@ -144,7 +164,7 @@ namespace std
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_references;
-
+
bool
_M_is_leaked() const
{ return _M_references < 0; }
@@ -154,50 +174,50 @@ namespace std
{ return _M_references > 0; }
void
- _M_set_leaked()
+ _M_set_leaked()
{ _M_references = -1; }
void
- _M_set_sharable()
+ _M_set_sharable()
{ _M_references = 0; }
- _CharT*
+ _CharT*
_M_refdata() throw()
{ return reinterpret_cast<_CharT*>(this + 1); }
- _CharT&
+ _CharT&
operator[](size_t __s) throw()
{ return _M_refdata() [__s]; }
- _CharT*
+ _CharT*
_M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
- {
- return (!_M_is_leaked() && __alloc1 == __alloc2)
- ? _M_refcopy() : _M_clone(__alloc1);
+ {
+ return (!_M_is_leaked() && __alloc1 == __alloc2)
+ ? _M_refcopy() : _M_clone(__alloc1);
}
// Create & Destroy
- static _Rep*
+ static _Rep*
_S_create(size_t, const _Alloc&);
- void
+ void
_M_dispose(const _Alloc& __a)
- {
- if (__exchange_and_add(&_M_references, -1) <= 0)
- _M_destroy(__a);
+ {
+ if (__exchange_and_add(&_M_references, -1) <= 0)
+ _M_destroy(__a);
} // XXX MT
- void
+ void
_M_destroy(const _Alloc&) throw();
- _CharT*
+ _CharT*
_M_refcopy() throw()
- {
- __atomic_add(&_M_references, 1);
- return _M_refdata();
+ {
+ __atomic_add(&_M_references, 1);
+ return _M_refdata();
} // XXX MT
- _CharT*
+ _CharT*
_M_clone(const _Alloc&, size_type __res = 0);
};
@@ -224,45 +244,45 @@ namespace std
// (carefully) in an empty string with one reference.
static size_type _S_empty_rep_storage[(sizeof(_Rep) + sizeof(_CharT) + sizeof(size_type) - 1)/sizeof(size_type)];
- _CharT*
- _M_data() const
+ _CharT*
+ _M_data() const
{ return _M_dataplus._M_p; }
- _CharT*
- _M_data(_CharT* __p)
+ _CharT*
+ _M_data(_CharT* __p)
{ return (_M_dataplus._M_p = __p); }
- _Rep*
+ _Rep*
_M_rep() const
{ return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
// For the internal use we have functions similar to `begin'/`end'
// but they do not call _M_leak.
- iterator
+ iterator
_M_ibegin() const { return iterator(_M_data()); }
- iterator
+ iterator
_M_iend() const { return iterator(_M_data() + this->size()); }
- void
+ void
_M_leak() // for use in begin() & non-const op[]
- {
- if (!_M_rep()->_M_is_leaked())
- _M_leak_hard();
+ {
+ if (!_M_rep()->_M_is_leaked())
+ _M_leak_hard();
}
- iterator
+ iterator
_M_check(size_type __pos) const
- {
+ {
if (__pos > this->size())
- __throw_out_of_range("basic_string::_M_check");
- return _M_ibegin() + __pos;
+ __throw_out_of_range("basic_string::_M_check");
+ return _M_ibegin() + __pos;
}
// NB: _M_fold doesn't check for a bad __pos1 value.
- iterator
+ iterator
_M_fold(size_type __pos, size_type __off) const
- {
+ {
bool __testoff = __off < this->size() - __pos;
size_type __newoff = __testoff ? __off : this->size() - __pos;
return (_M_ibegin() + __pos + __newoff);
@@ -273,8 +293,8 @@ namespace std
template<class _Iterator>
static void
_S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
- {
- for (; __k1 != __k2; ++__k1, ++__p)
+ {
+ for (; __k1 != __k2; ++__k1, ++__p)
traits_type::assign(*__p, *__k1); // These types are off.
}
@@ -285,7 +305,7 @@ namespace std
static void
_S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
{ _S_copy_chars(__p, __k1.base(), __k2.base()); }
-
+
static void
_S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
{ traits_type::copy(__p, __k1, __k2 - __k1); }
@@ -294,13 +314,13 @@ namespace std
_S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
{ traits_type::copy(__p, __k1, __k2 - __k1); }
- void
+ void
_M_mutate(size_type __pos, size_type __len1, size_type __len2);
- void
+ void
_M_leak_hard();
- static _Rep&
+ static _Rep&
_S_empty_rep()
{ return *reinterpret_cast<_Rep*>(&_S_empty_rep_storage); }
@@ -309,10 +329,10 @@ namespace std
// NB: We overload ctors in some cases instead of using default
// arguments, per 17.4.4.4 para. 2 item 2.
- inline
+ inline
basic_string();
- explicit
+ explicit
basic_string(const _Alloc& __a);
// NB: per LWG issue 42, semantics different from IS:
@@ -331,154 +351,154 @@ namespace std
basic_string(_InputIterator __beg, _InputIterator __end,
const _Alloc& __a = _Alloc());
- ~basic_string()
+ ~basic_string()
{ _M_rep()->_M_dispose(this->get_allocator()); }
- basic_string&
+ basic_string&
operator=(const basic_string& __str) { return this->assign(__str); }
- basic_string&
+ basic_string&
operator=(const _CharT* __s) { return this->assign(__s); }
- basic_string&
+ basic_string&
operator=(_CharT __c) { return this->assign(1, __c); }
// Iterators:
- iterator
- begin()
- {
- _M_leak();
+ iterator
+ begin()
+ {
+ _M_leak();
return iterator(_M_data());
}
- const_iterator
- begin() const
+ const_iterator
+ begin() const
{ return const_iterator(_M_data()); }
- iterator
+ iterator
end()
{
_M_leak();
return iterator(_M_data() + this->size());
}
- const_iterator
+ const_iterator
end() const
{ return const_iterator(_M_data() + this->size()); }
- reverse_iterator
- rbegin()
+ reverse_iterator
+ rbegin()
{ return reverse_iterator(this->end()); }
- const_reverse_iterator
- rbegin() const
+ const_reverse_iterator
+ rbegin() const
{ return const_reverse_iterator(this->end()); }
- reverse_iterator
- rend()
+ reverse_iterator
+ rend()
{ return reverse_iterator(this->begin()); }
- const_reverse_iterator
- rend() const
+ const_reverse_iterator
+ rend() const
{ return const_reverse_iterator(this->begin()); }
public:
// Capacity:
- size_type
+ size_type
size() const { return _M_rep()->_M_length; }
- size_type
+ size_type
length() const { return _M_rep()->_M_length; }
- size_type
+ size_type
max_size() const { return _Rep::_S_max_size; }
- void
+ void
resize(size_type __n, _CharT __c);
- void
+ void
resize(size_type __n) { this->resize(__n, _CharT()); }
- size_type
+ size_type
capacity() const { return _M_rep()->_M_capacity; }
- void
+ void
reserve(size_type __res_arg = 0);
- void
+ void
clear() { _M_mutate(0, this->size(), 0); }
- bool
+ bool
empty() const { return this->size() == 0; }
// Element access:
- const_reference
- operator[] (size_type __pos) const
+ const_reference
+ operator[] (size_type __pos) const
{ return _M_data()[__pos]; }
- reference
- operator[](size_type __pos)
- {
- _M_leak();
- return _M_data()[__pos];
+ reference
+ operator[](size_type __pos)
+ {
+ _M_leak();
+ return _M_data()[__pos];
}
- const_reference
+ const_reference
at(size_type __n) const
{
if (__n >= this->size())
__throw_out_of_range("basic_string::at");
- return _M_data()[__n];
+ return _M_data()[__n];
}
- reference
+ reference
at(size_type __n)
{
if (__n >= size())
__throw_out_of_range("basic_string::at");
- _M_leak();
- return _M_data()[__n];
+ _M_leak();
+ return _M_data()[__n];
}
// Modifiers:
- basic_string&
+ basic_string&
operator+=(const basic_string& __str) { return this->append(__str); }
- basic_string&
+ basic_string&
operator+=(const _CharT* __s) { return this->append(__s); }
- basic_string&
+ basic_string&
operator+=(_CharT __c) { return this->append(size_type(1), __c); }
- basic_string&
+ basic_string&
append(const basic_string& __str);
- basic_string&
+ basic_string&
append(const basic_string& __str, size_type __pos, size_type __n);
- basic_string&
+ basic_string&
append(const _CharT* __s, size_type __n);
- basic_string&
+ basic_string&
append(const _CharT* __s)
{ return this->append(__s, traits_type::length(__s)); }
- basic_string&
+ basic_string&
append(size_type __n, _CharT __c);
template<class _InputIterator>
- basic_string&
+ basic_string&
append(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_iend(), _M_iend(), __first, __last); }
- void
+ void
push_back(_CharT __c)
{ this->replace(_M_iend(), _M_iend(), 1, __c); }
- basic_string&
+ basic_string&
assign(const basic_string& __str);
- basic_string&
+ basic_string&
assign(const basic_string& __str, size_type __pos, size_type __n)
{
const size_type __strsize = __str.size();
@@ -489,7 +509,7 @@ namespace std
return this->assign(__str._M_data() + __pos, __newsize);
}
- basic_string&
+ basic_string&
assign(const _CharT* __s, size_type __n)
{
if (__n > this->max_size())
@@ -511,20 +531,20 @@ namespace std
}
}
- basic_string&
+ basic_string&
assign(const _CharT* __s)
{ return this->assign(__s, traits_type::length(__s)); }
- basic_string&
+ basic_string&
assign(size_type __n, _CharT __c)
{ return this->replace(_M_ibegin(), _M_iend(), __n, __c); }
template<class _InputIterator>
- basic_string&
+ basic_string&
assign(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
- void
+ void
insert(iterator __p, size_type __n, _CharT __c)
{ this->replace(__p, __p, __n, __c); }
@@ -532,11 +552,11 @@ namespace std
void insert(iterator __p, _InputIterator __beg, _InputIterator __end)
{ this->replace(__p, __p, __beg, __end); }
- basic_string&
+ basic_string&
insert(size_type __pos1, const basic_string& __str)
{ return this->insert(__pos1, __str, 0, __str.size()); }
- basic_string&
+ basic_string&
insert(size_type __pos1, const basic_string& __str,
size_type __pos2, size_type __n)
{
@@ -545,10 +565,10 @@ namespace std
__throw_out_of_range("basic_string::insert");
const bool __testn = __n < __strsize - __pos2;
const size_type __newsize = __testn ? __n : __strsize - __pos2;
- return this->insert(__pos1, __str._M_data() + __pos2, __newsize);
+ return this->insert(__pos1, __str._M_data() + __pos2, __newsize);
}
- basic_string&
+ basic_string&
insert(size_type __pos, const _CharT* __s, size_type __n)
{
const size_type __size = this->size();
@@ -582,43 +602,43 @@ namespace std
}
}
- basic_string&
+ basic_string&
insert(size_type __pos, const _CharT* __s)
{ return this->insert(__pos, __s, traits_type::length(__s)); }
- basic_string&
+ basic_string&
insert(size_type __pos, size_type __n, _CharT __c)
- {
- this->insert(_M_check(__pos), __n, __c);
- return *this;
+ {
+ this->insert(_M_check(__pos), __n, __c);
+ return *this;
}
- iterator
+ iterator
insert(iterator __p, _CharT __c = _CharT())
{
size_type __pos = __p - _M_ibegin();
this->insert(_M_check(__pos), size_type(1), __c);
- _M_rep()->_M_set_leaked();
- return this->_M_ibegin() + __pos;
+ _M_rep()->_M_set_leaked();
+ return this->_M_ibegin() + __pos;
}
- basic_string&
+ basic_string&
erase(size_type __pos = 0, size_type __n = npos)
- {
+ {
return this->replace(_M_check(__pos), _M_fold(__pos, __n),
- _M_data(), _M_data());
+ _M_data(), _M_data());
}
- iterator
+ iterator
erase(iterator __position)
{
size_type __i = __position - _M_ibegin();
this->replace(__position, __position + 1, _M_data(), _M_data());
- _M_rep()->_M_set_leaked();
+ _M_rep()->_M_set_leaked();
return _M_ibegin() + __i;
}
- iterator
+ iterator
erase(iterator __first, iterator __last)
{
size_type __i = __first - _M_ibegin();
@@ -627,18 +647,18 @@ namespace std
return _M_ibegin() + __i;
}
- basic_string&
+ basic_string&
replace(size_type __pos, size_type __n, const basic_string& __str)
{ return this->replace(__pos, __n, __str._M_data(), __str.size()); }
- basic_string&
+ basic_string&
replace(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2);
- basic_string&
+ basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2)
- {
+ {
const size_type __size = this->size();
if (__pos > __size)
__throw_out_of_range("basic_string::replace");
@@ -657,32 +677,32 @@ namespace std
typename iterator_traits<const _CharT*>::iterator_category());
}
- basic_string&
+ basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s)
{ return this->replace(__pos, __n1, __s, traits_type::length(__s)); }
- basic_string&
+ basic_string&
replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
{ return this->replace(_M_check(__pos), _M_fold(__pos, __n1), __n2, __c); }
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, const basic_string& __str)
{ return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2,
const _CharT* __s, size_type __n)
{ return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); }
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, const _CharT* __s)
{ return this->replace(__i1, __i2, __s, traits_type::length(__s)); }
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, size_type __n, _CharT __c);
template<class _InputIterator>
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2,
_InputIterator __k1, _InputIterator __k2)
{ return _M_replace(__i1, __i2, __k1, __k2,
@@ -690,23 +710,23 @@ namespace std
// Specializations for the common case of pointer and iterator:
// useful to avoid the overhead of temporary buffering in _M_replace.
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
{ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1, __k2 - __k1); }
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, const _CharT* __k1, const _CharT* __k2)
{ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1, __k2 - __k1); }
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
{ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1.base(), __k2 - __k1);
}
- basic_string&
+ basic_string&
replace(iterator __i1, iterator __i2, const_iterator __k1, const_iterator __k2)
{ return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1.base(), __k2 - __k1);
@@ -714,13 +734,13 @@ namespace std
private:
template<class _InputIterator>
- basic_string&
- _M_replace(iterator __i1, iterator __i2, _InputIterator __k1,
+ basic_string&
+ _M_replace(iterator __i1, iterator __i2, _InputIterator __k1,
_InputIterator __k2, input_iterator_tag);
template<class _ForwardIterator>
- basic_string&
- _M_replace_safe(iterator __i1, iterator __i2, _ForwardIterator __k1,
+ basic_string&
+ _M_replace_safe(iterator __i1, iterator __i2, _ForwardIterator __k1,
_ForwardIterator __k2);
// _S_construct_aux is used to implement the 21.3.1 para 15 which
@@ -733,7 +753,7 @@ namespace std
typedef typename iterator_traits<_InIter>::iterator_category _Tag;
return _S_construct(__beg, __end, __a, _Tag());
}
-
+
template<class _InIter>
static _CharT*
_S_construct_aux(_InIter __beg, _InIter __end, const _Alloc& __a,
@@ -742,7 +762,7 @@ namespace std
return _S_construct(static_cast<size_type>(__beg),
static_cast<value_type>(__end), __a);
}
-
+
template<class _InIter>
static _CharT*
_S_construct(_InIter __beg, _InIter __end, const _Alloc& __a)
@@ -756,7 +776,7 @@ namespace std
static _CharT*
_S_construct(_InIter __beg, _InIter __end, const _Alloc& __a,
input_iterator_tag);
-
+
// For forward_iterators up to random_access_iterators, used for
// string::iterator, _CharT*, etc.
template<class _FwdIter>
@@ -764,19 +784,19 @@ namespace std
_S_construct(_FwdIter __beg, _FwdIter __end, const _Alloc& __a,
forward_iterator_tag);
- static _CharT*
+ static _CharT*
_S_construct(size_type __req, _CharT __c, const _Alloc& __a);
public:
- size_type
+ size_type
copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
- void
+ void
swap(basic_string<_CharT, _Traits, _Alloc>& __s);
// String operations:
- const _CharT*
+ const _CharT*
c_str() const
{
// MT: This assumes concurrent writes are OK.
@@ -785,137 +805,137 @@ namespace std
return _M_data();
}
- const _CharT*
+ const _CharT*
data() const { return _M_data(); }
- allocator_type
+ allocator_type
get_allocator() const { return _M_dataplus; }
- size_type
+ size_type
find(const _CharT* __s, size_type __pos, size_type __n) const;
- size_type
+ size_type
find(const basic_string& __str, size_type __pos = 0) const
{ return this->find(__str.data(), __pos, __str.size()); }
- size_type
+ size_type
find(const _CharT* __s, size_type __pos = 0) const
{ return this->find(__s, __pos, traits_type::length(__s)); }
- size_type
+ size_type
find(_CharT __c, size_type __pos = 0) const;
- size_type
+ size_type
rfind(const basic_string& __str, size_type __pos = npos) const
{ return this->rfind(__str.data(), __pos, __str.size()); }
- size_type
+ size_type
rfind(const _CharT* __s, size_type __pos, size_type __n) const;
- size_type
+ size_type
rfind(const _CharT* __s, size_type __pos = npos) const
{ return this->rfind(__s, __pos, traits_type::length(__s)); }
- size_type
+ size_type
rfind(_CharT __c, size_type __pos = npos) const;
- size_type
+ size_type
find_first_of(const basic_string& __str, size_type __pos = 0) const
{ return this->find_first_of(__str.data(), __pos, __str.size()); }
- size_type
+ size_type
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
- size_type
+ size_type
find_first_of(const _CharT* __s, size_type __pos = 0) const
{ return this->find_first_of(__s, __pos, traits_type::length(__s)); }
- size_type
+ size_type
find_first_of(_CharT __c, size_type __pos = 0) const
{ return this->find(__c, __pos); }
- size_type
+ size_type
find_last_of(const basic_string& __str, size_type __pos = npos) const
{ return this->find_last_of(__str.data(), __pos, __str.size()); }
- size_type
+ size_type
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
- size_type
+ size_type
find_last_of(const _CharT* __s, size_type __pos = npos) const
{ return this->find_last_of(__s, __pos, traits_type::length(__s)); }
- size_type
+ size_type
find_last_of(_CharT __c, size_type __pos = npos) const
{ return this->rfind(__c, __pos); }
- size_type
+ size_type
find_first_not_of(const basic_string& __str, size_type __pos = 0) const
{ return this->find_first_not_of(__str.data(), __pos, __str.size()); }
- size_type
- find_first_not_of(const _CharT* __s, size_type __pos,
+ size_type
+ find_first_not_of(const _CharT* __s, size_type __pos,
size_type __n) const;
- size_type
+ size_type
find_first_not_of(const _CharT* __s, size_type __pos = 0) const
{ return this->find_first_not_of(__s, __pos, traits_type::length(__s)); }
- size_type
+ size_type
find_first_not_of(_CharT __c, size_type __pos = 0) const;
- size_type
+ size_type
find_last_not_of(const basic_string& __str, size_type __pos = npos) const
{ return this->find_last_not_of(__str.data(), __pos, __str.size()); }
- size_type
- find_last_not_of(const _CharT* __s, size_type __pos,
+ size_type
+ find_last_not_of(const _CharT* __s, size_type __pos,
size_type __n) const;
- size_type
+ size_type
find_last_not_of(const _CharT* __s, size_type __pos = npos) const
{ return this->find_last_not_of(__s, __pos, traits_type::length(__s)); }
- size_type
+ size_type
find_last_not_of(_CharT __c, size_type __pos = npos) const;
- basic_string
+ basic_string
substr(size_type __pos = 0, size_type __n = npos) const
- {
+ {
if (__pos > this->size())
__throw_out_of_range("basic_string::substr");
- return basic_string(*this, __pos, __n);
+ return basic_string(*this, __pos, __n);
}
- int
+ int
compare(const basic_string& __str) const
{
size_type __size = this->size();
size_type __osize = __str.size();
size_type __len = min(__size, __osize);
-
+
int __r = traits_type::compare(_M_data(), __str.data(), __len);
if (!__r)
__r = __size - __osize;
return __r;
}
- int
+ int
compare(size_type __pos, size_type __n, const basic_string& __str) const;
- int
+ int
compare(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2) const;
- int
+ int
compare(const _CharT* __s) const;
// _GLIBCPP_RESOLVE_LIB_DEFECTS
// 5. String::compare specification questionable
- int
+ int
compare(size_type __pos, size_type __n1, const _CharT* __s) const;
- int
- compare(size_type __pos, size_type __n1, const _CharT* __s,
+ int
+ compare(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2) const;
};
diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index eeae4746e91..23246d41c0f 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -34,7 +34,7 @@
#include <bits/os_defines.h>
// The current version of the C++ library in compressed ISO date format.
-#define __GLIBCPP__ 20020822
+#define __GLIBCPP__ 20021020
// This is necessary until GCC supports separate template
// compilation.
@@ -55,6 +55,9 @@
// Use corrected code from the committee library group's issues list.
#define _GLIBCPP_RESOLVE_LIB_DEFECTS 1
+// Hopefully temporary workaround to autoconf/m4 issue with quoting '@'.
+#define _GLIBCPP_AT_AT "@@"
+
// In those parts of the standard C++ library that use a mutex instead
// of a spin-lock, we now unconditionally use GCC's gthr.h mutex
// abstraction layer. All support to directly map to various
@@ -71,13 +74,8 @@
// so, please report any possible issues to libstdc++@gcc.gnu.org .
// Do not define __USE_MALLOC on the command line. Enforce it here:
#ifdef __USE_MALLOC
-#error __USE_MALLOC should only be defined within \
-libstdc++-v3/include/bits/c++config before full recompilation of the library.
+#error __USE_MALLOC should never be defined. Read the release notes.
#endif
-// Define __USE_MALLOC after this point in the file in order to aid debugging
-// or globally change allocation policy. This breaks the ABI, thus
-// completely recompile the library. A patch to better support
-// changing the global allocator policy would be probably be accepted.
// The remainder of the prewritten config is mostly automatic; all the
// user hooks are listed above.
diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h
index a5fdfbef296..2b733cd94a0 100644
--- a/libstdc++-v3/include/bits/char_traits.h
+++ b/libstdc++-v3/include/bits/char_traits.h
@@ -42,17 +42,21 @@
#pragma GCC system_header
-#include <cstring> // For memmove, memset, memchr
-#include <bits/fpos.h> // For streampos
+#include <cstring> // For memmove, memset, memchr
+#include <bits/fpos.h> // For streampos
namespace std
{
- // 21.1.2
+ // 21.1
/**
* @brief Basis for explicit traits specializations.
*
* @note For any given actual character type, this definition is
* probably wrong.
+ *
+ * See http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#5
+ * for advice on how to make use of this class for "unusual" character
+ * types.
*/
template<class _CharT>
struct char_traits
@@ -108,7 +112,7 @@ namespace std
};
- /// 21.1.4 char_traits specializations
+ /// 21.1.3.1 char_traits specializations
template<>
struct char_traits<char>
{
@@ -178,6 +182,7 @@ namespace std
#ifdef _GLIBCPP_USE_WCHAR_T
+ /// 21.1.3.2 char_traits specializations
template<>
struct char_traits<wchar_t>
{
diff --git a/libstdc++-v3/include/bits/codecvt.h b/libstdc++-v3/include/bits/codecvt.h
index 506752f3432..92b0f0e8a7d 100644
--- a/libstdc++-v3/include/bits/codecvt.h
+++ b/libstdc++-v3/include/bits/codecvt.h
@@ -1,6 +1,6 @@
// Locale support (codecvt) -*- C++ -*-
-// Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -66,10 +66,10 @@
{
public:
// Types:
- typedef codecvt_base::result result;
- typedef _InternT intern_type;
- typedef _ExternT extern_type;
- typedef _StateT state_type;
+ typedef codecvt_base::result result;
+ typedef _InternT intern_type;
+ typedef _ExternT extern_type;
+ typedef _StateT state_type;
// 22.2.1.5.1 codecvt members
result
@@ -159,17 +159,23 @@
{
public:
// Types:
- typedef codecvt_base::result result;
- typedef _InternT intern_type;
- typedef _ExternT extern_type;
- typedef _StateT state_type;
+ typedef codecvt_base::result result;
+ typedef _InternT intern_type;
+ typedef _ExternT extern_type;
+ typedef _StateT state_type;
- // Data Members:
- static locale::id id;
+ protected:
+ __c_locale _M_c_locale_codecvt;
+
+ public:
+ static locale::id id;
explicit
codecvt(size_t __refs = 0)
- : __codecvt_abstract_base<_InternT,_ExternT,_StateT> (__refs) { }
+ : __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs) { }
+
+ explicit
+ codecvt(__c_locale __cloc, size_t __refs = 0);
protected:
virtual
@@ -215,16 +221,22 @@
{
public:
// Types:
- typedef char intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
+ typedef char intern_type;
+ typedef char extern_type;
+ typedef mbstate_t state_type;
+
+ protected:
+ __c_locale _M_c_locale_codecvt;
- // Data Members:
+ public:
static locale::id id;
explicit
codecvt(size_t __refs = 0);
+ explicit
+ codecvt(__c_locale __cloc, size_t __refs = 0);
+
protected:
virtual
~codecvt();
@@ -267,16 +279,22 @@
{
public:
// Types:
- typedef wchar_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
+ typedef wchar_t intern_type;
+ typedef char extern_type;
+ typedef mbstate_t state_type;
- // Data Members:
- static locale::id id;
+ protected:
+ __c_locale _M_c_locale_codecvt;
+
+ public:
+ static locale::id id;
explicit
codecvt(size_t __refs = 0);
+ explicit
+ codecvt(__c_locale __cloc, size_t __refs = 0);
+
protected:
virtual
~codecvt();
@@ -320,8 +338,14 @@
{
public:
explicit
- codecvt_byname(const char*, size_t __refs = 0)
- : codecvt<_InternT, _ExternT, _StateT>(__refs) { }
+ codecvt_byname(const char* __s, size_t __refs = 0)
+ : codecvt<_InternT, _ExternT, _StateT>(__refs)
+ {
+ if (_M_c_locale_codecvt != _S_c_locale)
+ _S_destroy_c_locale(_M_c_locale_codecvt);
+ _S_create_c_locale(_M_c_locale_codecvt, __s);
+ }
+
protected:
virtual
~codecvt_byname() { }
diff --git a/libstdc++-v3/include/bits/generic_shadow.h b/libstdc++-v3/include/bits/generic_shadow.h
deleted file mode 100644
index b87e71702e8..00000000000
--- a/libstdc++-v3/include/bits/generic_shadow.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// generic C header shadow file -*- C++ -*-
-
-// Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-// This file is included by all the standard C <foo.h> headers
-// after defining _SHADOW_NAME.
-
-#ifdef _IN_C_LEGACY_ /* sub-included by a C header */
-
- // Get out of the "swamp."
- } // Close extern "C"
- } // Close namespace _C_legacy::
-
-# undef _IN_C_LEGACY_
-# include _SHADOW_NAME
-
- // Dive back into the "swamp."
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-
-#else /* not _IN_C_LEGACY_: directly included by user program */
-
-# include _SHADOW_NAME
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
- using namespace ::_C_legacy::_C_shadow;
-
-#endif /* _IN_C_LEGACY_ */
-
-
-
diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h
index 159cecccdcb..660bad3c11a 100644
--- a/libstdc++-v3/include/bits/locale_facets.h
+++ b/libstdc++-v3/include/bits/locale_facets.h
@@ -525,7 +525,7 @@ namespace std
// For use at construction time only.
void
- _M_initialize_numpunct(__c_locale __cloc = _S_c_locale);
+ _M_initialize_numpunct(__c_locale __cloc = NULL);
};
template<typename _CharT>
@@ -847,7 +847,6 @@ namespace std
: locale::facet(__refs)
{ _M_c_locale_collate = _S_c_locale; }
- // Non-standard.
explicit
collate(__c_locale __cloc, size_t __refs = 0)
: locale::facet(__refs)
@@ -876,10 +875,7 @@ namespace std
protected:
virtual
~collate()
- {
- if (_M_c_locale_collate != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_collate);
- }
+ { _S_destroy_c_locale(_M_c_locale_collate); }
virtual int
do_compare(const _CharT* __lo1, const _CharT* __hi1,
@@ -925,8 +921,7 @@ namespace std
collate_byname(const char* __s, size_t __refs = 0)
: collate<_CharT>(__refs)
{
- if (_M_c_locale_collate != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_collate);
+ _S_destroy_c_locale(_M_c_locale_collate);
_S_create_c_locale(_M_c_locale_collate, __s);
}
@@ -957,7 +952,7 @@ namespace std
protected:
__c_locale _M_c_locale_timepunct;
- const char* _M_name_timepunct;
+ char* _M_name_timepunct;
const _CharT* _M_date_format;
const _CharT* _M_date_era_format;
const _CharT* _M_time_format;
@@ -1017,13 +1012,21 @@ namespace std
public:
explicit
__timepunct(size_t __refs = 0)
- : locale::facet(__refs), _M_name_timepunct("C")
- { _M_initialize_timepunct(); }
+ : locale::facet(__refs)
+ {
+ _M_name_timepunct = new char[2];
+ strcpy(_M_name_timepunct, "C");
+ _M_initialize_timepunct();
+ }
explicit
__timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
- : locale::facet(__refs), _M_name_timepunct(__s)
- { _M_initialize_timepunct(__cloc); }
+ : locale::facet(__refs)
+ {
+ _M_name_timepunct = new char[strlen(__s) + 1];
+ strcpy(_M_name_timepunct, __s);
+ _M_initialize_timepunct(__cloc);
+ }
void
_M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
@@ -1120,20 +1123,21 @@ namespace std
protected:
virtual
- ~__timepunct();
+ ~__timepunct()
+ {
+ delete [] _M_name_timepunct;
+ _S_destroy_c_locale(_M_c_locale_timepunct);
+ }
// For use at construction time only.
void
- _M_initialize_timepunct(__c_locale __cloc = _S_c_locale);
+ _M_initialize_timepunct(__c_locale __cloc = NULL);
};
template<typename _CharT>
locale::id __timepunct<_CharT>::id;
// Specializations.
- template<>
- __timepunct<char>::~__timepunct();
-
template<>
const char*
__timepunct<char>::_S_timezones[14];
@@ -1147,9 +1151,6 @@ namespace std
__timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const;
#ifdef _GLIBCPP_USE_WCHAR_T
- template<>
- __timepunct<wchar_t>::~__timepunct();
-
template<>
const wchar_t*
__timepunct<wchar_t>::_S_timezones[14];
@@ -1460,7 +1461,7 @@ namespace std
// For use at construction time only.
void
- _M_initialize_moneypunct(__c_locale __cloc = _S_c_locale,
+ _M_initialize_moneypunct(__c_locale __cloc = NULL,
const char* __name = NULL);
};
@@ -1629,7 +1630,7 @@ namespace std
__c_locale _M_c_locale_messages;
#if 1
// Only needed if glibc < 2.3
- const char* _M_name_messages;
+ char* _M_name_messages;
#endif
public:
@@ -1637,15 +1638,20 @@ namespace std
explicit
messages(size_t __refs = 0)
- : locale::facet(__refs), _M_name_messages("C")
- { _M_c_locale_messages = _S_c_locale; }
+ : locale::facet(__refs)
+ {
+ _M_name_messages = new char[2];
+ strcpy(_M_name_messages, "C");
+ _M_c_locale_messages = _S_c_locale;
+ }
// Non-standard.
explicit
- messages(__c_locale __cloc, const char* __name, size_t __refs = 0)
+ messages(__c_locale __cloc, const char* __s, size_t __refs = 0)
: locale::facet(__refs)
{
- _M_name_messages = __name;
+ _M_name_messages = new char[strlen(__s) + 1];
+ strcpy(_M_name_messages, __s);
_M_c_locale_messages = _S_clone_c_locale(__cloc);
}
@@ -1669,8 +1675,8 @@ namespace std
virtual
~messages()
{
- if (_M_c_locale_messages != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_messages);
+ delete [] _M_name_messages;
+ _S_destroy_c_locale(_M_c_locale_messages);
}
virtual catalog
@@ -1739,6 +1745,12 @@ namespace std
string
messages<char>::do_get(catalog, int, int, const string&) const;
+#ifdef _GLIBCPP_USE_WCHAR_T
+ template<>
+ wstring
+ messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
+#endif
+
// Include host and configuration specific messages virtual functions.
#include <bits/messages_members.h>
@@ -1753,9 +1765,10 @@ namespace std
messages_byname(const char* __s, size_t __refs = 0)
: messages<_CharT>(__refs)
{
- _M_name_messages = __s;
- if (_M_c_locale_messages != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_messages);
+ delete [] _M_name_messages;
+ _M_name_messages = new char[strlen(__s) + 1];
+ strcpy(_M_name_messages, __s);
+ _S_destroy_c_locale(_M_c_locale_messages);
_S_create_c_locale(_M_c_locale_messages, __s);
}
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index 63e52c00585..f21054e2966 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -798,8 +798,10 @@ namespace std
// By itself __add_grouping cannot deal correctly with __ws when
// ios::showbase is set and ios_base::oct || ios_base::hex.
// Therefore we take care "by hand" of the initial 0, 0x or 0X.
+ // However, remember that the latter do not occur if the number
+ // printed is '0' (__len == 1).
streamsize __off = 0;
- if (__io.flags() & ios_base::showbase)
+ if ((__io.flags() & ios_base::showbase) && __len > 1)
if (__basefield == ios_base::oct)
{
__off = 1;
@@ -1969,41 +1971,10 @@ namespace std
// Convert numeric value of type _Tv to string and return length of string.
// If snprintf is available use it, otherwise fall back to the unsafe sprintf
// which, in general, can be dangerous and should be avoided.
-#ifdef _GLIBCPP_USE_C99
template<typename _Tv>
int
__convert_from_v(char* __out, const int __size, const char* __fmt,
- _Tv __v, const __c_locale&, int __prec = -1)
- {
- int __ret;
- char* __old = strdup(setlocale(LC_ALL, NULL));
- setlocale(LC_ALL, "C");
- if (__prec >= 0)
- __ret = snprintf(__out, __size, __fmt, __prec, __v);
- else
- __ret = snprintf(__out, __size, __fmt, __v);
- setlocale(LC_ALL, __old);
- free(__old);
- return __ret;
- }
-#else
- template<typename _Tv>
- int
- __convert_from_v(char* __out, const int, const char* __fmt, _Tv __v,
- const __c_locale&, int __prec = -1)
- {
- int __ret;
- char* __old = strdup(setlocale(LC_ALL, NULL));
- setlocale(LC_ALL, "C");
- if (__prec >= 0)
- __ret = sprintf(__out, __fmt, __prec, __v);
- else
- __ret = sprintf(__out, __fmt, __v);
- setlocale(LC_ALL, __old);
- free(__old);
- return __ret;
- }
-#endif
+ _Tv __v, const __c_locale&, int __prec = -1);
// Construct correctly padded string, as per 22.2.2.2.2
// Assumes
diff --git a/libstdc++-v3/include/bits/localefwd.h b/libstdc++-v3/include/bits/localefwd.h
index 028c4126b85..76279609921 100644
--- a/libstdc++-v3/include/bits/localefwd.h
+++ b/libstdc++-v3/include/bits/localefwd.h
@@ -207,8 +207,8 @@ namespace std
static const category time = 1L << 3;
static const category monetary = 1L << 4;
static const category messages = 1L << 5;
- static const category all = (collate | ctype | monetary |
- numeric | time | messages);
+ static const category all = (ctype | numeric | collate |
+ time | monetary | messages);
// Construct/copy/destroy:
locale() throw();
@@ -267,7 +267,26 @@ namespace std
// Current global reference locale
static _Impl* _S_global;
- static const size_t _S_num_categories = 6;
+ // Number of standard categories. For C++, these categories are
+ // collate, ctype, monetary, numeric, time, and messages. These
+ // directly correspond to ISO C99 macros LC_COLLATE, LC_CTYPE,
+ // LC_MONETARY, LC_NUMERIC, and LC_TIME. In addition, POSIX (IEEE
+ // 1003.1-2001) specifies LC_MESSAGES.
+ static const size_t _S_categories_size = 6;
+
+ // In addition to the standard categories, the underlying
+ // operating system is allowed to define extra LC_*
+ // macros. For GNU systems, the following are also valid:
+ // LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT,
+ // and LC_IDENTIFICATION.
+ static const size_t _S_extra_categories_size = _GLIBCPP_NUM_CATEGORIES;
+
+ // Names of underlying locale categories.
+ // NB: locale::global() has to know how to modify all the
+ // underlying categories, not just the ones required by the C++
+ // standard.
+ static const char* _S_categories[_S_categories_size
+ + _S_extra_categories_size];
explicit
locale(_Impl*) throw();
@@ -308,7 +327,9 @@ namespace std
_Atomic_word _M_references;
facet** _M_facets;
size_t _M_facets_size;
- const char* _M_names[_S_num_categories];
+
+ char* _M_names[_S_categories_size
+ + _S_extra_categories_size];
static const locale::id* const _S_id_ctype[];
static const locale::id* const _S_id_numeric[];
static const locale::id* const _S_id_collate[];
@@ -348,8 +369,10 @@ namespace std
_M_check_same_name()
{
bool __ret = true;
- for (size_t i = 0; __ret && i < _S_num_categories - 1; ++i)
- __ret &= (strcmp(_M_names[i], _M_names[i + 1]) == 0);
+ for (size_t __i = 0;
+ __ret && __i < _S_categories_size + _S_extra_categories_size - 1;
+ ++__i)
+ __ret &= (strcmp(_M_names[__i], _M_names[__i + 1]) == 0);
return __ret;
}
@@ -376,8 +399,14 @@ namespace std
{
_M_impl = new _Impl(*__other._M_impl, 1);
_M_impl->_M_install_facet(&_Facet::id, __f);
- for (size_t __i = 0; __i < _S_num_categories; ++__i)
- _M_impl->_M_names[__i] = "*";
+ for (size_t __i = 0;
+ __i < _S_categories_size + _S_extra_categories_size; ++__i)
+ {
+ delete [] _M_impl->_M_names[__i];
+ char* __new = new char[2];
+ strcpy(__new, "*");
+ _M_impl->_M_names[__i] = __new;
+ }
}
// 22.1.1.1.2 Class locale::facet
@@ -387,12 +416,12 @@ namespace std
friend class locale;
friend class locale::_Impl;
- _Atomic_word _M_references;
+ _Atomic_word _M_references;
protected:
// Contains data from the underlying "C" library for default "C"
// or "POSIX" locale.
- static __c_locale _S_c_locale;
+ static __c_locale _S_c_locale;
explicit
facet(size_t __refs = 0) throw();
diff --git a/libstdc++-v3/include/bits/stl_alloc.h b/libstdc++-v3/include/bits/stl_alloc.h
index 1ae80f40512..fceed498df6 100644
--- a/libstdc++-v3/include/bits/stl_alloc.h
+++ b/libstdc++-v3/include/bits/stl_alloc.h
@@ -89,6 +89,8 @@
#include <bits/functexcept.h> // For __throw_bad_alloc
#include <bits/stl_threads.h>
+#include <bits/atomicity.h>
+
namespace std
{
/**
@@ -111,6 +113,7 @@ namespace std
{ ::operator delete(__p); }
};
+
/**
* @if maint
* A malloc-based allocator. Typically slower than the
@@ -159,7 +162,7 @@ namespace std
{
void (* __old)() = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = __f;
- return(__old);
+ return __old;
}
};
@@ -179,11 +182,11 @@ namespace std
{
__my_malloc_handler = __malloc_alloc_oom_handler;
if (0 == __my_malloc_handler)
- std::__throw_bad_alloc();
+ std::__throw_bad_alloc();
(*__my_malloc_handler)();
__result = malloc(__n);
if (__result)
- return(__result);
+ return __result;
}
}
@@ -204,19 +207,13 @@ namespace std
(*__my_malloc_handler)();
__result = realloc(__p, __n);
if (__result)
- return(__result);
+ return __result;
}
}
#endif
-
- // Determines the underlying allocator choice for the node allocator.
-#ifdef __USE_MALLOC
- typedef __malloc_alloc_template<0> __mem_interface;
-#else
+ // Should not be referenced within the library anymore.
typedef __new_alloc __mem_interface;
-#endif
-
/**
* @if maint
@@ -230,25 +227,25 @@ namespace std
* (See @link Allocators allocators info @endlink for more.)
*/
template<typename _Tp, typename _Alloc>
- class __simple_alloc
- {
- public:
- static _Tp*
- allocate(size_t __n)
- { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }
-
- static _Tp*
- allocate()
- { return (_Tp*) _Alloc::allocate(sizeof (_Tp)); }
-
- static void
- deallocate(_Tp* __p, size_t __n)
- { if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }
-
- static void
- deallocate(_Tp* __p)
- { _Alloc::deallocate(__p, sizeof (_Tp)); }
- };
+ class __simple_alloc
+ {
+ public:
+ static _Tp*
+ allocate(size_t __n)
+ { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }
+
+ static _Tp*
+ allocate()
+ { return (_Tp*) _Alloc::allocate(sizeof (_Tp)); }
+
+ static void
+ deallocate(_Tp* __p, size_t __n)
+ { if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }
+
+ static void
+ deallocate(_Tp* __p)
+ { _Alloc::deallocate(__p, sizeof (_Tp)); }
+ };
/**
@@ -306,23 +303,16 @@ namespace std
};
-#ifdef __USE_MALLOC
-
- typedef __mem_interface __alloc;
- typedef __mem_interface __single_client_alloc;
-
-#else
-
-
/**
* @if maint
- * Default node allocator. "SGI" style. Uses __mem_interface for its
- * underlying requests (and makes as few requests as possible).
- * **** Currently __mem_interface is always __new_alloc, never __malloc*.
+ * Default node allocator. "SGI" style. Uses various allocators to
+ * fulfill underlying requests (and makes as few requests as possible
+ * when in default high-speed pool mode).
*
* Important implementation properties:
+ * 0. If globally mandated, then allocate objects from __new_alloc
* 1. If the clients request an object of size > _MAX_BYTES, the resulting
- * object will be obtained directly from the underlying __mem_interface.
+ * object will be obtained directly from __new_alloc
* 2. In all other cases, we allocate an object of size exactly
* _S_round_up(requested_size). Thus the client has enough size
* information that we can return the object to the proper free list
@@ -393,54 +383,69 @@ namespace std
} __attribute__ ((__unused__));
friend struct _Lock;
+ static _Atomic_word _S_force_new;
+
public:
// __n must be > 0
static void*
allocate(size_t __n)
{
- void* __ret = 0;
-
- if (__n > (size_t) _MAX_BYTES)
- __ret = __mem_interface::allocate(__n);
- else
- {
- _Obj* volatile* __my_free_list = _S_free_list
- + _S_freelist_index(__n);
- // Acquire the lock here with a constructor call. This
- // ensures that it is released in exit or during stack
- // unwinding.
- _Lock __lock_instance;
- _Obj* __restrict__ __result = *__my_free_list;
- if (__result == 0)
- __ret = _S_refill(_S_round_up(__n));
- else
- {
- *__my_free_list = __result -> _M_free_list_link;
- __ret = __result;
- }
- }
- return __ret;
- };
+ void* __ret = 0;
+
+ // If there is a race through here, assume answer from getenv
+ // will resolve in same direction. Inspired by techniques
+ // to efficiently support threading found in basic_string.h.
+ if (_S_force_new == 0)
+ {
+ if (getenv("GLIBCPP_FORCE_NEW"))
+ __atomic_add(&_S_force_new, 1);
+ else
+ __atomic_add(&_S_force_new, -1);
+ // Trust but verify...
+ assert (_S_force_new != 0);
+ }
+
+ if ((__n > (size_t) _MAX_BYTES) || (_S_force_new > 0))
+ __ret = __new_alloc::allocate(__n);
+ else
+ {
+ _Obj* volatile* __my_free_list = _S_free_list
+ + _S_freelist_index(__n);
+ // Acquire the lock here with a constructor call. This
+ // ensures that it is released in exit or during stack
+ // unwinding.
+ _Lock __lock_instance;
+ _Obj* __restrict__ __result = *__my_free_list;
+ if (__result == 0)
+ __ret = _S_refill(_S_round_up(__n));
+ else
+ {
+ *__my_free_list = __result -> _M_free_list_link;
+ __ret = __result;
+ }
+ }
+ return __ret;
+ }
// __p may not be 0
static void
deallocate(void* __p, size_t __n)
{
- if (__n > (size_t) _MAX_BYTES)
- __mem_interface::deallocate(__p, __n);
- else
- {
- _Obj* volatile* __my_free_list = _S_free_list
- + _S_freelist_index(__n);
- _Obj* __q = (_Obj*)__p;
-
- // Acquire the lock here with a constructor call. This
- // ensures that it is released in exit or during stack
- // unwinding.
- _Lock __lock_instance;
- __q -> _M_free_list_link = *__my_free_list;
- *__my_free_list = __q;
- }
+ if ((__n > (size_t) _MAX_BYTES) || (_S_force_new > 0))
+ __new_alloc::deallocate(__p, __n);
+ else
+ {
+ _Obj* volatile* __my_free_list = _S_free_list
+ + _S_freelist_index(__n);
+ _Obj* __q = (_Obj*)__p;
+
+ // Acquire the lock here with a constructor call. This
+ // ensures that it is released in exit or during stack
+ // unwinding.
+ _Lock __lock_instance;
+ __q -> _M_free_list_link = *__my_free_list;
+ *__my_free_list = __q;
+ }
}
#ifdef _GLIBCPP_DEPRECATED
@@ -449,6 +454,8 @@ namespace std
#endif
};
+ template<bool __threads, int __inst> _Atomic_word
+ __default_alloc_template<__threads, __inst>::_S_force_new = 0;
template<bool __threads, int __inst>
inline bool
@@ -464,8 +471,8 @@ namespace std
// We allocate memory in large chunks in order to avoid fragmenting the
- // malloc heap (or whatever __mem_interface is using) too much. We assume
- // that __size is properly aligned. We hold the allocation lock.
+ // heap too much. We assume that __size is properly aligned. We hold
+ // the allocation lock.
template<bool __threads, int __inst>
char*
__default_alloc_template<__threads, __inst>::
@@ -479,7 +486,7 @@ namespace std
{
__result = _S_start_free;
_S_start_free += __total_bytes;
- return(__result);
+ return __result ;
}
else if (__bytes_left >= __size)
{
@@ -487,7 +494,7 @@ namespace std
__total_bytes = __size * __nobjs;
__result = _S_start_free;
_S_start_free += __total_bytes;
- return(__result);
+ return __result;
}
else
{
@@ -502,7 +509,7 @@ namespace std
((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list;
*__my_free_list = (_Obj*)_S_start_free;
}
- _S_start_free = (char*) __mem_interface::allocate(__bytes_to_get);
+ _S_start_free = (char*) __new_alloc::allocate(__bytes_to_get);
if (0 == _S_start_free)
{
size_t __i;
@@ -521,19 +528,19 @@ namespace std
*__my_free_list = __p -> _M_free_list_link;
_S_start_free = (char*)__p;
_S_end_free = _S_start_free + __i;
- return(_S_chunk_alloc(__size, __nobjs));
+ return _S_chunk_alloc(__size, __nobjs);
// Any leftover piece will eventually make it to the
// right free list.
}
}
_S_end_free = 0; // In case of exception.
- _S_start_free = (char*)__mem_interface::allocate(__bytes_to_get);
+ _S_start_free = (char*)__new_alloc::allocate(__bytes_to_get);
// This should either throw an exception or remedy the situation.
// Thus we assume it succeeded.
}
_S_heap_size += __bytes_to_get;
_S_end_free = _S_start_free + __bytes_to_get;
- return(_S_chunk_alloc(__size, __nobjs));
+ return _S_chunk_alloc(__size, __nobjs);
}
}
@@ -554,7 +561,7 @@ namespace std
int __i;
if (1 == __nobjs)
- return(__chunk);
+ return __chunk;
__my_free_list = _S_free_list + _S_freelist_index(__n);
// Build free list in chunk.
@@ -617,7 +624,6 @@ namespace std
typedef __default_alloc_template<true,0> __alloc;
typedef __default_alloc_template<false,0> __single_client_alloc;
-#endif /* ! __USE_MALLOC */
/**
@@ -627,10 +633,6 @@ namespace std
* of stl_alloc.h.)
*
* The underlying allocator behaves as follows.
- * - if __USE_MALLOC then
- * - thread safety depends on malloc and is entirely out of our hands
- * - __malloc_alloc_template is used for memory requests
- * - else (the default)
* - __default_alloc_template is used via two typedefs
* - "__single_client_alloc" typedef does no locking for threads
* - "__alloc" typedef is threadsafe via the locks
@@ -784,7 +786,7 @@ namespace std
};
template<typename _Alloc>
- class __allocator<void, _Alloc>
+ struct __allocator<void, _Alloc>
{
typedef size_t size_type;
typedef ptrdiff_t difference_type;
@@ -907,7 +909,6 @@ namespace std
typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type;
};
-#ifndef __USE_MALLOC
template<typename _Tp, bool __threads, int __inst>
struct _Alloc_traits<_Tp, __default_alloc_template<__threads, __inst> >
{
@@ -917,7 +918,6 @@ namespace std
typedef __allocator<_Tp, __default_alloc_template<__threads, __inst> >
allocator_type;
};
-#endif
template<typename _Tp, typename _Alloc>
struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> >
@@ -940,7 +940,6 @@ namespace std
typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type;
};
-#ifndef __USE_MALLOC
template<typename _Tp, typename _Tp1, bool __thr, int __inst>
struct _Alloc_traits<_Tp, __allocator<_Tp1, __default_alloc_template<__thr, __inst> > >
{
@@ -950,7 +949,6 @@ namespace std
typedef __allocator<_Tp, __default_alloc_template<__thr,__inst> >
allocator_type;
};
-#endif
template<typename _Tp, typename _Tp1, typename _Alloc>
struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > >
@@ -966,11 +964,7 @@ namespace std
// NB: This syntax is a GNU extension.
extern template class allocator<char>;
extern template class allocator<wchar_t>;
-#ifdef __USE_MALLOC
- extern template class __malloc_alloc_template<0>;
-#else
extern template class __default_alloc_template<true,0>;
-#endif
} // namespace std
#endif
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index 0c78d7e4bde..59e7b7f967c 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -356,8 +356,8 @@ template <typename _Alloc>
typedef _Bit_iterator iterator;
typedef _Bit_const_iterator const_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
typedef typename _Bvector_base<_Alloc>::allocator_type allocator_type;
allocator_type get_allocator() const {
diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h
index aa1eef80aab..7dbbbea7e83 100644
--- a/libstdc++-v3/include/bits/stl_deque.h
+++ b/libstdc++-v3/include/bits/stl_deque.h
@@ -81,7 +81,7 @@ namespace std
*/
inline size_t
__deque_buf_size(size_t __size)
- { return __size < 512 ? size_t(512 / __size) : size_t(1); }
+ { return __size < 512 ? size_t(512 / __size) : size_t(1); }
/**
@@ -647,8 +647,8 @@ namespace std
typedef const value_type* const_pointer;
typedef typename _Base::iterator iterator;
typedef typename _Base::const_iterator const_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
@@ -1160,7 +1160,7 @@ namespace std
*/
iterator
insert(iterator __position)
- { return insert(__position, value_type()); }
+ { return insert(__position, value_type()); }
#endif
/**
@@ -1174,7 +1174,7 @@ namespace std
*/
void
insert(iterator __position, size_type __n, const value_type& __x)
- { _M_fill_insert(__position, __n, __x); }
+ { _M_fill_insert(__position, __n, __x); }
/**
* @brief Inserts a range into the %deque.
diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h
index 9051d2cb933..fcba3598df2 100644
--- a/libstdc++-v3/include/bits/stl_list.h
+++ b/libstdc++-v3/include/bits/stl_list.h
@@ -113,20 +113,20 @@ namespace std
/// Walk the %list forward.
void
_M_incr()
- { _M_node = _M_node->_M_next; }
+ { _M_node = _M_node->_M_next; }
/// Walk the %list backward.
void
_M_decr()
- { _M_node = _M_node->_M_prev; }
+ { _M_node = _M_node->_M_prev; }
bool
operator==(const _List_iterator_base& __x) const
- { return _M_node == __x._M_node; }
+ { return _M_node == __x._M_node; }
bool
operator!=(const _List_iterator_base& __x) const
- { return _M_node != __x._M_node; }
+ { return _M_node != __x._M_node; }
};
/**
@@ -164,12 +164,12 @@ namespace std
reference
operator*() const
- { return static_cast<_Node*>(_M_node)->_M_data; }
- // Must downcast from List_node_base to _List_node to get to _M_data.
+ { return static_cast<_Node*>(_M_node)->_M_data; }
+ // Must downcast from List_node_base to _List_node to get to _M_data.
pointer
operator->() const
- { return &(operator*()); }
+ { return &(operator*()); }
_Self&
operator++()
@@ -226,11 +226,11 @@ namespace std
protected:
_List_node<_Tp>*
_M_get_node()
- { return _M_node_allocator.allocate(1); }
+ { return _M_node_allocator.allocate(1); }
void
_M_put_node(_List_node<_Tp>* __p)
- { _M_node_allocator.deallocate(__p, 1); }
+ { _M_node_allocator.deallocate(__p, 1); }
// NOTA BENE
// The stored instance is not actually of "allocator_type"'s type. Instead
@@ -272,11 +272,11 @@ namespace std
_List_node<_Tp>*
_M_get_node()
- { return _Alloc_type::allocate(1); }
+ { return _Alloc_type::allocate(1); }
void
_M_put_node(_List_node<_Tp>* __p)
- { _Alloc_type::deallocate(__p, 1); }
+ { _Alloc_type::deallocate(__p, 1); }
_List_node<_Tp>* _M_node;
};
@@ -376,8 +376,8 @@ namespace std
typedef const value_type* const_pointer;
typedef _List_iterator<_Tp,_Tp&,_Tp*> iterator;
typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
@@ -828,7 +828,7 @@ namespace std
*/
void
insert(iterator __pos, size_type __n, const value_type& __x)
- { _M_fill_insert(__pos, __n, __x); }
+ { _M_fill_insert(__pos, __n, __x); }
/**
* @brief Inserts a range into the %list.
diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h
index bf86ecedbe6..ed47bbb44e7 100644
--- a/libstdc++-v3/include/bits/stl_map.h
+++ b/libstdc++-v3/include/bits/stl_map.h
@@ -109,7 +109,7 @@ namespace std
value_compare(_Compare __c) : comp(__c) {}
public:
bool operator()(const value_type& __x, const value_type& __y) const
- { return comp(__x.first, __y.first); }
+ { return comp(__x.first, __y.first); }
};
private:
@@ -337,7 +337,7 @@ namespace std
*/
pair<iterator,bool>
insert(const value_type& __x)
- { return _M_t.insert_unique(__x); }
+ { return _M_t.insert_unique(__x); }
/**
* @brief Attempts to insert a std::pair into the %map.
@@ -361,7 +361,7 @@ namespace std
*/
iterator
insert(iterator position, const value_type& __x)
- { return _M_t.insert_unique(position, __x); }
+ { return _M_t.insert_unique(position, __x); }
/**
* @brief A template function that attemps to insert a range of elements.
@@ -374,7 +374,7 @@ namespace std
template <typename _InputIterator>
void
insert(_InputIterator __first, _InputIterator __last)
- { _M_t.insert_unique(__first, __last); }
+ { _M_t.insert_unique(__first, __last); }
/**
* @brief Erases an element from a %map.
@@ -491,7 +491,7 @@ namespace std
*/
size_type
count(const key_type& __x) const
- { return _M_t.find(__x) == _M_t.end() ? 0 : 1; }
+ { return _M_t.find(__x) == _M_t.end() ? 0 : 1; }
/**
* @brief Finds the beginning of a subsequence matching given key.
@@ -541,7 +541,7 @@ namespace std
*/
const_iterator
upper_bound(const key_type& __x) const
- { return _M_t.upper_bound(__x); }
+ { return _M_t.upper_bound(__x); }
/**
* @brief Finds a subsequence matching given key.
@@ -560,7 +560,7 @@ namespace std
*/
pair<iterator,iterator>
equal_range(const key_type& __x)
- { return _M_t.equal_range(__x); }
+ { return _M_t.equal_range(__x); }
/**
* @brief Finds a subsequence matching given key.
@@ -579,7 +579,7 @@ namespace std
*/
pair<const_iterator,const_iterator>
equal_range(const key_type& __x) const
- { return _M_t.equal_range(__x); }
+ { return _M_t.equal_range(__x); }
template <typename _K1, typename _T1, typename _C1, typename _A1>
friend bool operator== (const map<_K1,_T1,_C1,_A1>&,
diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h
index 9cf8e0c5b07..0fa79a8d139 100644
--- a/libstdc++-v3/include/bits/stl_multimap.h
+++ b/libstdc++-v3/include/bits/stl_multimap.h
@@ -123,7 +123,7 @@ namespace std
value_compare(_Compare __c) : comp(__c) {}
public:
bool operator()(const value_type& __x, const value_type& __y) const
- { return comp(__x.first, __y.first); }
+ { return comp(__x.first, __y.first); }
};
private:
@@ -347,7 +347,7 @@ namespace std
*/
iterator
insert(iterator __position, const value_type& __x)
- { return _M_t.insert_equal(__position, __x); }
+ { return _M_t.insert_equal(__position, __x); }
/**
* @brief A template function that attemps to insert a range of elements.
@@ -360,7 +360,7 @@ namespace std
template <typename _InputIterator>
void
insert(_InputIterator __first, _InputIterator __last)
- { _M_t.insert_equal(__first, __last); }
+ { _M_t.insert_equal(__first, __last); }
/**
* @brief Erases an element from a %multimap.
diff --git a/libstdc++-v3/include/bits/stl_threads.h b/libstdc++-v3/include/bits/stl_threads.h
index 0150cd58c85..b21ebdd36d6 100644
--- a/libstdc++-v3/include/bits/stl_threads.h
+++ b/libstdc++-v3/include/bits/stl_threads.h
@@ -1,6 +1,6 @@
// Threading support -*- C++ -*-
-// Copyright (C) 2001 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -126,6 +126,7 @@ namespace std
return __result;
}
#endif
+} //namespace std
// Locking class. Note that this class *does not have a
// constructor*. It must be initialized either statically, with
@@ -141,13 +142,18 @@ namespace std
// functions, and no private or protected members.
#if !defined(__GTHREAD_MUTEX_INIT) && defined(__GTHREAD_MUTEX_INIT_FUNCTION)
+namespace __gnu_cxx
+{
extern __gthread_mutex_t _GLIBCPP_mutex;
extern __gthread_mutex_t *_GLIBCPP_mutex_address;
extern __gthread_once_t _GLIBCPP_once;
extern void _GLIBCPP_mutex_init (void);
extern void _GLIBCPP_mutex_address_init (void);
+}
#endif
+namespace std
+{
struct _STL_mutex_lock
{
// The class must be statically initialized with __STL_MUTEX_INITIALIZER.
@@ -164,22 +170,24 @@ namespace std
// There should be no code in this path given the usage rules above.
#elif defined(__GTHREAD_MUTEX_INIT_FUNCTION)
if (_M_init_flag) return;
- if (__gthread_once (&_GLIBCPP_once, _GLIBCPP_mutex_init) != 0
+ if (__gthread_once (&__gnu_cxx::_GLIBCPP_once,
+ __gnu_cxx::_GLIBCPP_mutex_init) != 0
&& __gthread_active_p ())
abort ();
- __gthread_mutex_lock (&_GLIBCPP_mutex);
+ __gthread_mutex_lock (&__gnu_cxx::_GLIBCPP_mutex);
if (!_M_init_flag)
{
// Even though we have a global lock, we use __gthread_once to be
// absolutely certain the _M_lock mutex is only initialized once on
// multiprocessor systems.
- _GLIBCPP_mutex_address = &_M_lock;
- if (__gthread_once (&_M_once, _GLIBCPP_mutex_address_init) != 0
+ __gnu_cxx::_GLIBCPP_mutex_address = &_M_lock;
+ if (__gthread_once (&_M_once,
+ __gnu_cxx::_GLIBCPP_mutex_address_init) != 0
&& __gthread_active_p ())
abort ();
_M_init_flag = 1;
}
- __gthread_mutex_unlock (&_GLIBCPP_mutex);
+ __gthread_mutex_unlock (&__gnu_cxx::_GLIBCPP_mutex);
#endif
}
diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h
index d2ae142e926..ec218527c0c 100644
--- a/libstdc++-v3/include/bits/stl_tree.h
+++ b/libstdc++-v3/include/bits/stl_tree.h
@@ -702,8 +702,8 @@ namespace std
typedef _Rb_tree_iterator<value_type, const_reference, const_pointer>
const_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
private:
iterator
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index 0e6a2ef1bef..a885d9f8dcb 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -98,7 +98,7 @@ namespace std
void
_M_deallocate(_Tp* __p, size_t __n)
- { if (__p) _M_data_allocator.deallocate(__p, __n); }
+ { if (__p) _M_data_allocator.deallocate(__p, __n); }
};
/// @if maint Specialization for instanceless allocators. @endif
@@ -195,8 +195,8 @@ namespace std
typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector_type>
const_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
@@ -447,7 +447,7 @@ namespace std
*/
size_type
capacity() const
- { return size_type(const_iterator(_M_end_of_storage) - begin()); }
+ { return size_type(const_iterator(_M_end_of_storage) - begin()); }
/**
* Returns true if the %vector is empty. (Thus begin() would equal end().)
@@ -631,7 +631,7 @@ namespace std
*/
iterator
insert(iterator __position)
- { return insert(__position, value_type()); }
+ { return insert(__position, value_type()); }
#endif
/**
@@ -648,7 +648,7 @@ namespace std
*/
void
insert (iterator __pos, size_type __n, const value_type& __x)
- { _M_fill_insert(__pos, __n, __x); }
+ { _M_fill_insert(__pos, __n, __x); }
/**
* @brief Inserts a range into the %vector.
diff --git a/libstdc++-v3/include/bits/streambuf.tcc b/libstdc++-v3/include/bits/streambuf.tcc
index 2f790e902cb..2101f10b2ef 100644
--- a/libstdc++-v3/include/bits/streambuf.tcc
+++ b/libstdc++-v3/include/bits/streambuf.tcc
@@ -208,19 +208,28 @@ namespace std
try
{
while (__testput && __bufsize != -1)
- {
- __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize);
- __ret += __xtrct;
- __sbin->_M_in_cur_move(__xtrct);
- if (__xtrct == __bufsize)
+ {
+ if (__bufsize != 0 && __sbin->gptr() != NULL)
{
- if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof()))
+ __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize);
+ __ret += __xtrct;
+ __sbin->_M_in_cur_move(__xtrct);
+ if (__xtrct != __bufsize)
break;
- __bufsize = __sbin->in_avail();
}
- else
- break;
- }
+ else
+ {
+ _CharT __buf[256];
+ streamsize __charsread = __sbin->sgetn(__buf, sizeof(__buf));
+ __xtrct = __sbout->sputn(__buf, __charsread);
+ __ret += __xtrct;
+ if (__xtrct != __charsread)
+ break;
+ }
+ if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof()))
+ break;
+ __bufsize = __sbin->in_avail();
+ }
}
catch(exception& __fail)
{
diff --git a/libstdc++-v3/include/bits/stringfwd.h b/libstdc++-v3/include/bits/stringfwd.h
index b7418a67a7e..07b1009a4b2 100644
--- a/libstdc++-v3/include/bits/stringfwd.h
+++ b/libstdc++-v3/include/bits/stringfwd.h
@@ -60,7 +60,9 @@ namespace std
typename _Alloc = allocator<_CharT> >
class basic_string;
+ /// 99%% of %string users only ever [need to] see the typedef.
typedef basic_string<char> string;
+ /// 99%% of %wstring users only ever [need to] see the typedef.
typedef basic_string<wchar_t> wstring;
} // namespace std
diff --git a/libstdc++-v3/include/c_shadow/assert.h b/libstdc++-v3/include/c_shadow/assert.h
deleted file mode 100644
index 57e28db743c..00000000000
--- a/libstdc++-v3/include/c_shadow/assert.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_ASSERT_H_
-# define _INCLUDED_CPP_ASSERT_H_ 1
-
-#ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _ASSERT_NEED_C_LEGACY_
-#endif
-
-#include <cassert>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
-#ifdef _ASSERT_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _ASSERT_NEED_C_LEGACY_
-#endif /* _ASSERT_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_ASSERT_H_ */
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cassert.h b/libstdc++-v3/include/c_shadow/bits/std_cassert.h
deleted file mode 100644
index ada1ea16f93..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cassert.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 19.2 Assertions
-//
-
-// NB: This is assumed to be a conforming implementation.
-
-// ISO/IEC 9899:1999 (E), section 7.2
-// assert.h
-// ..defines the assert macro...
-
-// ISO 14882
-// 17.4.1.2 Headers
-// ... declarations and definitions (except for macros) are within
-// namespace scope of the namepace std...
-
-
-//#ifndef _CPP_CASSERT
-//#define _CPP_CASSERT 1
-
-//namespace _C_legacy {
- extern "C" {
-//# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <assert.h>
- }
-//} // namespace _C_legacy
-
-//#undef _IN_C_LEGACY_
-
-//#endif
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cctype.h b/libstdc++-v3/include/c_shadow/bits/std_cctype.h
deleted file mode 100644
index d164d9c198e..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cctype.h
+++ /dev/null
@@ -1,145 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-// ISO C++ 14882: 22
-//
-
-#ifndef _CPP_CCTYPE
-#define _CPP_CCTYPE 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <ctype.h>
- }
-
- inline int
- _CPP_isalnum_capture(int c) { return isalnum(c); }
-
- inline int
- _CPP_isalpha_capture(int c) { return isalpha(c); }
-
- inline int
- _CPP_iscntrl_capture(int c) { return iscntrl(c); }
-
- inline int
- _CPP_isdigit_capture(int c) { return isdigit(c); }
-
- inline int
- _CPP_isgraph_capture(int c) { return isgraph(c); }
-
- inline int
- _CPP_islower_capture(int c) { return islower(c); }
-
- inline int
- _CPP_isprint_capture(int c) { return isprint(c); }
-
- inline int
- _CPP_ispunct_capture(int c) { return ispunct(c); }
-
- inline int
- _CPP_isspace_capture(int c) { return isspace(c); }
-
- inline int
- _CPP_isupper_capture(int c) { return isupper(c); }
-
- inline int
- _CPP_isxdigit_capture(int c) { return isxdigit(c); }
-
- inline int
- _CPP_tolower_capture(int c) { return tolower(c); }
-
- inline int
- _CPP_toupper_capture(int c) { return toupper(c); }
-} // namespace _C_legacy
-
-# undef isalnum
-# undef isalpha
-# undef iscntrl
-# undef isdigit
-# undef isgraph
-# undef islower
-# undef isprint
-# undef ispunct
-# undef isspace
-# undef isupper
-# undef isxdigit
-
-# undef tolower
-# undef toupper
-
-namespace std {
- inline int
- isalnum(int __c) { return _C_legacy::_CPP_isalnum_capture(__c); }
-
- inline int
- isalpha(int __c) { return _C_legacy::_CPP_isalpha_capture(__c); }
-
- inline int
- iscntrl(int __c) { return _C_legacy::_CPP_iscntrl_capture(__c); }
-
- inline int
- isdigit(int __c) { return _C_legacy::_CPP_isdigit_capture(__c); }
-
- inline int
- isgraph(int __c) { return _C_legacy::_CPP_isgraph_capture(__c); }
-
- inline int
- islower(int __c) { return _C_legacy::_CPP_islower_capture(__c); }
-
- inline int
- isprint(int __c) { return _C_legacy::_CPP_isprint_capture(__c); }
-
- inline int
- ispunct(int __c) { return _C_legacy::_CPP_ispunct_capture(__c); }
-
- inline int
- isspace(int __c) { return _C_legacy::_CPP_isspace_capture(__c); }
-
- inline int
- isupper(int __c) { return _C_legacy::_CPP_isupper_capture(__c); }
-
- inline int
- isxdigit(int __c) { return _C_legacy::_CPP_isxdigit_capture(__c); }
-
- inline int
- tolower(int __c) { return _C_legacy::_CPP_tolower_capture(__c); }
-
- inline int
- toupper(int __c) { return _C_legacy::_CPP_toupper_capture(__c); }
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cerrno.h b/libstdc++-v3/include/c_shadow/bits/std_cerrno.h
deleted file mode 100644
index 0f94a420a8e..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cerrno.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-// ISO C++ 14882: 19.3 Error numbers
-//
-
-#ifndef _CPP_CERRNO
-#define _CPP_CERRNO 1
-
-//namespace _C_legacy {
- extern "C" {
-//# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <errno.h>
- }
-//} // namespace _C_legacy::
-
-//# undef _IN_C_LEGACY_
-
-#endif
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cfloat.h b/libstdc++-v3/include/c_shadow/bits/std_cfloat.h
deleted file mode 100644
index d8885e69c44..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cfloat.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 18.2.2 Implementation properties: C library
-//
-
-#ifndef _CPP_CFLOAT
-#define _CPP_CFLOAT 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <float.h>
- }
-} // namespace _C_legacy
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_climits.h b/libstdc++-v3/include/c_shadow/bits/std_climits.h
deleted file mode 100644
index 13d30065ab5..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_climits.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 18.2.2 Implementation properties: C library
-//
-
-#ifndef _CPP_CLIMITS
-#define _CPP_CLIMITS 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <limits.h>
- }
-} // namespace _C_legacy
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_clocale.h b/libstdc++-v3/include/c_shadow/bits/std_clocale.h
deleted file mode 100644
index 86d600e262e..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_clocale.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 18.2.2 Implementation properties: C library
-//
-
-#ifndef _CPP_CLOCALE
-#define _CPP_CLOCALE 1
-
-# include <bits/std_cstddef.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <locale.h>
- }
-
- typedef lconv _CPP_lconv_capture;
-} // namespace _C_legacy
-
-# undef lconv
-# undef setlocale
-# undef localeconv
-
-namespace std {
- // Adopt C names into std::
- struct lconv : _C_legacy::_CPP_lconv_capture { };
-
- using _C_legacy::setlocale;
-
- inline lconv*
- localeconv() { return reinterpret_cast<lconv*>(_C_legacy::localeconv()); }
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cmath.h b/libstdc++-v3/include/c_shadow/bits/std_cmath.h
deleted file mode 100644
index 7201067e303..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cmath.h
+++ /dev/null
@@ -1,749 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000, 2002 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 26.5 C library
-//
-
-#ifndef _CPP_CMATH
-#define _CPP_CMATH 1
-
-# include <bits/c++config.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <math.h>
- }
-
-#if _GLIBCPP_HAVE_ACOSF
- inline float
- _CPP_acos_capture(float __x) { return acosf(__x); }
-#else
- inline float
- _CPP_acos_capture(float __x) { return acos(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_ASINF
- inline float
- _CPP_asin_capture(float __x) { return asinf(__x); }
-#else
- inline float
- _CPP_asin_capture(float __x) { return asin(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_ATANF
- inline float
- _CPP_atan_capture(float __x) { return atanf(__x); }
-#else
- inline float
- _CPP_atan_capture(float __x) { return atan(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_ATAN2F
- inline float
- _CPP_atan2_capture(float __y, float __x) { return atan2f(__y, __x); }
-#else
- inline float
- _CPP_atan2_capture(float __y, float __x)
- { return atan2(static_cast<double>(__y), static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_CEILF
- inline float
- _CPP_ceil_capture(float __x) { return ceilf(__x); }
-#else
- inline float
- _CPP_ceil_capture(float __x) { return ceil(static_cast<double>(__x)); }
-#endif
-
- inline float
- _CPP_cos_capture(float __x) { return __builtin_cosf(__x); }
-
-#if _GLIBCPP_HAVE_COSHF
- inline float
- _CPP_cosh_capture(float __x) { return coshf(__x); }
-#else
- inline float
- _CPP_cosh_capture(float __x) { return cosh(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_EXPF
- inline float
- _CPP_exp_capture(float __x) { return expf(__x); }
-#else
- inline float
- _CPP_exp_capture(float __x) { return exp(static_cast<double>(__x)); }
-#endif
-
- inline float
- _CPP_fabs_capture(float __x) { return __builtin_fabsf(__x); }
-
-#if _GLIBCPP_HAVE_FLOORF
- inline float
- _CPP_floor_capture(float __x) { return floorf(__x); }
-#else
- inline float
- _CPP_floor_capture(float __x) { return floor(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_FMODFF
- inline float
- _CPP_fmod_capture(float __x, float __y) { return fmodf(__x, __y); }
-#else
- inline float
- _CPP_fmod_capture(float __x, float __y)
- { return fmod(static_cast<double>(__x), static_cast<double>(__y)); }
-#endif
-
-#if _GLIBCPP_HAVE_FREXPF
- inline float
- _CPP_frexp_capture(float __x, int* __exp) { return frexpf(__x, __exp); }
-#else
- inline float
- _CPP_frexp_capture(float __x, int* __exp) { return frexp(__x, __exp); }
-#endif
-
-#if _GLIBCPP_HAVE_LDEXPF
- inline float
- _CPP_ldexp_capture(float __x, int __exp) { return ldexpf(__x, __exp); }
-#else
- inline float
- _CPP_ldexp_capture(float __x, int __exp)
- { return ldexp(static_cast<double>(__x), __exp); }
-#endif
-
-#if _GLIBCPP_HAVE_LOGF
- inline float
- _CPP_log_capture(float __x) { return logf(__x); }
-#else
- inline float
- _CPP_log_capture(float __x) { return log(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_LOG10F
- inline float
- _CPP_log10_capture(float __x) { return log10f(__x); }
-#else
- inline float
- _CPP_log10_capture(float __x) { return log10(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_MODFF
- inline float
- _CPP_modf_capture(float __x, float* __iptr) { return modff(__x, __iptr); }
-#else
- inline float
- _CPP_modf_capture(float __x, float* __iptr)
- {
- double __tmp;
- double __res = _C_legacy::modf(static_cast<double>(__x), &__tmp);
- *__iptr = static_cast<float> (__tmp);
- return __res;
- }
-#endif
-
-#if _GLIBCPP_HAVE_POWF
- inline float
- _CPP_pow_capture(float __x, float __y) { return powf(__x, __y); }
-#else
- inline float
- _CPP_pow_capture(float __x, float __y)
- { return pow(static_cast<double>(__x), static_cast<double>(__y)); }
-#endif
-
- float pow(float, int);
-
- inline float
- _CPP_sin_capture(float __x) { return __builtin_sinf(__x); }
-
-#if _GLIBCPP_HAVE_SINHF
- inline float
- _CPP_sinh_capture(float __x) { return sinhf(__x); }
-#else
- inline float
- _CPP_sinh_capture(float __x) { return sinh(static_cast<double>(__x)); }
-#endif
-
- inline float
- _CPP_sqrt_capture(float __x) { return __builtin_sqrtf(__x); }
-
-#if _GLIBCPP_HAVE_TANF
- inline float
- _CPP_tan_capture(float __x) { return tanf(__x); }
-#else
- inline float
- _CPP_tan_capture(float __x) { return tan(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_TANHF
- inline float
- _CPP_tanh_capture(float __x) { return tanhf(__x); }
-#else
- inline float
- _CPP_tanh_capture(float __x) { return tanh(static_cast<double>(__x)); }
-#endif
-
-
- inline double
- _CPP_acos_capture(double __x) { return acos(__x); }
-
- inline double
- _CPP_asin_capture(double __x) { return asin(__x); }
-
- inline double
- _CPP_atan_capture(double __x) { return atan(__x); }
-
- inline double
- _CPP_atan2_capture(double __y, double __x) { return atan2(__y, __x); }
-
- inline double
- _CPP_ceil_capture(double __x) { return ceil(__x); }
-
- inline double
- _CPP_cos_capture(double __x) { return __builtin_cos(__x); }
-
- inline double
- _CPP_cosh_capture(double __x) { return cosh(__x); }
-
- inline double
- _CPP_exp_capture(double __x) { return exp(__x); }
-
- inline double
- _CPP_fabs_capture(double __x) { return __builtin_fabs(__x); }
-
- inline double
- _CPP_floor_capture(double __x) { return floor(__x); }
-
- inline double
- _CPP_fmod_capture(double __x, double __y) { return fmod(__x, __y); }
-
- inline double
- _CPP_frexp_capture(double __x, int* __exp) { return frexp(__x, __exp); }
-
- inline double
- _CPP_ldexp_capture(double __x, int __exp) { return ldexp(__x, __exp); }
-
- inline double
- _CPP_log_capture(double __x) { return log(__x); }
-
- inline double
- _CPP_log10_capture(double __x) { return log10(__x); }
-
- inline double
- _CPP_modf_capture(double __x, double* __iptr) { return modf(__x, __iptr); }
-
- inline double
- _CPP_pow_capture(double __x, double __y) { return pow(__x, __y); }
-
- inline double
- _CPP_sin_capture(double __x) { return __builtin_sin(__x); }
-
- inline double
- _CPP_sinh_capture(double __x) { return sinh(__x); }
-
- inline double
- _CPP_sqrt_capture(double __x) { return __builtin_sqrt(__x); }
-
- inline double
- _CPP_tan_capture(double __x) { return tan(__x); }
-
- inline double
- _CPP_tanh_capture(double __x) { return tanh(__x); }
-
-#if _GLIBCPP_HAVE_ACOSL
- inline long double
- _CPP_acos_capture(long double __x) { return acosl(__x); }
-#else
- inline long double
- _CPP_acos_capture(long double __x) { return acos(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_ASINL
- inline long double
- _CPP_asin_capture(long double __x) { return asinl(__x); }
-#else
- inline long double
- _CPP_asin_capture(long double __x) { return asin(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_ATANL
- inline long double
- _CPP_atan_capture(long double __x) { return atanl(__x); }
-#else
- inline long double
- _CPP_atan_capture(long double __x) { return atan(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_ATAN2L
- inline long double
- _CPP_atan2_capture(long double __y, long double __x)
- { return atan2l(__y, __x); }
-#else
- inline long double
- _CPP_atan2_capture(long double __y, long double __x)
- { return atan2(static_cast<double>(__y), static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_CEILL
- inline long double
- _CPP_ceil_capture(long double __x) { return ceill(__x); }
-#else
- inline long double
- _CPP_ceil_capture(long double __x) { return ceil(static_cast<double>(__x)); }
-#endif
-
- inline long double
- _CPP_cos_capture(long double __x) { return __builtin_cosl(__x); }
-
-#if _GLIBCPP_HAVE_COSHL
- inline long double
- _CPP_cosh_capture(long double __x) { return coshl(__x); }
-#else
- inline long double
- _CPP_cosh_capture(long double __x) { return cosh(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_EXPL
- inline long double
- _CPP_exp_capture(long double __x) { return expl(__x); }
-#else
- inline long double
- _CPP_exp_capture(long double __x) { return exp(static_cast<double>(__x)); }
-#endif
-
- inline long double
- _CPP_fabs_capture(long double __x) { return __builtin_fabsl(__x); }
-
-#if _GLIBCPP_HAVE_FLOORL
- inline long double
- _CPP_floor_capture(long double __x) { return floorl(__x); }
-#else
- inline long double
- _CPP_floor_capture(long double __x)
- { return floor(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_FMODL
- inline long double
- _CPP_fmod_capture(long double __x, long double __y)
- { return fmodl(__x, __y); }
-#else
- inline long double
- _CPP_fmod_capture(long double __x, long double __y)
- { return fmod(static_cast<double>(__x), static_cast<double>(__y)); }
-#endif
-
-#if _GLIBCPP_HAVE_FREXPL
- inline long double
- _CPP_frexp_capture(long double __x, int* __exp)
- { return frexpl(__x, __exp); }
-#else
- inline long double
- _CPP_frexp_capture(long double __x, int* __exp)
- { return frexp(static_cast<double>(__x), __exp); }
-#endif
-
-#if _GLIBCPP_HAVE_LDEXPL
- inline long double
- _CPP_ldexp_capture(long double __x, int __exp) { return ldexpl(__x, __exp); }
-#else
- inline long double
- _CPP_ldexp_capture(long double __x, int __exp)
- { return ldexp(static_cast<double>(__x), __exp); }
-#endif
-
-#if _GLIBCPP_HAVE_LOGL
- inline long double
- _CPP_log_capture(long double __x) { return logl(__x); }
-#else
- inline long double
- _CPP_log_capture(long double __x) { return log(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_LOG10L
- inline long double
- _CPP_log10_capture(long double __x) { return log10l(__x); }
-#else
- inline long double
- _CPP_log10_capture(long double __x)
- { return log10(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_MODFL
- inline long double
- _CPP_modf_capture(long double __x, long double* __iptr)
- { return modfl(__x, __iptr); }
-#else
- inline long double
- _CPP_modf_capture(long double __x, long double* __iptr)
- {
- double __tmp;
- double __res = _C_legacy::modf(static_cast<double>(__x), &__tmp);
- *__iptr = static_cast<long double> (__tmp);
- return __res;
- }
-#endif
-
-#if _GLIBCPP_HAVE_POWL
- inline long double
- _CPP_pow_capture(long double __x, long double __y) { return powl(__x, __y); }
-#else
- inline long double
- _CPP_pow_capture(long double __x, long double __y)
- { return pow(static_cast<double>(__x), static_cast<double>(__y)); }
-#endif
-
- inline long double
- _CPP_sin_capture(long double __x) { return __builtin_sinl(__x); }
-
-#if _GLIBCPP_HAVE_SINHL
- inline long double
- _CPP_sinh_capture(long double __x) { return sinhl(__x); }
-#else
- inline long double
- _CPP_sinh_capture(long double __x) { return sinh(static_cast<double>(__x)); }
-#endif
-
- inline long double
- _CPP_sqrt_capture(long double __x) { return __builtin_sqrtl(__x); }
-
-#if _GLIBCPP_HAVE_TANL
- inline long double
- _CPP_tan_capture(long double __x) { return tanl(__x); }
-#else
- inline long double
- _CPP_tan_capture(long double __x) { return tan(static_cast<double>(__x)); }
-#endif
-
-#if _GLIBCPP_HAVE_TANHL
- inline long double
- _CPP_tanh_capture(long double __x) { return tanhl(__x); }
-#else
- inline long double
- _CPP_tanh_capture(long double __x) { return tanh(static_cast<double>(__x)); }
-#endif
-} // namespace _C_legacy
-
-# undef abs
-# undef acos
-# undef asin
-# undef atan
-# undef atan2
-# undef ceil
-# undef cos
-# undef cosh
-# undef exp
-# undef fabs
-# undef floor
-# undef fmod
-# undef frexp
-# undef ldexp
-# undef log
-# undef log10
-# undef modf
-# undef pow
-# undef sin
-# undef sinh
-# undef sqrt
-# undef tan
-# undef tanh
-
-namespace std {
- inline float
- abs(float __x) { return _C_legacy::_CPP_fabs_capture(__x); }
-
- inline float
- acos(float __x) { return _C_legacy::_CPP_acos_capture(__x); }
-
- inline float
- asin(float __x) { return _C_legacy::_CPP_asin_capture(__x); }
-
- inline float
- atan(float __x) { return _C_legacy::_CPP_atan_capture(__x); }
-
- inline float
- atan2(float __y, float __x)
- { return _C_legacy::_CPP_atan2_capture(__y, __x); }
-
- inline float
- ceil(float __x) { return _C_legacy::_CPP_ceil_capture(__x); }
-
- inline float
- cos(float __x) { return _C_legacy::_CPP_cos_capture(__x); }
-
- inline float
- cosh(float __x) { return _C_legacy::_CPP_cosh_capture(__x); }
-
- inline float
- exp(float __x) { return _C_legacy::_CPP_exp_capture(__x); }
-
- inline float
- fabs(float __x) { return _C_legacy::_CPP_fabs_capture(__x); }
-
- inline float
- floor(float __x) { return _C_legacy::_CPP_floor_capture(__x); }
-
- inline float
- fmod(float __x, float __y)
- { return _C_legacy::_CPP_fmod_capture(__x, __y); }
-
- inline float
- frexp(float __x, int* __exp)
- { return _C_legacy::_CPP_frexp_capture(__x, __exp); }
-
- inline float
- ldexp(float __x, int __exp)
- { return _C_legacy::_CPP_ldexp_capture(__x, __exp); }
-
- inline float
- log(float __x) { return _C_legacy::_CPP_log_capture(__x); }
-
- inline float
- log10(float __x) { return _C_legacy::_CPP_log10_capture(__x); }
-
- inline float
- modf(float __x, float* __iptr)
- { return _C_legacy::_CPP_modf_capture(__x, __iptr); }
-
- inline float
- pow(float __x, float __y) { return _C_legacy::_CPP_pow_capture(__x, __y); }
-
- float
- pow(float, int);
-
- inline float
- sin(float __x) { return _C_legacy::_CPP_sin_capture(__x); }
-
- inline float
- sinh(float __x) { return _C_legacy::_CPP_sinh_capture(__x); }
-
- inline float
- sqrt(float __x) { return _C_legacy::_CPP_sqrt_capture(__x); }
-
- inline float
- tan(float __x) { return _C_legacy::_CPP_tan_capture(__x); }
-
- inline float
- tanh(float __x) { return _C_legacy::_CPP_tanh_capture(__x); }
-
- inline double
- abs(double __x) { return _C_legacy::_CPP_fabs_capture(__x); }
-
- inline double
- acos(double __x) { return _C_legacy::_CPP_acos_capture(__x); }
-
- inline double
- asin(double __x) { return _C_legacy::_CPP_asin_capture(__x); }
-
- inline double
- atan(double __x) { return _C_legacy::_CPP_atan_capture(__x); }
-
- inline double
- atan2(double __y, double __x)
- { return _C_legacy::_CPP_atan2_capture(__y, __x); }
-
- inline double
- ceil(double __x) { return _C_legacy::_CPP_ceil_capture(__x); }
-
- inline double
- cos(double __x) { return _C_legacy::_CPP_cos_capture(__x); }
-
- inline double
- cosh(double __x) { return _C_legacy::_CPP_cosh_capture(__x); }
-
- inline double
- exp(double __x) { return _C_legacy::_CPP_exp_capture(__x); }
-
- inline double
- fabs(double __x) { return _C_legacy::_CPP_fabs_capture(__x); }
-
- inline double
- floor(double __x) { return _C_legacy::_CPP_floor_capture(__x); }
-
- inline double
- fmod(double __x, double __y)
- { return _C_legacy::_CPP_fmod_capture(__x, __y); }
-
- inline double
- frexp(double __x, int* __exp)
- { return _C_legacy::_CPP_frexp_capture(__x, __exp); }
-
- inline double
- ldexp(double __x, int __exp)
- { return _C_legacy::_CPP_ldexp_capture(__x, __exp); }
-
- inline double
- log(double __x) { return _C_legacy::_CPP_log_capture(__x); }
-
- inline double
- log10(double __x) { return _C_legacy::_CPP_log10_capture(__x); }
-
- inline double
- modf(double __x, double* __iptr)
- { return _C_legacy::_CPP_modf_capture(__x, __iptr); }
-
- inline double
- pow(double __x, double __y)
- { return _C_legacy::_CPP_pow_capture(__x, __y); }
-
- double
- pow(double, int);
-
- inline double
- sin(double __x) { return _C_legacy::_CPP_sin_capture(__x); }
-
- inline double
- sinh(double __x) { return _C_legacy::_CPP_sinh_capture(__x); }
-
- inline double
- sqrt(double __x) { return _C_legacy::_CPP_sqrt_capture(__x); }
-
- inline double
- tan(double __x) { return _C_legacy::_CPP_tan_capture(__x); }
-
- inline double
- tanh(double __x) { return _C_legacy::_CPP_tanh_capture(__x); }
-
- inline long double
- abs(long double __x) { return _C_legacy::_CPP_fabs_capture(__x); }
-
- inline long double
- acos(long double __x) { return _C_legacy::_CPP_acos_capture(__x); }
-
- inline long double
- asin(long double __x) { return _C_legacy::_CPP_asin_capture(__x); }
-
- inline long double
- atan(long double __x) { return _C_legacy::_CPP_atan_capture(__x); }
-
- inline long double
- atan2(long double __y, long double __x)
- { return _C_legacy::_CPP_atan2_capture(__y, __x); }
-
- inline long double
- ceil(long double __x) { return _C_legacy::_CPP_ceil_capture(__x); }
-
- inline long double
- cos(long double __x) { return _C_legacy::_CPP_cos_capture(__x); }
-
- inline long double
- cosh(long double __x) { return _C_legacy::_CPP_cosh_capture(__x); }
-
- inline long double
- exp(long double __x) { return _C_legacy::_CPP_exp_capture(__x); }
-
- inline long double
- fabs(long double __x) { return _C_legacy::_CPP_fabs_capture(__x); }
-
- inline long double
- floor(long double __x) { return _C_legacy::_CPP_floor_capture(__x); }
-
- inline long double
- fmod(long double __x, long double __y)
- { return _C_legacy::_CPP_fmod_capture(__x, __y); }
-
- inline long double
- frexp(long double __x, int* __exp)
- { return _C_legacy::_CPP_frexp_capture(__x, __exp); }
-
- inline long double
- ldexp(long double __x, int __exp)
- { return _C_legacy::_CPP_ldexp_capture(__x, __exp); }
-
- inline long double
- log(long double __x) { return _C_legacy::_CPP_log_capture(__x); }
-
- inline long double
- log10(long double __x) { return _C_legacy::_CPP_log10_capture(__x); }
-
- inline long double
- modf(long double __x, long double* __iptr)
- { return _C_legacy::_CPP_modf_capture(__x, __iptr); }
-
- inline long double
- pow(long double __x, long double __y)
- { return _C_legacy::_CPP_pow_capture(__x, __y); }
-
- long double
- pow(long double, int);
-
- inline long double
- sin(long double __x) { return _C_legacy::_CPP_sin_capture(__x); }
-
- inline long double
- sinh(long double __x) { return _C_legacy::_CPP_sinh_capture(__x); }
-
- inline long double
- sqrt(long double __x) { return _C_legacy::_CPP_sqrt_capture(__x); }
-
- inline long double
- tan(long double __x) { return _C_legacy::_CPP_tan_capture(__x); }
-
- inline long double
- tanh(long double __x) { return _C_legacy::_CPP_tanh_capture(__x); }
-
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_csetjmp.h b/libstdc++-v3/include/c_shadow/bits/std_csetjmp.h
deleted file mode 100644
index c8f37002329..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_csetjmp.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.4.6 C library
-//
-
-#ifndef _CPP_CSETJMP
-#define _CPP_CSETJMP 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <setjmp.h>
- }
- inline int
- _CPP_setjmp_capture(jmp_buf __jb) { return setjmp(__jb); }
-} // namespace _C_legacy
-
-# undef jmp_buf
-# undef setjmp
-# define setjmp(__jb) _C_legacy::_CPP_setjmp_capture(__jb)
-# undef longjmp
-
-namespace std {
- // Adopt C names into std::
- using _C_legacy::jmp_buf;
- using _C_legacy::longjmp;
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_csignal.h b/libstdc++-v3/include/c_shadow/bits/std_csignal.h
deleted file mode 100644
index 71f91260214..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_csignal.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.4.6 C library
-//
-
-#ifndef _CPP_CSIGNAL
-#define _CPP_CSIGNAL 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
- // XXX
-# undef __need_sig_atomic_t
-# undef __need_sigset_t
-
-# pragma GCC system_header
-# include_next <signal.h>
- }
-} // namespace _C_legacy
-
-# undef sig_atomic_t
-# undef raise
-# undef signal
-
-namespace std {
- // Adopt C names into std::
- using _C_legacy::sig_atomic_t;
- using _C_legacy::raise;
- using _C_legacy::signal;
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cstdarg.h b/libstdc++-v3/include/c_shadow/bits/std_cstdarg.h
deleted file mode 100644
index eb1b7909e74..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cstdarg.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.4.6 C library
-//
-
-#ifndef _CPP_CSTDARG
-#define _CPP_CSTDARG 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <stdarg.h>
- }
-} // namespace _C_legacy
-
-# undef va_list
-
-namespace std {
- using _C_legacy::va_list;
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cstddef.h b/libstdc++-v3/include/c_shadow/bits/std_cstddef.h
deleted file mode 100644
index 588566499b3..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cstddef.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 18.1 Types
-//
-
-#ifndef _CPP_CSTDDEF
-#define _CPP_CSTDDEF 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-// XXX
-# define __need_size_t
-# define __need_ptrdiff_t
-# define __need_NULL
-# include_next <stddef.h>
- }
-} // namespace _C_legacy
-
-# undef ptrdiff_t
-# undef size_t
-
-namespace std {
- using _C_legacy::ptrdiff_t;
- using _C_legacy::size_t;
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cstdio.h b/libstdc++-v3/include/c_shadow/bits/std_cstdio.h
deleted file mode 100644
index db2761281d0..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cstdio.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 27.8.2 C Library files
-//
-
-#ifndef _CPP_CSTDIO
-#define _CPP_CSTDIO 1
-
-# include <bits/std_cstddef.h>
-# include <bits/std_cstdarg.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef __need_FILE
-# pragma GCC system_header
-# include_next <stdio.h>
- }
-
- typedef FILE _CPP_FILE_capture;
- typedef fpos_t _CPP_fpos_t_capture;
-
- inline FILE*
- _CPP_stderr_capture() { return stderr; }
-
- inline FILE*
- _CPP_stdin_capture() { return stdin; }
-
- inline FILE*
- _CPP_stdout_capture() { return stdout; }
-
- inline int
- _CPP_getc_capture(FILE* __f) { return getc(__f); }
-
- inline int
- _CPP_getchar_capture() { return getchar(); }
-
- inline int
- _CPP_putc_capture(int __c, FILE* __f) { return putc(__c, __f); }
-
- inline int
- _CPP_putchar_capture(int __c) { return putchar(__c); }
-
- inline int
- _CPP_feof_capture(FILE* __f) { return feof(__f); }
-
-} // namespace _C_legacy
-
-# undef FILE
-# undef fpos_t
-
-# undef remove
-# undef rename
-# undef tmpfile
-# undef tmpnam
-# undef fclose
-# undef fflush
-# undef fopen
-# undef freopen
-# undef setbuf
-# undef setvbuf
-# undef fprintf
-# undef fscanf
-# undef printf
-# undef scanf
-# undef sprintf
-# undef sscanf
-# undef vfprintf
-# undef vprintf
-# undef vsprintf
-# undef fgetc
-# undef fgets
-# undef fputc
-# undef fputs
-# undef getc
-# undef getchar
-# undef gets
-# undef putc
-# undef putchar
-# undef puts
-# undef ungetc
-# undef fread
-# undef fwrite
-# undef fgetpos
-# undef fseek
-# undef fsetpos
-# undef ftell
-# undef rewind
-# undef clearerr
-# undef feof
-# undef ferror
-# undef perror
-
-# undef stderr
-# define stderr std::_CPP_stderr()
-# undef stdin
-# define stdin std::_CPP_stdin()
-# undef stdout
-# define stdout std::_CPP_stdout()
-
-namespace std {
- struct FILE : _C_legacy::_CPP_FILE_capture { };
- struct fpos_t { _C_legacy::_CPP_fpos_t_capture _M_dummy; };
-
- using _C_legacy::remove;
- using _C_legacy::rename;
- using _C_legacy::tmpnam;
- using _C_legacy::printf;
- using _C_legacy::scanf;
- using _C_legacy::sprintf;
- using _C_legacy::sscanf;
- using _C_legacy::gets;
- using _C_legacy::perror;
-
- inline FILE*
- _CPP_stderr()
- { return reinterpret_cast<FILE*>(_C_legacy::_CPP_stderr_capture() ); }
-
- inline FILE*
- _CPP_stdin()
- { return reinterpret_cast<FILE*>(_C_legacy::_CPP_stdin_capture() ); }
-
- inline FILE*
- _CPP_stdout()
- { return reinterpret_cast<FILE*>(_C_legacy::_CPP_stdout_capture() ); }
-
- inline FILE*
- tmpfile() { return reinterpret_cast<FILE*>(_C_legacy::tmpfile()); }
-
- inline int
- fclose(FILE* __f) { return _C_legacy::fclose(__f); }
-
- inline int
- fflush(FILE* __f) { return _C_legacy::fflush(__f); }
-
- inline FILE*
- fopen(char const* __name, char const* __mode)
- { return reinterpret_cast<FILE*>(_C_legacy::fopen(__name,__mode)); }
-
- inline FILE*
- freopen(char const* __name, char const* __mode, FILE* __f)
- { return reinterpret_cast<FILE*>(_C_legacy::freopen(__name,__mode,__f)); }
-
- inline void
- setbuf(FILE* __f, char* __buf)
- { return _C_legacy::setbuf(__f, __buf); }
-
- inline int
- setvbuf(FILE* __f, char* __buf, int __mode, size_t __size)
- { return _C_legacy::setvbuf(__f, __buf, __mode, __size); }
-
- inline int
- fprintf(FILE* __f, char const* __fmt, ...)
- {
- va_list __v;
- va_start(__v,__fmt);
- int __i = _C_legacy::vfprintf(__f, __fmt, __v);
- va_end(__v);
- return __i;
- }
-
- inline int
- fscanf(FILE* __f, char const* __fmt, ...)
- {
- va_list __v;
- va_start(__v,__fmt);
- int __i = _C_legacy::vfscanf(__f, __fmt, __v);
- va_end(__v);
- return __i;
- }
-
- inline int
- vfprintf(FILE* __f, char const* __fmt, va_list __v)
- { return _C_legacy::vfprintf(__f, __fmt, __v); }
-
- inline int
- vprintf(char const* __fmt, va_list __v)
- { return _C_legacy::vprintf(__fmt, __v); }
-
- inline int
- vsprintf(char* __buf, char const* __fmt, va_list __v)
- { return _C_legacy::vsprintf(__buf, __fmt, __v); }
-
- inline int
- fgetc(FILE* __f) { return _C_legacy::fgetc(__f); }
-
- inline char*
- fgets(char* __buf, int __n, FILE* __f)
- { return _C_legacy::fgets(__buf, __n, __f); }
-
- inline int
- fputc(int __c, FILE* __f) { return _C_legacy::fputc(__c, __f); }
-
- inline int
- fputs(char const* __s, FILE* __f)
- { return _C_legacy::fputs(__s, __f); }
-
- inline int
- getc(FILE* __f) { return _C_legacy::_CPP_getc_capture(__f); }
-
- inline int
- getchar() { return _C_legacy::_CPP_getchar_capture(); }
-
- inline int
- putc(int __c, FILE* __f)
- { return _C_legacy::_CPP_putc_capture(__c, __f); }
-
- inline int
- putchar(int __c) { return _C_legacy::_CPP_putchar_capture(__c); }
-
- using _C_legacy::puts;
-
- inline int
- ungetc(int __c, FILE* __f) { return _C_legacy::ungetc(__c, __f); }
-
- inline size_t
- fread(void* __p, size_t __z, size_t __n, FILE* __f)
- { return _C_legacy::fread(__p,__z,__n,__f); }
-
- inline size_t
- fwrite(void const* __p, size_t __z, size_t __n, FILE* __f)
- { return _C_legacy::fwrite(__p,__z,__n,__f); }
-
- inline int
- fgetpos(FILE* __f, fpos_t* __pos)
- { return _C_legacy::fgetpos(__f,&__pos->_M_dummy); }
-
- inline int
- fseek(FILE* __f, long __off, int __how)
- { return _C_legacy::fseek(__f,__off,__how); }
-
- inline int
- fsetpos(FILE* __f, fpos_t const* __pos)
- { return _C_legacy::fsetpos(__f,&__pos->_M_dummy); }
-
- inline long
- ftell(FILE* __f) { return _C_legacy::ftell(__f); }
-
- inline void
- rewind(FILE* __f) { return _C_legacy::rewind(__f); }
-
- inline void
- clearerr(FILE* __f) { return _C_legacy::clearerr(__f); }
-
- inline int
- feof(FILE* __f) { return _C_legacy::_CPP_feof_capture(__f); }
-
- inline int
- ferror(FILE* __f) { return _C_legacy::ferror(__f); }
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cstdlib.h b/libstdc++-v3/include/c_shadow/bits/std_cstdlib.h
deleted file mode 100644
index d219efd6750..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cstdlib.h
+++ /dev/null
@@ -1,197 +0,0 @@
-// -*- C++ -*- header wrapper
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.4.6 C library
-//
-
-// Function decls in this header are overloaded on the
-// extern "C"-ness of arguments. This is a rich ground
-// for compiler bugs.
-
-#ifndef _CPP_CSTDLIB
-#define _CPP_CSTDLIB 1
-
-# include <bits/c++config.h>
-# include <bits/std_cstddef.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <stdlib.h>
- typedef int (*_C_cmp_fun_ptr)(const void*, const void*); // C fn ptr
- }
-
- typedef div_t _CPP_div_t_capture;
- typedef ldiv_t _CPP_ldiv_t_capture;
-
-# if _GLIBCPP_HAVE_LLDIV_T
- typedef lldiv_t _CPP_lldiv_t_capture;
-# endif
-} // namespace _C_legacy
-
-# undef wchar_t
-# undef div_t
-# undef ldiv_t
-
-# undef atof
-# undef atoi
-# undef atol
-# undef strtod
-# undef strtol
-# undef strtoul
-#ifdef _GLIBCPP_HAVE_STRTOLD
-# undef strtold
-#endif
-# undef rand
-# undef srand
-# undef calloc
-# undef free
-# undef malloc
-# undef realloc
-# undef abort
-# undef atexit
-# undef exit
-# undef getenv
-# undef system
-# undef bsearch
-# undef qsort
-# undef abs
-# undef div
-# undef labs
-# undef ldiv
-#ifdef _GLIBCPP_USE_C99
-# undef llabs
-# undef lldiv
-#endif
-# undef mblen
-# undef mbtowc
-# undef wctomb
-# undef mbstowcs
-# undef wcstombs
-
-namespace std {
- struct div_t : _C_legacy::_CPP_div_t_capture { };
- struct ldiv_t : _C_legacy::_CPP_ldiv_t_capture { };
-
-#ifdef _GLIBCPP_USE_C99
-# ifdef _GLIBCPP_HAVE_LLDIV_T
- struct lldiv_t : _C_legacy::_CPP_lldiv_t_capture { };
-# else
- struct lldiv_t
- {
- long long quot;
- long long rem;
- };
-# endif
-#endif
-
- using _C_legacy::atof;
- using _C_legacy::atoi;
- using _C_legacy::atol;
- using _C_legacy::strtod;
- using _C_legacy::strtol;
- using _C_legacy::strtoul;
- using _C_legacy::rand;
- using _C_legacy::srand;
- using _C_legacy::calloc;
- using _C_legacy::free;
- using _C_legacy::malloc;
- using _C_legacy::realloc;
-
- // using _C_legacy::abort;
- using _C_legacy::atexit;
- // using _C_legacy::exit;
- using _C_legacy::bsearch;
- using _C_legacy::qsort;
-
- using _C_legacy::getenv;
- using _C_legacy::system;
- using _C_legacy::mbtowc;
- using _C_legacy::wctomb;
- using _C_legacy::mbstowcs;
- using _C_legacy::wcstombs;
-
- using _C_legacy::strtof;
-
-#ifdef _GLIBCPP_USE_LONG_LONG
- using _C_legacy::strtoll;
- using _C_legacy::strtoull;
-#endif
-
-#ifdef _GLIBCPP_HAVE_STRTOLD
- using _C_legacy::strtold;
-#endif
-
- using _C_legacy::mblen;
-
- inline int
- abs(int __x) { return __x >= 0 ? __x : -__x; }
-
- inline div_t
- div(int __n, int __d)
- { div_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
-
- inline long
- labs(long __x) { return __x >= 0 ? __x : -__x; }
-
- inline long
- abs(long __x) { return __x >= 0 ? __x : -__x; }
-
- inline ldiv_t
- ldiv(long __n, long __d)
- { ldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
-
- inline ldiv_t
- div(long __n, long __d)
- { ldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
-
-#ifdef _GLIBCPP_USE_C99
- inline long long
- llabs(long long __x) { return __x >= 0 ? __x : -__x; }
-
- inline long long
- abs(long long __x) { return __x >= 0 ? __x : -__x; }
-
- inline lldiv_t
- lldiv(long long __n, long long __d)
- { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
-
- inline lldiv_t
- div(long long __n, long long __d)
- { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
-#endif
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cstring.h b/libstdc++-v3/include/c_shadow/bits/std_cstring.h
deleted file mode 100644
index 38b9e6b617d..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cstring.h
+++ /dev/null
@@ -1,279 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.4.6 C library
-//
-
-#ifndef _CPP_CSTRING
-#define _CPP_CSTRING 1
-
-# if defined __GLIBC__ && __GLIBC__ >= 2
-// We must not see the optimized string functions GNU libc defines.
-# define __NO_STRING_INLINES
-# endif
-
-# include <bits/std_cstddef.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <string.h>
- }
-
- // We do inline captures of most of these in case they
- // have been optimized with macros.
- inline void*
- _CPP_memcpy_capture(void* __s1, void const* __s2, size_t __n)
- { return memcpy(__s1, __s2, __n); }
-
- inline void*
- _CPP_memmove_capture(void* __s1, void const* __s2, size_t __n)
- { return memmove(__s1, __s2, __n); }
-
- inline void*
- _CPP_strcpy_capture(char* __s1, char const* __s2)
- { return strcpy(__s1, __s2); }
-
- inline char*
- _CPP_strncpy_capture(char* __s1, char const* __s2, size_t __n)
- { return strncpy(__s1, __s2, __n); }
-
- inline char*
- _CPP_strcat_capture(char* __s1, char const* __s2)
- { return strcat(__s1, __s2); }
-
- inline char*
- _CPP_strncat_capture(char* __s1, char const* __s2, size_t __n)
- { return strncat(__s1, __s2, __n); }
-
- inline int
- _CPP_memcmp_capture(void const* __s1, void const* __s2, size_t __n)
- { return memcmp(__s1, __s2, __n); }
-
- inline int
- _CPP_strcmp_capture(char const* __s1, char const* __s2)
- { return strcmp(__s1, __s2); }
-
- inline int
- _CPP_strcoll_capture(char const* __s1, char const* __s2)
- { return strcoll(__s1, __s2); }
-
- inline int
- _CPP_strncmp_capture(char const* __s1, char const* __s2, size_t __n)
- { return strncmp(__s1, __s2, __n); }
-
- inline size_t
- _CPP_strxfrm_capture(char* __b, char const* __s, size_t __n)
- { return strxfrm(__b, __s, __n); }
-
- inline void*
- _CPP_memchr_capture(void const* __s1, int __c, size_t __n)
- { return memchr(__s1, __c, __n); }
-
- inline char*
- _CPP_strchr_capture(char const* __s1, int __c)
- { return strchr(__s1, __c); }
-
- inline size_t
- _CPP_strcspn_capture(char const* __s1, char const* __s2)
- { return strcspn(__s1, __s2); }
-
- inline char*
- _CPP_strpbrk_capture(char const* __s1, char const* __s2)
- { return strpbrk(__s1, __s2); }
-
- inline char*
- _CPP_strrchr_capture(char const* __s1, int __c)
- { return strrchr(__s1, __c); }
-
- inline size_t
- _CPP_strspn_capture(char const* __s1, char const* __s2)
- { return strspn(__s1, __s2); }
-
- inline char*
- _CPP_strstr_capture(char const* __s1, char const* __s2)
- { return strstr(__s1, __s2); }
-
- inline char*
- _CPP_strtok_capture(char* __s1, char const* __s2)
- { return strtok(__s1, __s2); }
-
- inline void*
- _CPP_memset_capture(void* __s, int __c, size_t __n)
- { return memset(__s, __c, __n); }
-
- // inline char*
- // _CPP_strerror_capture(int __num)
- // { return strerror(__num); }
-
- inline size_t
- _CPP_strlen_capture(char const* __s)
- { return strlen(__s); }
-} // namespace _C_legacy
-
-# undef memcpy
-# undef memmove
-# undef strcpy
-# undef strncpy
-# undef strcat
-# undef strncat
-# undef memcmp
-# undef strcmp
-# undef strcoll
-# undef strncmp
-# undef strxfrm
-# undef memchr
-# undef strchr
-# undef strcspn
-# undef strpbrk
-# undef strrchr
-# undef strspn
-# undef strstr
-# undef strtok
-# undef memset
-# undef strerror
-# undef strlen
-
-namespace std {
- // Redefine most of these inline. Note that the
- // C++ definition differs from C in some cases.
- inline void*
- memcpy(void* __s1, void const* __s2, size_t __n)
- { return _C_legacy::_CPP_memcpy_capture(__s1, __s2, __n); }
-
- inline void*
- memmove(void* __s1, void const* __s2, size_t __n)
- { return _C_legacy::_CPP_memmove_capture(__s1, __s2, __n); }
-
- inline void*
- strcpy(char* __s1, char const* __s2)
- { return _C_legacy::_CPP_strcpy_capture(__s1, __s2); }
-
- inline char*
- strncpy(char* __s1, char const* __s2, size_t __n)
- { return _C_legacy::_CPP_strncpy_capture(__s1, __s2, __n); }
-
- inline char*
- strcat(char* __s1, char const* __s2)
- { return _C_legacy::_CPP_strcat_capture(__s1, __s2); }
-
- inline char*
- strncat(char* __s1, char const* __s2, size_t __n)
- { return _C_legacy::_CPP_strncat_capture(__s1, __s2, __n); }
-
- inline int
- memcmp(void const* __s1, void const* __s2, size_t __n)
- { return _C_legacy::_CPP_memcmp_capture(__s1, __s2, __n); }
-
- inline int
- strcmp(char const* __s1, char const* __s2)
- { return _C_legacy::_CPP_strcmp_capture(__s1, __s2); }
-
- inline int
- strcoll(char const* __s1, char const* __s2)
- { return _C_legacy::_CPP_strcoll_capture(__s1, __s2); }
-
- inline int
- strncmp(char const* __s1, char const* __s2, size_t __n)
- { return _C_legacy::_CPP_strncmp_capture(__s1, __s2, __n); }
-
- inline size_t
- strxfrm(char* __b, char const* __s, size_t __n)
- { return _C_legacy::_CPP_strxfrm_capture(__b, __s, __n); }
-
- inline void
- const* memchr(void const* __s1, int __c, size_t __n)
- { return _C_legacy::_CPP_memchr_capture(__s1, __c, __n); }
-
- inline void*
- memchr(void* __s1, int __c, size_t __n)
- { return _C_legacy::_CPP_memchr_capture(__s1, __c, __n); }
-
- inline char const*
- strchr(char const* __s1, int __c)
- { return _C_legacy::_CPP_strchr_capture(__s1, __c); }
-
- inline char*
- strchr(char* __s1, int __c)
- { return _C_legacy::_CPP_strchr_capture(__s1, __c); }
-
- inline size_t
- strcspn(char const* __s1, char const* __s2)
- { return _C_legacy::_CPP_strcspn_capture(__s1, __s2); }
-
- inline char const*
- strpbrk(char const* __s1, char const* __s2)
- { return _C_legacy::_CPP_strpbrk_capture(__s1, __s2); }
-
- inline char*
- strpbrk(char* __s1, char const* __s2)
- { return _C_legacy::_CPP_strpbrk_capture(__s1, __s2); }
-
- inline char const*
- strrchr(char const* __s1, int __c)
- { return _C_legacy::_CPP_strrchr_capture(__s1, __c); }
-
- inline char*
- strrchr(char* __s1, int __c)
- { return _C_legacy::_CPP_strrchr_capture(__s1, __c); }
-
- inline size_t
- strspn(char const* __s1, char const* __s2)
- { return _C_legacy::_CPP_strspn_capture(__s1, __s2); }
-
- inline char const*
- strstr(char const* __s1, char const* __s2)
- { return _C_legacy::_CPP_strstr_capture(__s1, __s2); }
-
- inline char*
- strstr(char* __s1, char const* __s2)
- { return _C_legacy::_CPP_strstr_capture(__s1, __s2); }
-
- inline char*
- strtok(char* __s1, char const* __s2)
- { return _C_legacy::_CPP_strtok_capture(__s1, __s2); }
-
- inline void*
- memset(void* __s, int __c, size_t __n)
- { return _C_legacy::_CPP_memset_capture(__s, __c, __n); }
-
- using _C_legacy::strerror;
-
- inline size_t
- strlen(char const* __s)
- { return _C_legacy::_CPP_strlen_capture(__s); }
-
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_ctime.h b/libstdc++-v3/include/c_shadow/bits/std_ctime.h
deleted file mode 100644
index 44709f0238f..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_ctime.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Date and time
-//
-
-#ifndef _CPP_CTIME
-#define _CPP_CTIME 1
-
-# include <bits/std_cstddef.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-
- // XXX
- // glibc 2.1.x time.h is on crack
-# undef __need_time_t
-# undef __need_clock_t
-# undef __need_timespec
-
-# include_next <time.h>
- }
-
- typedef clock_t _CPP_clock_t_capture;
- typedef time_t _CPP_time_t_capture;
- typedef tm _CPP_tm_capture;
-
-} // namespace _C_legacy
-
-# undef clock_t
-# undef time_t
-# undef tm
-# undef clock
-# undef difftime
-# undef mktime
-# undef time
-# undef asctime
-# undef ctime
-# undef gmtime
-# undef localtime
-# undef strftime
-
-namespace std {
-
- // Adopt C names into std::
- typedef _C_legacy::_CPP_clock_t_capture clock_t;
- typedef _C_legacy::_CPP_time_t_capture time_t;
- struct tm : _C_legacy::_CPP_tm_capture { };
-
- using _C_legacy::clock;
- using _C_legacy::difftime;
- using _C_legacy::mktime;
- using _C_legacy::time;
- using _C_legacy::ctime;
-
- inline char*
- asctime(const tm* __t)
- { return _C_legacy::asctime(static_cast<_C_legacy::_CPP_tm_capture const*>(__t)); }
-
- inline tm*
- gmtime(time_t const* __tp)
- { return reinterpret_cast<tm*>(_C_legacy::gmtime(__tp)); }
-
- inline tm*
- localtime(const time_t* __tp)
- { return reinterpret_cast<tm*>(_C_legacy::localtime(__tp)); }
-
- inline size_t
- strftime(char* __buf, size_t __maxsz, char const* __fmt, tm const* __tp)
- { return _C_legacy::strftime(__buf, __maxsz, __fmt,
- static_cast<_C_legacy::_CPP_tm_capture const*>(__tp)); }
-
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cwchar.h b/libstdc++-v3/include/c_shadow/bits/std_cwchar.h
deleted file mode 100644
index db659f469f2..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cwchar.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 21
-
-#ifndef _CPP_CWCHAR
-# define _CPP_CWCHAR 1
-# include <bits/std_cstdio.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <wchar.h>
- }
-
-#if 0
- // XXX
- inline int
- fwprintf(FILE* __stream, const wchar_t* __format, ...);
-
- inline int
- fwscanf(FILE* __stream, const wchar_t* __format, ...);
-
- inline int
- vfwprintf(FILE* __stream, const wchar_t* __format, va_list __arg);
-
- inline int
- vfwscanf(FILE* __stream, const wchar_t* __format, va_list __arg);
-
- inline wint_t
- _CPP_fgetwc_capture(FILE* __stream)
- { return fgetwc(__stream); }
-
- inline wchar_t*
- _CPP_fgetws_capture(wchar_t* __s, int __n, FILE* __stream)
- { return fgetws(__s, __n, __stream); }
-
- inline wint_t
- _CPP_fputwc_capture(wchar_t __c, FILE* __stream)
- { return fputwc(__c, __stream); }
-
- inline int
- _CPP_fputws_capture(const wchar_t* __s, FILE* __stream)
- { return fputws(__s, __stream); }
-
- inline int
- _CPP_fwide_capture(FILE* __stream, int __mode)
- { return fwide(__stream, __mode); }
-
- inline wint_t
- _CPP_fgetwc_capture(FILE* __stream)
- { return fgetwc(__stream); }
-
- inline wint_t
- _CPP_putwc_capture(wchar_t __c, FILE* __stream)
- { return putwc(__c, __stream); }
-
- inline wint_t
- _CPP_ungetwc_capture(wint_t __c, FILE* __stream)
- { return ungetwc(__c, __stream); }
-#endif
-} // namespace _C_legacy
-
-# undef wchar_t
-# undef wint_t
-# undef mbstate_t
-
-# undef fwprintf
-# undef fwscanf
-# undef swprintf
-# undef swscanf
-# undef vfwprintf
-# undef vfwscanf
-# undef vswprintf
-# undef vswscanf
-# undef vwprintf
-# undef vwscanf
-# undef wprintf
-# undef wscanf
-# undef fgetwc
-# undef fgetws
-# undef fputwc
-# undef fputws
-# undef fwide
-# undef getwc
-# undef getwchar
-# undef putwc
-# undef putwchar
-# undef ungetwc
-# undef wcstod
-# undef wcstof
-# undef wcstold
-# undef wcstol
-# undef wcstoll
-# undef wcstoul
-# undef wcstoull
-# undef wcscpy
-# undef wcsncpy
-# undef wcscat
-# undef wcsncat
-# undef wcsmp
-# undef wcscoll
-# undef wcsncmp
-# undef wcsxfrm
-# undef wcschr
-# undef wcscspn
-# undef wcslen
-# undef wcspbrk
-# undef wcsrchr
-# undef wcsspn
-# undef wcsstr
-# undef wcstok
-# undef wmemchr
-# undef wmemcmp
-# undef wmemcpy
-# undef wmemmove
-# undef wmemset
-# undef wcsftime
-# undef btowc
-# undef wctob
-# undef mbsinit
-# undef mbrlen
-# undef mbrtowc
-# undef wcrtomb
-# undef mbsrtowcs
-# undef wcsrtombs
-
-namespace std {
-
- using _C_legacy::wint_t;
- using _C_legacy::mbstate_t;
-
-#if 0
- using _C_legacy::swprintf;
- using _C_legacy::swscanf;
- using _C_legacy::vswprintf;
- using _C_legacy::vswscanf;
- using _C_legacy::vwprintf;
- using _C_legacy::vwscanf;
- using _C_legacy::wprintf;
- using _C_legacy::wscanf;
- using _C_legacy::getwchar;
- using _C_legacy::putwchar;
-#endif
-
- using _C_legacy::wcstod;
- using _C_legacy::wcstof;
- using _C_legacy::wcstold;
- using _C_legacy::wcstol;
- using _C_legacy::wcstoll;
- using _C_legacy::wcstoul;
- using _C_legacy::wcstoull;
- using _C_legacy::wcscpy;
- using _C_legacy::wcsncpy;
- using _C_legacy::wcscat;
- using _C_legacy::wcsncat;
-
-#if 0
- using _C_legacy::wcsmp;
-#endif
-
- using _C_legacy::wcscoll;
- using _C_legacy::wcsncmp;
- using _C_legacy::wcsxfrm;
- using _C_legacy::wcschr;
- using _C_legacy::wcscspn;
- using _C_legacy::wcslen;
- using _C_legacy::wcspbrk;
- using _C_legacy::wcsrchr;
- using _C_legacy::wcsspn;
- using _C_legacy::wcsstr;
- using _C_legacy::wcstok;
- using _C_legacy::wmemchr;
- using _C_legacy::wmemcmp;
- using _C_legacy::wmemcpy;
- using _C_legacy::wmemmove;
- using _C_legacy::wmemset;
-
-#if 0
- using _C_legacy::wcsftime;
-#endif
-
- using _C_legacy::btowc;
- using _C_legacy::wctob;
- using _C_legacy::mbsinit;
- using _C_legacy::mbrlen;
- using _C_legacy::mbrtowc;
- using _C_legacy::wcrtomb;
- using _C_legacy::mbsrtowcs;
- using _C_legacy::wcsrtombs;
-
-#if 0
- // XXX
- inline int
- fwprintf(FILE* __stream, const wchar_t* __format, ...);
-
- inline int
- fwscanf(FILE* __stream, const wchar_t* __format, ...);
-
- inline int
- vfwprintf(FILE* __stream, const wchar_t* __format, va_list __arg);
-
- inline int
- vfwscanf(FILE* __stream, const wchar_t* __format, va_list __arg);
-
- inline wint_t
- fgetwc(FILE* __stream)
- { return _C_legacy::_CPP_fgetwc_capture(__stream); }
-
- inline wchar_t*
- fgetws(wchar_t* __s, int __n, FILE* __stream)
- { return _C_legacy::_CPP_fgetws_capture(__s, __n, __stream); }
-
- inline wint_t
- fputwc(wchar_t __c, FILE* __stream)
- { return _C_legacy::_CPP_fputwc_capture(__c, __stream); }
-
- inline int
- fputws(const wchar_t* __s, FILE* __stream)
- { return _C_legacy::_CPP_fputws_capture(__s, __stream); }
-
- inline int
- fwide(FILE* __stream, int __mode)
- { return _C_legacy::_CPP_fwide_capture(__stream, __mode); }
-
- inline wint_t
- getwc(FILE* __stream)
- { return _C_legacy::_CPP_getwc_capture(__stream); }
-
- inline wint_t
- putwc(wchar_t __c, FILE* __stream)
- { return _C_legacy::_CPP_putwc_capture(__c, __stream); }
-
- inline wint_t
- ungetwc(wint_t __c, FILE* __stream)
- { return _C_legacy::_CPP_ungetwc_capture(__c, __stream); }
-#endif
-}
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/std_cwctype.h b/libstdc++-v3/include/c_shadow/bits/std_cwctype.h
deleted file mode 100644
index 1a6a64282fd..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/std_cwctype.h
+++ /dev/null
@@ -1,129 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882:
-//
-
-#ifndef _CPP_CWCTYPE
-#define _CPP_CWCTYPE 1
-
-# include <bits/std_cwchar.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <wctype.h>
- }
-} // namespace _C_legacy
-
-
-# undef wctype_t
-# undef wctrans_t
-# undef iswalpha
-# undef iswupper
-# undef iswlower
-# undef iswdigit
-# undef iswxdigit
-# undef iswalnum
-# undef iswspace
-# undef iswpunct
-# undef iswprint
-# undef iswgraph
-# undef iswcntrl
-# undef iswctype
-# undef towctrans
-# undef towlower
-# undef towupper
-# undef wctrans
-# undef wctype
-
-namespace std {
- using _C_legacy::wctype_t;
- using _C_legacy::wctrans_t;
-
- inline int
- iswalpha(wint_t __wc) { return _C_legacy::iswalpha(__wc); }
-
- inline int
- iswupper(wint_t __wc) { return _C_legacy::iswupper(__wc); }
-
- inline int
- iswlower(wint_t __wc) { return _C_legacy::iswlower(__wc); }
-
- inline int
- iswdigit(wint_t __wc) { return _C_legacy::iswdigit(__wc); }
-
- inline int
- iswxdigit(wint_t __wc) { return _C_legacy::iswxdigit(__wc); }
-
- inline int
- iswalnum(wint_t __wc) { return _C_legacy::iswalnum(__wc); }
-
- inline int
- iswspace(wint_t __wc) { return _C_legacy::iswspace(__wc); }
-
- inline int
- iswpunct(wint_t __wc) { return _C_legacy::iswpunct(__wc); }
-
- inline int
- iswprint(wint_t __wc) { return _C_legacy::iswprint(__wc); }
-
- inline int
- iswgraph(wint_t __wc) { return _C_legacy::iswgraph(__wc); }
-
- inline int
- iswcntrl(wint_t __wc) { return _C_legacy::iswcntrl(__wc); }
-
- inline int
- towlower(wint_t __wc) { return _C_legacy::towlower(__wc); }
-
- inline int
- towupper(wint_t __wc) { return _C_legacy::towupper(__wc); }
-
- inline int
- iswctype(wint_t __wc, wctype_t __desc)
- { return _C_legacy::iswctype(__wc, __desc); }
-
- inline wint_t
- towctrans(wint_t __wc, wctrans_t __desc)
- { return _C_legacy::towctrans (__wc, __desc); }
-
- inline wctrans_t
- wctrans(const char *__property) { return _C_legacy::wctrans(__property); }
-
- inline wctype_t
- wctype(char const* __property) { return _C_legacy::wctype(__property); }
-} // namespace std
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_fcntl.h b/libstdc++-v3/include/c_shadow/bits/wrap_fcntl.h
deleted file mode 100644
index 0bed4bf1d4a..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_fcntl.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 26.5 C library extensions
-//
-
-#ifndef _CPP_FCNTL
-#define _CPP_FCNTL 1
-
-# include <bits/c++config.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
- // XXX
-# undef SEEK_SET
-# undef SEEK_CUR
-# undef SEEK_END
-
-# include_next <fcntl.h>
- }
-} // namespace _C_legacy
-
-# undef SEEK_SET
-# undef SEEK_CUR
-# undef SEEK_END
-
-// NB: Don't bring elements from this non-standard header into namespace std.
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_features.h b/libstdc++-v3/include/c_shadow/bits/wrap_features.h
deleted file mode 100644
index 52402bf66bb..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_features.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Extensions
-//
-
-#ifndef _CPP_WRAP_FEATURES_H
-#define _CPP_WRAP_FEATURES_H 1
-
-#include <bits/c++config.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <features.h>
- }
-} // namespace _C_legacy
-
-// NB: Don't bring elements from this non-standard header into namespace std.
-
-# undef _IN_C_LEGACY_
-
-#endif
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_iconv.h b/libstdc++-v3/include/c_shadow/bits/wrap_iconv.h
deleted file mode 100644
index 3e72e2d46ee..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_iconv.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Extensions
-//
-
-#ifndef _CPP_WRAP_ICONV_H
-#define _CPP_WRAP_ICONV_H 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <iconv.h>
- }
-} // namespace _C_legacy
-
-// NB: Don't bring elements from this non-standard header into namespace std.
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_iolibio.h b/libstdc++-v3/include/c_shadow/bits/wrap_iolibio.h
deleted file mode 100644
index ddbabd7a424..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_iolibio.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Extensions
-//
-
-#ifndef _CPP_WRAP_IOLIBIO_H
-#define _CPP_WRAP_IOLIBIO_H 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <iolibio.h>
- }
-} // namespace _C_legacy
-
-// NB: Don't bring elements from this non-standard header into namespace std.
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_langinfo.h b/libstdc++-v3/include/c_shadow/bits/wrap_langinfo.h
deleted file mode 100644
index 138faa10d77..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_langinfo.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Extensions
-//
-
-#ifndef _CPP_WRAP_LANGINFO_H
-#define _CPP_WRAP_LANGINFO_H 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <langinfo.h>
- }
-} // namespace _C_legacy
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_libio.h b/libstdc++-v3/include/c_shadow/bits/wrap_libio.h
deleted file mode 100644
index e5da6e3f382..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_libio.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Extensions
-//
-
-#ifndef _CPP_WRAP_LIBIO_H
-#define _CPP_WRAP_LIBIO_H 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <libio.h>
- }
-} // namespace _C_legacy
-
-// NB: Don't bring elements from this non-standard header into namespace std.
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_libioP.h b/libstdc++-v3/include/c_shadow/bits/wrap_libioP.h
deleted file mode 100644
index 32f8c2ebd10..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_libioP.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 20.5 Extensions
-//
-
-#ifndef _CPP_WRAP_LIBIOP_H
-#define _CPP_WRAP_LIBIOP_H 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <libioP.h>
- }
-} // namespace _C_legacy
-
-// NB: Don't bring elements from this non-standard header into namespace std.
-
-# undef _IN_C_LEGACY_
-
-#endif
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_pthread.h b/libstdc++-v3/include/c_shadow/bits/wrap_pthread.h
deleted file mode 100644
index d04eeba8a31..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_pthread.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 26.5 C library extensions
-//
-
-#ifndef _CPP_WRAP_PTHREAD_H
-#define _CPP_WRAP_PTHREAD_H 1
-
-# include <bits/c++config.h>
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <pthread.h>
- }
-} // namespace _C_legacy
-
-# undef _IN_C_LEGACY_
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/bits/wrap_unistd.h b/libstdc++-v3/include/c_shadow/bits/wrap_unistd.h
deleted file mode 100644
index 8e28b698c72..00000000000
--- a/libstdc++-v3/include/c_shadow/bits/wrap_unistd.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-//
-// ISO C++ 14882: 26.5 C library extensions
-//
-
-#ifndef _CPP_WRAP_UNISTD_H
-#define _CPP_WRAP_UNISTD_H 1
-
-namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <unistd.h>
- }
-} // namespace _C_legacy
-
-# undef _IN_C_LEGACY_
-
-#endif
diff --git a/libstdc++-v3/include/c_shadow/ctype.h b/libstdc++-v3/include/c_shadow/ctype.h
deleted file mode 100644
index 199089c594c..00000000000
--- a/libstdc++-v3/include/c_shadow/ctype.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_CTYPE_H_
-# define _INCLUDED_CPP_CTYPE_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _CTYPE_NEED_C_LEGACY_
-# endif
-
-# include <cctype>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::isalnum;
- using std::isalpha;
- using std::iscntrl;
- using std::isdigit;
- using std::isgraph;
- using std::islower;
- using std::isprint;
- using std::ispunct;
- using std::isspace;
- using std::isupper;
- using std::isxdigit;
- using std::tolower;
- using std::toupper;
-
-# ifdef _CTYPE_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _CTYPE_NEED_C_LEGACY_
-# endif /* _CTYPE_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_CTYPE_H_ */
diff --git a/libstdc++-v3/include/c_shadow/errno.h b/libstdc++-v3/include/c_shadow/errno.h
deleted file mode 100644
index 4e2fc332e88..00000000000
--- a/libstdc++-v3/include/c_shadow/errno.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_ERRNO_H_
-# define _INCLUDED_CPP_ERRNO_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _ERRNO_NEED_C_LEGACY_
-# endif
-
-# include <cerrno>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- // using std::errno;
-
-# ifdef _ERRNO_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _ERRNO_NEED_C_LEGACY_
-# endif /* _ERRNO_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_ERRNO_H_ */
-
diff --git a/libstdc++-v3/include/c_shadow/fcntl.h b/libstdc++-v3/include/c_shadow/fcntl.h
deleted file mode 100644
index f19a1549274..00000000000
--- a/libstdc++-v3/include/c_shadow/fcntl.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_FCNTL_H_
-# define _INCLUDED_CPP_FCNTL_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _FCNTL_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_fcntl.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using _C_legacy::flock;
-
- using _C_legacy::creat;
- using _C_legacy::open;
- using _C_legacy::fcntl;
-
-# ifdef _FCNTL_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _FCNTL_NEED_C_LEGACY_
-# endif /* _FCNTL_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_FCNTL_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/features.h b/libstdc++-v3/include/c_shadow/features.h
deleted file mode 100644
index eed4b0e803d..00000000000
--- a/libstdc++-v3/include/c_shadow/features.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_FEATURES_H_
-# define _INCLUDED_CPP_FEATURES_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _FEATURES_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_features.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
-# ifdef _FEATURES_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _FEATURES_NEED_C_LEGACY_
-# endif /* _FEATURES_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_FEATURES_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/float.h b/libstdc++-v3/include/c_shadow/float.h
deleted file mode 100644
index f52c5f5c9eb..00000000000
--- a/libstdc++-v3/include/c_shadow/float.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_FLOAT_H_
-# define _INCLUDED_CPP_FLOAT_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _FLOAT_NEED_C_LEGACY_
-# endif
-
-# include <cfloat>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
-# ifdef _FLOAT_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _FLOAT_NEED_C_LEGACY_
-# endif /* _FLOAT_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_FLOAT_H_ */
diff --git a/libstdc++-v3/include/c_shadow/iconv.h b/libstdc++-v3/include/c_shadow/iconv.h
deleted file mode 100644
index 1ea5038c24a..00000000000
--- a/libstdc++-v3/include/c_shadow/iconv.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_ICONV_H_
-# define _INCLUDED_CPP_ICONV_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _ICONV_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_iconv.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
- // NB: Cannot use typedefs here to inject the names as the "C" headers
- // often include typedefs that include the keyword 'struct'
- using _C_legacy::iconv_t;
-
- using _C_legacy::iconv_open;
- using _C_legacy::iconv;
- using _C_legacy::iconv_close;
-
-# ifdef _ICONV_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _ICONV_NEED_C_LEGACY_
-# endif /* _ICONV_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_ICONV_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/iolibio.h b/libstdc++-v3/include/c_shadow/iolibio.h
deleted file mode 100644
index 845f6403594..00000000000
--- a/libstdc++-v3/include/c_shadow/iolibio.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_IOLIBIO_H_
-# define _INCLUDED_CPP_IOLIBIO_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _IOLIBIO_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_iolibio.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
-# ifdef _IOLIBIO_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _IOLIBIO_NEED_C_LEGACY_
-# endif /* _IOLIBIO_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_IOLIBIO_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/langinfo.h b/libstdc++-v3/include/c_shadow/langinfo.h
deleted file mode 100644
index 3333ef15c81..00000000000
--- a/libstdc++-v3/include/c_shadow/langinfo.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_LANGINFO_H_
-# define _INCLUDED_CPP_LANGINFO_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _LANGINFO_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_langinfo.h>
-
-# ifdef _LANGINFO_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _LANGINFO_NEED_C_LEGACY_
-# endif /* _LANGINFO_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_LANGINFO_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/libio.h b/libstdc++-v3/include/c_shadow/libio.h
deleted file mode 100644
index 2cafc7d88eb..00000000000
--- a/libstdc++-v3/include/c_shadow/libio.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_LIBIO_H_
-# define _INCLUDED_CPP_LIBIO_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _LIBIO_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_libio.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
- // NB: Cannot use typedefs here to inject the names as the "C" headers
- // often include typedefs that include the keyword 'struct'
- using _C_legacy::_IO_pos_t;
- using _C_legacy::_IO_fpos_t;
- using _C_legacy::_IO_fpos64_t;
- using _C_legacy::_IO_size_t;
- using _C_legacy::_IO_ssize_t;
- using _C_legacy::_IO_off_t;
- using _C_legacy::_IO_off64_t;
- using _C_legacy::_IO_pid_t;
- using _C_legacy::_IO_uid_t;
- using _C_legacy::_IO_iconv_t;
- using _C_legacy::_IO_va_list;
- using _C_legacy::_IO_wint_t;
- using _C_legacy::_IO_lock_t;
-
- using _C_legacy::_IO_marker;
- using _C_legacy::_IO_codecvt;
- using _C_legacy::_IO_wide_data;
- using _C_legacy::_IO_FILE;
- using _C_legacy::_IO_cookie_io_functions_t;
- using _C_legacy::_IO_cookie_file;
-
-# ifdef _LIBIO_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _LIBIO_NEED_C_LEGACY_
-# endif /* _LIBIO_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_LIBIO_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/libioP.h b/libstdc++-v3/include/c_shadow/libioP.h
deleted file mode 100644
index da3e716768f..00000000000
--- a/libstdc++-v3/include/c_shadow/libioP.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_LIBIOP_H_
-# define _INCLUDED_CPP_LIBIOP_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _LIBIOP_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_libioP.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using _C_legacy::_IO_jump_t;
- using _C_legacy::_IO_FILE_plus;
- using _C_legacy::_IO_cookie_file;
-
- using _C_legacy::_IO_file_jumps;
- using _C_legacy::_IO_wfile_jumps;
-
-# ifdef _LIBIOP_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _LIBIOP_NEED_C_LEGACY_
-# endif /* _LIBIOP_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_LIBIOP_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/limits.h b/libstdc++-v3/include/c_shadow/limits.h
deleted file mode 100644
index 26aa771f2d5..00000000000
--- a/libstdc++-v3/include/c_shadow/limits.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_LIMITS_H_
-# define _INCLUDED_CPP_LIMITS_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _LIMITS_NEED_C_LEGACY_
-# endif
-
-# include <climits>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-
-# ifdef _LIMITS_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _LIMITS_NEED_C_LEGACY_
-# endif /* _LIMITS_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_LIMITS_H_ */
diff --git a/libstdc++-v3/include/c_shadow/locale.h b/libstdc++-v3/include/c_shadow/locale.h
deleted file mode 100644
index 1d5f529ed89..00000000000
--- a/libstdc++-v3/include/c_shadow/locale.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_LOCALE_H_
-# define _INCLUDED_CPP_LOCALE_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _LOCALE_NEED_C_LEGACY_
-#endif
-
-# include <clocale>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::lconv;
- using std::setlocale;
- using std::localeconv;
-
-# ifdef _LOCALE_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _LOCALE_NEED_C_LEGACY_
-# endif /* _LOCALE_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_LOCALE_H_ */
diff --git a/libstdc++-v3/include/c_shadow/math.h b/libstdc++-v3/include/c_shadow/math.h
deleted file mode 100644
index f2ec04af671..00000000000
--- a/libstdc++-v3/include/c_shadow/math.h
+++ /dev/null
@@ -1,131 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_MATH_H_
-# define _INCLUDED_CPP_MATH_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _MATH_NEED_C_LEGACY_
-# endif
-
-# include <cmath>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::abs;
- using std::acos;
- using std::asin;
- using std::atan;
- using std::atan2;
- using std::cos;
- using std::sin;
- using std::tan;
- using std::cosh;
- using std::sinh;
- using std::tanh;
- using std::exp;
- using std::frexp;
- using std::ldexp;
- using std::log;
- using std::log10;
- using std::modf;
- using std::pow;
- using std::sqrt;
- using std::ceil;
- using std::fabs;
- using std::floor;
- using std::fmod;
-
- // From ISO/IEC 9899:1999
- using std::absf;
- using std::acosf;
- using std::asinf;
- using std::atanf;
- using std::atan2f;
- using std::cosf;
- using std::sinf;
- using std::tanf;
- using std::coshf;
- using std::sinhf;
- using std::tanhf;
- using std::expf;
- using std::frexpf;
- using std::ldexpf;
- using std::logf;
- using std::log10f;
- using std::modff;
- using std::powf;
- using std::sqrtf;
- using std::ceilf;
- using std::fabsf;
- using std::floorf;
- using std::fmodf;
-
- // From ISO/IEC 9899:1999
- using std::absl;
- using std::acosl;
- using std::asinl;
- using std::atanl;
- using std::atan2l;
- using std::cosl;
- using std::sinl;
- using std::tanl;
- using std::coshl;
- using std::sinhl;
- using std::tanhl;
- using std::expl;
- using std::frexpl;
- using std::ldexpl;
- using std::logl;
- using std::log10l;
- using std::modfl;
- using std::powl;
- using std::sqrtl;
- using std::ceill;
- using std::fabsl;
- using std::floorl;
- using std::fmodl;
-
-# ifdef _MATH_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _MATH_NEED_C_LEGACY_
-# endif /* _MATH_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_MATH_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/pthread.h b/libstdc++-v3/include/c_shadow/pthread.h
deleted file mode 100644
index 8692d3e52d4..00000000000
--- a/libstdc++-v3/include/c_shadow/pthread.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_PTHREAD_H_
-# define _INCLUDED_CPP_PTHREAD_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _PTHREAD_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_pthread.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using _C_legacy::__sched_param;
-
- using _C_legacy::pthread_attr_t;
- using _C_legacy::pthread_cond_t;
- using _C_legacy::pthread_condattr_t;
- using _C_legacy::pthread_key_t;
- using _C_legacy::pthread_mutex_t;
- using _C_legacy::pthread_mutexattr_t;
- using _C_legacy::pthread_once_t;
- using _C_legacy::pthread_rwlock_t;
- using _C_legacy::pthread_rwlockattr_t;
- using _C_legacy::pthread_t;
-
- using _C_legacy::pthread_mutex_init;
- using _C_legacy::pthread_mutex_destroy;
- using _C_legacy::pthread_mutex_lock;
- using _C_legacy::pthread_mutex_trylock;
- using _C_legacy::pthread_mutex_unlock;
- using _C_legacy::pthread_mutexattr_init;
- using _C_legacy::pthread_mutexattr_destroy;
- using _C_legacy::pthread_mutexattr_settype;
- using _C_legacy::pthread_mutexattr_gettype;
- using _C_legacy::pthread_key_create;
- using _C_legacy::pthread_key_delete;
- using _C_legacy::pthread_setspecific;
- using _C_legacy::pthread_getspecific;
- using _C_legacy::pthread_once;
- using _C_legacy::pthread_atfork;
-
-# ifdef _PTHREAD_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _PTHREAD_NEED_C_LEGACY_
-# endif /* _PTHREAD_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_PTHREAD_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/setjmp.h b/libstdc++-v3/include/c_shadow/setjmp.h
deleted file mode 100644
index c4061e871db..00000000000
--- a/libstdc++-v3/include/c_shadow/setjmp.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_SETJMP_H_
-# define _INCLUDED_CPP_SETJMP_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _SETJMP_NEED_C_LEGACY_
-# endif
-
-# include <csetjmp>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::jmp_buf;
- using std::longjmp;
-
-# ifdef _SETJMP_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _SETJMP_NEED_C_LEGACY_
-# endif /* _SETJMP_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_SETJMP_H_ */
diff --git a/libstdc++-v3/include/c_shadow/signal.h b/libstdc++-v3/include/c_shadow/signal.h
deleted file mode 100644
index 819ddf22f32..00000000000
--- a/libstdc++-v3/include/c_shadow/signal.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_SIGNAL_H_
-# define _INCLUDED_CPP_SIGNAL_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _SIGNAL_NEED_C_LEGACY_
-# endif
-
-# include <csignal>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::sig_atomic_t;
-
- using std::raise;
- using std::signal;
-
-# ifdef _SIGNAL_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _SIGNAL_NEED_C_LEGACY_
-# endif /* _SIGNAL_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_SIGNAL_H_ */
diff --git a/libstdc++-v3/include/c_shadow/stdarg.h b/libstdc++-v3/include/c_shadow/stdarg.h
deleted file mode 100644
index cb32feca7d6..00000000000
--- a/libstdc++-v3/include/c_shadow/stdarg.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_STDARG_H_
-# define _INCLUDED_CPP_STDARG_H_ 1
-
-#ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _STDARG_NEED_C_LEGACY_
-# endif
-
-# include <cstdarg>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::va_list;
-
-# ifdef _STDARG_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _STDARG_NEED_C_LEGACY_
-# endif /* _STDARG_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_STDARG_H_ */
diff --git a/libstdc++-v3/include/c_shadow/stddef.h b/libstdc++-v3/include/c_shadow/stddef.h
deleted file mode 100644
index 03d5896779e..00000000000
--- a/libstdc++-v3/include/c_shadow/stddef.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_STDDEF_H_
-# define _INCLUDED_CPP_STDDEF_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _STDDEF_NEED_C_LEGACY_
-# endif
-
-# include <cstddef>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::ptrdiff_t;
- using std::size_t;
-
-# ifdef _STDDEF_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _STDDEF_NEED_C_LEGACY_
-# endif /* _STDDEF_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_STDDEF_H_ */
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/stdio.h b/libstdc++-v3/include/c_shadow/stdio.h
deleted file mode 100644
index c3a43b736c2..00000000000
--- a/libstdc++-v3/include/c_shadow/stdio.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_STDIO_H_
-# define _INCLUDED_CPP_STDIO_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _STDIO_NEED_C_LEGACY_
-# endif
-
-# include <cstdio>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::FILE;
- using std::fpos_t;
-
- using std::remove;
- using std::rename;
- using std::tmpfile;
- using std::tmpnam;
- using std::fclose;
- using std::fflush;
- using std::fopen;
- using std::freopen;
- using std::setbuf;
- using std::setvbuf;
- using std::fprintf;
- using std::fscanf;
- using std::printf;
- using std::scanf;
- using std::sprintf;
- using std::sscanf;
- using std::vfprintf;
- using std::vprintf;
- using std::vsprintf;
- using std::fgetc;
- using std::fgets;
- using std::fputc;
- using std::fputs;
- using std::getc;
- using std::getchar;
- using std::gets;
- using std::putc;
- using std::putchar;
- using std::puts;
- using std::ungetc;
- using std::fread;
- using std::fwrite;
- using std::fgetpos;
- using std::fseek;
- using std::fsetpos;
- using std::ftell;
- using std::rewind;
- using std::clearerr;
- using std::feof;
- using std::ferror;
- using std::perror;
-
-# ifdef _STDIO_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _STDIO_NEED_C_LEGACY_
-# endif /* _STDIO_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_STDIO_H_ */
diff --git a/libstdc++-v3/include/c_shadow/stdlib.h b/libstdc++-v3/include/c_shadow/stdlib.h
deleted file mode 100644
index 9740b57b3fc..00000000000
--- a/libstdc++-v3/include/c_shadow/stdlib.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_STDLIB_H_
-# define _INCLUDED_CPP_STDLIB_H_ 1
-
-# include <bits/c++config.h>
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _STDLIB_NEED_C_LEGACY_
-# endif
-
-# include <cstdlib>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::div_t;
- using std::ldiv_t;
-#ifdef _GLIBCPP_USE_C99
- using std::lldiv_t;
-#endif
-
-// using std::abort;
- using std::abs;
- using std::atexit;
- using std::atof;
- using std::atoi;
- using std::atol;
- using std::bsearch;
- using std::calloc;
- using std::div;
-// using std::exit;
- using std::free;
- using std::getenv;
- using std::labs;
- using std::ldiv;
- using std::malloc;
- using std::mblen;
- using std::mbstowcs;
- using std::mbtowc;
- using std::qsort;
- using std::rand;
- using std::realloc;
- using std::srand;
- using std::strtod;
- using std::strtol;
- using std::strtoul;
- using std::system;
- using std::wcstombs;
- using std::wctomb;
-
- using std::strtof;
-
-#ifdef _GLIBCPP_USE_LONG_LONG
- using std::strtoll;
- using std::strtoull;
-#endif
-
-#ifdef _GLIBCPP_HAVE_STRTOLD
- using std::strtold;
-#endif
-
-# ifdef _STDLIB_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _STDLIB_NEED_C_LEGACY_
-# endif /* _STDLIB_NEED_C__LEGACY_ */
-#endif /* _INCLUDED_CPP_STDLIB_H_ */
diff --git a/libstdc++-v3/include/c_shadow/string.h b/libstdc++-v3/include/c_shadow/string.h
deleted file mode 100644
index 6f9e6cc6372..00000000000
--- a/libstdc++-v3/include/c_shadow/string.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_STRING_H_
-# define _INCLUDED_CPP_STRING_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _STRING_NEED_C_LEGACY_
-# endif
-
-# include <cstring>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::memcpy;
- using std::memmove;
- using std::strcpy;
- using std::strncpy;
- using std::strcat;
- using std::strncat;
- using std::memcmp;
- using std::strcmp;
- using std::strcoll;
- using std::strncmp;
- using std::strxfrm;
- using std::memchr;
- using std::strchr;
- using std::strcspn;
- using std::strpbrk;
- using std::strrchr;
- using std::strspn;
- using std::strstr;
- using std::strtok;
- using std::memset;
- using std::strerror;
- using std::strlen;
-
-# ifdef _STRING_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _STRING_NEED_C_LEGACY_
-# endif /* _STRING_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_STRING_H_ */
diff --git a/libstdc++-v3/include/c_shadow/sys/cdefs.h b/libstdc++-v3/include/c_shadow/sys/cdefs.h
deleted file mode 100644
index da377faadbc..00000000000
--- a/libstdc++-v3/include/c_shadow/sys/cdefs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _CPP_SYS_CDEFS_H
-# define _CPP_SYS_CDEFS_H 1
-
-# pragma GCC system_header
-# include_next <sys/cdefs.h>
-
-// glibc-2 hackery. Other systems likely require other hacks.
-#undef __BEGIN_DECLS
-#define __BEGIN_DECLS
-#undef __END_DECLS
-#define __END_DECLS
-
-#endif /* _CPP_SYS_CDEFS_H_ */
-
-
-
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/time.h b/libstdc++-v3/include/c_shadow/time.h
deleted file mode 100644
index 31064aaa135..00000000000
--- a/libstdc++-v3/include/c_shadow/time.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_TIME_H_
-# define _INCLUDED_CPP_TIME_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _TIME_NEED_C_LEGACY_
-# endif
-
-# include <ctime>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::clock_t;
- using std::time_t;
- using std::tm;
-
- using std::clock;
- using std::difftime;
- using std::mktime;
- using std::time;
- using std::asctime;
- using std::ctime;
- using std::gmtime;
- using std::localtime;
- using std::strftime;
-
-# ifdef _TIME_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _TIME_NEED_C_LEGACY_
-# endif /* _TIME_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_TIME_H_ */
diff --git a/libstdc++-v3/include/c_shadow/unistd.h b/libstdc++-v3/include/c_shadow/unistd.h
deleted file mode 100644
index e05efe72f57..00000000000
--- a/libstdc++-v3/include/c_shadow/unistd.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_UNISTD_H_
-# define _INCLUDED_CPP_UNISTD_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _TIME_NEED_C_LEGACY_
-# endif
-
-# include <bits/wrap_unistd.h>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
-#ifdef __gid_t_defined
- using _C_legacy::gid_t;
-#endif
-#ifdef __uid_t_defined
- using _C_legacy::uid_t;
-#endif
-#ifdef __off_t_defined
- using _C_legacy::off_t;
-#endif
-#ifdef __off64_t_defined
- using _C_legacy::off64_t;
-#endif
-#ifdef __useconds_t_defined
- using _C_legacy::useconds_t;
-#endif
-#ifdef __pid_t_defined
- using _C_legacy::pid_t;
-#endif
- using _C_legacy::intptr_t;
-#ifdef __socklen_t_defined
- using _C_legacy::socklen_t;
-#endif
-
- using _C_legacy::access;
- using _C_legacy::euidaccess;
- using _C_legacy::lseek;
- using _C_legacy::close;
- using _C_legacy::read;
- using _C_legacy::write;
- using _C_legacy::pread;
- using _C_legacy::pwrite;
- using _C_legacy::pipe;
- using _C_legacy::alarm;
- using _C_legacy::sleep;
- using _C_legacy::ualarm;
- using _C_legacy::usleep;
- using _C_legacy::pause;
- using _C_legacy::chown;
- using _C_legacy::fchown;
- using _C_legacy::lchown;
- using _C_legacy::chdir;
- using _C_legacy::fchdir;
- using _C_legacy::getcwd;
- using _C_legacy::get_current_dir_name;
- using _C_legacy::getwd;
- using _C_legacy::dup;
- using _C_legacy::dup2;
-
-# ifdef _TIME_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _TIME_NEED_C_LEGACY_
-# endif /* _TIME_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_UNISTD_H_ */
diff --git a/libstdc++-v3/include/c_shadow/wchar.h b/libstdc++-v3/include/c_shadow/wchar.h
deleted file mode 100644
index efabb1519a5..00000000000
--- a/libstdc++-v3/include/c_shadow/wchar.h
+++ /dev/null
@@ -1,131 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_WCHAR_H_
-# define _INCLUDED_CPP_WCHAR_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_ /* sub-included by a C header */
-# define _WCHAR_NEED_C_LEGACY_
-# endif
-
-# include <cwchar>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::wchar_t;
- using std::wint_t;
- using std::mbstate_t;
-
-#if 0
- using std::fwprintf;
- using std::fwscanf;
- using std::swprintf;
- using std::swscanf;
- using std::vfwprintf;
- using std::vfwscanf;
- using std::vswprintf;
- using std::vswscanf;
- using std::vwprintf;
- using std::vwscanf;
- using std::wprintf;
- using std::wscanf;
- using std::fgetwc;
- using std::fgetws;
- using std::fputwc;
- using std::fputws;
- using std::fwide;
- using std::getwc;
- using std::getwchar;
- using std::putwc;
- using std::putwchar;
- using std::ungetwc;
-#endif
-
- using std::wcstod;
- using std::wcstof;
- using std::wcstold;
- using std::wcstol;
- using std::wcstoll;
- using std::wcstoul;
- using std::wcstoull;
- using std::wcscpy;
- using std::wcsncpy;
- using std::wcscat;
- using std::wcsncat;
-
-#if 0
- using std::wcsmp;
-#endif
-
- using std::wcscoll;
- using std::wcsncmp;
- using std::wcsxfrm;
- using std::wcschr;
- using std::wcscspn;
- using std::wcslen;
- using std::wcspbrk;
- using std::wcsrchr;
- using std::wcsspn;
- using std::wcsstr;
- using std::wcstok;
- using std::wmemchr;
- using std::wmemcmp;
- using std::wmemcpy;
- using std::wmemmove;
- using std::wmemset;
-
-#if 0
- using std::wcsftime;
-#endif
-
- using std::btowc;
- using std::wctob;
- using std::mbsinit;
- using std::mbrlen;
- using std::mbrtowc;
- using std::wcrtomb;
- using std::mbsrtowcs;
- using std::wcsrtombs;
-
-# ifdef _WCHAR_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _WCHAR_NEED_C_LEGACY_
-# endif /* _WCHAR_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_WCHAR_H_ */
-
-
-
diff --git a/libstdc++-v3/include/c_shadow/wctype.h b/libstdc++-v3/include/c_shadow/wctype.h
deleted file mode 100644
index cae1aff43e1..00000000000
--- a/libstdc++-v3/include/c_shadow/wctype.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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 _INCLUDED_CPP_CWCTYPE_H_
-# define _INCLUDED_CPP_CWCTYPE_H_ 1
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
- // get out of the "legacy"
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-# define _CWCHAR_NEED_C_LEGACY_
-# endif
-
-# include <cwctype>
-
- // Expose global C names, including non-standard ones, but shadow
- // some names and types with the std:: C++ version.
- using std::wint_t;
- using std::wctype_t;
- using std::wctrans_t;
- using std::iswalpha;
- using std::iswupper;
- using std::iswlower;
- using std::iswdigit;
- using std::iswxdigit;
- using std::iswalnum;
- using std::iswspace;
- using std::iswpunct;
- using std::iswprint;
- using std::iswgraph;
- using std::iswcntrl;
- using std::iswctype;
- using std::towctrans;
- using std::towlower;
- using std::towupper;
- using std::wctrans;
- using std::wctype;
-
-# ifdef _CWCHAR_NEED_C_LEGACY_
- // dive back into the "swamp"
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# undef _CWCHAR_NEED_C_LEGACY_
-# endif /* _CWCHAR_NEED_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_CWCTYPE_H_ */
diff --git a/libstdc++-v3/include/ext/stl_rope.h b/libstdc++-v3/include/ext/stl_rope.h
index bb9bb47258d..eae26133742 100644
--- a/libstdc++-v3/include/ext/stl_rope.h
+++ b/libstdc++-v3/include/ext/stl_rope.h
@@ -1375,7 +1375,7 @@ class rope : public _Rope_base<_CharT,_Alloc> {
static _RopeLeaf* _S_new_RopeLeaf(__GC_CONST _CharT *__s,
size_t __size, allocator_type __a)
{
- _RopeLeaf* __space = _LAllocator(__a).allocate(1);
+ _RopeLeaf* __space = typename _Base::_LAllocator(__a).allocate(1);
return new(__space) _RopeLeaf(__s, __size, __a);
}
@@ -1383,14 +1383,14 @@ class rope : public _Rope_base<_CharT,_Alloc> {
_RopeRep* __left, _RopeRep* __right,
allocator_type __a)
{
- _RopeConcatenation* __space = _CAllocator(__a).allocate(1);
+ _RopeConcatenation* __space = typename _Base::_CAllocator(__a).allocate(1);
return new(__space) _RopeConcatenation(__left, __right, __a);
}
static _RopeFunction* _S_new_RopeFunction(char_producer<_CharT>* __f,
size_t __size, bool __d, allocator_type __a)
{
- _RopeFunction* __space = _FAllocator(__a).allocate(1);
+ _RopeFunction* __space = typename _Base::_FAllocator(__a).allocate(1);
return new(__space) _RopeFunction(__f, __size, __d, __a);
}
@@ -1398,7 +1398,7 @@ class rope : public _Rope_base<_CharT,_Alloc> {
_Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s,
size_t __l, allocator_type __a)
{
- _RopeSubstring* __space = _SAllocator(__a).allocate(1);
+ _RopeSubstring* __space = typename _Base::_SAllocator(__a).allocate(1);
return new(__space) _RopeSubstring(__b, __s, __l, __a);
}
diff --git a/libstdc++-v3/include/std/std_limits.h b/libstdc++-v3/include/std/std_limits.h
index 64d8a9bb59e..be4b5f2a90b 100644
--- a/libstdc++-v3/include/std/std_limits.h
+++ b/libstdc++-v3/include/std/std_limits.h
@@ -45,7 +45,6 @@
#pragma GCC system_header
-#include <bits/cpu_limits.h>
#include <bits/c++config.h>
//
@@ -64,13 +63,13 @@
// double (1)
// long double (1)
//
-// GNU C++ undertstands (where supported by the host C-library)
+// GNU C++ undertstands (where supported by the host C-library)
// * integer
// long long, unsigned long long (2)
//
// which brings us to 15 fundamental arithmetic data types in GNU C++.
//
-//
+//
// Since a numeric_limits<> is a bit tricky to get right, we rely on
// an interface composed of macros which should be defined in config/os
// or config/cpu when they differ from the generic (read arbitrary)
@@ -80,813 +79,77 @@
// These values can be overridden in the target configuration file.
// The default values are appropriate for many 32-bit targets.
-#ifndef __glibcpp_char_bits
-#define __glibcpp_char_bits 8
-#endif
-#ifdef __CHAR_UNSIGNED__
-#define __glibcpp_plain_char_is_signed false
-#else
-#define __glibcpp_plain_char_is_signed true
-#endif
-#ifndef __glibcpp_short_bits
-#define __glibcpp_short_bits 16
-#endif
-#ifndef __glibcpp_int_bits
-#define __glibcpp_int_bits 32
-#endif
-#ifndef __glibcpp_long_bits
-#define __glibcpp_long_bits 32
-#endif
-#ifndef __glibcpp_wchar_t_bits
-#define __glibcpp_wchar_t_bits 32
-#endif
-#ifndef __glibcpp_wchar_t_is_signed
-#define __glibcpp_wchar_t_is_signed true
-#endif
-#ifndef __glibcpp_long_long_bits
-#define __glibcpp_long_long_bits 64
-#endif
-#ifndef __glibcpp_float_bits
-#define __glibcpp_float_bits 32
-#endif
-#ifndef __glibcpp_double_bits
-#define __glibcpp_double_bits 64
-#endif
-#ifndef __glibcpp_long_double_bits
-#define __glibcpp_long_double_bits 128
-#endif
-
-#ifndef __glibcpp_char_traps
-#define __glibcpp_char_traps true
-#endif
-#ifndef __glibcpp_short_traps
-#define __glibcpp_short_traps true
-#endif
-#ifndef __glibcpp_int_traps
-#define __glibcpp_int_traps true
-#endif
-#ifndef __glibcpp_long_traps
-#define __glibcpp_long_traps true
-#endif
-#ifndef __glibcpp_wchar_t_traps
-#define __glibcpp_wchar_t_traps true
-#endif
-#ifndef __glibcpp_long_long_traps
-#define __glibcpp_long_long_traps true
-#endif
-
-// You should not need to define any macros below this point, unless
-// you have a machine with non-standard bit-widths.
-
-// These values are the minimums and maximums for standard data types
-// of common widths.
-
-#define __glibcpp_s8_max 127
-#define __glibcpp_s8_min (-__glibcpp_s8_max - 1)
-#define __glibcpp_s8_digits 7
-#define __glibcpp_s8_digits10 2
-#define __glibcpp_u8_min 0U
-#define __glibcpp_u8_max (__glibcpp_s8_max * 2 + 1)
-#define __glibcpp_u8_digits 8
-#define __glibcpp_u8_digits10 2
-#define __glibcpp_s16_max 32767
-#define __glibcpp_s16_min (-__glibcpp_s16_max - 1)
-#define __glibcpp_s16_digits 15
-#define __glibcpp_s16_digits10 4
-#define __glibcpp_u16_min 0U
-#define __glibcpp_u16_max (__glibcpp_s16_max * 2 + 1)
-#define __glibcpp_u16_digits 16
-#define __glibcpp_u16_digits10 4
-#define __glibcpp_s32_max 2147483647L
-#define __glibcpp_s32_min (-__glibcpp_s32_max - 1)
-#define __glibcpp_s32_digits 31
-#define __glibcpp_s32_digits10 9
-#define __glibcpp_u32_min 0UL
-#define __glibcpp_u32_max (__glibcpp_s32_max * 2U + 1)
-#define __glibcpp_u32_digits 32
-#define __glibcpp_u32_digits10 9
-#define __glibcpp_s64_max 9223372036854775807LL
-#define __glibcpp_s64_min (-__glibcpp_s64_max - 1)
-#define __glibcpp_s64_digits 63
-#define __glibcpp_s64_digits10 18
-#define __glibcpp_u64_min 0ULL
-#define __glibcpp_u64_max (__glibcpp_s64_max * 2ULL + 1)
-#define __glibcpp_u64_digits 64
-#define __glibcpp_u64_digits10 19
-
-#define __glibcpp_f32_min 1.17549435e-38F
-#define __glibcpp_f32_max 3.40282347e+38F
-#define __glibcpp_f32_digits 24
-#define __glibcpp_f32_digits10 6
-#define __glibcpp_f32_radix 2
-#define __glibcpp_f32_epsilon 1.19209290e-07F
-#define __glibcpp_f32_round_error 1.0F
-#define __glibcpp_f32_min_exponent -125
-#define __glibcpp_f32_min_exponent10 -37
-#define __glibcpp_f32_max_exponent 128
-#define __glibcpp_f32_max_exponent10 38
-#define __glibcpp_f64_min 2.2250738585072014e-308
-#define __glibcpp_f64_max 1.7976931348623157e+308
-#define __glibcpp_f64_digits 53
-#define __glibcpp_f64_digits10 15
-#define __glibcpp_f64_radix 2
-#define __glibcpp_f64_epsilon 2.2204460492503131e-16
-#define __glibcpp_f64_round_error 1.0
-#define __glibcpp_f64_min_exponent -1021
-#define __glibcpp_f64_min_exponent10 -307
-#define __glibcpp_f64_max_exponent 1024
-#define __glibcpp_f64_max_exponent10 308
-#define __glibcpp_f80_min 3.36210314311209350626e-4932L
-#define __glibcpp_f80_max 1.18973149535723176502e+4932L
-#define __glibcpp_f80_digits 64
-#define __glibcpp_f80_digits10 18
-#define __glibcpp_f80_radix 2
-#define __glibcpp_f80_epsilon 1.08420217248550443401e-19L
-#define __glibcpp_f80_round_error 1.0L
-#define __glibcpp_f80_min_exponent -16381
-#define __glibcpp_f80_min_exponent10 -4931
-#define __glibcpp_f80_max_exponent 16384
-#define __glibcpp_f80_max_exponent10 4932
-#define __glibcpp_f96_min 1.68105157155604675313e-4932L
-#define __glibcpp_f96_max 1.18973149535723176502e+4932L
-#define __glibcpp_f96_digits 64
-#define __glibcpp_f96_digits10 18
-#define __glibcpp_f96_radix 2
-#define __glibcpp_f96_epsilon 1.08420217248550443401e-19L
-#define __glibcpp_f96_round_error 1.0L
-#define __glibcpp_f96_min_exponent -16382
-#define __glibcpp_f96_min_exponent10 -4931
-#define __glibcpp_f96_max_exponent 16384
-#define __glibcpp_f96_max_exponent10 4932
-#define __glibcpp_f128_min 3.362103143112093506262677817321752603E-4932L
-#define __glibcpp_f128_max 1.189731495357231765085759326628007016E+4932L
-#define __glibcpp_f128_digits 113
-#define __glibcpp_f128_digits10 33
-#define __glibcpp_f128_radix 2
-#define __glibcpp_f128_epsilon 1.925929944387235853055977942584927319E-34L
-#define __glibcpp_f128_round_error 1.0L
-#define __glibcpp_f128_min_exponent -16381
-#define __glibcpp_f128_min_exponent10 -4931
-#define __glibcpp_f128_max_exponent 16384
-#define __glibcpp_f128_max_exponent10 4932
-
-// bool-specific hooks:
-// __glibcpp_bool_digits __glibcpp_int_traps __glibcpp_long_traps
-
-#ifndef __glibcpp_bool_digits
-#define __glibcpp_bool_digits 1
-#endif
-
-// char.
-
-#define __glibcpp_plain_char_traps true
-#define __glibcpp_signed_char_traps true
-#define __glibcpp_unsigned_char_traps true
-#ifndef __glibcpp_char_is_modulo
-#define __glibcpp_char_is_modulo true
-#endif
-#ifndef __glibcpp_signed_char_is_modulo
-#define __glibcpp_signed_char_is_modulo true
-#endif
-#if __glibcpp_char_bits == 8
-#define __glibcpp_signed_char_min __glibcpp_s8_min
-#define __glibcpp_signed_char_max __glibcpp_s8_max
-#define __glibcpp_signed_char_digits __glibcpp_s8_digits
-#define __glibcpp_signed_char_digits10 __glibcpp_s8_digits10
-#define __glibcpp_unsigned_char_min __glibcpp_u8_min
-#define __glibcpp_unsigned_char_max __glibcpp_u8_max
-#define __glibcpp_unsigned_char_digits __glibcpp_u8_digits
-#define __glibcpp_unsigned_char_digits10 __glibcpp_u8_digits10
-#elif __glibcpp_char_bits == 16
-#define __glibcpp_signed_char_min __glibcpp_s16_min
-#define __glibcpp_signed_char_max __glibcpp_s16_max
-#define __glibcpp_signed_char_digits __glibcpp_s16_digits
-#define __glibcpp_signed_char_digits10 __glibcpp_s16_digits10
-#define __glibcpp_unsigned_char_min __glibcpp_u16_min
-#define __glibcpp_unsigned_char_max __glibcpp_u16_max
-#define __glibcpp_unsigned_char_digits __glibcpp_u16_digits
-#define __glibcpp_unsigned_char_digits10 __glibcpp_u16_digits10
-#elif __glibcpp_char_bits == 32
-#define __glibcpp_signed_char_min (signed char)__glibcpp_s32_min
-#define __glibcpp_signed_char_max (signed char)__glibcpp_s32_max
-#define __glibcpp_signed_char_digits __glibcpp_s32_digits
-#define __glibcpp_signed_char_digits10 __glibcpp_s32_digits10
-#define __glibcpp_unsigned_char_min (unsigned char)__glibcpp_u32_min
-#define __glibcpp_unsigned_char_max (unsigned char)__glibcpp_u32_max
-#define __glibcpp_unsigned_char_digits __glibcpp_u32_digits
-#define __glibcpp_unsigned_char_digits10 __glibcpp_u32_digits10
-#elif __glibcpp_char_bits == 64
-#define __glibcpp_signed_char_min (signed char)__glibcpp_s64_min
-#define __glibcpp_signed_char_max (signed char)__glibcpp_s64_max
-#define __glibcpp_signed_char_digits __glibcpp_s64_digits
-#define __glibcpp_signed_char_digits10 __glibcpp_s64_digits10
-#define __glibcpp_unsigned_char_min (unsigned char)__glibcpp_u64_min
-#define __glibcpp_unsigned_char_max (unsigned char)__glibcpp_u64_max
-#define __glibcpp_unsigned_char_digits __glibcpp_u64_digits
-#define __glibcpp_unsigned_char_digits10 __glibcpp_u64_digits10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-#if __glibcpp_plain_char_is_signed
-#define __glibcpp_char_min (char)__glibcpp_signed_char_min
-#define __glibcpp_char_max (char)__glibcpp_signed_char_max
-#define __glibcpp_char_digits __glibcpp_signed_char_digits
-#define __glibcpp_char_digits10 __glibcpp_signed_char_digits
-#else
-#define __glibcpp_char_min (char)__glibcpp_unsigned_char_min
-#define __glibcpp_char_max (char)__glibcpp_unsigned_char_max
-#define __glibcpp_char_digits __glibcpp_unsigned_char_digits
-#define __glibcpp_char_digits10 __glibcpp_unsigned_char_digits
-#endif
-
-// short
-
-#define __glibcpp_signed_short_traps true
-#define __glibcpp_unsigned_short_traps true
-#ifndef __glibcpp_signed_short_is_modulo
-#define __glibcpp_signed_short_is_modulo true
-#endif
-#if __glibcpp_short_bits == 8
-#define __glibcpp_signed_short_min __glibcpp_s8_min
-#define __glibcpp_signed_short_max __glibcpp_s8_max
-#define __glibcpp_signed_short_digits __glibcpp_s8_digits
-#define __glibcpp_signed_short_digits10 __glibcpp_s8_digits10
-#define __glibcpp_unsigned_short_min __glibcpp_u8_min
-#define __glibcpp_unsigned_short_max __glibcpp_u8_max
-#define __glibcpp_unsigned_short_digits __glibcpp_u8_digits
-#define __glibcpp_unsigned_short_digits10 __glibcpp_u8_digits10
-#elif __glibcpp_short_bits == 16
-#define __glibcpp_signed_short_min __glibcpp_s16_min
-#define __glibcpp_signed_short_max __glibcpp_s16_max
-#define __glibcpp_signed_short_digits __glibcpp_s16_digits
-#define __glibcpp_signed_short_digits10 __glibcpp_s16_digits10
-#define __glibcpp_unsigned_short_min __glibcpp_u16_min
-#define __glibcpp_unsigned_short_max __glibcpp_u16_max
-#define __glibcpp_unsigned_short_digits __glibcpp_u16_digits
-#define __glibcpp_unsigned_short_digits10 __glibcpp_u16_digits10
-#elif __glibcpp_short_bits == 32
-#define __glibcpp_signed_short_min (short)__glibcpp_s32_min
-#define __glibcpp_signed_short_max (short)__glibcpp_s32_max
-#define __glibcpp_signed_short_digits __glibcpp_s32_digits
-#define __glibcpp_signed_short_digits10 __glibcpp_s32_digits10
-#define __glibcpp_unsigned_short_min (unsigned short)__glibcpp_u32_min
-#define __glibcpp_unsigned_short_max (unsigned short)__glibcpp_u32_max
-#define __glibcpp_unsigned_short_digits __glibcpp_u32_digits
-#define __glibcpp_unsigned_short_digits10 __glibcpp_u32_digits10
-#elif __glibcpp_short_bits == 64
-#define __glibcpp_signed_short_min (short)__glibcpp_s64_min
-#define __glibcpp_signed_short_max (short)__glibcpp_s64_max
-#define __glibcpp_signed_short_digits __glibcpp_s64_digits
-#define __glibcpp_signed_short_digits10 __glibcpp_s64_digits10
-#define __glibcpp_unsigned_short_min (unsigned short)__glibcpp_u64_min
-#define __glibcpp_unsigned_short_max (unsigned short)__glibcpp_u64_max
-#define __glibcpp_unsigned_short_digits __glibcpp_u64_digits
-#define __glibcpp_unsigned_short_digits10 __glibcpp_u64_digits10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// int
-
-#define __glibcpp_signed_int_traps true
-#define __glibcpp_unsigned_int_traps true
-#ifndef __glibcpp_signed_int_is_modulo
-#define __glibcpp_signed_int_is_modulo true
-#endif
-#if __glibcpp_int_bits == 8
-#define __glibcpp_signed_int_min __glibcpp_s8_min
-#define __glibcpp_signed_int_max __glibcpp_s8_max
-#define __glibcpp_signed_int_digits __glibcpp_s8_digits
-#define __glibcpp_signed_int_digits10 __glibcpp_s8_digits10
-#define __glibcpp_unsigned_int_min __glibcpp_u8_min
-#define __glibcpp_unsigned_int_max __glibcpp_u8_max
-#define __glibcpp_unsigned_int_digits __glibcpp_u8_digits
-#define __glibcpp_unsigned_int_digits10 __glibcpp_u8_digits10
-#elif __glibcpp_int_bits == 16
-#define __glibcpp_signed_int_min __glibcpp_s16_min
-#define __glibcpp_signed_int_max __glibcpp_s16_max
-#define __glibcpp_signed_int_digits __glibcpp_s16_digits
-#define __glibcpp_signed_int_digits10 __glibcpp_s16_digits10
-#define __glibcpp_unsigned_int_min __glibcpp_u16_min
-#define __glibcpp_unsigned_int_max __glibcpp_u16_max
-#define __glibcpp_unsigned_int_digits __glibcpp_u16_digits
-#define __glibcpp_unsigned_int_digits10 __glibcpp_u16_digits10
-#elif __glibcpp_int_bits == 32
-#define __glibcpp_signed_int_min (int)__glibcpp_s32_min
-#define __glibcpp_signed_int_max (int)__glibcpp_s32_max
-#define __glibcpp_signed_int_digits __glibcpp_s32_digits
-#define __glibcpp_signed_int_digits10 __glibcpp_s32_digits10
-#define __glibcpp_unsigned_int_min (unsigned)__glibcpp_u32_min
-#define __glibcpp_unsigned_int_max (unsigned)__glibcpp_u32_max
-#define __glibcpp_unsigned_int_digits __glibcpp_u32_digits
-#define __glibcpp_unsigned_int_digits10 __glibcpp_u32_digits10
-#elif __glibcpp_int_bits == 64
-#define __glibcpp_signed_int_min (int)__glibcpp_s64_min
-#define __glibcpp_signed_int_max (int)__glibcpp_s64_max
-#define __glibcpp_signed_int_digits __glibcpp_s64_digits
-#define __glibcpp_signed_int_digits10 __glibcpp_s64_digits10
-#define __glibcpp_unsigned_int_min (unsigned)__glibcpp_u64_min
-#define __glibcpp_unsigned_int_max (unsigned)__glibcpp_u64_max
-#define __glibcpp_unsigned_int_digits __glibcpp_u64_digits
-#define __glibcpp_unsigned_int_digits10 __glibcpp_u64_digits10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// long
-
-#define __glibcpp_signed_long_traps true
-#define __glibcpp_unsigned_long_traps true
-#ifndef __glibcpp_signed_long_is_modulo
-#define __glibcpp_signed_long_is_modulo true
-#endif
-#if __glibcpp_long_bits == 8
-#define __glibcpp_signed_long_min __glibcpp_s8_min
-#define __glibcpp_signed_long_max __glibcpp_s8_max
-#define __glibcpp_signed_long_digits __glibcpp_s8_digits
-#define __glibcpp_signed_long_digits10 __glibcpp_s8_digits10
-#define __glibcpp_unsigned_long_min __glibcpp_u8_min
-#define __glibcpp_unsigned_long_max __glibcpp_u8_max
-#define __glibcpp_unsigned_long_digits __glibcpp_u8_digits
-#define __glibcpp_unsigned_long_digits10 __glibcpp_u8_digits10
-#elif __glibcpp_long_bits == 16
-#define __glibcpp_signed_long_min __glibcpp_s16_min
-#define __glibcpp_signed_long_max __glibcpp_s16_max
-#define __glibcpp_signed_long_digits __glibcpp_s16_digits
-#define __glibcpp_signed_long_digits10 __glibcpp_s16_digits10
-#define __glibcpp_unsigned_long_min __glibcpp_u16_min
-#define __glibcpp_unsigned_long_max __glibcpp_u16_max
-#define __glibcpp_unsigned_long_digits __glibcpp_u16_digits
-#define __glibcpp_unsigned_long_digits10 __glibcpp_u16_digits10
-#elif __glibcpp_long_bits == 32
-#define __glibcpp_signed_long_min __glibcpp_s32_min
-#define __glibcpp_signed_long_max __glibcpp_s32_max
-#define __glibcpp_signed_long_digits __glibcpp_s32_digits
-#define __glibcpp_signed_long_digits10 __glibcpp_s32_digits10
-#define __glibcpp_unsigned_long_min __glibcpp_u32_min
-#define __glibcpp_unsigned_long_max __glibcpp_u32_max
-#define __glibcpp_unsigned_long_digits __glibcpp_u32_digits
-#define __glibcpp_unsigned_long_digits10 __glibcpp_u32_digits10
-#elif __glibcpp_long_bits == 64
-#define __glibcpp_signed_long_min (long)__glibcpp_s64_min
-#define __glibcpp_signed_long_max (long)__glibcpp_s64_max
-#define __glibcpp_signed_long_digits __glibcpp_s64_digits
-#define __glibcpp_signed_long_digits10 __glibcpp_s64_digits10
-#define __glibcpp_unsigned_long_min (unsigned long)__glibcpp_u64_min
-#define __glibcpp_unsigned_long_max (unsigned long)__glibcpp_u64_max
-#define __glibcpp_unsigned_long_digits __glibcpp_u64_digits
-#define __glibcpp_unsigned_long_digits10 __glibcpp_u64_digits10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// long long
-
-#define __glibcpp_signed_long_long_traps true
-#define __glibcpp_signed_long_long_traps true
-#ifndef __glibcpp_signed_long_long_is_modulo
-#define __glibcpp_signed_long_long_is_modulo true
-#endif
-#if __glibcpp_long_long_bits == 8
-#define __glibcpp_signed_long_long_min __glibcpp_s8_min
-#define __glibcpp_signed_long_long_max __glibcpp_s8_max
-#define __glibcpp_signed_long_long_digits __glibcpp_s8_digits
-#define __glibcpp_signed_long_long_digits10 __glibcpp_s8_digits10
-#define __glibcpp_unsigned_long_long_min __glibcpp_u8_min
-#define __glibcpp_unsigned_long_long_max __glibcpp_u8_max
-#define __glibcpp_unsigned_long_long_digits __glibcpp_u8_digits
-#define __glibcpp_unsigned_long_long_digits10 __glibcpp_u8_digits10
-#elif __glibcpp_long_long_bits == 16
-#define __glibcpp_signed_long_long_min __glibcpp_s16_min
-#define __glibcpp_signed_long_long_max __glibcpp_s16_max
-#define __glibcpp_signed_long_long_digits __glibcpp_s16_digits
-#define __glibcpp_signed_long_long_digits10 __glibcpp_s16_digits10
-#define __glibcpp_unsigned_long_long_min __glibcpp_u16_min
-#define __glibcpp_unsigned_long_long_max __glibcpp_u16_max
-#define __glibcpp_unsigned_long_long_digits __glibcpp_u16_digits
-#define __glibcpp_unsigned_long_long_digits10 __glibcpp_u16_digits10
-#elif __glibcpp_long_long_bits == 32
-#define __glibcpp_signed_long_long_min __glibcpp_s32_min
-#define __glibcpp_signed_long_long_max __glibcpp_s32_max
-#define __glibcpp_signed_long_long_digits __glibcpp_s32_digits
-#define __glibcpp_signed_long_long_digits10 __glibcpp_s32_digits10
-#define __glibcpp_unsigned_long_long_min __glibcpp_u32_min
-#define __glibcpp_unsigned_long_long_max __glibcpp_u32_max
-#define __glibcpp_unsigned_long_long_digits __glibcpp_u32_digits
-#define __glibcpp_unsigned_long_long_digits10 __glibcpp_u32_digits10
-#elif __glibcpp_long_long_bits == 64
-#define __glibcpp_signed_long_long_min __glibcpp_s64_min
-#define __glibcpp_signed_long_long_max __glibcpp_s64_max
-#define __glibcpp_signed_long_long_digits __glibcpp_s64_digits
-#define __glibcpp_signed_long_long_digits10 __glibcpp_s64_digits10
-#define __glibcpp_signed_long_long_traps true
-#define __glibcpp_unsigned_long_long_min __glibcpp_u64_min
-#define __glibcpp_unsigned_long_long_max __glibcpp_u64_max
-#define __glibcpp_unsigned_long_long_digits __glibcpp_u64_digits
-#define __glibcpp_unsigned_long_long_digits10 __glibcpp_u64_digits10
-#define __glibcpp_unsigned_long_long_traps true
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// wchar_t
-
-#define __glibcpp_wchar_t_traps true
-#ifndef __glibcpp_wchar_t_is_modulo
-#define __glibcpp_wchar_t_is_modulo true
-#endif
-#if __glibcpp_wchar_t_is_signed
-#if __glibcpp_wchar_t_bits == 8
-#define __glibcpp_wchar_t_min __glibcpp_s8_min
-#define __glibcpp_wchar_t_max __glibcpp_s8_max
-#define __glibcpp_wchar_t_digits __glibcpp_s8_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_s8_digits10
-#elif __glibcpp_wchar_t_bits == 16
-#define __glibcpp_wchar_t_min __glibcpp_s16_min
-#define __glibcpp_wchar_t_max __glibcpp_s16_max
-#define __glibcpp_wchar_t_digits __glibcpp_s16_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_s16_digits10
-#elif __glibcpp_wchar_t_bits == 32
-#define __glibcpp_wchar_t_min (wchar_t)__glibcpp_s32_min
-#define __glibcpp_wchar_t_max (wchar_t)__glibcpp_s32_max
-#define __glibcpp_wchar_t_digits __glibcpp_s32_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_s32_digits10
-#elif __glibcpp_wchar_t_bits == 64
-#define __glibcpp_wchar_t_min (wchar_t)__glibcpp_s64_min
-#define __glibcpp_wchar_t_max (wchar_t)__glibcpp_s64_max
-#define __glibcpp_wchar_t_digits __glibcpp_s64_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_s64_digits10
-#else
-// You must define these macros in the configuration file.
-#endif
-#else
-#if __glibcpp_wchar_t_bits == 8
-#define __glibcpp_wchar_t_min __glibcpp_u8_min
-#define __glibcpp_wchar_t_max __glibcpp_u8_max
-#define __glibcpp_wchar_t_digits __glibcpp_u8_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_u8_digits10
-#elif __glibcpp_wchar_t_bits == 16
-#define __glibcpp_wchar_t_min __glibcpp_u16_min
-#define __glibcpp_wchar_t_max __glibcpp_u16_max
-#define __glibcpp_wchar_t_digits __glibcpp_u16_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_u16_digits10
-#elif __glibcpp_wchar_t_bits == 32
-#define __glibcpp_wchar_t_min (wchar_t)__glibcpp_u32_min
-#define __glibcpp_wchar_t_max (wchar_t)__glibcpp_u32_max
-#define __glibcpp_wchar_t_digits __glibcpp_u32_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_u32_digits10
-#elif __glibcpp_wchar_t_bits == 64
-#define __glibcpp_wchar_t_min (wchar_t)__glibcpp_u64_min
-#define __glibcpp_wchar_t_max (wchar_t)__glibcpp_u64_max
-#define __glibcpp_wchar_t_digits __glibcpp_u64_digits
-#define __glibcpp_wchar_t_digits10 __glibcpp_u64_digits10
-#else
-// You must define these macros in the configuration file.
-#endif
+// GCC only intrinsicly supports modulo integral types. The only remaining
+// integral exceptional values is division by zero. Only targets that do not
+// signal division by zero in some "hard to ignore" way should use false.
+#ifndef __glibcpp_integral_traps
+# define __glibcpp_integral_traps true
#endif
// float
//
-#if __glibcpp_float_bits == 32
-#define __glibcpp_float_min __glibcpp_f32_min
-#define __glibcpp_float_max __glibcpp_f32_max
-#define __glibcpp_float_digits __glibcpp_f32_digits
-#define __glibcpp_float_digits10 __glibcpp_f32_digits10
-#define __glibcpp_float_radix __glibcpp_f32_radix
-#define __glibcpp_float_epsilon __glibcpp_f32_epsilon
-#define __glibcpp_float_round_error __glibcpp_f32_round_error
-#define __glibcpp_float_min_exponent __glibcpp_f32_min_exponent
-#define __glibcpp_float_min_exponent10 __glibcpp_f32_min_exponent10
-#define __glibcpp_float_max_exponent __glibcpp_f32_max_exponent
-#define __glibcpp_float_max_exponent10 __glibcpp_f32_max_exponent10
-#elif __glibcpp_float_bits == 64
-#define __glibcpp_float_min __glibcpp_f64_min
-#define __glibcpp_float_max __glibcpp_f64_max
-#define __glibcpp_float_digits __glibcpp_f64_digits
-#define __glibcpp_float_digits10 __glibcpp_f64_digits10
-#define __glibcpp_float_radix __glibcpp_f64_radix
-#define __glibcpp_float_epsilon __glibcpp_f64_epsilon
-#define __glibcpp_float_round_error __glibcpp_f64_round_error
-#define __glibcpp_float_min_exponent __glibcpp_f64_min_exponent
-#define __glibcpp_float_min_exponent10 __glibcpp_f64_min_exponent10
-#define __glibcpp_float_max_exponent __glibcpp_f64_max_exponent
-#define __glibcpp_float_max_exponent10 __glibcpp_f64_max_exponent10
-#elif __glibcpp_float_bits == 80
-#define __glibcpp_float_min __glibcpp_f80_min
-#define __glibcpp_float_max __glibcpp_f80_max
-#define __glibcpp_float_digits __glibcpp_f80_digits
-#define __glibcpp_float_digits10 __glibcpp_f80_digits10
-#define __glibcpp_float_radix __glibcpp_f80_radix
-#define __glibcpp_float_epsilon __glibcpp_f80_epsilon
-#define __glibcpp_float_round_error __glibcpp_f80_round_error
-#define __glibcpp_float_min_exponent __glibcpp_f80_min_exponent
-#define __glibcpp_float_min_exponent10 __glibcpp_f80_min_exponent10
-#define __glibcpp_float_max_exponent __glibcpp_f80_max_exponent
-#define __glibcpp_float_max_exponent10 __glibcpp_f80_max_exponent10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// FIXME: These are just stubs and inkorrect
-
-#ifndef __glibcpp_float_has_infinity
-#define __glibcpp_float_has_infinity false
-#endif
-
-#ifndef __glibcpp_float_has_quiet_NaN
-#define __glibcpp_float_has_quiet_NaN false
-#endif
-
-#ifndef __glibcpp_float_has_signaling_NaN
-#define __glibcpp_float_has_signaling_NaN false
-#endif
-
-#ifndef __glibcpp_float_has_denorm
-#define __glibcpp_float_has_denorm denorm_absent
-#endif
+// Default values. Should be overriden in configuration files if necessary.
#ifndef __glibcpp_float_has_denorm_loss
-#define __glibcpp_float_has_denorm_loss false
-#endif
-
-#ifndef __glibcpp_float_infinity
-#define __glibcpp_float_infinity 0.0F
-#endif
-
-#ifndef __glibcpp_float_quiet_NaN
-#define __glibcpp_float_quiet_NaN 0.0F
-#endif
-
-#ifndef __glibcpp_float_signaling_NaN
-#define __glibcpp_float_signaling_NaN 0.0F
-#endif
-
-#ifndef __glibcpp_float_denorm_min
-#define __glibcpp_float_denorm_min 0.0F
+# define __glibcpp_float_has_denorm_loss false
#endif
-
-#ifndef __glibcpp_float_is_iec559
-#define __glibcpp_float_is_iec559 false
-#endif
-
-#ifndef __glibcpp_float_is_bounded
-#define __glibcpp_float_is_bounded true
-#endif
-
-#ifndef __glibcpp_float_is_modulo
-#define __glibcpp_float_is_modulo false
-#endif
-
#ifndef __glibcpp_float_traps
-#define __glibcpp_float_traps false
+# define __glibcpp_float_traps false
#endif
-
#ifndef __glibcpp_float_tinyness_before
-#define __glibcpp_float_tinyness_before false
-#endif
-
-#ifndef __glibcpp_float_round_style
-#define __glibcpp_float_round_style round_toward_zero
+# define __glibcpp_float_tinyness_before false
#endif
// double
-#if __glibcpp_double_bits == 32
-#define __glibcpp_double_min __glibcpp_f32_min
-#define __glibcpp_double_max __glibcpp_f32_max
-#define __glibcpp_double_digits __glibcpp_f32_digits
-#define __glibcpp_double_digits10 __glibcpp_f32_digits10
-#define __glibcpp_double_radix __glibcpp_f32_radix
-#define __glibcpp_double_epsilon __glibcpp_f32_epsilon
-#define __glibcpp_double_round_error __glibcpp_f32_round_error
-#define __glibcpp_double_min_exponent __glibcpp_f32_min_exponent
-#define __glibcpp_double_min_exponent10 __glibcpp_f32_min_exponent10
-#define __glibcpp_double_max_exponent __glibcpp_f32_max_exponent
-#define __glibcpp_double_max_exponent10 __glibcpp_f32_max_exponent10
-#elif __glibcpp_double_bits == 64
-#define __glibcpp_double_min __glibcpp_f64_min
-#define __glibcpp_double_max __glibcpp_f64_max
-#define __glibcpp_double_digits __glibcpp_f64_digits
-#define __glibcpp_double_digits10 __glibcpp_f64_digits10
-#define __glibcpp_double_radix __glibcpp_f64_radix
-#define __glibcpp_double_epsilon __glibcpp_f64_epsilon
-#define __glibcpp_double_round_error __glibcpp_f64_round_error
-#define __glibcpp_double_min_exponent __glibcpp_f64_min_exponent
-#define __glibcpp_double_min_exponent10 __glibcpp_f64_min_exponent10
-#define __glibcpp_double_max_exponent __glibcpp_f64_max_exponent
-#define __glibcpp_double_max_exponent10 __glibcpp_f64_max_exponent10
-#elif __glibcpp_double_bits == 80
-#define __glibcpp_double_min __glibcpp_f80_min
-#define __glibcpp_double_max __glibcpp_f80_max
-#define __glibcpp_double_digits __glibcpp_f80_digits
-#define __glibcpp_double_digits10 __glibcpp_f80_digits10
-#define __glibcpp_double_radix __glibcpp_f80_radix
-#define __glibcpp_double_epsilon __glibcpp_f80_epsilon
-#define __glibcpp_double_round_error __glibcpp_f80_round_error
-#define __glibcpp_double_min_exponent __glibcpp_f80_min_exponent
-#define __glibcpp_double_min_exponent10 __glibcpp_f80_min_exponent10
-#define __glibcpp_double_max_exponent __glibcpp_f80_max_exponent
-#define __glibcpp_double_max_exponent10 __glibcpp_f80_max_exponent10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// FIXME: These are just stubs and inkorrect
-
-#ifndef __glibcpp_double_has_infinity
-#define __glibcpp_double_has_infinity false
-#endif
-
-#ifndef __glibcpp_double_has_quiet_NaN
-#define __glibcpp_double_has_quiet_NaN false
-#endif
-
-#ifndef __glibcpp_double_has_signaling_NaN
-#define __glibcpp_double_has_signaling_NaN false
-#endif
-
-#ifndef __glibcpp_double_has_denorm
-#define __glibcpp_double_has_denorm denorm_absent
-#endif
+// Default values. Should be overriden in configuration files if necessary.
#ifndef __glibcpp_double_has_denorm_loss
-#define __glibcpp_double_has_denorm_loss false
-#endif
-
-#ifndef __glibcpp_double_infinity
-#define __glibcpp_double_infinity 0.0
-#endif
-
-#ifndef __glibcpp_double_quiet_NaN
-#define __glibcpp_double_quiet_NaN 0.0
+# define __glibcpp_double_has_denorm_loss false
#endif
-
-#ifndef __glibcpp_double_signaling_NaN
-#define __glibcpp_double_signaling_NaN 0.0
-#endif
-
-#ifndef __glibcpp_double_denorm_min
-#define __glibcpp_double_denorm_min 0.0
-#endif
-
-#ifndef __glibcpp_double_is_iec559
-#define __glibcpp_double_is_iec559 false
-#endif
-
-#ifndef __glibcpp_double_is_bounded
-#define __glibcpp_double_is_bounded true
-#endif
-
-#ifndef __glibcpp_double_is_modulo
-#define __glibcpp_double_is_modulo false
-#endif
-
#ifndef __glibcpp_double_traps
-#define __glibcpp_double_traps false
+# define __glibcpp_double_traps false
#endif
-
#ifndef __glibcpp_double_tinyness_before
-#define __glibcpp_double_tinyness_before false
-#endif
-
-#ifndef __glibcpp_double_round_style
-#define __glibcpp_double_round_style round_toward_zero
+# define __glibcpp_double_tinyness_before false
#endif
// long double
-#if __glibcpp_long_double_bits == 32
-#define __glibcpp_long_double_min __glibcpp_f32_min
-#define __glibcpp_long_double_max __glibcpp_f32_max
-#define __glibcpp_long_double_digits __glibcpp_f32_digits
-#define __glibcpp_long_double_digits10 __glibcpp_f32_digits10
-#define __glibcpp_long_double_radix __glibcpp_f32_radix
-#define __glibcpp_long_double_epsilon __glibcpp_f32_epsilon
-#define __glibcpp_long_double_round_error __glibcpp_f32_round_error
-#define __glibcpp_long_double_min_exponent __glibcpp_f32_min_exponent
-#define __glibcpp_long_double_min_exponent10 __glibcpp_f32_min_exponent10
-#define __glibcpp_long_double_max_exponent __glibcpp_f32_max_exponent
-#define __glibcpp_long_double_max_exponent10 __glibcpp_f32_max_exponent10
-#elif __glibcpp_long_double_bits == 64
-#define __glibcpp_long_double_min __glibcpp_f64_min
-#define __glibcpp_long_double_max __glibcpp_f64_max
-#define __glibcpp_long_double_digits __glibcpp_f64_digits
-#define __glibcpp_long_double_digits10 __glibcpp_f64_digits10
-#define __glibcpp_long_double_radix __glibcpp_f64_radix
-#define __glibcpp_long_double_epsilon __glibcpp_f64_epsilon
-#define __glibcpp_long_double_round_error __glibcpp_f64_round_error
-#define __glibcpp_long_double_min_exponent __glibcpp_f64_min_exponent
-#define __glibcpp_long_double_min_exponent10 __glibcpp_f64_min_exponent10
-#define __glibcpp_long_double_max_exponent __glibcpp_f64_max_exponent
-#define __glibcpp_long_double_max_exponent10 __glibcpp_f64_max_exponent10
-#elif __glibcpp_long_double_bits == 80
-#define __glibcpp_long_double_min __glibcpp_f80_min
-#define __glibcpp_long_double_max __glibcpp_f80_max
-#define __glibcpp_long_double_digits __glibcpp_f80_digits
-#define __glibcpp_long_double_digits10 __glibcpp_f80_digits10
-#define __glibcpp_long_double_radix __glibcpp_f80_radix
-#define __glibcpp_long_double_epsilon __glibcpp_f80_epsilon
-#define __glibcpp_long_double_round_error __glibcpp_f80_round_error
-#define __glibcpp_long_double_min_exponent __glibcpp_f80_min_exponent
-#define __glibcpp_long_double_min_exponent10 __glibcpp_f80_min_exponent10
-#define __glibcpp_long_double_max_exponent __glibcpp_f80_max_exponent
-#define __glibcpp_long_double_max_exponent10 __glibcpp_f80_max_exponent10
-#elif __glibcpp_long_double_bits == 96
-#define __glibcpp_long_double_min __glibcpp_f96_min
-#define __glibcpp_long_double_max __glibcpp_f96_max
-#define __glibcpp_long_double_digits __glibcpp_f96_digits
-#define __glibcpp_long_double_digits10 __glibcpp_f96_digits10
-#define __glibcpp_long_double_radix __glibcpp_f96_radix
-#define __glibcpp_long_double_epsilon __glibcpp_f96_epsilon
-#define __glibcpp_long_double_round_error __glibcpp_f96_round_error
-#define __glibcpp_long_double_min_exponent __glibcpp_f96_min_exponent
-#define __glibcpp_long_double_min_exponent10 __glibcpp_f96_min_exponent10
-#define __glibcpp_long_double_max_exponent __glibcpp_f96_max_exponent
-#define __glibcpp_long_double_max_exponent10 __glibcpp_f96_max_exponent10
-#elif __glibcpp_long_double_bits == 128
-#define __glibcpp_long_double_min __glibcpp_f128_min
-#define __glibcpp_long_double_max __glibcpp_f128_max
-#define __glibcpp_long_double_digits __glibcpp_f128_digits
-#define __glibcpp_long_double_digits10 __glibcpp_f128_digits10
-#define __glibcpp_long_double_radix __glibcpp_f128_radix
-#define __glibcpp_long_double_epsilon __glibcpp_f128_epsilon
-#define __glibcpp_long_double_round_error __glibcpp_f128_round_error
-#define __glibcpp_long_double_min_exponent __glibcpp_f128_min_exponent
-#define __glibcpp_long_double_min_exponent10 __glibcpp_f128_min_exponent10
-#define __glibcpp_long_double_max_exponent __glibcpp_f128_max_exponent
-#define __glibcpp_long_double_max_exponent10 __glibcpp_f128_max_exponent10
-#else
-// You must define these macros in the configuration file.
-#endif
-
-// FIXME: These are just stubs and inkorrect
-
-#ifndef __glibcpp_long_double_has_infinity
-#define __glibcpp_long_double_has_infinity false
-#endif
-
-#ifndef __glibcpp_long_double_has_quiet_NaN
-#define __glibcpp_long_double_has_quiet_NaN false
-#endif
-
-#ifndef __glibcpp_long_double_has_signaling_NaN
-#define __glibcpp_long_double_has_signaling_NaN false
-#endif
-
-#ifndef __glibcpp_long_double_has_denorm
-#define __glibcpp_long_double_has_denorm denorm_absent
-#endif
+// Default values. Should be overriden in configuration files if necessary.
#ifndef __glibcpp_long_double_has_denorm_loss
-#define __glibcpp_long_double_has_denorm_loss false
-#endif
-
-#ifndef __glibcpp_long_double_infinity
-#define __glibcpp_long_double_infinity 0.0L
+# define __glibcpp_long_double_has_denorm_loss false
#endif
-
-#ifndef __glibcpp_long_double_quiet_NaN
-#define __glibcpp_long_double_quiet_NaN 0.0L
-#endif
-
-#ifndef __glibcpp_long_double_signaling_NaN
-#define __glibcpp_long_double_signaling_NaN 0.0L
+#ifndef __glibcpp_long_double_traps
+# define __glibcpp_long_double_traps false
#endif
-
-#ifndef __glibcpp_long_double_denorm_min
-#define __glibcpp_long_double_denorm_min 0.0L
+#ifndef __glibcpp_long_double_tinyness_before
+# define __glibcpp_long_double_tinyness_before false
#endif
-#ifndef __glibcpp_long_double_is_iec559
-#define __glibcpp_long_double_is_iec559 false
-#endif
+// You should not need to define any macros below this point.
-#ifndef __glibcpp_long_double_is_bounded
-#define __glibcpp_long_double_is_bounded true
-#endif
+#define __glibcpp_signed(T) ((T)(-1) < 0)
-#ifndef __glibcpp_long_double_is_modulo
-#define __glibcpp_long_double_is_modulo false
-#endif
+#define __glibcpp_min(T) \
+ (__glibcpp_signed (T) ? (T)1 << __glibcpp_digits (T) : (T)0)
-#ifndef __glibcpp_long_double_traps
-#define __glibcpp_long_double_traps false
-#endif
+#define __glibcpp_max(T) \
+ (__glibcpp_signed (T) ? ((T)1 << __glibcpp_digits (T)) - 1 : ~(T)0)
-#ifndef __glibcpp_long_double_tinyness_before
-#define __glibcpp_long_double_tinyness_before false
-#endif
+#define __glibcpp_digits(T) \
+ (sizeof(T) * __CHAR_BIT__ - __glibcpp_signed (T))
-#ifndef __glibcpp_long_double_round_style
-#define __glibcpp_long_double_round_style round_toward_zero
-#endif
+// The fraction 643/2136 approximates log10(2) to 7 significant digits.
+#define __glibcpp_digits10(T) \
+ (__glibcpp_digits (T) * 643 / 2136)
namespace std
{
- enum float_round_style
+ enum float_round_style
{
round_indeterminate = -1,
round_toward_zero = 0,
@@ -895,7 +158,7 @@ namespace std
round_toward_neg_infinity = 3
};
- enum float_denorm_style
+ enum float_denorm_style
{
denorm_indeterminate = -1,
denorm_absent = 0,
@@ -920,7 +183,7 @@ namespace std
static const int min_exponent10 = 0;
static const int max_exponent = 0;
static const int max_exponent10 = 0;
-
+
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
@@ -936,8 +199,8 @@ namespace std
static const float_round_style round_style = round_toward_zero;
};
- template<typename _Tp>
- struct numeric_limits : public __numeric_limits_base
+ template<typename _Tp>
+ struct numeric_limits : public __numeric_limits_base
{
static _Tp min() throw() { return static_cast<_Tp>(0); }
static _Tp max() throw() { return static_cast<_Tp>(0); }
@@ -950,7 +213,7 @@ namespace std
};
// Now there follow 15 explicit specializations. Yes, 15. Make sure
- // you get the count right.
+ // you get the count right.
template<>
struct numeric_limits<bool>
{
@@ -958,11 +221,10 @@ namespace std
static bool min() throw()
{ return false; }
-
static bool max() throw()
{ return true; }
- static const int digits = __glibcpp_bool_digits;
+ static const int digits = 1;
static const int digits10 = 0;
static const bool is_signed = false;
static const bool is_integer = true;
@@ -1000,34 +262,31 @@ namespace std
// It is not clear what it means for a boolean type to trap.
// This is a DR on the LWG issue list. Here, I use integer
// promotion semantics.
- static const bool traps = __glibcpp_signed_int_traps
- || __glibcpp_signed_long_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_bool_digits
-
template<>
struct numeric_limits<char>
{
static const bool is_specialized = true;
static char min() throw()
- { return __glibcpp_char_min; }
+ { return __glibcpp_min(char); }
static char max() throw()
- { return __glibcpp_char_max; }
+ { return __glibcpp_max(char); }
- static const int digits = __glibcpp_char_digits;
- static const int digits10 = __glibcpp_char_digits10;
- static const bool is_signed = __glibcpp_plain_char_is_signed;
+ static const int digits = __glibcpp_digits (char);
+ static const int digits10 = __glibcpp_digits10 (char);
+ static const bool is_signed = __glibcpp_signed (char);
static const bool is_integer = true;
static const bool is_exact = true;
static const int radix = 2;
static char epsilon() throw()
- { return char(); }
+ { return 0; }
static char round_error() throw()
- { return char(); }
+ { return 0; }
static const int min_exponent = 0;
static const int min_exponent10 = 0;
@@ -1051,35 +310,25 @@ namespace std
static const bool is_iec559 = false;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_char_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_char_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_char_min
-#undef __glibcpp_char_max
-#undef __glibcpp_char_digits
-#undef __glibcpp_char_digits10
-#undef __glibcpp_char_is_signed
-#undef __glibcpp_char_is_modulo
-#undef __glibcpp_char_traps
-
-
-
template<>
struct numeric_limits<signed char>
{
static const bool is_specialized = true;
static signed char min() throw()
- { return __glibcpp_signed_char_min; }
+ { return -__SCHAR_MAX__ - 1; }
static signed char max() throw()
- { return __glibcpp_signed_char_max; }
+ { return __SCHAR_MAX__; }
- static const int digits = __glibcpp_signed_char_digits;
- static const int digits10 = __glibcpp_signed_char_digits10;
+ static const int digits = __glibcpp_digits (signed char);
+ static const int digits10 = __glibcpp_digits10 (signed char);
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1111,20 +360,13 @@ namespace std
static const bool is_iec559 = false;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_signed_char_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_signed_char_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_signed_char_min
-#undef __glibcpp_signed_char_max
-#undef __glibcpp_signed_char_digits
-#undef __glibcpp_signed_char_digits10
-#undef __glibcpp_signed_char_is_modulo
-#undef __glibcpp_signed_char_traps
-
template<>
struct numeric_limits<unsigned char>
{
@@ -1133,10 +375,10 @@ namespace std
static unsigned char min() throw()
{ return 0; }
static unsigned char max() throw()
- { return __glibcpp_unsigned_char_max; }
+ { return __SCHAR_MAX__ * 2U + 1; }
- static const int digits = __glibcpp_unsigned_char_digits;
- static const int digits10 = __glibcpp_unsigned_char_digits10;
+ static const int digits = __glibcpp_digits (unsigned char);
+ static const int digits10 = __glibcpp_digits10 (unsigned char);
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1170,29 +412,24 @@ namespace std
static const bool is_bounded = true;
static const bool is_modulo = true;
- static const bool traps = __glibcpp_unsigned_char_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_unsigned_char_max
-#undef __glibcpp_unsigned_char_digits
-#undef __glibcpp_unsigned_char_digits10
-#undef __glibcpp_unsigned_char_traps
-
template<>
struct numeric_limits<wchar_t>
{
static const bool is_specialized = true;
static wchar_t min() throw()
- { return __glibcpp_wchar_t_min; }
+ { return __glibcpp_min (wchar_t); }
static wchar_t max() throw()
- { return __glibcpp_wchar_t_max; }
+ { return __glibcpp_max (wchar_t); }
- static const int digits = __glibcpp_wchar_t_digits;
- static const int digits10 = __glibcpp_wchar_t_digits10;
- static const bool is_signed = __glibcpp_wchar_t_is_signed;
+ static const int digits = __glibcpp_digits (wchar_t);
+ static const int digits10 = __glibcpp_digits10 (wchar_t);
+ static const bool is_signed = __glibcpp_signed (wchar_t);
static const bool is_integer = true;
static const bool is_exact = true;
static const int radix = 2;
@@ -1223,33 +460,25 @@ namespace std
static const bool is_iec559 = false;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_wchar_t_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_wchar_t_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_wchar_t_min
-#undef __glibcpp_wchar_t_max
-#undef __glibcpp_wchar_t_digits
-#undef __glibcpp_wchar_t_digits10
-#undef __glibcpp_wchar_t_is_signed
-#undef __glibcpp_wchar_t_is_modulo
-#undef __glibcpp_wchar_t_traps
-
template<>
struct numeric_limits<short>
{
static const bool is_specialized = true;
static short min() throw()
- { return __glibcpp_signed_short_min; }
+ { return -__SHRT_MAX__ - 1; }
static short max() throw()
- { return __glibcpp_signed_short_max; }
+ { return __SHRT_MAX__; }
- static const int digits = __glibcpp_signed_short_digits;
- static const int digits10 = __glibcpp_signed_short_digits10;
+ static const int digits = __glibcpp_digits (short);
+ static const int digits10 = __glibcpp_digits10 (short);
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1281,20 +510,13 @@ namespace std
static const bool is_iec559 = true;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_signed_short_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_signed_short_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_signed_short_min
-#undef __glibcpp_signed_short_max
-#undef __glibcpp_signed_short_digits
-#undef __glibcpp_signed_short_digits10
-#undef __glibcpp_signed_short_is_modulo
-#undef __glibcpp_signed_short_traps
-
template<>
struct numeric_limits<unsigned short>
{
@@ -1303,10 +525,10 @@ namespace std
static unsigned short min() throw()
{ return 0; }
static unsigned short max() throw()
- { return __glibcpp_unsigned_short_max; }
+ { return __SHRT_MAX__ * 2U + 1; }
- static const int digits = __glibcpp_unsigned_short_digits;
- static const int digits10 = __glibcpp_unsigned_short_digits10;
+ static const int digits = __glibcpp_digits (unsigned short);
+ static const int digits10 = __glibcpp_digits10 (unsigned short);
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1340,28 +562,23 @@ namespace std
static const bool is_bounded = true;
static const bool is_modulo = true;
- static const bool traps = __glibcpp_unsigned_short_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_unsigned_short_max
-#undef __glibcpp_unsigned_short_digits
-#undef __glibcpp_unsigned_short_digits10
-#undef __glibcpp_unsigned_short_traps
-
template<>
struct numeric_limits<int>
{
static const bool is_specialized = true;
static int min() throw()
- { return __glibcpp_signed_int_min; }
+ { return -__INT_MAX__ - 1; }
static int max() throw()
- { return __glibcpp_signed_int_max; }
+ { return __INT_MAX__; }
- static const int digits = __glibcpp_signed_int_digits;
- static const int digits10 = __glibcpp_signed_int_digits10;
+ static const int digits = __glibcpp_digits (int);
+ static const int digits10 = __glibcpp_digits10 (int);
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1393,20 +610,13 @@ namespace std
static const bool is_iec559 = true;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_signed_int_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_signed_int_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_signed_int_min
-#undef __glibcpp_signed_int_max
-#undef __glibcpp_signed_int_digits
-#undef __glibcpp_signed_int_digits10
-#undef __glibcpp_signed_int_is_modulo
-#undef __glibcpp_signed_int_traps
-
template<>
struct numeric_limits<unsigned int>
{
@@ -1414,11 +624,11 @@ namespace std
static unsigned int min() throw()
{ return 0; }
- static unsigned int max() throw()
- { return __glibcpp_unsigned_int_max; }
+ static unsigned int max() throw()
+ { return __INT_MAX__ * 2U + 1; }
- static const int digits = __glibcpp_unsigned_int_digits;
- static const int digits10 = __glibcpp_unsigned_int_digits10;
+ static const int digits = __glibcpp_digits (unsigned int);
+ static const int digits10 = __glibcpp_digits10 (unsigned int);
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1452,28 +662,23 @@ namespace std
static const bool is_bounded = true;
static const bool is_modulo = true;
- static const bool traps = __glibcpp_unsigned_int_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_unsigned_int_max
-#undef __glibcpp_unsigned_int_digits
-#undef __glibcpp_unsigned_int_digits10
-#undef __glibcpp_unsigned_int_traps
-
template<>
struct numeric_limits<long>
{
static const bool is_specialized = true;
static long min() throw()
- { return __glibcpp_signed_long_min; }
+ { return -__LONG_MAX__ - 1; }
static long max() throw()
- { return __glibcpp_signed_long_max; }
+ { return __LONG_MAX__; }
- static const int digits = __glibcpp_signed_long_digits;
- static const int digits10 = __glibcpp_signed_long_digits10;
+ static const int digits = __glibcpp_digits (long);
+ static const int digits10 = __glibcpp_digits10 (long);
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1505,20 +710,13 @@ namespace std
static const bool is_iec559 = true;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_signed_long_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_signed_long_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_signed_long_min
-#undef __glibcpp_signed_long_max
-#undef __glibcpp_signed_long_digits
-#undef __glibcpp_signed_long_digits10
-#undef __glibcpp_signed_long_is_modulo
-#undef __glibcpp_signed_long_traps
-
template<>
struct numeric_limits<unsigned long>
{
@@ -1527,10 +725,10 @@ namespace std
static unsigned long min() throw()
{ return 0; }
static unsigned long max() throw()
- { return __glibcpp_unsigned_long_max; }
+ { return __LONG_MAX__ * 2UL + 1; }
- static const int digits = __glibcpp_unsigned_long_digits;
- static const int digits10 = __glibcpp_unsigned_long_digits10;
+ static const int digits = __glibcpp_digits (unsigned long);
+ static const int digits10 = __glibcpp_digits10 (unsigned long);
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1564,28 +762,23 @@ namespace std
static const bool is_bounded = true;
static const bool is_modulo = true;
- static const bool traps = __glibcpp_unsigned_long_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_unsigned_long_max
-#undef __glibcpp_unsigned_long_digits
-#undef __glibcpp_unsigned_long_digits10
-#undef __glibcpp_unsigned_long_traps
-
template<>
struct numeric_limits<long long>
{
static const bool is_specialized = true;
-
+
static long long min() throw()
- { return __glibcpp_signed_long_long_min; }
+ { return -__LONG_LONG_MAX__ - 1; }
static long long max() throw()
- { return __glibcpp_signed_long_long_max; }
-
- static const int digits = __glibcpp_signed_long_long_digits;
- static const int digits10 = __glibcpp_signed_long_long_digits10;
+ { return __LONG_LONG_MAX__; }
+
+ static const int digits = __glibcpp_digits (long long);
+ static const int digits10 = __glibcpp_digits10 (long long);
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1594,18 +787,18 @@ namespace std
{ return 0; }
static long long round_error() throw()
{ return 0; }
-
+
static const int min_exponent = 0;
static const int min_exponent10 = 0;
static const int max_exponent = 0;
static const int max_exponent10 = 0;
-
+
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const float_denorm_style has_denorm = denorm_absent;
static const bool has_denorm_loss = false;
-
+
static long long infinity() throw()
{ return static_cast<long long>(0); }
static long long quiet_NaN() throw()
@@ -1614,23 +807,16 @@ namespace std
{ return static_cast<long long>(0); }
static long long denorm_min() throw()
{ return static_cast<long long>(0); }
-
+
static const bool is_iec559 = true;
static const bool is_bounded = true;
- static const bool is_modulo = __glibcpp_signed_long_long_is_modulo;
+ static const bool is_modulo = true;
- static const bool traps = __glibcpp_signed_long_long_traps;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_signed_long_long_min
-#undef __glibcpp_signed_long_long_max
-#undef __glibcpp_signed_long_long_digits
-#undef __glibcpp_signed_long_long_digits10
-#undef __glibcpp_signed_long_long_is_modulo
-#undef __glibcpp_signed_long_long_traps
-
template<>
struct numeric_limits<unsigned long long>
{
@@ -1639,10 +825,10 @@ namespace std
static unsigned long long min() throw()
{ return 0; }
static unsigned long long max() throw()
- { return __glibcpp_unsigned_long_long_max; }
+ { return __LONG_LONG_MAX__ * 2ULL + 1; }
- static const int digits = __glibcpp_unsigned_long_long_digits;
- static const int digits10 = __glibcpp_unsigned_long_long_digits10;
+ static const int digits = __glibcpp_digits (unsigned long long);
+ static const int digits10 = __glibcpp_digits10 (unsigned long long);
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
@@ -1676,91 +862,68 @@ namespace std
static const bool is_bounded = true;
static const bool is_modulo = true;
- static const bool traps = true;
+ static const bool traps = __glibcpp_integral_traps;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
-#undef __glibcpp_unsigned_long_long_max
-#undef __glibcpp_unsigned_long_long_digits
-#undef __glibcpp_unsigned_long_long_digits10
-#undef __glibcpp_unsigned_long_long_traps
-
template<>
struct numeric_limits<float>
{
static const bool is_specialized = true;
static float min() throw()
- { return __glibcpp_float_min; }
+ { return __FLT_MIN__; }
static float max() throw()
- { return __glibcpp_float_max; }
+ { return __FLT_MAX__; }
- static const int digits = __glibcpp_float_digits;
- static const int digits10 = __glibcpp_float_digits10;
+ static const int digits = __FLT_MANT_DIG__;
+ static const int digits10 = __FLT_DIG__;
static const bool is_signed = true;
static const bool is_integer = false;
static const bool is_exact = false;
- static const int radix = __glibcpp_float_radix;
+ static const int radix = __FLT_RADIX__;
static float epsilon() throw()
- { return __glibcpp_float_epsilon; }
+ { return __FLT_EPSILON__; }
static float round_error() throw()
- { return __glibcpp_float_round_error; }
-
- static const int min_exponent = __glibcpp_float_min_exponent;
- static const int min_exponent10 = __glibcpp_float_min_exponent10;
- static const int max_exponent = __glibcpp_float_max_exponent;
- static const int max_exponent10 = __glibcpp_float_max_exponent10;
-
- static const bool has_infinity = __glibcpp_float_has_infinity;
- static const bool has_quiet_NaN = __glibcpp_float_has_quiet_NaN;
- static const bool has_signaling_NaN = __glibcpp_float_has_signaling_NaN;
- static const float_denorm_style has_denorm = __glibcpp_float_has_denorm;
+ { return 0.5F; }
+
+ static const int min_exponent = __FLT_MIN_EXP__;
+ static const int min_exponent10 = __FLT_MIN_10_EXP__;
+ static const int max_exponent = __FLT_MAX_EXP__;
+ static const int max_exponent10 = __FLT_MAX_10_EXP__;
+
+ static const bool has_infinity
+ = __builtin_huge_valf () / 2 == __builtin_huge_valf ();
+ static const bool has_quiet_NaN
+ = __builtin_nanf ("") != __builtin_nanf ("");
+ static const bool has_signaling_NaN = has_quiet_NaN;
+ static const float_denorm_style has_denorm
+ = __FLT_DENORM_MIN__ ? denorm_present : denorm_absent;
static const bool has_denorm_loss = __glibcpp_float_has_denorm_loss;
static float infinity() throw()
- { return __glibcpp_float_infinity; }
+ { return __builtin_huge_valf (); }
static float quiet_NaN() throw()
- { return __glibcpp_float_quiet_NaN; }
+ { return __builtin_nanf (""); }
static float signaling_NaN() throw()
- { return __glibcpp_float_signaling_NaN; }
+ { return __builtin_nansf (""); }
static float denorm_min() throw()
- { return __glibcpp_float_denorm_min; }
+ { return __FLT_DENORM_MIN__; }
- static const bool is_iec559 = __glibcpp_float_is_iec559;
- static const bool is_bounded = __glibcpp_float_is_bounded;
- static const bool is_modulo = __glibcpp_float_is_modulo;
+ static const bool is_iec559
+ = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
+ static const bool is_bounded = true;
+ static const bool is_modulo = false;
static const bool traps = __glibcpp_float_traps;
static const bool tinyness_before = __glibcpp_float_tinyness_before;
- static const float_round_style round_style = __glibcpp_float_round_style;
+ static const float_round_style round_style = round_to_nearest;
};
-#undef __glibcpp_float_min
-#undef __glibcpp_float_max
-#undef __glibcpp_float_digits
-#undef __glibcpp_float_digits10
-#undef __glibcpp_float_radix
-#undef __glibcpp_float_round_error
-#undef __glibcpp_float_min_exponent
-#undef __glibcpp_float_min_exponent10
-#undef __glibcpp_float_max_exponent
-#undef __glibcpp_float_max_exponent10
-#undef __glibcpp_float_has_infinity
-#undef __glibcpp_float_has_quiet_NaN
-#undef __glibcpp_float_has_signaling_NaN
-#undef __glibcpp_float_has_denorm
#undef __glibcpp_float_has_denorm_loss
-#undef __glibcpp_float_infinity
-#undef __glibcpp_float_quiet_NaN
-#undef __glibcpp_float_signaling_NaN
-#undef __glibcpp_float_denorm_min
-#undef __glibcpp_float_is_iec559
-#undef __glibcpp_float_is_bounded
-#undef __glibcpp_float_is_modulo
#undef __glibcpp_float_traps
#undef __glibcpp_float_tinyness_before
-#undef __glibcpp_float_round_style
template<>
struct numeric_limits<double>
@@ -1768,159 +931,123 @@ namespace std
static const bool is_specialized = true;
static double min() throw()
- { return __glibcpp_double_min; }
+ { return __DBL_MIN__; }
static double max() throw()
- { return __glibcpp_double_max; }
+ { return __DBL_MAX__; }
- static const int digits = __glibcpp_double_digits;
- static const int digits10 = __glibcpp_double_digits10;
+ static const int digits = __DBL_MANT_DIG__;
+ static const int digits10 = __DBL_DIG__;
static const bool is_signed = true;
static const bool is_integer = false;
static const bool is_exact = false;
- static const int radix = __glibcpp_double_radix;
+ static const int radix = __FLT_RADIX__;
static double epsilon() throw()
- { return __glibcpp_double_epsilon; }
+ { return __DBL_EPSILON__; }
static double round_error() throw()
- { return __glibcpp_double_round_error; }
-
- static const int min_exponent = __glibcpp_double_min_exponent;
- static const int min_exponent10 = __glibcpp_double_min_exponent10;
- static const int max_exponent = __glibcpp_double_max_exponent;
- static const int max_exponent10 = __glibcpp_double_max_exponent10;
-
- static const bool has_infinity = __glibcpp_double_has_infinity;
- static const bool has_quiet_NaN = __glibcpp_double_has_quiet_NaN;
- static const bool has_signaling_NaN = __glibcpp_double_has_signaling_NaN;
- static const float_denorm_style has_denorm =
- __glibcpp_double_has_denorm;
+ { return 0.5; }
+
+ static const int min_exponent = __DBL_MIN_EXP__;
+ static const int min_exponent10 = __DBL_MIN_10_EXP__;
+ static const int max_exponent = __DBL_MAX_EXP__;
+ static const int max_exponent10 = __DBL_MAX_10_EXP__;
+
+ static const bool has_infinity
+ = __builtin_huge_val () / 2 == __builtin_huge_val ();
+ static const bool has_quiet_NaN
+ = __builtin_nan ("") != __builtin_nan ("");
+ static const bool has_signaling_NaN = has_quiet_NaN;
+ static const float_denorm_style has_denorm
+ = __DBL_DENORM_MIN__ ? denorm_present : denorm_absent;
static const bool has_denorm_loss = __glibcpp_double_has_denorm_loss;
static double infinity() throw()
- { return __glibcpp_double_infinity; }
+ { return __builtin_huge_val(); }
static double quiet_NaN() throw()
- { return __glibcpp_double_quiet_NaN; }
+ { return __builtin_nan (""); }
static double signaling_NaN() throw()
- { return __glibcpp_double_signaling_NaN; }
+ { return __builtin_nans (""); }
static double denorm_min() throw()
- { return __glibcpp_double_denorm_min; }
+ { return __DBL_DENORM_MIN__; }
- static const bool is_iec559 = __glibcpp_double_is_iec559;
- static const bool is_bounded = __glibcpp_double_is_bounded;
- static const bool is_modulo = __glibcpp_double_is_modulo;
+ static const bool is_iec559
+ = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
+ static const bool is_bounded = true;
+ static const bool is_modulo = false;
static const bool traps = __glibcpp_double_traps;
static const bool tinyness_before = __glibcpp_double_tinyness_before;
- static const float_round_style round_style =
- __glibcpp_double_round_style;
+ static const float_round_style round_style = round_to_nearest;
};
-#undef __glibcpp_double_min
-#undef __glibcpp_double_max
-#undef __glibcpp_double_digits
-#undef __glibcpp_double_digits10
-#undef __glibcpp_double_radix
-#undef __glibcpp_double_round_error
-#undef __glibcpp_double_min_exponent
-#undef __glibcpp_double_min_exponent10
-#undef __glibcpp_double_max_exponent
-#undef __glibcpp_double_max_exponent10
-#undef __glibcpp_double_has_infinity
-#undef __glibcpp_double_has_quiet_NaN
-#undef __glibcpp_double_has_signaling_NaN
-#undef __glibcpp_double_has_denorm
#undef __glibcpp_double_has_denorm_loss
-#undef __glibcpp_double_infinity
-#undef __glibcpp_double_quiet_NaN
-#undef __glibcpp_double_signaling_NaN
-#undef __glibcpp_double_denorm_min
-#undef __glibcpp_double_is_iec559
-#undef __glibcpp_double_is_bounded
-#undef __glibcpp_double_is_modulo
#undef __glibcpp_double_traps
#undef __glibcpp_double_tinyness_before
-#undef __glibcpp_double_round_style
-
-
+
template<>
struct numeric_limits<long double>
{
static const bool is_specialized = true;
static long double min() throw()
- { return __glibcpp_long_double_min; }
+ { return __LDBL_MIN__; }
static long double max() throw()
- { return __glibcpp_long_double_max; }
+ { return __LDBL_MAX__; }
- static const int digits = __glibcpp_long_double_digits;
- static const int digits10 = __glibcpp_long_double_digits10;
+ static const int digits = __LDBL_MANT_DIG__;
+ static const int digits10 = __LDBL_DIG__;
static const bool is_signed = true;
static const bool is_integer = false;
static const bool is_exact = false;
- static const int radix = __glibcpp_long_double_radix;
+ static const int radix = __FLT_RADIX__;
static long double epsilon() throw()
- { return __glibcpp_long_double_epsilon; }
+ { return __LDBL_EPSILON__; }
static long double round_error() throw()
- { return __glibcpp_long_double_round_error; }
-
- static const int min_exponent = __glibcpp_long_double_min_exponent;
- static const int min_exponent10 = __glibcpp_long_double_min_exponent10;
- static const int max_exponent = __glibcpp_long_double_max_exponent;
- static const int max_exponent10 = __glibcpp_long_double_max_exponent10;
-
- static const bool has_infinity = __glibcpp_long_double_has_infinity;
- static const bool has_quiet_NaN = __glibcpp_long_double_has_quiet_NaN;
- static const bool has_signaling_NaN =
- __glibcpp_long_double_has_signaling_NaN;
- static const float_denorm_style has_denorm =
- __glibcpp_long_double_has_denorm;
- static const bool has_denorm_loss =
- __glibcpp_long_double_has_denorm_loss;
+ { return 0.5L; }
+
+ static const int min_exponent = __LDBL_MIN_EXP__;
+ static const int min_exponent10 = __LDBL_MIN_10_EXP__;
+ static const int max_exponent = __LDBL_MAX_EXP__;
+ static const int max_exponent10 = __LDBL_MAX_10_EXP__;
+
+ static const bool has_infinity
+ = __builtin_huge_vall () / 2 == __builtin_huge_vall ();
+ static const bool has_quiet_NaN
+ = __builtin_nanl ("") != __builtin_nanl ("");
+ static const bool has_signaling_NaN = has_quiet_NaN;
+ static const float_denorm_style has_denorm
+ = __LDBL_DENORM_MIN__ ? denorm_present : denorm_absent;
+ static const bool has_denorm_loss
+ = __glibcpp_long_double_has_denorm_loss;
static long double infinity() throw()
- { return __glibcpp_long_double_infinity; }
+ { return __builtin_huge_vall (); }
static long double quiet_NaN() throw()
- { return __glibcpp_long_double_quiet_NaN; }
+ { return __builtin_nanl (""); }
static long double signaling_NaN() throw()
- { return __glibcpp_long_double_signaling_NaN; }
+ { return __builtin_nansl (""); }
static long double denorm_min() throw()
- { return __glibcpp_long_double_denorm_min; }
+ { return __LDBL_DENORM_MIN__; }
- static const bool is_iec559 = __glibcpp_long_double_is_iec559;
- static const bool is_bounded = __glibcpp_long_double_is_bounded;
- static const bool is_modulo = __glibcpp_long_double_is_modulo;
+ static const bool is_iec559
+ = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
+ static const bool is_bounded = true;
+ static const bool is_modulo = false;
- static const bool traps = __glibcpp_long_double_traps;
+ static const bool traps = __glibcpp_long_double_traps;
static const bool tinyness_before = __glibcpp_long_double_tinyness_before;
- static const float_round_style round_style =
- __glibcpp_long_double_round_style;
+ static const float_round_style round_style = round_to_nearest;
};
-#undef __glibcpp_long_double_min
-#undef __glibcpp_long_double_max
-#undef __glibcpp_long_double_digits
-#undef __glibcpp_long_double_digits10
-#undef __glibcpp_long_double_radix
-#undef __glibcpp_long_double_round_error
-#undef __glibcpp_long_double_min_exponent
-#undef __glibcpp_long_double_min_exponent10
-#undef __glibcpp_long_double_max_exponent
-#undef __glibcpp_long_double_max_exponent10
-#undef __glibcpp_long_double_has_infinity
-#undef __glibcpp_long_double_has_quiet_NaN
-#undef __glibcpp_long_double_has_signaling_NaN
-#undef __glibcpp_long_double_has_denorm
#undef __glibcpp_long_double_has_denorm_loss
-#undef __glibcpp_long_double_infinity
-#undef __glibcpp_long_double_quiet_NaN
-#undef __glibcpp_long_double_signaling_NaN
-#undef __glibcpp_long_double_denorm_min
-#undef __glibcpp_long_double_is_iec559
-#undef __glibcpp_long_double_is_bounded
-#undef __glibcpp_long_double_is_modulo
#undef __glibcpp_long_double_traps
#undef __glibcpp_long_double_tinyness_before
-#undef __glibcpp_long_double_round_style
-
+
} // namespace std
+#undef __glibcpp_signed
+#undef __glibcpp_min
+#undef __glibcpp_max
+#undef __glibcpp_digits
+#undef __glibcpp_digits10
+
#endif // _CPP_NUMERIC_LIMITS
diff --git a/libstdc++-v3/libio/Makefile.in b/libstdc++-v3/libio/Makefile.in
index a5384b89f04..08c71d94d1b 100644
--- a/libstdc++-v3/libio/Makefile.in
+++ b/libstdc++-v3/libio/Makefile.in
@@ -74,7 +74,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXX = @CXX@
CXXCPP = @CXXCPP@
diff --git a/libstdc++-v3/libmath/Makefile.am b/libstdc++-v3/libmath/Makefile.am
index 27d76e93f20..30d3dce0d16 100644
--- a/libstdc++-v3/libmath/Makefile.am
+++ b/libstdc++-v3/libmath/Makefile.am
@@ -34,12 +34,11 @@ libmath_la_DEPENDENCIES = $(libmath_la_LIBADD)
libmath_la_SOURCES = stubs.c
-LINK = \
- $(LIBTOOL) --tag CC --mode=link "$(CCLD)" \
- $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
# Use common includes from acinclude.m4/GLIBCPP_EXPORT_INCLUDES
TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
INCLUDES = \
$(TOPLEVEL_INCLUDES)
+
+# Only compiling "C" sources in this directory.
+LIBTOOL = @LIBTOOL@ --tag CC
diff --git a/libstdc++-v3/libmath/Makefile.in b/libstdc++-v3/libmath/Makefile.in
index 375b9ad31d4..09f2df1f77d 100644
--- a/libstdc++-v3/libmath/Makefile.in
+++ b/libstdc++-v3/libmath/Makefile.in
@@ -74,7 +74,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXX = @CXX@
CXXCPP = @CXXCPP@
@@ -92,7 +91,6 @@ LIBMATHOBJS = @LIBMATHOBJS@
LIBMATH_INCLUDES = @LIBMATH_INCLUDES@
LIBSUPCXX_INCLUDES = @LIBSUPCXX_INCLUDES@
LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
-LIBTOOL = @LIBTOOL@
LIBUNWIND_FLAG = @LIBUNWIND_FLAG@
LN_S = @LN_S@
MAINT = @MAINT@
@@ -144,17 +142,15 @@ libmath_la_DEPENDENCIES = $(libmath_la_LIBADD)
libmath_la_SOURCES = stubs.c
-LINK = \
- $(LIBTOOL) --tag CC --mode=link "$(CCLD)" \
- $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-
-
# Use common includes from acinclude.m4/GLIBCPP_EXPORT_INCLUDES
TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
INCLUDES = \
$(TOPLEVEL_INCLUDES)
+
+# Only compiling "C" sources in this directory.
+LIBTOOL = @LIBTOOL@ --tag CC
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
LTLIBRARIES = $(noinst_LTLIBRARIES)
@@ -170,6 +166,7 @@ CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
DIST_COMMON = Makefile.am Makefile.in
diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
index 5d0e5d2b628..144b5094841 100644
--- a/libstdc++-v3/libsupc++/Makefile.in
+++ b/libstdc++-v3/libsupc++/Makefile.in
@@ -73,7 +73,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXXCPP = @CXXCPP@
C_INCLUDE_DIR = @C_INCLUDE_DIR@
diff --git a/libstdc++-v3/mkcshadow b/libstdc++-v3/mkcshadow
deleted file mode 100755
index 4d4bd4f65f2..00000000000
--- a/libstdc++-v3/mkcshadow
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env bash
-
-# mkcshadow: reads header names (like "features.h" or "sys/types.h")
-# from stdin, and creates shadow headers under cshadow/, except where
-# a header of the same name is already in shadow/.
-
-SCRIPTDIR=${0%/*}
-
-if [ ! -d cshadow ]; then
- echo "Creating cshadow."
- mkdir ../cshadow
-fi
-
-echo "Creating..."
-while read header; do
-
- if [ ! -f $SCRIPTDIR/shadow/$header ]; then
-
- # strip off directory names while making
- # any necessary directories
-
- dir=../cshadow
- case "$header" in */*)
- right="$header"
- while [ "$right" != "${right##*/}" ] ; do
- dir="$dir/${right%%/*}"
- if [ ! -d "$dir" ]; then mkdir "$dir"; fi
- right="${right#*/}"
- done
- ;;
- esac
-
- echo " ../cshadow/$header"
- UPNAME=`echo $header | tr 'a-z./-' 'A-Z___'`
- cat >"../cshadow/$header" <<EOF
-// -*- C++ -*- header wrapper.
-
-// Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file 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.
-
-// Note: this file was automatically generated by the "mkcshadow"
-// script. RTFM!
-
-#ifndef _INCLUDED_CPP_${UPNAME}_
-# define _INCLUDED_CPP_${UPNAME}_
-
-# ifdef _IN_C_LEGACY_ /* sub-included by a C header */
-# pragma GCC system_header
-# include_next <${header}>
-# else
-
- namespace _C_legacy { namespace _C_shadow { } }
- using namespace ::_C_legacy::_C_shadow;
- namespace _C_legacy {
- extern "C" {
-# define _IN_C_LEGACY_
-# pragma GCC system_header
-# include_next <${header}>
- } // close extern "C"
- } // close namespace _C_legacy::
-# undef _IN_C_LEGACY_
-
-# endif /* _IN_C_LEGACY_ */
-#endif /* _INCLUDED_CPP_${UPNAME}_ */
-EOF
-#################### end ####################
- fi
-done
-
-
-
-
-
-
diff --git a/libstdc++-v3/mkinclosure b/libstdc++-v3/mkinclosure
deleted file mode 100755
index 7996b4b5e18..00000000000
--- a/libstdc++-v3/mkinclosure
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env bash
-#
-# usage: inclosure [ -I dir ] ... [ -G header-name ] ... header-name ...
-#
-# Locates each standard header and argument header-name in the
-# specified "-I" include path (default is /usr/include) and parses
-# any header names out of its #include directives. These names are
-# treated recursively to identify a _transitive_closure_ of standard
-# header names, which is sorted and sent to standard output. Headers
-# not specified with -G, and included somewhere but not located are
-# reported.
-#
-# Each header reported by this program must be "shadowed" by a
-# file of the same name in a C++ header. See
-# http://www.cantrip.org/cheaders.html
-#
-# BUGS:
-# - Cannot cope with header file names that contain spaces
-# - Ignores comment-block delimiters
-# - Ignores sub-includes under #include_next headers.
-
-OLDH=/tmp/old$$
-echo "this-compensates-for-a-stupid-bug-in-GNU-fgrep." >$OLDH
-HDRS=/tmp/hdrs$$
->$HDRS
-NEW=/tmp/new$$
->$NEW
-IGNORES=/tmp/ignores$$
-echo "this-compensates-for-a-stupid-bug-in-GNU-fgrep.">$IGNORES
-
-trap "rm -f $NEW $HDRS $OLDH $IGNORES" 0
-
-# process arguments
-unset INCPATH
-while [ $# != 0 -a "$1" != "${1#-}" ]; do
- FLAG="${1%%${1##-?}}"
- case "$FLAG" in -I|-G)
- ARG="${1##${FLAG}}"
- if [ "$ARG" = "" ]; then
- if [ $# != 0 ]; then
- shift;
- ARG="$1"
- else
- echo "$0: $FLAG needs an argument."
- exit
- fi
- fi ;;
- esac
- shift
- case "$FLAG" in
- -I) INCPATH="$INCPATH $ARG" ;;
- -G) echo " $ARG " >>$IGNORES ;;
- esac
-done
-INCPATH=${INCPATH-"/usr/include"}
-
-# identify headers
-
-STDHDRS="assert.h ctype.h errno.h float.h limits.h \
- locale.h math.h setjmp.h signal.h stdarg.h stddef.h \
- stdio.h stdlib.h string.h time.h wchar.h wctype.h "
-OTHERS="$*"
-
-for file in $STDHDRS $OTHERS; do
- echo "$file"
-done >$HDRS
-
-until cmp -s $OLDH $HDRS; do # (until no new headers found)
-
- fgrep -v -f $OLDH $HDRS \
- | while read file; do
- found=no
- for dir in $INCPATH; do
- name="$dir/$file"
- if [ -f "$name" ]; then
- cat "$name"
- found=yes
- break;
- fi
- done
- if [ "$found" = no ]; then # && echo " $file " | fgrep -v -q -f $IGNORES
- echo "$0: warning: header $file not found in include path." $1>&2
- fi
- done \
- | sed -n -e \
-'/^[ ]*#[ ]*include[ ]*<[^>]*>/s/^[^<]*<\([^>]*\)>.*/\1/p' \
- | while read file; do
- drop=no
- for ignore in `cat $IGNORES`; do
- if [ "$ignore" = "$file" ]; then drop=yes; fi
- done
- case "$file" in /*) drop=yes;; esac # no absolute paths
- case $drop in no) echo "$file";; esac
- done >$NEW
- mv $HDRS $OLDH
- cat $OLDH $NEW | sort -u -o $HDRS
-
-done
-cat $HDRS
-
-
-
diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in
index 32259dc1c39..7ebb03291f3 100644
--- a/libstdc++-v3/po/Makefile.in
+++ b/libstdc++-v3/po/Makefile.in
@@ -74,7 +74,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXX = @CXX@
CXXCPP = @CXXCPP@
diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
index 120841b1239..4592168f48d 100644
--- a/libstdc++-v3/src/Makefile.am
+++ b/libstdc++-v3/src/Makefile.am
@@ -27,7 +27,7 @@ MAINT_CHARSET = latin1
mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
-# Cross compiler and multilib support.
+# Cross compiler support.
CXX = @glibcpp_CXX@
toolexecdir = @glibcpp_toolexecdir@
toolexeclibdir = @glibcpp_toolexeclibdir@
@@ -60,12 +60,26 @@ INCLUDES = \
$(LIBSUPCXX_INCLUDES) $(LIBIO_INCLUDES) $(LIBMATH_INCLUDES) \
$(TOPLEVEL_INCLUDES)
-sources = \
+# Source files linked in via configuration magic for a particular target.
+target_sources = \
+ codecvt_members.cc \
+ collate_members.cc \
+ ctype_members.cc \
+ messages_members.cc \
+ monetary_members.cc \
+ numeric_members.cc \
+ time_members.cc
+
+# Source files linked in via configuration magic for a particular
+# target, but with ad hoc naming rules.
+target_sources_extra = \
basic_file.cc \
+ c++locale.cc
+
+# Sources present in the src directory.
+sources = \
bitset.cc \
- c++locale.cc \
codecvt.cc \
- collate.cc \
complex_io.cc \
concept-inst.cc \
ctype.cc \
@@ -78,13 +92,10 @@ sources = \
ios.cc \
istream-inst.cc \
limits.cc \
- locale-inst.cc \
locale.cc \
+ locale-inst.cc \
localename.cc \
- messages.cc \
misc-inst.cc \
- monetary.cc \
- numeric.cc \
ostream-inst.cc \
sstream-inst.cc \
stdexcept.cc \
@@ -92,11 +103,11 @@ sources = \
streambuf-inst.cc \
string-inst.cc \
strstream.cc \
- time.cc \
valarray-inst.cc \
vterminate.cc \
- wstring-inst.cc
-
+ wstring-inst.cc \
+ ${target_sources} \
+ ${target_sources_extra}
VPATH = $(top_srcdir)/src:$(top_srcdir)
diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in
index dc15a6bbc13..0974449aaa1 100644
--- a/libstdc++-v3/src/Makefile.in
+++ b/libstdc++-v3/src/Makefile.in
@@ -73,7 +73,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXXCPP = @CXXCPP@
C_INCLUDE_DIR = @C_INCLUDE_DIR@
@@ -130,7 +129,7 @@ MAINT_CHARSET = latin1
mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
-# Cross compiler and multilib support.
+# Cross compiler support.
CXX = @glibcpp_CXX@
toolexecdir = @glibcpp_toolexecdir@
toolexeclibdir = @glibcpp_toolexeclibdir@
@@ -166,12 +165,28 @@ INCLUDES = \
$(TOPLEVEL_INCLUDES)
-sources = \
+# Source files linked in via configuration magic for a particular target.
+target_sources = \
+ codecvt_members.cc \
+ collate_members.cc \
+ ctype_members.cc \
+ messages_members.cc \
+ monetary_members.cc \
+ numeric_members.cc \
+ time_members.cc
+
+
+# Source files linked in via configuration magic for a particular
+# target, but with ad hoc naming rules.
+target_sources_extra = \
basic_file.cc \
+ c++locale.cc
+
+
+# Sources present in the src directory.
+sources = \
bitset.cc \
- c++locale.cc \
codecvt.cc \
- collate.cc \
complex_io.cc \
concept-inst.cc \
ctype.cc \
@@ -184,13 +199,10 @@ sources = \
ios.cc \
istream-inst.cc \
limits.cc \
- locale-inst.cc \
locale.cc \
+ locale-inst.cc \
localename.cc \
- messages.cc \
misc-inst.cc \
- monetary.cc \
- numeric.cc \
ostream-inst.cc \
sstream-inst.cc \
stdexcept.cc \
@@ -198,10 +210,11 @@ sources = \
streambuf-inst.cc \
string-inst.cc \
strstream.cc \
- time.cc \
valarray-inst.cc \
vterminate.cc \
- wstring-inst.cc
+ wstring-inst.cc \
+ ${target_sources} \
+ ${target_sources_extra}
VPATH = $(top_srcdir)/src:$(top_srcdir)
@@ -279,14 +292,15 @@ DEFS = @DEFS@ -I. -I$(srcdir) -I..
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
-libstdc___la_OBJECTS = basic_file.lo bitset.lo c++locale.lo codecvt.lo \
-collate.lo complex_io.lo concept-inst.lo ctype.lo ext-inst.lo \
-fstream.lo fstream-inst.lo functexcept.lo globals.lo io-inst.lo ios.lo \
-istream-inst.lo limits.lo locale-inst.lo locale.lo localename.lo \
-messages.lo misc-inst.lo monetary.lo numeric.lo ostream-inst.lo \
+libstdc___la_OBJECTS = bitset.lo codecvt.lo complex_io.lo \
+concept-inst.lo ctype.lo ext-inst.lo fstream.lo fstream-inst.lo \
+functexcept.lo globals.lo io-inst.lo ios.lo istream-inst.lo limits.lo \
+locale.lo locale-inst.lo localename.lo misc-inst.lo ostream-inst.lo \
sstream-inst.lo stdexcept.lo stl-inst.lo streambuf-inst.lo \
-string-inst.lo strstream.lo time.lo valarray-inst.lo vterminate.lo \
-wstring-inst.lo
+string-inst.lo strstream.lo valarray-inst.lo vterminate.lo \
+wstring-inst.lo codecvt_members.lo collate_members.lo ctype_members.lo \
+messages_members.lo monetary_members.lo numeric_members.lo \
+time_members.lo basic_file.lo c++locale.lo
CXXFLAGS = @CXXFLAGS@
CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
diff --git a/libstdc++-v3/src/bitset.cc b/libstdc++-v3/src/bitset.cc
index 2d313a72081..4849a6a5ceb 100644
--- a/libstdc++-v3/src/bitset.cc
+++ b/libstdc++-v3/src/bitset.cc
@@ -2,22 +2,21 @@
// Copyright (C) 2001, 2002 Free Software Foundation
//
-// 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)
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
// any later version.
-//
-// GNU CC is distributed in the hope that it will be useful,
+
+// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with GNU CC; see the file COPYING. If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
diff --git a/libstdc++-v3/src/codecvt.cc b/libstdc++-v3/src/codecvt.cc
index 032667e3f13..b9575cf70bc 100644
--- a/libstdc++-v3/src/codecvt.cc
+++ b/libstdc++-v3/src/codecvt.cc
@@ -31,6 +31,13 @@
namespace std
{
+ // Definitions for locale::id of standard facets that are specialized.
+ locale::id codecvt<char, char, mbstate_t>::id;
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ locale::id codecvt<wchar_t, char, mbstate_t>::id;
+#endif
+
#ifdef _GLIBCPP_USE___ENC_TRAITS
// Definitions for static const data members of __enc_traits.
const int __enc_traits::_S_max_size;
@@ -39,10 +46,16 @@ namespace std
codecvt<char, char, mbstate_t>::
codecvt(size_t __refs)
: __codecvt_abstract_base<char, char, mbstate_t>(__refs)
- { }
+ { _M_c_locale_codecvt = _S_c_locale; }
+
+ codecvt<char, char, mbstate_t>::
+ codecvt(__c_locale __cloc, size_t __refs)
+ : __codecvt_abstract_base<char, char, mbstate_t>(__refs)
+ { _M_c_locale_codecvt = _S_clone_c_locale(__cloc); }
codecvt<char, char, mbstate_t>::
- ~codecvt() { }
+ ~codecvt()
+ { _S_destroy_c_locale(_M_c_locale_codecvt); }
codecvt_base::result
codecvt<char, char, mbstate_t>::
@@ -106,39 +119,17 @@ namespace std
// codecvt<wchar_t, char, mbstate_t> required specialization
codecvt<wchar_t, char, mbstate_t>::
codecvt(size_t __refs)
- : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs) { }
+ : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs)
+ { _M_c_locale_codecvt = _S_c_locale; }
codecvt<wchar_t, char, mbstate_t>::
- ~codecvt() { }
-
- codecvt_base::result
- codecvt<wchar_t, char, mbstate_t>::
- do_out(state_type& __state, const intern_type* __from,
- const intern_type* __from_end, const intern_type*& __from_next,
- extern_type* __to, extern_type* __to_end,
- extern_type*& __to_next) const
- {
- result __ret = error;
- size_t __len = min(__from_end - __from, __to_end - __to);
- size_t __conv = wcsrtombs(__to, &__from, __len, &__state);
+ codecvt(__c_locale __cloc, size_t __refs)
+ : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs)
+ { _M_c_locale_codecvt = _S_clone_c_locale(__cloc); }
- if (__conv == __len)
- {
- __from_next = __from;
- __to_next = __to + __conv;
- __ret = ok;
- }
- else if (__conv > 0 && __conv < __len)
- {
- __from_next = __from;
- __to_next = __to + __conv;
- __ret = partial;
- }
- else
- __ret = error;
-
- return __ret;
- }
+ codecvt<wchar_t, char, mbstate_t>::
+ ~codecvt()
+ { _S_destroy_c_locale(_M_c_locale_codecvt); }
codecvt_base::result
codecvt<wchar_t, char, mbstate_t>::
@@ -149,35 +140,6 @@ namespace std
return noconv;
}
- codecvt_base::result
- codecvt<wchar_t, char, mbstate_t>::
- do_in(state_type& __state, const extern_type* __from,
- const extern_type* __from_end, const extern_type*& __from_next,
- intern_type* __to, intern_type* __to_end,
- intern_type*& __to_next) const
- {
- result __ret = error;
- size_t __len = min(__from_end - __from, __to_end - __to);
- size_t __conv = mbsrtowcs(__to, &__from, __len, &__state);
-
- if (__conv == __len)
- {
- __from_next = __from;
- __to_next = __to + __conv;
- __ret = ok;
- }
- else if (__conv > 0 && __conv < __len)
- {
- __from_next = __from;
- __to_next = __to + __conv;
- __ret = partial;
- }
- else
- __ret = error;
-
- return __ret;
- }
-
int
codecvt<wchar_t, char, mbstate_t>::
do_encoding() const throw()
diff --git a/libstdc++-v3/src/concept-inst.cc b/libstdc++-v3/src/concept-inst.cc
index 01cc030da8d..d0129e5f940 100644
--- a/libstdc++-v3/src/concept-inst.cc
+++ b/libstdc++-v3/src/concept-inst.cc
@@ -2,22 +2,21 @@
// Copyright (C) 2001, 2002 Free Software Foundation
//
-// 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)
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
// any later version.
-//
-// GNU CC is distributed in the hope that it will be useful,
+
+// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with GNU CC; see the file COPYING. If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
diff --git a/libstdc++-v3/src/ctype.cc b/libstdc++-v3/src/ctype.cc
new file mode 100644
index 00000000000..3d5ee618c53
--- /dev/null
+++ b/libstdc++-v3/src/ctype.cc
@@ -0,0 +1,148 @@
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file 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.
+
+#include <locale>
+
+namespace std
+{
+ // XXX At some point, just rename this file to ctype_members_char.cc
+ // and compile it as a separate file instead of including it here.
+ // Platform-specific initialization code for ctype tables.
+ #include <bits/ctype_noninline.h>
+
+ // Definitions for locale::id of standard facets that are specialized.
+ locale::id ctype<char>::id;
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ locale::id ctype<wchar_t>::id;
+#endif
+
+ template<>
+ const ctype<char>&
+ use_facet<ctype<char> >(const locale& __loc)
+ {
+ size_t __i = ctype<char>::id._M_id();
+ const locale::_Impl* __tmp = __loc._M_impl;
+ return static_cast<const ctype<char>&>(*(__tmp->_M_facets[__i]));
+ }
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ template<>
+ const ctype<wchar_t>&
+ use_facet<ctype<wchar_t> >(const locale& __loc)
+ {
+ size_t __i = ctype<wchar_t>::id._M_id();
+ const locale::_Impl* __tmp = __loc._M_impl;
+ return static_cast<const ctype<wchar_t>&>(*(__tmp->_M_facets[__i]));
+ }
+#endif
+
+ // Definitions for static const data members of ctype_base.
+ const ctype_base::mask ctype_base::space;
+ const ctype_base::mask ctype_base::print;
+ const ctype_base::mask ctype_base::cntrl;
+ const ctype_base::mask ctype_base::upper;
+ const ctype_base::mask ctype_base::lower;
+ const ctype_base::mask ctype_base::alpha;
+ const ctype_base::mask ctype_base::digit;
+ const ctype_base::mask ctype_base::punct;
+ const ctype_base::mask ctype_base::xdigit;
+ const ctype_base::mask ctype_base::alnum;
+ const ctype_base::mask ctype_base::graph;
+
+ const size_t ctype<char>::table_size;
+
+ ctype<char>::~ctype()
+ {
+ _S_destroy_c_locale(_M_c_locale_ctype);
+ if (_M_del)
+ delete[] this->table();
+ }
+
+ // These are dummy placeholders as these virtual functions are never called.
+ bool
+ ctype<char>::do_is(mask, char_type) const
+ { return false; }
+
+ const char*
+ ctype<char>::do_is(const char_type* __c, const char_type*, mask*) const
+ { return __c; }
+
+ const char*
+ ctype<char>::do_scan_is(mask, const char_type* __c, const char_type*) const
+ { return __c; }
+
+ const char*
+ ctype<char>::do_scan_not(mask, const char_type* __c, const char_type*) const
+ { return __c; }
+
+ char
+ ctype<char>::do_widen(char __c) const
+ { return __c; }
+
+ const char*
+ ctype<char>::do_widen(const char* __lo, const char* __hi, char* __dest) const
+ {
+ memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+
+ char
+ ctype<char>::do_narrow(char __c, char /*__dfault*/) const
+ { return __c; }
+
+ const char*
+ ctype<char>::do_narrow(const char* __lo, const char* __hi,
+ char /*__dfault*/, char* __dest) const
+ {
+ memcpy(__dest, __lo, __hi - __lo);
+ return __hi;
+ }
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ ctype<wchar_t>::ctype(size_t __refs)
+ : __ctype_abstract_base<wchar_t>(__refs)
+ { _M_c_locale_ctype = _S_c_locale; }
+
+ ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs)
+ : __ctype_abstract_base<wchar_t>(__refs)
+ { _M_c_locale_ctype = _S_clone_c_locale(__cloc); }
+
+ ctype<wchar_t>::~ctype()
+ { _S_destroy_c_locale(_M_c_locale_ctype); }
+
+ template<>
+ ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs)
+ : ctype<wchar_t>(__refs)
+ {
+ _S_destroy_c_locale(_M_c_locale_ctype);
+ _S_create_c_locale(_M_c_locale_ctype, __s);
+ }
+#endif
+} // namespace std
+
diff --git a/libstdc++-v3/src/globals.cc b/libstdc++-v3/src/globals.cc
index 36d193fb406..d85bf3a6369 100644
--- a/libstdc++-v3/src/globals.cc
+++ b/libstdc++-v3/src/globals.cc
@@ -44,163 +44,206 @@
// Because <iostream> declares the standard streams to be [io]stream
// types instead of say [io]fstream types, it is also necessary to
// allocate the actual file buffers in this file.
-namespace std
+namespace __gnu_cxx
{
- // Standard "C" locale.
- typedef char fake_locale[sizeof(locale)]
- __attribute__ ((aligned(__alignof__(locale))));
- fake_locale c_locale;
+ using namespace std;
+
+ typedef char fake_facet_name[sizeof(char*)]
+ __attribute__ ((aligned(__alignof__(char*))));
+ fake_facet_name facet_name[6 + _GLIBCPP_NUM_CATEGORIES];
typedef char fake_locale_Impl[sizeof(locale::_Impl)]
__attribute__ ((aligned(__alignof__(locale::_Impl))));
fake_locale_Impl c_locale_impl;
-
+
+
+ // NB: The asm directives renames these non-exported, namespace
+ // __gnu_cxx symbols into the mistakenly exported, namespace std
+ // symbols in GLIBCPP_3.2.
+ // The rename syntax is
+ // asm (".symver currentname,oldname@@GLIBCPP_3.2")
+ // At the same time, these new __gnu_cxx symbols are not exported.
+ // In the future, GLIBCXX_ABI > 5 should remove all uses of
+ // _GLIBCPP_ASM_SYMVER in this file.
+ typedef char fake_locale[sizeof(locale)]
+ __attribute__ ((aligned(__alignof__(locale))));
+ fake_locale c_locale;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx8c_localeE, _ZSt8c_locale, GLIBCPP_3.2)
+
+ // GLIBCXX_ABI > 5 will not need this symbol at all.
+ // It's here just as a placeholder, as the size of this exported
+ // object changed. The new symbol is not exported.
+ const int o = sizeof(locale::_Impl) - sizeof(char*[_GLIBCPP_NUM_CATEGORIES]);
+ typedef char fake_locale_Impl_compat[o]
+ __attribute__ ((aligned(__alignof__(o))));
+ fake_locale_Impl_compat c_locale_impl_compat;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx20c_locale_impl_compatE, _ZSt13c_locale_impl, GLIBCPP_3.2)
+
typedef char fake_facet_vec[sizeof(locale::facet*)]
__attribute__ ((aligned(__alignof__(locale::facet*))));
fake_facet_vec facet_vec[_GLIBCPP_NUM_FACETS];
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9facet_vecE, _ZSt9facet_vec, GLIBCPP_3.2)
typedef char fake_ctype_c[sizeof(std::ctype<char>)]
__attribute__ ((aligned(__alignof__(std::ctype<char>))));
fake_ctype_c ctype_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx7ctype_cE, _ZSt7ctype_c, GLIBCPP_3.2)
typedef char fake_collate_c[sizeof(std::collate<char>)]
__attribute__ ((aligned(__alignof__(std::collate<char>))));
fake_collate_c collate_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9collate_cE, _ZSt9collate_c, GLIBCPP_3.2)
typedef char fake_numpunct_c[sizeof(numpunct<char>)]
__attribute__ ((aligned(__alignof__(numpunct<char>))));
fake_numpunct_c numpunct_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10numpunct_cE, _ZSt10numpunct_c, GLIBCPP_3.2)
typedef char fake_num_get_c[sizeof(num_get<char>)]
__attribute__ ((aligned(__alignof__(num_get<char>))));
fake_num_get_c num_get_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9num_get_cE, _ZSt9num_get_c, GLIBCPP_3.2)
typedef char fake_num_put_c[sizeof(num_put<char>)]
__attribute__ ((aligned(__alignof__(num_put<char>))));
fake_num_put_c num_put_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9num_put_cE, _ZSt9num_put_c, GLIBCPP_3.2)
typedef char fake_codecvt_c[sizeof(codecvt<char, char, mbstate_t>)]
__attribute__ ((aligned(__alignof__(codecvt<char, char, mbstate_t>))));
fake_codecvt_c codecvt_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9codecvt_cE, _ZSt9codecvt_c, GLIBCPP_3.2)
typedef char fake_moneypunct_c[sizeof(moneypunct<char, true>)]
__attribute__ ((aligned(__alignof__(moneypunct<char, true>))));
fake_moneypunct_c moneypunct_tc;
fake_moneypunct_c moneypunct_fc;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx13moneypunct_tcE,\
+ _ZSt13moneypunct_tc, GLIBCPP_3.2)
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx13moneypunct_fcE,\
+ _ZSt13moneypunct_fc, GLIBCPP_3.2)
typedef char fake_money_get_c[sizeof(money_get<char>)]
__attribute__ ((aligned(__alignof__(money_get<char>))));
fake_money_get_c money_get_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx11money_get_cE, _ZSt11money_get_c, GLIBCPP_3.2)
typedef char fake_money_put_c[sizeof(money_put<char>)]
__attribute__ ((aligned(__alignof__(money_put<char>))));
fake_money_put_c money_put_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx11money_put_cE, _ZSt11money_put_c, GLIBCPP_3.2)
typedef char fake_timepunct_c[sizeof(__timepunct<char>)]
__attribute__ ((aligned(__alignof__(__timepunct<char>))));
fake_timepunct_c timepunct_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx11timepunct_cE, _ZSt11timepunct_c, GLIBCPP_3.2)
typedef char fake_time_get_c[sizeof(time_get<char>)]
__attribute__ ((aligned(__alignof__(time_get<char>))));
fake_time_get_c time_get_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10time_get_cE, _ZSt10time_get_c, GLIBCPP_3.2)
typedef char fake_time_put_c[sizeof(time_put<char>)]
__attribute__ ((aligned(__alignof__(time_put<char>))));
fake_time_put_c time_put_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10time_put_cE, _ZSt10time_put_c, GLIBCPP_3.2)
typedef char fake_messages_c[sizeof(messages<char>)]
__attribute__ ((aligned(__alignof__(messages<char>))));
fake_messages_c messages_c;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10messages_cE, _ZSt10messages_c, GLIBCPP_3.2)
#ifdef _GLIBCPP_USE_WCHAR_T
typedef char fake_wtype_w[sizeof(std::ctype<wchar_t>)]
__attribute__ ((aligned(__alignof__(std::ctype<wchar_t>))));
fake_wtype_w ctype_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx7ctype_wE, _ZSt7ctype_w, GLIBCPP_3.2)
typedef char fake_wollate_w[sizeof(std::collate<wchar_t>)]
__attribute__ ((aligned(__alignof__(std::collate<wchar_t>))));
fake_wollate_w collate_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9collate_wE, _ZSt9collate_w, GLIBCPP_3.2)
typedef char fake_numpunct_w[sizeof(numpunct<wchar_t>)]
__attribute__ ((aligned(__alignof__(numpunct<wchar_t>))));
fake_numpunct_w numpunct_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10numpunct_wE, _ZSt10numpunct_w, GLIBCPP_3.2)
typedef char fake_num_get_w[sizeof(num_get<wchar_t>)]
__attribute__ ((aligned(__alignof__(num_get<wchar_t>))));
fake_num_get_w num_get_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9num_get_wE, _ZSt9num_get_w, GLIBCPP_3.2)
typedef char fake_num_put_w[sizeof(num_put<wchar_t>)]
__attribute__ ((aligned(__alignof__(num_put<wchar_t>))));
fake_num_put_w num_put_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9num_put_wE, _ZSt9num_put_w, GLIBCPP_3.2)
typedef char fake_wodecvt_w[sizeof(codecvt<wchar_t, char, mbstate_t>)]
__attribute__ ((aligned(__alignof__(codecvt<wchar_t, char, mbstate_t>))));
fake_wodecvt_w codecvt_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9codecvt_wE, _ZSt9codecvt_w, GLIBCPP_3.2)
typedef char fake_moneypunct_w[sizeof(moneypunct<wchar_t, true>)]
__attribute__ ((aligned(__alignof__(moneypunct<wchar_t, true>))));
fake_moneypunct_w moneypunct_tw;
fake_moneypunct_w moneypunct_fw;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx13moneypunct_twE,\
+ _ZSt13moneypunct_tw, GLIBCPP_3.2)
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx13moneypunct_fwE,\
+ _ZSt13moneypunct_fw, GLIBCPP_3.2)
typedef char fake_money_get_w[sizeof(money_get<wchar_t>)]
__attribute__ ((aligned(__alignof__(money_get<wchar_t>))));
fake_money_get_w money_get_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx11money_get_wE, _ZSt11money_get_w, GLIBCPP_3.2)
typedef char fake_money_put_w[sizeof(money_put<wchar_t>)]
__attribute__ ((aligned(__alignof__(money_put<wchar_t>))));
fake_money_put_w money_put_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx11money_put_wE, _ZSt11money_put_w, GLIBCPP_3.2)
typedef char fake_timepunct_w[sizeof(__timepunct<wchar_t>)]
__attribute__ ((aligned(__alignof__(__timepunct<wchar_t>))));
fake_timepunct_w timepunct_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx11timepunct_wE, _ZSt11timepunct_w, GLIBCPP_3.2)
typedef char fake_time_get_w[sizeof(time_get<wchar_t>)]
__attribute__ ((aligned(__alignof__(time_get<wchar_t>))));
fake_time_get_w time_get_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10time_get_wE, _ZSt10time_get_w, GLIBCPP_3.2)
typedef char fake_time_put_w[sizeof(time_put<wchar_t>)]
__attribute__ ((aligned(__alignof__(time_put<wchar_t>))));
fake_time_put_w time_put_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10time_put_wE, _ZSt10time_put_w, GLIBCPP_3.2)
typedef char fake_messages_w[sizeof(messages<wchar_t>)]
__attribute__ ((aligned(__alignof__(messages<wchar_t>))));
fake_messages_w messages_w;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx10messages_wE, _ZSt10messages_w, GLIBCPP_3.2)
#endif
- // Standard stream objects.
- typedef char fake_istream[sizeof(istream)]
- __attribute__ ((aligned(__alignof__(istream))));
- typedef char fake_ostream[sizeof(ostream)]
- __attribute__ ((aligned(__alignof__(ostream))));
- fake_istream cin;
- fake_ostream cout;
- fake_ostream cerr;
- fake_ostream clog;
-
- typedef char fake_filebuf[sizeof(__gnu_cxx::stdio_filebuf<char>)]
- __attribute__ ((aligned(__alignof__(__gnu_cxx::stdio_filebuf<char>))));
+ typedef char fake_filebuf[sizeof(stdio_filebuf<char>)]
+ __attribute__ ((aligned(__alignof__(stdio_filebuf<char>))));
fake_filebuf buf_cout;
fake_filebuf buf_cin;
fake_filebuf buf_cerr;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx8buf_coutE, _ZSt8buf_cout, GLIBCPP_3.2)
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx7buf_cinE, _ZSt7buf_cin, GLIBCPP_3.2)
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx8buf_cerrE, _ZSt8buf_cerr, GLIBCPP_3.2)
#ifdef _GLIBCPP_USE_WCHAR_T
- typedef char fake_wistream[sizeof(wistream)]
- __attribute__ ((aligned(__alignof__(wistream))));
- typedef char fake_wostream[sizeof(wostream)]
- __attribute__ ((aligned(__alignof__(wostream))));
- fake_wistream wcin;
- fake_wostream wcout;
- fake_wostream wcerr;
- fake_wostream wclog;
-
- typedef char fake_wfilebuf[sizeof(__gnu_cxx::stdio_filebuf<wchar_t>)]
- __attribute__ ((aligned(__alignof__(__gnu_cxx::stdio_filebuf<wchar_t>))));
+ typedef char fake_wfilebuf[sizeof(stdio_filebuf<wchar_t>)]
+ __attribute__ ((aligned(__alignof__(stdio_filebuf<wchar_t>))));
fake_wfilebuf buf_wcout;
fake_wfilebuf buf_wcin;
fake_wfilebuf buf_wcerr;
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9buf_wcoutE, _ZSt9buf_wcout, GLIBCPP_3.2)
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx8buf_wcinE, _ZSt8buf_wcin, GLIBCPP_3.2)
+ _GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9buf_wcerrE, _ZSt9buf_wcerr, GLIBCPP_3.2)
#endif
-
// Globals for once-only runtime initialization of mutex objects. This
// allows static initialization of these objects on systems that need a
// function call to initialize a mutex. For example, see stl_threads.h.
@@ -223,4 +266,28 @@ namespace std
_GLIBCPP_mutex_address_init ()
{ __GTHREAD_MUTEX_INIT_FUNCTION (_GLIBCPP_mutex_address); }
#endif
-}
+} // namespace __gnu_cxx
+
+namespace std
+{
+ // Standard stream objects.
+ typedef char fake_istream[sizeof(istream)]
+ __attribute__ ((aligned(__alignof__(istream))));
+ typedef char fake_ostream[sizeof(ostream)]
+ __attribute__ ((aligned(__alignof__(ostream))));
+ fake_istream cin;
+ fake_ostream cout;
+ fake_ostream cerr;
+ fake_ostream clog;
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ typedef char fake_wistream[sizeof(wistream)]
+ __attribute__ ((aligned(__alignof__(wistream))));
+ typedef char fake_wostream[sizeof(wostream)]
+ __attribute__ ((aligned(__alignof__(wostream))));
+ fake_wistream wcin;
+ fake_wostream wcout;
+ fake_wostream wcerr;
+ fake_wostream wclog;
+#endif
+} // namespace std
diff --git a/libstdc++-v3/src/ios.cc b/libstdc++-v3/src/ios.cc
index c1167f8c15c..7bfdc5b4bb4 100644
--- a/libstdc++-v3/src/ios.cc
+++ b/libstdc++-v3/src/ios.cc
@@ -39,28 +39,34 @@
#include <bits/atomicity.h>
#include <ext/stdio_filebuf.h>
-namespace std
+namespace __gnu_cxx
{
// Extern declarations for global objects in src/globals.cc.
+ extern stdio_filebuf<char> buf_cout;
+ extern stdio_filebuf<char> buf_cin;
+ extern stdio_filebuf<char> buf_cerr;
+
+#ifdef _GLIBCPP_USE_WCHAR_T
+ extern stdio_filebuf<wchar_t> buf_wcout;
+ extern stdio_filebuf<wchar_t> buf_wcin;
+ extern stdio_filebuf<wchar_t> buf_wcerr;
+#endif
+} // namespace __gnu_cxx
+
+namespace std
+{
+ using namespace __gnu_cxx;
+
extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;
- using __gnu_cxx::stdio_filebuf;
- extern stdio_filebuf<char> buf_cout;
- extern stdio_filebuf<char> buf_cin;
- extern stdio_filebuf<char> buf_cerr;
-
#ifdef _GLIBCPP_USE_WCHAR_T
extern wistream wcin;
extern wostream wcout;
extern wostream wcerr;
extern wostream wclog;
-
- extern stdio_filebuf<wchar_t> buf_wcout;
- extern stdio_filebuf<wchar_t> buf_wcin;
- extern stdio_filebuf<wchar_t> buf_wcerr;
#endif
// Definitions for static const data members of __ios_flags.
diff --git a/libstdc++-v3/src/locale-inst.cc b/libstdc++-v3/src/locale-inst.cc
index 5e6c6751bc4..8f2c8638177 100644
--- a/libstdc++-v3/src/locale-inst.cc
+++ b/libstdc++-v3/src/locale-inst.cc
@@ -35,11 +35,7 @@
#include <clocale>
#include <cstring>
#include <cassert>
-#include <limits>
-#include <exception>
#include <locale>
-#include <istream>
-#include <ostream>
namespace std
{
diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc
index 3cb9d1b4cbf..127197d0138 100644
--- a/libstdc++-v3/src/locale.cc
+++ b/libstdc++-v3/src/locale.cc
@@ -31,19 +31,19 @@
#include <cassert>
#include <cctype>
#include <cwctype> // For towupper, etc.
-#include <limits>
-#include <exception>
#include <locale>
-#include <istream>
-#include <ostream>
#include <bits/atomicity.h>
-namespace std
+namespace __gnu_cxx
{
// Defined in globals.cc.
- extern locale c_locale;
- extern locale::_Impl c_locale_impl;
- extern locale::facet** facet_vec;
+ extern std::locale c_locale;
+ extern std::locale::_Impl c_locale_impl;
+} // namespace __gnu_cxx
+
+namespace std
+{
+ using namespace __gnu_cxx;
// Definitions for static const data members of locale.
const locale::category locale::none;
@@ -55,18 +55,14 @@ namespace std
const locale::category locale::messages;
const locale::category locale::all;
+ // In the future, GLIBCXX_ABI > 5 should remove all uses of
+ // _GLIBCPP_ASM_SYMVER in this file, and remove exports of any
+ // static data members of locale.
locale::_Impl* locale::_S_classic;
locale::_Impl* locale::_S_global;
- const size_t locale::_S_num_categories;
-
- // Definitions for locale::id of standard facets that are specialized.
- locale::id ctype<char>::id;
- locale::id codecvt<char, char, mbstate_t>::id;
-
-#ifdef _GLIBCPP_USE_WCHAR_T
- locale::id ctype<wchar_t>::id;
- locale::id codecvt<wchar_t, char, mbstate_t>::id;
-#endif
+ const size_t locale::_S_categories_size;
+ _GLIBCPP_ASM_SYMVER(_ZNSt6locale18_S_categories_sizeE, _ZNSt6locale17_S_num_categoriesE, GLIBCPP_3.2)
+ const size_t locale::_S_extra_categories_size;
// Definitions for static const data members of locale::id
_Atomic_word locale::id::_S_highwater; // init'd to 0 by linker
@@ -155,31 +151,12 @@ namespace std
locale::_Impl::_S_id_ctype,
locale::_Impl::_S_id_numeric,
locale::_Impl::_S_id_collate,
- locale::_Impl::_S_id_monetary,
locale::_Impl::_S_id_time,
+ locale::_Impl::_S_id_monetary,
locale::_Impl::_S_id_messages,
0
};
- locale::~locale() throw()
- { _M_impl->_M_remove_reference(); }
-
- void
- locale::_M_coalesce(const locale& __base, const locale& __add,
- category __cat)
- {
- __cat = _S_normalize_category(__cat);
- _M_impl = new _Impl(*__base._M_impl, 1);
-
- try
- { _M_impl->_M_replace_categories(__add._M_impl, __cat); }
- catch (...)
- {
- _M_impl->_M_remove_reference();
- __throw_exception_again;
- }
- }
-
locale::locale() throw()
{
_S_initialize();
@@ -191,6 +168,7 @@ namespace std
// This is used to initialize global and classic locales, and
// assumes that the _Impl objects are constructed correctly.
+ // The lack of a reference increment is intentional.
locale::locale(_Impl* __ip) throw() : _M_impl(__ip)
{ }
@@ -201,10 +179,110 @@ namespace std
_S_initialize();
if (strcmp(__s, "C") == 0 || strcmp(__s, "POSIX") == 0)
(_M_impl = _S_classic)->_M_add_reference();
- else if (strcmp(__s, "") == 0)
- _M_impl = new _Impl(setlocale(LC_ALL, NULL), 1);
- else
+ else if (strcmp(__s, "") != 0)
_M_impl = new _Impl(__s, 1);
+ else
+ {
+ // Get it from the environment.
+ char* __env = getenv("LC_ALL");
+ // If LC_ALL is set we are done.
+ if (__env && strcmp(__env, "") != 0)
+ {
+ if (strcmp(__env, "C") == 0 || strcmp(__env, "POSIX") == 0)
+ (_M_impl = _S_classic)->_M_add_reference();
+ else
+ _M_impl = new _Impl(__env, 1);
+ }
+ else
+ {
+ char* __res;
+ // LANG may set a default different from "C".
+ char* __env = getenv("LANG");
+ if (!__env || strcmp(__env, "") == 0 || strcmp(__env, "C") == 0
+ || strcmp(__env, "POSIX") == 0)
+ __res = strdup("C");
+ else
+ __res = strdup(__env);
+
+ // Scan the categories looking for the first one
+ // different from LANG.
+ size_t __i = 0;
+ if (strcmp(__res, "C") == 0)
+ for (__i = 0;
+ __i < _S_categories_size + _S_extra_categories_size;
+ ++__i)
+ {
+ __env = getenv(_S_categories[__i]);
+ if (__env && strcmp(__env, "") != 0
+ && strcmp(__env, "C") != 0
+ && strcmp(__env, "POSIX") != 0)
+ break;
+ }
+ else
+ for (__i = 0;
+ __i < _S_categories_size + _S_extra_categories_size;
+ ++__i)
+ {
+ __env = getenv(_S_categories[__i]);
+ if (__env && strcmp(__env, "") != 0
+ && strcmp(__env, __res) != 0)
+ break;
+ }
+
+ // If one is found, build the complete string of
+ // the form LC_CTYPE=xxx;LC_NUMERIC=yyy; and so on...
+ if (__i < _S_categories_size + _S_extra_categories_size)
+ {
+ string __str;
+ for (size_t __j = 0; __j < __i; ++__j)
+ {
+ __str += _S_categories[__j];
+ __str += "=";
+ __str += __res;
+ __str += ";";
+ }
+ __str += _S_categories[__i];
+ __str += "=";
+ __str += __env;
+ __str += ";";
+ __i++;
+ for (; __i < _S_categories_size
+ + _S_extra_categories_size; ++__i)
+ {
+ __env = getenv(_S_categories[__i]);
+ if (!__env || strcmp(__env, "") == 0)
+ {
+ __str += _S_categories[__i];
+ __str += '=';
+ __str += __res;
+ __str += ';';
+ }
+ else if (strcmp(__env, "C") == 0
+ || strcmp(__env, "POSIX") == 0)
+ {
+ __str += _S_categories[__i];
+ __str += "=C;";
+ }
+ else
+ {
+ __str += _S_categories[__i];
+ __str += "=";
+ __str += __env;
+ __str += ";";
+ }
+ }
+ __str.erase(__str.end() - 1);
+ _M_impl = new _Impl(__str.c_str(), 1);
+ }
+ // ... otherwise either an additional instance of
+ // the "C" locale or LANG.
+ else if (strcmp(__res, "C") == 0)
+ (_M_impl = _S_classic)->_M_add_reference();
+ else
+ _M_impl = new _Impl(__res, 1);
+ free(__res);
+ }
+ }
}
else
__throw_runtime_error("attempt to create locale from NULL name");
@@ -222,6 +300,9 @@ namespace std
locale::locale(const locale& __base, const locale& __add, category __cat)
{ _M_coalesce(__base, __add, __cat); }
+ locale::~locale() throw()
+ { _M_impl->_M_remove_reference(); }
+
bool
locale::operator==(const locale& __rhs) const throw()
{
@@ -262,20 +343,22 @@ namespace std
string
locale::name() const
{
- // Need some kind of separator character. This one was pretty much
- // arbitrarily chosen as to not conflict with glibc locales: the
- // exact formatting is not set in stone.
- const char __separator = '|';
-
string __ret;
if (_M_impl->_M_check_same_name())
__ret = _M_impl->_M_names[0];
else
{
- for (size_t i = 0; i < _S_num_categories; ++i)
+ __ret += _S_categories[0];
+ __ret += "=";
+ __ret += _M_impl->_M_names[0];
+ for (size_t __i = 1;
+ __i < _S_categories_size + _S_extra_categories_size;
+ ++__i)
{
- __ret += __separator;
- __ret += _M_impl->_M_names[i];
+ __ret += ";";
+ __ret += _S_categories[__i];
+ __ret += "=";
+ __ret += _M_impl->_M_names[__i];
}
}
return __ret;
@@ -292,12 +375,8 @@ namespace std
try
{
// 26 Standard facets, 2 references.
- // One reference for _M_classic, one for _M_global
- facet** f = new(&facet_vec) facet*[_GLIBCPP_NUM_FACETS];
- for (size_t __i = 0; __i < _GLIBCPP_NUM_FACETS; ++__i)
- f[__i] = 0;
-
- _S_classic = new (&c_locale_impl) _Impl(f, 2, true);
+ // One reference for _S_classic, one for _S_global
+ _S_classic = new (&c_locale_impl) _Impl(0, 2, true);
_S_global = _S_classic;
new (&c_locale) locale(_S_classic);
}
@@ -314,6 +393,22 @@ namespace std
return c_locale;
}
+ void
+ locale::_M_coalesce(const locale& __base, const locale& __add,
+ category __cat)
+ {
+ __cat = _S_normalize_category(__cat);
+ _M_impl = new _Impl(*__base._M_impl, 1);
+
+ try
+ { _M_impl->_M_replace_categories(__add._M_impl, __cat); }
+ catch (...)
+ {
+ _M_impl->_M_remove_reference();
+ __throw_exception_again;
+ }
+ }
+
locale::category
locale::_S_normalize_category(category __cat)
{
@@ -362,11 +457,8 @@ namespace std
~facet() { }
locale::facet::
- facet(size_t __refs) throw() : _M_references(__refs)
- {
- if (!_S_c_locale)
- _S_create_c_locale(_S_c_locale, "C");
- }
+ facet(size_t __refs) throw() : _M_references(__refs ? 1 : 0)
+ { }
void
locale::facet::
@@ -377,7 +469,7 @@ namespace std
locale::facet::
_M_remove_reference() throw()
{
- if (__exchange_and_add(&_M_references, -1) == 0)
+ if (__exchange_and_add(&_M_references, -1) == 1)
{
try
{ delete this; }
@@ -389,97 +481,6 @@ namespace std
locale::id::id()
{ }
- // Definitions for static const data members of ctype_base.
- const ctype_base::mask ctype_base::space;
- const ctype_base::mask ctype_base::print;
- const ctype_base::mask ctype_base::cntrl;
- const ctype_base::mask ctype_base::upper;
- const ctype_base::mask ctype_base::lower;
- const ctype_base::mask ctype_base::alpha;
- const ctype_base::mask ctype_base::digit;
- const ctype_base::mask ctype_base::punct;
- const ctype_base::mask ctype_base::xdigit;
- const ctype_base::mask ctype_base::alnum;
- const ctype_base::mask ctype_base::graph;
-
- // Platform-specific initialization code for ctype tables.
- #include <bits/ctype_noninline.h>
-
- const size_t ctype<char>::table_size;
-
- ctype<char>::~ctype()
- {
- if (_M_c_locale_ctype != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_ctype);
- if (_M_del)
- delete[] this->table();
- }
-
- // These are dummy placeholders as these virtual functions are never called.
- bool
- ctype<char>::do_is(mask, char_type) const
- { return false; }
-
- const char*
- ctype<char>::do_is(const char_type* __c, const char_type*, mask*) const
- { return __c; }
-
- const char*
- ctype<char>::do_scan_is(mask, const char_type* __c, const char_type*) const
- { return __c; }
-
- const char*
- ctype<char>::do_scan_not(mask, const char_type* __c, const char_type*) const
- { return __c; }
-
- char
- ctype<char>::do_widen(char __c) const
- { return __c; }
-
- const char*
- ctype<char>::do_widen(const char* __lo, const char* __hi, char* __dest) const
- {
- memcpy(__dest, __lo, __hi - __lo);
- return __hi;
- }
-
- char
- ctype<char>::do_narrow(char __c, char /*__dfault*/) const
- { return __c; }
-
- const char*
- ctype<char>::do_narrow(const char* __lo, const char* __hi,
- char /*__dfault*/, char* __dest) const
- {
- memcpy(__dest, __lo, __hi - __lo);
- return __hi;
- }
-
-#ifdef _GLIBCPP_USE_WCHAR_T
- ctype<wchar_t>::ctype(size_t __refs)
- : __ctype_abstract_base<wchar_t>(__refs)
- { _M_c_locale_ctype = _S_c_locale; }
-
- ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs)
- : __ctype_abstract_base<wchar_t>(__refs)
- { _M_c_locale_ctype = _S_clone_c_locale(__cloc); }
-
- ctype<wchar_t>::~ctype()
- {
- if (_M_c_locale_ctype != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_ctype);
- }
-
- template<>
- ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs)
- : ctype<wchar_t>(__refs)
- {
- if (_M_c_locale_ctype != _S_c_locale)
- _S_destroy_c_locale(_M_c_locale_ctype);
- _S_create_c_locale(_M_c_locale_ctype, __s);
- }
-#endif
-
// Definitions for static const data members of time_base
template<>
const char*
@@ -503,26 +504,6 @@ namespace std
const money_base::pattern
money_base::_S_default_pattern = { {symbol, sign, none, value} };
- template<>
- const ctype<char>&
- use_facet<ctype<char> >(const locale& __loc)
- {
- size_t __i = ctype<char>::id._M_id();
- const locale::_Impl* __tmp = __loc._M_impl;
- return static_cast<const ctype<char>&>(*(__tmp->_M_facets[__i]));
- }
-
-#ifdef _GLIBCPP_USE_WCHAR_T
- template<>
- const ctype<wchar_t>&
- use_facet<ctype<wchar_t> >(const locale& __loc)
- {
- size_t __i = ctype<wchar_t>::id._M_id();
- const locale::_Impl* __tmp = __loc._M_impl;
- return static_cast<const ctype<wchar_t>&>(*(__tmp->_M_facets[__i]));
- }
-#endif
-
const char __num_base::_S_atoms[] = "0123456789eEabcdfABCDF";
bool
diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc
index 8fa91189170..0a2c5210215 100644
--- a/libstdc++-v3/src/localename.cc
+++ b/libstdc++-v3/src/localename.cc
@@ -30,9 +30,14 @@
#include <cstring>
#include <locale>
-namespace std
+namespace __gnu_cxx
{
+ using namespace std;
+
// Defined in globals.cc.
+ extern locale::facet** facet_vec;
+ extern char* facet_name[6 + _GLIBCPP_NUM_CATEGORIES];
+
extern std::ctype<char> ctype_c;
extern std::collate<char> collate_c;
extern numpunct<char> numpunct_c;
@@ -63,6 +68,11 @@ namespace std
extern time_put<wchar_t> time_put_w;
extern std::messages<wchar_t> messages_w;
#endif
+} // namespace __gnu_cxx
+
+namespace std
+{
+ using namespace __gnu_cxx;
locale::_Impl::
~_Impl() throw()
@@ -71,6 +81,10 @@ namespace std
if (_M_facets[__i])
_M_facets[__i]->_M_remove_reference();
delete [] _M_facets;
+
+ for (size_t __i = 0;
+ __i < _S_categories_size + _S_extra_categories_size; ++__i)
+ delete [] _M_names[__i];
}
// Clone existing _Impl object.
@@ -95,14 +109,19 @@ namespace std
if (_M_facets[__i])
_M_facets[__i]->_M_add_reference();
}
- for (size_t __i = 0; __i < _S_num_categories; ++__i)
- _M_names[__i] = __imp._M_names[__i];
+ for (size_t __i = 0;
+ __i < _S_categories_size + _S_extra_categories_size; ++__i)
+ {
+ char* __new = new char[strlen(__imp._M_names[__i]) + 1];
+ strcpy(__new, __imp._M_names[__i]);
+ _M_names[__i] = __new;
+ }
}
// Construct named _Impl.
locale::_Impl::
_Impl(const char* __s, size_t __refs)
- : _M_references(__refs), _M_facets_size(_GLIBCPP_NUM_FACETS) // XXX
+ : _M_references(__refs), _M_facets_size(_GLIBCPP_NUM_FACETS)
{
// Initialize the underlying locale model, which also checks
// to see if the given name is valid.
@@ -122,12 +141,41 @@ namespace std
}
// Name all the categories.
- for (size_t i = 0; i < _S_num_categories; ++i)
- _M_names[i] = __s;
+ if (!strchr(__s, ';'))
+ {
+ size_t __len = strlen(__s) + 1;
+ for (size_t __i = 0;
+ __i < _S_categories_size + _S_extra_categories_size; ++__i)
+ {
+ _M_names[__i] = new char[__len];
+ strcpy(_M_names[__i], __s);
+ }
+ }
+ else
+ {
+ char* __tmp = strdup(__s);
+ __tmp[strlen(__tmp)] = ';';
+ strtok(__tmp, "=;");
+ for (size_t __i = 0;
+ __i < _S_categories_size + _S_extra_categories_size - 1; ++__i)
+ {
+ char* __src = strtok(NULL, "=;");
+ char* __new = new char[strlen(__src) + 1];
+ strcpy(__new, __src);
+ _M_names[__i] = __new;
+ strtok(NULL, "=;");
+ }
+ char* __src = strtok(NULL, "=;");
+ char* __new = new char[strlen(__src) + 1];
+ strcpy(__new, __src);
+ _M_names[_S_categories_size + _S_extra_categories_size - 1] = __new;
- // Construct all standard facets and add them to _M_facets.
- _M_init_facet(new std::ctype<char>(__cloc));
- _M_init_facet(new codecvt<char, char, mbstate_t>);
+ free(__tmp);
+ }
+
+ // Construct all standard facets and add them to _M_facets.
+ _M_init_facet(new std::ctype<char>(__cloc, 0, false));
+ _M_init_facet(new codecvt<char, char, mbstate_t>(__cloc));
_M_init_facet(new numpunct<char>(__cloc));
_M_init_facet(new num_get<char>);
_M_init_facet(new num_put<char>);
@@ -143,7 +191,7 @@ namespace std
#ifdef _GLIBCPP_USE_WCHAR_T
_M_init_facet(new std::ctype<wchar_t>(__cloc));
- _M_init_facet(new codecvt<wchar_t, char, mbstate_t>);
+ _M_init_facet(new codecvt<wchar_t, char, mbstate_t>(__cloc));
_M_init_facet(new numpunct<wchar_t>(__cloc));
_M_init_facet(new num_get<wchar_t>);
_M_init_facet(new num_put<wchar_t>);
@@ -162,47 +210,61 @@ namespace std
// Construct "C" _Impl.
locale::_Impl::
- _Impl(facet** __f, size_t __refs, bool)
- : _M_references(__refs), _M_facets(__f), _M_facets_size(_GLIBCPP_NUM_FACETS)
+ _Impl(facet**, size_t __refs, bool)
+ : _M_references(__refs), _M_facets_size(_GLIBCPP_NUM_FACETS)
{
+ // Initialize the underlying locale model.
+ locale::facet::_S_create_c_locale(locale::facet::_S_c_locale, "C");
+
+ _M_facets = new(&facet_vec) facet*[_M_facets_size];
+ for (size_t __i = 0; __i < _M_facets_size; ++__i)
+ _M_facets[__i] = 0;
+
// Name all the categories.
- for (size_t i = 0; i < _S_num_categories; ++i)
- _M_names[i] = "C";
+ for (size_t __i = 0;
+ __i < _S_categories_size + _S_extra_categories_size; ++__i)
+ {
+ _M_names[__i] = new (&facet_name[__i]) char[2];
+ strcpy(_M_names[__i], "C");
+ }
// This is needed as presently the C++ version of "C" locales
// != data in the underlying locale model for __timepunct,
// numpunct, and moneypunct. Also, the "C" locales must be
// constructed in a way such that they are pre-allocated.
- _M_init_facet(new (&ctype_c) std::ctype<char>);
- _M_init_facet(new (&codecvt_c) codecvt<char, char, mbstate_t>);
- _M_init_facet(new (&numpunct_c) numpunct<char>);
- _M_init_facet(new (&num_get_c) num_get<char>);
- _M_init_facet(new (&num_put_c) num_put<char>);
- _M_init_facet(new (&collate_c) std::collate<char>);
- _M_init_facet(new (&moneypunct_fc) moneypunct<char, false>);
- _M_init_facet(new (&moneypunct_tc) moneypunct<char, true>);
- _M_init_facet(new (&money_get_c) money_get<char>);
- _M_init_facet(new (&money_put_c) money_put<char>);
- _M_init_facet(new (&timepunct_c) __timepunct<char>);
- _M_init_facet(new (&time_get_c) time_get<char>);
- _M_init_facet(new (&time_put_c) time_put<char>);
- _M_init_facet(new (&messages_c) std::messages<char>);
+ // NB: Set locale::facets(ref) count to one so that each individual
+ // facet is not destroyed when the locale (and thus locale::_Impl) is
+ // destroyed.
+ _M_init_facet(new (&ctype_c) std::ctype<char>(0, false, 1));
+ _M_init_facet(new (&codecvt_c) codecvt<char, char, mbstate_t>(1));
+ _M_init_facet(new (&numpunct_c) numpunct<char>(1));
+ _M_init_facet(new (&num_get_c) num_get<char>(1));
+ _M_init_facet(new (&num_put_c) num_put<char>(1));
+ _M_init_facet(new (&collate_c) std::collate<char>(1));
+ _M_init_facet(new (&moneypunct_fc) moneypunct<char, false>(1));
+ _M_init_facet(new (&moneypunct_tc) moneypunct<char, true>(1));
+ _M_init_facet(new (&money_get_c) money_get<char>(1));
+ _M_init_facet(new (&money_put_c) money_put<char>(1));
+ _M_init_facet(new (&timepunct_c) __timepunct<char>(1));
+ _M_init_facet(new (&time_get_c) time_get<char>(1));
+ _M_init_facet(new (&time_put_c) time_put<char>(1));
+ _M_init_facet(new (&messages_c) std::messages<char>(1));
#ifdef _GLIBCPP_USE_WCHAR_T
- _M_init_facet(new (&ctype_w) std::ctype<wchar_t>);
- _M_init_facet(new (&codecvt_w) codecvt<wchar_t, char, mbstate_t>);
- _M_init_facet(new (&numpunct_w) numpunct<wchar_t>);
- _M_init_facet(new (&num_get_w) num_get<wchar_t>);
- _M_init_facet(new (&num_put_w) num_put<wchar_t>);
- _M_init_facet(new (&collate_w) std::collate<wchar_t>);
- _M_init_facet(new (&moneypunct_fw) moneypunct<wchar_t, false>);
- _M_init_facet(new (&moneypunct_tw) moneypunct<wchar_t, true>);
- _M_init_facet(new (&money_get_w) money_get<wchar_t>);
- _M_init_facet(new (&money_put_w) money_put<wchar_t>);
- _M_init_facet(new (&timepunct_w) __timepunct<wchar_t>);
- _M_init_facet(new (&time_get_w) time_get<wchar_t>);
- _M_init_facet(new (&time_put_w) time_put<wchar_t>);
- _M_init_facet(new (&messages_w) std::messages<wchar_t>);
-#endif
+ _M_init_facet(new (&ctype_w) std::ctype<wchar_t>(1));
+ _M_init_facet(new (&codecvt_w) codecvt<wchar_t, char, mbstate_t>(1));
+ _M_init_facet(new (&numpunct_w) numpunct<wchar_t>(1));
+ _M_init_facet(new (&num_get_w) num_get<wchar_t>(1));
+ _M_init_facet(new (&num_put_w) num_put<wchar_t>(1));
+ _M_init_facet(new (&collate_w) std::collate<wchar_t>(1));
+ _M_init_facet(new (&moneypunct_fw) moneypunct<wchar_t, false>(1));
+ _M_init_facet(new (&moneypunct_tw) moneypunct<wchar_t, true>(1));
+ _M_init_facet(new (&money_get_w) money_get<wchar_t>(1));
+ _M_init_facet(new (&money_put_w) money_put<wchar_t>(1));
+ _M_init_facet(new (&timepunct_w) __timepunct<wchar_t>(1));
+ _M_init_facet(new (&time_get_w) time_get<wchar_t>(1));
+ _M_init_facet(new (&time_put_w) time_put<wchar_t>(1));
+ _M_init_facet(new (&messages_w) std::messages<wchar_t>(1));
+#endif
}
void
@@ -210,7 +272,7 @@ namespace std
_M_replace_categories(const _Impl* __imp, category __cat)
{
category __mask;
- for (unsigned int __ix = 0; __ix < _S_num_categories; ++__ix)
+ for (size_t __ix = 0; __ix < _S_categories_size; ++__ix)
{
__mask = 1 << __ix;
if (__mask & __cat)
@@ -220,7 +282,12 @@ namespace std
// If both have names, go ahead and mangle.
if (strcmp(_M_names[__ix], "*") != 0
&& strcmp(__imp->_M_names[__ix], "*") != 0)
- _M_names[__ix] = __imp->_M_names[__ix];
+ {
+ delete [] _M_names[__ix];
+ char* __new = new char[strlen(__imp->_M_names[__ix]) + 1];
+ strcpy(__new, __imp->_M_names[__ix]);
+ _M_names[__ix] = __new;
+ }
}
}
}
@@ -250,6 +317,8 @@ namespace std
if (__fp)
{
size_t __index = __idp->_M_id();
+
+ // Check size of facet vector to ensure adequate room.
if (__index > _M_facets_size - 1)
{
facet** __old = _M_facets;
@@ -266,11 +335,11 @@ namespace std
delete [] __old;
}
+ __fp->_M_add_reference();
facet*& __fpr = _M_facets[__index];
if (__fpr)
{
// Replacing an existing facet. Order matters.
- __fp->_M_add_reference();
__fpr->_M_remove_reference();
__fpr = __fp;
}
diff --git a/libstdc++-v3/src/misc-inst.cc b/libstdc++-v3/src/misc-inst.cc
index 1500e45a721..ff899102009 100644
--- a/libstdc++-v3/src/misc-inst.cc
+++ b/libstdc++-v3/src/misc-inst.cc
@@ -67,4 +67,19 @@ namespace std
basic_istream<wchar_t>&
getline(basic_istream<wchar_t>&, wstring&);
#endif
+
+#if 1
+ // XXX
+ // 2002-05-24 These are no longer needed and should eventually be deleted.
+ template
+ string*
+ __uninitialized_fill_n_aux<string*, size_t, string>
+ (string*, size_t, string const &, __false_type);
+
+ template
+ string*
+ __uninitialized_copy_aux<vector<string>::const_iterator, string *>
+ (vector<string>::const_iterator, vector<string>::const_iterator,
+ string*, __false_type);
+#endif
} // namespace std
diff --git a/libstdc++-v3/src/stl-inst.cc b/libstdc++-v3/src/stl-inst.cc
index d8879a7bccd..d80a7186718 100644
--- a/libstdc++-v3/src/stl-inst.cc
+++ b/libstdc++-v3/src/stl-inst.cc
@@ -39,9 +39,5 @@ namespace std
template class allocator<char>;
template class allocator<wchar_t>;
-#ifdef __USE_MALLOC
- template class __malloc_alloc_template<0>;
-#else
template class __default_alloc_template<true, 0>;
-#endif
} // namespace std
diff --git a/libstdc++-v3/src/strstream.cc b/libstdc++-v3/src/strstream.cc
index 0576472ddbe..4d585659b9b 100644
--- a/libstdc++-v3/src/strstream.cc
+++ b/libstdc++-v3/src/strstream.cc
@@ -2,22 +2,21 @@
// Copyright (C) 2001, 2002 Free Software Foundation
//
-// 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)
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
// any later version.
-//
-// GNU CC is distributed in the hope that it will be useful,
+
+// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with GNU CC; see the file COPYING. If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
diff --git a/libstdc++-v3/src/vterminate.cc b/libstdc++-v3/src/vterminate.cc
index a3543c903c6..26e09d17b57 100644
--- a/libstdc++-v3/src/vterminate.cc
+++ b/libstdc++-v3/src/vterminate.cc
@@ -2,22 +2,21 @@
// Copyright (C) 2001, 2002 Free Software Foundation
//
-// 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)
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
// any later version.
-//
-// GNU CC is distributed in the hope that it will be useful,
+
+// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with GNU CC; see the file COPYING. If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits.cc b/libstdc++-v3/testsuite/18_support/numeric_limits.cc
index 9d6fa7380c8..7dd5a6c191e 100644
--- a/libstdc++-v3/testsuite/18_support/numeric_limits.cc
+++ b/libstdc++-v3/testsuite/18_support/numeric_limits.cc
@@ -1,3 +1,5 @@
+// { dg-options "-mieee" { target alpha*-*-* } }
+
// 1999-08-23 bkoz
// Copyright (C) 1999, 2001, 2002 Free Software Foundation
@@ -23,6 +25,7 @@
#include <limits>
#include <limits.h>
#include <float.h>
+#include <cwchar>
#include <testsuite_hooks.h>
template<typename T>
@@ -46,6 +49,10 @@ DEFINE_EXTREMA(unsigned, 0U, UINT_MAX);
DEFINE_EXTREMA(long, LONG_MIN, LONG_MAX);
DEFINE_EXTREMA(unsigned long, 0UL, ULONG_MAX);
+#if _GLIBCPP_USE_WCHAR_T
+DEFINE_EXTREMA(wchar_t, WCHAR_MIN, WCHAR_MAX);
+#endif //_GLIBCPP_USE_WCHAR_T
+
DEFINE_EXTREMA(float, FLT_MIN, FLT_MAX);
DEFINE_EXTREMA(double, DBL_MIN, DBL_MAX);
DEFINE_EXTREMA(long double, LDBL_MIN, LDBL_MAX);
@@ -92,6 +99,16 @@ void test_extrema<long double>()
}
#endif
+template<typename T>
+void test_epsilon()
+{
+ bool test = true;
+ T epsilon = std::numeric_limits<T>::epsilon();
+ T one = 1;
+
+ VERIFY( one != (one + epsilon) );
+}
+
#ifdef __CHAR_UNSIGNED__
#define char_is_signed false
#else
@@ -117,6 +134,83 @@ void test_sign()
template<typename T>
+void
+test_infinity()
+{
+ bool test;
+
+ if (std::numeric_limits<T>::has_infinity)
+ {
+ T inf = std::numeric_limits<T>::infinity();
+ test = (inf + inf == inf);
+ }
+ else
+ test = true;
+
+ VERIFY (test);
+}
+
+template<typename T>
+void
+test_denorm_min()
+{
+ bool test;
+
+ if (std::numeric_limits<T>::has_denorm == std::denorm_present)
+ {
+ T denorm = std::numeric_limits<T>::denorm_min();
+ test = (denorm > 0);
+ }
+ else
+ test = true;
+
+ VERIFY (test);
+}
+
+template<typename T>
+void
+test_qnan()
+{
+ bool test;
+
+ if (std::numeric_limits<T>::has_quiet_NaN)
+ {
+ T nan = std::numeric_limits<T>::quiet_NaN();
+ test = (nan != nan);
+ }
+ else
+ test = true;
+
+ VERIFY (test);
+}
+
+
+template<typename T>
+void
+test_is_iec559()
+{
+ bool test;
+
+ if (std::numeric_limits<T>::is_iec559)
+ {
+ // IEC 559 requires all of the following.
+ test = (std::numeric_limits<T>::has_infinity
+ && std::numeric_limits<T>::has_quiet_NaN
+ && std::numeric_limits<T>::has_signaling_NaN);
+ }
+ else
+ {
+ // If we had all of the following, why didn't we set IEC 559?
+ test = (!std::numeric_limits<T>::has_infinity
+ || !std::numeric_limits<T>::has_quiet_NaN
+ || !std::numeric_limits<T>::has_signaling_NaN);
+ }
+
+ VERIFY (test);
+}
+
+
+template<typename T>
struct A
{
int key;
@@ -195,14 +289,26 @@ bool test03()
bool test = true;
VERIFY( std::numeric_limits<bool>::digits10 == 0 );
- VERIFY( __glibcpp_s8_digits10 == 2 );
- VERIFY( __glibcpp_u8_digits10 == 2 );
- VERIFY( __glibcpp_s16_digits10 == 4 );
- VERIFY( __glibcpp_u16_digits10 == 4 );
- VERIFY( __glibcpp_s32_digits10 == 9 );
- VERIFY( __glibcpp_u32_digits10 == 9 );
- VERIFY( __glibcpp_s64_digits10 == 18 );
- VERIFY( __glibcpp_u64_digits10 == 19 );
+ if (__CHAR_BIT__ == 8)
+ {
+ VERIFY( std::numeric_limits<signed char>::digits10 == 2 );
+ VERIFY( std::numeric_limits<unsigned char>::digits10 == 2 );
+ }
+ if (__CHAR_BIT__ * sizeof(short) == 16)
+ {
+ VERIFY( std::numeric_limits<signed short>::digits10 == 4 );
+ VERIFY( std::numeric_limits<unsigned short>::digits10 == 4 );
+ }
+ if (__CHAR_BIT__ * sizeof(int) == 32)
+ {
+ VERIFY( std::numeric_limits<signed int>::digits10 == 9 );
+ VERIFY( std::numeric_limits<unsigned int>::digits10 == 9 );
+ }
+ if (__CHAR_BIT__ * sizeof(long long) == 64)
+ {
+ VERIFY( std::numeric_limits<signed long long>::digits10 == 18 );
+ VERIFY( std::numeric_limits<unsigned long long>::digits10 == 19 );
+ }
#ifdef DEBUG_ASSERT
assert(test);
@@ -235,7 +341,31 @@ int main()
test_extrema<double>();
test_extrema<long double>();
+ test_epsilon<float>();
+ test_epsilon<double>();
+ test_epsilon<long double>();
+
test_sign();
- return 0;
+ test_infinity<float>();
+ test_infinity<double>();
+ test_infinity<long double>();
+
+ test_denorm_min<float>();
+ test_denorm_min<double>();
+ test_denorm_min<long double>();
+
+ test_qnan<float>();
+ test_qnan<double>();
+ test_qnan<long double>();
+
+ // ??? How to test SNaN? We'd perhaps have to be prepared
+ // to catch SIGFPE. Can't rely on a signal getting through
+ // since the exception can be disabled in the FPU.
+
+ test_is_iec559<float>();
+ test_is_iec559<double>();
+ test_is_iec559<long double>();
+
+ return 0;
}
diff --git a/libstdc++-v3/testsuite/21_strings/capacity.cc b/libstdc++-v3/testsuite/21_strings/capacity.cc
index 3c45b005017..99a5b655f58 100644
--- a/libstdc++-v3/testsuite/21_strings/capacity.cc
+++ b/libstdc++-v3/testsuite/21_strings/capacity.cc
@@ -209,7 +209,7 @@ void test01()
sz02 = str011.length();
VERIFY( sz02 > sz01 );
- // trickster allocator (__USE_MALLOC, luke) issues involved with these:
+ // trickster allocator issues involved with these:
std::string str3 = "8-chars_8-chars_";
const char* p3 = str3.c_str();
std::string str4 = str3 + "7-chars";
diff --git a/libstdc++-v3/testsuite/22_locale/ctor_copy_dtor.cc b/libstdc++-v3/testsuite/22_locale/ctor_copy_dtor.cc
index 94db3bcc139..8ffef6e34e1 100644
--- a/libstdc++-v3/testsuite/22_locale/ctor_copy_dtor.cc
+++ b/libstdc++-v3/testsuite/22_locale/ctor_copy_dtor.cc
@@ -121,7 +121,7 @@ void test01()
string str1, str2;
// construct a locale object with the C facet
- const locale& loc01 = locale::classic();
+ const locale loc01 = locale::classic();
// 1
// template <class Facet> locale(const locale& other, Facet* f)
@@ -310,6 +310,188 @@ void test02()
VERIFY( loc_1 == loc_2 );
}
+// libstdc++/7811
+void test03()
+{
+ bool test = true;
+#ifdef _GLIBCPP_HAVE_SETENV
+ const char* LC_ALL_orig = getenv("LC_ALL");
+ if (!setenv("LC_ALL", "it_IT", 1))
+ {
+ std::locale loc("");
+ VERIFY( loc.name() == "it_IT" );
+ setenv("LC_ALL", LC_ALL_orig ? LC_ALL_orig : "", 1);
+ }
+#endif
+}
+
+
+// More tests for locale("") == POSIX locale::name.
+void test04()
+{
+ bool test = true;
+ using namespace std;
+
+#ifdef _GLIBCPP_HAVE_SETENV
+
+ const char* LANG_orig = getenv("LANG") ? strdup(getenv("LANG")) : "";
+ const char* LC_ALL_orig = getenv("LC_ALL") ? strdup(getenv("LC_ALL")) : "";
+ const char* LC_CTYPE_orig =
+ getenv("LC_CTYPE") ? strdup(getenv("LC_CTYPE")) : "";
+ const char* LC_NUMERIC_orig =
+ getenv("LC_NUMERIC") ? strdup(getenv("LC_NUMERIC")) : "";
+ const char* LC_COLLATE_orig =
+ getenv("LC_COLLATE") ? strdup(getenv("LC_COLLATE")) : "";
+ const char* LC_TIME_orig =
+ getenv("LC_TIME") ? strdup(getenv("LC_TIME")) : "";
+ const char* LC_MONETARY_orig =
+ getenv("LC_MONETARY") ? strdup(getenv("LC_MONETARY")) : "";
+ const char* LC_MESSAGES_orig =
+ getenv("LC_MESSAGES") ? strdup(getenv("LC_MESSAGES")) : "";
+#if _GLIBCPP_NUM_CATEGORIES
+ const char* LC_PAPER_orig =
+ getenv("LC_PAPER") ? strdup(getenv("LC_PAPER")) : "";
+ const char* LC_NAME_orig =
+ getenv("LC_NAME") ? strdup(getenv("LC_NAME")) : "";
+ const char* LC_ADDRESS_orig =
+ getenv("LC_ADDRESS") ? strdup(getenv("LC_ADDRESS")) : "";
+ const char* LC_TELEPHONE_orig =
+ getenv("LC_TELEPHONE") ? strdup(getenv("LC_TELEPHONE")) : "";
+ const char* LC_MEASUREMENT_orig =
+ getenv("LC_MEASUREMENT") ? strdup(getenv("LC_MEASUREMENT")) : "";
+ const char* LC_IDENTIFICATION_orig =
+ getenv("LC_IDENTIFICATION") ? strdup(getenv("LC_IDENTIFICATION")) : "";
+#endif
+
+ // Check that a "POSIX" LC_ALL is equivalent to "C".
+ if (!setenv("LC_ALL", "POSIX", 1))
+ {
+ locale loc("");
+ VERIFY( loc.name() == "C" );
+ }
+ setenv("LC_ALL", "", 1);
+
+ // Check that a "en_PH" LC_ALL is equivalent to "en_PH".
+ if (!setenv("LC_ALL", "en_PH", 1))
+ {
+ locale loc("");
+ VERIFY( loc.name() == "en_PH" );
+ }
+ setenv("LC_ALL", "", 1);
+
+ // Explicit check that LC_ALL sets regardless of LC_* and LANG.
+ if (!setenv("LANG", "es_MX", 1) && !setenv("LC_COLLATE", "de_DE", 1))
+ {
+ if (!setenv("LC_ALL", "en_PH", 1))
+ {
+ locale loc("");
+ VERIFY( loc.name() == "en_PH" );
+ }
+ setenv("LC_ALL", "", 1);
+ setenv("LANG", LANG_orig ? LANG_orig : "", 1);
+ setenv("LC_COLLATE", LC_COLLATE_orig ? LC_COLLATE_orig : "", 1);
+ }
+
+ // NB: LANG checks all LC_* macro settings. As such, all LC_* macros
+ // must be cleared for these tests, and then restored.
+ setenv("LC_ALL", "", 1);
+ setenv("LC_CTYPE", "", 1);
+ setenv("LC_NUMERIC", "", 1);
+ setenv("LC_COLLATE", "", 1);
+ setenv("LC_TIME", "", 1);
+ setenv("LC_MONETARY", "", 1);
+ setenv("LC_MESSAGES", "", 1);
+#if _GLIBCPP_NUM_CATEGORIES
+ setenv("LC_PAPER", "", 1);
+ setenv("LC_NAME", "", 1);
+ setenv("LC_ADDRESS", "", 1);
+ setenv("LC_TELEPHONE", "", 1);
+ setenv("LC_MEASUREMENT", "", 1);
+ setenv("LC_IDENTIFICATION", "", 1);
+#endif
+
+ // Check the default set by LANG.
+ if (!setenv("LANG", "fr_FR", 1))
+ {
+ locale loc("");
+ VERIFY( loc.name() == "fr_FR" );
+ }
+
+ // Check that a "POSIX" LANG is equivalent to "C".
+ if (!setenv("LANG", "POSIX", 1))
+ {
+ locale loc("");
+ VERIFY( loc.name() == "C" );
+ }
+
+ // Setting a category in the "C" default.
+ if (!setenv("LC_COLLATE", "de_DE", 1))
+ {
+ locale loc("");
+
+#if _GLIBCPP_NUM_CATEGORIES
+ VERIFY( loc.name() == "LC_CTYPE=C;LC_NUMERIC=C;LC_COLLATE=de_DE;"
+ "LC_TIME=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;"
+ "LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;"
+ "LC_IDENTIFICATION=C" );
+#else
+ VERIFY( loc.name() == "LC_CTYPE=C;LC_NUMERIC=C;LC_COLLATE=de_DE;"
+ "LC_TIME=C;LC_MONETARY=C;LC_MESSAGES=C" );
+#endif
+ }
+
+ // Changing the LANG default while LC_COLLATE is set.
+ if (!setenv("LANG", "fr_FR", 1))
+ {
+ locale loc("");
+#if _GLIBCPP_NUM_CATEGORIES
+ VERIFY( loc.name() == "LC_CTYPE=fr_FR;LC_NUMERIC=fr_FR;"
+ "LC_COLLATE=de_DE;LC_TIME=fr_FR;LC_MONETARY=fr_FR;"
+ "LC_MESSAGES=fr_FR;LC_PAPER=fr_FR;LC_NAME=fr_FR;"
+ "LC_ADDRESS=fr_FR;LC_TELEPHONE=fr_FR;LC_MEASUREMENT=fr_FR;"
+ "LC_IDENTIFICATION=fr_FR" );
+#else
+ VERIFY( loc.name() == "LC_CTYPE=fr_FR;LC_NUMERIC=fr_FR;"
+ "LC_COLLATE=de_DE;LC_TIME=fr_FR;LC_MONETARY=fr_FR;"
+ "LC_MESSAGES=fr_FR" );
+#endif
+ }
+
+ // Changing another (C only) category.
+#if _GLIBCPP_NUM_CATEGORIES
+ if (!setenv("LC_IDENTIFICATION", "it_IT", 1))
+ {
+ locale loc("");
+ VERIFY( loc.name() == "LC_CTYPE=fr_FR;LC_NUMERIC=fr_FR;"
+ "LC_COLLATE=de_DE;LC_TIME=fr_FR;LC_MONETARY=fr_FR;"
+ "LC_MESSAGES=fr_FR;LC_PAPER=fr_FR;LC_NAME=fr_FR;"
+ "LC_ADDRESS=fr_FR;LC_TELEPHONE=fr_FR;LC_MEASUREMENT=fr_FR;"
+ "LC_IDENTIFICATION=it_IT" );
+ }
+#endif
+
+ // Restore the environment.
+ setenv("LANG", LANG_orig ? LANG_orig : "", 1);
+ setenv("LC_ALL", LC_ALL_orig ? LC_ALL_orig : "", 1);
+ setenv("LC_CTYPE", LC_CTYPE_orig ? LC_CTYPE_orig : "", 1);
+ setenv("LC_NUMERIC", LC_NUMERIC_orig ? LC_NUMERIC_orig : "", 1);
+ setenv("LC_COLLATE", LC_COLLATE_orig ? LC_COLLATE_orig : "", 1);
+ setenv("LC_TIME", LC_TIME_orig ? LC_TIME_orig : "", 1);
+ setenv("LC_MONETARY", LC_MONETARY_orig ? LC_MONETARY_orig : "", 1);
+ setenv("LC_MESSAGES", LC_MESSAGES_orig ? LC_MESSAGES_orig : "", 1);
+#if _GLIBCPP_NUM_CATEGORIES
+ setenv("LC_PAPER", LC_PAPER_orig ? LC_PAPER_orig : "", 1);
+ setenv("LC_NAME", LC_NAME_orig ? LC_NAME_orig : "", 1);
+ setenv("LC_ADDRESS", LC_ADDRESS_orig ? LC_ADDRESS_orig : "", 1);
+ setenv("LC_TELEPHONE", LC_TELEPHONE_orig ? LC_TELEPHONE_orig : "", 1);
+ setenv("LC_MEASUREMENT", LC_MEASUREMENT_orig ? LC_MEASUREMENT_orig : "", 1);
+ setenv("LC_IDENTIFICATION",
+ LC_IDENTIFICATION_orig ? LC_IDENTIFICATION_orig : "", 1);
+#endif
+
+#endif
+}
+
int main()
{
test00();
@@ -319,6 +501,8 @@ int main()
#endif
test02();
+ test03();
+ test04();
return 0;
}
diff --git a/libstdc++-v3/testsuite/22_locale/facet.cc b/libstdc++-v3/testsuite/22_locale/facet.cc
index 431718e7834..9c613b4c203 100644
--- a/libstdc++-v3/testsuite/22_locale/facet.cc
+++ b/libstdc++-v3/testsuite/22_locale/facet.cc
@@ -1,6 +1,6 @@
// 2000-08-31 Benjamin Kosnik <bkoz@redhat.com>
-// Copyright (C) 2000 Free Software Foundation
+// Copyright (C) 2000, 2002 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -25,6 +25,7 @@
#include <stdexcept>
#include <string>
#include <iterator>
+#include <limits>
#include <testsuite_hooks.h>
// 1 a class if a facet if it is publicly derived from another facet
@@ -233,9 +234,69 @@ void test01()
}
}
+// Static counter for use in checking ctors/dtors.
+static std::size_t counter;
+
+class surf : public std::locale::facet
+{
+public:
+ static std::locale::id id;
+ surf(size_t refs = 0): std::locale::facet(refs) { ++counter; }
+ ~surf() { --counter; }
+};
+
+std::locale::id surf::id;
+
+typedef surf facet_type;
+
+void test02()
+{
+ using namespace std;
+ bool test = true;
+
+ // 1: Destroyed when out of scope.
+ VERIFY( counter == 0 );
+ {
+ locale loc01(locale::classic(), new facet_type);
+ VERIFY( counter == 1 );
+ }
+ VERIFY( counter == 0 );
+
+ // 2: Not destroyed when out of scope, deliberately leaked.
+ VERIFY( counter == 0 );
+ {
+ // Default refs argument is zero.
+ locale loc02(locale::classic(), new facet_type(1));
+ VERIFY( counter == 1 );
+ }
+ VERIFY( counter == 1 );
+
+ // 3: Pathological.
+ counter = 0;
+ {
+ // Test bounds.
+ facet_type* f = new facet_type(numeric_limits<size_t>::max());
+ VERIFY( counter == 1 );
+ // Add a reference.
+ locale loc01(locale::classic(), f);
+ {
+ // Add another reference...
+ locale loc02(locale::classic(), f);
+ }
+ VERIFY( counter == 1 );
+ }
+
+ // 4: Named locale should destroy facets when it goes out of scope.
+ // Not quite sure how to test for this w/o valgrind at the moment.
+ {
+ locale loc03("es_MX");
+ }
+}
+
int main ()
{
test01();
+ test02();
return 0;
}
diff --git a/libstdc++-v3/testsuite/22_locale/num_put_members_char.cc b/libstdc++-v3/testsuite/22_locale/num_put_members_char.cc
index fcc1f79b31d..e93900bfdb1 100644
--- a/libstdc++-v3/testsuite/22_locale/num_put_members_char.cc
+++ b/libstdc++-v3/testsuite/22_locale/num_put_members_char.cc
@@ -326,12 +326,50 @@ void test04()
}
}
+// Make sure that, in a locale that expects grouping, when showbase
+// is true, an hexadecimal or octal zero is correctly output (the case
+// of zero is special since there is no 0x, 0 respectively, prefix)
+void test05()
+{
+ using namespace std;
+ bool test = true;
+
+ // A locale that expects grouping.
+ locale loc_de("de_DE");
+
+ const string empty;
+ string result;
+
+ ostringstream oss;
+ oss.imbue(loc_de);
+ const num_put<char>& np = use_facet<num_put<char> >(oss.getloc());
+
+ long l = 0;
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::showbase);
+ oss.setf(ios::hex, ios::basefield);
+ np.put(oss.rdbuf(), oss, '+', l);
+ result = oss.str();
+ VERIFY( result == "0" );
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::showbase);
+ oss.setf(ios::oct, ios::basefield);
+ np.put(oss.rdbuf(), oss, '+', l);
+ result = oss.str();
+ VERIFY( result == "0" );
+}
+
int main()
{
test01();
test02();
test03();
test04();
+ test05();
return 0;
}
diff --git a/libstdc++-v3/testsuite/22_locale/num_put_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/num_put_members_wchar_t.cc
index 4fbf25f2121..53fdd591b5b 100644
--- a/libstdc++-v3/testsuite/22_locale/num_put_members_wchar_t.cc
+++ b/libstdc++-v3/testsuite/22_locale/num_put_members_wchar_t.cc
@@ -325,6 +325,43 @@ void test04()
VERIFY( preLANG == postLANG );
}
}
+
+// Make sure that, in a locale that expects grouping, when showbase
+// is true, an hexadecimal or octal zero is correctly output (the case
+// of zero is special since there is no 0x, 0 respectively, prefix)
+void test05()
+{
+ using namespace std;
+ bool test = true;
+
+ // A locale that expects grouping.
+ locale loc_de("de_DE");
+
+ const wstring empty;
+ wstring result;
+
+ wostringstream oss;
+ oss.imbue(loc_de);
+ const num_put<wchar_t>& np = use_facet<num_put<wchar_t> >(oss.getloc());
+
+ long l = 0;
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::showbase);
+ oss.setf(ios::hex, ios::basefield);
+ np.put(oss.rdbuf(), oss, L'+', l);
+ result = oss.str();
+ VERIFY( result == L"0" );
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::showbase);
+ oss.setf(ios::oct, ios::basefield);
+ np.put(oss.rdbuf(), oss, L'+', l);
+ result = oss.str();
+ VERIFY( result == L"0" );
+}
#endif
int main()
@@ -334,6 +371,7 @@ int main()
test02();
test03();
test04();
+ test05();
#endif
return 0;
}
diff --git a/libstdc++-v3/testsuite/22_locale/static_members.cc b/libstdc++-v3/testsuite/22_locale/static_members.cc
index 16e856a2ee4..9811dd9a806 100644
--- a/libstdc++-v3/testsuite/22_locale/static_members.cc
+++ b/libstdc++-v3/testsuite/22_locale/static_members.cc
@@ -1,6 +1,6 @@
// 2000-09-13 Benjamin Kosnik <bkoz@redhat.com>
-// Copyright (C) 2000 Free Software Foundation
+// Copyright (C) 2000, 2002 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -22,6 +22,7 @@
#include <cwchar> // for mbstate_t
#include <locale>
+#include <iostream>
#include <testsuite_hooks.h>
typedef std::codecvt<char, char, std::mbstate_t> ccodecvt;
@@ -30,14 +31,15 @@ class gnu_codecvt: public ccodecvt { };
void test01()
{
using namespace std;
-
bool test = true;
+
string str1, str2;
- // construct a locale object with the C facet
- const locale& loc01 = locale::classic();
- // construct a locale object with the specialized facet.
- locale loc02(locale::classic(), new gnu_codecvt);
+ // Construct a locale object with the C facet.
+ const locale loc01 = locale::classic();
+
+ // Construct a locale object with the specialized facet.
+ locale loc02(locale::classic(), new gnu_codecvt);
VERIFY ( loc01 != loc02 );
VERIFY ( !(loc01 == loc02) );
@@ -50,15 +52,143 @@ void test01()
// global
locale loc03;
VERIFY ( loc03 == loc01);
- locale loc04 = locale::global(loc02);
+ locale global_orig = locale::global(loc02);
locale loc05;
VERIFY (loc05 != loc03);
VERIFY (loc05 == loc02);
+
+ // Reset global settings.
+ locale::global(global_orig);
+}
+
+// Sanity check locale::global(loc) and setlocale.
+void test02()
+{
+ using namespace std;
+ bool test = true;
+
+ const string ph("en_PH");
+ const string mx("es_MX");
+ const char* orig = setlocale(LC_ALL, NULL);
+ const char* testph = setlocale(LC_ALL, ph.c_str());
+ const char* testmx = setlocale(LC_ALL, mx.c_str());
+ setlocale(LC_ALL, orig);
+
+ // If the underlying locale doesn't support these names, setlocale
+ // won't be reset. Therefore, disable unless we know these specific
+ // named locales work.
+ if (testph && testmx)
+ {
+ const locale loc_ph(ph.c_str());
+ const locale loc_mx(mx.c_str());
+
+ // Use setlocale between two calls to locale("")
+ const locale loc_env_1("");
+ setlocale(LC_ALL, ph.c_str());
+ const locale loc_env_2("");
+ VERIFY( loc_env_1 == loc_env_2 );
+
+ // Change global locale.
+ locale global_orig = locale::global(loc_mx);
+ const char* lc_all_mx = setlocale(LC_ALL, NULL);
+ if (lc_all_mx)
+ {
+ cout << "lc_all_mx is " << lc_all_mx << endl;
+ VERIFY( mx == lc_all_mx );
+ }
+
+ // Restore global settings.
+ locale::global(global_orig);
+ }
+}
+
+// Static counter for use in checking ctors/dtors.
+static std::size_t counter;
+
+class surf : public std::locale::facet
+{
+public:
+ static std::locale::id id;
+ surf(size_t refs = 0): std::locale::facet(refs) { ++counter; }
+ ~surf() { --counter; }
+};
+
+std::locale::id surf::id;
+
+typedef surf facet_type;
+
+// Verify lifetimes of global objects.
+void test03()
+{
+ using namespace std;
+ bool test = true;
+
+ string name;
+ locale global_orig;
+ // 1: Destroyed when out of scope.
+ {
+ {
+ {
+ VERIFY( counter == 0 );
+ {
+ locale loc01(locale::classic(), new facet_type);
+ VERIFY( counter == 1 );
+ global_orig = locale::global(loc01);
+ name = loc01.name();
+ }
+ VERIFY( counter == 1 );
+ locale loc02 = locale();
+ // Weak, but it's something...
+ VERIFY( loc02.name() == name );
+ }
+ VERIFY( counter == 1 );
+ // NB: loc03 should be a copy of the previous global locale.
+ locale loc03 = locale::global(global_orig);
+ VERIFY( counter == 1 );
+ VERIFY( loc03.name() == name );
+ }
+ VERIFY( counter == 0 );
+ locale loc04 = locale();
+ VERIFY( loc04 == global_orig );
+ }
+
+ // 2: Not destroyed when out of scope, deliberately leaked.
+ {
+ {
+ {
+ VERIFY( counter == 0 );
+ {
+ locale loc01(locale::classic(), new facet_type(1));
+ VERIFY( counter == 1 );
+ global_orig = locale::global(loc01);
+ name = loc01.name();
+ }
+ VERIFY( counter == 1 );
+ locale loc02 = locale();
+ // Weak, but it's something...
+ VERIFY( loc02.name() == name );
+ }
+ VERIFY( counter == 1 );
+ // NB: loc03 should be a copy of the previous global locale.
+ locale loc03 = locale::global(global_orig);
+ VERIFY( counter == 1 );
+ VERIFY( loc03.name() == name );
+ }
+ VERIFY( counter == 1 );
+ locale loc04 = locale();
+ VERIFY( loc04 == global_orig );
+ }
+ VERIFY( counter == 1 );
+
+ // Restore global settings.
+ locale::global(global_orig);
}
int main ()
{
test01();
+ test02();
+ test03();
return 0;
}
diff --git a/libstdc++-v3/testsuite/27_io/ostream_inserter_other.cc b/libstdc++-v3/testsuite/27_io/ostream_inserter_other.cc
index 4ce5b68d207..9d8cc0f9ecc 100644
--- a/libstdc++-v3/testsuite/27_io/ostream_inserter_other.cc
+++ b/libstdc++-v3/testsuite/27_io/ostream_inserter_other.cc
@@ -149,6 +149,99 @@ void test04()
VERIFY( test );
}
+
+class test_buffer_1 : public std::streambuf
+{
+public:
+ test_buffer_1(const std::string& s) : str(s), it(str.begin()) { }
+
+protected:
+ virtual int underflow() { return (it != str.end() ? *it : EOF); }
+ virtual int uflow() { return (it != str.end() ? *it++ : EOF); }
+
+private:
+ const std::string str;
+ std::string::const_iterator it;
+};
+
+
+class test_buffer_2 : public std::streambuf
+{
+public:
+ test_buffer_2(const std::string& s) : str(s), it(str.begin()) { }
+
+protected:
+ virtual int underflow() { return (it != str.end() ? *it : EOF); }
+ virtual int uflow() { return (it != str.end() ? *it++ : EOF); }
+ virtual std::streamsize showmanyc() { return std::distance(it, str.end()); }
+private:
+ const std::string str;
+ std::string::const_iterator it;
+};
+
+
+class test_buffer_3 : public std::streambuf
+{
+public:
+ test_buffer_3(const std::string& s) : str(s), it(str.begin()) { }
+
+protected:
+ virtual int underflow() { return (it != str.end() ? *it : EOF); }
+ virtual int uflow() { return (it != str.end() ? *it++ : EOF); }
+ virtual std::streamsize showmanyc()
+ {
+ std::streamsize ret = std::distance(it, str.end());
+ return ret > 0 ? ret : -1;
+ }
+private:
+ const std::string str;
+ std::string::const_iterator it;
+};
+
+
+void test(const std::string& str, std::streambuf& buf)
+{
+ bool test = true;
+
+ std::ostringstream out;
+ std::istream in(&buf);
+
+ out << in.rdbuf();
+
+ if (out.str() != str)
+ VERIFY( false );
+}
+
+// libstdc++/6745
+// libstdc++/8071
+// libstdc++/8127
+// Jonathan Lennox <lennox@cs.columbia.edu>
+void test05()
+{
+ std::ostringstream out_1, out_2, out_3, out_4;
+
+ std::string string_a("Hello, world!");
+ std::string string_b("");
+
+ test_buffer_1 buf1a(string_a);
+ test_buffer_1 buf1b(string_b);
+
+ test_buffer_2 buf2a(string_a);
+ test_buffer_2 buf2b(string_b);
+
+ test_buffer_3 buf3a(string_a);
+ test_buffer_3 buf3b(string_b);
+
+ test(string_a, buf1a);
+ test(string_b, buf1b);
+
+ test(string_a, buf2a);
+ test(string_b, buf2b);
+
+ test(string_a, buf3a);
+ test(string_b, buf3b);
+}
+
int
main()
{
@@ -156,6 +249,7 @@ main()
test02();
test03();
test04();
-
+
+ test05();
return 0;
}
diff --git a/libstdc++-v3/testsuite/Makefile.am b/libstdc++-v3/testsuite/Makefile.am
index 37e62c50b9b..0deecb62b3d 100644
--- a/libstdc++-v3/testsuite/Makefile.am
+++ b/libstdc++-v3/testsuite/Makefile.am
@@ -37,10 +37,11 @@ AM_RUNTESTFLAGS =
RUNTESTFLAGS =
## CXX is actually a "C" compiler. These are real C++ programs.
-## Do the same thing as `testsuite_hooks --build-cxx`
+## Do the same thing as `testsuite_flags --build-cxx`
CXX_fake = @glibcpp_CXX@
CXX=`echo $(CXX_fake) | sed 's/xgcc/g++/g'`
CXXLINK = \
+ LD_RUN_PATH=${LD_RUN_PATH:+$LD_RUN_PATH:}${glibcpp_builddir}/src/.libs\
$(LIBTOOL) --tag=CXX --mode=link $(CXX) \
$(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
@@ -53,5 +54,10 @@ noinst_LIBRARIES = libv3test.a
libv3test_a_SOURCES = testsuite_hooks.cc
## Build support utilities.
+## Only build this as native, as need to find startup files and libc to link.
+if GLIBCPP_BUILD_ABI_CHECK
noinst_PROGRAMS = abi_check
+else
+noinst_PROGRAMS =
+endif
abi_check_SOURCES = abi_check.cc
diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in
index 22a09a7a83c..5f19c917108 100644
--- a/libstdc++-v3/testsuite/Makefile.in
+++ b/libstdc++-v3/testsuite/Makefile.in
@@ -74,7 +74,6 @@ CCODECVT_H = @CCODECVT_H@
CLOCALE_H = @CLOCALE_H@
CMESSAGES_H = @CMESSAGES_H@
CPP = @CPP@
-CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
CSTDIO_H = @CSTDIO_H@
CXXCPP = @CXXCPP@
C_INCLUDE_DIR = @C_INCLUDE_DIR@
@@ -152,6 +151,7 @@ RUNTESTFLAGS =
CXX_fake = @glibcpp_CXX@
CXX = `echo $(CXX_fake) | sed 's/xgcc/g++/g'`
CXXLINK = \
+ LD_RUN_PATH=${LD_RUN_PATH:+$LD_RUN_PATH:}${glibcpp_builddir}/src/.libs\
$(LIBTOOL) --tag=CXX --mode=link $(CXX) \
$(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
@@ -163,8 +163,8 @@ INCLUDES = \
noinst_LIBRARIES = libv3test.a
libv3test_a_SOURCES = testsuite_hooks.cc
-
-noinst_PROGRAMS = abi_check
+@GLIBCPP_BUILD_ABI_CHECK_TRUE@noinst_PROGRAMS = @GLIBCPP_BUILD_ABI_CHECK_TRUE@abi_check
+@GLIBCPP_BUILD_ABI_CHECK_FALSE@noinst_PROGRAMS =
abi_check_SOURCES = abi_check.cc
mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
CONFIG_HEADER = ../config.h
@@ -178,7 +178,7 @@ LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
libv3test_a_LIBADD =
libv3test_a_OBJECTS = testsuite_hooks.$(OBJEXT)
-noinst_PROGRAMS = abi_check$(EXEEXT)
+@GLIBCPP_BUILD_ABI_CHECK_FALSE@noinst_PROGRAMS =
PROGRAMS = $(noinst_PROGRAMS)
abi_check_OBJECTS = abi_check.$(OBJEXT)
diff --git a/libstdc++-v3/testsuite/abi_check.cc b/libstdc++-v3/testsuite/abi_check.cc
index 4f0ce32cfad..21ca619ca83 100644
--- a/libstdc++-v3/testsuite/abi_check.cc
+++ b/libstdc++-v3/testsuite/abi_check.cc
@@ -28,6 +28,8 @@
// the GNU General Public License.
// Benjamin Kosnik <bkoz@redhat.com>
+// Blame subsequent hacks on Loren J. Rittle <ljrittle@acm.org>, Phil
+// Edwards <pme@gcc.gnu.org>, and a cast of dozens at libstdc++@gcc.gnu.org.
#include <string>
#include <ext/hash_map>
@@ -36,55 +38,91 @@
#include <fstream>
#include <iostream>
#include <cxxabi.h>
+#include <stdlib.h> // for system(3)
+#include <unistd.h> // for access(2)
struct symbol_info
{
enum category { none, function, object, error };
category type;
std::string name;
- std::string name_demangled;
- std::string version;
+ std::string demangled_name;
int size;
+ std::string version_name;
symbol_info() : type(none), size(0) { }
symbol_info(const symbol_info& other)
- : type(other.type), name(other.name), name_demangled(other.name_demangled),
- version(other.version), size(other.size) { }
+ : type(other.type), name(other.name), demangled_name(other.demangled_name),
+ size(other.size), version_name(other.version_name) { }
};
+namespace __gnu_cxx
+{
+ using namespace std;
+
+ template<>
+ struct hash<string>
+ {
+ size_t operator()(const string& s) const
+ {
+ const collate<char>& c = use_facet<collate<char> >(locale::classic());
+ return c.hash(s.c_str(), s.c_str() + s.size());
+ }
+ };
+}
+
+typedef std::deque<std::string> symbol_names;
+typedef __gnu_cxx::hash_map<std::string, symbol_info> symbol_infos;
+
bool
-operator==(const symbol_info& lhs, const symbol_info& rhs)
+check_compatible(const symbol_info& lhs, const symbol_info& rhs,
+ bool verbose = false)
{
+ using namespace std;
bool ret = true;
+ const char tab = '\t';
// Check to see if symbol_infos are compatible.
- ret &= lhs.type == rhs.type;
- ret &= lhs.name == rhs.name;
- ret &= lhs.size == rhs.size;
+ if (lhs.type != rhs.type)
+ {
+ ret = false;
+ if (verbose)
+ {
+ cout << tab << "incompatible types" << endl;
+ }
+ }
+
+ if (lhs.name != rhs.name)
+ {
+ ret = false;
+ if (verbose)
+ {
+ cout << tab << "incompatible names" << endl;
+ }
+ }
+
+ if (lhs.size != rhs.size)
+ {
+ ret = false;
+ if (verbose)
+ {
+ cout << tab << "incompatible sizes" << endl;
+ }
+ }
+
+ if (lhs.version_name != rhs.version_name)
+ {
+ ret = false;
+ if (verbose)
+ {
+ cout << tab << "incompatible versions" << endl;
+ }
+ }
- // Expect something more sophisticated eventually.
- ret &= lhs.version == rhs.version;
return ret;
}
-bool
-operator!=(const symbol_info& lhs, const symbol_info& rhs)
-{ return !(lhs == rhs); }
-
-template<typename _CharT, typename _Traits>
- std::basic_ostream<_CharT, _Traits>&
- operator<<(std::basic_ostream<_CharT, _Traits>& os, symbol_info& si)
- {
- using namespace std;
- os << si.type << endl;
- os << si.name << endl;
- os << si.name_demangled << endl;
- os << si.version << endl;
- os << si.size << endl;
- return os;
- }
-
const char*
demangle(const std::string& mangled)
{
@@ -153,7 +191,7 @@ line_to_symbol_info(std::string& input, symbol_info& output)
istringstream iss(size);
int x;
iss >> x;
- if (iss.good())
+ if (!iss.fail())
output.size = x;
input.erase(input.begin(), input.begin() + n + 1);
}
@@ -169,7 +207,7 @@ line_to_symbol_info(std::string& input, symbol_info& output)
input.erase(input.begin(), input.begin() + n + 1);
// Set version name.
- output.version = input;
+ output.version_name = input;
}
else
{
@@ -179,15 +217,12 @@ line_to_symbol_info(std::string& input, symbol_info& output)
}
// Set the demangled name.
- output.name_demangled = demangle(output.name);
+ output.demangled_name = demangle(output.name);
}
-typedef std::deque<std::string> symbol_names;
-typedef __gnu_cxx::hash_map<const char*, symbol_info> symbol_infos;
-
void
-collect_symbol_data(const char* file, symbol_infos& symbols,
- symbol_names& names)
+create_symbol_data(const char* file, symbol_infos& symbols,
+ symbol_names& names)
{
// Parse list of symbols in file into vectors of symbol_info.
// For 3.2.0 on x86/linux, this usually is
@@ -204,62 +239,72 @@ collect_symbol_data(const char* file, symbol_infos& symbols,
{
symbol_info symbol;
line_to_symbol_info(line, symbol);
- symbols[symbol.name.c_str()] = symbol;
+ symbols[symbol.name] = symbol;
names.push_back(symbol.name);
line = empty;
}
}
}
+void
+report_symbol_info(const symbol_info& symbol, std::size_t n)
+{
+ using namespace std;
+ const char tab = '\t';
+ cout << tab << n << endl;
+ cout << tab << "symbol"<< endl;
+ cout << tab << symbol.name << endl;
+
+ // Add any other information to display here.
+ cout << tab << "demangled symbol"<< endl;
+ cout << tab << symbol.demangled_name << endl;
-int main(int argc, char** argv)
+ cout << endl;
+}
+
+
+int
+main(int argc, char** argv)
{
using namespace std;
- // Get arguments.
- if (argc != 2)
+ // Get arguments. (Heading towards getopt_long, I can feel it.)
+ string argv1;
+ if (argc < 4 || (string("--help") == (argv1 = argv[1])))
{
- cerr << "Usage: abi_check baseline_file" << endl;
+ cerr << "Usage: abi_check --check cur baseline\n"
+ " --help\n\n"
+ "Where CUR is a file containing the current results from\n"
+ "extract_symvers, and BASELINE is one from config/abi.\n"
+ << endl;
exit(1);
}
- const char* baseline_file = argv[1];
- const char* test_file = "current_symbols.txt";
- const char* test_lib = "../src/.libs/libstdc++.so";
-
- // Get list of symbols.
- // Assume external symbol list computed "as if" by
- /*
- readelf -s -W libstdc++.so | sed '/\.dynsym/,/^$/p;d' | egrep -v
- ' (LOCAL|UND) ' | awk '{ if ($4 == "FUNC" || $4 == "NOTYPE") printf
- "%s:%s\n", $4, $8; else if ($4 == "OBJECT") printf "%s:%s:%s\n", $4,
- $3, $8;}' | sort >& current_symbols.txt
- */
- const char quote = '"';
- const char bslash = '\\';
- ostringstream cmd;
- cmd << "readelf -s -W " << test_lib << " | sed '/" << bslash
- << ".dynsym/,/^$/p;d' | egrep -v ' (LOCAL|UND) ' | "
- << "awk '{ if ($4 == " << quote << "FUNC" << quote << "|| $4 == "
- << quote << "NOTYPE" << quote << ") printf " << quote << "%s:%s"
- << bslash << "n" << quote << ", $4, $8; else if ($4 == "
- << quote << "OBJECT" << quote << ") printf " << quote
- << "%s:%s:%s" << bslash << "n" << quote << ", $4, $3, $8;}' | "
- << "sort >& " << test_file;
- if (system(cmd.str().c_str()) != 0)
+
+
+ // Quick sanity/setup check for arguments.
+ const char* test_file = argv[2];
+ const char* baseline_file = argv[3];
+ if (access(test_file, R_OK) != 0)
{
- cerr << "Unable to generate the list of exported symbols." << endl;
- exit(2);
+ cerr << "Cannot read symbols file " << test_file
+ << ", did you forget to build first?" << endl;
+ exit(1);
+ }
+ if (access(baseline_file, R_OK) != 0)
+ {
+ cerr << "Cannot read baseline file " << baseline_file << endl;
+ exit(1);
}
- // Input both list of symbols into container.
+ // Input both lists of symbols into container.
symbol_infos baseline_symbols;
symbol_names baseline_names;
symbol_infos test_symbols;
symbol_names test_names;
- collect_symbol_data(baseline_file, baseline_symbols, baseline_names);
- collect_symbol_data(test_file, test_symbols, test_names);
+ create_symbol_data(baseline_file, baseline_symbols, baseline_names);
+ create_symbol_data(test_file, test_symbols, test_names);
- // Basic sanity check. (Was: error checking, what's that?)
+ // Sanity check results.
const symbol_names::size_type baseline_size = baseline_names.size();
const symbol_names::size_type test_size = test_names.size();
if (!baseline_size || !test_size)
@@ -271,61 +316,82 @@ int main(int argc, char** argv)
// Sort out names.
// Assuming baseline_names, test_names are both unique w/ no duplicates.
//
- // The pairs of names in shared_names are needed to do lookups on
- // the hash tables of common symbols to do compares.
- //
// The names added to missing_names are baseline_names not found in
// test_names
// -> symbols that have been deleted.
//
- // The names left in test_names are names not in baseline_names
+ // The names added to added_names are test_names are names not in
+ // baseline_names
// -> symbols that have been added.
- typedef pair<string, string> string_pair;
- vector<string_pair> shared_names;
+ symbol_names shared_names;
symbol_names missing_names;
+ symbol_names added_names = test_names;
for (size_t i = 0; i < baseline_size; ++i)
{
- symbol_names::iterator end = test_names.end();
- symbol_names::iterator it = find(test_names.begin(), end,
- baseline_names[i]);
+ string what(baseline_names[i]);
+ symbol_names::iterator end = added_names.end();
+ symbol_names::iterator it = find(added_names.begin(), end, what);
if (it != end)
{
// Found.
- shared_names.push_back(string_pair(baseline_names[i], *it));
- test_names.erase(it);
+ shared_names.push_back(what);
+ added_names.erase(it);
}
else
- missing_names.push_back(baseline_names[i]);
+ missing_names.push_back(what);
}
- // Check common names for detailed compatibility.
- const vector<string_pair>::size_type shared_size = shared_names.size();
+ // Check shared names for compatibility.
typedef pair<symbol_info, symbol_info> symbol_pair;
vector<symbol_pair> incompatible;
- for (size_t i = 0; i < shared_size; ++i)
+ for (size_t i = 0; i < shared_names.size(); ++i)
{
- symbol_info binfo = baseline_symbols[shared_names[i].first.c_str()];
- symbol_info tinfo = test_symbols[shared_names[i].second.c_str()];
- if (binfo != tinfo)
- incompatible.push_back(symbol_pair(binfo, tinfo));
+ symbol_info base = baseline_symbols[shared_names[i]];
+ symbol_info test = test_symbols[shared_names[i]];
+ if (!check_compatible(base, test))
+ incompatible.push_back(symbol_pair(base, test));
}
- // Output data.
- cout << test_names.size() << " added symbols " << endl;
- for (size_t j = 0; j < test_names.size() ; ++j)
- cout << '\t' << test_names[j] << endl;
+ // Check added names for compatibility.
+ for (size_t i = 0; i < added_names.size(); ++i)
+ {
+ vector<string> compatible_versions;
+ compatible_versions.push_back("GLIBCPP_3.2.1");
+
+ symbol_info test = test_symbols[added_names[i]];
+ vector<string>::iterator end = compatible_versions.end();
+
+ // Check version names for compatibility...
+ vector<string>::iterator it1 = find(compatible_versions.begin(), end,
+ test.version_name);
+
+ // Check for weak label.
+ vector<string>::iterator it2 = find(compatible_versions.begin(), end,
+ test.name);
+
+ if (it1 == end && it2 == end)
+ incompatible.push_back(symbol_pair(test, test));
+ }
+
+ // Report results.
+ cout << added_names.size() << " added symbols " << endl;
+ for (size_t j = 0; j < added_names.size() ; ++j)
+ report_symbol_info(test_symbols[added_names[j]], j + 1);
cout << missing_names.size() << " missing symbols " << endl;
for (size_t j = 0; j < missing_names.size() ; ++j)
- cout << '\t' << missing_names[j] << endl;
+ report_symbol_info(baseline_symbols[missing_names[j]], j + 1);
cout << incompatible.size() << " incompatible symbols " << endl;
for (size_t j = 0; j < incompatible.size() ; ++j)
{
- cout << "baseline symbol_info:" << endl;
- cout << incompatible[j].first << endl;
- cout << "test symbol_info:" << endl;
- cout << incompatible[j].second << endl;
+ // First, report name.
+ const symbol_info& base = incompatible[j].first;
+ const symbol_info& test = incompatible[j].second;
+ report_symbol_info(test, j + 1);
+
+ // Second, report reason or reasons incompatible.
+ check_compatible(base, test, true);
}
return 0;
diff --git a/libstdc++-v3/testsuite/ext/allocators.cc b/libstdc++-v3/testsuite/ext/allocators.cc
index b3068e0b2dd..58152145e7e 100644
--- a/libstdc++-v3/testsuite/ext/allocators.cc
+++ b/libstdc++-v3/testsuite/ext/allocators.cc
@@ -20,7 +20,6 @@
// 20.4.1.1 allocator members
-#undef __USE_MALLOC
#include <memory>
#include <cstdlib>
#include <testsuite_hooks.h>
diff --git a/libstdc++-v3/testsuite/thread/pthread1.cc b/libstdc++-v3/testsuite/thread/pthread1.cc
index 71afefcc758..eaa634d0bd5 100644
--- a/libstdc++-v3/testsuite/thread/pthread1.cc
+++ b/libstdc++-v3/testsuite/thread/pthread1.cc
@@ -124,7 +124,7 @@ main (int argc, char** argv)
{
pthread_join (prod[i], NULL);
pthread_join (cons[i], NULL);
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) && __FreeBSD__ < 5
// These lines are not required by POSIX since a successful
// join is suppose to detach as well...
pthread_detach (prod[i]);
diff --git a/maintainer-scripts/ChangeLog b/maintainer-scripts/ChangeLog
index 8e51a883c15..edba50ca0b3 100644
--- a/maintainer-scripts/ChangeLog
+++ b/maintainer-scripts/ChangeLog
@@ -1,3 +1,24 @@
+2002-09-23 Zack Weinberg <zack@codesourcery.com>
+
+ * update_version: Do not check in files which are unchanged.
+ * gcc_release: Only update the version in gcc/version.c.
+
+2002-09-17 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * update_web_docs (MANUALS): Add fastjar.
+
+2002-09-08 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * gcc_release: Make snapshots come from the mainline.
+ * snapshot-README: Update.
+
+2002-08-28 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * update_web_docs: Remove support for generating g77_news.html and
+ g77_bugs.html.
+ * update_web_docs_old: Likewise. Remove support for generating
+ thanks.html.
+
2002-07-28 Andreas Jaeger <aj@suse.de>
* gcc_release: Update comment.
diff --git a/maintainer-scripts/gcc_release b/maintainer-scripts/gcc_release
index 0f8f5beb9ff..45169e78f76 100755
--- a/maintainer-scripts/gcc_release
+++ b/maintainer-scripts/gcc_release
@@ -126,8 +126,7 @@ EOF
error "Could not commit ${x}"
done
- # Update `gcc/version.c'. There are other version files
- # as well, which should have release status updated.
+ # Update `gcc/version.c'.
for x in gcc/version.c; do
y=`basename ${x}`
(changedir `dirname ${SOURCE_DIRECTORY}/${x}` && \
@@ -136,15 +135,6 @@ EOF
${CVS} ci -m 'Update version' ${y}) || \
error "Could not update ${x}"
done
- for x in gcc/ada/gnatvsn.ads gcc/f/version.c libf2c/libF77/Version.c \
- libf2c/libI77/Version.c libf2c/libU77/Version.c; do
- y=`basename ${x}`
- (changedir `dirname ${SOURCE_DIRECTORY}/${x}` && \
- sed -e 's/experimental\|prerelease/release/g' < ${y} > ${y}.new && \
- mv ${y}.new ${y} && \
- ${CVS} ci -m 'Update version' ${y}) || \
- error "Could not update ${x}"
- done
# Make sure we tag the sources for a final release.
TAG="gcc_`echo ${RELEASE} | tr . _`_release"
@@ -517,8 +507,8 @@ if [ $SNAPSHOT -eq 0 ]; then
fi
else
RELEASE=$DATE
- # For now snapshots come from the 3.2 branch.
- BRANCH=gcc-3_2-branch
+ # For now snapshots come from the mainline.
+ BRANCH=HEAD
FTP_PATH="${FTP_PATH}/snapshots/${LONG_DATE}"
TAG=gcc_ss_${DATE}
diff --git a/maintainer-scripts/snapshot-README b/maintainer-scripts/snapshot-README
index e4d86d4837d..9425bf2f8cb 100644
--- a/maintainer-scripts/snapshot-README
+++ b/maintainer-scripts/snapshot-README
@@ -2,7 +2,7 @@ gcc-ss-@DATE@ is now available on
ftp://gcc.gnu.org/pub/gcc/snapshots/@LONG_DATE@
and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
-This snapshot has been generated from the GCC 3.2 branch.
+This snapshot has been generated from the GCC CVS HEAD.
You'll find:
diff --git a/maintainer-scripts/update_version b/maintainer-scripts/update_version
index bb94944710a..ff29928be2e 100755
--- a/maintainer-scripts/update_version
+++ b/maintainer-scripts/update_version
@@ -45,23 +45,29 @@ for BRANCH in $BRANCHES; do
for file in $textstring_FILES; do
if test -f $file; then
- OLD_VERSION=`/bin/cat $file`
- /bin/sed -e "s/\(.*\"[^ ]*\) [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\1 ${CURR_DATE}/" >${file} <<HERE
-$OLD_VERSION
-HERE
-
- COMMIT_FILES="$COMMIT_FILES $file"
+ /bin/sed <$file >$file.new -e \
+ "s/\(.*\"[^ ]*\) [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\1 ${CURR_DATE}/"
+
+ if /usr/bin/cmp -s $file $file.new; then
+ rm -f $file.new
+ else
+ mv -f $file.new $file
+ COMMIT_FILES="$COMMIT_FILES $file"
+ fi
fi
done
for file in $cppdefine_FILES; do
- if test -f $file; then
- OLD_VERSION=`/bin/cat $file`
- /bin/sed -e "s/\(#.*\) [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\1 ${CURR_DATE}/" >${file} <<HERE
-$OLD_VERSION
-HERE
-
- COMMIT_FILES="$COMMIT_FILES $file"
+ if test -f $file; then
+ /bin/sed <$file >$file.new -e \
+ "s/\(#.*\) [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\1 ${CURR_DATE}/"
+
+ if /usr/bin/cmp -s $file $file.new; then
+ rm -f $file.new
+ else
+ mv -f $file.new $file
+ COMMIT_FILES="$COMMIT_FILES $file"
+ fi
fi
done
diff --git a/maintainer-scripts/update_web_docs b/maintainer-scripts/update_web_docs
index 78d7180ed25..1cd10c228c6 100755
--- a/maintainer-scripts/update_web_docs
+++ b/maintainer-scripts/update_web_docs
@@ -94,7 +94,7 @@ cvs -Q co -r$RELEASE `cat FILES` gcc/gcc/doc/install.texi2html gcc/gcc/doc/inclu
# and fdl.texi.
includedir=gcc/gcc/doc/include
-MANUALS="cpp cppinternals gcc gccint gcj g77 gnat_ug_unx gnat_ug_vms gnat_ug_vxw gnat_ug_wnt gnat-style gnat_rm libiberty porting"
+MANUALS="cpp cppinternals fastjar gcc gccint gcj g77 gnat_ug_unx gnat_ug_vms gnat_ug_vxw gnat_ug_wnt gnat-style gnat_rm libiberty porting"
# Now convert the relevant files from texi to HTML and PostScript.
for file in $MANUALS; do
@@ -137,20 +137,8 @@ for file in */*.html *.ps; do
fi
done
-news_file=g77/News.html
-bugs_file=g77/Trouble.html
-
cd $DOCSDIR
-rm -f g77_news.html
-rm -f g77_bugs.html
-rm -f g77_news.html.gz
-rm -f g77_bugs.html.gz
-ln $news_file g77_news.html
-ln $bugs_file g77_bugs.html
-ln ${news_file}.gz g77_news.html.gz
-ln ${bugs_file}.gz g77_bugs.html.gz
-
# Finally, generate the installation documentation (but only for CVS HEAD).
if [ "$RELEASE" = "HEAD" ]; then
SOURCEDIR=$WORKDIR/gcc/gcc/doc
diff --git a/maintainer-scripts/update_web_docs_old b/maintainer-scripts/update_web_docs_old
index bb778261fb6..119812bc290 100755
--- a/maintainer-scripts/update_web_docs_old
+++ b/maintainer-scripts/update_web_docs_old
@@ -74,9 +74,6 @@ fi
if [ -z "$RELEASE" ]; then
RELEASE=HEAD
- DO_THANKS_HTML=y
-else
- DO_THANKS_HTML=n
fi
WORKDIR=/tmp/gcc-doc-update.$$
@@ -137,29 +134,8 @@ for file in *.html *.ps; do
fi
done
-news_file=`grep "News About GNU Fortran" $DOCSDIR/g77_toc.html | sed -e '/HREF=.*[^.]/ s#^.*HREF="##g' | sed -e 's%#SEC.*%%g'`
-bugs_file=`grep "Known Causes of Trouble with GNU Fortran" $DOCSDIR/g77_toc.html | sed -e '/HREF=.*[^.]/ s#^.*HREF="##g' | sed -e 's%#SEC.*%%g'`
-contrib_file=`grep "Contributors to GCC" $DOCSDIR/gcc_toc.html | sed -e '/HREF=.*[^.]/ s#^.*HREF="##g' | sed -e 's%#SEC.*%%g'`
-
cd $DOCSDIR
-rm -f g77_news.html
-rm -f g77_bugs.html
-rm -f g77_news.html.gz
-rm -f g77_bugs.html.gz
-ln $news_file g77_news.html
-ln $bugs_file g77_bugs.html
-ln ${news_file}.gz g77_news.html.gz
-ln ${bugs_file}.gz g77_bugs.html.gz
-
-if [ "$DO_THANKS_HTML" = y ]; then
- cd $WWWBASE
- rm -f thanks.html
- rm -f thanks.html.gz
- ln onlinedocs/$contrib_file thanks.html
- ln onlinedocs/${contrib_file}.gz thanks.html.gz
-fi
-
# Finally, generate the installation documentation (but only for CVS HEAD).
if [ "$RELEASE" = "HEAD" ]; then
SOURCEDIR=$WORKDIR/gcc/gcc/doc
diff --git a/zlib/ChangeLog.gcj b/zlib/ChangeLog.gcj
index 91bfa665d80..f146d17bf52 100644
--- a/zlib/ChangeLog.gcj
+++ b/zlib/ChangeLog.gcj
@@ -1,3 +1,7 @@
+2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * Makefile.am (all-multi): Fix multilib parallel build.
+
2002-05-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* configure.in: Allow for PWDCMD to override hardcoded pwd.
diff --git a/zlib/Makefile.am b/zlib/Makefile.am
index ee8288f9678..46ac3de4ec9 100644
--- a/zlib/Makefile.am
+++ b/zlib/Makefile.am
@@ -85,7 +85,7 @@ distclean-am: distclean-multi
maintainer-clean-am: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi:
diff --git a/zlib/Makefile.in b/zlib/Makefile.in
index 775af17c9f9..59d8ff76e68 100644
--- a/zlib/Makefile.in
+++ b/zlib/Makefile.in
@@ -483,7 +483,7 @@ distclean-am: distclean-multi
maintainer-clean-am: maintainer-clean-multi
all-multi:
- $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+ : $(MAKE) ; exec $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
install-multi:
$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
mostlyclean-multi: